gm-qwen 2.0.972 → 2.0.973

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/bootstrap.js CHANGED
@@ -345,58 +345,42 @@ async function bootstrap(opts) {
345
345
  const partialPath = `${finalPath}.partial`;
346
346
 
347
347
  if (fs.existsSync(finalPath) && fs.existsSync(okSentinel)) {
348
- const actualVersion = probeBinaryVersion(finalPath);
349
- if (actualVersion && actualVersion !== version) {
350
- log(`cache version mismatch: dir=v${version} contains binary ${actualVersion} → re-fetching v${version}`);
348
+ if (expectedSha) {
349
+ const actualSha = sha256OfFileSync(finalPath);
350
+ if (actualSha === expectedSha) {
351
+ if (!opts.silent) log(`decision: hit reason: sha-match v${version} (${finalPath})`);
352
+ return finalPath;
353
+ }
354
+ log(`decision: fetch reason: cache-hit-sha-mismatch (dir=v${version} expected ${expectedSha.slice(0,12)}… got ${(actualSha||'').slice(0,12)}…)`);
351
355
  writeBootstrapError({
352
356
  expected_version: version,
353
- cached_version: actualVersion,
354
- error_phase: 'cache-hit-pin-mismatch',
355
- error_message: `cached binary at ${finalPath} reports --version=${actualVersion} but cache dir pins v${version}`,
357
+ cached_version: null,
358
+ error_phase: 'cache-hit-sha-mismatch',
359
+ error_message: `cached binary at ${finalPath} sha=${actualSha} but manifest expects ${expectedSha}`,
356
360
  });
357
361
  try { fs.unlinkSync(finalPath); } catch (_) {}
358
362
  try { fs.unlinkSync(okSentinel); } catch (_) {}
359
363
  } else {
360
- if (!opts.silent) log(`cache hit: ${finalPath}${actualVersion ? ` (matches pin v${version})` : ''}`);
361
- proactiveKillForNewInstall(version, finalPath);
362
- pruneOldVersions(root, version, readRtkVersion(wrapperDir));
364
+ if (!opts.silent) log(`decision: hit reason: sentinel+no-sha-manifest (${finalPath})`);
363
365
  return finalPath;
364
366
  }
365
367
  }
366
368
 
367
369
  if (healIfShaMatches(finalPath, expectedSha, okSentinel, partialPath, 'plugkit')) {
368
- const actualVersion = probeBinaryVersion(finalPath);
369
- if (actualVersion && actualVersion !== version) {
370
- log(`cache heal version mismatch: dir=v${version} contains binary ${actualVersion} → re-fetching`);
371
- writeBootstrapError({
372
- expected_version: version,
373
- cached_version: actualVersion,
374
- error_phase: 'cache-heal-pin-mismatch',
375
- error_message: `healed binary at ${finalPath} reports --version=${actualVersion} but cache dir pins v${version}`,
376
- });
377
- try { fs.unlinkSync(finalPath); } catch (_) {}
378
- try { fs.unlinkSync(okSentinel); } catch (_) {}
379
- } else {
380
- if (!opts.silent) log(`cache heal (sha match): ${finalPath}${actualVersion ? ` (matches pin v${version})` : ''}`);
381
- proactiveKillForNewInstall(version, finalPath);
382
- pruneOldVersions(root, version, readRtkVersion(wrapperDir));
383
- spawnDetachedRtkFetch(wrapperDir);
384
- return finalPath;
385
- }
370
+ if (!opts.silent) log(`decision: heal reason: sha-match (${finalPath})`);
371
+ spawnDetachedRtkFetch(wrapperDir);
372
+ return finalPath;
386
373
  }
387
374
 
388
375
  const lockPath = path.join(verDir, '.lock');
389
376
  acquireLock(lockPath);
390
377
  try {
391
378
  if (fs.existsSync(finalPath) && fs.existsSync(okSentinel)) {
392
- proactiveKillForNewInstall(version, finalPath);
393
- pruneOldVersions(root, version, readRtkVersion(wrapperDir));
379
+ log(`decision: hit reason: lock-race-resolved (${finalPath})`);
394
380
  return finalPath;
395
381
  }
396
382
  if (healIfShaMatches(finalPath, expectedSha, okSentinel, partialPath, 'plugkit')) {
397
- log(`cache heal (sha match) under lock: ${finalPath}`);
398
- proactiveKillForNewInstall(version, finalPath);
399
- pruneOldVersions(root, version, readRtkVersion(wrapperDir));
383
+ log(`decision: heal reason: sha-match-under-lock (${finalPath})`);
400
384
  spawnDetachedRtkFetch(wrapperDir);
401
385
  return finalPath;
402
386
  }
@@ -453,7 +437,7 @@ async function bootstrap(opts) {
453
437
  }
454
438
 
455
439
  fs.writeFileSync(okSentinel, new Date().toISOString());
456
- log(`installed ${finalPath}`);
440
+ log(`decision: fetch reason: install-complete (${finalPath})`);
457
441
  obsEvent('bootstrap', 'install.done', { path: finalPath, version, kind: 'plugkit' });
458
442
  proactiveKillForNewInstall(version, finalPath);
459
443
  pruneOldVersions(root, version, readRtkVersion(wrapperDir));
package/gm.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm",
3
- "version": "2.0.972",
3
+ "version": "2.0.973",
4
4
  "description": "State machine agent with hooks, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-qwen",
3
- "version": "2.0.972",
3
+ "version": "2.0.973",
4
4
  "description": "State machine agent with hooks, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",