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,60 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- REAL_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
6
- REAL_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
7
-
8
- tmpdir="$(mktemp -d)"
9
- trap 'rm -rf "$tmpdir"' EXIT
10
-
11
- bin_dir="$tmpdir/bin"
12
- mkdir -p "$bin_dir"
13
-
14
- cp "$REAL_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
15
- cp "$REAL_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
16
-
17
- cat >"$bin_dir/gh" <<'EOF'
18
- #!/usr/bin/env bash
19
- set -euo pipefail
20
-
21
- if [[ "${1:-}" != "api" ]]; then
22
- echo "unexpected gh invocation: $*" >&2
23
- exit 1
24
- fi
25
-
26
- route="${2:-}"
27
- shift 2 || true
28
-
29
- case "$route" in
30
- repos/example/repo/issues/42)
31
- exit 1
32
- ;;
33
- repositories/123/issues/42)
34
- printf '{"number":42,"state":"open"}\n'
35
- exit 0
36
- ;;
37
- user/repos*)
38
- echo "unexpected repo discovery route: $route" >&2
39
- exit 98
40
- ;;
41
- *)
42
- echo "unexpected gh api route: $route" >&2
43
- exit 1
44
- ;;
45
- esac
46
- EOF
47
-
48
- chmod +x "$bin_dir/flow-config-lib.sh" "$bin_dir/flow-shell-lib.sh" "$bin_dir/gh"
49
-
50
- output="$(
51
- PATH="$bin_dir:/usr/bin:/bin:/usr/sbin:/sbin" \
52
- ACP_REPO_ID="123" \
53
- ACP_REPO_SLUG="example/repo" \
54
- bash -c 'source "'"$bin_dir"'/flow-config-lib.sh"; flow_github_api_repo "example/repo" "issues/42"'
55
- )"
56
-
57
- test "$(jq -r '.number' <<<"$output")" = "42"
58
- test "$(jq -r '.state' <<<"$output")" = "open"
59
-
60
- echo "flow github api repo prefers explicit repository id test passed"
@@ -1,64 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- REAL_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
6
- REAL_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
7
-
8
- tmpdir="$(mktemp -d)"
9
- trap 'rm -rf "$tmpdir"' EXIT
10
-
11
- bin_dir="$tmpdir/bin"
12
- mkdir -p "$bin_dir"
13
-
14
- cp "$REAL_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
15
- cp "$REAL_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
16
-
17
- cat >"$bin_dir/gh" <<'EOF'
18
- #!/usr/bin/env bash
19
- set -euo pipefail
20
-
21
- if [[ "${1:-}" == "issue" && "${2:-}" == "list" ]]; then
22
- echo 'GraphQL: Could not resolve to a Repository with the name "example/demo".' >&2
23
- exit 1
24
- fi
25
-
26
- if [[ "${1:-}" == "api" ]]; then
27
- route="${2:-}"
28
- if [[ "$route" == "repos/example/demo/issues?state=open&per_page=100" ]]; then
29
- echo '{"message":"Not Found"}' >&2
30
- exit 1
31
- fi
32
- if [[ "$route" == user/repos\?* ]]; then
33
- printf '[[{"id":123,"full_name":"example/demo"}]]\n'
34
- exit 0
35
- fi
36
- if [[ "$route" == "repositories/123/issues?state=open&per_page=100" ]]; then
37
- cat <<'JSON'
38
- [[{"number":2,"created_at":"2026-03-27T10:00:00Z","updated_at":"2026-03-27T10:05:00Z","title":"Ready issue","html_url":"https://github.com/example/demo/issues/2","labels":[{"name":"agent-ready"}]},{"number":9,"created_at":"2026-03-27T10:01:00Z","updated_at":"2026-03-27T10:06:00Z","title":"PR mirror","html_url":"https://github.com/example/demo/pull/9","labels":[],"pull_request":{"url":"https://api.github.com/repos/example/demo/pulls/9"}}]]
39
- JSON
40
- exit 0
41
- fi
42
- fi
43
-
44
- echo "unexpected gh invocation: $*" >&2
45
- exit 1
46
- EOF
47
- chmod +x "$bin_dir/gh"
48
-
49
- output="$(
50
- LIB_PATH="$bin_dir/flow-config-lib.sh" \
51
- PATH="$bin_dir:/usr/bin:/bin:/usr/sbin:/sbin" \
52
- bash <<'EOF'
53
- set -euo pipefail
54
- source "$LIB_PATH"
55
- flow_github_issue_list_json "example/demo" open 100
56
- EOF
57
- )"
58
-
59
- test "$(jq 'length' <<<"$output")" -eq 1
60
- test "$(jq -r '.[0].number' <<<"$output")" = "2"
61
- test "$(jq -r '.[0].labels[0].name' <<<"$output")" = "agent-ready"
62
- test "$(jq -r '.[0].createdAt' <<<"$output")" = "2026-03-27T10:00:00Z"
63
-
64
- echo "flow github issue list falls back to repository id test passed"
@@ -1,77 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- REAL_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
6
- REAL_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
7
-
8
- tmpdir="$(mktemp -d)"
9
- trap 'rm -rf "$tmpdir"' EXIT
10
-
11
- bin_dir="$tmpdir/bin"
12
- mkdir -p "$bin_dir"
13
-
14
- cp "$REAL_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
15
- cp "$REAL_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
16
-
17
- cat >"$bin_dir/gh" <<'EOF'
18
- #!/usr/bin/env bash
19
- set -euo pipefail
20
-
21
- if [[ "${1:-}" == "pr" && "${2:-}" == "list" ]]; then
22
- echo 'GraphQL: Could not resolve to a Repository with the name "example/demo".' >&2
23
- exit 1
24
- fi
25
-
26
- if [[ "${1:-}" == "api" ]]; then
27
- route="${2:-}"
28
- if [[ "$route" == "repos/example/demo/pulls?state=open&per_page=100" ]]; then
29
- echo '{"message":"Not Found"}' >&2
30
- exit 1
31
- fi
32
- if [[ "$route" == user/repos\?* ]]; then
33
- printf '[[{"id":123,"full_name":"example/demo"}]]\n'
34
- exit 0
35
- fi
36
- if [[ "$route" == "repositories/123/pulls?state=open&per_page=100" ]]; then
37
- cat <<'JSON'
38
- [[{"number":8,"title":"Agent PR","body":"Closes #2","html_url":"https://github.com/example/demo/pull/8","head":{"ref":"agent/demo/issue-2-test"},"created_at":"2026-03-27T10:00:00Z","draft":false}]]
39
- JSON
40
- exit 0
41
- fi
42
- if [[ "$route" == "repositories/123/issues/8" ]]; then
43
- cat <<'JSON'
44
- {"number":8,"labels":[{"name":"agent-handoff"}]}
45
- JSON
46
- exit 0
47
- fi
48
- if [[ "$route" == "repositories/123/issues/8/comments?per_page=100" ]]; then
49
- cat <<'JSON'
50
- [[{"body":"## PR final review blocker\n\nblocked","created_at":"2026-03-27T10:02:00Z","updated_at":"2026-03-27T10:02:00Z","html_url":"https://github.com/example/demo/pull/8#issuecomment-1"}]]
51
- JSON
52
- exit 0
53
- fi
54
- fi
55
-
56
- echo "unexpected gh invocation: $*" >&2
57
- exit 1
58
- EOF
59
- chmod +x "$bin_dir/gh"
60
-
61
- output="$(
62
- LIB_PATH="$bin_dir/flow-config-lib.sh" \
63
- PATH="$bin_dir:/usr/bin:/bin:/usr/sbin:/sbin" \
64
- bash <<'EOF'
65
- set -euo pipefail
66
- source "$LIB_PATH"
67
- flow_github_pr_list_json "example/demo" open 100
68
- EOF
69
- )"
70
-
71
- test "$(jq 'length' <<<"$output")" -eq 1
72
- test "$(jq -r '.[0].number' <<<"$output")" = "8"
73
- test "$(jq -r '.[0].headRefName' <<<"$output")" = "agent/demo/issue-2-test"
74
- test "$(jq -r '.[0].labels[0].name' <<<"$output")" = "agent-handoff"
75
- grep -q '## PR final review blocker' <<<"$(jq -r '.[0].comments[0].body' <<<"$output")"
76
-
77
- echo "flow github pr list falls back to repository id test passed"
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- REAL_RESIDENT_LIB="${FLOW_ROOT}/tools/bin/flow-resident-worker-lib.sh"
6
- REAL_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
7
- REAL_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
8
-
9
- tmpdir="$(mktemp -d)"
10
- trap 'rm -rf "$tmpdir"' EXIT
11
-
12
- bin_dir="$tmpdir/bin"
13
- worktree="$tmpdir/worktree"
14
- metadata_file="$tmpdir/metadata.env"
15
-
16
- mkdir -p "$bin_dir" "$worktree/.git"
17
- cp "$REAL_RESIDENT_LIB" "$bin_dir/flow-resident-worker-lib.sh"
18
- cp "$REAL_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
19
- cp "$REAL_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
20
-
21
- cat >"$metadata_file" <<EOF
22
- ISSUE_ID=1
23
- WORKTREE=$worktree
24
- TASK_COUNT=1
25
- LAST_STARTED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
26
- EOF
27
-
28
- TEST_RESULT="$(
29
- LIB_PATH="$bin_dir/flow-resident-worker-lib.sh" \
30
- METADATA_FILE="$metadata_file" \
31
- bash <<'EOF'
32
- set -euo pipefail
33
- source "$LIB_PATH"
34
- ISSUE_ID="2"
35
- WORKTREE="/tmp/current-worktree"
36
- TASK_COUNT="9"
37
- if flow_resident_issue_can_reuse "$METADATA_FILE" 12 86400; then
38
- :
39
- else
40
- exit 1
41
- fi
42
- printf 'ISSUE_ID=%s\n' "$ISSUE_ID"
43
- printf 'WORKTREE=%s\n' "$WORKTREE"
44
- printf 'TASK_COUNT=%s\n' "$TASK_COUNT"
45
- EOF
46
- )"
47
-
48
- grep -q '^ISSUE_ID=2$' <<<"$TEST_RESULT"
49
- grep -q '^WORKTREE=/tmp/current-worktree$' <<<"$TEST_RESULT"
50
- grep -q '^TASK_COUNT=9$' <<<"$TEST_RESULT"
51
-
52
- echo "flow resident can reuse does not leak metadata test passed"
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- FLOW_LIB="${FLOW_ROOT}/tools/bin/flow-resident-worker-lib.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- profile_registry_root="$tmpdir/profiles"
11
- profile_dir="$profile_registry_root/demo"
12
- state_root="$tmpdir/runtime/demo/state"
13
- controller_dir="$state_root/resident-workers/issues/101"
14
- pending_dir="$state_root/pending-launches"
15
-
16
- mkdir -p "$profile_dir" "$controller_dir" "$pending_dir"
17
-
18
- cat >"$profile_dir/control-plane.yaml" <<EOF
19
- schema_version: "1"
20
- id: "demo"
21
- repo:
22
- slug: "example/demo"
23
- root: "$tmpdir/repo"
24
- default_branch: "main"
25
- runtime:
26
- orchestrator_agent_root: "$tmpdir/runtime/demo"
27
- worktree_root: "$tmpdir/worktrees"
28
- agent_repo_root: "$tmpdir/repo"
29
- runs_root: "$tmpdir/runtime/demo/runs"
30
- state_root: "$state_root"
31
- history_root: "$tmpdir/runtime/demo/history"
32
- retained_repo_root: "$tmpdir/repo"
33
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
34
- execution:
35
- coding_worker: "openclaw"
36
- openclaw:
37
- model: "primary/model"
38
- thinking: "adaptive"
39
- timeout_seconds: 900
40
- EOF
41
-
42
- printf '%s\n' "$$" >"$pending_dir/issue-101.pid"
43
- cat >"$controller_dir/controller.env" <<EOF
44
- ISSUE_ID=101
45
- CONTROLLER_PID=$$
46
- CONTROLLER_STATE=waiting-due
47
- ACTIVE_RESIDENT_WORKER_KEY=issue-lane-recurring-general-openclaw-safe
48
- EOF
49
-
50
- output="$(
51
- ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
52
- ACP_PROJECT_ID=demo \
53
- bash -lc '
54
- source "'"$FLOW_LIB"'"
55
- flow_resident_issue_reap_stale_state
56
- '
57
- )"
58
-
59
- grep -q '^1$' <<<"$output"
60
- test ! -f "$controller_dir/controller.env"
61
- test ! -f "$pending_dir/issue-101.pid"
62
-
63
- echo "flow resident reap stale controllers test passed"
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- LIB_PATH="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- flow_root="$tmpdir/flow-root"
11
- shared_home="$tmpdir/shared-home"
12
- custom_bin="$tmpdir/custom-codex-quota"
13
- custom_script="$tmpdir/custom-auto-switch.sh"
14
-
15
- mkdir -p \
16
- "$flow_root/tools/bin" \
17
- "$flow_root/tools/vendor/codex-quota-manager/scripts" \
18
- "$shared_home/tools/bin" \
19
- "$shared_home/tools/vendor/codex-quota-manager/scripts" \
20
- "$shared_home/skills/openclaw/codex-quota-manager/scripts"
21
-
22
- cat >"$flow_root/tools/bin/codex-quota" <<'EOF'
23
- #!/usr/bin/env bash
24
- set -euo pipefail
25
- exit 0
26
- EOF
27
-
28
- cat >"$flow_root/tools/vendor/codex-quota-manager/scripts/auto-switch.sh" <<'EOF'
29
- #!/usr/bin/env bash
30
- set -euo pipefail
31
- exit 0
32
- EOF
33
-
34
- cat >"$shared_home/tools/bin/codex-quota" <<'EOF'
35
- #!/usr/bin/env bash
36
- set -euo pipefail
37
- exit 0
38
- EOF
39
-
40
- cat >"$shared_home/tools/vendor/codex-quota-manager/scripts/auto-switch.sh" <<'EOF'
41
- #!/usr/bin/env bash
42
- set -euo pipefail
43
- exit 0
44
- EOF
45
-
46
- cat >"$shared_home/skills/openclaw/codex-quota-manager/scripts/auto-switch.sh" <<'EOF'
47
- #!/usr/bin/env bash
48
- set -euo pipefail
49
- exit 0
50
- EOF
51
-
52
- cat >"$custom_bin" <<'EOF'
53
- #!/usr/bin/env bash
54
- set -euo pipefail
55
- exit 0
56
- EOF
57
-
58
- cat >"$custom_script" <<'EOF'
59
- #!/usr/bin/env bash
60
- set -euo pipefail
61
- exit 0
62
- EOF
63
-
64
- chmod +x \
65
- "$flow_root/tools/bin/codex-quota" \
66
- "$flow_root/tools/vendor/codex-quota-manager/scripts/auto-switch.sh" \
67
- "$shared_home/tools/bin/codex-quota" \
68
- "$shared_home/tools/vendor/codex-quota-manager/scripts/auto-switch.sh" \
69
- "$shared_home/skills/openclaw/codex-quota-manager/scripts/auto-switch.sh" \
70
- "$custom_bin" \
71
- "$custom_script"
72
-
73
- (
74
- export ACP_ROOT="$flow_root"
75
- export SHARED_AGENT_HOME="$shared_home"
76
- # shellcheck source=/dev/null
77
- source "$LIB_PATH"
78
- test "$(flow_resolve_codex_quota_bin "$flow_root")" = "$flow_root/tools/bin/codex-quota"
79
- test "$(flow_resolve_codex_quota_manager_script "$flow_root")" = "$flow_root/tools/vendor/codex-quota-manager/scripts/auto-switch.sh"
80
- )
81
-
82
- rm -f "$flow_root/tools/bin/codex-quota" "$flow_root/tools/vendor/codex-quota-manager/scripts/auto-switch.sh"
83
-
84
- (
85
- export ACP_ROOT="$flow_root"
86
- export SHARED_AGENT_HOME="$shared_home"
87
- # shellcheck source=/dev/null
88
- source "$LIB_PATH"
89
- test "$(flow_resolve_codex_quota_bin "$flow_root")" = "$shared_home/tools/bin/codex-quota"
90
- test "$(flow_resolve_codex_quota_manager_script "$flow_root")" = "$shared_home/tools/vendor/codex-quota-manager/scripts/auto-switch.sh"
91
- )
92
-
93
- (
94
- export ACP_ROOT="$flow_root"
95
- export SHARED_AGENT_HOME="$shared_home"
96
- export ACP_CODEX_QUOTA_BIN="$custom_bin"
97
- export ACP_CODEX_QUOTA_MANAGER_SCRIPT="$custom_script"
98
- # shellcheck source=/dev/null
99
- source "$LIB_PATH"
100
- test "$(flow_resolve_codex_quota_bin "$flow_root")" = "$custom_bin"
101
- test "$(flow_resolve_codex_quota_manager_script "$flow_root")" = "$custom_script"
102
- )
103
-
104
- echo "flow codex quota resolver test passed"
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SCRIPT="${FLOW_ROOT}/tools/bin/flow-runtime-doctor.sh"
6
- SCAFFOLD_SCRIPT="${FLOW_ROOT}/tools/bin/scaffold-profile.sh"
7
-
8
- tmpdir="$(mktemp -d)"
9
- trap 'rm -rf "$tmpdir"' EXIT
10
-
11
- profile_home="$tmpdir/profiles"
12
- repo_slug="example-owner/alpha"
13
-
14
- bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id alpha --repo-slug "$repo_slug" >/dev/null
15
- bash "$SCAFFOLD_SCRIPT" --profile-home "$profile_home" --profile-id demo --repo-slug example/demo-platform >/dev/null
16
- profile_notes_real="$(cd "$profile_home/alpha" && pwd -P)/README.md"
17
-
18
- output="$(ACP_PROFILE_REGISTRY_ROOT="$profile_home" bash "$SCRIPT")"
19
-
20
- grep -q '^PROFILE_ID=alpha$' <<<"$output"
21
- grep -q '^PROFILE_SELECTION_MODE=implicit-default$' <<<"$output"
22
- grep -q "^PROFILE_REGISTRY_ROOT=${profile_home}$" <<<"$output"
23
- grep -q "^PROFILE_NOTES=${profile_notes_real}$" <<<"$output"
24
- grep -q '^PROFILE_NOTES_EXISTS=yes$' <<<"$output"
25
- grep -q '^PROFILE_SELECTION_NEXT_STEP=ACP_PROJECT_ID=<id> bash .*/tools/bin/render-flow-config.sh$' <<<"$output"
26
-
27
- echo "flow runtime doctor profile selection test passed"
@@ -1,79 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- HOOKS_FILE="${FLOW_ROOT}/hooks/heartbeat-hooks.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- node_bin_dir="$(dirname "$(command -v node)")"
11
- bin_dir="$tmpdir/bin"
12
- tools_dir="$tmpdir/tools/bin"
13
-
14
- mkdir -p "$bin_dir" "$tools_dir"
15
-
16
- cat >"$bin_dir/gh" <<'EOF'
17
- #!/usr/bin/env bash
18
- set -euo pipefail
19
-
20
- if [[ "${1:-}" == "pr" && "${2:-}" == "list" ]]; then
21
- cat <<'JSON'
22
- [
23
- {"number":501,"createdAt":"2026-03-15T10:00:00Z","headRefName":"agent/acp/issue-501-slice","labels":[],"comments":[]}
24
- ]
25
- JSON
26
- exit 0
27
- fi
28
-
29
- if [[ "${1:-}" == "issue" && "${2:-}" == "list" ]]; then
30
- cat <<'JSON'
31
- [
32
- {"number":501,"createdAt":"2026-03-15T10:00:00Z","labels":[]},
33
- {"number":502,"createdAt":"2026-03-15T10:01:00Z","labels":[]}
34
- ]
35
- JSON
36
- exit 0
37
- fi
38
-
39
- echo "unexpected gh args: $*" >&2
40
- exit 1
41
- EOF
42
-
43
- cat >"$tools_dir/retry-state.sh" <<'EOF'
44
- #!/usr/bin/env bash
45
- set -euo pipefail
46
- cat <<'OUT'
47
- KIND=issue
48
- ITEM_ID=0
49
- ATTEMPTS=0
50
- NEXT_ATTEMPT_EPOCH=0
51
- NEXT_ATTEMPT_AT=
52
- READY=yes
53
- LAST_REASON=
54
- UPDATED_AT=
55
- OUT
56
- EOF
57
-
58
- chmod +x "$bin_dir/gh" "$tools_dir/retry-state.sh"
59
-
60
- export PATH="$bin_dir:$node_bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"
61
- export F_LOSNING_REPO_SLUG="example/repo"
62
- export ACP_MANAGED_PR_BRANCH_GLOBS="agent/acp/* codex/* openclaw/*"
63
-
64
- # shellcheck source=/dev/null
65
- source "$HOOKS_FILE"
66
- FLOW_TOOLS_DIR="$tools_dir"
67
- REPO_SLUG="example/repo"
68
-
69
- open_agent_pr_issue_ids="$(heartbeat_open_agent_pr_issue_ids)"
70
- ready_issue_ids="$(heartbeat_list_ready_issue_ids)"
71
-
72
- grep -q '"501"' <<<"$open_agent_pr_issue_ids"
73
- grep -q '^502$' <<<"$ready_issue_ids"
74
- if grep -q '^501$' <<<"$ready_issue_ids"; then
75
- echo "issue linked by codex PR branch unexpectedly remained ready" >&2
76
- exit 1
77
- fi
78
-
79
- echo "heartbeat codex PR linked issue exclusion test passed"
@@ -1,115 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- REAL_HOOKS="${FLOW_ROOT}/hooks/heartbeat-hooks.sh"
6
- REAL_CONFIG_LIB="${FLOW_ROOT}/tools/bin/flow-config-lib.sh"
7
- REAL_SHELL_LIB="${FLOW_ROOT}/tools/bin/flow-shell-lib.sh"
8
- REAL_RESIDENT_LIB="${FLOW_ROOT}/tools/bin/flow-resident-worker-lib.sh"
9
-
10
- tmpdir="$(mktemp -d)"
11
- cleanup() {
12
- if [[ -n "${controller_pid:-}" ]]; then
13
- kill "${controller_pid}" >/dev/null 2>&1 || true
14
- wait "${controller_pid}" >/dev/null 2>&1 || true
15
- fi
16
- rm -rf "$tmpdir"
17
- }
18
- trap cleanup EXIT
19
-
20
- skill_root="$tmpdir/skill"
21
- hooks_dir="$skill_root/hooks"
22
- bin_dir="$skill_root/tools/bin"
23
- assets_dir="$skill_root/assets"
24
- profile_registry_root="$tmpdir/profile-registry"
25
- profile_dir="$profile_registry_root/demo"
26
- shim_dir="$tmpdir/shim"
27
- capture_file="$tmpdir/capture.log"
28
- state_root="$tmpdir/agent/state"
29
-
30
- mkdir -p "$hooks_dir" "$bin_dir" "$assets_dir" "$profile_dir" "$shim_dir" "$state_root/resident-workers/issues/440"
31
- cp "$REAL_HOOKS" "$hooks_dir/heartbeat-hooks.sh"
32
- cp "$REAL_CONFIG_LIB" "$bin_dir/flow-config-lib.sh"
33
- cp "$REAL_SHELL_LIB" "$bin_dir/flow-shell-lib.sh"
34
- cp "$REAL_RESIDENT_LIB" "$bin_dir/flow-resident-worker-lib.sh"
35
- printf '{}\n' >"$assets_dir/workflow-catalog.json"
36
-
37
- cat >"$profile_dir/control-plane.yaml" <<EOF
38
- schema_version: "1"
39
- id: "demo"
40
- repo:
41
- slug: "example/demo"
42
- root: "$tmpdir/repo"
43
- default_branch: "main"
44
- runtime:
45
- orchestrator_agent_root: "$tmpdir/agent"
46
- worktree_root: "$tmpdir/worktrees"
47
- agent_repo_root: "$tmpdir/repo"
48
- runs_root: "$tmpdir/agent/runs"
49
- state_root: "$state_root"
50
- retained_repo_root: "$tmpdir/repo"
51
- vscode_workspace_file: "$tmpdir/demo.code-workspace"
52
- execution:
53
- coding_worker: "openclaw"
54
- resident_workers:
55
- issue_reuse_enabled: true
56
- session_naming:
57
- issue_prefix: "demo-issue-"
58
- pr_prefix: "demo-pr-"
59
- issue_branch_prefix: "agent/demo/issue"
60
- pr_worktree_branch_prefix: "agent/demo/pr"
61
- EOF
62
-
63
- cat >"$shim_dir/gh" <<'EOF'
64
- #!/usr/bin/env bash
65
- set -euo pipefail
66
-
67
- if [[ "${1:-}" == "issue" && "${2:-}" == "view" ]]; then
68
- issue_id="${3:-0}"
69
- cat <<JSON
70
- {"number":${issue_id},"title":"Resident issue ${issue_id}","body":"Keep going.","url":"https://example.test/issues/${issue_id}","labels":[{"name":"agent-keep-open"}],"comments":[]}
71
- JSON
72
- exit 0
73
- fi
74
-
75
- if [[ "${1:-}" == "pr" && "${2:-}" == "list" ]]; then
76
- printf '[]\n'
77
- exit 0
78
- fi
79
-
80
- exit 64
81
- EOF
82
- chmod +x "$shim_dir/gh"
83
-
84
- cat >"$bin_dir/agent-project-detached-launch" <<'EOF'
85
- #!/usr/bin/env bash
86
- set -euo pipefail
87
- printf '%s\n' "$*" >"${TEST_CAPTURE_FILE:?}"
88
- printf 'LAUNCH_MODE=detached\n'
89
- EOF
90
- chmod +x "$bin_dir/agent-project-detached-launch"
91
-
92
- (sleep 30) &
93
- controller_pid="$!"
94
- cat >"$state_root/resident-workers/issues/440/controller.env" <<EOF
95
- ISSUE_ID=440
96
- CONTROLLER_PID=${controller_pid}
97
- CONTROLLER_STATE=idle
98
- EOF
99
-
100
- PATH="$shim_dir:$PATH" \
101
- ACP_PROJECT_ID="demo" \
102
- ACP_PROFILE_REGISTRY_ROOT="$profile_registry_root" \
103
- TEST_CAPTURE_FILE="$capture_file" \
104
- bash -c '
105
- set -euo pipefail
106
- source "'"$hooks_dir"'/heartbeat-hooks.sh"
107
- heartbeat_start_issue_worker 441 >/dev/null
108
- '
109
-
110
- test ! -f "$capture_file"
111
- queue_file="$state_root/resident-workers/issue-queue/pending/issue-441.env"
112
- test -f "$queue_file"
113
- grep -q '^ISSUE_ID=441$' "$queue_file"
114
-
115
- echo "heartbeat hooks enqueue resident issue for idle controller test passed"