Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
55e780a
feat(storage): add opt-in auto-cleanup policy (phase 3)
Wibias Jul 27, 2026
1ee3be6
fix(storage): address phase-3 policy review and GUI lint
Wibias Jul 27, 2026
5b3e597
fix(storage): harden phase-3 policy review tip findings
Wibias Jul 27, 2026
ee95740
fix(storage): run cleanup policy off the proxy event loop
Wibias Jul 27, 2026
8c3c349
fix(storage): avoid Windows CI timeouts in cleanup/policy tests
Wibias Jul 27, 2026
521232d
fix(storage): merge run metadata into latest cleanup policy on comple…
Wibias Jul 27, 2026
eeeabc5
fix(storage): settle aborted policy workers and harden Run-now UX
Wibias Jul 27, 2026
9dbcc24
Merge pull request #559 from Wibias/feat/storage-phase3-auto-policy
Wibias Jul 27, 2026
131573e
fix(oauth): stop OAuth login from deleting a stored provider API key …
wonsh42 Jul 27, 2026
461de39
chore: stop tracking local agent session state (#567)
lidge-jun Jul 27, 2026
f195e90
feat(cli): add ocx opencode launcher (#568)
Wibias Jul 27, 2026
40fdc3d
feat(storage): restore quarantined archived sessions (phase 2.1 of #4…
Wibias Jul 27, 2026
c0b902f
fix(cursor): stop shell-alias user mutation; reject empty bridge calls
Aciredy Jul 27, 2026
e2da6f6
fix(server): treat forwarded loopback ports as loopback
lidge-jun Jul 27, 2026
c573bd9
fix(storage): harden #558 satellite backup writes and zst restore (#571)
Wibias Jul 27, 2026
0539705
test(storage): cover restore test-stream route gate cases (#574)
Wibias Jul 27, 2026
458c363
feat(quota): per-account Claude rate limits, canonical 5-hour window …
wonsh42 Jul 27, 2026
053ad66
feat(codex): add opt-in native subagent defaults (#498)
wonsh42 Jul 27, 2026
f92e107
fix(kiro): support browser-based multi-account login (#447)
coseung2 Jul 27, 2026
65e3fee
feat(google): enable Gemini inline image output (#355)
tizerluo Jul 27, 2026
de35caa
feat(images): Grok image bridge (maintainer takeover of #424) (#577)
Wibias Jul 27, 2026
da212d3
feat(anthropic): opt-in Claude OAuth account pool (#294) (#578)
Wibias Jul 28, 2026
ece0d9f
fix(release): baseline preview notes on last prior release (#579)
Wibias Jul 28, 2026
3a2b2ea
Merge pull request #573 from lidge-jun/codex/260728-ssh-loopback-gate
lidge-jun Jul 28, 2026
94a83bc
feat(dashboard): drain-and-restart from memory observability card (#5…
Wibias Jul 28, 2026
903b62c
fix(codex): same-request multi-account failover on quota 429 (#584) (…
Wibias Jul 28, 2026
e545512
fix(server): harden drain-and-restart spawn failure path (#580 follow…
Wibias Jul 28, 2026
855ed7a
chore(gui): React Doctor 100, 0.9.2 pin, block findings (#589)
Wibias Jul 28, 2026
ed5ddaf
fix(ci): require non-empty bug Reproduction (and treat ... as empty) …
Wibias Jul 28, 2026
0338b78
feat(kimi): forward prompt_cache_key on the Kimi Coding Plan presets …
olddonkey Jul 28, 2026
285e2bf
fix(openai-responses): round-trip image-gen namespace (#588)
RailyW Jul 28, 2026
2a404c7
fix(anthropic): support bearer key auth for gateways (#595)
iF2007 Jul 28, 2026
c380ef7
feat(auth): account pool round-robin and fill-first strategies (#593)
Wibias Jul 28, 2026
406a522
refactor(responses): single-pass SSE payload rewrite composition (#602)
Wibias Jul 28, 2026
d482086
fix(windows): grant owner ACE before ACL inheritance removal (#601)
Wibias Jul 28, 2026
7710185
fix stale update jobs and combo quota fallback
Ingwannu Jul 28, 2026
c48a6ee
test(usage): give the rolling-file bound test room on Windows (#614)
lidge-jun Jul 28, 2026
ca7b104
fix(codex): warn about stale Codex app-servers after a catalog write …
lidge-jun Jul 28, 2026
2bbac19
docs: a dev merge is not done until dev2-go carries it too
lidge-jun Jul 29, 2026
a47aa3f
docs: harden and scope agent guidance (#583)
Wibias Jul 29, 2026
257c626
feat(videos): add Grok video bridge for non-OpenAI models (#582)
tizerluo Jul 29, 2026
20cdc0d
fix: scope Spark cooldowns to its native quota (#599)
akrock Jul 29, 2026
f492f7d
feat(gui): show reset credit expiration time (#613)
ACJF00 Jul 29, 2026
868a9c4
fix(adapters): neutralize Codex CLI 0.145 identity wording (#638)
Wibias Jul 29, 2026
c9bed7c
feat(codex): add account namespace foundation
chrisae9 Jul 26, 2026
f0867e8
feat(codex): account pause controls and bulk exhaustion (#667)
Wibias Jul 29, 2026
f7be351
docs: require needs-go-port for deferred Go ports (#672)
Wibias Jul 29, 2026
dcaede6
fix(cursor): steer Windows bridge shell away from PS 5.1 syntax loops…
Wibias Jul 29, 2026
a4fb284
fix(gui): dedupe dashboard API token prompts on concurrent 401s (#651)
Wibias Jul 29, 2026
14dde56
fix(ci): harden PR target draft conversion and issue-quality Version …
Wibias Jul 29, 2026
9d181fc
fix(catalog): accept Together top-level /models arrays (#639)
Wibias Jul 29, 2026
e6169b0
fix(cli): status/doctor use identity-verified live proxy (#642)
Wibias Jul 29, 2026
f19a73c
fix(catalog): omit bare OpenAI models without openai provider (#643)
Wibias Jul 29, 2026
75bd272
feat(ci): enforce PR ancestry and description quality gates (#648)
Wibias Jul 29, 2026
a2981c8
fix(gui): render Claude helper model labels (#623)
hanbinnoh Jul 29, 2026
341d486
fix(windows): async ACL harden for response-state writes (#645)
Wibias Jul 29, 2026
c7e48fb
fix(anthropic): reorder interleaved text before tool_use (#640)
Wibias Jul 29, 2026
d0763bf
docs(security): point reporters at the now-enabled private advisory form
lidge-jun Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

26 changes: 26 additions & 0 deletions .github/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# GitHub automation instructions

This file applies to `.github/` and inherits the repository-wide rules in `/AGENTS.md`.

## Security boundary

Every workflow, ownership, branch-enforcement, release, or repository-automation
change requires explicit security review under `MAINTAINERS.md`.

## Workflow rules

- Grant the minimum required `permissions`.
- Pin third-party actions to immutable full commit SHAs.
- Preserve the human-readable version comment beside each pinned action.
- Do not run untrusted pull-request code with secrets or write permissions.
- Treat `pull_request_target`, workflow dispatch, reusable workflows, artifacts, caches, and generated command input as trust boundaries.
- Do not broaden triggers, write permissions, token exposure, release eligibility, or publish capability without an explicit task requirement.
- Preserve cross-platform coverage where the workflow currently promises Linux, macOS, and Windows behavior.
- Keep branch-enforcement text synchronized with `AGENTS.md`, `MAINTAINERS.md`, and the public contributing guide.

## Validation

- Inspect the complete workflow diff, including event triggers, permissions, conditions, interpolation, and shell behavior.
- Run the local commands represented by changed workflow steps where possible.
- Run `bun run prepush` for CI, release, dependency, packaging, or cross-platform workflow changes.
- Do not claim the workflow itself passed until GitHub Actions reports success for the exact commit.
2 changes: 2 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@
/src/server/management-api.ts @lidge-jun @Ingwannu

# Governance and security policy
/AGENTS.md @lidge-jun @Ingwannu
**/AGENTS.md @lidge-jun @Ingwannu
/MAINTAINERS.md @lidge-jun @Ingwannu
/SECURITY.md @lidge-jun @Ingwannu
3 changes: 3 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Report a security vulnerability (private)
url: https://github.com/lidge-jun/opencodex/security/advisories/new
about: Report undisclosed vulnerabilities privately to the maintainers. Do not open a public issue.
- name: Security policy
url: https://github.com/lidge-jun/opencodex/blob/main/SECURITY.md
about: Read the supported-version and reporting guidance before sharing security-sensitive details.
Expand Down
75 changes: 75 additions & 0 deletions .github/scripts/enforce-pr-target.test.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
"use strict";

const fs = require("node:fs");
const path = require("node:path");
const { describe, it } = require("node:test");
const assert = require("node:assert/strict");

describe("enforce-pr-target workflow", () => {
const workflowPath = path.join(__dirname, "../workflows/enforce-pr-target.yml");
const workflow = fs.readFileSync(workflowPath, "utf8");

it("uses pull_request_target without checking out PR head code", () => {
assert.match(workflow, /pull_request_target:/);
assert.doesNotMatch(
workflow,
/ref:\s*\$\{\{\s*github\.event\.pull_request\.head/,
"enforcer must not check out untrusted PR head code",
);
});

it("grants contents:write so draft GraphQL mutations work with GITHUB_TOKEN", () => {
// convertPullRequestToDraft / markPullRequestReadyForReview fail with
// "Resource not accessible by integration" when contents stays unset/read
// (seen on #626). Assert the real permissions block, not comment text
// that also mentions these scopes.
const permissionsBlock = workflow.match(/^permissions:\n((?:[ \t]+.+\n)+)/m);
assert.ok(permissionsBlock, "workflow must declare a top-level permissions block");
const lines = permissionsBlock[1]
.split("\n")
.map((line) => line.trim())
.filter(Boolean)
.sort();
assert.deepEqual(lines, ["contents: write", "pull-requests: write"]);
});

it("fails the required check on a wrong base even if draft conversion fails", () => {
assert.match(workflow, /core\.setFailed\(/);
assert.match(workflow, /draftConversionFailed/);
assert.match(workflow, /Could not convert pull request to draft/);
});

it("soft-fails ready-for-review restoration the same way", () => {
assert.match(workflow, /readyConversionFailed/);
assert.match(workflow, /Could not mark pull request ready for review/);
});

it("listens for synchronize so rebase can clear ancestry failures", () => {
assert.match(workflow, /synchronize/);
});

it("checks out trusted default-branch scripts only (never PR head)", () => {
assert.match(workflow, /actions\/checkout@[0-9a-f]{40}/);
assert.match(workflow, /ref:\s*\$\{\{\s*github\.event\.repository\.default_branch\s*\}\}/);
assert.match(workflow, /sparse-checkout:\s*\.github\/scripts/);
assert.match(workflow, /persist-credentials:\s*false/);
assert.doesNotMatch(workflow, /ref:\s*\$\{\{\s*github\.event\.pull_request\.head/);
});

it("loads pr-quality via require from the checked-out scripts", () => {
assert.match(workflow, /pr-quality\.cjs/);
assert.match(workflow, /collectPrQualityFailures/);
});

it("strips stale WRONG BRANCH prefix on failure when base is corrected", () => {
const failureBlock = workflow.match(
/if \(failures\.length > 0\) \{([\s\S]*?)core\.setFailed\(/,
);
assert.ok(failureBlock, "workflow must have a failure path");
const failurePath = failureBlock[1];
assert.match(failurePath, /shouldStripTitlePrefix/);
assert.match(failurePath, /!hasWrongBase/);
assert.match(failurePath, /titlePrefixedByBot = false/);
assert.match(failurePath, /pr\.title\.slice\(TITLE_PREFIX\.length\)/);
});
});
Loading
Loading