Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
197 commits
Select commit Hold shift + click to select a range
043e02d
fix(runtime): make snapshot, owner and media lifecycles recoverable
tianxiaochannel-oss88 Oct 16, 2026
c213d88
fix: redact CI evidence and preserve terminal participant outcomes
tianxiaochannel-oss88 Oct 16, 2026
425c718
fix(runtime): renew owned resources and project canonical trace actions
tianxiaochannel-oss88 Oct 16, 2026
3cb12b0
checkpoint: preserve E6 continuation before main integration
tianxiaochannel-oss88 Oct 17, 2026
c161855
Merge remote-tracking branch 'origin/main' into codex/e6-safe-continu…
tianxiaochannel-oss88 Oct 18, 2026
15d944a
checkpoint: preserve E6 recovery and delegation WIP
tianxiaochannel-oss88 Oct 19, 2026
f15b19e
Merge remote-tracking branch 'origin/main' into codex/e6-safe-continu…
tianxiaochannel-oss88 Oct 22, 2026
dfe3cf7
checkpoint: preserve E6 delegation and reliability closure
tianxiaochannel-oss88 Oct 22, 2026
3de8ced
Merge remote-tracking branch 'origin/main' into codex/e6-safe-continu…
tianxiaochannel-oss88 Oct 22, 2026
ff9c073
fix(web): keep browser bundle on safe package exports
tianxiaochannel-oss88 Oct 22, 2026
83004e1
test(desktop): close Office daemon review inventory
tianxiaochannel-oss88 Oct 22, 2026
2eda9c6
test(harness): stabilize T13B performance gate
tianxiaochannel-oss88 Oct 22, 2026
77ed697
test(delegation): prove process restart recovery
tianxiaochannel-oss88 Oct 22, 2026
a12872b
test(daemon): align failed shutdown recovery contract
tianxiaochannel-oss88 Oct 22, 2026
622cabf
test(delegation): preserve resume response-loss replay
tianxiaochannel-oss88 Oct 22, 2026
9585bcb
fix(delegation): replay accepted resume calls safely
tianxiaochannel-oss88 Oct 22, 2026
1408348
Merge remote-tracking branch 'origin/main' into codex/e6-safe-continu…
tianxiaochannel-oss88 Oct 22, 2026
5ccb95a
fix(core): make completion checks transactional
tianxiaochannel-oss88 Oct 22, 2026
c71bae7
docs: record current E6 acceptance checkpoint
tianxiaochannel-oss88 Oct 22, 2026
7b648df
checkpoint(e6): preserve graceful tree recovery and shutdown evidence
tianxiaochannel-oss88 Oct 23, 2026
69a7a32
checkpoint(e6): preserve bounded resource rebuild and QA copy repair
tianxiaochannel-oss88 Oct 23, 2026
78f0f9a
fix(desktop): reject resource path macros before Builder copying
tianxiaochannel-oss88 Oct 23, 2026
7784c38
fix(desktop): separate authenticated resource bootstrap from service …
tianxiaochannel-oss88 Oct 23, 2026
2e0b55c
ui: checkpoint shared live activity presentation
tianxiaochannel-oss88 Oct 23, 2026
2adfab1
fix: checkpoint P3 budget, private review and shared activity repairs
tianxiaochannel-oss88 Oct 23, 2026
f1bb3b1
chore: preserve reviewed P3 isolated QA source snapshot
tianxiaochannel-oss88 Oct 23, 2026
17af63a
fix: accept unrelated APFS inventory without adopting detach authority
tianxiaochannel-oss88 Oct 23, 2026
4b2147a
merge: integrate main with E6 migration and reviewed reliability repairs
tianxiaochannel-oss88 Oct 23, 2026
62ccfdf
docs: record pushed E6 merge and completed delta reviews
tianxiaochannel-oss88 Oct 23, 2026
4c59f68
docs(qa): add pending-only main delta freezer
tianxiaochannel-oss88 Oct 23, 2026
7170fb8
chore(qa): bind reviewed main delta for isolated macOS package
tianxiaochannel-oss88 Oct 23, 2026
e88e5fe
docs(qa): save current package identity and private recovery evidence
tianxiaochannel-oss88 Oct 23, 2026
c9e3d58
fix(e6): preserve workflow execution lineage and participant states
tianxiaochannel-oss88 Oct 24, 2026
de0f238
chore(e6): freeze reviewed C01 and offline QA inputs
tianxiaochannel-oss88 Oct 24, 2026
4fdd39e
fix: stage source-authorized Node project module inputs
tianxiaochannel-oss88 Oct 24, 2026
b3c1937
fix(e6): isolate private workflow hydration and public history
tianxiaochannel-oss88 Oct 24, 2026
93de59f
test(e6): save reviewed QA package and complete daemon regression
tianxiaochannel-oss88 Oct 25, 2026
f8f252d
chore(e6): document exact rejected-login fixture in QA evidence
tianxiaochannel-oss88 Oct 25, 2026
7f21462
chore: match exact credential scanner fixture span
tianxiaochannel-oss88 Oct 25, 2026
bb00926
fix: bind command cwd and preserve lexical file reference origins
tianxiaochannel-oss88 Oct 25, 2026
90b1265
chore(e6): keep private QA evidence local and tighten public scans
tianxiaochannel-oss88 Oct 25, 2026
0450cf5
fix: preserve command binding reasons and verify cwd convergence
tianxiaochannel-oss88 Oct 25, 2026
6f4cf44
chore: pin independently reviewed cwd repair QA inputs
tianxiaochannel-oss88 Oct 25, 2026
887989a
fix: bind Bash working directories to approval authority
tianxiaochannel-oss88 Oct 25, 2026
a6d6ee2
chore(qa): freeze reviewed Bash cwd package inputs
tianxiaochannel-oss88 Oct 25, 2026
93e53bc
fix(qa): keep invalid channel plans out of ordinary replies
tianxiaochannel-oss88 Oct 25, 2026
8eb32cb
chore(qa): freeze reviewed channel intent failure inputs
tianxiaochannel-oss88 Oct 25, 2026
8ef4daf
fix(qa): separate command input coordinates from execution cwd
tianxiaochannel-oss88 Oct 25, 2026
84d11b7
chore(qa): freeze reviewed command input coordinate sources
tianxiaochannel-oss88 Oct 25, 2026
0303902
fix(channels): bind generated reports to verified command evidence
tianxiaochannel-oss88 Oct 25, 2026
9bc99b6
chore(qa): freeze reviewed generated-command evidence inputs
tianxiaochannel-oss88 Oct 25, 2026
46ebeef
fix: align typed workflow write schema with exclusive create
tianxiaochannel-oss88 Oct 25, 2026
720a751
chore(qa): freeze reviewed native-create tool surface inputs
tianxiaochannel-oss88 Oct 25, 2026
b56ff7b
fix: deduplicate frozen workflow context without dropping execution a…
tianxiaochannel-oss88 Oct 25, 2026
5bc90e0
chore(qa): freeze reviewed workflow context projector inputs
tianxiaochannel-oss88 Oct 25, 2026
9817961
fix(approvals): observe durable recovery through completion
tianxiaochannel-oss88 Oct 25, 2026
03410e9
fix(reports): retain bounded atomic command results
tianxiaochannel-oss88 Oct 25, 2026
134ac5d
fix(channels): diagnose invalid plans without false clarification
tianxiaochannel-oss88 Oct 25, 2026
ef7a7a6
fix(packaging): pin planning and report runtime sources
tianxiaochannel-oss88 Oct 25, 2026
f5168a2
chore(qa): freeze reviewed planning and report source delta
tianxiaochannel-oss88 Oct 25, 2026
6008c3e
fix(ui): show evidence-backed fallback endings
tianxiaochannel-oss88 Oct 25, 2026
98eff58
fix(channels): bind confirmed pending-request continuation
tianxiaochannel-oss88 Oct 25, 2026
954e8f1
chore(qa): freeze reviewed continuation and fallback delta
tianxiaochannel-oss88 Oct 25, 2026
14de621
fix(reports): preserve published results across orphan revisions
tianxiaochannel-oss88 Oct 25, 2026
1abdadc
chore(qa): freeze published-report selection successor inputs
tianxiaochannel-oss88 Oct 25, 2026
e0b09b5
fix(channels): freeze named branch topology atomically
tianxiaochannel-oss88 Oct 25, 2026
4283ef6
fix(channels): isolate reply streams and evidence visibility
tianxiaochannel-oss88 Oct 25, 2026
bd22ed9
chore(qa): freeze C03 scope successor package inputs
tianxiaochannel-oss88 Oct 25, 2026
e49eb3d
fix(channels): fence panel reads by selected owner
tianxiaochannel-oss88 Oct 25, 2026
cacc0f9
fix(ui): preserve exact approval rejection outcomes
tianxiaochannel-oss88 Oct 25, 2026
6d0ccde
fix(qa): preserve denied recovery recency and goal maintenance clocks
tianxiaochannel-oss88 Oct 25, 2026
db8362c
test(daemon): return valid discussion intent in turn API fixture
tianxiaochannel-oss88 Oct 25, 2026
23e7e7a
fix(ui): recover accepted conversation stream observation
tianxiaochannel-oss88 Oct 25, 2026
1335660
test(desktop): preserve isolated dual SSE recovery tools
tianxiaochannel-oss88 Oct 25, 2026
f720d27
fix(desktop): launch isolated QA GUI outside Node mode
tianxiaochannel-oss88 Oct 25, 2026
3103473
chore(qa): freeze reviewed recovery package and record live acceptance
tianxiaochannel-oss88 Oct 25, 2026
80610c3
fix(daemon): report refused shutdown without observer deadlock or crash
tianxiaochannel-oss88 Oct 25, 2026
2a9f71d
fix(daemon): expose private shutdown observations without changing st…
tianxiaochannel-oss88 Oct 25, 2026
99ed68a
fix(desktop): retain original host and transports until verified shut…
tianxiaochannel-oss88 Oct 25, 2026
c901479
fix(qa): isolate successor package from retained shutdown host
tianxiaochannel-oss88 Oct 25, 2026
8e3efa5
fix(desktop): preserve final artifact transport failure diagnostics
tianxiaochannel-oss88 Oct 26, 2026
37c40e3
chore(qa): pin reviewed package transport diagnostic delta
tianxiaochannel-oss88 Oct 26, 2026
134ea73
fix(desktop): pause new capability claims during owned Host drain
tianxiaochannel-oss88 Oct 26, 2026
6c8dc91
fix(api-client): preserve transport error origin without hiding proto…
tianxiaochannel-oss88 Oct 26, 2026
f802141
fix(web): fence conversation observation during owned Host shutdown
tianxiaochannel-oss88 Oct 26, 2026
7a73608
fix(web): qualify stale sidebar activity after owned Host drain
tianxiaochannel-oss88 Oct 26, 2026
20ad9ee
fix(desktop): isolate final R03 observation QA package output
tianxiaochannel-oss88 Oct 26, 2026
52cb419
docs(qa): record packaged R03 stopped-observation verification
tianxiaochannel-oss88 Oct 26, 2026
b5ad467
docs(qa): preserve packaged twelve-turn recall evidence
tianxiaochannel-oss88 Oct 26, 2026
083b514
docs(e6): record N03 real task and history reopen acceptance
tianxiaochannel-oss88 Oct 26, 2026
d63f8a6
merge(main): preserve E6 execution and QA boundaries
tianxiaochannel-oss88 Oct 26, 2026
1e04cd4
fix(desktop): verify reviewed toolchain identity before execution
tianxiaochannel-oss88 Oct 26, 2026
c2b7b08
fix(desktop): bind integrated QA to reviewed current macOS runtime
tianxiaochannel-oss88 Oct 26, 2026
cac6044
fix(gstack): retain build leases until process settlement is observed
tianxiaochannel-oss88 Oct 26, 2026
3dbdd6b
fix(gstack): preserve scratch until owned QA selection is restored
tianxiaochannel-oss88 Oct 26, 2026
6b2a53d
fix(gstack): retain failed build inputs until managed settlement
tianxiaochannel-oss88 Oct 26, 2026
2dd973d
build(gstack): bind verified source recipe after staging repair
tianxiaochannel-oss88 Oct 26, 2026
4ecad09
fix(gstack): retain failed browser registry staging in its lease
tianxiaochannel-oss88 Oct 26, 2026
8a812e1
fix(gstack): rebind reviewed macOS source consumers
tianxiaochannel-oss88 Oct 26, 2026
4973ec8
fix(gstack): measure download assembly after compilation
tianxiaochannel-oss88 Oct 26, 2026
2e92bc1
merge: integrate main b3403df9 before E6 QA packaging
tianxiaochannel-oss88 Oct 26, 2026
1128417
fix(localization): preserve unchanged generated catalog inputs
tianxiaochannel-oss88 Oct 26, 2026
dd2cc0e
fix(gstack): block resource admission during explicit recovery
tianxiaochannel-oss88 Oct 27, 2026
4dd636e
fix(gstack): retain recovered executable before selection custody
tianxiaochannel-oss88 Oct 27, 2026
acc492b
fix(desktop): serialize final artifact verification and cleanup
tianxiaochannel-oss88 Oct 27, 2026
63ecdbb
fix(channels): resume frozen pending operations with scoped answers
tianxiaochannel-oss88 Oct 27, 2026
9afa524
fix(channels): expose safe pending draft diagnostics for QA
tianxiaochannel-oss88 Oct 27, 2026
c965dda
fix(channels): specify pending scope wire identifiers
tianxiaochannel-oss88 Oct 27, 2026
99b9ee2
chore(desktop): bind reviewed pending wire contract for isolated QA
tianxiaochannel-oss88 Oct 27, 2026
9cd0ebb
fix(desktop): retain stop receipts and skip dead Host lease release
tianxiaochannel-oss88 Oct 27, 2026
f135798
chore(qa): bind reviewed shutdown inputs and record pending wire vali…
tianxiaochannel-oss88 Oct 27, 2026
d369e4c
merge: integrate main while preserving E6 recovery and error ownership
tianxiaochannel-oss88 Oct 27, 2026
f274552
fix(e6): harden integrated auth, previews and cold restart paths
tianxiaochannel-oss88 Oct 27, 2026
0de9a37
chore(e6): record fixture closure and exact rejection samples
tianxiaochannel-oss88 Oct 27, 2026
f7f7bc7
fix(i18n): correct reviewed automation, log and dictation terms
tianxiaochannel-oss88 Oct 27, 2026
8795c5a
chore: bind integrated QA inputs and record client continuation evidence
tianxiaochannel-oss88 Oct 27, 2026
a5517f1
fix(channels): inherit verified policy for Node command inputs
tianxiaochannel-oss88 Oct 27, 2026
3d5b017
fix(conversation): keep execution evidence with tool items
tianxiaochannel-oss88 Oct 27, 2026
f3ec983
fix(web): hydrate channel sidebar from the current startup owner
tianxiaochannel-oss88 Oct 27, 2026
755dd1b
fix(channels): preserve negated dependency scope questions
tianxiaochannel-oss88 Oct 27, 2026
49121df
Merge commit '37413fe20e4a572f1134030ce7324ee46dd6b936' into codex/e6…
tianxiaochannel-oss88 Oct 27, 2026
8cd5db5
fix(settings): fence engine lifecycle replies to their owning view
tianxiaochannel-oss88 Oct 27, 2026
3de1169
fix(daemon): drain owned engine lifecycle work before shutdown
tianxiaochannel-oss88 Oct 27, 2026
5a8a7a6
docs: record Codex lifecycle cross-check and verified E6 repair check…
tianxiaochannel-oss88 Oct 27, 2026
5ec8886
fix(api-client): bound engine lifecycle requests by operation
tianxiaochannel-oss88 Oct 27, 2026
afd55a9
fix(desktop): include managed engine runtime in Office review inputs
tianxiaochannel-oss88 Oct 27, 2026
2347ffe
chore(qa): bind reviewed lifecycle inputs and acceptance checkpoint
tianxiaochannel-oss88 Oct 27, 2026
22191ea
fix(conversation): disclose owned blocked protocol without raw final …
tianxiaochannel-oss88 Oct 27, 2026
22204d6
fix(channels): fence pending operations with durable authority epochs
tianxiaochannel-oss88 Oct 27, 2026
074de92
fix(conversation): unify confirmed full access controls
tianxiaochannel-oss88 Oct 28, 2026
843d7e6
feat: complete design parity continuation work
tianxiaochannel-oss88 Oct 30, 2026
d1e6c5a
Merge origin/main into codex/pr614-design-parity-recovery
tianxiaochannel-oss88 Oct 30, 2026
18cdab1
fix: restore merged conversation runtime contracts
tianxiaochannel-oss88 Oct 30, 2026
6ee0906
fix: reconcile runner identity storage contracts
tianxiaochannel-oss88 Oct 30, 2026
246cbcf
test: allowlist invalid URL scope fixture
tianxiaochannel-oss88 Oct 30, 2026
e164756
test: allowlist complete marketplace URL fixtures
tianxiaochannel-oss88 Oct 30, 2026
496ef46
test: match redact fixture spans exactly
tianxiaochannel-oss88 Oct 30, 2026
1ad0a0a
chore: translate catalogs for new source strings
ling-stack-model-catalog[bot] Oct 30, 2026
ba49f5a
chore: satisfy CI whitespace checks
tianxiaochannel-oss88 Oct 30, 2026
f47a6c2
chore(security): allow reviewed QA evidence fingerprints
tianxiaochannel-oss88 Oct 30, 2026
357071f
fix: restore continuation and runtime metric boundaries
tianxiaochannel-oss88 Oct 30, 2026
c478548
test: observe comfy jobs poll in A19
tianxiaochannel-oss88 Oct 30, 2026
ab3ee05
test: accept localized process stop wording
tianxiaochannel-oss88 Oct 30, 2026
8683e4c
test: allow slower native channel settlement
tianxiaochannel-oss88 Oct 30, 2026
a970de2
test: provide node package boundary in native smoke
tianxiaochannel-oss88 Oct 30, 2026
3380b51
ci: isolate delegation lifecycle shard fixture
tianxiaochannel-oss88 Oct 31, 2026
bd778a5
test: keep deferred lifecycle fixtures alive on Node 22
tianxiaochannel-oss88 Oct 31, 2026
8a007ff
ci: give selected unit tests enough headroom
tianxiaochannel-oss88 Oct 31, 2026
91da206
test: align migration fixtures with current schema
tianxiaochannel-oss88 Oct 31, 2026
9607de6
fix: restore web catalog polarity contracts
tianxiaochannel-oss88 Oct 31, 2026
04bdd93
merge: reconcile latest main into design parity
tianxiaochannel-oss88 Oct 31, 2026
1609263
fix: reconcile localized catalogs after main merge
tianxiaochannel-oss88 Oct 31, 2026
10b1ec2
fix: retain main memory and channel session APIs
tianxiaochannel-oss88 Oct 31, 2026
5da6a3a
fix: merge core storage contracts from main
tianxiaochannel-oss88 Oct 31, 2026
065f44a
fix: complete core merge branches
tianxiaochannel-oss88 Oct 31, 2026
a0b7c5b
fix: expose merged core runtime contracts
tianxiaochannel-oss88 Oct 31, 2026
3267436
fix: complete design parity continuation
tianxiaochannel-oss88 Oct 31, 2026
4fc1fef
Merge remote-tracking branch 'origin/main' into codex/pr614-design-pa…
tianxiaochannel-oss88 Oct 31, 2026
ca2513d
chore: translate catalogs for new source strings
ling-stack-model-catalog[bot] Oct 31, 2026
26b9b15
Merge remote-tracking branch 'origin/codex/e6-safe-continuation' into…
tianxiaochannel-oss88 Oct 31, 2026
1e63fd2
fix: restore desktop QA launch registration contract
tianxiaochannel-oss88 Oct 31, 2026
1dc4879
fix: restore desktop QA launch registration contract
tianxiaochannel-oss88 Oct 31, 2026
6ec51c9
fix: preserve prepared capability surface selectors
tianxiaochannel-oss88 Oct 31, 2026
deccb76
fix: preserve prepared capability surface selectors
tianxiaochannel-oss88 Oct 31, 2026
9fe16be
fix: preserve prepared capability surface selectors
tianxiaochannel-oss88 Oct 31, 2026
51641ed
fix(core): repair channel and terminal intent migrations
tianxiaochannel-oss88 Oct 31, 2026
af45d40
Merge remote-tracking branch 'origin/codex/e6-safe-continuation' into…
tianxiaochannel-oss88 Oct 31, 2026
2047264
fix(web): restore channel panel owner fencing
tianxiaochannel-oss88 Oct 31, 2026
7d016e1
fix(workflows): restore pre-gate admission boundaries
tianxiaochannel-oss88 Oct 31, 2026
72eb91c
fix(workflows): preserve provider blockers for ungated starts
tianxiaochannel-oss88 Oct 31, 2026
c423d6e
fix(web): preserve conversation and run read fallbacks
tianxiaochannel-oss88 Oct 31, 2026
811925e
fix(daemon): preserve physical drain option for CLI shutdown
tianxiaochannel-oss88 Oct 31, 2026
4088ced
fix(web): fence channel reads during daemon observation changes
tianxiaochannel-oss88 Oct 31, 2026
0435c21
fix(daemon): admit owners before store recovery
tianxiaochannel-oss88 Nov 1, 2026
8771d5a
fix(workflows): return typed task admission responses
Nov 1, 2026
17eabd5
merge(main): reconcile workflow admission contract
Nov 1, 2026
3597600
fix: preserve channel lineage and public workflow boundaries
Nov 1, 2026
a68769c
fix: keep workflow evidence public projection private
Nov 1, 2026
2a72311
fix: separate durable workflow tasks from model input
Nov 1, 2026
ed368dd
fix: close daemon recovery regressions
Nov 1, 2026
4ac76b4
fix: harden daemon shutdown and skill action validation
Nov 1, 2026
737d6a5
fix: release answer delivery slot after receiver ack
Nov 1, 2026
5f9f7af
test(daemon): tolerate slow macOS CLI startup
Nov 1, 2026
36970f8
merge main CI runner hardening into PR 614
Nov 1, 2026
8d2e3ae
fix(ci): preserve PR 614 delegation lifecycle isolation
tianxiaochannel-oss88 Nov 1, 2026
a7ee015
fix daemon workflow gates and CI fixtures
Nov 1, 2026
d2d0118
allow complete history secret scan to finish
Nov 1, 2026
5e39df4
fix(ci): keep gitleaks comments outside docker command
Nov 1, 2026
9b4a3ac
fix(ci): scan stable pull request history head
Nov 1, 2026
70baea8
fix(ci): isolate slow channel daemon integration test
Nov 1, 2026
d2d3a56
fix(ci): bound known slow daemon fixtures separately
Nov 1, 2026
8045b66
fix: restore workflow and permission admission paths
Nov 1, 2026
3bd1875
test: keep fixture errors out of HTTP responses
Nov 1, 2026
e39c043
fix: preserve permission control accessibility label
Nov 1, 2026
97c8def
fix: keep authorization and preset labels distinct
Nov 2, 2026
51e1192
test(web): align Chinese authorization label contract
Nov 2, 2026
7708f81
fix(web): preserve runs test seam import
Nov 2, 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
  •  
  •  
  •  
