agent-control-plane 0.1.1 → 0.1.3

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.
Files changed (184) hide show
  1. package/README.md +6 -0
  2. package/npm/bin/agent-control-plane.js +149 -5
  3. package/package.json +2 -3
  4. package/tools/vendor/codex-quota/README.md +8 -16
  5. package/tools/vendor/codex-quota/lib/claude-accounts.js +2 -68
  6. package/tools/vendor/codex-quota/lib/claude-usage.js +76 -667
  7. package/tools/vendor/codex-quota/lib/display.js +6 -14
  8. package/tools/vendor/codex-quota/lib/handlers.js +32 -117
  9. package/tools/vendor/codex-quota/lib/sync.js +9 -14
  10. package/tools/tests/test-agent-control-plane-npm-cli.sh +0 -280
  11. package/tools/tests/test-agent-github-update-labels-falls-back-to-repository-id.sh +0 -56
  12. package/tools/tests/test-agent-project-claude-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -89
  13. package/tools/tests/test-agent-project-claude-session-wrapper-does-not-retry-provider-quota.sh +0 -82
  14. package/tools/tests/test-agent-project-claude-session-wrapper-retries-transient-failures.sh +0 -90
  15. package/tools/tests/test-agent-project-claude-session-wrapper-times-out.sh +0 -73
  16. package/tools/tests/test-agent-project-claude-session-wrapper.sh +0 -103
  17. package/tools/tests/test-agent-project-cleanup-session-orphan-fallback.sh +0 -90
  18. package/tools/tests/test-agent-project-cleanup-session-skip-worktree-cleanup.sh +0 -90
  19. package/tools/tests/test-agent-project-codex-live-thread-persist.sh +0 -76
  20. package/tools/tests/test-agent-project-codex-recovery.sh +0 -731
  21. package/tools/tests/test-agent-project-codex-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -105
  22. package/tools/tests/test-agent-project-codex-session-wrapper.sh +0 -97
  23. package/tools/tests/test-agent-project-open-pr-worktree-config-prefix.sh +0 -81
  24. package/tools/tests/test-agent-project-openclaw-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -109
  25. package/tools/tests/test-agent-project-openclaw-session-wrapper-infers-blocked-result-contract.sh +0 -89
  26. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-literal-env-artifacts.sh +0 -113
  27. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-version-mismatch.sh +0 -135
  28. package/tools/tests/test-agent-project-openclaw-session-wrapper-resident.sh +0 -179
  29. package/tools/tests/test-agent-project-openclaw-session-wrapper-reuses-existing-agent-after-add-race.sh +0 -119
  30. package/tools/tests/test-agent-project-openclaw-session-wrapper-terminates-rate-limit-hang.sh +0 -91
  31. package/tools/tests/test-agent-project-openclaw-session-wrapper.sh +0 -117
  32. package/tools/tests/test-agent-project-publish-issue-pr-prunes-stale-worktree-entry.sh +0 -148
  33. package/tools/tests/test-agent-project-publish-issue-pr-reads-archived-session.sh +0 -146
  34. package/tools/tests/test-agent-project-publish-issue-pr-recovers-final-head.sh +0 -145
  35. package/tools/tests/test-agent-project-publish-issue-pr-reuses-existing-worktree.sh +0 -147
  36. package/tools/tests/test-agent-project-reconcile-failure-reason.sh +0 -456
  37. package/tools/tests/test-agent-project-reconcile-issue-archived-session-fallback.sh +0 -96
  38. package/tools/tests/test-agent-project-reconcile-issue-before-blocked.sh +0 -90
  39. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery-uses-recovered-worktree.sh +0 -212
  40. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery.sh +0 -207
  41. package/tools/tests/test-agent-project-reconcile-issue-provider-quota-schedules-provider-cooldown.sh +0 -101
  42. package/tools/tests/test-agent-project-reconcile-issue-session-backfills-lane-metadata-from-worker-key.sh +0 -113
  43. package/tools/tests/test-agent-project-reconcile-issue-session-clears-stale-failed-summary.sh +0 -117
  44. package/tools/tests/test-agent-project-reconcile-issue-session-initializes-shared-agent-home.sh +0 -55
  45. package/tools/tests/test-agent-project-reconcile-issue-session-normalizes-runner-state.sh +0 -125
  46. package/tools/tests/test-agent-project-reconcile-issue-session-records-invalid-contract-summary.sh +0 -118
  47. package/tools/tests/test-agent-project-reconcile-issue-session-skips-duplicate-blocked-comment.sh +0 -144
  48. package/tools/tests/test-agent-project-reconcile-issue-session-standardizes-no-commits-blocker.sh +0 -145
  49. package/tools/tests/test-agent-project-reconcile-issue-session-synthesizes-blocked-comment.sh +0 -139
  50. package/tools/tests/test-agent-project-reconcile-pr-blocked-host-recovery.sh +0 -242
  51. package/tools/tests/test-agent-project-reconcile-pr-guard-blocked-no-commit.sh +0 -142
  52. package/tools/tests/test-agent-project-reconcile-pr-provider-quota-schedules-provider-cooldown.sh +0 -106
  53. package/tools/tests/test-agent-project-reconcile-pr-session-initializes-shared-agent-home.sh +0 -66
  54. package/tools/tests/test-agent-project-reconcile-pr-updated-branch-noop.sh +0 -129
  55. package/tools/tests/test-audit-agent-worktrees-active-launch-skips-git-inspection.sh +0 -69
  56. package/tools/tests/test-audit-agent-worktrees-broken-worktree.sh +0 -43
  57. package/tools/tests/test-audit-agent-worktrees-pending-launch-owner.sh +0 -46
  58. package/tools/tests/test-audit-agent-worktrees-unreconciled-owner.sh +0 -79
  59. package/tools/tests/test-audit-issue-routing-managed-branch-globs.sh +0 -56
  60. package/tools/tests/test-branch-verification-guard-generated-artifacts.sh +0 -72
  61. package/tools/tests/test-branch-verification-guard-targeted-coverage.sh +0 -125
  62. package/tools/tests/test-codex-quota-manager-failure-driven-rotation.sh +0 -178
  63. package/tools/tests/test-codex-quota-wrapper.sh +0 -37
  64. package/tools/tests/test-contribution-docs.sh +0 -18
  65. package/tools/tests/test-control-plane-dashboard-runtime-smoke.sh +0 -343
  66. package/tools/tests/test-create-follow-up-issue.sh +0 -73
  67. package/tools/tests/test-dashboard-launchd-bootstrap.sh +0 -55
  68. package/tools/tests/test-flow-export-execution-env-exports-repo-id.sh +0 -30
  69. package/tools/tests/test-flow-export-github-cli-auth-env-prefers-git-credential.sh +0 -48
  70. package/tools/tests/test-flow-github-api-repo-fallback-preserves-input.sh +0 -85
  71. package/tools/tests/test-flow-github-api-repo-prefers-explicit-repository-id.sh +0 -60
  72. package/tools/tests/test-flow-github-issue-list-falls-back-to-repository-id.sh +0 -64
  73. package/tools/tests/test-flow-github-pr-list-falls-back-to-repository-id.sh +0 -77
  74. package/tools/tests/test-flow-resident-can-reuse-does-not-leak-metadata.sh +0 -52
  75. package/tools/tests/test-flow-resident-reap-stale-controllers.sh +0 -63
  76. package/tools/tests/test-flow-resolve-codex-quota-tools.sh +0 -104
  77. package/tools/tests/test-flow-runtime-doctor-profile-selection.sh +0 -27
  78. package/tools/tests/test-heartbeat-codex-pr-linked-issue-exclusion.sh +0 -79
  79. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-idle-controller.sh +0 -115
  80. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-live-lane-controller.sh +0 -117
  81. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-claude.sh +0 -96
  82. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-codex.sh +0 -96
  83. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop.sh +0 -96
  84. package/tools/tests/test-heartbeat-loop-auth-wait-does-not-consume-capacity.sh +0 -170
  85. package/tools/tests/test-heartbeat-loop-blocked-recovery-lane.sh +0 -201
  86. package/tools/tests/test-heartbeat-loop-blocked-recovery-vs-pr-reservation.sh +0 -201
  87. package/tools/tests/test-heartbeat-loop-idle-resident-controller-does-not-block-launches.sh +0 -160
  88. package/tools/tests/test-heartbeat-loop-pr-launch-dedup.sh +0 -133
  89. package/tools/tests/test-heartbeat-loop-provider-cooldown-suppresses-launches.sh +0 -157
  90. package/tools/tests/test-heartbeat-loop-reaps-stale-resident-controller.sh +0 -181
  91. package/tools/tests/test-heartbeat-loop-waiting-provider-resident-controller-does-not-block-launches.sh +0 -160
  92. package/tools/tests/test-heartbeat-ready-issues-blocked-recovery.sh +0 -134
  93. package/tools/tests/test-heartbeat-safe-auto-dynamic-concurrency.sh +0 -162
  94. package/tools/tests/test-heartbeat-safe-auto-no-tmux-sessions.sh +0 -136
  95. package/tools/tests/test-heartbeat-safe-auto-openclaw-skips-codex-quota.sh +0 -139
  96. package/tools/tests/test-heartbeat-safe-auto-quota-health-signal.sh +0 -119
  97. package/tools/tests/test-heartbeat-safe-auto-stale-shared-loop-pid-does-not-skip.sh +0 -140
  98. package/tools/tests/test-heartbeat-safe-auto-static-capacity-without-quota-cache.sh +0 -142
  99. package/tools/tests/test-heartbeat-safe-auto-zero-healthy-pools.sh +0 -141
  100. package/tools/tests/test-heartbeat-sync-issue-labels-empty-schedule.sh +0 -65
  101. package/tools/tests/test-heartbeat-sync-open-agent-prs-terminal-clears-running.sh +0 -179
  102. package/tools/tests/test-install-dashboard-launchd.sh +0 -78
  103. package/tools/tests/test-install-project-launchd-adds-tool-paths.sh +0 -87
  104. package/tools/tests/test-install-project-launchd.sh +0 -110
  105. package/tools/tests/test-issue-local-workspace-install-policy.sh +0 -81
  106. package/tools/tests/test-issue-publish-scope-guard-docs-signal.sh +0 -70
  107. package/tools/tests/test-issue-reconcile-hooks-success-clears-blocked.sh +0 -36
  108. package/tools/tests/test-kick-scheduler-requires-explicit-profile.sh +0 -47
  109. package/tools/tests/test-label-follow-up-issues-falls-back-to-repository-id.sh +0 -132
  110. package/tools/tests/test-manual-operator-entrypoints-require-explicit-profile.sh +0 -64
  111. package/tools/tests/test-package-funding-metadata.sh +0 -21
  112. package/tools/tests/test-package-public-metadata.sh +0 -62
  113. package/tools/tests/test-placeholder-worker-adapters.sh +0 -38
  114. package/tools/tests/test-pr-reconcile-hooks-refreshes-recurring-issue-checklist.sh +0 -110
  115. package/tools/tests/test-pr-risk-cohesive-mobile-locale-scope.sh +0 -70
  116. package/tools/tests/test-pr-risk-fix-label-semantics.sh +0 -114
  117. package/tools/tests/test-pr-risk-local-first-no-checks.sh +0 -70
  118. package/tools/tests/test-prepare-worktree-simple-repo-baseline.sh +0 -67
  119. package/tools/tests/test-profile-activate.sh +0 -33
  120. package/tools/tests/test-profile-adopt-allow-missing-repo.sh +0 -68
  121. package/tools/tests/test-profile-adopt-skip-workspace-sync-missing-file.sh +0 -61
  122. package/tools/tests/test-profile-adopt-syncs-anchor-and-workspace.sh +0 -90
  123. package/tools/tests/test-profile-smoke-collision.sh +0 -44
  124. package/tools/tests/test-profile-smoke-invalid-claude-config.sh +0 -31
  125. package/tools/tests/test-profile-smoke-invalid-provider-pool.sh +0 -68
  126. package/tools/tests/test-profile-smoke-repo-slug-mismatch.sh +0 -36
  127. package/tools/tests/test-profile-smoke.sh +0 -45
  128. package/tools/tests/test-project-init-force-and-skip-sync.sh +0 -61
  129. package/tools/tests/test-project-init-repo-slug-mismatch.sh +0 -29
  130. package/tools/tests/test-project-init.sh +0 -66
  131. package/tools/tests/test-project-launchd-bootstrap.sh +0 -66
  132. package/tools/tests/test-project-remove.sh +0 -150
  133. package/tools/tests/test-project-runtime-supervisor.sh +0 -47
  134. package/tools/tests/test-project-runtimectl-launchd.sh +0 -115
  135. package/tools/tests/test-project-runtimectl-missing-profile.sh +0 -54
  136. package/tools/tests/test-project-runtimectl-start-falls-back-to-bootstrap.sh +0 -108
  137. package/tools/tests/test-project-runtimectl-status-reports-supervisor-as-heartbeat-parent.sh +0 -95
  138. package/tools/tests/test-project-runtimectl-status-supervisor-running.sh +0 -59
  139. package/tools/tests/test-project-runtimectl-stop-cancels-pending-kick.sh +0 -85
  140. package/tools/tests/test-project-runtimectl-stop-clears-running-labels.sh +0 -78
  141. package/tools/tests/test-project-runtimectl.sh +0 -212
  142. package/tools/tests/test-provider-cooldown-state-prefers-runtime-worker-context.sh +0 -39
  143. package/tools/tests/test-provider-cooldown-state.sh +0 -59
  144. package/tools/tests/test-public-repo-docs.sh +0 -160
  145. package/tools/tests/test-reconcile-pr-worker-acp-config-routing.sh +0 -75
  146. package/tools/tests/test-render-dashboard-snapshot.sh +0 -149
  147. package/tools/tests/test-render-flow-config-demo-profile.sh +0 -36
  148. package/tools/tests/test-render-flow-config-provider-pool-fallback.sh +0 -81
  149. package/tools/tests/test-render-flow-config.sh +0 -52
  150. package/tools/tests/test-run-codex-task-claude-routing.sh +0 -125
  151. package/tools/tests/test-run-codex-task-codex-resident-routing.sh +0 -108
  152. package/tools/tests/test-run-codex-task-kilo-routing.sh +0 -98
  153. package/tools/tests/test-run-codex-task-openclaw-resident-routing.sh +0 -117
  154. package/tools/tests/test-run-codex-task-openclaw-routing.sh +0 -113
  155. package/tools/tests/test-run-codex-task-opencode-routing.sh +0 -98
  156. package/tools/tests/test-run-codex-task-provider-pool-fallback-routing.sh +0 -146
  157. package/tools/tests/test-scaffold-profile.sh +0 -108
  158. package/tools/tests/test-serve-dashboard.sh +0 -93
  159. package/tools/tests/test-start-issue-worker-blocked-context.sh +0 -129
  160. package/tools/tests/test-start-issue-worker-blocks-complete-recurring-checklist.sh +0 -189
  161. package/tools/tests/test-start-issue-worker-local-install-routing.sh +0 -157
  162. package/tools/tests/test-start-issue-worker-profile-template-routing.sh +0 -149
  163. package/tools/tests/test-start-issue-worker-recurring-resident-reuse-codex.sh +0 -212
  164. package/tools/tests/test-start-issue-worker-recurring-resident-reuse.sh +0 -219
  165. package/tools/tests/test-start-issue-worker-renders-verification-snippet.sh +0 -155
  166. package/tools/tests/test-start-issue-worker-resident-reuse-falls-back-to-new-worktree.sh +0 -199
  167. package/tools/tests/test-start-pr-fix-worker-host-blocker-context.sh +0 -275
  168. package/tools/tests/test-start-resident-issue-loop-adopts-next-recurring-issue.sh +0 -185
  169. package/tools/tests/test-start-resident-issue-loop-clears-pending-while-waiting-due.sh +0 -152
  170. package/tools/tests/test-start-resident-issue-loop-consumes-queued-lease.sh +0 -186
  171. package/tools/tests/test-start-resident-issue-loop-fails-over-provider-pool.sh +0 -212
  172. package/tools/tests/test-start-resident-issue-loop-immediate-cycles.sh +0 -148
  173. package/tools/tests/test-start-resident-issue-loop-waits-for-provider.sh +0 -194
  174. package/tools/tests/test-start-resident-issue-loop-waits-for-terminal-reconcile-status.sh +0 -198
  175. package/tools/tests/test-start-resident-issue-loop-yields-to-live-lane-controller.sh +0 -145
  176. package/tools/tests/test-sync-pr-labels-fix-lane-uses-repair-queued.sh +0 -67
  177. package/tools/tests/test-sync-recurring-issue-checklist-backfills-workflow-complete-blocker.sh +0 -70
  178. package/tools/tests/test-sync-recurring-issue-checklist.sh +0 -95
  179. package/tools/tests/test-sync-shared-agent-home-local-source-root.sh +0 -66
  180. package/tools/tests/test-sync-shared-agent-home-preserves-unrelated-workflow-catalog-skill.sh +0 -47
  181. package/tools/tests/test-test-smoke.sh +0 -86
  182. package/tools/tests/test-uninstall-project-launchd.sh +0 -37
  183. package/tools/tests/test-update-github-labels-prefers-sibling-helper.sh +0 -49
  184. package/tools/tests/test-workflow-catalog.sh +0 -43
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SESSION_SRC="${FLOW_ROOT}/tools/bin/agent-project-run-claude-session"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- tools_dir="$tmpdir/tools"
11
- bin_dir="$tmpdir/bin"
12
- worktree="$tmpdir/worktree"
13
- runs_root="$tmpdir/runs"
14
- prompt_file="$tmpdir/prompt.md"
15
- session="acp-claude-stale-sandbox"
16
- run_dir="$runs_root/$session"
17
- sandbox_run_dir="$worktree/.openclaw-artifacts/$session"
18
-
19
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root" "$sandbox_run_dir"
20
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-claude-session"
21
-
22
- printf 'stale-result\n' >"$sandbox_run_dir/result.env"
23
- printf '{"timestamp":"old","status":"pass","command":"stale verification"}\n' >"$sandbox_run_dir/verification.jsonl"
24
- printf 'stale blocker\n' >"$sandbox_run_dir/issue-comment.md"
25
-
26
- cat >"$bin_dir/claude" <<'EOF'
27
- #!/usr/bin/env bash
28
- set -euo pipefail
29
-
30
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
31
- OUTCOME=implemented
32
- ACTION=host-publish-issue-pr
33
- RESULT
34
- printf '{"timestamp":"new","status":"pass","command":"fresh verification"}\n' >"${ACP_RUN_DIR:?}/verification.jsonl"
35
- printf 'mock claude finished\n'
36
- EOF
37
-
38
- chmod +x "$tools_dir/agent-project-run-claude-session" "$bin_dir/claude"
39
-
40
- git -C "$worktree" init -b test >/dev/null 2>&1
41
- printf 'Prompt body\n' >"$prompt_file"
42
-
43
- PATH="$bin_dir:$PATH" \
44
- bash "$tools_dir/agent-project-run-claude-session" \
45
- --mode safe \
46
- --session "$session" \
47
- --worktree "$worktree" \
48
- --prompt-file "$prompt_file" \
49
- --runs-root "$runs_root" \
50
- --adapter-id alpha \
51
- --task-kind issue \
52
- --task-id 123 \
53
- --claude-model sonnet \
54
- --claude-permission-mode dontAsk \
55
- --claude-effort high \
56
- --collect-file verification.jsonl \
57
- --collect-file issue-comment.md \
58
- >/dev/null
59
-
60
- for _ in $(seq 1 50); do
61
- if ! tmux has-session -t "$session" 2>/dev/null; then
62
- break
63
- fi
64
- sleep 0.2
65
- done
66
-
67
- if tmux has-session -t "$session" 2>/dev/null; then
68
- echo "tmux session did not exit" >&2
69
- exit 1
70
- fi
71
-
72
- test -f "$run_dir/result.env"
73
- test -f "$run_dir/verification.jsonl"
74
- grep -q '^OUTCOME=implemented$' "$run_dir/result.env"
75
- grep -q 'fresh verification' "$run_dir/verification.jsonl"
76
- if grep -q 'stale verification' "$run_dir/verification.jsonl"; then
77
- echo "stale verification entry leaked into claude cycle" >&2
78
- exit 1
79
- fi
80
- if [[ -e "$run_dir/issue-comment.md" ]]; then
81
- echo "stale claude issue comment leaked into host run dir" >&2
82
- exit 1
83
- fi
84
- if [[ -e "$sandbox_run_dir/issue-comment.md" ]]; then
85
- echo "stale claude sandbox comment artifact was not cleared" >&2
86
- exit 1
87
- fi
88
-
89
- echo "agent-project claude session wrapper clears stale sandbox artifacts test passed"
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SESSION_SRC="${FLOW_ROOT}/tools/bin/agent-project-run-claude-session"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- tools_dir="$tmpdir/tools"
11
- bin_dir="$tmpdir/bin"
12
- worktree="$tmpdir/worktree"
13
- runs_root="$tmpdir/runs"
14
- prompt_file="$tmpdir/prompt.md"
15
- session="acp-issue-claude-provider-quota"
16
- run_dir="$runs_root/$session"
17
-
18
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
19
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-claude-session"
20
-
21
- cat >"$bin_dir/claude" <<'EOF'
22
- #!/usr/bin/env bash
23
- set -euo pipefail
24
-
25
- attempt_file="${ACP_HOST_RUN_DIR:?}/attempt-count"
26
- attempt="0"
27
- if [[ -f "$attempt_file" ]]; then
28
- attempt="$(cat "$attempt_file")"
29
- fi
30
- attempt="$((attempt + 1))"
31
- printf '%s' "$attempt" >"$attempt_file"
32
-
33
- printf '429 rate limit exceeded\n' >&2
34
- exit 1
35
- EOF
36
-
37
- chmod +x "$tools_dir/agent-project-run-claude-session" "$bin_dir/claude"
38
-
39
- git -C "$worktree" init -b test >/dev/null 2>&1
40
- printf 'Prompt body\n' >"$prompt_file"
41
-
42
- PATH="$bin_dir:$PATH" \
43
- bash "$tools_dir/agent-project-run-claude-session" \
44
- --mode safe \
45
- --session "$session" \
46
- --worktree "$worktree" \
47
- --prompt-file "$prompt_file" \
48
- --runs-root "$runs_root" \
49
- --adapter-id alpha \
50
- --task-kind issue \
51
- --task-id 123 \
52
- --claude-model sonnet \
53
- --claude-permission-mode dontAsk \
54
- --claude-effort medium \
55
- --claude-timeout-seconds 10 \
56
- --claude-max-attempts 3 \
57
- --claude-retry-backoff-seconds 0 \
58
- >/dev/null
59
-
60
- for _ in $(seq 1 50); do
61
- if ! tmux has-session -t "$session" 2>/dev/null; then
62
- break
63
- fi
64
- sleep 0.2
65
- done
66
-
67
- if tmux has-session -t "$session" 2>/dev/null; then
68
- echo "tmux session did not exit" >&2
69
- exit 1
70
- fi
71
-
72
- grep -q '^RUNNER_STATE=failed$' "$run_dir/runner.env"
73
- grep -q '^ATTEMPT=1$' "$run_dir/runner.env"
74
- grep -q '^RESUME_COUNT=0$' "$run_dir/runner.env"
75
- grep -q '^1$' "$run_dir/attempt-count"
76
- if grep -q '\[claude-retry\]' "$run_dir/$session.log"; then
77
- echo "provider quota failure unexpectedly retried" >&2
78
- exit 1
79
- fi
80
- grep -q '__CLAUDE_EXIT__:1' "$run_dir/$session.log"
81
-
82
- echo "agent-project claude provider quota no-retry test passed"
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SESSION_SRC="${FLOW_ROOT}/tools/bin/agent-project-run-claude-session"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- tools_dir="$tmpdir/tools"
11
- bin_dir="$tmpdir/bin"
12
- worktree="$tmpdir/worktree"
13
- runs_root="$tmpdir/runs"
14
- prompt_file="$tmpdir/prompt.md"
15
- session="acp-issue-claude-retry"
16
- run_dir="$runs_root/$session"
17
-
18
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
19
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-claude-session"
20
-
21
- cat >"$bin_dir/claude" <<'EOF'
22
- #!/usr/bin/env bash
23
- set -euo pipefail
24
-
25
- attempt_file="${ACP_HOST_RUN_DIR:?}/attempt-count"
26
- attempt="0"
27
- if [[ -f "$attempt_file" ]]; then
28
- attempt="$(cat "$attempt_file")"
29
- fi
30
- attempt="$((attempt + 1))"
31
- printf '%s' "$attempt" >"$attempt_file"
32
-
33
- if [[ "$attempt" -eq 1 ]]; then
34
- printf 'network error: ECONNRESET\n' >&2
35
- exit 1
36
- fi
37
-
38
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
39
- OUTCOME=blocked
40
- ACTION=host-comment-blocker
41
- RESULT
42
- printf 'retry success\n'
43
- EOF
44
-
45
- chmod +x "$tools_dir/agent-project-run-claude-session" "$bin_dir/claude"
46
-
47
- git -C "$worktree" init -b test >/dev/null 2>&1
48
- printf 'Prompt body\n' >"$prompt_file"
49
-
50
- PATH="$bin_dir:$PATH" \
51
- bash "$tools_dir/agent-project-run-claude-session" \
52
- --mode safe \
53
- --session "$session" \
54
- --worktree "$worktree" \
55
- --prompt-file "$prompt_file" \
56
- --runs-root "$runs_root" \
57
- --adapter-id alpha \
58
- --task-kind issue \
59
- --task-id 123 \
60
- --claude-model sonnet \
61
- --claude-permission-mode dontAsk \
62
- --claude-effort medium \
63
- --claude-timeout-seconds 10 \
64
- --claude-max-attempts 2 \
65
- --claude-retry-backoff-seconds 0 \
66
- >/dev/null
67
-
68
- for _ in $(seq 1 50); do
69
- if ! tmux has-session -t "$session" 2>/dev/null; then
70
- break
71
- fi
72
- sleep 0.2
73
- done
74
-
75
- if tmux has-session -t "$session" 2>/dev/null; then
76
- echo "tmux session did not exit" >&2
77
- exit 1
78
- fi
79
-
80
- test -f "$run_dir/result.env"
81
- grep -q '^OUTCOME=blocked$' "$run_dir/result.env"
82
- grep -q '^ACTION=host-comment-blocker$' "$run_dir/result.env"
83
- grep -q '^2$' "$run_dir/attempt-count"
84
- grep -q '^RUNNER_STATE=completed$' "$run_dir/runner.env"
85
- grep -q '^ATTEMPT=2$' "$run_dir/runner.env"
86
- grep -q '^RESUME_COUNT=1$' "$run_dir/runner.env"
87
- grep -q '\[claude-retry\] reason=network-connection backoff=0s' "$run_dir/$session.log"
88
- grep -q '__CLAUDE_EXIT__:0' "$run_dir/$session.log"
89
-
90
- echo "agent-project claude retry wrapper test passed"
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SESSION_SRC="${FLOW_ROOT}/tools/bin/agent-project-run-claude-session"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- tools_dir="$tmpdir/tools"
11
- bin_dir="$tmpdir/bin"
12
- worktree="$tmpdir/worktree"
13
- runs_root="$tmpdir/runs"
14
- prompt_file="$tmpdir/prompt.md"
15
- session="acp-issue-claude-timeout"
16
- run_dir="$runs_root/$session"
17
-
18
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
19
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-claude-session"
20
-
21
- cat >"$bin_dir/claude" <<'EOF'
22
- #!/usr/bin/env bash
23
- set -euo pipefail
24
-
25
- sleep 2
26
- printf 'finished too late\n'
27
- EOF
28
-
29
- chmod +x "$tools_dir/agent-project-run-claude-session" "$bin_dir/claude"
30
-
31
- git -C "$worktree" init -b test >/dev/null 2>&1
32
- printf 'Prompt body\n' >"$prompt_file"
33
-
34
- PATH="$bin_dir:$PATH" \
35
- bash "$tools_dir/agent-project-run-claude-session" \
36
- --mode safe \
37
- --session "$session" \
38
- --worktree "$worktree" \
39
- --prompt-file "$prompt_file" \
40
- --runs-root "$runs_root" \
41
- --adapter-id alpha \
42
- --task-kind issue \
43
- --task-id 123 \
44
- --claude-model sonnet \
45
- --claude-permission-mode dontAsk \
46
- --claude-effort medium \
47
- --claude-timeout-seconds 1 \
48
- --claude-max-attempts 1 \
49
- --claude-retry-backoff-seconds 0 \
50
- >/dev/null
51
-
52
- for _ in $(seq 1 50); do
53
- if ! tmux has-session -t "$session" 2>/dev/null; then
54
- break
55
- fi
56
- sleep 0.2
57
- done
58
-
59
- if tmux has-session -t "$session" 2>/dev/null; then
60
- echo "tmux session did not exit" >&2
61
- exit 1
62
- fi
63
-
64
- test -f "$run_dir/result.env"
65
- grep -q '^OUTCOME=blocked$' "$run_dir/result.env"
66
- grep -q '^ACTION=host-comment-blocker$' "$run_dir/result.env"
67
- grep -q '^DETAIL=worker-exit-124$' "$run_dir/result.env"
68
- grep -q '^RUNNER_STATE=failed$' "$run_dir/runner.env"
69
- grep -q '^LAST_EXIT_CODE=124$' "$run_dir/runner.env"
70
- grep -q '^LAST_FAILURE_REASON=timeout$' "$run_dir/runner.env"
71
- grep -q '__CLAUDE_EXIT__:124' "$run_dir/$session.log"
72
-
73
- echo "agent-project claude timeout wrapper test passed"
@@ -1,103 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SESSION_SRC="${FLOW_ROOT}/tools/bin/agent-project-run-claude-session"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- tools_dir="$tmpdir/tools"
11
- bin_dir="$tmpdir/bin"
12
- worktree="$tmpdir/worktree"
13
- runs_root="$tmpdir/runs"
14
- prompt_file="$tmpdir/prompt.md"
15
- session="acp-issue-claude-wrapper"
16
- run_dir="$runs_root/$session"
17
- reconcile_log="$tmpdir/reconcile.log"
18
-
19
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
20
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-claude-session"
21
-
22
- cat >"$bin_dir/claude" <<'EOF'
23
- #!/usr/bin/env bash
24
- set -euo pipefail
25
-
26
- printf '%s\n' "$@" >"${ACP_HOST_RUN_DIR:?}/claude-args.log"
27
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
28
- OUTCOME=blocked
29
- ACTION=host-comment-blocker
30
- RESULT
31
- printf 'artifact-from-claude\n' >"${ACP_RUN_DIR:?}/mock.txt"
32
- printf 'session-env\n' >".agent-session.env"
33
- mkdir -p ".openclaw-artifacts"
34
- printf 'generated\n' >".openclaw-artifacts/generated.txt"
35
- printf 'mock claude finished\n'
36
- EOF
37
-
38
- chmod +x "$tools_dir/agent-project-run-claude-session" "$bin_dir/claude"
39
-
40
- git -C "$worktree" init -b test >/dev/null 2>&1
41
- printf 'Prompt body\n' >"$prompt_file"
42
-
43
- PATH="$bin_dir:$PATH" \
44
- bash "$tools_dir/agent-project-run-claude-session" \
45
- --mode safe \
46
- --session "$session" \
47
- --worktree "$worktree" \
48
- --prompt-file "$prompt_file" \
49
- --runs-root "$runs_root" \
50
- --adapter-id alpha \
51
- --task-kind issue \
52
- --task-id 123 \
53
- --claude-model sonnet \
54
- --claude-permission-mode dontAsk \
55
- --claude-effort high \
56
- --collect-file mock.txt \
57
- --reconcile-command "printf 'reconciled\n' >> '$reconcile_log'" \
58
- >/dev/null
59
-
60
- for _ in $(seq 1 50); do
61
- if ! tmux has-session -t "$session" 2>/dev/null; then
62
- break
63
- fi
64
- sleep 0.2
65
- done
66
-
67
- if tmux has-session -t "$session" 2>/dev/null; then
68
- echo "tmux session did not exit" >&2
69
- exit 1
70
- fi
71
-
72
- for _ in $(seq 1 25); do
73
- [[ -f "$reconcile_log" ]] && break
74
- sleep 0.2
75
- done
76
-
77
- test -f "$run_dir/result.env"
78
- test -f "$run_dir/mock.txt"
79
- grep -q '^OUTCOME=blocked$' "$run_dir/result.env"
80
- grep -q '^ACTION=host-comment-blocker$' "$run_dir/result.env"
81
- grep -q 'artifact-from-claude' "$run_dir/mock.txt"
82
- grep -q '__CLAUDE_EXIT__:0' "$run_dir/$session.log"
83
- grep -q '^reconciled$' "$reconcile_log"
84
- grep -q '^-p$' "$run_dir/claude-args.log"
85
- grep -q '^--model$' "$run_dir/claude-args.log"
86
- grep -q '^sonnet$' "$run_dir/claude-args.log"
87
- grep -q '^--permission-mode$' "$run_dir/claude-args.log"
88
- grep -q '^dontAsk$' "$run_dir/claude-args.log"
89
- grep -q '^--effort$' "$run_dir/claude-args.log"
90
- grep -q '^high$' "$run_dir/claude-args.log"
91
- grep -q '^--add-dir$' "$run_dir/claude-args.log"
92
- exclude_file="$(git -C "$worktree" config --worktree --get core.excludesFile)"
93
- test -f "$exclude_file"
94
- grep -qx '.openclaw-artifacts' "$exclude_file"
95
- grep -qx '.agent-session.env' "$exclude_file"
96
- hook_path="$(git -C "$worktree" rev-parse --git-path hooks/pre-commit)"
97
- if [[ "$hook_path" != /* ]]; then
98
- hook_path="$worktree/$hook_path"
99
- fi
100
- test -x "$hook_path"
101
- test -z "$(git -C "$worktree" status --short)"
102
-
103
- echo "agent-project claude session wrapper test passed"
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SCRIPT_SRC="${FLOW_ROOT}/tools/bin/agent-project-cleanup-session"
6
-
7
- tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/cleanup-session-orphan.XXXXXX")"
8
- cleanup() {
9
- rm -rf "$tmpdir"
10
- }
11
- trap cleanup EXIT
12
-
13
- shared_bin="$tmpdir/shared/tools/bin"
14
- runs_root="$tmpdir/runs"
15
- history_root="$tmpdir/history"
16
- repo_root="$tmpdir/repo"
17
- worktree_root="$tmpdir/worktrees"
18
- session="fl-issue-440"
19
- run_dir="$runs_root/$session"
20
- worktree_path="$worktree_root/issue-440"
21
- cleanup_log="$tmpdir/cleanup.log"
22
- output_file="$tmpdir/output.txt"
23
-
24
- mkdir -p "$shared_bin" "$run_dir" "$history_root" "$repo_root" "$worktree_path"
25
-
26
- cp "$SCRIPT_SRC" "$shared_bin/agent-project-cleanup-session"
27
- chmod +x "$shared_bin/agent-project-cleanup-session"
28
-
29
- cat >"$shared_bin/agent-cleanup-worktree" <<EOF
30
- #!/usr/bin/env bash
31
- set -euo pipefail
32
- printf '%s\n' "\$*" >>"$cleanup_log"
33
- if [[ " \$* " == *" --path "* ]]; then
34
- echo "[agent-cleanup] Branch agent/alpha/issue-440 is not associated with a dedicated worktree." >&2
35
- echo "[agent-cleanup] Refusing to trust explicit --path '$worktree_path' without a Git-resolved branch worktree." >&2
36
- exit 1
37
- fi
38
- echo "[agent-cleanup] cleanup complete"
39
- EOF
40
- chmod +x "$shared_bin/agent-cleanup-worktree"
41
-
42
- cat >"$shared_bin/agent-project-archive-run" <<'EOF'
43
- #!/usr/bin/env bash
44
- set -euo pipefail
45
- session=""
46
- while [[ $# -gt 0 ]]; do
47
- case "$1" in
48
- --session) session="${2:-}"; shift 2 ;;
49
- *) shift ;;
50
- esac
51
- done
52
- printf 'ARCHIVED_SESSION=%s\n' "$session"
53
- EOF
54
- chmod +x "$shared_bin/agent-project-archive-run"
55
-
56
- git -C "$repo_root" init >/dev/null
57
- git -C "$repo_root" checkout -b main >/dev/null
58
-
59
- cat >"$run_dir/run.env" <<EOF
60
- SESSION=$session
61
- BRANCH=agent/alpha/issue-440
62
- WORKTREE=$worktree_path
63
- RESULT_FILE=$run_dir/result.env
64
- EOF
65
-
66
- touch "$worktree_path/README.md"
67
-
68
- AGENT_PROJECT_WORKTREE_ROOT="$worktree_root" \
69
- SHARED_AGENT_HOME="$tmpdir/shared" \
70
- bash "$shared_bin/agent-project-cleanup-session" \
71
- --repo-root "$repo_root" \
72
- --runs-root "$runs_root" \
73
- --history-root "$history_root" \
74
- --session "$session" \
75
- --mode issue >"$output_file"
76
-
77
- grep -q '^SESSION=fl-issue-440$' "$output_file"
78
- grep -q '^CLEANUP_MODE=orphan-worktree$' "$output_file"
79
- grep -q '^ORPHAN_FALLBACK_USED=true$' "$output_file"
80
- grep -q '^CLEANUP_STATUS=0$' "$output_file"
81
- grep -q '^ARCHIVED_SESSION=fl-issue-440$' "$output_file"
82
-
83
- test ! -d "$worktree_path"
84
-
85
- first_call="$(sed -n '1p' "$cleanup_log")"
86
- second_call="$(sed -n '2p' "$cleanup_log")"
87
- [[ "$first_call" == *"--path $worktree_path"* ]]
88
- [[ "$second_call" != *"--path $worktree_path"* ]]
89
-
90
- echo "test-agent-project-cleanup-session-orphan-fallback: PASS"
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SCRIPT_SRC="${FLOW_ROOT}/tools/bin/agent-project-cleanup-session"
6
-
7
- tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/cleanup-session-skip.XXXXXX")"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- shared_bin="$tmpdir/shared/tools/bin"
11
- runs_root="$tmpdir/runs"
12
- history_root="$tmpdir/history"
13
- repo_root="$tmpdir/repo"
14
- worktree_path="$tmpdir/worktrees/issue-441"
15
- session="fl-issue-441"
16
- run_dir="$runs_root/$session"
17
- archive_dir="$history_root/${session}-archived"
18
- cleanup_log="$tmpdir/cleanup.log"
19
-
20
- mkdir -p "$shared_bin" "$run_dir" "$history_root" "$repo_root" "$worktree_path"
21
-
22
- cp "$SCRIPT_SRC" "$shared_bin/agent-project-cleanup-session"
23
- chmod +x "$shared_bin/agent-project-cleanup-session"
24
-
25
- cat >"$shared_bin/agent-cleanup-worktree" <<EOF
26
- #!/usr/bin/env bash
27
- set -euo pipefail
28
- printf '%s\n' "\$*" >>"$cleanup_log"
29
- exit 7
30
- EOF
31
- chmod +x "$shared_bin/agent-cleanup-worktree"
32
-
33
- cat >"$shared_bin/agent-project-archive-run" <<'EOF'
34
- #!/usr/bin/env bash
35
- set -euo pipefail
36
-
37
- runs_root=""
38
- history_root=""
39
- session=""
40
-
41
- while [[ $# -gt 0 ]]; do
42
- case "$1" in
43
- --runs-root) runs_root="${2:-}"; shift 2 ;;
44
- --history-root) history_root="${2:-}"; shift 2 ;;
45
- --session) session="${2:-}"; shift 2 ;;
46
- --remove-file) shift 2 ;;
47
- *) shift ;;
48
- esac
49
- done
50
-
51
- archive_dir="${history_root}/${session}-archived"
52
- mv "${runs_root}/${session}" "${archive_dir}"
53
- printf 'ARCHIVE_DIR=%s\n' "$archive_dir"
54
- EOF
55
- chmod +x "$shared_bin/agent-project-archive-run"
56
-
57
- git -C "$repo_root" init >/dev/null
58
- git -C "$repo_root" checkout -b main >/dev/null
59
-
60
- cat >"$run_dir/run.env" <<EOF
61
- SESSION=$session
62
- BRANCH=agent/alpha/issue-441
63
- WORKTREE=$worktree_path
64
- RESULT_FILE=$run_dir/result.env
65
- EOF
66
-
67
- printf 'artifact\n' >"$run_dir/result.env"
68
- printf 'keep me\n' >"$worktree_path/README.md"
69
-
70
- output="$(
71
- SHARED_AGENT_HOME="$tmpdir/shared" \
72
- bash "$shared_bin/agent-project-cleanup-session" \
73
- --repo-root "$repo_root" \
74
- --runs-root "$runs_root" \
75
- --history-root "$history_root" \
76
- --session "$session" \
77
- --mode issue \
78
- --skip-worktree-cleanup
79
- )"
80
-
81
- grep -q '^SESSION=fl-issue-441$' <<<"$output"
82
- grep -q '^SKIP_WORKTREE_CLEANUP=true$' <<<"$output"
83
- grep -q '^CLEANUP_MODE=archived-only$' <<<"$output"
84
- grep -q "^ARCHIVE_DIR=$archive_dir$" <<<"$output"
85
- test -d "$worktree_path"
86
- test ! -d "$run_dir"
87
- test -d "$archive_dir"
88
- test ! -s "$cleanup_log"
89
-
90
- echo "test-agent-project-cleanup-session-skip-worktree-cleanup: PASS"