Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
476 commits
Select commit Hold shift + click to select a range
5918156
fix: release CLI cleanup claims after explicit exec creation rejection
liubing0806 Oct 21, 2026
41a1fd7
feat(slotgate): add opt-in fenced HTTP forwarding and Docker terminat…
liubing0806 Oct 21, 2026
0ffae4b
feat: coordinate backups and restores with durable global maintenance
liubing0806 Oct 21, 2026
46c9afe
test: reproduce unconfirmed egress owner and container termination
liubing0806 Oct 21, 2026
7e943f8
test: reproduce duplicate notifications across control planes
liubing0806 Oct 21, 2026
e726669
test(slotgate): require node-owned immutable Docker launch and crash …
liubing0806 Oct 21, 2026
20f52c2
test: retain unreceipted egress execution after PID identity changes
liubing0806 Oct 21, 2026
309d8bb
test: reject truncated notification provider responses
liubing0806 Oct 21, 2026
304e3d1
test: retain unknown Codex owner when changing egress policy
liubing0806 Oct 21, 2026
479c012
fix: verify egress execution identity and termination before release
liubing0806 Oct 21, 2026
e3a0c23
test: reproduce per-controller watchdog budget and fault divergence
liubing0806 Oct 21, 2026
988f1da
feat: share notification state and durable send attempts across pods
liubing0806 Oct 21, 2026
2ebc3f4
test: reproduce panel proxy operations bypassing VM claims
liubing0806 Oct 21, 2026
d371921
test: require durable proxy pool operation claims before control muta…
liubing0806 Oct 21, 2026
9ec6b69
test: reproduce stale catalog policy and duplicate scheduled syncs
liubing0806 Oct 21, 2026
1f59187
test: keep local model policies unchanged when PostgreSQL rejects writes
liubing0806 Oct 21, 2026
d2a2119
test: close completed proxy contexts and preserve nested operation va…
liubing0806 Oct 21, 2026
f4a685b
feat: persist watchdog recovery budgets and enforce global faults
liubing0806 Oct 21, 2026
43d8ba8
test: fence catalog credential work with shared VM operations
liubing0806 Oct 21, 2026
d6aabe8
test: retain proxy claims after caught nested failures
liubing0806 Oct 21, 2026
c2d7133
feat: coordinate catalog syncs and commit policy merges atomically
liubing0806 Oct 21, 2026
02803ed
feat: persist proxy pool management operation claims
liubing0806 Oct 21, 2026
77477cb
test: require pool ownership for idle proxy binding and cleanup
liubing0806 Oct 21, 2026
04a016b
test: reproduce monitor startup queries after bootstrap activity closes
liubing0806 Oct 21, 2026
b9fc746
fix: hold persistent claims across panel proxy effects
liubing0806 Oct 21, 2026
053e77d
feat(slotgate): launch and bind restricted node-owned Docker executors
liubing0806 Oct 21, 2026
97e00cf
test(logs): reproduce PostgreSQL NUL persistence failures
liubing0806 Oct 21, 2026
1c034cc
fix(logs): escape NUL characters before PostgreSQL writes
liubing0806 Oct 21, 2026
2a58a9e
test: reject package writes before VM ownership is acquired
liubing0806 Oct 21, 2026
a6ae7df
test: provide complete execution limits for package conflict
liubing0806 Oct 21, 2026
f666c92
fix: admit background monitor preparation after startup scope closes
liubing0806 Oct 21, 2026
e5a7cf9
fix: acquire package target claims before writing VM files
liubing0806 Oct 21, 2026
4fed292
test: seed complete committed VM package fixture
liubing0806 Oct 21, 2026
c5ed6d1
test: reproduce process-local circuit admission across controllers
liubing0806 Oct 21, 2026
3e5b3b1
test: retain official bootstrap ownership beyond HTTP scheduling
liubing0806 Oct 21, 2026
a81ca92
test(slotgate): require durable Claude terminal acknowledgement and r…
liubing0806 Oct 21, 2026
e5e4849
test: preserve explicit unknown official bootstrap results
liubing0806 Oct 21, 2026
55b52bc
test: keep bootstrap claims after auxiliary profile timeouts
liubing0806 Oct 21, 2026
157dbb8
test: release bootstrap validation failures before commands start
liubing0806 Oct 21, 2026
3304c45
fix: persist official bootstrap activity for its original promise
liubing0806 Oct 21, 2026
2da7e9f
test: reject VM metadata and identity writes during global executions
liubing0806 Oct 21, 2026
3cab77e
test: require execution receipts for Kubernetes fleet helper stops
liubing0806 Oct 21, 2026
b5d0441
feat(slotgate): persist validated Claude terminal completion and expo…
liubing0806 Oct 21, 2026
f020616
test: reproduce shutdown losing global background callbacks
liubing0806 Oct 21, 2026
0efdbb3
fix: guard VM metadata and identity mutations with persistent claims
liubing0806 Oct 21, 2026
8270189
test: require fleet ownership and preserve partial reload failures
liubing0806 Oct 21, 2026
11df85c
fix: await shared background work within shutdown deadline
liubing0806 Oct 21, 2026
e02b762
fix: retain fleet mutation claims through all target work
liubing0806 Oct 21, 2026
0274836
test: specify shared credential refresh admission and observation guards
liubing0806 Oct 21, 2026
07bb3a8
test: require global artifact and affected VM ownership
liubing0806 Oct 21, 2026
05fde38
test: define persistent shared refresh lifecycle and generation guara…
liubing0806 Oct 21, 2026
b76829a
fix: serialize shared VM artifacts with persistent task claims
liubing0806 Oct 21, 2026
713f6ca
test(slotgate): require captured fences and durable PG node completion
liubing0806 Oct 21, 2026
bf7615f
feat: coordinate circuit failures and half-open probes with shared ad…
liubing0806 Oct 21, 2026
66a580d
fix: return durable execution binding acknowledgement to transports
liubing0806 Oct 21, 2026
4371c58
fix: serialize observed credential refresh attempts across controllers
liubing0806 Oct 21, 2026
c8b2d9d
feat: coordinate credential refresh and publication through PostgreSQ…
liubing0806 Oct 21, 2026
f80d5ba
test: allow a new refresh after a successful unchanged credential
liubing0806 Oct 21, 2026
40d4809
feat(slotgate): bind captured node fences before jobs and require dur…
liubing0806 Oct 21, 2026
1b52a9d
docs: plan node-owned VM management and file publication RPCs
liubing0806 Oct 21, 2026
900b912
docs: correct remote publication helper references
liubing0806 Oct 21, 2026
ef529d2
test: distinguish finished credential refresh attempts from uncertain…
liubing0806 Oct 21, 2026
db86034
fix: allow refresh after a successful unchanged credential
liubing0806 Oct 21, 2026
492795c
test(slotgate): require existing kernel authentication headers on KSG2
liubing0806 Oct 21, 2026
ef018d2
fix(slotgate): preserve kernel authentication on fenced forwards
liubing0806 Oct 21, 2026
08a2d9d
fix: expose definitive credential attempt completion metadata
liubing0806 Oct 21, 2026
6ab5a50
test: bound refresh admission context to its exact active callback
liubing0806 Oct 21, 2026
9481ad1
test(pool): prevent binding jobs during an active refresh VM operation
liubing0806 Oct 21, 2026
c906f02
test: require shared claims around actual worker credential commands
liubing0806 Oct 21, 2026
e1e5d2a
fix(pool): serialize job binding with refresh VM operations
liubing0806 Oct 21, 2026
36da391
feat: guard worker OAuth commands with shared refresh and VM claims
liubing0806 Oct 21, 2026
e5bd870
test: keep attached proxy networks after confirmed helper shutdown
liubing0806 Oct 21, 2026
71a2518
test: reproduce bridge healing bypassing VM and proxy ownership
liubing0806 Oct 21, 2026
f355d92
test: coordinate quota recovery refreshes across requests
liubing0806 Oct 21, 2026
c567d77
test: retain Search admission when credential refresh is uncertain
liubing0806 Oct 21, 2026
d824fa2
fix: retain confirmed attached proxy networks after helper stop
liubing0806 Oct 21, 2026
a657c50
test: give synthetic Search backend observer its own SQL activity
liubing0806 Oct 21, 2026
1a724e7
test: reproduce bootstrap usage timeout losing execution ownership
liubing0806 Oct 21, 2026
8f3ff3f
test: persist account exclusion while a credential refresh remains ac…
liubing0806 Oct 21, 2026
54399fe
fix: persist account-wide exclusion for active VM operations
liubing0806 Oct 21, 2026
b231fd5
test: reproduce bootstrap auxiliary results releasing VM claims
liubing0806 Oct 21, 2026
d299a76
test: preserve refresh uncertainty after a completed model execution
liubing0806 Oct 21, 2026
bb39ce0
test: finish worker refresh only after its VM projection is persisted
liubing0806 Oct 21, 2026
b24ee7e
fix: retain bridge repair ownership across proxy and VM effects
liubing0806 Oct 21, 2026
befd24d
fix: pass credential refresh options through inference callbacks
liubing0806 Oct 21, 2026
0b1e745
test(slotgate): require durable allocation receipts and private live …
liubing0806 Oct 21, 2026
98c6c46
test: verify eighteen migrations and older snapshot restore
liubing0806 Oct 21, 2026
25df5ba
docs: record independent reviews and fixed-source verification progress
liubing0806 Oct 21, 2026
d2b6220
fix: preserve bootstrap execution proof across all producers
liubing0806 Oct 21, 2026
0689199
feat: coordinate request credential refreshes and retain uncertain ex…
liubing0806 Oct 21, 2026
8dd813e
test: reproduce manual refresh bypassing VM claims and unknown retries
liubing0806 Oct 21, 2026
6b00388
test: initialize Codex fixture before refresh guard regression
liubing0806 Oct 21, 2026
4aa560c
test: distinguish refused refreshes from uncertain started work durin…
liubing0806 Oct 21, 2026
4efafc9
test: stop after explicit unstarted refresh refusal with a completed …
liubing0806 Oct 21, 2026
2065da5
fix: release completed requests after explicitly refused credential r…
liubing0806 Oct 21, 2026
7e9039e
test: reproduce SFTP publication errors and early operation release
liubing0806 Oct 21, 2026
d4c2d10
test(slotgate): reject removal of an initialized management binding
liubing0806 Oct 21, 2026
c05da6f
fix: await original remote slot file publication and propagate uncert…
liubing0806 Oct 21, 2026
12088dd
fix: coordinate manual credential refresh before VM mutations
liubing0806 Oct 21, 2026
f1a2e18
test: retain uncertain publication before model submission
liubing0806 Oct 21, 2026
31717e6
test: retain parent VM operations after nested uncertain work
liubing0806 Oct 21, 2026
0d5231f
test(vm): require immutable operation identity handles
liubing0806 Oct 21, 2026
ea18a21
test: bound the unknown preparation retry fixture
liubing0806 Oct 21, 2026
3485404
feat(slotgate): authorize initial allocation with durable private PG …
liubing0806 Oct 21, 2026
a37c4c4
test: exercise protocol publication waiting and unknown occupancy
liubing0806 Oct 21, 2026
63e641b
fix: await inference publications and retain uncertain preparation
liubing0806 Oct 21, 2026
370111b
test: reproduce completed bootstrap failure retaining package claims
liubing0806 Oct 21, 2026
a9961b9
test: verify publication uncertainty against durable admissions
liubing0806 Oct 21, 2026
4c1c89f
ci: download Go modules before offline protocol fixtures
liubing0806 Oct 21, 2026
da7700b
fix: release completed package bootstrap failures without losing busi…
liubing0806 Oct 21, 2026
04f92c9
test: retain unknown OAuth refresh attempts before retry or later obs…
liubing0806 Oct 21, 2026
08a1828
fix: stop retrying OAuth refresh after an unknown accepted attempt
liubing0806 Oct 21, 2026
1f2299c
test: reproduce validation retaining VM claims and masking standalone…
liubing0806 Oct 21, 2026
acf9ac3
test: reproduce scheduled backup failure when discovery is refused du…
liubing0806 Oct 21, 2026
f011a22
fix: distinguish pre-admission discovery refusal during backup drain
liubing0806 Oct 21, 2026
44e48fa
test: reject mock gateway touching host Docker networks
liubing0806 Oct 21, 2026
f52285d
test: release protocol capacity after confirmed publication failure
liubing0806 Oct 21, 2026
68d2b54
fix: return unused VM claims after memory validation failures
liubing0806 Oct 21, 2026
e0ad3f5
test: distinguish completed remote preparation from unknown publication
liubing0806 Oct 21, 2026
04dde1c
fix: preserve confirmed remote preparation completion without masking…
liubing0806 Oct 21, 2026
a5843c0
test: keep Codex catalog refresh fixtures independent of registry req…
liubing0806 Oct 21, 2026
4307658
test: initialize PostgreSQL for Codex catalog policy persistence
liubing0806 Oct 21, 2026
f9f396d
test: isolate mock gateways from host Docker and preserve egress rece…
liubing0806 Oct 21, 2026
1b6deff
test: cover completed and uncertain protocol publication capacity
liubing0806 Oct 21, 2026
9d06160
test: check fleet publication before API key reservation
liubing0806 Oct 21, 2026
06e8008
test: exercise publication lifecycle through the real shared failover…
liubing0806 Oct 21, 2026
e907692
fix: release protocol activity after confirmed preparation failure
liubing0806 Oct 21, 2026
e5b91e6
test: define explicit Kubernetes HA mode distinction
liubing0806 Oct 21, 2026
dca0611
feat: distinguish opt-in Kubernetes HA from singleton mode
liubing0806 Oct 21, 2026
60d6359
test: verify discovery admission refusal without persistence failure
liubing0806 Oct 21, 2026
da899ce
test: require PostgreSQL VM authority for HA controllers
liubing0806 Oct 21, 2026
8f8c606
feat: read HA VM metadata exclusively from PostgreSQL
liubing0806 Oct 21, 2026
a6dc87a
test: require trusted node capability capture and typed health
liubing0806 Oct 21, 2026
ebecaff
test: pin trusted TLS settings before asynchronous capability capture
liubing0806 Oct 21, 2026
11c7606
feat: capture trusted node capabilities and require fenced health
liubing0806 Oct 21, 2026
5291b80
test: require durable initial publication before node Docker launch
liubing0806 Oct 21, 2026
ed80951
feat: publish node-owned initial files and bind Docker launch to a ma…
liubing0806 Oct 21, 2026
31aeaa0
test: require fixed HA node trust and deny legacy management routes
liubing0806 Oct 21, 2026
f4b730d
feat: pin HA node trust and restrict runtime routes to supported oper…
liubing0806 Oct 21, 2026
adc60ea
test: reject legacy host mutation and Pod VM writes in HA
liubing0806 Oct 21, 2026
ec90dfd
feat: prevent HA controllers from invoking legacy host mutations
liubing0806 Oct 21, 2026
6de3c0f
test: specify independent node publication and launch grants
liubing0806 Oct 21, 2026
cac6407
feat: persist independent node publication and launch authority
liubing0806 Oct 21, 2026
de5a47c
docs: record independent review rounds and fixed-source regression ev…
liubing0806 Oct 21, 2026
ceb410e
test: require captured read-only node health and durable credential i…
liubing0806 Oct 21, 2026
7ae6c58
feat: read captured node health with durable credential identity
liubing0806 Oct 21, 2026
f61e5e2
test: require durable HA request links across PostgreSQL peers
liubing0806 Oct 21, 2026
0fa2c04
test: reproduce restore blocked by later request-context foreign key
liubing0806 Oct 21, 2026
6a65d3d
feat: persist exact HA request and execution ownership links
liubing0806 Oct 21, 2026
a62382f
test: reject unfenced protocol backends in explicit HA mode
liubing0806 Oct 21, 2026
ff02b88
fix: fence HA protocol backends and skip Pod publication
liubing0806 Oct 21, 2026
d12f5ea
test: require captured node execution in HA scheduling
liubing0806 Oct 21, 2026
ca8be11
fix: restore older snapshots with later same-schema foreign keys
liubing0806 Oct 21, 2026
ea21db4
feat: schedule HA requests using captured node capabilities
liubing0806 Oct 21, 2026
495769d
test: specify typed node management transport and receipt persistence
liubing0806 Oct 21, 2026
ffea6c1
test: distinguish unstarted node publication refusal from lost acknow…
liubing0806 Oct 21, 2026
1336045
feat: publish and launch node slots through pinned typed management RPC
liubing0806 Oct 21, 2026
1533d02
test: require file-free captured node identity in HA mode
liubing0806 Oct 21, 2026
d1a4ed2
fix: construct HA identity from node proof and PostgreSQL metadata
liubing0806 Oct 21, 2026
4e6d1a1
test: retain node response consumption after controller disconnect
liubing0806 Oct 21, 2026
5960ecf
fix: drain the original node execution after controller disconnect
liubing0806 Oct 21, 2026
422088f
test: require host-free multi-process HA bootstrap
liubing0806 Oct 21, 2026
f4ef24a
feat: bootstrap HA controllers without legacy host permissions
liubing0806 Oct 21, 2026
a5e0318
test: exclude mixed HA and singleton controllers with one mode guard
liubing0806 Oct 21, 2026
d39559d
fix: exclude singleton controllers while sharing the HA mode guard
liubing0806 Oct 21, 2026
13ecd76
test: recover original node command status without controller tickets
liubing0806 Oct 21, 2026
f640c07
feat: expose original node command recovery status without tickets
liubing0806 Oct 21, 2026
80e073d
test: reject new node execution authorized by a previous boot
liubing0806 Oct 21, 2026
76ef766
fix: reject captured execution authority from a previous host boot
liubing0806 Oct 21, 2026
46fd5fa
test: specify owner lifetime proof and exact HA request sealing
liubing0806 Oct 21, 2026
76888d6
feat: prove disconnected owners before sealing exact HA requests
liubing0806 Oct 21, 2026
e2792bc
feat: link supported HA inference requests to recovery contexts
liubing0806 Oct 21, 2026
f67446b
test: persist bounded node usage receipts with original execution com…
liubing0806 Oct 21, 2026
c0ad8db
feat: persist public usage receipts with node execution completion
liubing0806 Oct 21, 2026
8d5ff22
test: require original node proof for exact orphan request recovery
liubing0806 Oct 21, 2026
ea104d8
feat: recover exact orphan execution graphs from original node comple…
liubing0806 Oct 21, 2026
bf29220
test: retain unsettled node proofs and permit fresh HA activity contexts
liubing0806 Oct 21, 2026
1d0e0f7
fix: preserve unsettled HA proofs and admit fresh activity contexts
liubing0806 Oct 21, 2026
b0ee367
test: require host-free HA container entrypoint and shared secrets
liubing0806 Oct 21, 2026
a6b67f3
feat: start HA images with shared secrets and without host assets
liubing0806 Oct 21, 2026
e72112e
test: seal an original undispatched node command before delayed send
liubing0806 Oct 21, 2026
59487d0
feat: persist a deny-only seal for original undispatched node commands
liubing0806 Oct 21, 2026
ec07736
test: stabilize egress fixture and cover HA credential migration guard
liubing0806 Oct 21, 2026
0149edc
test: reproduce HA Responses status regression
liubing0806 Oct 21, 2026
1f62f85
fix: preserve HA Responses protocol rejection context
liubing0806 Oct 21, 2026
ed717a0
test: reproduce HA routing restarting unsupported monitors
liubing0806 Oct 21, 2026
f44b646
fix: keep unsupported HA probes disabled after routing updates
liubing0806 Oct 21, 2026
cfe50d6
test: bind KSG2 fixture to the current node boot
liubing0806 Oct 21, 2026
cf25009
test: execute normal HA HTTP requests through PG node authority
liubing0806 Oct 21, 2026
b4fff2f
feat: add explicit multi-node HA Kubernetes deployment overlay
liubing0806 Oct 21, 2026
a6c0f0e
test: require node private refresh credentials and authoritative health
liubing0806 Oct 21, 2026
2ef24bf
fix: keep node refresh tokens outside guest credential projections
liubing0806 Oct 21, 2026
248af6e
test: specify node refresh attempt and generation fencing
liubing0806 Oct 21, 2026
98640ce
feat: persist fenced node credential refresh attempts
liubing0806 Oct 21, 2026
8c19178
test: require exact durable node credential refresh authorization
liubing0806 Oct 21, 2026
600e39c
feat: authorize typed node-owned credential refresh with durable claims
liubing0806 Oct 21, 2026
1b31fdd
test: require file-free HA credential refresh producers
liubing0806 Oct 21, 2026
c1c0a78
fix: use typed node credentials in HA refresh producers
liubing0806 Oct 21, 2026
3ad659a
fix: require exact node account before credential health reads
liubing0806 Oct 21, 2026
43ff501
test: specify immutable node recovery status and strict usage receipts
liubing0806 Oct 21, 2026
4420b3d
feat: read original node completion with exact public usage receipts
liubing0806 Oct 21, 2026
00dffaf
test: require dispatch-time HA price snapshots before billing recovery
liubing0806 Oct 21, 2026
3699a5e
feat: persist HA dispatch price snapshots and settlement audit schema
liubing0806 Oct 21, 2026
753e92f
test: specify idempotent HA key settlement from original node receipts
liubing0806 Oct 21, 2026
769a384
feat: reconcile HA key quotas once from exact command receipts
liubing0806 Oct 21, 2026
00f15d2
test: require HA protocol to capture and settle original dispatch evi…
liubing0806 Oct 21, 2026
b717064
feat: bind HA protocol billing to dispatch snapshots and original nod…
liubing0806 Oct 21, 2026
6c161f7
test: retain aged attempt and job evidence until exact HA recovery ends
liubing0806 Oct 21, 2026
103779e
fix: retain exact HA attempts while execution or billing recovery is …
liubing0806 Oct 21, 2026
17b4c5e
test: specify bounded HA orphan scan with independent item recovery
liubing0806 Oct 21, 2026
4c1d1a8
feat: expose bounded HA recovery scan without starting a timer
liubing0806 Oct 21, 2026
bcefd82
test: preserve pre-dispatch HA validation failures without charging
liubing0806 Oct 21, 2026
809ebb5
fix: keep HA pre-dispatch validation errors uncharged and close late …
liubing0806 Oct 21, 2026
6f5633b
test: require a standalone synthetic node with explicit listener and …
liubing0806 Oct 21, 2026
2ab0b94
test: expose a controllable synthetic node fixture for isolated HA de…
liubing0806 Oct 21, 2026
ceb2775
fix: connect HA billing to original node receipts and preserve backup…
liubing0806 Oct 21, 2026
54f203c
test: specify HA recovery monitor lifecycle and exact PG settlement
liubing0806 Oct 21, 2026
617131f
feat: poll exact HA orphan recovery under completed scan activities
liubing0806 Oct 21, 2026
564580f
test: verify AT-only projection with the prebuilt kernel and CLI
liubing0806 Oct 21, 2026
0fee98f
test: require trusted offline HA node bootstrap commands
liubing0806 Oct 21, 2026
835d20d
test: cover bootstrap refusal and unknown execution boundaries
liubing0806 Oct 21, 2026
d304984
feat: add trusted offline HA node bootstrap CLI
liubing0806 Oct 21, 2026
e632748
test: require public authority schema in bootstrap output
liubing0806 Oct 21, 2026
933b9fd
fix: report the initialized node authority schema
liubing0806 Oct 21, 2026
3e56ed5
feat: run HA orphan recovery within gateway lifecycle
liubing0806 Oct 21, 2026
90a64af
test: reproduce unbound pre-dispatch command IDs retaining HA quota
liubing0806 Oct 21, 2026
7f3a4c7
fix: audit undispatched HA requests before selecting a billable command
liubing0806 Oct 21, 2026
50bc1f8
test: reproduce unsent refresh grant generation conflict
liubing0806 Oct 21, 2026
5f549b9
fix: persist terminal state for unsent node refresh grants
liubing0806 Oct 21, 2026
4de403f
fix: identify HA volume mount deletions by their merge keys
liubing0806 Oct 21, 2026
c6b8b1e
test: reproduce killed HA scan activities blocking maintenance
liubing0806 Oct 21, 2026
9050cd6
fix: recover exact read-only HA scans after proven owner loss
liubing0806 Oct 21, 2026
b9f86df
test: reproduce allocation pin rejection retaining bootstrap claims
liubing0806 Oct 21, 2026
b1a6c95
fix: retire proven unsent node allocation grants explicitly
liubing0806 Oct 21, 2026
0d9c434
test: initialize PostgreSQL for shared HA database fixtures
liubing0806 Oct 21, 2026
73f2026
test: require zero-exit HA SIGTERM under continued SSE keepalive traffic
liubing0806 Oct 21, 2026
f53e005
fix: close drained HTTP keepalive connections after accepted response…
liubing0806 Oct 21, 2026
8071a2c
test: reproduce unsafe bootstrap IDs and implicit business migration
liubing0806 Oct 21, 2026
48aa2a2
fix: verify bootstrap prerequisites before node or business mutations
liubing0806 Oct 21, 2026
9ae50ab
test: reproduce mixed-case bootstrap schema rejection
liubing0806 Oct 21, 2026
ff4e434
fix: quote mixed-case schema during bootstrap verification
liubing0806 Oct 21, 2026
37a4cac
docs: record scoped multi-node HA verification and independent reviews
liubing0806 Oct 21, 2026
b8806d9
feat: official Claude Code and Codex passthrough (#674)
cedar-cli Oct 22, 2026
d73c51d
release: cut v1.3.212
cursoragent Oct 22, 2026
a8a9451
fix(213): 官方透传仍 rebuild outbound session,内容继续完全透传 (#676)
dofastted Oct 22, 2026
d96c62b
merge: reconcile main updates with multi-replica control plane
liubing0806 Oct 22, 2026
2afeb3d
release: cut v1.3.213
cursoragent Oct 22, 2026
fe5af8c
merge: include upstream passthrough session correction
liubing0806 Oct 22, 2026
2adb081
feat: add manual Claude subscription lookup credentials
liubing0806 Oct 27, 2026
09ced21
merge: integrate upstream v1.4.011 into Kubernetes control plane
liubing0806 Oct 27, 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
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,11 @@ HOST=0.0.0.0
# PUBLIC_BASE_URL=https://example.com
# PUBLIC_HOST=127.0.0.1
# GITHUB_TOKEN= # 可选。面板查 GitHub Release 提高限额;也可用 VM2API_GITHUB_TOKEN

# PostgreSQL 17. The installer fills a random password for a new local database.
# External PG: set VM2API_DATABASE_URL and clear COMPOSE_PROFILES.
COMPOSE_PROFILES=postgres
VM2API_POSTGRES_PORT=55432
VM2API_POSTGRES_PASSWORD=
VM2API_DATABASE_URL=
# Preserve VM2API_DB_SECRET when importing an existing SQLite database.
98 changes: 80 additions & 18 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# PR/main gate against the production baseline: deploy/payload.json pins the
# exact ELFs running live, so CI only checks source and the pinned bytes.
# PR/main gate: Node + Go + pinned amd64 payload ELFs + web + native ARM64 deployment.
name: ci

on:
Expand All @@ -8,19 +7,30 @@ on:
pull_request:
workflow_dispatch:

# Only PR runs supersede each other; every main push keeps its own verdict so
# it is visible when main turned red and when it recovered.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
cancel-in-progress: true

permissions:
contents: read

jobs:
ci:
unit:
runs-on: ubuntu-latest
timeout-minutes: 15
timeout-minutes: 20
services:
postgres:
image: postgres:17-bookworm
env:
POSTGRES_USER: vm2api
POSTGRES_PASSWORD: vm2api-ci-test
POSTGRES_DB: vm2api_test
ports: [5432:5432]
options: >-
--health-cmd "pg_isready -U vm2api -d vm2api_test"
--health-interval 5s --health-timeout 3s --health-retries 12
env:
VM2API_TEST_DATABASE_URL: postgresql://vm2api:vm2api-ci-test@127.0.0.1:5432/vm2api_test
steps:
- uses: actions/checkout@v7
with:
Expand All @@ -45,30 +55,82 @@ jobs:
cache-dependency-path: |
worker/go.sum
api-kernel/go.sum
- uses: pnpm/action-setup@v6
with:
version: 10
cache: true
cache_dependency_path: web/pnpm-lock.yaml
- name: download worker modules for offline Go protocol fixtures
working-directory: worker
run: go mod download
- run: npm ci
- name: format and syntax
- name: PostgreSQL 17 backup clients
run: |
sudo install -d /usr/share/postgresql-common/pgdg
curl --fail --silent --show-error https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo tee /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc >/dev/null
. /etc/os-release
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $VERSION_CODENAME-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list >/dev/null
sudo apt-get update
sudo apt-get install -y postgresql-client-17 python3-yaml
echo /usr/lib/postgresql/17/bin >> "$GITHUB_PATH"
/usr/lib/postgresql/17/bin/pg_dump --version
- name: pinned Kubernetes manifest tooling
run: |
curl --fail --silent --show-error --location -o "$RUNNER_TEMP/kubectl" https://dl.k8s.io/release/v1.36.4/bin/linux/amd64/kubectl
curl --fail --silent --show-error --location -o "$RUNNER_TEMP/kubectl.sha256" https://dl.k8s.io/release/v1.36.4/bin/linux/amd64/kubectl.sha256
python3 -c 'import hashlib,os,pathlib; root=pathlib.Path(os.environ["RUNNER_TEMP"]); assert hashlib.sha256((root/"kubectl").read_bytes()).hexdigest()==(root/"kubectl.sha256").read_text().strip()'
chmod 755 "$RUNNER_TEMP/kubectl"
echo "$RUNNER_TEMP" >> "$GITHUB_PATH"
- name: panel user and onboarding regression tests
run: node --import ./test/pg-setup.mjs --test test/unit/panel-users.test.mjs test/unit/onboarding.test.mjs test/e2e/panel-users.e2e.test.mjs
- name: format-check
run: npx biome format
- name: syntax-check Node source and scripts
run: |
npx biome format
test -z "$(gofmt -l worker api-kernel)" || { gofmt -l worker api-kernel; exit 1; }
find src scripts -name '*.mjs' -print0 | xargs -0 -n1 node --check
- name: pinned payload
- name: slot payloads and egress helper used by the unit tests
run: |
node scripts/fetch-payload.mjs
node scripts/fetch-payload.mjs --check
npm run fetch:payload
npm run build:egress
- run: npm run test:unit
- run: npm run test:e2e
- name: ARM64 host preparation and rollback tests
run: /usr/bin/python3 -m unittest discover -s test/deploy -v
- name: PostgreSQL application role permissions
run: python3 test/deploy/smoke_postgres_role.py
- name: go vet and test
run: |
(cd worker && go vet ./... && go test ./...)
(cd api-kernel && go vet ./... && go test ./...)
- uses: pnpm/action-setup@v6
with:
version: 10
- name: web
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm format:check
pnpm test
pnpm build

arm64:
runs-on: ubuntu-24.04-arm
timeout-minutes: 20
steps:
- uses: actions/checkout@v7
- name: prepare pinned x86 QEMU handler
run: |
python3 deploy/prepare-arm64.py
python3 deploy/prepare-arm64.py --check
python3 deploy/prepare-arm64.py
- name: verify real kernel rollback on the disposable runner
run: python3 test/deploy/smoke_binfmt_restore.py
- name: validate ARM64 Compose configuration
run: |
python3 deploy/init-arm64-env.py --port 18787 --container-name vm2api-arm64-ci
docker compose -f docker-compose.yml -f docker-compose.arm64.yml config --quiet
- name: build native control plane
run: docker build --progress=plain --platform linux/arm64 -f deploy/Dockerfile.arm64-control -t vm2api-arm64-control:ci .
- name: verify native runtime and emulated payloads
run: python3 test/deploy/smoke_arm64_image.py vm2api-arm64-control:ci
- name: build and verify a different checkout VERSION
run: |
trap 'git restore -- VERSION' EXIT
python3 -c 'from pathlib import Path; p = Path("VERSION"); p.write_text(p.read_text().strip() + "-arm64-build-check\n")'
docker build --progress=plain --platform linux/arm64 -f deploy/Dockerfile.arm64-control -t vm2api-arm64-control:ci-version .
python3 test/deploy/smoke_arm64_image.py vm2api-arm64-control:ci-version
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## 未发布

- 本地开发分支保留 PostgreSQL、Kubernetes/HA、账号隔离以及官方透传与出站会话重建改动。
- 保留 Claude 订阅列表、卡片和详情查询功能。查询 sessionKey 独立加密保存;本轮保留已知的 PUT 删除竞争和 HA 订阅接口未接入问题。
- 使用新增 PostgreSQL 迁移 `023_usage_logs_image_generation.sql` 适配上游图像用量字段;既有 `001`–`022` 迁移不变。

## 1.4.011 — 2026-10-27

- #736:修复 KVM 槽在关机或「恢复服务」时因换镜像重建容器却未回填 `KIN_KVM_MAC` / `KIN_KVM_DISK_SERIAL` 导致 kin-kvm 启动失败;停/启与恢复路径会从槽配置、旧容器 env 或已采集的 guest hardware 回填并写回 `vm.machine`,env 不完整的容器会强制重建。
Expand Down
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Control plane. Only source is in git: the console and kin-api-kernel build here; the
# slot payloads and Go helpers come from the release pinned in deploy/payload.json.

ARG BUILDPLATFORM=linux/amd64
FROM --platform=$BUILDPLATFORM node:22-bookworm-slim AS web
RUN npm install -g pnpm@10
WORKDIR /src/web
Expand All @@ -27,6 +28,17 @@ FROM node:22-bookworm-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates iptables iproute2 python3 \
&& rm -rf /var/lib/apt/lists/*
# Debian Bookworm defaults to PG15; backups require the PG17 client.
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& install -d /usr/share/postgresql-common/pgdg \
&& curl --fail --silent --show-error -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc \
&& echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends postgresql-client-17 \
&& pg_dump --version | grep -E ' 17\.' \
&& pg_restore --version | grep -E ' 17\.' \
&& rm -rf /var/lib/apt/lists/*
COPY --from=docker:27-cli /usr/local/bin/docker /usr/local/bin/docker
WORKDIR /opt/vm2api
COPY package.json package-lock.json ./
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,9 @@ chmod 600 .env
docker compose pull && docker compose up -d
```

数据库使用 PostgreSQL 17。新安装由安装脚本生成内置数据库密码;手工 Compose 安装先配置 `.env` 中的 `VM2API_POSTGRES_PASSWORD`。已有 SQLite 安装须先离线导入,保留原 `VM2API_DB_SECRET`。外部数据库、备份恢复和验证步骤见 [PostgreSQL 部署说明](docs/deploy/postgresql.md)。


### 3. 访问与调用

服务启动后,系统暴露统一服务端口(默认 `8787`):
Expand Down
29 changes: 28 additions & 1 deletion api-kernel/internal/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"crypto/subtle"
"encoding/json"
"io"
"mime"
"net/http"
"strings"

Expand Down Expand Up @@ -94,7 +95,33 @@ func (s *Server) forward(w http.ResponseWriter, r *http.Request) {
}
}
w.WriteHeader(resp.StatusCode)
_, _ = io.Copy(w, resp.Body)
mediaType, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type"))
if mediaType == "text/event-stream" {
if flusher, ok := w.(http.Flusher); ok {
flusher.Flush()
if _, err := io.Copy(flushingWriter{writer: w, flusher: flusher}, resp.Body); err != nil {
panic(http.ErrAbortHandler)
}
return
}
}
if _, err := io.Copy(w, resp.Body); err != nil {
panic(http.ErrAbortHandler)
}
}

// Expose only Write so io.Copy cannot bypass flushing through ReaderFrom.
type flushingWriter struct {
writer io.Writer
flusher http.Flusher
}

func (w flushingWriter) Write(p []byte) (int, error) {
n, err := w.writer.Write(p)
if n > 0 {
w.flusher.Flush()
}
return n, err
}

func jsonQuote(s string) string {
Expand Down
102 changes: 102 additions & 0 deletions api-kernel/internal/server/server_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package server

import (
"bufio"
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"

"github.com/dofastted/kin-gateway/api-kernel/internal/pool"
)
Expand Down Expand Up @@ -43,3 +46,102 @@ func TestForwardCopiesUpstream(t *testing.T) {
t.Fatalf("body %s", rec.Body.String())
}
}

func TestForwardStreamsTextDeltasBeforeUpstreamCompletes(t *testing.T) {
allowSecond := make(chan struct{}, 1)
up := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream; charset=utf-8")
_, _ = io.WriteString(w, "data: {\"type\":\"content_block_delta\",\"delta\":{\"type\":\"text_delta\",\"text\":\"first\"}}\n\n")
w.(http.Flusher).Flush()
select {
case <-allowSecond:
case <-r.Context().Done():
return
}
_, _ = io.WriteString(w, "data: {\"type\":\"content_block_delta\",\"delta\":{\"type\":\"text_delta\",\"text\":\"second\"}}\n\n")
w.(http.Flusher).Flush()
}))
defer up.Close()

gateway := httptest.NewServer((&Server{Token: "t", Pool: pool.NewManager()}).Handler())
defer gateway.Close()
defer close(allowSecond)
env, _ := json.Marshal(forwardEnv{URL: up.URL, Body: `{}`})
req, _ := http.NewRequest(http.MethodPost, gateway.URL+"/internal/forward", strings.NewReader(string(env)))
req.Header.Set("X-Kin-Internal-Token", "t")
client := gateway.Client()
client.Timeout = 3 * time.Second
type firstRead struct {
response *http.Response
reader *bufio.Reader
line string
err error
}
first := make(chan firstRead, 1)
go func() {
resp, err := client.Do(req)
if err != nil {
first <- firstRead{err: err}
return
}
reader := bufio.NewReader(resp.Body)
line, err := reader.ReadString('\n')
first <- firstRead{response: resp, reader: reader, line: line, err: err}
}()

var got firstRead
select {
case got = <-first:
if got.response != nil {
defer got.response.Body.Close()
}
if got.err != nil {
t.Fatal(got.err)
}
case <-time.After(time.Second):
t.Fatal("first nonempty text delta was buffered while the upstream awaited the second delta")
}
if got.response.StatusCode != http.StatusOK || !strings.Contains(got.line, `"text":"first"`) {
t.Fatalf("unexpected first delta: status=%d line=%q", got.response.StatusCode, got.line)
}
allowSecond <- struct{}{}
rest, err := io.ReadAll(got.reader)
if err != nil {
t.Fatal(err)
}
if !strings.Contains(string(rest), `"text":"second"`) {
t.Fatalf("missing second text delta: %q", rest)
}
}

func TestForwardDoesNotTurnTruncatedUpstreamIntoCleanEOF(t *testing.T) {
for _, contentType := range []string{"application/json", "text/event-stream"} {
t.Run(contentType, func(t *testing.T) {
up := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
conn, writer, err := w.(http.Hijacker).Hijack()
if err != nil {
t.Error(err)
return
}
defer conn.Close()
_, _ = fmt.Fprintf(writer, "HTTP/1.1 200 OK\r\nContent-Type: %s\r\nTransfer-Encoding: chunked\r\n\r\nc\r\npartial body\r\n", contentType)
_ = writer.Flush() // Deliberately omit the final chunk.
}))
defer up.Close()
gateway := httptest.NewServer((&Server{Token: "t", Pool: pool.NewManager()}).Handler())
defer gateway.Close()
env, _ := json.Marshal(forwardEnv{URL: up.URL, Body: `{}`})
req, _ := http.NewRequest(http.MethodPost, gateway.URL+"/internal/forward", strings.NewReader(string(env)))
req.Header.Set("X-Kin-Internal-Token", "t")
resp, err := gateway.Client().Do(req)
if err != nil {
return // Aborting before headers also preserves the transport failure.
}
defer resp.Body.Close()
_, err = io.ReadAll(resp.Body)
if err == nil {
t.Fatal("truncated upstream was reported as a clean downstream EOF")
}
})
}
}
11 changes: 11 additions & 0 deletions deploy/Dockerfile.arm64-control
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,17 @@ FROM --platform=linux/arm64 ${NODE_IMAGE}
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates iptables iproute2 python3 \
&& rm -rf /var/lib/apt/lists/*
# Debian Bookworm defaults to PG15; backups require the PG17 client.
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& install -d /usr/share/postgresql-common/pgdg \
&& curl --fail --silent --show-error -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc \
&& echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
&& apt-get update \
&& apt-get install -y --no-install-recommends postgresql-client-17 \
&& pg_dump --version | grep -E ' 17\.' \
&& pg_restore --version | grep -E ' 17\.' \
&& rm -rf /var/lib/apt/lists/*
COPY --from=dockercli /usr/local/bin/docker /usr/local/bin/docker
WORKDIR /opt/vm2api
COPY package.json package-lock.json ./
Expand Down
Loading