14 changes: 11 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,10 @@ jobs:
name: Common checks (fast lane)
needs: scope
runs-on: ubuntu-latest
timeout-minutes: 15
# A policy or ignore-file change forces a complete repository-history
# Gitleaks scan. Keep this lane bounded, but allow that audit to finish on
# the full monorepo instead of failing at the generic 15-minute job limit.
timeout-minutes: 35
steps:
- name: Check out repository without retained credentials
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
Expand All @@ -149,10 +152,15 @@ jobs:
if: needs.scope.outputs.execution-tier == 'complete'
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
# Scan the immutable PR head so reviewed Gitleaks fingerprints remain
# stable; the full reachable history scan is still required.
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
shell: bash
run: |
set -euo pipefail
scan_plan="$(node scripts/ci/secret-scan.mjs --event="$GITHUB_EVENT_NAME" --base="$BASE_SHA" --head=HEAD)"
# Full-history scans can exceed ten minutes on the monorepo. The
# job timeout above remains the outer bound.
scan_plan="$(node scripts/ci/secret-scan.mjs --event="$GITHUB_EVENT_NAME" --base="$BASE_SHA" --head="$HEAD_SHA")"
echo "Secret scan plan: $scan_plan"
log_opts="$(SCAN_PLAN="$scan_plan" node --input-type=module -e 'console.log(JSON.parse(process.env.SCAN_PLAN).logOpts)')"
docker run --rm \
Expand All @@ -162,7 +170,7 @@ jobs:
--log-opts="$log_opts" \
--config /repo/.gitleaks.toml \
--gitleaks-ignore-path /repo/.gitleaksignore \
--timeout 600 \
--timeout 1800 \
/repo

