@mobrienv/autoloop 0.1.4 → 0.2.1
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 +103 -42
- package/bin/autoloop +0 -0
- package/dist/agent-map.d.ts +10 -0
- package/dist/agent-map.js +58 -0
- package/dist/agent-map.js.map +1 -0
- package/dist/backend/acp-client.d.ts +38 -0
- package/dist/backend/acp-client.js +288 -0
- package/dist/backend/acp-client.js.map +1 -0
- package/dist/backend/index.d.ts +1 -1
- package/dist/backend/index.js +17 -5
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/kiro-bridge.d.ts +17 -0
- package/dist/backend/kiro-bridge.js +80 -0
- package/dist/backend/kiro-bridge.js.map +1 -0
- package/dist/backend/kiro-worker.d.ts +1 -0
- package/dist/backend/kiro-worker.js +83 -0
- package/dist/backend/kiro-worker.js.map +1 -0
- package/dist/backend/run-command.js +2 -2
- package/dist/backend/run-command.js.map +1 -1
- package/dist/backend/run-kiro.d.ts +3 -0
- package/dist/backend/run-kiro.js +12 -0
- package/dist/backend/run-kiro.js.map +1 -0
- package/dist/backend/run-pi.js.map +1 -1
- package/dist/chains/budget.js +16 -4
- package/dist/chains/budget.js.map +1 -1
- package/dist/chains/load.d.ts +7 -1
- package/dist/chains/load.js +58 -9
- package/dist/chains/load.js.map +1 -1
- package/dist/chains/render.js +36 -8
- package/dist/chains/render.js.map +1 -1
- package/dist/chains/run.js +129 -44
- package/dist/chains/run.js.map +1 -1
- package/dist/chains/types.d.ts +1 -0
- package/dist/chains.d.ts +5 -4
- package/dist/chains.js +3 -3
- package/dist/chains.js.map +1 -1
- package/dist/commands/chain.js +6 -4
- package/dist/commands/chain.js.map +1 -1
- package/dist/commands/config.d.ts +1 -0
- package/dist/commands/config.js +74 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +1 -0
- package/dist/commands/dashboard.js +68 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/inspect.js +125 -17
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/list.d.ts +1 -1
- package/dist/commands/list.js +6 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/loops.js +11 -11
- package/dist/commands/loops.js.map +1 -1
- package/dist/commands/memory.js +2 -2
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/run.d.ts +1 -1
- package/dist/commands/run.js +102 -15
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/runs.d.ts +1 -0
- package/dist/commands/runs.js +50 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/task.d.ts +1 -0
- package/dist/commands/task.js +74 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/worktree.d.ts +1 -0
- package/dist/commands/worktree.js +162 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config.d.ts +15 -1
- package/dist/config.js +90 -21
- package/dist/config.js.map +1 -1
- package/dist/dashboard/app.d.ts +12 -0
- package/dist/dashboard/app.js +23 -0
- package/dist/dashboard/app.js.map +1 -0
- package/dist/dashboard/routes/api.d.ts +3 -0
- package/dist/dashboard/routes/api.js +103 -0
- package/dist/dashboard/routes/api.js.map +1 -0
- package/dist/dashboard/routes/pages.d.ts +2 -0
- package/dist/dashboard/routes/pages.js +14 -0
- package/dist/dashboard/routes/pages.js.map +1 -0
- package/dist/dashboard/views/alpine-vendor.d.ts +1 -0
- package/dist/dashboard/views/alpine-vendor.js +10 -0
- package/dist/dashboard/views/alpine-vendor.js.map +1 -0
- package/dist/dashboard/views/shell.d.ts +1 -0
- package/dist/dashboard/views/shell.js +714 -0
- package/dist/dashboard/views/shell.js.map +1 -0
- package/dist/events/decode.js.map +1 -1
- package/dist/events/encode.js +2 -2
- package/dist/events/encode.js.map +1 -1
- package/dist/harness/config-helpers.d.ts +11 -0
- package/dist/harness/config-helpers.js +242 -64
- package/dist/harness/config-helpers.js.map +1 -1
- package/dist/harness/coordination.js +12 -12
- package/dist/harness/coordination.js.map +1 -1
- package/dist/harness/display.d.ts +4 -3
- package/dist/harness/display.js +57 -11
- package/dist/harness/display.js.map +1 -1
- package/dist/harness/emit.js +31 -13
- package/dist/harness/emit.js.map +1 -1
- package/dist/harness/index.d.ts +7 -7
- package/dist/harness/index.js +151 -35
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/iteration.d.ts +12 -0
- package/dist/harness/iteration.js +66 -64
- package/dist/harness/iteration.js.map +1 -1
- package/dist/harness/journal.d.ts +17 -0
- package/dist/harness/journal.js +74 -5
- package/dist/harness/journal.js.map +1 -1
- package/dist/harness/metareview.js +30 -15
- package/dist/harness/metareview.js.map +1 -1
- package/dist/harness/metrics.js +12 -12
- package/dist/harness/metrics.js.map +1 -1
- package/dist/harness/parallel.d.ts +1 -1
- package/dist/harness/parallel.js +141 -62
- package/dist/harness/parallel.js.map +1 -1
- package/dist/harness/prompt.d.ts +18 -9
- package/dist/harness/prompt.js +80 -44
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/scratchpad.js +8 -6
- package/dist/harness/scratchpad.js.map +1 -1
- package/dist/harness/stop.js +16 -9
- package/dist/harness/stop.js.map +1 -1
- package/dist/harness/tools.js +39 -13
- package/dist/harness/tools.js.map +1 -1
- package/dist/harness/types.d.ts +29 -0
- package/dist/harness/wave/finalize-wave.d.ts +1 -1
- package/dist/harness/wave/finalize-wave.js +36 -9
- package/dist/harness/wave/finalize-wave.js.map +1 -1
- package/dist/harness/wave/launch-branches.d.ts +2 -2
- package/dist/harness/wave/launch-branches.js +147 -51
- package/dist/harness/wave/launch-branches.js.map +1 -1
- package/dist/harness/wave/parse-objectives.js +4 -1
- package/dist/harness/wave/parse-objectives.js.map +1 -1
- package/dist/harness/wave.d.ts +2 -2
- package/dist/harness/wave.js +89 -28
- package/dist/harness/wave.js.map +1 -1
- package/dist/isolation/index.d.ts +4 -0
- package/dist/isolation/index.js +3 -0
- package/dist/isolation/index.js.map +1 -0
- package/dist/isolation/resolve.d.ts +39 -0
- package/dist/isolation/resolve.js +118 -0
- package/dist/isolation/resolve.js.map +1 -0
- package/dist/isolation/run-scope.d.ts +21 -0
- package/dist/isolation/run-scope.js +50 -0
- package/dist/isolation/run-scope.js.map +1 -0
- package/dist/json.js +10 -8
- package/dist/json.js.map +1 -1
- package/dist/loops/health.d.ts +4 -2
- package/dist/loops/health.js +73 -25
- package/dist/loops/health.js.map +1 -1
- package/dist/loops/list.d.ts +2 -2
- package/dist/loops/list.js +6 -6
- package/dist/loops/list.js.map +1 -1
- package/dist/loops/policy.d.ts +6 -0
- package/dist/loops/policy.js +41 -0
- package/dist/loops/policy.js.map +1 -0
- package/dist/loops/render.d.ts +2 -1
- package/dist/loops/render.js +24 -11
- package/dist/loops/render.js.map +1 -1
- package/dist/loops/show.d.ts +2 -2
- package/dist/loops/show.js +13 -13
- package/dist/loops/show.js.map +1 -1
- package/dist/loops/watch.d.ts +7 -1
- package/dist/loops/watch.js +82 -16
- package/dist/loops/watch.js.map +1 -1
- package/dist/main.js +58 -16
- package/dist/main.js.map +1 -1
- package/dist/markdown.js +11 -11
- package/dist/markdown.js.map +1 -1
- package/dist/memory-render.js +5 -5
- package/dist/memory-render.js.map +1 -1
- package/dist/memory.d.ts +1 -2
- package/dist/memory.js +44 -40
- package/dist/memory.js.map +1 -1
- package/dist/pi-adapter.js +11 -11
- package/dist/pi-adapter.js.map +1 -1
- package/dist/profiles.d.ts +12 -0
- package/dist/profiles.js +71 -0
- package/dist/profiles.js.map +1 -0
- package/dist/registry/derive.js +10 -3
- package/dist/registry/derive.js.map +1 -1
- package/dist/registry/discover.d.ts +20 -0
- package/dist/registry/discover.js +98 -0
- package/dist/registry/discover.js.map +1 -0
- package/dist/registry/harness.js +8 -2
- package/dist/registry/harness.js.map +1 -1
- package/dist/registry/index.d.ts +4 -3
- package/dist/registry/index.js +3 -2
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/read.js.map +1 -1
- package/dist/registry/rebuild.js +7 -4
- package/dist/registry/rebuild.js.map +1 -1
- package/dist/registry/types.d.ts +9 -0
- package/dist/registry/update.js +1 -1
- package/dist/registry/update.js.map +1 -1
- package/dist/tasks-render.d.ts +2 -0
- package/dist/tasks-render.js +44 -0
- package/dist/tasks-render.js.map +1 -0
- package/dist/tasks.d.ts +24 -0
- package/dist/tasks.js +184 -0
- package/dist/tasks.js.map +1 -0
- package/dist/testing/mock-backend.js +2 -2
- package/dist/testing/mock-backend.js.map +1 -1
- package/dist/topology.d.ts +6 -0
- package/dist/topology.js +129 -8
- package/dist/topology.js.map +1 -1
- package/dist/usage.d.ts +1 -0
- package/dist/usage.js +56 -11
- package/dist/usage.js.map +1 -1
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +272 -2
- package/dist/utils.js.map +1 -1
- package/dist/worktree/clean.d.ts +12 -0
- package/dist/worktree/clean.js +98 -0
- package/dist/worktree/clean.js.map +1 -0
- package/dist/worktree/create.d.ts +14 -0
- package/dist/worktree/create.js +71 -0
- package/dist/worktree/create.js.map +1 -0
- package/dist/worktree/index.d.ts +10 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/list.d.ts +9 -0
- package/dist/worktree/list.js +24 -0
- package/dist/worktree/list.js.map +1 -0
- package/dist/worktree/merge.d.ts +11 -0
- package/dist/worktree/merge.js +129 -0
- package/dist/worktree/merge.js.map +1 -0
- package/dist/worktree/meta.d.ts +17 -0
- package/dist/worktree/meta.js +34 -0
- package/dist/worktree/meta.js.map +1 -0
- package/package.json +24 -4
- package/presets/autocode/README.md +1 -1
- package/presets/autocode/autoloops.toml +9 -1
- package/presets/autocode/harness.md +12 -5
- package/presets/autocode/roles/build.md +5 -4
- package/presets/autocode/roles/critic.md +2 -2
- package/presets/autocode/roles/finalizer.md +2 -2
- package/presets/autocode/roles/planner.md +7 -7
- package/presets/autodoc/README.md +1 -1
- package/presets/autodoc/autoloops.toml +1 -1
- package/presets/autodoc/harness.md +6 -6
- package/presets/autodoc/roles/auditor.md +3 -3
- package/presets/autodoc/roles/checker.md +2 -2
- package/presets/autodoc/roles/publisher.md +3 -3
- package/presets/autodoc/roles/writer.md +4 -4
- package/presets/autofix/README.md +1 -1
- package/presets/autofix/autoloops.toml +5 -2
- package/presets/autofix/harness.md +8 -7
- package/presets/autofix/roles/closer.md +4 -4
- package/presets/autofix/roles/diagnoser.md +6 -5
- package/presets/autofix/roles/fixer.md +4 -4
- package/presets/autofix/roles/verifier.md +2 -2
- package/presets/autoideas/README.md +1 -1
- package/presets/autoideas/autoloops.toml +1 -1
- package/presets/autoideas/harness.md +11 -11
- package/presets/autoideas/roles/analyst.md +4 -4
- package/presets/autoideas/roles/reviewer.md +3 -3
- package/presets/autoideas/roles/scanner.md +3 -3
- package/presets/autoideas/roles/synthesizer.md +20 -7
- package/presets/automerge/README.md +3 -0
- package/presets/automerge/autoloops.toml +12 -0
- package/presets/automerge/harness.md +10 -0
- package/presets/automerge/miniloops.toml +12 -0
- package/presets/automerge/roles/merge.md +10 -0
- package/presets/automerge/topology.toml +10 -0
- package/presets/autoperf/README.md +1 -1
- package/presets/autoperf/autoloops.toml +1 -1
- package/presets/autoperf/harness.md +5 -5
- package/presets/autoperf/roles/judge.md +3 -3
- package/presets/autoperf/roles/measurer.md +4 -4
- package/presets/autoperf/roles/optimizer.md +4 -4
- package/presets/autoperf/roles/profiler.md +4 -4
- package/presets/autopr/README.md +99 -0
- package/presets/autopr/autoloops.toml +22 -0
- package/presets/autopr/harness.md +27 -0
- package/presets/autopr/miniloops.toml +22 -0
- package/presets/autopr/roles/collector.md +55 -0
- package/presets/autopr/roles/drafter.md +38 -0
- package/presets/autopr/roles/publisher.md +28 -0
- package/presets/autopr/roles/validator.md +31 -0
- package/presets/autopr/topology.toml +32 -0
- package/presets/autoqa/README.md +1 -1
- package/presets/autoqa/autoloops.toml +1 -1
- package/presets/autoqa/harness.md +10 -10
- package/presets/autoqa/roles/executor.md +3 -3
- package/presets/autoqa/roles/inspector.md +2 -2
- package/presets/autoqa/roles/planner.md +6 -6
- package/presets/autoqa/roles/reporter.md +9 -9
- package/presets/autoresearch/README.md +1 -1
- package/presets/autoresearch/autoloops.toml +1 -1
- package/presets/autoresearch/harness.md +5 -5
- package/presets/autoresearch/roles/benchmarker.md +3 -3
- package/presets/autoresearch/roles/evaluator.md +5 -5
- package/presets/autoresearch/roles/implementer.md +4 -4
- package/presets/autoresearch/roles/strategist.md +6 -6
- package/presets/autoreview/README.md +1 -1
- package/presets/autoreview/autoloops.toml +1 -1
- package/presets/autoreview/harness.md +5 -5
- package/presets/autoreview/roles/checker.md +4 -4
- package/presets/autoreview/roles/reader.md +5 -5
- package/presets/autoreview/roles/suggester.md +4 -4
- package/presets/autoreview/roles/summarizer.md +4 -4
- package/presets/autosec/README.md +1 -1
- package/presets/autosec/autoloops.toml +1 -1
- package/presets/autosec/harness.md +5 -5
- package/presets/autosec/roles/analyst.md +4 -4
- package/presets/autosec/roles/hardener.md +2 -2
- package/presets/autosec/roles/reporter.md +4 -4
- package/presets/autosec/roles/scanner.md +3 -3
- package/presets/autosimplify/README.md +1 -1
- package/presets/autosimplify/autoloops.toml +7 -3
- package/presets/autosimplify/harness.md +7 -7
- package/presets/autosimplify/roles/reviewer.md +3 -3
- package/presets/autosimplify/roles/scoper.md +7 -7
- package/presets/autosimplify/roles/simplifier.md +4 -4
- package/presets/autosimplify/roles/verifier.md +3 -3
- package/presets/autospec/README.md +1 -1
- package/presets/autospec/autoloops.toml +1 -1
- package/presets/autospec/harness.md +6 -6
- package/presets/autospec/roles/clarifier.md +4 -3
- package/presets/autospec/roles/critic.md +1 -1
- package/presets/autospec/roles/designer.md +3 -3
- package/presets/autospec/roles/planner.md +2 -2
- package/presets/autospec/roles/researcher.md +3 -3
- package/presets/autotest/README.md +1 -1
- package/presets/autotest/autoloops.toml +1 -1
- package/presets/autotest/harness.md +6 -6
- package/presets/autotest/roles/assessor.md +3 -3
- package/presets/autotest/roles/runner.md +2 -2
- package/presets/autotest/roles/surveyor.md +4 -4
- package/presets/autotest/roles/writer.md +4 -4
package/README.md
CHANGED
|
@@ -1,32 +1,55 @@
|
|
|
1
1
|
# autoloop
|
|
2
2
|
|
|
3
|
-
Autonomous LLM loop harness
|
|
3
|
+
Autonomous LLM loop harness for long-horizon, multi-role agent work.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@mobrienv/autoloop)
|
|
6
|
+
[](https://nodejs.org/)
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## Features
|
|
8
9
|
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
-
|
|
10
|
+
- **Event-driven role routing** -- roles hand off via structured events; the harness manages iteration, backpressure, and completion detection
|
|
11
|
+
- **Append-only journal** -- every iteration is recorded; inspect, replay, or audit any run
|
|
12
|
+
- **Preset system** -- bundled presets for common workflows (code, docs, QA, security, specs); create your own in minutes
|
|
13
|
+
- **Persistent memory** -- loops accumulate learnings and preferences across runs
|
|
14
|
+
- **Dynamic chains** -- compose presets into multi-stage pipelines
|
|
15
|
+
- **Worktree isolation** -- run loops in git worktrees so your working tree stays clean
|
|
12
16
|
|
|
13
|
-
##
|
|
17
|
+
## Table of contents
|
|
18
|
+
|
|
19
|
+
- [Install](#install)
|
|
20
|
+
- [Quick start](#quick-start)
|
|
21
|
+
- [Usage](#usage)
|
|
22
|
+
- [Bundled presets](#bundled-presets)
|
|
23
|
+
- [Creating custom presets](#creating-custom-presets)
|
|
24
|
+
- [Project structure](#project-structure)
|
|
25
|
+
- [Developer scripts](#developer-scripts)
|
|
26
|
+
- [Running tests](#running-tests)
|
|
27
|
+
- [Further reading](#further-reading)
|
|
28
|
+
- [Contributing](#contributing)
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
### From npm (recommended)
|
|
14
33
|
|
|
15
34
|
```bash
|
|
16
35
|
npm install -g @mobrienv/autoloop
|
|
17
36
|
autoloop --help
|
|
18
37
|
```
|
|
19
38
|
|
|
20
|
-
|
|
39
|
+
### From source
|
|
21
40
|
|
|
22
41
|
```bash
|
|
23
|
-
|
|
24
|
-
git clone <repo-url> && cd autoloop
|
|
42
|
+
git clone https://github.com/mikeyobrien/autoloop.git && cd autoloop
|
|
25
43
|
npm install
|
|
26
44
|
npm run build
|
|
45
|
+
node bin/autoloop --help
|
|
46
|
+
```
|
|
27
47
|
|
|
28
|
-
|
|
29
|
-
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Run a bundled preset
|
|
52
|
+
autoloop run autocode "Fix the login bug"
|
|
30
53
|
```
|
|
31
54
|
|
|
32
55
|
`autocode` is a bundled preset. The quoted string is the prompt passed to the loop. The harness iterates through roles (planner -> builder -> critic -> finalizer) until a `task.complete` event is emitted or the iteration limit is reached.
|
|
@@ -34,12 +57,22 @@ node bin/autoloop run autocode "Fix the login bug"
|
|
|
34
57
|
## Usage
|
|
35
58
|
|
|
36
59
|
```
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
60
|
+
autoloop run <preset-name|preset-dir> [prompt...] [flags]
|
|
61
|
+
autoloop emit <topic> [summary]
|
|
62
|
+
autoloop inspect <artifact> [selector] [project-dir] [--format <md|terminal|text|json|csv>]
|
|
63
|
+
autoloop memory <list|add|remove> [args]
|
|
64
|
+
autoloop task <add|complete|update|remove|list> [args]
|
|
65
|
+
autoloop list
|
|
66
|
+
autoloop loops [--all]
|
|
67
|
+
autoloop loops show <run-id>
|
|
68
|
+
autoloop loops artifacts <run-id>
|
|
69
|
+
autoloop loops watch <run-id>
|
|
70
|
+
autoloop loops health [--verbose]
|
|
71
|
+
autoloop chain <list|run> [args]
|
|
72
|
+
autoloop runs clean [--max-age <days>]
|
|
73
|
+
autoloop worktree <list|show|merge|clean> [args]
|
|
74
|
+
autoloop config <show|set|unset|path> [args]
|
|
75
|
+
autoloop dashboard [--port <port>]
|
|
43
76
|
```
|
|
44
77
|
|
|
45
78
|
### Flags
|
|
@@ -51,24 +84,26 @@ npx @mobrienv/autoloop chain <list|run> [args]
|
|
|
51
84
|
| `-b`, `--backend` | Override backend command (e.g. `-b claude`) |
|
|
52
85
|
| `-p`, `--preset` | Resolve a named or custom preset |
|
|
53
86
|
| `--chain` | Run an inline chain of comma-separated presets |
|
|
87
|
+
| `--profile <spec>` | Activate a profile (`repo:<name>` or `user:<name>`), repeatable |
|
|
88
|
+
| `--no-default-profiles` | Suppress config-defined default profiles |
|
|
54
89
|
|
|
55
90
|
### Examples
|
|
56
91
|
|
|
57
92
|
```bash
|
|
58
93
|
# Run a preset by name
|
|
59
|
-
|
|
94
|
+
autoloop run autocode "Refactor the auth module"
|
|
60
95
|
|
|
61
96
|
# Run from a custom preset directory
|
|
62
|
-
|
|
97
|
+
autoloop run ./my-preset "Analyze the API"
|
|
63
98
|
|
|
64
99
|
# Override the backend
|
|
65
|
-
|
|
100
|
+
autoloop run autoqa -b claude "Review recent changes"
|
|
66
101
|
|
|
67
102
|
# List available presets
|
|
68
|
-
|
|
103
|
+
autoloop list
|
|
69
104
|
|
|
70
105
|
# Run an inline chain
|
|
71
|
-
|
|
106
|
+
autoloop run --chain autospec,autocode "Design and build feature X"
|
|
72
107
|
```
|
|
73
108
|
|
|
74
109
|
## Bundled presets
|
|
@@ -79,7 +114,9 @@ node bin/autoloop run --chain autospec,autocode "Design and build feature X"
|
|
|
79
114
|
| `autodoc` | Audit, write, verify, and publish documentation |
|
|
80
115
|
| `autofix` | Diagnose, fix, and verify bugs |
|
|
81
116
|
| `autoideas` | Scan, analyze, review, and synthesize improvement ideas |
|
|
117
|
+
| `automerge` | Merge a completed worktree branch back into its base branch |
|
|
82
118
|
| `autoperf` | Profile, measure, optimize, and judge performance |
|
|
119
|
+
| `autopr` | Turn the current branch into a reviewable pull request |
|
|
83
120
|
| `autoqa` | Plan, execute, inspect, and report on QA |
|
|
84
121
|
| `autoresearch` | Research strategies, implement, evaluate, and benchmark |
|
|
85
122
|
| `autoreview` | Read, suggest, check, and summarize code reviews |
|
|
@@ -88,32 +125,45 @@ node bin/autoloop run --chain autospec,autocode "Design and build feature X"
|
|
|
88
125
|
| `autospec` | Research, clarify, design, plan, and critique specifications |
|
|
89
126
|
| `autotest` | Survey, write, run, and assess tests |
|
|
90
127
|
|
|
128
|
+
## Creating custom presets
|
|
129
|
+
|
|
130
|
+
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [Creating presets](docs/creating-presets.md) for the full guide, or examine any `presets/<name>/` directory as a working example.
|
|
131
|
+
|
|
91
132
|
## Project structure
|
|
92
133
|
|
|
93
134
|
```
|
|
94
135
|
autoloop/
|
|
95
|
-
├── bin/autoloop
|
|
96
|
-
├── src/
|
|
97
|
-
│ ├── main.ts
|
|
98
|
-
│ ├── harness/
|
|
99
|
-
│ ├── config.ts
|
|
100
|
-
│ ├── chains.ts
|
|
101
|
-
│ ├── memory.ts
|
|
102
|
-
│ └── usage.ts
|
|
103
|
-
├── presets/
|
|
136
|
+
├── bin/autoloop # CLI entry point (Node.js ESM)
|
|
137
|
+
├── src/ # TypeScript source
|
|
138
|
+
│ ├── main.ts # CLI dispatch
|
|
139
|
+
│ ├── harness/ # Loop engine (iteration, events, routing)
|
|
140
|
+
│ ├── config.ts # TOML config loading
|
|
141
|
+
│ ├── chains.ts # Chain orchestration
|
|
142
|
+
│ ├── memory.ts # Persistent loop memory
|
|
143
|
+
│ └── usage.ts # Help text
|
|
144
|
+
├── presets/ # Bundled preset definitions
|
|
104
145
|
│ └── <name>/
|
|
105
|
-
│ ├── autoloops.toml
|
|
106
|
-
│ ├── topology.toml
|
|
107
|
-
│ ├── harness.md
|
|
108
|
-
│ └── roles/
|
|
109
|
-
├── docs/
|
|
110
|
-
├── dist/
|
|
146
|
+
│ ├── autoloops.toml
|
|
147
|
+
│ ├── topology.toml
|
|
148
|
+
│ ├── harness.md
|
|
149
|
+
│ └── roles/
|
|
150
|
+
├── docs/ # Reference documentation
|
|
151
|
+
├── dist/ # Compiled output (generated)
|
|
111
152
|
└── package.json
|
|
112
153
|
```
|
|
113
154
|
|
|
114
|
-
##
|
|
155
|
+
## Developer scripts
|
|
115
156
|
|
|
116
|
-
A
|
|
157
|
+
A convenience dispatcher lives at `bin/dev`:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
bin/dev build # compile TypeScript
|
|
161
|
+
bin/dev test # run the test suite
|
|
162
|
+
bin/dev test:watch # vitest in watch mode
|
|
163
|
+
bin/dev hooks # install git hooks
|
|
164
|
+
bin/dev run [args] # run autoloop
|
|
165
|
+
bin/dev --help # list all subcommands
|
|
166
|
+
```
|
|
117
167
|
|
|
118
168
|
## Running tests
|
|
119
169
|
|
|
@@ -125,14 +175,14 @@ Runs the test suite via [Vitest](https://vitest.dev/).
|
|
|
125
175
|
|
|
126
176
|
### Mock backend
|
|
127
177
|
|
|
128
|
-
A deterministic mock backend (`src/testing/mock-backend.ts`) removes the need for a live LLM
|
|
178
|
+
A deterministic mock backend (`src/testing/mock-backend.ts`) removes the need for a live LLM during testing. Point it at a JSON fixture to control output, exit code, and emitted events:
|
|
129
179
|
|
|
130
180
|
```bash
|
|
131
181
|
export MOCK_FIXTURE_PATH=test/fixtures/backend/complete-success.json
|
|
132
182
|
node bin/autoloop run . -b "node dist/testing/mock-backend.js"
|
|
133
183
|
```
|
|
134
184
|
|
|
135
|
-
See [
|
|
185
|
+
See [CLI reference](docs/cli.md#mock-backend) for fixture schema and bundled scenarios.
|
|
136
186
|
|
|
137
187
|
## Further reading
|
|
138
188
|
|
|
@@ -143,3 +193,14 @@ See [docs/cli.md](docs/cli.md#mock-backend) for fixture schema and bundled scena
|
|
|
143
193
|
- [Memory system](docs/memory.md)
|
|
144
194
|
- [Dynamic chains](docs/dynamic-chains.md)
|
|
145
195
|
- [CLI reference](docs/cli.md)
|
|
196
|
+
- [Dashboard](docs/dashboard.md)
|
|
197
|
+
- [Profiles](docs/profiles.md)
|
|
198
|
+
- [Tasks](docs/tasks.md)
|
|
199
|
+
- [Worktree isolation](docs/worktree.md)
|
|
200
|
+
- [Releasing](docs/releasing.md)
|
|
201
|
+
|
|
202
|
+
## Contributing
|
|
203
|
+
|
|
204
|
+
Bug reports and pull requests are welcome at [github.com/mikeyobrien/autoloop](https://github.com/mikeyobrien/autoloop/issues).
|
|
205
|
+
|
|
206
|
+
Prerequisites for development: Node.js >= 18, npm. Run `npm install && npm run build` to get started, then `npm test` to verify.
|
package/bin/autoloop
CHANGED
|
File without changes
|
|
@@ -0,0 +1,10 @@
|
|
|
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;
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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,GAAG,OAAO,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvF,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,GAAG,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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>;
|
|
@@ -0,0 +1,288 @@
|
|
|
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 process group so we can kill the tree with process.kill(-pid)
|
|
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
|
+
},
|
|
150
|
+
};
|
|
151
|
+
session.connection = new acp.ClientSideConnection(() => client, stream);
|
|
152
|
+
// Initialize
|
|
153
|
+
await session.connection.initialize({
|
|
154
|
+
protocolVersion: acp.PROTOCOL_VERSION,
|
|
155
|
+
clientCapabilities: {},
|
|
156
|
+
clientInfo: { name: "autoloop", version: "0.1.0" },
|
|
157
|
+
});
|
|
158
|
+
// Create session
|
|
159
|
+
const result = await session.connection.newSession({
|
|
160
|
+
cwd: opts.cwd,
|
|
161
|
+
mcpServers: [],
|
|
162
|
+
});
|
|
163
|
+
session.sessionId = result.sessionId;
|
|
164
|
+
// Optionally set mode/model
|
|
165
|
+
if (opts.agentName) {
|
|
166
|
+
await session.connection.setSessionMode({
|
|
167
|
+
sessionId: session.sessionId,
|
|
168
|
+
modeId: opts.agentName,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
if (opts.modelId) {
|
|
172
|
+
await session.connection.unstable_setSessionModel({
|
|
173
|
+
sessionId: session.sessionId,
|
|
174
|
+
modelId: opts.modelId,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return session;
|
|
178
|
+
}
|
|
179
|
+
export async function sendAcpPrompt(session, prompt, timeoutMs) {
|
|
180
|
+
session.textBuffer = "";
|
|
181
|
+
// Retry with backoff if agent isn't idle yet
|
|
182
|
+
const maxAttempts = 3;
|
|
183
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
184
|
+
try {
|
|
185
|
+
return await sendAcpPromptOnce(session, prompt, timeoutMs);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
if (err.message?.includes("not idle") && attempt < maxAttempts) {
|
|
189
|
+
await new Promise((r) => setTimeout(r, attempt * 2000));
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// unreachable, but satisfies TS
|
|
196
|
+
return {
|
|
197
|
+
output: session.textBuffer,
|
|
198
|
+
stopReason: "end_turn",
|
|
199
|
+
timedOut: false,
|
|
200
|
+
error: "retry exhausted",
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
async function sendAcpPromptOnce(session, prompt, timeoutMs) {
|
|
204
|
+
session.textBuffer = "";
|
|
205
|
+
let timedOut = false;
|
|
206
|
+
let timer;
|
|
207
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
208
|
+
timer = setTimeout(() => {
|
|
209
|
+
timedOut = true;
|
|
210
|
+
session.connection.cancel({ sessionId: session.sessionId });
|
|
211
|
+
reject(new Error("ACP prompt timed out"));
|
|
212
|
+
}, timeoutMs);
|
|
213
|
+
});
|
|
214
|
+
// Detect process crash mid-prompt
|
|
215
|
+
const crashPromise = session.closed.then(({ code, signal }) => {
|
|
216
|
+
const stderr = session.stderrBuffer.trim();
|
|
217
|
+
const detail = stderr ? `\n${stderr}` : "";
|
|
218
|
+
throw new Error(`kiro-cli exited unexpectedly: code=${code} signal=${signal}${detail}`);
|
|
219
|
+
});
|
|
220
|
+
try {
|
|
221
|
+
const response = await Promise.race([
|
|
222
|
+
session.connection.prompt({
|
|
223
|
+
sessionId: session.sessionId,
|
|
224
|
+
prompt: [{ type: "text", text: prompt }],
|
|
225
|
+
}),
|
|
226
|
+
timeoutPromise,
|
|
227
|
+
crashPromise,
|
|
228
|
+
]);
|
|
229
|
+
clearTimeout(timer);
|
|
230
|
+
return {
|
|
231
|
+
output: session.textBuffer,
|
|
232
|
+
stopReason: response.stopReason,
|
|
233
|
+
timedOut: false,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
clearTimeout(timer);
|
|
238
|
+
if (timedOut) {
|
|
239
|
+
return {
|
|
240
|
+
output: session.textBuffer,
|
|
241
|
+
stopReason: "cancelled",
|
|
242
|
+
timedOut: true,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
output: session.textBuffer,
|
|
247
|
+
stopReason: "end_turn",
|
|
248
|
+
timedOut: false,
|
|
249
|
+
error: String(err),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
export async function terminateAcpSession(session) {
|
|
254
|
+
const child = session.process;
|
|
255
|
+
if (!child.pid || child.killed)
|
|
256
|
+
return;
|
|
257
|
+
// Cancel any in-flight turn before killing
|
|
258
|
+
try {
|
|
259
|
+
session.connection.cancel({ sessionId: session.sessionId });
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
/* may not have a session */
|
|
263
|
+
}
|
|
264
|
+
// Kill the entire process tree — MCP servers run in their own process groups
|
|
265
|
+
// and won't die from just killing the parent.
|
|
266
|
+
const pid = child.pid;
|
|
267
|
+
try {
|
|
268
|
+
process.kill(-pid, "SIGTERM");
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
/* process group may not exist */
|
|
272
|
+
}
|
|
273
|
+
child.kill("SIGTERM");
|
|
274
|
+
const exited = await Promise.race([
|
|
275
|
+
new Promise((resolve) => child.on("exit", () => resolve(true))),
|
|
276
|
+
new Promise((resolve) => setTimeout(() => resolve(false), 3000)),
|
|
277
|
+
]);
|
|
278
|
+
if (!exited && !child.killed) {
|
|
279
|
+
try {
|
|
280
|
+
process.kill(-pid, "SIGKILL");
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
/* already dead */
|
|
284
|
+
}
|
|
285
|
+
child.kill("SIGKILL");
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=acp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../src/backend/acp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BackendCommandContext, BackendRunResult } from "./types.js";
|
|
2
|
-
export type {
|
|
2
|
+
export type { BackendCommandContext, BackendRunResult, BackendSpec, } from "./types.js";
|
|
3
3
|
export declare function normalizeBackendLabel(command: string): string;
|
|
4
4
|
export declare function buildBackendShellCommand(ctx: BackendCommandContext): string;
|
|
5
5
|
export declare function runBackendCommand(providerKind: string, command: string, timeoutMs: number): BackendRunResult;
|