7 changed files with 15 additions and 11 deletions
@@ -13,6 +13,7 @@ test('a package upgrade refreshes only a proven managed runtime, once per packag
const stamp = {commit: 'b'.repeat(40), source: 'git'} const stamp = {commit: 'b'.repeat(40), source: 'git'}
assert.equal(needsPackagedRuntimeUpgrade(true, stamp, VALID_MARKER), true) assert.equal(needsPackagedRuntimeUpgrade(true, stamp, VALID_MARKER), true)
assert.equal(needsPackagedRuntimeUpgrade(true, stamp, {...VALID_MARKER, pinnedCommit: stamp.commit}), false) assert.equal(needsPackagedRuntimeUpgrade(true, stamp, {...VALID_MARKER, pinnedCommit: stamp.commit}), false)
assert.equal(needsPackagedRuntimeUpgrade(true, stamp, {...VALID_MARKER, pinnedCommit: 'c'.repeat(40), packageCommit: stamp.commit}), false)
assert.equal(needsPackagedRuntimeUpgrade(false, stamp, VALID_MARKER), false) assert.equal(needsPackagedRuntimeUpgrade(false, stamp, VALID_MARKER), false)
assert.equal(needsPackagedRuntimeUpgrade(true, stamp, null), false) assert.equal(needsPackagedRuntimeUpgrade(true, stamp, null), false)
assert.equal(needsPackagedRuntimeUpgrade(true, {commit: '0'.repeat(40), source: 'fallback'}, VALID_MARKER), false) assert.equal(needsPackagedRuntimeUpgrade(true, {commit: '0'.repeat(40), source: 'fallback'}, VALID_MARKER), false)
@@ -1,5 +1,6 @@
export interface BootstrapMarkerLike { export interface BootstrapMarkerLike {
pinnedCommit?: unknown pinnedCommit?: unknown
packageCommit?: unknown
schemaVersion?: unknown schemaVersion?: unknown
} }
@@ -12,7 +13,7 @@ export function needsPackagedRuntimeUpgrade(
): boolean { ): boolean {
return Boolean(packaged && stamp?.source !== 'fallback' && return Boolean(packaged && stamp?.source !== 'fallback' &&
/^[0-9a-f]{40}$/i.test(stamp?.commit || '') && !/^0+$/.test(stamp?.commit || '') && /^[0-9a-f]{40}$/i.test(stamp?.commit || '') && !/^0+$/.test(stamp?.commit || '') &&
hasValidBootstrapMarker(marker, 1) && marker?.pinnedCommit !== stamp?.commit) hasValidBootstrapMarker(marker, 1) && (marker?.packageCommit || marker?.pinnedCommit) !== stamp?.commit)
} }
export interface ActiveRuntimeState { export interface ActiveRuntimeState {
@@ -143,8 +143,8 @@ test('resolveMarkerPinnedCommit prefers real HEAD over fallback stamp zeros', ()
resolveMarkerPinnedCommit({ commit: 'd'.repeat(40), branch: 'main' }, '/tmp/checkout', { resolveMarkerPinnedCommit({ commit: 'd'.repeat(40), branch: 'main' }, '/tmp/checkout', {
resolveHead: () => realHead resolveHead: () => realHead
}), }),
'd'.repeat(40), realHead,
'packaged real pin wins over checkout HEAD' 'marker reports the actual installed checkout, including a preserved newer runtime'
) )
assert.equal( assert.equal(
resolveMarkerPinnedCommit({ commit: ZERO_COMMIT, branch: 'main' }, '/tmp/missing', { resolveMarkerPinnedCommit({ commit: ZERO_COMMIT, branch: 'main' }, '/tmp/missing', {
+7 -6
View File
@@ -111,16 +111,16 @@ function resolveMarkerPinnedCommit(
): string | null { ): string | null {
const resolveHead = opts.resolveHead || resolveCheckoutHead const resolveHead = opts.resolveHead || resolveCheckoutHead
if (installStamp && isPinnedCommit(installStamp.commit)) {
return installStamp.commit
}
const head = resolveHead(activeRoot) const head = resolveHead(activeRoot)
if (head) { if (head) {
return head return head
} }
if (installStamp && isPinnedCommit(installStamp.commit)) {
return installStamp.commit
}
return readExistingPinnedCommit(activeRoot) return readExistingPinnedCommit(activeRoot)
} }
@@ -918,14 +918,14 @@ async function runBootstrap(opts) {
try { try {
const existingCheckout = hasExistingGitCheckout(activeRoot) const existingCheckout = hasExistingGitCheckout(activeRoot)
const pinCommit = !existingCheckout const pinCommit = Boolean(installStamp && isPinnedCommit(installStamp.commit)) || !existingCheckout
if (existingCheckout && installStamp && installStamp.commit) { if (existingCheckout && installStamp && installStamp.commit) {
emit({ emit({
type: 'log', type: 'log',
line: line:
`[bootstrap] existing checkout detected at ${activeRoot}; ` + `[bootstrap] existing checkout detected at ${activeRoot}; ` +
`not pinning to packaged install stamp ${installStamp.commit.slice(0, 12)}` `applying packaged install stamp ${installStamp.commit.slice(0, 12)} with installer rollback protection`
}) })
} }
@@ -1002,6 +1002,7 @@ async function runBootstrap(opts) {
const markerPayload = { const markerPayload = {
pinnedCommit, pinnedCommit,
packageCommit: installStamp && isPinnedCommit(installStamp.commit) ? installStamp.commit : null,
pinnedBranch: installStamp ? installStamp.branch : null pinnedBranch: installStamp ? installStamp.branch : null
} }
+1
View File
@@ -4597,6 +4597,7 @@ function writeBootstrapMarker(payload) {
const merged = { const merged = {
schemaVersion: BOOTSTRAP_MARKER_SCHEMA_VERSION, schemaVersion: BOOTSTRAP_MARKER_SCHEMA_VERSION,
pinnedCommit: payload.pinnedCommit || null, pinnedCommit: payload.pinnedCommit || null,
packageCommit: payload.packageCommit || null,
pinnedBranch: payload.pinnedBranch || null, pinnedBranch: payload.pinnedBranch || null,
completedAt: new Date().toISOString(), completedAt: new Date().toISOString(),
desktopVersion: app.getVersion() desktopVersion: app.getVersion()
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "aiturk-ide", "name": "aiturk-ide",
"productName": "AITURK IDE", "productName": "AITURK IDE",
"private": true, "private": true,
"version": "1.0.0-beta.2", "version": "1.0.0-beta.3",
"description": "TurkServis resmi yapay zekâ geliştirme ortamı. Hermes Agent tabanlıdır.", "description": "TurkServis resmi yapay zekâ geliştirme ortamı. Hermes Agent tabanlıdır.",
"author": "AITURK / TurkServis", "author": "AITURK / TurkServis",
"repository": { "repository": {
+1 -1
View File
@@ -65,7 +65,7 @@
}, },
"apps/desktop": { "apps/desktop": {
"name": "aiturk-ide", "name": "aiturk-ide",
"version": "1.0.0-beta.2", "version": "1.0.0-beta.3",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@assistant-ui/core": "0.2.23", "@assistant-ui/core": "0.2.23",