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,135 +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-openclaw-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="resident-version-reset"
16
- run_dir="$runs_root/$session"
17
- operation_log="$tmpdir/openclaw.log"
18
- attempt_file="$tmpdir/attempts"
19
- resident_agent_dir="$tmpdir/resident/openclaw-agent"
20
-
21
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
22
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-openclaw-session"
23
-
24
- cat >"$bin_dir/openclaw" <<'EOF'
25
- #!/usr/bin/env bash
26
- set -euo pipefail
27
-
28
- op_log="${ACP_TEST_OP_LOG:?}"
29
- attempt_file="${ACP_TEST_ATTEMPT_FILE:?}"
30
- cmd="${1:-}"
31
- sub="${2:-}"
32
-
33
- case "$cmd:$sub" in
34
- agents:list)
35
- shift 2 || true
36
- printf 'agents:list\n' >>"$op_log"
37
- if [[ -f "${ACP_RESIDENT_OPENCLAW_AGENT_DIR}/created" ]]; then
38
- printf '{"agents":[{"id":"resident-agent"}]}\n'
39
- else
40
- printf '{"agents":[]}\n'
41
- fi
42
- ;;
43
- agents:add)
44
- shift 2 || true
45
- agent_id="${1:-}"
46
- printf 'agents:add:%s\n' "$agent_id" >>"$op_log"
47
- mkdir -p "${ACP_RESIDENT_OPENCLAW_AGENT_DIR}"
48
- : >"${ACP_RESIDENT_OPENCLAW_AGENT_DIR}/created"
49
- printf '{"agentId":"%s"}\n' "$agent_id"
50
- ;;
51
- agents:delete)
52
- shift 2 || true
53
- printf 'agents:delete\n' >>"$op_log"
54
- rm -f "${ACP_RESIDENT_OPENCLAW_AGENT_DIR}/created"
55
- printf '{"deleted":true}\n'
56
- ;;
57
- agent:*)
58
- current_attempt=0
59
- if [[ -f "$attempt_file" ]]; then
60
- current_attempt="$(cat "$attempt_file")"
61
- fi
62
- current_attempt=$((current_attempt + 1))
63
- printf '%s\n' "$current_attempt" >"$attempt_file"
64
- printf 'agent:run:%s\n' "$current_attempt" >>"$op_log"
65
- if [[ "$current_attempt" == "1" ]]; then
66
- printf 'Config was last written by a newer OpenClaw (2026.3.23-2); current version is 2026.3.12.\n' >&2
67
- exit 1
68
- fi
69
- mkdir -p "${ACP_RUN_DIR:?}"
70
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
71
- OUTCOME=implemented
72
- ACTION=host-publish-issue-pr
73
- RESULT
74
- printf '{"status":"pass","command":"mock verification"}\n' >"${ACP_RUN_DIR}/verification.jsonl"
75
- printf '{"payloads":[{"text":"DONE"}]}\n'
76
- ;;
77
- *)
78
- echo "unexpected openclaw args: $cmd $sub $*" >&2
79
- exit 64
80
- ;;
81
- esac
82
- EOF
83
-
84
- chmod +x "$tools_dir/agent-project-run-openclaw-session" "$bin_dir/openclaw"
85
-
86
- git -C "$worktree" init -b test >/dev/null 2>&1
87
- git -C "$worktree" config user.name "OpenClaw"
88
- git -C "$worktree" config user.email "openclaw@example.com"
89
- printf 'seed\n' >"$worktree/README.md"
90
- git -C "$worktree" add README.md
91
- git -C "$worktree" commit -m "init" >/dev/null 2>&1
92
- printf 'Prompt body\n' >"$prompt_file"
93
-
94
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
95
- bash "$tools_dir/agent-project-run-openclaw-session" \
96
- --mode safe \
97
- --session "$session" \
98
- --worktree "$worktree" \
99
- --prompt-file "$prompt_file" \
100
- --runs-root "$runs_root" \
101
- --adapter-id alpha \
102
- --task-kind issue \
103
- --task-id 123 \
104
- --keep-agent \
105
- --openclaw-agent-id resident-agent \
106
- --openclaw-session-id resident-session \
107
- --openclaw-agent-dir "$resident_agent_dir" \
108
- --openclaw-state-dir "$tmpdir/resident/openclaw-state" \
109
- --openclaw-config-path "$tmpdir/resident/openclaw-config/openclaw.json" \
110
- --openclaw-model mock/model \
111
- --context "TEST_OP_LOG=$operation_log" \
112
- --context "TEST_ATTEMPT_FILE=$attempt_file" \
113
- --context "RESIDENT_OPENCLAW_AGENT_DIR=$resident_agent_dir" \
114
- >/dev/null
115
-
116
- for _ in $(seq 1 50); do
117
- if ! tmux has-session -t "$session" 2>/dev/null; then
118
- break
119
- fi
120
- sleep 0.2
121
- done
122
-
123
- if tmux has-session -t "$session" 2>/dev/null; then
124
- echo "tmux session did not exit" >&2
125
- exit 1
126
- fi
127
-
128
- test -f "$run_dir/result.env"
129
- grep -q '^OUTCOME=implemented$' "$run_dir/result.env"
130
- grep -q '^ACTION=host-publish-issue-pr$' "$run_dir/result.env"
131
- grep -q '^agents:add:resident-agent$' "$operation_log"
132
- [[ "$(grep -c '^agents:add:resident-agent$' "$operation_log" || true)" == "2" ]]
133
- [[ "$(grep -c '^agent:run:' "$operation_log" || true)" == "2" ]]
134
-
135
- echo "agent-project openclaw session wrapper recovers version mismatch test passed"
@@ -1,179 +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-openclaw-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_one="$tmpdir/worktree-one"
13
- worktree_two="$tmpdir/worktree-two"
14
- runs_root="$tmpdir/runs"
15
- prompt_file="$tmpdir/prompt.md"
16
- session="resident-issue-openclaw"
17
- run_dir="$runs_root/$session"
18
- operation_log="$tmpdir/openclaw.log"
19
- state_file="$tmpdir/agent-present"
20
- config_path="$tmpdir/resident/openclaw-config/openclaw.json"
21
-
22
- mkdir -p "$tools_dir" "$bin_dir" "$worktree_one" "$worktree_two" "$runs_root"
23
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-openclaw-session"
24
-
25
- cat >"$bin_dir/openclaw" <<'EOF'
26
- #!/usr/bin/env bash
27
- set -euo pipefail
28
-
29
- op_log="${ACP_TEST_OP_LOG:?}"
30
- state_file="${ACP_TEST_STATE_FILE:?}"
31
- cmd="${1:-}"
32
- sub="${2:-}"
33
-
34
- case "$cmd:$sub" in
35
- agents:list)
36
- shift 2 || true
37
- printf 'agents:list\n' >>"$op_log"
38
- if [[ -f "$state_file" ]]; then
39
- printf '{"agents":[{"id":"resident-agent"}]}\n'
40
- else
41
- printf '{"agents":[]}\n'
42
- fi
43
- ;;
44
- agents:add)
45
- shift 2 || true
46
- agent_id="${1:-}"
47
- printf 'agents:add:%s\n' "$agent_id" >>"$op_log"
48
- : >"$state_file"
49
- mkdir -p .openclaw
50
- printf 'state\n' >.openclaw/workspace-state.json
51
- : >SOUL.md
52
- : >TOOLS.md
53
- : >IDENTITY.md
54
- : >USER.md
55
- : >HEARTBEAT.md
56
- : >BOOTSTRAP.md
57
- printf '{"agentId":"%s"}\n' "$agent_id"
58
- ;;
59
- agents:delete)
60
- shift 2 || true
61
- agent_id="${1:-}"
62
- printf 'agents:delete:%s\n' "$agent_id" >>"$op_log"
63
- rm -f "$state_file"
64
- printf '{"deleted":true}\n'
65
- ;;
66
- agent:*)
67
- shift 1 || true
68
- agent_id=""
69
- session_id=""
70
- while [[ $# -gt 0 ]]; do
71
- case "$1" in
72
- --agent) agent_id="${2:-}"; shift 2 ;;
73
- --session-id) session_id="${2:-}"; shift 2 ;;
74
- *) shift ;;
75
- esac
76
- done
77
- printf 'agent:run:%s:%s\n' "$agent_id" "$session_id" >>"$op_log"
78
- mkdir -p "${ACP_RUN_DIR:?}"
79
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
80
- OUTCOME=implemented
81
- ACTION=host-publish-issue-pr
82
- RESULT
83
- printf 'artifact-from-openclaw\n' >"${ACP_RUN_DIR}/mock.txt"
84
- printf '{"status":"pass","command":"mock verification"}\n' >"${ACP_RUN_DIR}/verification.jsonl"
85
- printf '{"payloads":[{"text":"DONE"}]}\n'
86
- ;;
87
- *)
88
- echo "unexpected openclaw args: $cmd $sub $*" >&2
89
- exit 64
90
- ;;
91
- esac
92
- EOF
93
-
94
- chmod +x "$tools_dir/agent-project-run-openclaw-session" "$bin_dir/openclaw"
95
-
96
- for worktree in "$worktree_one" "$worktree_two"; do
97
- git -C "$worktree" init -b test >/dev/null 2>&1
98
- git -C "$worktree" config user.name "OpenClaw"
99
- git -C "$worktree" config user.email "openclaw@example.com"
100
- printf 'seed\n' >"$worktree/README.md"
101
- git -C "$worktree" add README.md
102
- git -C "$worktree" commit -m "init" >/dev/null 2>&1
103
- done
104
- printf 'Prompt body\n' >"$prompt_file"
105
-
106
- run_wrapper() {
107
- local worktree="${1:?worktree required}"
108
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
109
- bash "$tools_dir/agent-project-run-openclaw-session" \
110
- --mode safe \
111
- --session "$session" \
112
- --worktree "$worktree" \
113
- --prompt-file "$prompt_file" \
114
- --runs-root "$runs_root" \
115
- --adapter-id alpha \
116
- --task-kind issue \
117
- --task-id 123 \
118
- --keep-agent \
119
- --openclaw-agent-id resident-agent \
120
- --openclaw-session-id resident-session \
121
- --openclaw-agent-dir "$tmpdir/resident/openclaw-agent" \
122
- --openclaw-state-dir "$tmpdir/resident/openclaw-state" \
123
- --openclaw-config-path "$config_path" \
124
- --openclaw-model mock/model \
125
- --context "TEST_OP_LOG=$operation_log" \
126
- --context "TEST_STATE_FILE=$state_file" \
127
- --collect-file mock.txt \
128
- >/dev/null
129
-
130
- for _ in $(seq 1 50); do
131
- if ! tmux has-session -t "$session" 2>/dev/null; then
132
- break
133
- fi
134
- sleep 0.2
135
- done
136
-
137
- if tmux has-session -t "$session" 2>/dev/null; then
138
- echo "tmux session did not exit" >&2
139
- exit 1
140
- fi
141
- }
142
-
143
- run_wrapper "$worktree_one"
144
- run_wrapper "$worktree_two"
145
-
146
- test -f "$run_dir/result.env"
147
- test -f "$run_dir/mock.txt"
148
- grep -q '^OUTCOME=implemented$' "$run_dir/result.env"
149
- grep -q '^ACTION=host-publish-issue-pr$' "$run_dir/result.env"
150
- grep -q '^OPENCLAW_KEEP_AGENT=true$' "$run_dir/run.env"
151
- test -f "$config_path"
152
- python3 - "$config_path" "$worktree_two" "$tmpdir/resident/openclaw-agent" <<'PY'
153
- import json
154
- import sys
155
-
156
- config_path, expected_workspace, expected_agent_dir = sys.argv[1:4]
157
- with open(config_path, "r", encoding="utf-8") as handle:
158
- payload = json.load(handle)
159
- agents = payload.get("agents", {}).get("list", [])
160
- resident = next((agent for agent in agents if agent.get("id") == "resident-agent"), None)
161
- if resident is None:
162
- raise SystemExit(1)
163
- if resident.get("workspace") != expected_workspace:
164
- raise SystemExit(1)
165
- if resident.get("agentDir") != expected_agent_dir:
166
- raise SystemExit(1)
167
- if resident.get("model") != "mock/model":
168
- raise SystemExit(1)
169
- PY
170
-
171
- add_count="$(grep -c '^agents:add:resident-agent$' "$operation_log" || true)"
172
- run_count="$(grep -c '^agent:run:resident-agent:resident-session$' "$operation_log" || true)"
173
- delete_count="$(grep -c '^agents:delete:resident-agent$' "$operation_log" || true)"
174
-
175
- [[ "$add_count" == "1" ]]
176
- [[ "$run_count" == "2" ]]
177
- [[ "$delete_count" == "0" ]]
178
-
179
- echo "agent-project openclaw resident session wrapper test passed"
@@ -1,119 +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-openclaw-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="resident-add-race"
16
- run_dir="$runs_root/$session"
17
- operation_log="$tmpdir/openclaw.log"
18
-
19
- mkdir -p "$tools_dir" "$bin_dir" "$worktree" "$runs_root"
20
- cp "$SESSION_SRC" "$tools_dir/agent-project-run-openclaw-session"
21
-
22
- cat >"$bin_dir/openclaw" <<'EOF'
23
- #!/usr/bin/env bash
24
- set -euo pipefail
25
-
26
- op_log="${ACP_TEST_OP_LOG:?}"
27
- cmd="${1:-}"
28
- sub="${2:-}"
29
-
30
- case "$cmd:$sub" in
31
- agents:list)
32
- shift 2 || true
33
- printf 'agents:list\n' >>"$op_log"
34
- printf '{"agents":[]}\n'
35
- ;;
36
- agents:add)
37
- shift 2 || true
38
- agent_id="${1:-}"
39
- printf 'agents:add:%s\n' "$agent_id" >>"$op_log"
40
- printf 'Agent "%s" already exists.\n' "$agent_id" >&2
41
- exit 1
42
- ;;
43
- agent:*)
44
- shift 1 || true
45
- agent_id=""
46
- session_id=""
47
- while [[ $# -gt 0 ]]; do
48
- case "$1" in
49
- --agent) agent_id="${2:-}"; shift 2 ;;
50
- --session-id) session_id="${2:-}"; shift 2 ;;
51
- *) shift ;;
52
- esac
53
- done
54
- printf 'agent:run:%s:%s\n' "$agent_id" "$session_id" >>"$op_log"
55
- mkdir -p "${ACP_RUN_DIR:?}"
56
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
57
- OUTCOME=implemented
58
- ACTION=host-publish-issue-pr
59
- RESULT
60
- printf '{"status":"pass","command":"mock verification"}\n' >"${ACP_RUN_DIR}/verification.jsonl"
61
- printf '{"payloads":[{"text":"DONE"}]}\n'
62
- ;;
63
- *)
64
- echo "unexpected openclaw args: $cmd $sub $*" >&2
65
- exit 64
66
- ;;
67
- esac
68
- EOF
69
-
70
- chmod +x "$tools_dir/agent-project-run-openclaw-session" "$bin_dir/openclaw"
71
-
72
- git -C "$worktree" init -b test >/dev/null 2>&1
73
- git -C "$worktree" config user.name "OpenClaw"
74
- git -C "$worktree" config user.email "openclaw@example.com"
75
- printf 'seed\n' >"$worktree/README.md"
76
- git -C "$worktree" add README.md
77
- git -C "$worktree" commit -m "init" >/dev/null 2>&1
78
- printf 'Prompt body\n' >"$prompt_file"
79
-
80
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
81
- bash "$tools_dir/agent-project-run-openclaw-session" \
82
- --mode safe \
83
- --session "$session" \
84
- --worktree "$worktree" \
85
- --prompt-file "$prompt_file" \
86
- --runs-root "$runs_root" \
87
- --adapter-id alpha \
88
- --task-kind issue \
89
- --task-id 123 \
90
- --keep-agent \
91
- --openclaw-agent-id resident-agent \
92
- --openclaw-session-id resident-session \
93
- --openclaw-agent-dir "$tmpdir/resident/openclaw-agent" \
94
- --openclaw-state-dir "$tmpdir/resident/openclaw-state" \
95
- --openclaw-config-path "$tmpdir/resident/openclaw-config/openclaw.json" \
96
- --openclaw-model mock/model \
97
- --context "TEST_OP_LOG=$operation_log" \
98
- >/dev/null
99
-
100
- for _ in $(seq 1 50); do
101
- if ! tmux has-session -t "$session" 2>/dev/null; then
102
- break
103
- fi
104
- sleep 0.2
105
- done
106
-
107
- if tmux has-session -t "$session" 2>/dev/null; then
108
- echo "tmux session did not exit" >&2
109
- exit 1
110
- fi
111
-
112
- test -f "$run_dir/result.env"
113
- grep -q '^OUTCOME=implemented$' "$run_dir/result.env"
114
- grep -q '^ACTION=host-publish-issue-pr$' "$run_dir/result.env"
115
- grep -q 'reusing existing agent after add race' "$run_dir/$session.log"
116
- [[ "$(grep -c '^agents:add:resident-agent$' "$operation_log" || true)" == "1" ]]
117
- [[ "$(grep -c '^agent:run:resident-agent:resident-session$' "$operation_log" || true)" == "1" ]]
118
-
119
- echo "agent-project openclaw session wrapper reuses existing agent after add race test passed"
@@ -1,91 +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-openclaw-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="openclaw-rate-limit-hang"
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-openclaw-session"
20
-
21
- cat >"$bin_dir/openclaw" <<'EOF'
22
- #!/usr/bin/env bash
23
- set -euo pipefail
24
-
25
- cmd="${1:-}"
26
- sub="${2:-}"
27
-
28
- case "$cmd:$sub" in
29
- agents:list)
30
- printf '{"agents":[]}\n'
31
- ;;
32
- agents:add)
33
- shift 2 || true
34
- printf '{"agentId":"%s"}\n' "${1:-agent}"
35
- ;;
36
- agent:*)
37
- printf '429 Provider returned error stepfun/step-3.5-flash:free is temporarily rate-limited upstream.\n' >&2
38
- trap 'exit 1' TERM INT
39
- while true; do
40
- sleep 1
41
- done
42
- ;;
43
- *)
44
- echo "unexpected openclaw args: $cmd $sub $*" >&2
45
- exit 64
46
- ;;
47
- esac
48
- EOF
49
-
50
- chmod +x "$tools_dir/agent-project-run-openclaw-session" "$bin_dir/openclaw"
51
-
52
- git -C "$worktree" init -b test >/dev/null 2>&1
53
- git -C "$worktree" config user.name "OpenClaw"
54
- git -C "$worktree" config user.email "openclaw@example.com"
55
- printf 'seed\n' >"$worktree/README.md"
56
- git -C "$worktree" add README.md
57
- git -C "$worktree" commit -m "init" >/dev/null 2>&1
58
- printf 'Prompt body\n' >"$prompt_file"
59
-
60
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
61
- bash "$tools_dir/agent-project-run-openclaw-session" \
62
- --mode safe \
63
- --session "$session" \
64
- --worktree "$worktree" \
65
- --prompt-file "$prompt_file" \
66
- --runs-root "$runs_root" \
67
- --adapter-id alpha \
68
- --task-kind issue \
69
- --task-id 123 \
70
- --openclaw-model mock/model \
71
- --openclaw-timeout-seconds 30 \
72
- >/dev/null
73
-
74
- for _ in $(seq 1 50); do
75
- if ! tmux has-session -t "$session" 2>/dev/null; then
76
- break
77
- fi
78
- sleep 0.2
79
- done
80
-
81
- if tmux has-session -t "$session" 2>/dev/null; then
82
- echo "tmux session did not exit after rate limit hang" >&2
83
- exit 1
84
- fi
85
-
86
- test -f "$run_dir/runner.env"
87
- grep -q '^RUNNER_STATE=failed$' "$run_dir/runner.env"
88
- grep -q '^LAST_FAILURE_REASON=provider-quota-limit$' "$run_dir/runner.env"
89
- grep -q 'rate-limited upstream' "$run_dir/$session.log"
90
-
91
- echo "agent-project openclaw session wrapper terminates rate limit hang test passed"
@@ -1,117 +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-openclaw-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="fl-issue-openclaw-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-openclaw-session"
21
-
22
- cat >"$bin_dir/openclaw" <<'EOF'
23
- #!/usr/bin/env bash
24
- set -euo pipefail
25
-
26
- cmd="${1:-}"
27
- sub="${2:-}"
28
- case "$cmd:$sub" in
29
- agents:add)
30
- mkdir -p .openclaw
31
- printf 'state\n' >.openclaw/workspace-state.json
32
- : >SOUL.md
33
- : >TOOLS.md
34
- : >IDENTITY.md
35
- : >USER.md
36
- : >HEARTBEAT.md
37
- : >BOOTSTRAP.md
38
- printf '{"agentId":"stub"}\n'
39
- ;;
40
- agent:*)
41
- mkdir -p "${ACP_RUN_DIR:?}"
42
- cat >"${ACP_RESULT_FILE:?}" <<'RESULT'
43
- OUTCOME=implemented
44
- ACTION=host-publish-issue-pr
45
- RESULT
46
- printf 'artifact-from-openclaw\n' >"${ACP_RUN_DIR}/mock.txt"
47
- printf '{"status":"pass","command":"mock verification"}\n' >"${ACP_RUN_DIR}/verification.jsonl"
48
- printf '{"payloads":[{"text":"DONE"}]}\n'
49
- ;;
50
- *)
51
- echo "unexpected openclaw args: $*" >&2
52
- exit 64
53
- ;;
54
- esac
55
- EOF
56
-
57
- chmod +x "$tools_dir/agent-project-run-openclaw-session" "$bin_dir/openclaw"
58
-
59
- git -C "$worktree" init -b test >/dev/null 2>&1
60
- git -C "$worktree" config user.name "OpenClaw"
61
- git -C "$worktree" config user.email "openclaw@example.com"
62
- printf 'seed\n' >"$worktree/README.md"
63
- git -C "$worktree" add README.md
64
- git -C "$worktree" commit -m "init" >/dev/null 2>&1
65
- printf 'Prompt body\n' >"$prompt_file"
66
-
67
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
68
- bash "$tools_dir/agent-project-run-openclaw-session" \
69
- --mode safe \
70
- --session "$session" \
71
- --worktree "$worktree" \
72
- --prompt-file "$prompt_file" \
73
- --runs-root "$runs_root" \
74
- --adapter-id alpha \
75
- --task-kind issue \
76
- --task-id 123 \
77
- --openclaw-model mock/model \
78
- --collect-file mock.txt \
79
- --reconcile-command "printf 'reconciled\n' >> '$reconcile_log'" \
80
- >/dev/null
81
-
82
- for _ in $(seq 1 50); do
83
- if ! tmux has-session -t "$session" 2>/dev/null; then
84
- break
85
- fi
86
- sleep 0.2
87
- done
88
-
89
- if tmux has-session -t "$session" 2>/dev/null; then
90
- echo "tmux session did not exit" >&2
91
- exit 1
92
- fi
93
-
94
- for _ in $(seq 1 25); do
95
- [[ -f "$reconcile_log" ]] && break
96
- sleep 0.2
97
- done
98
-
99
- test -f "$run_dir/result.env"
100
- test -f "$run_dir/mock.txt"
101
- grep -q '^OUTCOME=implemented$' "$run_dir/result.env"
102
- grep -q '^ACTION=host-publish-issue-pr$' "$run_dir/result.env"
103
- grep -q 'artifact-from-openclaw' "$run_dir/mock.txt"
104
- grep -q '__CODEX_EXIT__:0' "$run_dir/$session.log"
105
- grep -q '^reconciled$' "$reconcile_log"
106
- grep -q '^FINAL_HEAD=' "$run_dir/run.env"
107
- grep -q '^FINAL_BRANCH=test$' "$run_dir/run.env"
108
- grep -q "^FINAL_HEAD=$(git -C "$worktree" rev-parse HEAD)$" "$run_dir/run.env"
109
-
110
- status_output="$(git -C "$worktree" status --short)"
111
- if [[ -n "$status_output" ]]; then
112
- echo "worktree unexpectedly dirty:" >&2
113
- printf '%s\n' "$status_output" >&2
114
- exit 1
115
- fi
116
-
117
- echo "agent-project openclaw session wrapper test passed"