Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 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
9e9d5b2
fix(server): reject blank bind hostnames
invalid-email-address Jul 28, 2026
5eafd36
fix(macos): harden launchctl environment cleanup
invalid-email-address Jul 28, 2026
0cb9776
fix(windows): prevent update cwd command hijacking
invalid-email-address Jul 28, 2026
a4adba8
test(macos): cover shell-free launchctl injection
invalid-email-address Jul 28, 2026
9d8689d
fix(uninstall): remove only manifest-owned config state
invalid-email-address Jul 28, 2026
b0c92d0
fix(server): deny framing of local responses
invalid-email-address Jul 28, 2026
43b4f65
test(security): align source invariants with hardening
invalid-email-address Jul 28, 2026
42bdb1f
test(server): exercise real websocket origin rejection
invalid-email-address 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
c2e314e
fix(config): preserve config on blank persisted hostname
invalid-email-address Jul 28, 2026
7ce68d1
fix(update): allow npm below trusted cwd ancestors
invalid-email-address Jul 28, 2026
c372771
feat(security): split management and data credentials
invalid-email-address Jul 28, 2026
8e221b5
test(oauth): relax live-update timeout
invalid-email-address Jul 28, 2026
64342c9
security: pin provider discovery transports
invalid-email-address 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
14e1e6b
fix(security): honor all outbound proxy variables
invalid-email-address 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
28996a4
fix(kiro): use CLI wire contract without profiles
byongshintv Jul 29, 2026
7d995ef
merge: sync security fixes with dev
invalid-email-address Jul 29, 2026
cdc16e5
fix(windows): classify localized scheduler denial
Ingwannu Jul 29, 2026
b9ae659
fix(windows): tighten scheduler elevation boundary
Ingwannu Jul 29, 2026
d0763bf
docs(security): point reporters at the now-enabled private advisory form
lidge-jun Jul 29, 2026
9b5b827
fix(kiro): harden CLI auth metadata
byongshintv Jul 29, 2026
9338550
docs(windows): clarify scheduler fallback scope
Ingwannu Jul 29, 2026
1c36e7a
fix(gui): stop the account-pool card from printing its title twice
lidge-jun Jul 29, 2026
43f4429
merge: security hardening batch 1 (#697)
lidge-jun Jul 29, 2026
34688f6
docs(windows): spell out scheduler create predicate
Ingwannu Jul 29, 2026
693347d
test(catalog): hand the pinned transport back the stubbed fetch
lidge-jun Jul 29, 2026
cfc50fb
test(gui): route model-discovery stubs through the pinned transport
lidge-jun Jul 29, 2026
5635eda
fix(claude): preserve generated subagent effort
jhste102lab Jul 29, 2026
b67ddb9
test(claude): cover exact xhigh effort restoration
jhste102lab Jul 29, 2026
d4211b9
fix(gui): stop the speed badge from guessing, and pin the picker label
lidge-jun Jul 29, 2026
c9b694a
merge: PR #699
lidge-jun Jul 29, 2026
97dfbb2
merge: PR #698
lidge-jun Jul 29, 2026
b898824
merge: PR #694
lidge-jun Jul 29, 2026
92ff70b
merge: PR #705
lidge-jun Jul 29, 2026
6d5bea1
fix(claude): harden effort restoration boundaries
jhste102lab Jul 29, 2026
438b8dc
fix(windows): compare scheduler action values, not their encodings (#…
lidge-jun Jul 29, 2026
c0ad57a
merge: PR #705 follow-up — harden effort restoration boundaries
lidge-jun Jul 29, 2026
d4b3c81
fix(gui): renew loopback dashboard sessions silently instead of promp…
lidge-jun Jul 29, 2026
2230914
chore: retire the dev2-go Go native-port line
lidge-jun Jul 29, 2026
010d340
docs: match the dev2-go retirement record to the executed cleanup
lidge-jun Jul 29, 2026
f8d1dc1
chore: move devlog to a private submodule and require scratch-only se…
lidge-jun Jul 29, 2026
aa22207
docs: require primary-source evidence for canonical provider presets
lidge-jun Jul 29, 2026
e3f4068
fix(usage): persist the absolute context checkpoint in usage rows
lidge-jun Jul 29, 2026
ee69abf
feat(gui): show the active-context checkpoint on Kiro log rows
lidge-jun Jul 29, 2026
c4b05fa
docs(structure): point devlog evidence references at _fin
lidge-jun Jul 29, 2026
fff8c36
fix(responses): tell TLS hostname mismatches apart from an unreachabl…
lidge-jun Jul 29, 2026
48f2e83
feat(providers): add bounded model discovery contract (#652)
olddonkey Jul 29, 2026
d24c523
fix(claude): accept data-only Responses SSE (#711)
snowyukitty Jul 29, 2026
47cc9a5
test(kiro): cover the real upstream shape that omits tokenUsage
lidge-jun Jul 29, 2026
c7fe9e8
fix(kiro): discover the Windows kiro-cli token DB on login import (#710)
lidge-jun Jul 29, 2026
12dbec3
fix(kiro): stop proxy filler from preceding a mid-turn steer
lidge-jun Jul 29, 2026
5bf66df
ci: give the Windows test job real timeout headroom (#717)
lidge-jun Jul 29, 2026
d2f9863
fix(cli): keep the selected confirm choice readable on any theme
lidge-jun Jul 29, 2026
3cb2462
feat(service): offer the star prompt on hand-typed service install
lidge-jun Jul 29, 2026
05169df
chore(devlog): advance the plan submodule to bb30ba6
lidge-jun Jul 29, 2026
a76bf41
test(ci): follow the test job's raised timeout ceiling
lidge-jun Jul 29, 2026
e4153e1
test(kiro): use an allowlisted home fixture in the macOS path case
lidge-jun Jul 30, 2026
a40689c
chore(devlog): advance the plan submodule to 7dff38d
lidge-jun Jul 30, 2026
8f499a4
fix(kiro): make native-store resolution platform-correct off macOS (#…
lidge-jun Jul 30, 2026
bfacc3b
test(kiro): clear the platform store between seeds, not just the macO…
lidge-jun Jul 30, 2026
275345a
fix(cursor): add kimi-k3 with low/high/max effort tiers (#646)
koopmannleon19977-cmyk Jul 30, 2026
ef805c3
chore(scripts): let jawcode metadata carry video input
lidge-jun Jul 30, 2026
67c731e
chore(metadata): resync jawcode bundle, re-block hy3-preview, add a d…
lidge-jun Jul 30, 2026
60e1004
test(storage): give the policy suite an explicit harness budget (#732)
lidge-jun Jul 30, 2026
616ea99
chore(devlog): advance the plan submodule to bb5c7de
lidge-jun Jul 30, 2026
622cdc0
test: stop two suites from sharing one fixture home
lidge-jun Jul 30, 2026
4da468c
chore(devlog): advance the plan submodule to eaf4786
lidge-jun Jul 30, 2026
0666b41
chore(devlog): advance the plan submodule to 6c74ce6
lidge-jun Jul 30, 2026
818fcd8
fix(catalog): single-flight gather, prewarm, and readable slash aliases
Wibias Jul 30, 2026
8ac098a
fix(catalog): harden alias encoding and gather single-flight identity
Wibias Jul 30, 2026
ee06d6b
test(cli): cover catalog prewarm on handleStart bind
Wibias Jul 30, 2026
772ee11
docs: sync ~s/~t alias grammar in zh-cn/ja/ru claude-code guides
Wibias Jul 30, 2026
ca05c57
fix(catalog): include visibility filters in gather flight key
Wibias Jul 30, 2026
c4c98c0
fix(gui): gate Codex pool writes until hydrated and ignore stale stra…
Wibias Jul 30, 2026
fa443c0
fix(gui): address Codex review on pool hydration stack
Wibias Jul 30, 2026
297ceef
fix(gui): address remaining pool hydration review nits
Wibias Jul 30, 2026
ee3eaa2
perf(gui): progressive dashboard paint and Startup safety CLS
Wibias Jul 30, 2026
7481715
fix(gui): address review findings on dashboard/startup stack
Wibias Jul 30, 2026
a2072d5
fix(gui): clear react-doctor warnings on dashboard stack
Wibias Jul 30, 2026
904e670
fix(gui): address Codex review on dense workspaces stack
Wibias Jul 30, 2026
27e3762
fix(gui): clear react-doctor warnings on dense workspaces
Wibias Jul 30, 2026
f0acc36
fix(gui): address CodeRabbit follow-ups on dense workspaces
Wibias Jul 30, 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