@mobrienv/autoloop 0.4.0 → 0.7.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/README.md +40 -14
- package/bin/autoloop +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/testing/mock-backend.js +3 -5
- package/dist/testing/mock-backend.js.map +1 -1
- package/package.json +30 -23
- package/plugins/autoloop/.claude-plugin/plugin.json +1 -1
- package/dist/agent-map.d.ts +0 -10
- package/dist/agent-map.js +0 -58
- package/dist/agent-map.js.map +0 -1
- package/dist/backend/acp-client.d.ts +0 -38
- package/dist/backend/acp-client.js +0 -293
- package/dist/backend/acp-client.js.map +0 -1
- package/dist/backend/index.d.ts +0 -10
- package/dist/backend/index.js +0 -71
- package/dist/backend/index.js.map +0 -1
- package/dist/backend/kiro-bridge.d.ts +0 -19
- package/dist/backend/kiro-bridge.js +0 -114
- package/dist/backend/kiro-bridge.js.map +0 -1
- package/dist/backend/kiro-worker.d.ts +0 -1
- package/dist/backend/kiro-worker.js +0 -96
- package/dist/backend/kiro-worker.js.map +0 -1
- package/dist/backend/run-command.d.ts +0 -7
- package/dist/backend/run-command.js +0 -50
- package/dist/backend/run-command.js.map +0 -1
- package/dist/backend/run-kiro.d.ts +0 -3
- package/dist/backend/run-kiro.js +0 -16
- package/dist/backend/run-kiro.js.map +0 -1
- package/dist/backend/run-mock.d.ts +0 -1
- package/dist/backend/run-mock.js +0 -6
- package/dist/backend/run-mock.js.map +0 -1
- package/dist/backend/run-pi.d.ts +0 -5
- package/dist/backend/run-pi.js +0 -5
- package/dist/backend/run-pi.js.map +0 -1
- package/dist/backend/types.d.ts +0 -21
- package/dist/backend/types.js +0 -2
- package/dist/backend/types.js.map +0 -1
- package/dist/chains/budget.d.ts +0 -7
- package/dist/chains/budget.js +0 -54
- package/dist/chains/budget.js.map +0 -1
- package/dist/chains/load.d.ts +0 -18
- package/dist/chains/load.js +0 -129
- package/dist/chains/load.js.map +0 -1
- package/dist/chains/render.d.ts +0 -2
- package/dist/chains/render.js +0 -74
- package/dist/chains/render.js.map +0 -1
- package/dist/chains/run.d.ts +0 -17
- package/dist/chains/run.js +0 -260
- package/dist/chains/run.js.map +0 -1
- package/dist/chains/types.d.ts +0 -38
- package/dist/chains/types.js +0 -2
- package/dist/chains/types.js.map +0 -1
- package/dist/chains.d.ts +0 -6
- package/dist/chains.js +0 -5
- package/dist/chains.js.map +0 -1
- package/dist/cli/color.d.ts +0 -6
- package/dist/cli/color.js +0 -40
- package/dist/cli/color.js.map +0 -1
- package/dist/commands/chain.d.ts +0 -1
- package/dist/commands/chain.js +0 -53
- package/dist/commands/chain.js.map +0 -1
- package/dist/commands/config.d.ts +0 -1
- package/dist/commands/config.js +0 -74
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -1
- package/dist/commands/dashboard.js +0 -68
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/guide.d.ts +0 -1
- package/dist/commands/guide.js +0 -33
- package/dist/commands/guide.js.map +0 -1
- package/dist/commands/inspect.d.ts +0 -1
- package/dist/commands/inspect.js +0 -243
- package/dist/commands/inspect.js.map +0 -1
- package/dist/commands/list.d.ts +0 -1
- package/dist/commands/list.js +0 -15
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/loops.d.ts +0 -1
- package/dist/commands/loops.js +0 -72
- package/dist/commands/loops.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -1
- package/dist/commands/memory.js +0 -65
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/pi-adapter.d.ts +0 -1
- package/dist/commands/pi-adapter.js +0 -6
- package/dist/commands/pi-adapter.js.map +0 -1
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/run.js +0 -292
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/runs.d.ts +0 -1
- package/dist/commands/runs.js +0 -50
- package/dist/commands/runs.js.map +0 -1
- package/dist/commands/task.d.ts +0 -1
- package/dist/commands/task.js +0 -74
- package/dist/commands/task.js.map +0 -1
- package/dist/commands/worktree.d.ts +0 -1
- package/dist/commands/worktree.js +0 -162
- package/dist/commands/worktree.js.map +0 -1
- package/dist/config.d.ts +0 -31
- package/dist/config.js +0 -261
- package/dist/config.js.map +0 -1
- package/dist/dashboard/app.d.ts +0 -12
- package/dist/dashboard/app.js +0 -23
- package/dist/dashboard/app.js.map +0 -1
- package/dist/dashboard/routes/api.d.ts +0 -3
- package/dist/dashboard/routes/api.js +0 -186
- package/dist/dashboard/routes/api.js.map +0 -1
- package/dist/dashboard/routes/pages.d.ts +0 -2
- package/dist/dashboard/routes/pages.js +0 -16
- package/dist/dashboard/routes/pages.js.map +0 -1
- package/dist/dashboard/views/alpine-vendor.d.ts +0 -1
- package/dist/dashboard/views/alpine-vendor.js +0 -10
- package/dist/dashboard/views/alpine-vendor.js.map +0 -1
- package/dist/dashboard/views/shell.d.ts +0 -1
- package/dist/dashboard/views/shell.js +0 -1062
- package/dist/dashboard/views/shell.js.map +0 -1
- package/dist/events/decode.d.ts +0 -2
- package/dist/events/decode.js +0 -45
- package/dist/events/decode.js.map +0 -1
- package/dist/events/encode.d.ts +0 -2
- package/dist/events/encode.js +0 -33
- package/dist/events/encode.js.map +0 -1
- package/dist/events/guards.d.ts +0 -5
- package/dist/events/guards.js +0 -42
- package/dist/events/guards.js.map +0 -1
- package/dist/events/types.d.ts +0 -27
- package/dist/events/types.js +0 -2
- package/dist/events/types.js.map +0 -1
- package/dist/harness/artifacts.d.ts +0 -50
- package/dist/harness/artifacts.js +0 -333
- package/dist/harness/artifacts.js.map +0 -1
- package/dist/harness/config-helpers.d.ts +0 -35
- package/dist/harness/config-helpers.js +0 -409
- package/dist/harness/config-helpers.js.map +0 -1
- package/dist/harness/coordination.d.ts +0 -1
- package/dist/harness/coordination.js +0 -127
- package/dist/harness/coordination.js.map +0 -1
- package/dist/harness/display.d.ts +0 -21
- package/dist/harness/display.js +0 -176
- package/dist/harness/display.js.map +0 -1
- package/dist/harness/emit.d.ts +0 -15
- package/dist/harness/emit.js +0 -240
- package/dist/harness/emit.js.map +0 -1
- package/dist/harness/index.d.ts +0 -20
- package/dist/harness/index.js +0 -311
- package/dist/harness/index.js.map +0 -1
- package/dist/harness/iteration.d.ts +0 -16
- package/dist/harness/iteration.js +0 -131
- package/dist/harness/iteration.js.map +0 -1
- package/dist/harness/journal-format.d.ts +0 -25
- package/dist/harness/journal-format.js +0 -153
- package/dist/harness/journal-format.js.map +0 -1
- package/dist/harness/journal.d.ts +0 -31
- package/dist/harness/journal.js +0 -178
- package/dist/harness/journal.js.map +0 -1
- package/dist/harness/metareview.d.ts +0 -4
- package/dist/harness/metareview.js +0 -48
- package/dist/harness/metareview.js.map +0 -1
- package/dist/harness/metrics.d.ts +0 -12
- package/dist/harness/metrics.js +0 -180
- package/dist/harness/metrics.js.map +0 -1
- package/dist/harness/parallel.d.ts +0 -37
- package/dist/harness/parallel.js +0 -237
- package/dist/harness/parallel.js.map +0 -1
- package/dist/harness/prompt.d.ts +0 -46
- package/dist/harness/prompt.js +0 -403
- package/dist/harness/prompt.js.map +0 -1
- package/dist/harness/scratchpad.d.ts +0 -2
- package/dist/harness/scratchpad.js +0 -67
- package/dist/harness/scratchpad.js.map +0 -1
- package/dist/harness/stop.d.ts +0 -5
- package/dist/harness/stop.js +0 -70
- package/dist/harness/stop.js.map +0 -1
- package/dist/harness/tools.d.ts +0 -3
- package/dist/harness/tools.js +0 -65
- package/dist/harness/tools.js.map +0 -1
- package/dist/harness/types.d.ts +0 -110
- package/dist/harness/types.js +0 -2
- package/dist/harness/types.js.map +0 -1
- package/dist/harness/wave/finalize-wave.d.ts +0 -9
- package/dist/harness/wave/finalize-wave.js +0 -87
- package/dist/harness/wave/finalize-wave.js.map +0 -1
- package/dist/harness/wave/launch-branches.d.ts +0 -6
- package/dist/harness/wave/launch-branches.js +0 -314
- package/dist/harness/wave/launch-branches.js.map +0 -1
- package/dist/harness/wave/parse-objectives.d.ts +0 -3
- package/dist/harness/wave/parse-objectives.js +0 -32
- package/dist/harness/wave/parse-objectives.js.map +0 -1
- package/dist/harness/wave/types.d.ts +0 -43
- package/dist/harness/wave/types.js +0 -2
- package/dist/harness/wave/types.js.map +0 -1
- package/dist/harness/wave.d.ts +0 -6
- package/dist/harness/wave.js +0 -159
- package/dist/harness/wave.js.map +0 -1
- package/dist/isolation/index.d.ts +0 -4
- package/dist/isolation/index.js +0 -3
- package/dist/isolation/index.js.map +0 -1
- package/dist/isolation/resolve.d.ts +0 -39
- package/dist/isolation/resolve.js +0 -118
- package/dist/isolation/resolve.js.map +0 -1
- package/dist/isolation/run-scope.d.ts +0 -21
- package/dist/isolation/run-scope.js +0 -50
- package/dist/isolation/run-scope.js.map +0 -1
- package/dist/json.d.ts +0 -8
- package/dist/json.js +0 -82
- package/dist/json.js.map +0 -1
- package/dist/loops/health.d.ts +0 -17
- package/dist/loops/health.js +0 -152
- package/dist/loops/health.js.map +0 -1
- package/dist/loops/list.d.ts +0 -6
- package/dist/loops/list.js +0 -21
- package/dist/loops/list.js.map +0 -1
- package/dist/loops/policy.d.ts +0 -6
- package/dist/loops/policy.js +0 -41
- package/dist/loops/policy.js.map +0 -1
- package/dist/loops/render.d.ts +0 -19
- package/dist/loops/render.js +0 -100
- package/dist/loops/render.js.map +0 -1
- package/dist/loops/show.d.ts +0 -8
- package/dist/loops/show.js +0 -31
- package/dist/loops/show.js.map +0 -1
- package/dist/loops/watch.d.ts +0 -14
- package/dist/loops/watch.js +0 -143
- package/dist/loops/watch.js.map +0 -1
- package/dist/main.d.ts +0 -1
- package/dist/main.js +0 -148
- package/dist/main.js.map +0 -1
- package/dist/markdown.d.ts +0 -10
- package/dist/markdown.js +0 -66
- package/dist/markdown.js.map +0 -1
- package/dist/memory-render.d.ts +0 -6
- package/dist/memory-render.js +0 -81
- package/dist/memory-render.js.map +0 -1
- package/dist/memory.d.ts +0 -22
- package/dist/memory.js +0 -318
- package/dist/memory.js.map +0 -1
- package/dist/pi-adapter.d.ts +0 -1
- package/dist/pi-adapter.js +0 -220
- package/dist/pi-adapter.js.map +0 -1
- package/dist/profiles.d.ts +0 -12
- package/dist/profiles.js +0 -71
- package/dist/profiles.js.map +0 -1
- package/dist/registry/derive.d.ts +0 -8
- package/dist/registry/derive.js +0 -88
- package/dist/registry/derive.js.map +0 -1
- package/dist/registry/discover.d.ts +0 -20
- package/dist/registry/discover.js +0 -98
- package/dist/registry/discover.js.map +0 -1
- package/dist/registry/harness.d.ts +0 -7
- package/dist/registry/harness.js +0 -63
- package/dist/registry/harness.js.map +0 -1
- package/dist/registry/index.d.ts +0 -6
- package/dist/registry/index.js +0 -6
- package/dist/registry/index.js.map +0 -1
- package/dist/registry/read.d.ts +0 -11
- package/dist/registry/read.js +0 -50
- package/dist/registry/read.js.map +0 -1
- package/dist/registry/rebuild.d.ts +0 -5
- package/dist/registry/rebuild.js +0 -22
- package/dist/registry/rebuild.js.map +0 -1
- package/dist/registry/types.d.ts +0 -28
- package/dist/registry/types.js +0 -2
- package/dist/registry/types.js.map +0 -1
- package/dist/registry/update.d.ts +0 -2
- package/dist/registry/update.js +0 -7
- package/dist/registry/update.js.map +0 -1
- package/dist/tasks-render.d.ts +0 -2
- package/dist/tasks-render.js +0 -44
- package/dist/tasks-render.js.map +0 -1
- package/dist/tasks.d.ts +0 -24
- package/dist/tasks.js +0 -184
- package/dist/tasks.js.map +0 -1
- package/dist/topology.d.ts +0 -31
- package/dist/topology.js +0 -309
- package/dist/topology.js.map +0 -1
- package/dist/usage.d.ts +0 -9
- package/dist/usage.js +0 -160
- package/dist/usage.js.map +0 -1
- package/dist/utils.d.ts +0 -21
- package/dist/utils.js +0 -349
- package/dist/utils.js.map +0 -1
- package/dist/worktree/clean.d.ts +0 -12
- package/dist/worktree/clean.js +0 -113
- package/dist/worktree/clean.js.map +0 -1
- package/dist/worktree/create.d.ts +0 -14
- package/dist/worktree/create.js +0 -71
- package/dist/worktree/create.js.map +0 -1
- package/dist/worktree/index.d.ts +0 -10
- package/dist/worktree/index.js +0 -6
- package/dist/worktree/index.js.map +0 -1
- package/dist/worktree/list.d.ts +0 -9
- package/dist/worktree/list.js +0 -24
- package/dist/worktree/list.js.map +0 -1
- package/dist/worktree/merge.d.ts +0 -11
- package/dist/worktree/merge.js +0 -129
- package/dist/worktree/merge.js.map +0 -1
- package/dist/worktree/meta.d.ts +0 -17
- package/dist/worktree/meta.js +0 -34
- package/dist/worktree/meta.js.map +0 -1
- package/presets/autocode/README.md +0 -81
- package/presets/autocode/autoloops.toml +0 -30
- package/presets/autocode/harness.md +0 -26
- package/presets/autocode/miniloops.toml +0 -22
- package/presets/autocode/roles/build.md +0 -34
- package/presets/autocode/roles/critic.md +0 -40
- package/presets/autocode/roles/finalizer.md +0 -43
- package/presets/autocode/roles/planner.md +0 -40
- package/presets/autocode/topology.toml +0 -32
- package/presets/autodebug/README.md +0 -50
- package/presets/autodebug/autoloops.toml +0 -18
- package/presets/autodebug/harness.md +0 -31
- package/presets/autodebug/roles/fixer.md +0 -58
- package/presets/autodebug/roles/investigator.md +0 -52
- package/presets/autodebug/roles/strategist.md +0 -45
- package/presets/autodebug/roles/verifier.md +0 -66
- package/presets/autodebug/topology.toml +0 -34
- package/presets/autodoc/README.md +0 -42
- package/presets/autodoc/autoloops.toml +0 -21
- package/presets/autodoc/harness.md +0 -19
- package/presets/autodoc/miniloops.toml +0 -21
- package/presets/autodoc/roles/auditor.md +0 -39
- package/presets/autodoc/roles/checker.md +0 -43
- package/presets/autodoc/roles/publisher.md +0 -51
- package/presets/autodoc/roles/writer.md +0 -37
- package/presets/autodoc/topology.toml +0 -31
- package/presets/autofix/README.md +0 -56
- package/presets/autofix/autoloops.toml +0 -24
- package/presets/autofix/harness.md +0 -25
- package/presets/autofix/miniloops.toml +0 -21
- package/presets/autofix/roles/closer.md +0 -48
- package/presets/autofix/roles/diagnoser.md +0 -43
- package/presets/autofix/roles/fixer.md +0 -28
- package/presets/autofix/roles/verifier.md +0 -31
- package/presets/autofix/topology.toml +0 -33
- package/presets/autoideas/README.md +0 -73
- package/presets/autoideas/autoloops.toml +0 -18
- package/presets/autoideas/harness.md +0 -31
- package/presets/autoideas/miniloops.toml +0 -18
- package/presets/autoideas/roles/analyst.md +0 -32
- package/presets/autoideas/roles/reviewer.md +0 -36
- package/presets/autoideas/roles/scanner.md +0 -26
- package/presets/autoideas/roles/synthesizer.md +0 -61
- package/presets/autoideas/topology.toml +0 -32
- package/presets/automerge/README.md +0 -3
- package/presets/automerge/autoloops.toml +0 -12
- package/presets/automerge/harness.md +0 -10
- package/presets/automerge/miniloops.toml +0 -12
- package/presets/automerge/roles/merge.md +0 -10
- package/presets/automerge/topology.toml +0 -10
- package/presets/autoperf/README.md +0 -56
- package/presets/autoperf/autoloops.toml +0 -21
- package/presets/autoperf/harness.md +0 -21
- package/presets/autoperf/miniloops.toml +0 -21
- package/presets/autoperf/roles/judge.md +0 -38
- package/presets/autoperf/roles/measurer.md +0 -36
- package/presets/autoperf/roles/optimizer.md +0 -35
- package/presets/autoperf/roles/profiler.md +0 -38
- package/presets/autoperf/topology.toml +0 -32
- package/presets/autopr/README.md +0 -99
- package/presets/autopr/autoloops.toml +0 -22
- package/presets/autopr/harness.md +0 -27
- package/presets/autopr/miniloops.toml +0 -22
- package/presets/autopr/roles/collector.md +0 -55
- package/presets/autopr/roles/drafter.md +0 -38
- package/presets/autopr/roles/publisher.md +0 -28
- package/presets/autopr/roles/validator.md +0 -31
- package/presets/autopr/topology.toml +0 -32
- package/presets/autopreset/README.md +0 -35
- package/presets/autopreset/autoloops.toml +0 -18
- package/presets/autopreset/harness.md +0 -38
- package/presets/autopreset/roles/designer.md +0 -33
- package/presets/autopreset/roles/finalizer.md +0 -23
- package/presets/autopreset/roles/generator.md +0 -34
- package/presets/autopreset/roles/validator.md +0 -31
- package/presets/autopreset/topology.toml +0 -32
- package/presets/autoqa/README.md +0 -105
- package/presets/autoqa/autoloops.toml +0 -21
- package/presets/autoqa/harness.md +0 -52
- package/presets/autoqa/miniloops.toml +0 -21
- package/presets/autoqa/roles/executor.md +0 -96
- package/presets/autoqa/roles/inspector.md +0 -100
- package/presets/autoqa/roles/planner.md +0 -87
- package/presets/autoqa/roles/reporter.md +0 -117
- package/presets/autoqa/topology.toml +0 -31
- package/presets/autoresearch/README.md +0 -63
- package/presets/autoresearch/autoloops.toml +0 -18
- package/presets/autoresearch/harness.md +0 -28
- package/presets/autoresearch/miniloops.toml +0 -18
- package/presets/autoresearch/roles/benchmarker.md +0 -34
- package/presets/autoresearch/roles/evaluator.md +0 -33
- package/presets/autoresearch/roles/implementer.md +0 -26
- package/presets/autoresearch/roles/strategist.md +0 -43
- package/presets/autoresearch/topology.toml +0 -31
- package/presets/autoreview/README.md +0 -51
- package/presets/autoreview/autoloops.toml +0 -21
- package/presets/autoreview/harness.md +0 -20
- package/presets/autoreview/miniloops.toml +0 -21
- package/presets/autoreview/roles/checker.md +0 -36
- package/presets/autoreview/roles/reader.md +0 -33
- package/presets/autoreview/roles/suggester.md +0 -26
- package/presets/autoreview/roles/summarizer.md +0 -57
- package/presets/autoreview/topology.toml +0 -31
- package/presets/autosec/README.md +0 -51
- package/presets/autosec/autoloops.toml +0 -21
- package/presets/autosec/harness.md +0 -20
- package/presets/autosec/miniloops.toml +0 -21
- package/presets/autosec/roles/analyst.md +0 -38
- package/presets/autosec/roles/hardener.md +0 -36
- package/presets/autosec/roles/reporter.md +0 -63
- package/presets/autosec/roles/scanner.md +0 -38
- package/presets/autosec/topology.toml +0 -31
- package/presets/autosimplify/README.md +0 -83
- package/presets/autosimplify/autoloops.toml +0 -26
- package/presets/autosimplify/harness.md +0 -25
- package/presets/autosimplify/miniloops.toml +0 -22
- package/presets/autosimplify/roles/reviewer.md +0 -38
- package/presets/autosimplify/roles/scoper.md +0 -42
- package/presets/autosimplify/roles/simplifier.md +0 -51
- package/presets/autosimplify/roles/verifier.md +0 -40
- package/presets/autosimplify/topology.toml +0 -32
- package/presets/autospec/README.md +0 -84
- package/presets/autospec/autoloops.toml +0 -21
- package/presets/autospec/harness.md +0 -23
- package/presets/autospec/miniloops.toml +0 -21
- package/presets/autospec/roles/clarifier.md +0 -39
- package/presets/autospec/roles/critic.md +0 -41
- package/presets/autospec/roles/designer.md +0 -37
- package/presets/autospec/roles/planner.md +0 -38
- package/presets/autospec/roles/researcher.md +0 -33
- package/presets/autospec/topology.toml +0 -38
- package/presets/autotest/README.md +0 -55
- package/presets/autotest/autoloops.toml +0 -21
- package/presets/autotest/harness.md +0 -21
- package/presets/autotest/miniloops.toml +0 -21
- package/presets/autotest/roles/assessor.md +0 -57
- package/presets/autotest/roles/runner.md +0 -31
- package/presets/autotest/roles/surveyor.md +0 -39
- package/presets/autotest/roles/writer.md +0 -37
- package/presets/autotest/topology.toml +0 -32
package/README.md
CHANGED
|
@@ -7,10 +7,36 @@ It’s a simpler, more opinionated loop harness for long-running agent work: ins
|
|
|
7
7
|
It’s early and still evolving. autoloop is not a replacement for ralph-orchestrator — it’s a cleaner path for exploring a simpler UX without breaking Ralph.
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/@mobrienv/autoloop)
|
|
10
|
+
[](https://mikeyobrien.github.io/autoloop/)
|
|
10
11
|
[](https://nodejs.org/)
|
|
11
12
|
|
|
13
|
+
**[Read the docs →](https://mikeyobrien.github.io/autoloop/)**
|
|
14
|
+
|
|
12
15
|
[](docs/launches/autoloop-hybrid-launch-video-x.mp4)
|
|
13
16
|
|
|
17
|
+
## Use as a library
|
|
18
|
+
|
|
19
|
+
As of `0.5.0-sdk.0`, autoloop ships an embed-able runtime alongside the CLI. Pass an `AbortSignal` for cancellation and an `onEvent` callback to consume the structured event stream — no terminal output is produced unless you ask for it.
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { run, type LoopEvent } from "@mobrienv/autoloop";
|
|
23
|
+
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
setTimeout(() => controller.abort(), 60_000);
|
|
26
|
+
|
|
27
|
+
const summary = await run("./my-project", "build the login page", "autoloop", {
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
onEvent: (event: LoopEvent) => {
|
|
30
|
+
if (event.type === "iteration.start") console.log(`iter ${event.iteration}`);
|
|
31
|
+
if (event.type === "loop.finish") console.log(`done: ${event.stopReason}`);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log(summary); // { iterations, stopReason, runId }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The CLI entry (`bin/autoloop`) is still the primary interface; the library export is for agent frameworks and dashboards that want to drive loops in-process.
|
|
39
|
+
|
|
14
40
|
## Why autoloop exists
|
|
15
41
|
|
|
16
42
|
ralph-orchestrator grew to include a lot of different experiments and ways of doing things. autoloop spins out a narrower set of ideas into something simpler and more opinionated.
|
|
@@ -196,7 +222,7 @@ Bundled presets give you opinionated starting points for common workflows like c
|
|
|
196
222
|
|
|
197
223
|
## Creating custom presets
|
|
198
224
|
|
|
199
|
-
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](
|
|
225
|
+
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets) for the full guide, or examine any `presets/<name>/` directory as a working example.
|
|
200
226
|
|
|
201
227
|
Some older or internal layouts may still include `miniloops.toml`, but `autoloops.toml` is the canonical entry point for new presets.
|
|
202
228
|
|
|
@@ -253,22 +279,22 @@ export MOCK_FIXTURE_PATH=test/fixtures/backend/complete-success.json
|
|
|
253
279
|
node bin/autoloop run . -b "node dist/testing/mock-backend.js"
|
|
254
280
|
```
|
|
255
281
|
|
|
256
|
-
See [CLI reference](
|
|
282
|
+
See [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli#mock-backend) for fixture schema and bundled scenarios.
|
|
257
283
|
|
|
258
284
|
## Further reading
|
|
259
285
|
|
|
260
|
-
- [Platform architecture](
|
|
261
|
-
- [Configuration reference](
|
|
262
|
-
- [Creating presets](
|
|
263
|
-
- [Topology and event routing](
|
|
264
|
-
- [Memory system](
|
|
265
|
-
- [Dynamic chains](
|
|
266
|
-
- [CLI reference](
|
|
267
|
-
- [Dashboard](
|
|
268
|
-
- [Profiles](
|
|
269
|
-
- [Tasks](
|
|
270
|
-
- [Worktree isolation](
|
|
271
|
-
- [Releasing](
|
|
286
|
+
- [Platform architecture](https://mikeyobrien.github.io/autoloop/concepts/platform)
|
|
287
|
+
- [Configuration reference](https://mikeyobrien.github.io/autoloop/reference/configuration)
|
|
288
|
+
- [Creating presets](https://mikeyobrien.github.io/autoloop/guides/creating-presets)
|
|
289
|
+
- [Topology and event routing](https://mikeyobrien.github.io/autoloop/reference/topology)
|
|
290
|
+
- [Memory system](https://mikeyobrien.github.io/autoloop/reference/memory)
|
|
291
|
+
- [Dynamic chains](https://mikeyobrien.github.io/autoloop/features/dynamic-chains)
|
|
292
|
+
- [CLI reference](https://mikeyobrien.github.io/autoloop/reference/cli)
|
|
293
|
+
- [Dashboard](https://mikeyobrien.github.io/autoloop/features/dashboard)
|
|
294
|
+
- [Profiles](https://mikeyobrien.github.io/autoloop/features/profiles)
|
|
295
|
+
- [Tasks](https://mikeyobrien.github.io/autoloop/features/tasks)
|
|
296
|
+
- [Worktree isolation](https://mikeyobrien.github.io/autoloop/features/worktree)
|
|
297
|
+
- [Releasing](https://mikeyobrien.github.io/autoloop/development/releasing)
|
|
272
298
|
|
|
273
299
|
## Contributing
|
|
274
300
|
|
package/bin/autoloop
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import('
|
|
2
|
+
import('@mobrienv/autoloop-cli');
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
|
|
2
|
+
export { type Config, defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, type LayeredConfig, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
|
|
3
|
+
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
4
|
+
export type { EmitResult } from "@mobrienv/autoloop-harness/emit";
|
|
5
|
+
export type { LoopEvent, LoopEventEmitter, } from "@mobrienv/autoloop-harness/events";
|
|
6
|
+
export type { LoopContext, RunOptions, RunSummary, TriggerSource, Verdict, VerdictKind, } from "@mobrienv/autoloop-harness/types";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Public SDK entry point for @mobrienv/autoloop.
|
|
2
|
+
//
|
|
3
|
+
// This module re-exports the minimal surface SDK consumers need to embed
|
|
4
|
+
// autoloop in their own code. It is deliberately narrow; everything else
|
|
5
|
+
// (CLI render helpers, preset resolution, dashboard, etc.) stays internal.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// import { run, type LoopEvent } from "@mobrienv/autoloop";
|
|
9
|
+
//
|
|
10
|
+
// const summary = await run(projectDir, prompt, "autoloop", {
|
|
11
|
+
// signal: controller.signal,
|
|
12
|
+
// onEvent: (e: LoopEvent) => console.log(e.type),
|
|
13
|
+
// });
|
|
14
|
+
export { loadProject as loadProjectConfig } from "@mobrienv/autoloop-core/config";
|
|
15
|
+
// Pure config helpers, for consumers who want to inspect merged config
|
|
16
|
+
// without re-implementing the schema layer.
|
|
17
|
+
export { defaults as configDefaults, get as configGet, getInt as configGetInt, getList as configGetList, parseToml as parseConfigToml, } from "@mobrienv/autoloop-core/config-schema";
|
|
18
|
+
export { emit, run, runParallelBranchCli } from "@mobrienv/autoloop-harness";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,EAAE;AACF,SAAS;AACT,8DAA8D;AAC9D,EAAE;AACF,gEAAgE;AAChE,iCAAiC;AACjC,sDAAsD;AACtD,QAAQ;AAER,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,uEAAuE;AACvE,4CAA4C;AAC5C,OAAO,EAEL,QAAQ,IAAI,cAAc,EAC1B,GAAG,IAAI,SAAS,EAChB,MAAM,IAAI,YAAY,EACtB,OAAO,IAAI,aAAa,EAExB,SAAS,IAAI,eAAe,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
12
|
import { readFileSync } from "node:fs";
|
|
13
|
-
import {
|
|
14
|
-
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { createRequire } from "node:module";
|
|
15
14
|
function fixturePathFromArgs() {
|
|
16
15
|
return process.argv[2] ?? "";
|
|
17
16
|
}
|
|
@@ -38,9 +37,8 @@ function loadFixture() {
|
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
function emitEvent(event, payload) {
|
|
41
|
-
const
|
|
42
|
-
const
|
|
43
|
-
const mainEntry = resolve(distDir, "main.js");
|
|
40
|
+
const require = createRequire(import.meta.url);
|
|
41
|
+
const mainEntry = require.resolve("@mobrienv/autoloop-cli");
|
|
44
42
|
try {
|
|
45
43
|
execFileSync(process.execPath, [mainEntry, "emit", event, payload], {
|
|
46
44
|
encoding: "utf-8",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mock-backend.js","sourceRoot":"","sources":["../../src/testing/mock-backend.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobrienv/autoloop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Simpler, opinionated loop harness for inspectable long-running agent workflows",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
7
15
|
"bin": {
|
|
8
16
|
"autoloop": "bin/autoloop"
|
|
9
17
|
},
|
|
@@ -11,27 +19,19 @@
|
|
|
11
19
|
"bin/autoloop",
|
|
12
20
|
"dist",
|
|
13
21
|
"plugins/autoloop",
|
|
14
|
-
"presets/autocode",
|
|
15
|
-
"presets/autodebug",
|
|
16
|
-
"presets/autodoc",
|
|
17
|
-
"presets/autofix",
|
|
18
|
-
"presets/autoideas",
|
|
19
|
-
"presets/automerge",
|
|
20
|
-
"presets/autoperf",
|
|
21
|
-
"presets/autopr",
|
|
22
|
-
"presets/autopreset",
|
|
23
|
-
"presets/autoqa",
|
|
24
|
-
"presets/autoresearch",
|
|
25
|
-
"presets/autoreview",
|
|
26
|
-
"presets/autosec",
|
|
27
|
-
"presets/autosimplify",
|
|
28
|
-
"presets/autospec",
|
|
29
|
-
"presets/autotest",
|
|
30
22
|
"README.md"
|
|
31
23
|
],
|
|
32
24
|
"engines": {
|
|
33
25
|
"node": ">=18"
|
|
34
26
|
},
|
|
27
|
+
"workspaces": [
|
|
28
|
+
"packages/core",
|
|
29
|
+
"packages/presets",
|
|
30
|
+
"packages/backends",
|
|
31
|
+
"packages/harness",
|
|
32
|
+
"packages/dashboard",
|
|
33
|
+
"packages/cli"
|
|
34
|
+
],
|
|
35
35
|
"repository": {
|
|
36
36
|
"type": "git",
|
|
37
37
|
"url": "git+https://github.com/mikeyobrien/autoloop.git"
|
|
@@ -53,7 +53,8 @@
|
|
|
53
53
|
"provenance": true
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
|
-
"build": "tsc",
|
|
56
|
+
"build": "npm run build --workspaces && tsc",
|
|
57
|
+
"build:root": "tsc",
|
|
57
58
|
"lint": "biome check src/ test/",
|
|
58
59
|
"lint:fix": "biome check --write src/ test/",
|
|
59
60
|
"format": "biome format src/ test/",
|
|
@@ -62,6 +63,10 @@
|
|
|
62
63
|
"test:coverage": "node --experimental-vm-modules node_modules/.bin/vitest run --coverage",
|
|
63
64
|
"test:watch": "node --experimental-vm-modules node_modules/.bin/vitest",
|
|
64
65
|
"check": "biome check src/ test/ && tsc --noEmit && npm run test:coverage",
|
|
66
|
+
"release": "node bin/release",
|
|
67
|
+
"docs:dev": "vitepress dev docs",
|
|
68
|
+
"docs:build": "vitepress build docs",
|
|
69
|
+
"docs:preview": "vitepress preview docs",
|
|
65
70
|
"prepare": "husky",
|
|
66
71
|
"version": "node -e \"const p=require('./plugins/autoloop/.claude-plugin/plugin.json');p.version=require('./package.json').version;require('fs').writeFileSync('./plugins/autoloop/.claude-plugin/plugin.json',JSON.stringify(p,null,2)+'\\n')\" && git add plugins/autoloop/.claude-plugin/plugin.json"
|
|
67
72
|
},
|
|
@@ -78,12 +83,14 @@
|
|
|
78
83
|
"lint-staged": "^16.4.0",
|
|
79
84
|
"playwright": "^1.59.1",
|
|
80
85
|
"typescript": "^5.9.3",
|
|
86
|
+
"vitepress": "^1.6.4",
|
|
87
|
+
"vitepress-plugin-llmstxt": "^0.5.1",
|
|
81
88
|
"vitest": "^3.0.0"
|
|
82
89
|
},
|
|
83
90
|
"dependencies": {
|
|
84
|
-
"@
|
|
85
|
-
"@
|
|
86
|
-
"@
|
|
87
|
-
"
|
|
91
|
+
"@mobrienv/autoloop-cli": "0.7.0",
|
|
92
|
+
"@mobrienv/autoloop-core": "0.7.0",
|
|
93
|
+
"@mobrienv/autoloop-harness": "0.7.0",
|
|
94
|
+
"@mobrienv/autoloop-presets": "0.7.0"
|
|
88
95
|
}
|
|
89
96
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autoloop",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Run and operate autoloops — start runs, monitor progress, inject guidance, manage worktrees, inspect artifacts, and clean up.",
|
|
5
5
|
"homepage": "https://github.com/mikeyobrien/autoloop-ts",
|
|
6
6
|
"repository": "https://github.com/mikeyobrien/autoloop-ts",
|
package/dist/agent-map.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface AgentMap {
|
|
2
|
-
globalDefault: string;
|
|
3
|
-
presets: Record<string, PresetAgentMap>;
|
|
4
|
-
}
|
|
5
|
-
export interface PresetAgentMap {
|
|
6
|
-
defaultAgent: string;
|
|
7
|
-
roles: Record<string, string>;
|
|
8
|
-
}
|
|
9
|
-
export declare function loadAgentMap(projectDir: string): AgentMap | null;
|
|
10
|
-
export declare function resolveRoleAgent(agentMap: AgentMap | null, presetName: string, roleId: string): string | undefined;
|
package/dist/agent-map.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Loads and resolves per-role agent mappings from agents.toml.
|
|
3
|
-
*
|
|
4
|
-
* Resolution order:
|
|
5
|
-
* 1. preset.<name>.<role> (role-specific)
|
|
6
|
-
* 2. preset.<name>.default (preset default)
|
|
7
|
-
* 3. defaults.agent (global fallback)
|
|
8
|
-
* 4. undefined (caller falls back to backend.agent)
|
|
9
|
-
*/
|
|
10
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import TOML from "@iarna/toml";
|
|
13
|
-
export function loadAgentMap(projectDir) {
|
|
14
|
-
const path = join(projectDir, "agents.toml");
|
|
15
|
-
if (!existsSync(path))
|
|
16
|
-
return null;
|
|
17
|
-
const text = readFileSync(path, "utf-8");
|
|
18
|
-
const parsed = TOML.parse(text);
|
|
19
|
-
return buildAgentMap(parsed);
|
|
20
|
-
}
|
|
21
|
-
export function resolveRoleAgent(agentMap, presetName, roleId) {
|
|
22
|
-
if (!agentMap)
|
|
23
|
-
return undefined;
|
|
24
|
-
const preset = agentMap.presets[presetName];
|
|
25
|
-
if (preset) {
|
|
26
|
-
const roleAgent = preset.roles[roleId];
|
|
27
|
-
if (roleAgent)
|
|
28
|
-
return roleAgent;
|
|
29
|
-
if (preset.defaultAgent)
|
|
30
|
-
return preset.defaultAgent;
|
|
31
|
-
}
|
|
32
|
-
return agentMap.globalDefault || undefined;
|
|
33
|
-
}
|
|
34
|
-
function buildAgentMap(parsed) {
|
|
35
|
-
const defaults = parsed["defaults"];
|
|
36
|
-
const globalDefault = typeof defaults?.["agent"] === "string" ? defaults["agent"] : "";
|
|
37
|
-
const presets = {};
|
|
38
|
-
const presetSection = parsed["preset"];
|
|
39
|
-
if (presetSection) {
|
|
40
|
-
for (const [name, value] of Object.entries(presetSection)) {
|
|
41
|
-
if (typeof value === "object" && value !== null) {
|
|
42
|
-
presets[name] = buildPresetAgentMap(value);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return { globalDefault, presets };
|
|
47
|
-
}
|
|
48
|
-
function buildPresetAgentMap(section) {
|
|
49
|
-
const defaultAgent = typeof section["default"] === "string" ? section["default"] : "";
|
|
50
|
-
const roles = {};
|
|
51
|
-
for (const [key, value] of Object.entries(section)) {
|
|
52
|
-
if (key !== "default" && typeof value === "string") {
|
|
53
|
-
roles[key] = value;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return { defaultAgent, roles };
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=agent-map.js.map
|
package/dist/agent-map.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-map.js","sourceRoot":"","sources":["../src/agent-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,aAAa,CAAC;AAY/B,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAC3D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAyB,EACzB,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEhC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,MAAM,CAAC,YAAY;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,OAAO,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAwC,CAAC;IAC3E,MAAM,aAAa,GACjB,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAwC,CAAC;IAC9E,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { type ChildProcess } from "node:child_process";
|
|
2
|
-
import * as acp from "@agentclientprotocol/sdk";
|
|
3
|
-
export interface AcpClientOptions {
|
|
4
|
-
command: string;
|
|
5
|
-
args: string[];
|
|
6
|
-
cwd: string;
|
|
7
|
-
trustAllTools: boolean;
|
|
8
|
-
agentName?: string;
|
|
9
|
-
modelId?: string;
|
|
10
|
-
verbose?: boolean;
|
|
11
|
-
}
|
|
12
|
-
export interface AcpSession {
|
|
13
|
-
sessionId: string;
|
|
14
|
-
connection: acp.ClientSideConnection;
|
|
15
|
-
process: ChildProcess;
|
|
16
|
-
textBuffer: string;
|
|
17
|
-
stderrBuffer: string;
|
|
18
|
-
options: AcpClientOptions;
|
|
19
|
-
/** Resolves when the child process exits — used to race against hanging prompts */
|
|
20
|
-
closed: Promise<{
|
|
21
|
-
code: number | null;
|
|
22
|
-
signal: string | null;
|
|
23
|
-
}>;
|
|
24
|
-
}
|
|
25
|
-
export interface AcpPromptResult {
|
|
26
|
-
output: string;
|
|
27
|
-
stopReason: acp.StopReason;
|
|
28
|
-
timedOut: boolean;
|
|
29
|
-
error?: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Format an ACP SessionUpdate for verbose stderr output.
|
|
33
|
-
* Returns null for event types that should be silenced.
|
|
34
|
-
*/
|
|
35
|
-
export declare function formatStreamingUpdate(update: acp.SessionUpdate): string | null;
|
|
36
|
-
export declare function initAcpSession(opts: AcpClientOptions): Promise<AcpSession>;
|
|
37
|
-
export declare function sendAcpPrompt(session: AcpSession, prompt: string, timeoutMs: number): Promise<AcpPromptResult>;
|
|
38
|
-
export declare function terminateAcpSession(session: AcpSession): Promise<void>;
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
import * as acp from "@agentclientprotocol/sdk";
|
|
3
|
-
/**
|
|
4
|
-
* Format an ACP SessionUpdate for verbose stderr output.
|
|
5
|
-
* Returns null for event types that should be silenced.
|
|
6
|
-
*/
|
|
7
|
-
export function formatStreamingUpdate(update) {
|
|
8
|
-
switch (update.sessionUpdate) {
|
|
9
|
-
case "agent_message_chunk":
|
|
10
|
-
return update.content?.type === "text" ? update.content.text : null;
|
|
11
|
-
case "agent_thought_chunk":
|
|
12
|
-
return update.content?.type === "text"
|
|
13
|
-
? `[thinking] ${update.content.text}\n`
|
|
14
|
-
: null;
|
|
15
|
-
case "tool_call":
|
|
16
|
-
return `[tool:${update.kind ?? "other"}] ${update.title}\n`;
|
|
17
|
-
case "tool_call_update":
|
|
18
|
-
if (update.status === "completed")
|
|
19
|
-
return `[tool:✓] ${update.title ?? ""}\n`;
|
|
20
|
-
if (update.status === "failed")
|
|
21
|
-
return `[tool:✗] ${update.title ?? ""}\n`;
|
|
22
|
-
return null;
|
|
23
|
-
default:
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
export async function initAcpSession(opts) {
|
|
28
|
-
const child = spawn(opts.command, opts.args, {
|
|
29
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
30
|
-
cwd: opts.cwd,
|
|
31
|
-
env: process.env,
|
|
32
|
-
detached: true, // create own process group so process.kill(-pid) in terminateAcpSession kills the full tree
|
|
33
|
-
});
|
|
34
|
-
if (!child.stdout || !child.stdin) {
|
|
35
|
-
throw new Error("Failed to create ACP process stdio streams");
|
|
36
|
-
}
|
|
37
|
-
const session = {
|
|
38
|
-
sessionId: "",
|
|
39
|
-
connection: null,
|
|
40
|
-
process: child,
|
|
41
|
-
textBuffer: "",
|
|
42
|
-
stderrBuffer: "",
|
|
43
|
-
options: opts,
|
|
44
|
-
closed: null,
|
|
45
|
-
};
|
|
46
|
-
// Buffer stderr for diagnostics
|
|
47
|
-
if (child.stderr) {
|
|
48
|
-
child.stderr.on("data", (chunk) => {
|
|
49
|
-
session.stderrBuffer += chunk.toString();
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
// Track process exit so hanging prompts can bail out
|
|
53
|
-
session.closed = new Promise((resolve) => {
|
|
54
|
-
child.on("close", (code, signal) => resolve({ code, signal }));
|
|
55
|
-
});
|
|
56
|
-
// Build transport: manual NDJSON parsing on stdout (more reliable), SDK serialization on stdin
|
|
57
|
-
const stdin = child.stdin;
|
|
58
|
-
const stdout = child.stdout;
|
|
59
|
-
const writable = new WritableStream({
|
|
60
|
-
async write(chunk) {
|
|
61
|
-
if (stdin.destroyed || stdin.writableEnded)
|
|
62
|
-
return;
|
|
63
|
-
return new Promise((resolve, reject) => {
|
|
64
|
-
stdin.write(chunk, (err) => (err ? reject(err) : resolve()));
|
|
65
|
-
});
|
|
66
|
-
},
|
|
67
|
-
close() {
|
|
68
|
-
stdin.end();
|
|
69
|
-
},
|
|
70
|
-
abort(reason) {
|
|
71
|
-
stdin.destroy(reason instanceof Error ? reason : new Error(String(reason)));
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
let buffer = "";
|
|
75
|
-
const decoder = new TextDecoder();
|
|
76
|
-
let msgController;
|
|
77
|
-
const parsedMessages = new ReadableStream({
|
|
78
|
-
start(controller) {
|
|
79
|
-
msgController = controller;
|
|
80
|
-
},
|
|
81
|
-
cancel() {
|
|
82
|
-
stdout.destroy();
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
stdout.on("data", (chunk) => {
|
|
86
|
-
buffer += decoder.decode(chunk, { stream: true });
|
|
87
|
-
const lines = buffer.split("\n");
|
|
88
|
-
buffer = lines.pop() || "";
|
|
89
|
-
for (const line of lines) {
|
|
90
|
-
const trimmed = line.trim();
|
|
91
|
-
if (trimmed) {
|
|
92
|
-
try {
|
|
93
|
-
const msg = JSON.parse(trimmed);
|
|
94
|
-
// Filter kiro-cli private notifications — the ACP SDK doesn't know about
|
|
95
|
-
// _kiro.dev/* methods and responds with -32601 "Method not found".
|
|
96
|
-
// These are private kiro-cli extensions the ACP SDK does not handle.
|
|
97
|
-
if (msg.method &&
|
|
98
|
-
typeof msg.method === "string" &&
|
|
99
|
-
msg.method.startsWith("_kiro.dev/")) {
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
msgController.enqueue(msg);
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
/* skip malformed */
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
stdout.on("end", () => {
|
|
111
|
-
if (buffer.trim()) {
|
|
112
|
-
try {
|
|
113
|
-
msgController.enqueue(JSON.parse(buffer.trim()));
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
/* skip */
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
msgController.close();
|
|
120
|
-
});
|
|
121
|
-
stdout.on("error", (err) => {
|
|
122
|
-
msgController.error(err);
|
|
123
|
-
});
|
|
124
|
-
// Use ndJsonStream only for writable serialization; readable is our manual parser
|
|
125
|
-
const dummyReadable = new ReadableStream({ start() { } });
|
|
126
|
-
const ndJson = acp.ndJsonStream(writable, dummyReadable);
|
|
127
|
-
const stream = {
|
|
128
|
-
readable: parsedMessages,
|
|
129
|
-
writable: ndJson.writable,
|
|
130
|
-
};
|
|
131
|
-
const client = {
|
|
132
|
-
async requestPermission(params) {
|
|
133
|
-
if (opts.trustAllTools && params.options?.length) {
|
|
134
|
-
const allow = params.options.find((o) => o.kind === "allow_always") ??
|
|
135
|
-
params.options.find((o) => o.kind === "allow_once");
|
|
136
|
-
if (allow)
|
|
137
|
-
return { outcome: { outcome: "selected", optionId: allow.optionId } };
|
|
138
|
-
}
|
|
139
|
-
return { outcome: { outcome: "cancelled" } };
|
|
140
|
-
},
|
|
141
|
-
async sessionUpdate(params) {
|
|
142
|
-
const { update } = params;
|
|
143
|
-
if (!update)
|
|
144
|
-
return;
|
|
145
|
-
if (update.sessionUpdate === "agent_message_chunk" &&
|
|
146
|
-
update.content?.type === "text") {
|
|
147
|
-
session.textBuffer += update.content.text;
|
|
148
|
-
}
|
|
149
|
-
if (opts.verbose) {
|
|
150
|
-
const line = formatStreamingUpdate(update);
|
|
151
|
-
if (line)
|
|
152
|
-
process.stderr.write(line);
|
|
153
|
-
}
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
session.connection = new acp.ClientSideConnection(() => client, stream);
|
|
157
|
-
// Initialize
|
|
158
|
-
await session.connection.initialize({
|
|
159
|
-
protocolVersion: acp.PROTOCOL_VERSION,
|
|
160
|
-
clientCapabilities: {},
|
|
161
|
-
clientInfo: { name: "autoloop", version: "0.1.0" },
|
|
162
|
-
});
|
|
163
|
-
// Create session
|
|
164
|
-
const result = await session.connection.newSession({
|
|
165
|
-
cwd: opts.cwd,
|
|
166
|
-
mcpServers: [],
|
|
167
|
-
});
|
|
168
|
-
session.sessionId = result.sessionId;
|
|
169
|
-
// Optionally set mode/model
|
|
170
|
-
if (opts.agentName) {
|
|
171
|
-
await session.connection.setSessionMode({
|
|
172
|
-
sessionId: session.sessionId,
|
|
173
|
-
modeId: opts.agentName,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
if (opts.modelId) {
|
|
177
|
-
await session.connection.unstable_setSessionModel({
|
|
178
|
-
sessionId: session.sessionId,
|
|
179
|
-
modelId: opts.modelId,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
return session;
|
|
183
|
-
}
|
|
184
|
-
export async function sendAcpPrompt(session, prompt, timeoutMs) {
|
|
185
|
-
session.textBuffer = "";
|
|
186
|
-
// Retry with backoff if agent isn't idle yet
|
|
187
|
-
const maxAttempts = 3;
|
|
188
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
189
|
-
try {
|
|
190
|
-
return await sendAcpPromptOnce(session, prompt, timeoutMs);
|
|
191
|
-
}
|
|
192
|
-
catch (err) {
|
|
193
|
-
if (err.message?.includes("not idle") && attempt < maxAttempts) {
|
|
194
|
-
await new Promise((r) => setTimeout(r, attempt * 2000));
|
|
195
|
-
continue;
|
|
196
|
-
}
|
|
197
|
-
throw err;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// unreachable, but satisfies TS
|
|
201
|
-
return {
|
|
202
|
-
output: session.textBuffer,
|
|
203
|
-
stopReason: "end_turn",
|
|
204
|
-
timedOut: false,
|
|
205
|
-
error: "retry exhausted",
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
async function sendAcpPromptOnce(session, prompt, timeoutMs) {
|
|
209
|
-
session.textBuffer = "";
|
|
210
|
-
let timedOut = false;
|
|
211
|
-
let timer;
|
|
212
|
-
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
213
|
-
timer = setTimeout(() => {
|
|
214
|
-
timedOut = true;
|
|
215
|
-
session.connection.cancel({ sessionId: session.sessionId });
|
|
216
|
-
reject(new Error("ACP prompt timed out"));
|
|
217
|
-
}, timeoutMs);
|
|
218
|
-
});
|
|
219
|
-
// Detect process crash mid-prompt
|
|
220
|
-
const crashPromise = session.closed.then(({ code, signal }) => {
|
|
221
|
-
const stderr = session.stderrBuffer.trim();
|
|
222
|
-
const detail = stderr ? `\n${stderr}` : "";
|
|
223
|
-
throw new Error(`kiro-cli exited unexpectedly: code=${code} signal=${signal}${detail}`);
|
|
224
|
-
});
|
|
225
|
-
try {
|
|
226
|
-
const response = await Promise.race([
|
|
227
|
-
session.connection.prompt({
|
|
228
|
-
sessionId: session.sessionId,
|
|
229
|
-
prompt: [{ type: "text", text: prompt }],
|
|
230
|
-
}),
|
|
231
|
-
timeoutPromise,
|
|
232
|
-
crashPromise,
|
|
233
|
-
]);
|
|
234
|
-
clearTimeout(timer);
|
|
235
|
-
return {
|
|
236
|
-
output: session.textBuffer,
|
|
237
|
-
stopReason: response.stopReason,
|
|
238
|
-
timedOut: false,
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
catch (err) {
|
|
242
|
-
clearTimeout(timer);
|
|
243
|
-
if (timedOut) {
|
|
244
|
-
return {
|
|
245
|
-
output: session.textBuffer,
|
|
246
|
-
stopReason: "cancelled",
|
|
247
|
-
timedOut: true,
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
return {
|
|
251
|
-
output: session.textBuffer,
|
|
252
|
-
stopReason: "end_turn",
|
|
253
|
-
timedOut: false,
|
|
254
|
-
error: String(err),
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
export async function terminateAcpSession(session) {
|
|
259
|
-
const child = session.process;
|
|
260
|
-
if (!child.pid || child.killed)
|
|
261
|
-
return;
|
|
262
|
-
// Cancel any in-flight turn before killing
|
|
263
|
-
try {
|
|
264
|
-
session.connection.cancel({ sessionId: session.sessionId });
|
|
265
|
-
}
|
|
266
|
-
catch {
|
|
267
|
-
/* may not have a session */
|
|
268
|
-
}
|
|
269
|
-
// Kill the entire process tree — MCP servers run in their own process groups
|
|
270
|
-
// and won't die from just killing the parent.
|
|
271
|
-
const pid = child.pid;
|
|
272
|
-
try {
|
|
273
|
-
process.kill(-pid, "SIGTERM");
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
/* process group may not exist */
|
|
277
|
-
}
|
|
278
|
-
child.kill("SIGTERM");
|
|
279
|
-
const exited = await Promise.race([
|
|
280
|
-
new Promise((resolve) => child.on("exit", () => resolve(true))),
|
|
281
|
-
new Promise((resolve) => setTimeout(() => resolve(false), 3000)),
|
|
282
|
-
]);
|
|
283
|
-
if (!exited && !child.killed) {
|
|
284
|
-
try {
|
|
285
|
-
process.kill(-pid, "SIGKILL");
|
|
286
|
-
}
|
|
287
|
-
catch {
|
|
288
|
-
/* already dead */
|
|
289
|
-
}
|
|
290
|
-
child.kill("SIGKILL");
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=acp-client.js.map
|