gm-plugkit 2.0.1635 → 2.0.1636

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/SKILL.md CHANGED
@@ -34,7 +34,7 @@ Every turn: dispatch `instruction`, read it, follow the imperative, dispatch the
34
34
  cat .gm/exec-spool/.status.json 2>/dev/null; echo ---; cat .gm/exec-spool/.turn-summary.json 2>/dev/null; echo ---; date +%s%3N
35
35
  ```
36
36
 
37
- `.turn-summary.json` carries `phase`, `last_skill`, `prd_pending`, `last_instruction_ts`, `last_instruction_age_ms`, `long_gap_threshold_ms`, `browser_sessions_alive`, `update_available`, `deviations_30m`, `watcher_uptime_ms`. Age over threshold: your next non-orienting verb is gated, dispatch `instruction` first. `update_available` non-null: eager-upgrade with `bun x gm-plugkit@latest --kill-stale-watchers; bun x gm-plugkit@latest spool` (the spool call blocks until serving), then read `.status.json` to confirm `version`. `deviations_30m` non-zero indicates active drift to investigate before continuing.
37
+ `.turn-summary.json` carries `phase`, `last_skill`, `prd_pending`, `last_instruction_ts`, `last_instruction_age_ms`, `long_gap_threshold_ms`, `browser_sessions_alive`, `update_available`, `deviations_30m`, `watcher_uptime_ms`. Age over threshold: your next non-orienting verb is gated, dispatch `instruction` first. `update_available` non-null: the watcher auto-updates itself when idle (cache-busted self-respawn to latest), so it usually clears on its own within a few minutes -- keep working. To land it immediately, just re-run the idempotent `bun x gm-plugkit@latest spool` (blocks until serving); only add `--kill-stale-watchers` first if it stays stuck across several turns. `PLUGKIT_NO_AUTO_UPDATE=1` pins the version. `deviations_30m` non-zero indicates active drift to investigate before continuing.
38
38
 
39
39
  Compare `.status.json` `ts` to the printed epoch: gap > 15000 = dead, boot it. Exception: a future `busy_until` means a long verb (browser/chromium spawn blocks the heartbeat ~15-18s) -- wait, do not boot a second watcher.
40
40
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-plugkit",
3
- "version": "2.0.1635",
3
+ "version": "2.0.1636",
4
4
  "description": "Bootstrap and daemon-spawn tool for gm plugkit binary. Downloads the correct platform binary, verifies SHA256, and starts the spool watcher daemon. Includes plugkit-wasm-wrapper for WASM-based spool watching.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -308,7 +308,7 @@ function injectUpdateWarning(parsed) {
308
308
  if (!upd || !upd.installed || !upd.latest || upd.installed === upd.latest) return;
309
309
  const target = (parsed.data && typeof parsed.data === 'object') ? parsed.data : parsed;
310
310
  target.update_available = { installed: upd.installed, latest: upd.latest, update_url: upd.update_url || null };
311
- target.update_warning = `STALE RUNTIME: running plugkit ${upd.installed} but ${upd.latest} is published and not yet running. Restart onto the new version now: bun x gm-plugkit@latest --kill-stale-watchers; bun x gm-plugkit@latest spool. This warning repeats every turn until the running version catches up.`;
311
+ target.update_warning = `STALE RUNTIME: running plugkit ${upd.installed} but ${upd.latest} is published. The watcher auto-updates when idle (cache-busted self-respawn to latest), so this usually clears on its own within a few minutes; just keep working. If it persists, re-run the idempotent boot to land latest now: bun x gm-plugkit@latest spool (add --kill-stale-watchers first only if it stays stuck). Set PLUGKIT_NO_AUTO_UPDATE=1 to pin. This warning repeats until the running version catches up.`;
312
312
  }
313
313
 
314
314
  function mergeAutoRecallIntoInstructionResponse(resultStr, autoRecall) {
@@ -2904,6 +2904,10 @@ async function runSpoolWatcher(instance, spoolDir) {
2904
2904
  let _selfStaleProbeErrorLogged = false;
2905
2905
  function probeGmPlugkitSelfStale() {
2906
2906
  try {
2907
+ if (process.env.PLUGKIT_NO_AUTO_UPDATE === '1') return;
2908
+ const { sids: _ifSids } = (typeof inflightPids === 'function') ? inflightPids() : { sids: new Set() };
2909
+ if (_ifSids.size > 0) return;
2910
+ if ((Date.now() - lastActivityMs) < 30000) return;
2907
2911
  const ownPkgVersionFile = path.join(GM_TOOLS_ROOT, 'gm-plugkit.version');
2908
2912
  const ownPkgJsonFile = path.join(__dirname, 'package.json');
2909
2913
  let own = null;
@@ -2975,7 +2979,7 @@ async function runSpoolWatcher(instance, spoolDir) {
2975
2979
  try {
2976
2980
  const cp = _childProcess;
2977
2981
  const bunPath = process.env.GM_BUN_PATH || 'bun';
2978
- const bustCache = sameStaleAsBefore || cameFromSelfRespawn;
2982
+ const bustCache = true;
2979
2983
  if (bustCache) {
2980
2984
  try { cp.execFileSync(bunPath, ['pm', 'cache', 'rm'], { stdio: 'ignore', timeout: 30000, windowsHide: true }); } catch (_) {}
2981
2985
  try {
@@ -3002,7 +3006,7 @@ async function runSpoolWatcher(instance, spoolDir) {
3002
3006
  env: { ...process.env, PLUGKIT_BOOT_REASON: 'self-respawn-from-self-stale' },
3003
3007
  });
3004
3008
  child.unref();
3005
- try { logEvent('plugkit', 'gm-plugkit.self-stale-respawn', { running_version: own, latest_version: latest, cache_busted: bustCache, attempt: (respawnGuard.attempts || 0) + 1 }); } catch (_) {}
3009
+ try { logEvent('plugkit', 'update.auto-applying', { running_version: own, latest_version: latest, cache_busted: bustCache, attempt: (respawnGuard.attempts || 0) + 1, note: 'auto-update: cache-busted self-respawn to latest' }); } catch (_) {}
3006
3010
  try { fs.writeFileSync(path.join(spoolDir, '.shutdown-reason.json'), JSON.stringify({ reason: 'gm-plugkit-self-stale', ts: Date.now(), pid: process.pid, running_version: own, latest_version: latest })); } catch (_) {}
3007
3011
  const myPid = process.pid;
3008
3012
  const respawnDeadline = Date.now() + 90000;