- name: Check pull request whitespace
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ WORKFLOW.md
.playwright-cli/
logs/
output/
# Node diagnostic reports can contain process credentials and local paths.
/packages/daemon/report.*.json

# system
.DS_Store
Expand Down
196 changes: 196 additions & 0 deletions .gitleaksignore

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions .gstack-redact-allowlist
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Negative login-validation fixture, not a usable account or credential.
# packages/daemon/test/codex-login.test.mjs:102 asserts that this URL is rejected.
# Preserve its exact appearance in immutable full-regression logs; no pattern wildcard.
https://user:pass@auth.openai.com

# Negative marketplace URL-validation fixtures, not usable credentials.
# skills-marketplace-fetch.test.mjs rejects these reserved .test hosts before
# sending credentials; the second span is the literal source template, not a port.
# Exact scanner spans only; no wildcard, global skip, or runtime/test rewrite.
https://user:password@preview.a11.test
https://user:password@preview.a11.test:${fixture.port}

# Negative URL-scope fixture; localhost credentials are intentionally invalid and
# used only to assert that conversation reading scopes strip URL auth/query data.
# apps/web/test/conversation-reading-storage.test.mjs:18
# Scanner span ends at the localhost authority before the path/query.
http://user:secret@localhost:4234
75 changes: 71 additions & 4 deletions apps/desktop/main/cua-driver/coordinator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ export class CuaDriverDesktopCoordinator {
private proxy: CuaDriverMcpProxy | undefined;
private leasePublisher: CuaDriverLeasePublisher | undefined;
private stopped = false;
private hostDraining = false;
private cleanupDebt = false;
private requestedEnabled = false;
private requestedRevision = 0;
Expand Down Expand Up @@ -276,6 +277,22 @@ export class CuaDriverDesktopCoordinator {
this.proxy?.closeCallGate(reason);
}

/**
* Terminal Host admission fence. Do not revoke or stop these resources until
* the original Host has actually exited and shutdown performs final cleanup.
*/
beginHostDrain(reason: string): void {
if (this.hostDraining) return;
this.hostDraining = true;
this.requestedEnabled = false;
this.requestedRevision += 1;
this.pendingRecoveryAction = undefined;
this.pendingWindowsSessionSuspension = undefined;
this.windowsSessionResumeHintPending = false;
this.proxy?.beginHostDrain(reason);
this.leasePublisher?.beginHostDrain();
}

/** Host lock/suspend fence. Retains requested intent while retiring this generation. */
suspendForSystem(reason: string): Promise<void> {
if (this.stopped || !this.requestedEnabled) {
Expand All @@ -297,6 +314,9 @@ export class CuaDriverDesktopCoordinator {

/** Validate, bind and publish one generation. Child spawn remains lazy until initialize. */
enable(): Promise<CuaDriverCoordinatorSnapshot> {
if (this.hostDraining) {
return Promise.reject(new Error("cua_driver_host_draining"));
}
if (this.stopped) {
return Promise.reject(new Error("cua_driver_coordinator_stopped"));
}
Expand All @@ -309,6 +329,9 @@ export class CuaDriverDesktopCoordinator {
}

private enableForRevision(requestedRevision: number): Promise<CuaDriverCoordinatorSnapshot> {
if (this.hostDraining) {
return Promise.reject(new Error("cua_driver_host_draining"));
}
if (this.stopped) {
return Promise.reject(new Error("cua_driver_coordinator_stopped"));
}
Expand Down Expand Up @@ -354,6 +377,9 @@ export class CuaDriverDesktopCoordinator {
}

private beginEnable(): Promise<CuaDriverCoordinatorSnapshot> {
if (this.hostDraining) {
return Promise.reject(new Error("cua_driver_host_draining"));
}
if (this.enablePromise) {
return this.enablePromise;
}
Expand All @@ -370,6 +396,9 @@ export class CuaDriverDesktopCoordinator {
}

disable(reason = "disabled"): Promise<void> {
if (this.retainTransportWhileHostDrains()) {
return Promise.reject(new Error("cua_driver_host_draining"));
}
this.requestedRevision += 1;
this.requestedEnabled = false;
this.recoveryAttempt = 0;
Expand Down Expand Up @@ -400,6 +429,9 @@ export class CuaDriverDesktopCoordinator {
}

private beginDisable(reason: string): Promise<void> {
if (this.retainTransportWhileHostDrains()) {
return Promise.resolve();
}
if (this.disablePromise) {
return this.disablePromise;
}
Expand Down Expand Up @@ -491,6 +523,7 @@ export class CuaDriverDesktopCoordinator {
requireReleaseEvidence: this.options.requireReleaseEvidence ?? this.options.packaged ?? false,
};
const lock = await readCuaDriverProviderLock(paths.lockPath, lockOptions);
this.assertHostNotDraining();
const artifacts = await verifyCuaDriverProviderArtifacts({
platform: this.options.platform,
architecture: this.options.architecture,
Expand All @@ -499,11 +532,13 @@ export class CuaDriverDesktopCoordinator {
platformIdentityVerifier: this.platformIdentityVerifier,
requirePlatformIdentityVerification: this.options.packaged === true,
});
this.assertHostNotDraining();
const stateRoot = await createCuaDriverStateRoot({
userDataPath: this.options.userDataPath,
platform: this.options.platform,
platformProtector: this.stateRootProtector,
});
this.assertHostNotDraining();
this.resourcePaths = paths;
this.artifacts = artifacts;
this.stateRoot = stateRoot;
Expand Down Expand Up @@ -561,7 +596,7 @@ export class CuaDriverDesktopCoordinator {
}
},
onTerminal: ({ reason, unexpected, preSpawnFailureKind }) => {
if (this.host?.generation !== generation) {
if (this.hostDraining || this.host?.generation !== generation) {
return;
}
telemetry.emit(unexpected ? "error" : "info", "cua_driver.coordinator.host_terminal", { generation, reason });
Expand Down Expand Up @@ -599,8 +634,9 @@ export class CuaDriverDesktopCoordinator {
}
},
onManagedReadinessChanged: (message) => {
if (this.hostDraining) return;
const readiness = this.readinessController.acceptChanged?.(readinessContext(), message);
if (!readiness || this.host?.generation !== generation) {
if (this.hostDraining || !readiness || this.host?.generation !== generation) {
return;
}
if (readiness.ready && this.windowsSessionSuspended) {
Expand Down Expand Up @@ -639,7 +675,9 @@ export class CuaDriverDesktopCoordinator {
}
},
onInitialized: async () => {
if (this.hostDraining) return { callGate: "closed" as const };
const readiness = await this.readinessController.check(readinessContext());
if (this.hostDraining) return { callGate: "closed" as const };
if (this.host?.generation !== generation) {
throw new Error("cua_driver_readiness_generation_stale");
}
Expand All @@ -656,6 +694,7 @@ export class CuaDriverDesktopCoordinator {
? { windowsReadiness: readiness.windowsReadiness }
: {}),
});
if (this.hostDraining) return { callGate: "closed" as const };
}
const readinessAction = classifyCuaDriverInitialReadiness(readiness);
if (readinessAction !== "open_call_gate") {
Expand Down Expand Up @@ -705,6 +744,7 @@ export class CuaDriverDesktopCoordinator {
});
this.proxy = proxy;
const endpoint = await proxy.start();
this.assertHostNotDraining();
if (this.windowsSessionSuspended) {
return this.retainSuspendedGeneration(generation);
}
Expand Down Expand Up @@ -751,6 +791,7 @@ export class CuaDriverDesktopCoordinator {
});
this.leasePublisher = publisher;
await publisher.publish();
this.assertHostNotDraining();
if (this.windowsSessionSuspended) {
return this.retainSuspendedGeneration(generation);
}
Expand All @@ -766,6 +807,9 @@ export class CuaDriverDesktopCoordinator {
},
});
} catch (error) {
if (this.hostDraining) {
throw error;
}
if (this.windowsSessionSuspended) {
return this.retainSuspendedGeneration(generation);
}
Expand All @@ -777,9 +821,12 @@ export class CuaDriverDesktopCoordinator {
}

private async retainSuspendedGeneration(generation: number): Promise<CuaDriverCoordinatorSnapshot> {
this.assertHostNotDraining();
const reason = this.windowsSessionSuspensionReason;
await this.fenceProviderBeforeSessionBoundary(reason, generation);
this.assertHostNotDraining();
await this.cleanupPartiallyStarted(reason);
this.assertHostNotDraining();
return this.publishSnapshot({
lifecycle: "included",
providerState: "interactive_session_required",
Expand All @@ -789,9 +836,11 @@ export class CuaDriverDesktopCoordinator {
}

private async disableInternal(reason: string): Promise<void> {
if (this.retainTransportWhileHostDrains()) return;
if (this.enablePromise) {
await this.enablePromise.catch(() => undefined);
}
if (this.retainTransportWhileHostDrains()) return;
const publisher = this.leasePublisher;
const proxy = this.proxy;
const host = this.host;
Expand All @@ -800,18 +849,21 @@ export class CuaDriverDesktopCoordinator {
if (publisher || proxy || host) {
this.publishSnapshot({ lifecycle: "stopping", providerState: "desktop_unavailable", generation: this.generation, reason });
}
if (this.retainTransportWhileHostDrains()) return;
let leaseError: unknown;
let cleanupError: unknown;
try {
await publisher?.revoke();
} catch (error) {
leaseError = error;
}
if (this.retainTransportWhileHostDrains()) return;
try {
await proxy?.close(reason);
} catch (error) {
cleanupError = cleanupError ?? error;
}
if (this.retainTransportWhileHostDrains()) return;
if (host) {
try {
await host.stop(reason);
Expand Down Expand Up @@ -843,11 +895,13 @@ export class CuaDriverDesktopCoordinator {
}

private async cleanupPartiallyStarted(reason: string): Promise<void> {
if (this.retainTransportWhileHostDrains()) return;
const results = await Promise.allSettled([
this.leasePublisher?.revoke(),
this.proxy?.close(reason),
this.host?.stop(reason),
]);
if (this.retainTransportWhileHostDrains()) return;
if (results.some((result) => result.status === "rejected")) {
this.cleanupDebt = true;
return;
Expand Down Expand Up @@ -968,8 +1022,10 @@ export class CuaDriverDesktopCoordinator {

private startWindowsSessionSuspensionCleanup(reason: string, generation: number): void {
const pending = Promise.resolve().then(async () => {
if (this.hostDraining) return;
try {
await this.fenceProviderBeforeSessionBoundary(reason, generation);
if (this.hostDraining) return;
await this.beginDisable(reason);
if (this.requestedEnabled && !this.stopped && !this.cleanupDebt && this.windowsSessionSuspended) {
this.publishSnapshot({
Expand All @@ -990,12 +1046,14 @@ export class CuaDriverDesktopCoordinator {
}

private async fenceProviderBeforeSessionBoundary(reason: string, generation: number): Promise<void> {
if (this.hostDraining) return;
const host = this.host;
if (!host || host.generation !== generation) return;
if (typeof host.fenceInput !== "function") return;
try {
await host.fenceInput();
} catch (error) {
if (this.hostDraining) return;
const fenceReason = error instanceof CuaDriverInputFenceError && error.fenceCode === "timeout"
? "locked_control_input_fence_timeout"
: "locked_control_input_unavailable";
Expand Down Expand Up @@ -1130,7 +1188,7 @@ export class CuaDriverDesktopCoordinator {
generation: number,
providerState: Extract<CuaDriverProviderState, "corrupt" | "platform_unavailable">,
): void {
if (this.host?.generation !== generation) {
if (this.hostDraining || this.host?.generation !== generation) {
return;
}
this.proxy?.closeCallGate(reason);
Expand Down Expand Up @@ -1217,10 +1275,19 @@ export class CuaDriverDesktopCoordinator {
}

private isCurrentEnableIntent(requestedRevision: number): boolean {
return this.requestedEnabled && this.requestedRevision === requestedRevision;
return !this.hostDraining && this.requestedEnabled && this.requestedRevision === requestedRevision;
}

private retainTransportWhileHostDrains(): boolean {
return this.hostDraining && !this.stopped;
}

private assertHostNotDraining(): void {
if (this.hostDraining) throw new Error("cua_driver_host_draining");
}

private publishSnapshot(input: Omit<CuaDriverCoordinatorSnapshot, "generation"> & { readonly generation?: number }): CuaDriverCoordinatorSnapshot {
if (this.retainTransportWhileHostDrains()) return this.snapshotValue;
const integrity: CuaDriverIntegrityStatus = input.integrity
?? (input.providerState === "corrupt"
? "failed"
Expand Down
Loading
Loading