@mobrienv/autoloop 0.1.3 → 0.2.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 +13 -0
- 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 +32 -0
- package/dist/backend/acp-client.js +210 -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 +121 -19
- 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 +16 -1
- package/dist/config.js +105 -13
- 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 +48 -11
- 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
|
@@ -115,6 +115,19 @@ autoloop/
|
|
|
115
115
|
|
|
116
116
|
A preset is a directory containing `autoloops.toml`, `topology.toml`, `harness.md`, and a `roles/` folder. See [docs/creating-presets.md](docs/creating-presets.md) for the full guide, or examine any `presets/<name>/` directory as a working example.
|
|
117
117
|
|
|
118
|
+
## Developer scripts
|
|
119
|
+
|
|
120
|
+
A convenience dispatcher lives at `bin/dev`. It wraps common dev commands so you don't have to remember the exact incantation:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
bin/dev build # compile TypeScript
|
|
124
|
+
bin/dev test # run the test suite
|
|
125
|
+
bin/dev test:watch # vitest in watch mode
|
|
126
|
+
bin/dev hooks # install git hooks
|
|
127
|
+
bin/dev run [args] # run autoloop
|
|
128
|
+
bin/dev --help # list all subcommands
|
|
129
|
+
```
|
|
130
|
+
|
|
118
131
|
## Running tests
|
|
119
132
|
|
|
120
133
|
```bash
|
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,32 @@
|
|
|
1
|
+
import * as acp from "@agentclientprotocol/sdk";
|
|
2
|
+
import { type ChildProcess } from "node:child_process";
|
|
3
|
+
export interface AcpClientOptions {
|
|
4
|
+
command: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
cwd: string;
|
|
7
|
+
trustAllTools: boolean;
|
|
8
|
+
agentName?: string;
|
|
9
|
+
modelId?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AcpSession {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
connection: acp.ClientSideConnection;
|
|
14
|
+
process: ChildProcess;
|
|
15
|
+
textBuffer: string;
|
|
16
|
+
stderrBuffer: string;
|
|
17
|
+
options: AcpClientOptions;
|
|
18
|
+
/** Resolves when the child process exits — used to race against hanging prompts */
|
|
19
|
+
closed: Promise<{
|
|
20
|
+
code: number | null;
|
|
21
|
+
signal: string | null;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface AcpPromptResult {
|
|
25
|
+
output: string;
|
|
26
|
+
stopReason: acp.StopReason;
|
|
27
|
+
timedOut: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function initAcpSession(opts: AcpClientOptions): Promise<AcpSession>;
|
|
31
|
+
export declare function sendAcpPrompt(session: AcpSession, prompt: string, timeoutMs: number): Promise<AcpPromptResult>;
|
|
32
|
+
export declare function terminateAcpSession(session: AcpSession): Promise<void>;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import * as acp from "@agentclientprotocol/sdk";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
export async function initAcpSession(opts) {
|
|
4
|
+
const child = spawn(opts.command, opts.args, {
|
|
5
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
6
|
+
cwd: opts.cwd,
|
|
7
|
+
env: process.env,
|
|
8
|
+
detached: true, // create process group so we can kill the tree with process.kill(-pid)
|
|
9
|
+
});
|
|
10
|
+
if (!child.stdout || !child.stdin) {
|
|
11
|
+
throw new Error("Failed to create ACP process stdio streams");
|
|
12
|
+
}
|
|
13
|
+
const session = {
|
|
14
|
+
sessionId: "",
|
|
15
|
+
connection: null,
|
|
16
|
+
process: child,
|
|
17
|
+
textBuffer: "",
|
|
18
|
+
stderrBuffer: "",
|
|
19
|
+
options: opts,
|
|
20
|
+
closed: null,
|
|
21
|
+
};
|
|
22
|
+
// Buffer stderr for diagnostics
|
|
23
|
+
if (child.stderr) {
|
|
24
|
+
child.stderr.on("data", (chunk) => {
|
|
25
|
+
session.stderrBuffer += chunk.toString();
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Track process exit so hanging prompts can bail out
|
|
29
|
+
session.closed = new Promise((resolve) => {
|
|
30
|
+
child.on("close", (code, signal) => resolve({ code, signal }));
|
|
31
|
+
});
|
|
32
|
+
// Build transport: manual NDJSON parsing on stdout (more reliable), SDK serialization on stdin
|
|
33
|
+
const stdin = child.stdin;
|
|
34
|
+
const stdout = child.stdout;
|
|
35
|
+
const writable = new WritableStream({
|
|
36
|
+
async write(chunk) {
|
|
37
|
+
if (stdin.destroyed || stdin.writableEnded)
|
|
38
|
+
return;
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
stdin.write(chunk, (err) => (err ? reject(err) : resolve()));
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
close() { stdin.end(); },
|
|
44
|
+
abort(reason) { stdin.destroy(reason instanceof Error ? reason : new Error(String(reason))); },
|
|
45
|
+
});
|
|
46
|
+
let buffer = "";
|
|
47
|
+
const decoder = new TextDecoder();
|
|
48
|
+
let msgController;
|
|
49
|
+
const parsedMessages = new ReadableStream({
|
|
50
|
+
start(controller) { msgController = controller; },
|
|
51
|
+
cancel() { stdout.destroy(); },
|
|
52
|
+
});
|
|
53
|
+
stdout.on("data", (chunk) => {
|
|
54
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
55
|
+
const lines = buffer.split("\n");
|
|
56
|
+
buffer = lines.pop() || "";
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
const trimmed = line.trim();
|
|
59
|
+
if (trimmed) {
|
|
60
|
+
try {
|
|
61
|
+
const msg = JSON.parse(trimmed);
|
|
62
|
+
// Filter kiro-cli private notifications — the ACP SDK doesn't know about
|
|
63
|
+
// _kiro.dev/* methods and responds with -32601 "Method not found".
|
|
64
|
+
// These are private kiro-cli extensions the ACP SDK does not handle.
|
|
65
|
+
if (msg.method && typeof msg.method === "string" && msg.method.startsWith("_kiro.dev/")) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
msgController.enqueue(msg);
|
|
69
|
+
}
|
|
70
|
+
catch { /* skip malformed */ }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
stdout.on("end", () => {
|
|
75
|
+
if (buffer.trim()) {
|
|
76
|
+
try {
|
|
77
|
+
msgController.enqueue(JSON.parse(buffer.trim()));
|
|
78
|
+
}
|
|
79
|
+
catch { /* skip */ }
|
|
80
|
+
}
|
|
81
|
+
msgController.close();
|
|
82
|
+
});
|
|
83
|
+
stdout.on("error", (err) => { msgController.error(err); });
|
|
84
|
+
// Use ndJsonStream only for writable serialization; readable is our manual parser
|
|
85
|
+
const dummyReadable = new ReadableStream({ start() { } });
|
|
86
|
+
const ndJson = acp.ndJsonStream(writable, dummyReadable);
|
|
87
|
+
const stream = { readable: parsedMessages, writable: ndJson.writable };
|
|
88
|
+
const client = {
|
|
89
|
+
async requestPermission(params) {
|
|
90
|
+
if (opts.trustAllTools && params.options?.length) {
|
|
91
|
+
const allow = params.options.find(o => o.kind === "allow_always") ?? params.options.find(o => o.kind === "allow_once");
|
|
92
|
+
if (allow)
|
|
93
|
+
return { outcome: { outcome: "selected", optionId: allow.optionId } };
|
|
94
|
+
}
|
|
95
|
+
return { outcome: { outcome: "cancelled" } };
|
|
96
|
+
},
|
|
97
|
+
async sessionUpdate(params) {
|
|
98
|
+
const { update } = params;
|
|
99
|
+
if (!update)
|
|
100
|
+
return;
|
|
101
|
+
if (update.sessionUpdate === "agent_message_chunk" && update.content?.type === "text") {
|
|
102
|
+
session.textBuffer += update.content.text;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
session.connection = new acp.ClientSideConnection(() => client, stream);
|
|
107
|
+
// Initialize
|
|
108
|
+
await session.connection.initialize({
|
|
109
|
+
protocolVersion: acp.PROTOCOL_VERSION,
|
|
110
|
+
clientCapabilities: {},
|
|
111
|
+
clientInfo: { name: "autoloop", version: "0.1.0" },
|
|
112
|
+
});
|
|
113
|
+
// Create session
|
|
114
|
+
const result = await session.connection.newSession({ cwd: opts.cwd, mcpServers: [] });
|
|
115
|
+
session.sessionId = result.sessionId;
|
|
116
|
+
// Optionally set mode/model
|
|
117
|
+
if (opts.agentName) {
|
|
118
|
+
await session.connection.setSessionMode({ sessionId: session.sessionId, modeId: opts.agentName });
|
|
119
|
+
}
|
|
120
|
+
if (opts.modelId) {
|
|
121
|
+
await session.connection.unstable_setSessionModel({ sessionId: session.sessionId, modelId: opts.modelId });
|
|
122
|
+
}
|
|
123
|
+
return session;
|
|
124
|
+
}
|
|
125
|
+
export async function sendAcpPrompt(session, prompt, timeoutMs) {
|
|
126
|
+
session.textBuffer = "";
|
|
127
|
+
// Retry with backoff if agent isn't idle yet
|
|
128
|
+
const maxAttempts = 3;
|
|
129
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
130
|
+
try {
|
|
131
|
+
return await sendAcpPromptOnce(session, prompt, timeoutMs);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
if (err.message?.includes("not idle") && attempt < maxAttempts) {
|
|
135
|
+
await new Promise((r) => setTimeout(r, attempt * 2000));
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
throw err;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// unreachable, but satisfies TS
|
|
142
|
+
return { output: session.textBuffer, stopReason: "end_turn", timedOut: false, error: "retry exhausted" };
|
|
143
|
+
}
|
|
144
|
+
async function sendAcpPromptOnce(session, prompt, timeoutMs) {
|
|
145
|
+
session.textBuffer = "";
|
|
146
|
+
let timedOut = false;
|
|
147
|
+
let timer;
|
|
148
|
+
const timeoutPromise = new Promise((_resolve, reject) => {
|
|
149
|
+
timer = setTimeout(() => {
|
|
150
|
+
timedOut = true;
|
|
151
|
+
session.connection.cancel({ sessionId: session.sessionId });
|
|
152
|
+
reject(new Error("ACP prompt timed out"));
|
|
153
|
+
}, timeoutMs);
|
|
154
|
+
});
|
|
155
|
+
// Detect process crash mid-prompt
|
|
156
|
+
const crashPromise = session.closed.then(({ code, signal }) => {
|
|
157
|
+
const stderr = session.stderrBuffer.trim();
|
|
158
|
+
const detail = stderr ? `\n${stderr}` : "";
|
|
159
|
+
throw new Error(`kiro-cli exited unexpectedly: code=${code} signal=${signal}${detail}`);
|
|
160
|
+
});
|
|
161
|
+
try {
|
|
162
|
+
const response = await Promise.race([
|
|
163
|
+
session.connection.prompt({
|
|
164
|
+
sessionId: session.sessionId,
|
|
165
|
+
prompt: [{ type: "text", text: prompt }],
|
|
166
|
+
}),
|
|
167
|
+
timeoutPromise,
|
|
168
|
+
crashPromise,
|
|
169
|
+
]);
|
|
170
|
+
clearTimeout(timer);
|
|
171
|
+
return { output: session.textBuffer, stopReason: response.stopReason, timedOut: false };
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
clearTimeout(timer);
|
|
175
|
+
if (timedOut) {
|
|
176
|
+
return { output: session.textBuffer, stopReason: "cancelled", timedOut: true };
|
|
177
|
+
}
|
|
178
|
+
return { output: session.textBuffer, stopReason: "end_turn", timedOut: false, error: String(err) };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export async function terminateAcpSession(session) {
|
|
182
|
+
const child = session.process;
|
|
183
|
+
if (!child.pid || child.killed)
|
|
184
|
+
return;
|
|
185
|
+
// Cancel any in-flight turn before killing
|
|
186
|
+
try {
|
|
187
|
+
session.connection.cancel({ sessionId: session.sessionId });
|
|
188
|
+
}
|
|
189
|
+
catch { /* may not have a session */ }
|
|
190
|
+
// Kill the entire process tree — MCP servers run in their own process groups
|
|
191
|
+
// and won't die from just killing the parent.
|
|
192
|
+
const pid = child.pid;
|
|
193
|
+
try {
|
|
194
|
+
process.kill(-pid, "SIGTERM");
|
|
195
|
+
}
|
|
196
|
+
catch { /* process group may not exist */ }
|
|
197
|
+
child.kill("SIGTERM");
|
|
198
|
+
const exited = await Promise.race([
|
|
199
|
+
new Promise((resolve) => child.on("exit", () => resolve(true))),
|
|
200
|
+
new Promise((resolve) => setTimeout(() => resolve(false), 3000)),
|
|
201
|
+
]);
|
|
202
|
+
if (!exited && !child.killed) {
|
|
203
|
+
try {
|
|
204
|
+
process.kill(-pid, "SIGKILL");
|
|
205
|
+
}
|
|
206
|
+
catch { /* already dead */ }
|
|
207
|
+
child.kill("SIGKILL");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# 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;
|
package/dist/backend/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { basename, join } from "node:path";
|
|
2
2
|
import { shellQuote } from "../utils.js";
|
|
3
|
-
import { buildPiAdapterInvocation } from "./run-pi.js";
|
|
4
3
|
import { buildCommandInvocation, runShellCommand } from "./run-command.js";
|
|
5
4
|
import { mockBackend } from "./run-mock.js";
|
|
5
|
+
import { buildPiAdapterInvocation } from "./run-pi.js";
|
|
6
6
|
export function normalizeBackendLabel(command) {
|
|
7
7
|
if (!command)
|
|
8
8
|
return "";
|
|
@@ -11,6 +11,8 @@ export function normalizeBackendLabel(command) {
|
|
|
11
11
|
return "claude";
|
|
12
12
|
if (base === "pi")
|
|
13
13
|
return "pi";
|
|
14
|
+
if (base === "kiro-cli")
|
|
15
|
+
return "kiro";
|
|
14
16
|
return base || command;
|
|
15
17
|
}
|
|
16
18
|
export function buildBackendShellCommand(ctx) {
|
|
@@ -27,16 +29,24 @@ export function runBackendCommand(providerKind, command, timeoutMs) {
|
|
|
27
29
|
export function normalizeProviderKind(spec) {
|
|
28
30
|
if (spec.kind === "pi")
|
|
29
31
|
return "pi";
|
|
32
|
+
if (spec.kind === "kiro")
|
|
33
|
+
return "kiro";
|
|
30
34
|
if (mockBackend(spec.command, spec.args))
|
|
31
35
|
return "mock";
|
|
32
36
|
return spec.kind || "command";
|
|
33
37
|
}
|
|
34
38
|
function promptRuntimeEnvLines(spec, prompt, promptPath, runtimeEnv) {
|
|
35
39
|
let lines = runtimeEnv +
|
|
36
|
-
"export
|
|
37
|
-
|
|
40
|
+
"export AUTOLOOP_PROMPT_PATH=" +
|
|
41
|
+
shellQuote(promptPath) +
|
|
42
|
+
"\n" +
|
|
43
|
+
"printf '%s' " +
|
|
44
|
+
shellQuote(prompt) +
|
|
45
|
+
" > " +
|
|
46
|
+
shellQuote(promptPath) +
|
|
47
|
+
"\n";
|
|
38
48
|
if (spec.kind !== "pi") {
|
|
39
|
-
lines +=
|
|
49
|
+
lines += `export AUTOLOOP_PROMPT=${shellQuote(prompt)}\n`;
|
|
40
50
|
}
|
|
41
51
|
return lines;
|
|
42
52
|
}
|
|
@@ -49,7 +59,9 @@ function wrapProcessInvocation(command) {
|
|
|
49
59
|
" fi\n" +
|
|
50
60
|
"}\n" +
|
|
51
61
|
"trap 'autoloops_cleanup; exit 130' INT TERM\n" +
|
|
52
|
-
"(\n" +
|
|
62
|
+
"(\n" +
|
|
63
|
+
command +
|
|
64
|
+
"\n) &\n" +
|
|
53
65
|
"autoloops_child_pid=$!\n" +
|
|
54
66
|
'wait "$autoloops_child_pid"\n' +
|
|
55
67
|
"autoloops_status=$?\n" +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/backend/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronous bridge to the kiro ACP worker thread.
|
|
3
|
+
* Uses SharedArrayBuffer + Atomics to block the main thread
|
|
4
|
+
* while the worker processes async ACP operations.
|
|
5
|
+
*/
|
|
6
|
+
import { Worker } from "node:worker_threads";
|
|
7
|
+
import type { AcpClientOptions } from "./acp-client.js";
|
|
8
|
+
import type { BackendRunResult } from "./types.js";
|
|
9
|
+
export interface KiroSessionHandle {
|
|
10
|
+
worker: Worker;
|
|
11
|
+
controlBuffer: SharedArrayBuffer;
|
|
12
|
+
dataBuffer: SharedArrayBuffer;
|
|
13
|
+
}
|
|
14
|
+
export declare function initKiroSession(opts: AcpClientOptions): KiroSessionHandle;
|
|
15
|
+
export declare function runKiroIterationSync(handle: KiroSessionHandle, prompt: string, timeoutMs: number): BackendRunResult;
|
|
16
|
+
export declare function setKiroSessionMode(handle: KiroSessionHandle, agentName: string): void;
|
|
17
|
+
export declare function terminateKiroSession(handle: KiroSessionHandle): void;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronous bridge to the kiro ACP worker thread.
|
|
3
|
+
* Uses SharedArrayBuffer + Atomics to block the main thread
|
|
4
|
+
* while the worker processes async ACP operations.
|
|
5
|
+
*/
|
|
6
|
+
import { Worker } from "node:worker_threads";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
const DATA_BUFFER_SIZE = 4 * 1024 * 1024; // 4 MB for prompt/response data
|
|
10
|
+
function sendCommand(handle, cmd) {
|
|
11
|
+
const control = new Int32Array(handle.controlBuffer);
|
|
12
|
+
const data = new Uint8Array(handle.dataBuffer);
|
|
13
|
+
const encoder = new TextEncoder();
|
|
14
|
+
const decoder = new TextDecoder();
|
|
15
|
+
// Write command
|
|
16
|
+
const json = encoder.encode(JSON.stringify(cmd));
|
|
17
|
+
new DataView(handle.dataBuffer).setUint32(0, json.length);
|
|
18
|
+
data.set(json, 4);
|
|
19
|
+
// Signal worker
|
|
20
|
+
Atomics.store(control, 0, 1);
|
|
21
|
+
Atomics.notify(control, 0);
|
|
22
|
+
// Block until worker signals result (control[0] = 2)
|
|
23
|
+
Atomics.wait(control, 0, 1);
|
|
24
|
+
// Read result
|
|
25
|
+
const len = new DataView(handle.dataBuffer).getUint32(0);
|
|
26
|
+
const resultJson = decoder.decode(data.slice(4, 4 + len));
|
|
27
|
+
Atomics.store(control, 0, 0); // reset for next command
|
|
28
|
+
Atomics.notify(control, 0); // wake worker waiting on Atomics.wait(control, 0, 2)
|
|
29
|
+
return JSON.parse(resultJson);
|
|
30
|
+
}
|
|
31
|
+
export function initKiroSession(opts) {
|
|
32
|
+
const controlBuffer = new SharedArrayBuffer(4);
|
|
33
|
+
const dataBuffer = new SharedArrayBuffer(DATA_BUFFER_SIZE);
|
|
34
|
+
const control = new Int32Array(controlBuffer);
|
|
35
|
+
Atomics.store(control, 0, 0);
|
|
36
|
+
const workerPath = join(fileURLToPath(import.meta.url), "..", "kiro-worker.js");
|
|
37
|
+
const worker = new Worker(workerPath, {
|
|
38
|
+
workerData: { controlBuffer, dataBuffer },
|
|
39
|
+
});
|
|
40
|
+
const handle = { worker, controlBuffer, dataBuffer };
|
|
41
|
+
const result = sendCommand(handle, { type: "init", opts });
|
|
42
|
+
if (!result.ok)
|
|
43
|
+
throw new Error("Failed to init kiro session: " + result.error);
|
|
44
|
+
return handle;
|
|
45
|
+
}
|
|
46
|
+
export function runKiroIterationSync(handle, prompt, timeoutMs) {
|
|
47
|
+
const result = sendCommand(handle, { type: "prompt", prompt, timeoutMs });
|
|
48
|
+
if (!result.ok) {
|
|
49
|
+
return {
|
|
50
|
+
output: result.error || "",
|
|
51
|
+
exitCode: 1,
|
|
52
|
+
timedOut: false,
|
|
53
|
+
providerKind: "kiro",
|
|
54
|
+
errorCategory: "non_zero_exit",
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
output: result.output || "",
|
|
59
|
+
exitCode: result.error ? 1 : 0,
|
|
60
|
+
timedOut: result.timedOut || false,
|
|
61
|
+
providerKind: "kiro",
|
|
62
|
+
errorCategory: result.timedOut ? "timeout" : result.error ? "non_zero_exit" : "none",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function setKiroSessionMode(handle, agentName) {
|
|
66
|
+
const result = sendCommand(handle, { type: "set_mode", agentName });
|
|
67
|
+
if (!result.ok) {
|
|
68
|
+
// Non-fatal: log but don't crash the loop
|
|
69
|
+
process.stderr.write(`[autoloop] warning: failed to set kiro agent mode "${agentName}": ${result.error}\n`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function terminateKiroSession(handle) {
|
|
73
|
+
sendCommand(handle, { type: "terminate" });
|
|
74
|
+
// Signal shutdown
|
|
75
|
+
const control = new Int32Array(handle.controlBuffer);
|
|
76
|
+
Atomics.store(control, 0, 3);
|
|
77
|
+
Atomics.notify(control, 0);
|
|
78
|
+
handle.worker.terminate();
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=kiro-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro-bridge.js","sourceRoot":"","sources":["../../src/backend/kiro-bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,gCAAgC;AAQ1E,SAAS,WAAW,CAAC,MAAyB,EAAE,GAAY;IAC1D,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,gBAAgB;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAElB,gBAAgB;IAChB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAE3B,qDAAqD;IACrD,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,cAAc;IACd,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB;IACvD,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAE,qDAAqD;IAClF,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE;QACpC,UAAU,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE;KAC1C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAsB,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IACxE,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAyB,EACzB,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YAC1B,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,MAAM;YACpB,aAAa,EAAE,eAAe;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM;KACrF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAyB,EAAE,SAAiB;IAC7E,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,0CAA0C;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,SAAS,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker thread that holds a persistent ACP session.
|
|
3
|
+
* Communicates with the main thread via SharedArrayBuffer + Atomics.
|
|
4
|
+
*
|
|
5
|
+
* Protocol:
|
|
6
|
+
* Main → Worker: write JSON command to dataBuffer, signal controlBuffer[0] = 1
|
|
7
|
+
* Worker → Main: write JSON result to dataBuffer, signal controlBuffer[0] = 2
|
|
8
|
+
* Commands: { type: "init", opts } | { type: "prompt", prompt, timeoutMs } | { type: "terminate" }
|
|
9
|
+
*/
|
|
10
|
+
import { workerData } from "node:worker_threads";
|
|
11
|
+
import { initAcpSession, sendAcpPrompt, terminateAcpSession } from "./acp-client.js";
|
|
12
|
+
const { controlBuffer, dataBuffer } = workerData;
|
|
13
|
+
const control = new Int32Array(controlBuffer);
|
|
14
|
+
const data = new Uint8Array(dataBuffer);
|
|
15
|
+
const decoder = new TextDecoder();
|
|
16
|
+
const encoder = new TextEncoder();
|
|
17
|
+
let session = null;
|
|
18
|
+
function readCommand() {
|
|
19
|
+
const len = new DataView(dataBuffer).getUint32(0);
|
|
20
|
+
const json = decoder.decode(data.slice(4, 4 + len));
|
|
21
|
+
return JSON.parse(json);
|
|
22
|
+
}
|
|
23
|
+
function writeResult(result) {
|
|
24
|
+
const json = encoder.encode(JSON.stringify(result));
|
|
25
|
+
new DataView(dataBuffer).setUint32(0, json.length);
|
|
26
|
+
data.set(json, 4);
|
|
27
|
+
}
|
|
28
|
+
async function handleCommand(cmd) {
|
|
29
|
+
switch (cmd.type) {
|
|
30
|
+
case "init": {
|
|
31
|
+
session = await initAcpSession(cmd.opts);
|
|
32
|
+
return { ok: true, sessionId: session.sessionId };
|
|
33
|
+
}
|
|
34
|
+
case "prompt": {
|
|
35
|
+
if (!session)
|
|
36
|
+
return { ok: false, error: "no session" };
|
|
37
|
+
const result = await sendAcpPrompt(session, cmd.prompt, cmd.timeoutMs);
|
|
38
|
+
return { ok: true, ...result };
|
|
39
|
+
}
|
|
40
|
+
case "set_mode": {
|
|
41
|
+
if (!session)
|
|
42
|
+
return { ok: false, error: "no session" };
|
|
43
|
+
try {
|
|
44
|
+
await session.connection.setSessionMode({ sessionId: session.sessionId, modeId: cmd.agentName });
|
|
45
|
+
return { ok: true };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
case "terminate": {
|
|
52
|
+
if (session)
|
|
53
|
+
await terminateAcpSession(session);
|
|
54
|
+
session = null;
|
|
55
|
+
return { ok: true };
|
|
56
|
+
}
|
|
57
|
+
default:
|
|
58
|
+
return { ok: false, error: "unknown command: " + cmd.type };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
(async () => {
|
|
62
|
+
while (true) {
|
|
63
|
+
// Wait for main thread to signal a command (control[0] = 1)
|
|
64
|
+
Atomics.wait(control, 0, 0);
|
|
65
|
+
if (Atomics.load(control, 0) === 3)
|
|
66
|
+
break; // shutdown signal
|
|
67
|
+
const cmd = readCommand();
|
|
68
|
+
let result;
|
|
69
|
+
try {
|
|
70
|
+
result = await handleCommand(cmd);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
result = { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
74
|
+
}
|
|
75
|
+
writeResult(result);
|
|
76
|
+
Atomics.store(control, 0, 2); // signal result ready
|
|
77
|
+
Atomics.notify(control, 0);
|
|
78
|
+
// Wait for main thread to acknowledge (reset to 0) before looping,
|
|
79
|
+
// otherwise we'd immediately re-enter and read stale data.
|
|
80
|
+
Atomics.wait(control, 0, 2);
|
|
81
|
+
}
|
|
82
|
+
})();
|
|
83
|
+
//# sourceMappingURL=kiro-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro-worker.js","sourceRoot":"","sources":["../../src/backend/kiro-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,9 @@ import { shellQuote, shellWords } from "../utils.js";
|
|
|
3
3
|
export function buildCommandInvocation(spec, prompt) {
|
|
4
4
|
const argv = shellWords([spec.command, ...spec.args]);
|
|
5
5
|
if (spec.promptMode === "stdin") {
|
|
6
|
-
return
|
|
6
|
+
return `printf '%s' ${shellQuote(prompt)} | ${argv}`;
|
|
7
7
|
}
|
|
8
|
-
return argv
|
|
8
|
+
return `${argv} ${shellQuote(prompt)}`;
|
|
9
9
|
}
|
|
10
10
|
export function runShellCommand(providerKind, command, timeoutMs) {
|
|
11
11
|
try {
|