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,125 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- GUARD_SCRIPT="${FLOW_ROOT}/tools/bin/branch-verification-guard.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- origin_repo="$tmpdir/origin.git"
11
- repo_root="$tmpdir/repo-root"
12
- run_dir="$tmpdir/run"
13
-
14
- mkdir -p "$run_dir"
15
-
16
- git init --bare "$origin_repo" >/dev/null 2>&1
17
- git clone "$origin_repo" "$repo_root" >/dev/null 2>&1
18
-
19
- mkdir -p \
20
- "$repo_root/apps/api/src/modules/auth" \
21
- "$repo_root/apps/web/e2e/archive/auth" \
22
- "$repo_root/apps/web/src/app/(auth)/login"
23
-
24
- cat >"$repo_root/apps/api/src/modules/auth/auth.service.ts" <<'EOF'
25
- export const loginFailureMode = 'legacy';
26
- EOF
27
-
28
- cat >"$repo_root/apps/api/src/modules/auth/auth.service.extended.spec.ts" <<'EOF'
29
- describe('auth service', () => {
30
- it('handles login failures', () => {
31
- expect(true).toBe(true)
32
- })
33
- })
34
- EOF
35
-
36
- cat >"$repo_root/apps/web/src/app/(auth)/login/page.tsx" <<'EOF'
37
- export default function LoginPage() {
38
- return null
39
- }
40
- EOF
41
-
42
- cat >"$repo_root/apps/web/src/app/(auth)/login/page.spec.tsx" <<'EOF'
43
- describe('login page', () => {
44
- it('renders', () => {
45
- expect(true).toBe(true)
46
- })
47
- })
48
- EOF
49
-
50
- cat >"$repo_root/apps/web/e2e/archive/auth/tenant-isolation-login.spec.ts" <<'EOF'
51
- test('tenant isolation login', async () => {
52
- expect(true).toBeTruthy()
53
- })
54
- EOF
55
-
56
- git -C "$repo_root" add .
57
- git -C "$repo_root" -c user.name=Test -c user.email=test@example.com commit -m "init" >/dev/null
58
- git -C "$repo_root" branch -M main >/dev/null 2>&1
59
- git -C "$repo_root" push origin main >/dev/null 2>&1
60
-
61
- git -C "$repo_root" checkout -b openclaw/pr-coverage >/dev/null 2>&1
62
-
63
- cat >"$repo_root/apps/api/src/modules/auth/auth.service.ts" <<'EOF'
64
- export const loginFailureMode = 'generic-invalid-credentials';
65
- EOF
66
-
67
- cat >"$repo_root/apps/api/src/modules/auth/auth.service.extended.spec.ts" <<'EOF'
68
- describe('auth service', () => {
69
- it('normalizes tenant login failures', () => {
70
- expect(true).toBe(true)
71
- })
72
- })
73
- EOF
74
-
75
- cat >"$repo_root/apps/web/src/app/(auth)/login/page.tsx" <<'EOF'
76
- export default function LoginPage() {
77
- return 'Invalid credentials'
78
- }
79
- EOF
80
-
81
- cat >"$repo_root/apps/web/src/app/(auth)/login/page.spec.tsx" <<'EOF'
82
- describe('login page', () => {
83
- it('shows the generic invalid credentials message', () => {
84
- expect(true).toBe(true)
85
- })
86
- })
87
- EOF
88
-
89
- cat >"$repo_root/apps/web/e2e/archive/auth/tenant-isolation-login.spec.ts" <<'EOF'
90
- test('tenant isolation login hides tenant existence', async () => {
91
- expect(true).toBeTruthy()
92
- })
93
- EOF
94
-
95
- cat >"$run_dir/verification.jsonl" <<'EOF'
96
- {"status":"pass","command":"pnpm --filter api typecheck"}
97
- {"status":"pass","command":"pnpm --filter api test -- --testPathPatterns=\"auth.service.extended\""}
98
- {"status":"pass","command":"pnpm --filter web test -- login/page.spec"}
99
- EOF
100
-
101
- set +e
102
- guard_output="$("$GUARD_SCRIPT" --worktree "$repo_root" --base-ref origin/main --run-dir "$run_dir" 2>&1)"
103
- guard_status=$?
104
- set -e
105
-
106
- test "$guard_status" = "43"
107
- grep -q 'changed test files were not covered by a targeted test command' <<<"$guard_output"
108
- grep -q 'Changed test files still missing explicit coverage:' <<<"$guard_output"
109
- grep -q 'apps/web/e2e/archive/auth/tenant-isolation-login.spec.ts' <<<"$guard_output"
110
- if grep -q 'apps/api/src/modules/auth/auth.service.extended.spec.ts | accepted anchors' <<<"$guard_output"; then
111
- echo "API spec should have been recognized as covered by auth.service.extended test command" >&2
112
- exit 1
113
- fi
114
- if grep -q 'apps/web/src/app/(auth)/login/page.spec.tsx | accepted anchors' <<<"$guard_output"; then
115
- echo "web page spec should have been recognized as covered by login/page.spec test command" >&2
116
- exit 1
117
- fi
118
-
119
- cat >>"$run_dir/verification.jsonl" <<'EOF'
120
- {"status":"pass","command":"pnpm exec playwright test apps/web/e2e/archive/auth/tenant-isolation-login.spec.ts"}
121
- EOF
122
-
123
- "$GUARD_SCRIPT" --worktree "$repo_root" --base-ref origin/main --run-dir "$run_dir" >/dev/null
124
-
125
- echo "branch verification guard targeted coverage test passed"
@@ -1,178 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- SOURCE_SCRIPT="${FLOW_ROOT}/tools/vendor/codex-quota-manager/scripts/auto-switch.sh"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- bin_dir="$tmpdir/bin"
11
- cache_dir="$tmpdir/cache"
12
- state_file="$cache_dir/rotation-state.json"
13
- switch_state_file="$cache_dir/last-switch.env"
14
- switch_log="$tmpdir/switch.log"
15
- home_dir="$tmpdir/home"
16
-
17
- mkdir -p "$bin_dir" "$cache_dir" "$home_dir"
18
-
19
- cat >"$bin_dir/codex-quota" <<'EOF'
20
- #!/usr/bin/env bash
21
- set -euo pipefail
22
-
23
- scenario="${MOCK_QUOTA_SCENARIO:?}"
24
- fixture_dir="${MOCK_QUOTA_FIXTURE_DIR:?}"
25
- switch_log="${MOCK_QUOTA_SWITCH_LOG:?}"
26
-
27
- case "${1:-}:${2:-}:${3:-}" in
28
- codex:list:--json)
29
- cat "${fixture_dir}/${scenario}/list.json"
30
- ;;
31
- codex:quota:*)
32
- label="${3:-}"
33
- if [[ -f "${fixture_dir}/${scenario}/quota-${label}.err" ]]; then
34
- cat "${fixture_dir}/${scenario}/quota-${label}.err" >&2
35
- exit 1
36
- fi
37
- cat "${fixture_dir}/${scenario}/quota-${label}.json"
38
- ;;
39
- codex:switch:*)
40
- label="${3:-}"
41
- printf '%s\n' "$label" >>"$switch_log"
42
- if [[ -f "${fixture_dir}/${scenario}/switch-${label}.err" ]]; then
43
- cat "${fixture_dir}/${scenario}/switch-${label}.err" >&2
44
- exit 1
45
- fi
46
- printf 'Switched to %s.\n' "$label"
47
- ;;
48
- *)
49
- echo "unexpected codex-quota invocation: $*" >&2
50
- exit 1
51
- ;;
52
- esac
53
- EOF
54
-
55
- chmod +x "$bin_dir/codex-quota"
56
-
57
- fixture_dir="$tmpdir/fixtures"
58
- mkdir -p "$fixture_dir/usage-switch" "$fixture_dir/deferred" "$fixture_dir/auth-401"
59
-
60
- cat >"$fixture_dir/usage-switch/list.json" <<'EOF'
61
- {"activeInfo":{"trackedLabel":"current-a"},"accounts":[{"label":"current-a","isActive":true},{"label":"next-b"},{"label":"next-c"}]}
62
- EOF
63
- cat >"$fixture_dir/usage-switch/quota-current-a.json" <<'EOF'
64
- [{"label":"current-a","usage":{"rate_limit":{"allowed":false,"limit_reached":true,"primary_window":{"used_percent":92,"reset_at":4102444800},"secondary_window":{"used_percent":65,"reset_at":4102444800}}}}]
65
- EOF
66
- cat >"$fixture_dir/usage-switch/quota-next-b.json" <<'EOF'
67
- [{"label":"next-b","usage":{"rate_limit":{"allowed":false,"limit_reached":true,"primary_window":{"used_percent":81,"reset_at":4102441200},"secondary_window":{"used_percent":20,"reset_at":4102441200}}}}]
68
- EOF
69
- cat >"$fixture_dir/usage-switch/quota-next-c.json" <<'EOF'
70
- [{"label":"next-c","usage":{"rate_limit":{"allowed":true,"limit_reached":false,"primary_window":{"used_percent":12,"reset_at":4102437600},"secondary_window":{"used_percent":18,"reset_at":4102448400}}}}]
71
- EOF
72
-
73
- cat >"$fixture_dir/deferred/list.json" <<'EOF'
74
- {"activeInfo":{"trackedLabel":"current-a"},"accounts":[{"label":"current-a","isActive":true},{"label":"next-b"}]}
75
- EOF
76
- cat >"$fixture_dir/deferred/quota-current-a.json" <<'EOF'
77
- [{"label":"current-a","usage":{"rate_limit":{"allowed":false,"limit_reached":true,"primary_window":{"used_percent":91,"reset_at":4102444800},"secondary_window":{"used_percent":30,"reset_at":4102444800}}}}]
78
- EOF
79
- cat >"$fixture_dir/deferred/quota-next-b.json" <<'EOF'
80
- [{"label":"next-b","usage":{"rate_limit":{"allowed":false,"limit_reached":true,"primary_window":{"used_percent":88,"reset_at":4102441200},"secondary_window":{"used_percent":21,"reset_at":4102441200}}}}]
81
- EOF
82
-
83
- cat >"$fixture_dir/auth-401/list.json" <<'EOF'
84
- {"activeInfo":{"trackedLabel":"bad-auth"},"accounts":[{"label":"bad-auth","isActive":true},{"label":"good-next"}]}
85
- EOF
86
- cat >"$fixture_dir/auth-401/quota-good-next.json" <<'EOF'
87
- [{"label":"good-next","usage":{"rate_limit":{"allowed":true,"limit_reached":false,"primary_window":{"used_percent":15,"reset_at":4102437600},"secondary_window":{"used_percent":19,"reset_at":4102448400}}}}]
88
- EOF
89
-
90
- run_usage_switch_case() {
91
- rm -f "$state_file" "$switch_state_file" "$switch_log"
92
-
93
- output="$(
94
- HOME="$home_dir" \
95
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
96
- CODEX_QUOTA_BIN="$bin_dir/codex-quota" \
97
- MOCK_QUOTA_SCENARIO="usage-switch" \
98
- MOCK_QUOTA_FIXTURE_DIR="$fixture_dir" \
99
- MOCK_QUOTA_SWITCH_LOG="$switch_log" \
100
- CODEX_QUOTA_MANAGER_STATE_FILE="$state_file" \
101
- CODEX_QUOTA_MANAGER_SWITCH_STATE_FILE="$switch_state_file" \
102
- bash "$SOURCE_SCRIPT" \
103
- --trigger-reason usage-limit \
104
- --current-label current-a \
105
- --five-hour-threshold 70 \
106
- --weekly-threshold 90
107
- )"
108
-
109
- grep -q '^SELECTED_LABEL=next-c$' <<<"$output"
110
- grep -q '^SWITCH_DECISION=switched$' <<<"$output"
111
- test "$(tail -n 1 "$switch_log")" = "next-c"
112
- test "$(jq -r '.accounts["current-a"].next_retry_at' "$state_file")" = "4102444800"
113
- test "$(jq -r '.accounts["next-b"].next_retry_at' "$state_file")" = "4102441200"
114
- test "$(jq -r '.accounts["next-c"].removed // false' "$state_file")" = "false"
115
- }
116
-
117
- run_deferred_case() {
118
- rm -f "$state_file" "$switch_state_file" "$switch_log"
119
-
120
- set +e
121
- output="$(
122
- HOME="$home_dir" \
123
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
124
- CODEX_QUOTA_BIN="$bin_dir/codex-quota" \
125
- MOCK_QUOTA_SCENARIO="deferred" \
126
- MOCK_QUOTA_FIXTURE_DIR="$fixture_dir" \
127
- MOCK_QUOTA_SWITCH_LOG="$switch_log" \
128
- CODEX_QUOTA_MANAGER_STATE_FILE="$state_file" \
129
- CODEX_QUOTA_MANAGER_SWITCH_STATE_FILE="$switch_state_file" \
130
- bash "$SOURCE_SCRIPT" \
131
- --trigger-reason usage-limit \
132
- --current-label current-a \
133
- --five-hour-threshold 70 \
134
- --weekly-threshold 90
135
- )"
136
- status=$?
137
- set -e
138
-
139
- test "$status" = "10"
140
- grep -q '^SWITCH_DECISION=deferred$' <<<"$output"
141
- grep -q '^NEXT_RETRY_AT=4102441200$' <<<"$output"
142
- grep -q '^NEXT_RETRY_LABEL=next-b$' <<<"$output"
143
- test "$(jq -r '.accounts["current-a"].next_retry_at' "$state_file")" = "4102444800"
144
- test "$(jq -r '.accounts["next-b"].next_retry_at' "$state_file")" = "4102441200"
145
- }
146
-
147
- run_auth_401_case() {
148
- rm -f "$state_file" "$switch_state_file" "$switch_log"
149
-
150
- output="$(
151
- HOME="$home_dir" \
152
- PATH="$bin_dir:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" \
153
- CODEX_QUOTA_BIN="$bin_dir/codex-quota" \
154
- MOCK_QUOTA_SCENARIO="auth-401" \
155
- MOCK_QUOTA_FIXTURE_DIR="$fixture_dir" \
156
- MOCK_QUOTA_SWITCH_LOG="$switch_log" \
157
- CODEX_QUOTA_MANAGER_STATE_FILE="$state_file" \
158
- CODEX_QUOTA_MANAGER_SWITCH_STATE_FILE="$switch_state_file" \
159
- bash "$SOURCE_SCRIPT" \
160
- --trigger-reason auth-401 \
161
- --current-label bad-auth \
162
- --five-hour-threshold 70 \
163
- --weekly-threshold 90
164
- )"
165
-
166
- grep -q '^REMOVED_LABEL=bad-auth$' <<<"$output"
167
- grep -q '^REMOVED_REASON=auth-401$' <<<"$output"
168
- grep -q '^SELECTED_LABEL=good-next$' <<<"$output"
169
- grep -q '^SWITCH_DECISION=switched$' <<<"$output"
170
- test "$(tail -n 1 "$switch_log")" = "good-next"
171
- test "$(jq -r '.accounts["bad-auth"].removed' "$state_file")" = "true"
172
- }
173
-
174
- run_usage_switch_case
175
- run_deferred_case
176
- run_auth_401_case
177
-
178
- echo "codex quota manager failure-driven rotation test passed"
@@ -1,37 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- FLOW_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
5
- WRAPPER="${FLOW_ROOT}/tools/bin/codex-quota"
6
-
7
- tmpdir="$(mktemp -d)"
8
- trap 'rm -rf "$tmpdir"' EXIT
9
-
10
- bin_dir="$tmpdir/bin"
11
- log_file="$tmpdir/node-args.log"
12
- expected_entry="${FLOW_ROOT}/tools/vendor/codex-quota/codex-quota.js"
13
-
14
- mkdir -p "$bin_dir"
15
-
16
- cat >"$bin_dir/node" <<'EOF'
17
- #!/usr/bin/env bash
18
- set -euo pipefail
19
- printf '%s\n' "$@" >"${LOG_FILE:?}"
20
- EOF
21
-
22
- chmod +x "$bin_dir/node"
23
-
24
- LOG_FILE="$log_file" \
25
- ACP_CODEX_QUOTA_NODE_BIN="$bin_dir/node" \
26
- bash "$WRAPPER" codex list --json
27
-
28
- actual_entry="$(
29
- python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(sed -n '1p' "$log_file")"
30
- )"
31
-
32
- test "$actual_entry" = "$expected_entry"
33
- test "$(sed -n '2p' "$log_file")" = "codex"
34
- test "$(sed -n '3p' "$log_file")" = "list"
35
- test "$(sed -n '4p' "$log_file")" = "--json"
36
-
37
- echo "codex quota wrapper test passed"
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
-
4
- ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
5
-
6
- test -f "$ROOT_DIR/CONTRIBUTING.md"
7
- test -f "$ROOT_DIR/CLA.md"
8
- test -f "$ROOT_DIR/.github/pull_request_template.md"
9
-
10
- grep -q 'This CLA is a license grant, not a copyright assignment\.' "$ROOT_DIR/CLA.md"
11
- grep -q 'You retain copyright in your contribution\.' "$ROOT_DIR/CLA.md"
12
- grep -q 'relicense the contribution' "$ROOT_DIR/CLA.md"
13
- grep -q 'The PR template includes a checkbox for this\.' "$ROOT_DIR/CONTRIBUTING.md"
14
- grep -q 'sponsorships do not automatically create payment obligations to contributors' "$ROOT_DIR/CONTRIBUTING.md"
15
- grep -q 'sponsorship does not transfer ownership, copyright, patent rights, or control' "$ROOT_DIR/README.md"
16
- grep -q '\[CLA.md\](\./CLA.md)' "$ROOT_DIR/README.md"
17
-
18
- echo "contribution docs test passed"