agent-control-plane 0.1.2 → 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 (179) hide show
  1. package/README.md +6 -0
  2. package/npm/bin/agent-control-plane.js +149 -5
  3. package/package.json +1 -2
  4. package/tools/tests/test-agent-control-plane-npm-cli.sh +0 -280
  5. package/tools/tests/test-agent-github-update-labels-falls-back-to-repository-id.sh +0 -56
  6. package/tools/tests/test-agent-project-claude-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -89
  7. package/tools/tests/test-agent-project-claude-session-wrapper-does-not-retry-provider-quota.sh +0 -82
  8. package/tools/tests/test-agent-project-claude-session-wrapper-retries-transient-failures.sh +0 -90
  9. package/tools/tests/test-agent-project-claude-session-wrapper-times-out.sh +0 -73
  10. package/tools/tests/test-agent-project-claude-session-wrapper.sh +0 -103
  11. package/tools/tests/test-agent-project-cleanup-session-orphan-fallback.sh +0 -90
  12. package/tools/tests/test-agent-project-cleanup-session-skip-worktree-cleanup.sh +0 -90
  13. package/tools/tests/test-agent-project-codex-live-thread-persist.sh +0 -76
  14. package/tools/tests/test-agent-project-codex-recovery.sh +0 -731
  15. package/tools/tests/test-agent-project-codex-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -105
  16. package/tools/tests/test-agent-project-codex-session-wrapper.sh +0 -97
  17. package/tools/tests/test-agent-project-open-pr-worktree-config-prefix.sh +0 -81
  18. package/tools/tests/test-agent-project-openclaw-session-wrapper-clears-stale-sandbox-artifacts.sh +0 -109
  19. package/tools/tests/test-agent-project-openclaw-session-wrapper-infers-blocked-result-contract.sh +0 -89
  20. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-literal-env-artifacts.sh +0 -113
  21. package/tools/tests/test-agent-project-openclaw-session-wrapper-recovers-version-mismatch.sh +0 -135
  22. package/tools/tests/test-agent-project-openclaw-session-wrapper-resident.sh +0 -179
  23. package/tools/tests/test-agent-project-openclaw-session-wrapper-reuses-existing-agent-after-add-race.sh +0 -119
  24. package/tools/tests/test-agent-project-openclaw-session-wrapper-terminates-rate-limit-hang.sh +0 -91
  25. package/tools/tests/test-agent-project-openclaw-session-wrapper.sh +0 -117
  26. package/tools/tests/test-agent-project-publish-issue-pr-prunes-stale-worktree-entry.sh +0 -148
  27. package/tools/tests/test-agent-project-publish-issue-pr-reads-archived-session.sh +0 -146
  28. package/tools/tests/test-agent-project-publish-issue-pr-recovers-final-head.sh +0 -145
  29. package/tools/tests/test-agent-project-publish-issue-pr-reuses-existing-worktree.sh +0 -147
  30. package/tools/tests/test-agent-project-reconcile-failure-reason.sh +0 -456
  31. package/tools/tests/test-agent-project-reconcile-issue-archived-session-fallback.sh +0 -96
  32. package/tools/tests/test-agent-project-reconcile-issue-before-blocked.sh +0 -90
  33. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery-uses-recovered-worktree.sh +0 -212
  34. package/tools/tests/test-agent-project-reconcile-issue-host-verification-recovery.sh +0 -207
  35. package/tools/tests/test-agent-project-reconcile-issue-provider-quota-schedules-provider-cooldown.sh +0 -101
  36. package/tools/tests/test-agent-project-reconcile-issue-session-backfills-lane-metadata-from-worker-key.sh +0 -113
  37. package/tools/tests/test-agent-project-reconcile-issue-session-clears-stale-failed-summary.sh +0 -117
  38. package/tools/tests/test-agent-project-reconcile-issue-session-initializes-shared-agent-home.sh +0 -55
  39. package/tools/tests/test-agent-project-reconcile-issue-session-normalizes-runner-state.sh +0 -125
  40. package/tools/tests/test-agent-project-reconcile-issue-session-records-invalid-contract-summary.sh +0 -118
  41. package/tools/tests/test-agent-project-reconcile-issue-session-skips-duplicate-blocked-comment.sh +0 -144
  42. package/tools/tests/test-agent-project-reconcile-issue-session-standardizes-no-commits-blocker.sh +0 -145
  43. package/tools/tests/test-agent-project-reconcile-issue-session-synthesizes-blocked-comment.sh +0 -139
  44. package/tools/tests/test-agent-project-reconcile-pr-blocked-host-recovery.sh +0 -242
  45. package/tools/tests/test-agent-project-reconcile-pr-guard-blocked-no-commit.sh +0 -142
  46. package/tools/tests/test-agent-project-reconcile-pr-provider-quota-schedules-provider-cooldown.sh +0 -106
  47. package/tools/tests/test-agent-project-reconcile-pr-session-initializes-shared-agent-home.sh +0 -66
  48. package/tools/tests/test-agent-project-reconcile-pr-updated-branch-noop.sh +0 -129
  49. package/tools/tests/test-audit-agent-worktrees-active-launch-skips-git-inspection.sh +0 -69
  50. package/tools/tests/test-audit-agent-worktrees-broken-worktree.sh +0 -43
  51. package/tools/tests/test-audit-agent-worktrees-pending-launch-owner.sh +0 -46
  52. package/tools/tests/test-audit-agent-worktrees-unreconciled-owner.sh +0 -79
  53. package/tools/tests/test-audit-issue-routing-managed-branch-globs.sh +0 -56
  54. package/tools/tests/test-branch-verification-guard-generated-artifacts.sh +0 -72
  55. package/tools/tests/test-branch-verification-guard-targeted-coverage.sh +0 -125
  56. package/tools/tests/test-codex-quota-manager-failure-driven-rotation.sh +0 -178
  57. package/tools/tests/test-codex-quota-wrapper.sh +0 -37
  58. package/tools/tests/test-contribution-docs.sh +0 -18
  59. package/tools/tests/test-control-plane-dashboard-runtime-smoke.sh +0 -343
  60. package/tools/tests/test-create-follow-up-issue.sh +0 -73
  61. package/tools/tests/test-dashboard-launchd-bootstrap.sh +0 -55
  62. package/tools/tests/test-flow-export-execution-env-exports-repo-id.sh +0 -30
  63. package/tools/tests/test-flow-export-github-cli-auth-env-prefers-git-credential.sh +0 -48
  64. package/tools/tests/test-flow-github-api-repo-fallback-preserves-input.sh +0 -85
  65. package/tools/tests/test-flow-github-api-repo-prefers-explicit-repository-id.sh +0 -60
  66. package/tools/tests/test-flow-github-issue-list-falls-back-to-repository-id.sh +0 -64
  67. package/tools/tests/test-flow-github-pr-list-falls-back-to-repository-id.sh +0 -77
  68. package/tools/tests/test-flow-resident-can-reuse-does-not-leak-metadata.sh +0 -52
  69. package/tools/tests/test-flow-resident-reap-stale-controllers.sh +0 -63
  70. package/tools/tests/test-flow-resolve-codex-quota-tools.sh +0 -104
  71. package/tools/tests/test-flow-runtime-doctor-profile-selection.sh +0 -27
  72. package/tools/tests/test-heartbeat-codex-pr-linked-issue-exclusion.sh +0 -79
  73. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-idle-controller.sh +0 -115
  74. package/tools/tests/test-heartbeat-hooks-enqueue-resident-issue-for-live-lane-controller.sh +0 -117
  75. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-claude.sh +0 -96
  76. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop-codex.sh +0 -96
  77. package/tools/tests/test-heartbeat-hooks-start-resident-issue-loop.sh +0 -96
  78. package/tools/tests/test-heartbeat-loop-auth-wait-does-not-consume-capacity.sh +0 -170
  79. package/tools/tests/test-heartbeat-loop-blocked-recovery-lane.sh +0 -201
  80. package/tools/tests/test-heartbeat-loop-blocked-recovery-vs-pr-reservation.sh +0 -201
  81. package/tools/tests/test-heartbeat-loop-idle-resident-controller-does-not-block-launches.sh +0 -160
  82. package/tools/tests/test-heartbeat-loop-pr-launch-dedup.sh +0 -133
  83. package/tools/tests/test-heartbeat-loop-provider-cooldown-suppresses-launches.sh +0 -157
  84. package/tools/tests/test-heartbeat-loop-reaps-stale-resident-controller.sh +0 -181
  85. package/tools/tests/test-heartbeat-loop-waiting-provider-resident-controller-does-not-block-launches.sh +0 -160
  86. package/tools/tests/test-heartbeat-ready-issues-blocked-recovery.sh +0 -134
  87. package/tools/tests/test-heartbeat-safe-auto-dynamic-concurrency.sh +0 -162
  88. package/tools/tests/test-heartbeat-safe-auto-no-tmux-sessions.sh +0 -136
  89. package/tools/tests/test-heartbeat-safe-auto-openclaw-skips-codex-quota.sh +0 -139
  90. package/tools/tests/test-heartbeat-safe-auto-quota-health-signal.sh +0 -119
  91. package/tools/tests/test-heartbeat-safe-auto-stale-shared-loop-pid-does-not-skip.sh +0 -140
  92. package/tools/tests/test-heartbeat-safe-auto-static-capacity-without-quota-cache.sh +0 -142
  93. package/tools/tests/test-heartbeat-safe-auto-zero-healthy-pools.sh +0 -141
  94. package/tools/tests/test-heartbeat-sync-issue-labels-empty-schedule.sh +0 -65
  95. package/tools/tests/test-heartbeat-sync-open-agent-prs-terminal-clears-running.sh +0 -179
  96. package/tools/tests/test-install-dashboard-launchd.sh +0 -78
  97. package/tools/tests/test-install-project-launchd-adds-tool-paths.sh +0 -87
  98. package/tools/tests/test-install-project-launchd.sh +0 -110
  99. package/tools/tests/test-issue-local-workspace-install-policy.sh +0 -81
  100. package/tools/tests/test-issue-publish-scope-guard-docs-signal.sh +0 -70
  101. package/tools/tests/test-issue-reconcile-hooks-success-clears-blocked.sh +0 -36
  102. package/tools/tests/test-kick-scheduler-requires-explicit-profile.sh +0 -47
  103. package/tools/tests/test-label-follow-up-issues-falls-back-to-repository-id.sh +0 -132
  104. package/tools/tests/test-manual-operator-entrypoints-require-explicit-profile.sh +0 -64
  105. package/tools/tests/test-package-funding-metadata.sh +0 -21
  106. package/tools/tests/test-package-public-metadata.sh +0 -62
  107. package/tools/tests/test-placeholder-worker-adapters.sh +0 -38
  108. package/tools/tests/test-pr-reconcile-hooks-refreshes-recurring-issue-checklist.sh +0 -110
  109. package/tools/tests/test-pr-risk-cohesive-mobile-locale-scope.sh +0 -70
  110. package/tools/tests/test-pr-risk-fix-label-semantics.sh +0 -114
  111. package/tools/tests/test-pr-risk-local-first-no-checks.sh +0 -70
  112. package/tools/tests/test-prepare-worktree-simple-repo-baseline.sh +0 -67
  113. package/tools/tests/test-profile-activate.sh +0 -33
  114. package/tools/tests/test-profile-adopt-allow-missing-repo.sh +0 -68
  115. package/tools/tests/test-profile-adopt-skip-workspace-sync-missing-file.sh +0 -61
  116. package/tools/tests/test-profile-adopt-syncs-anchor-and-workspace.sh +0 -90
  117. package/tools/tests/test-profile-smoke-collision.sh +0 -44
  118. package/tools/tests/test-profile-smoke-invalid-claude-config.sh +0 -31
  119. package/tools/tests/test-profile-smoke-invalid-provider-pool.sh +0 -68
  120. package/tools/tests/test-profile-smoke-repo-slug-mismatch.sh +0 -36
  121. package/tools/tests/test-profile-smoke.sh +0 -45
  122. package/tools/tests/test-project-init-force-and-skip-sync.sh +0 -61
  123. package/tools/tests/test-project-init-repo-slug-mismatch.sh +0 -29
  124. package/tools/tests/test-project-init.sh +0 -66
  125. package/tools/tests/test-project-launchd-bootstrap.sh +0 -66
  126. package/tools/tests/test-project-remove.sh +0 -150
  127. package/tools/tests/test-project-runtime-supervisor.sh +0 -47
  128. package/tools/tests/test-project-runtimectl-launchd.sh +0 -115
  129. package/tools/tests/test-project-runtimectl-missing-profile.sh +0 -54
  130. package/tools/tests/test-project-runtimectl-start-falls-back-to-bootstrap.sh +0 -108
  131. package/tools/tests/test-project-runtimectl-status-reports-supervisor-as-heartbeat-parent.sh +0 -95
  132. package/tools/tests/test-project-runtimectl-status-supervisor-running.sh +0 -59
  133. package/tools/tests/test-project-runtimectl-stop-cancels-pending-kick.sh +0 -85
  134. package/tools/tests/test-project-runtimectl-stop-clears-running-labels.sh +0 -78
  135. package/tools/tests/test-project-runtimectl.sh +0 -212
  136. package/tools/tests/test-provider-cooldown-state-prefers-runtime-worker-context.sh +0 -39
  137. package/tools/tests/test-provider-cooldown-state.sh +0 -59
  138. package/tools/tests/test-public-repo-docs.sh +0 -161
  139. package/tools/tests/test-reconcile-pr-worker-acp-config-routing.sh +0 -75
  140. package/tools/tests/test-render-dashboard-snapshot.sh +0 -149
  141. package/tools/tests/test-render-flow-config-demo-profile.sh +0 -36
  142. package/tools/tests/test-render-flow-config-provider-pool-fallback.sh +0 -81
  143. package/tools/tests/test-render-flow-config.sh +0 -52
  144. package/tools/tests/test-run-codex-task-claude-routing.sh +0 -125
  145. package/tools/tests/test-run-codex-task-codex-resident-routing.sh +0 -108
  146. package/tools/tests/test-run-codex-task-kilo-routing.sh +0 -98
  147. package/tools/tests/test-run-codex-task-openclaw-resident-routing.sh +0 -117
  148. package/tools/tests/test-run-codex-task-openclaw-routing.sh +0 -113
  149. package/tools/tests/test-run-codex-task-opencode-routing.sh +0 -98
  150. package/tools/tests/test-run-codex-task-provider-pool-fallback-routing.sh +0 -146
  151. package/tools/tests/test-scaffold-profile.sh +0 -108
  152. package/tools/tests/test-serve-dashboard.sh +0 -93
  153. package/tools/tests/test-start-issue-worker-blocked-context.sh +0 -129
  154. package/tools/tests/test-start-issue-worker-blocks-complete-recurring-checklist.sh +0 -189
  155. package/tools/tests/test-start-issue-worker-local-install-routing.sh +0 -157
  156. package/tools/tests/test-start-issue-worker-profile-template-routing.sh +0 -149
  157. package/tools/tests/test-start-issue-worker-recurring-resident-reuse-codex.sh +0 -212
  158. package/tools/tests/test-start-issue-worker-recurring-resident-reuse.sh +0 -219
  159. package/tools/tests/test-start-issue-worker-renders-verification-snippet.sh +0 -155
  160. package/tools/tests/test-start-issue-worker-resident-reuse-falls-back-to-new-worktree.sh +0 -199
  161. package/tools/tests/test-start-pr-fix-worker-host-blocker-context.sh +0 -275
  162. package/tools/tests/test-start-resident-issue-loop-adopts-next-recurring-issue.sh +0 -185
  163. package/tools/tests/test-start-resident-issue-loop-clears-pending-while-waiting-due.sh +0 -152
  164. package/tools/tests/test-start-resident-issue-loop-consumes-queued-lease.sh +0 -186
  165. package/tools/tests/test-start-resident-issue-loop-fails-over-provider-pool.sh +0 -212
  166. package/tools/tests/test-start-resident-issue-loop-immediate-cycles.sh +0 -148
  167. package/tools/tests/test-start-resident-issue-loop-waits-for-provider.sh +0 -194
  168. package/tools/tests/test-start-resident-issue-loop-waits-for-terminal-reconcile-status.sh +0 -198
  169. package/tools/tests/test-start-resident-issue-loop-yields-to-live-lane-controller.sh +0 -145
  170. package/tools/tests/test-sync-pr-labels-fix-lane-uses-repair-queued.sh +0 -67
  171. package/tools/tests/test-sync-recurring-issue-checklist-backfills-workflow-complete-blocker.sh +0 -70
  172. package/tools/tests/test-sync-recurring-issue-checklist.sh +0 -95
  173. package/tools/tests/test-sync-shared-agent-home-local-source-root.sh +0 -66
  174. package/tools/tests/test-sync-shared-agent-home-preserves-unrelated-workflow-catalog-skill.sh +0 -47
  175. package/tools/tests/test-test-smoke.sh +0 -86
  176. package/tools/tests/test-uninstall-project-launchd.sh +0 -37
  177. package/tools/tests/test-update-github-labels-prefers-sibling-helper.sh +0 -49
  178. package/tools/tests/test-vendored-codex-quota-claude-oauth-only.sh +0 -38
  179. 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"