gm-plugkit 2.0.1231 → 2.0.1233

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-plugkit",
3
- "version": "2.0.1231",
3
+ "version": "2.0.1233",
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": {
@@ -477,6 +477,11 @@ function readCurrentSess() {
477
477
  return __sessCache.value;
478
478
  }
479
479
 
480
+ // iter13: dedup set for host_vec_embed.failed event emissions — we only
481
+ // want one event per distinct failure-reason per process, not one per
482
+ // embed call.
483
+ const _hostVecEmbedFailKeys = new Set();
484
+
480
485
  function logEvent(sub, event, fields) {
481
486
  if (process.env.GM_LOG_DISABLE) return;
482
487
  try {
@@ -913,7 +918,17 @@ function getOrCreateBrowserSession(cwd, claudeSessionId, pw) {
913
918
  '--no-default-browser-check',
914
919
  '--disable-features=Translate',
915
920
  ];
916
- const child = spawn(chrome, chromeArgs, { detached: true, stdio: 'ignore' });
921
+ // Chrome itself is GUI but its remote-debugging port creates conhost
922
+ // when launched from a console-attached parent. CREATE_NO_WINDOW
923
+ // (0x08000000) | DETACHED_PROCESS (0x00000008) prevents the helper
924
+ // processes (sandbox, GPU, network service) from allocating consoles.
925
+ // Inherited by the entire chrome subprocess tree on Windows.
926
+ const child = spawn(chrome, chromeArgs, {
927
+ detached: true,
928
+ stdio: 'ignore',
929
+ windowsHide: true,
930
+ ...(process.platform === 'win32' ? { creationFlags: 0x08000000 | 0x00000008 } : {}),
931
+ });
917
932
  const chromePid = child.pid;
918
933
  child.unref();
919
934
  const deadline = Date.now() + 10000;
@@ -1461,13 +1476,42 @@ function makeHostFunctions(instanceRef) {
1461
1476
  if (!text) return 0n;
1462
1477
  const body = JSON.stringify({ model: EMBED_MODEL_DEFAULT, input: text });
1463
1478
  const result = spawnSync(process.execPath, ['-e', `
1464
- fetch('${ACPTOAPI_URL}/v1/embeddings', { method: 'POST', headers: { 'content-type': 'application/json' }, body: ${JSON.stringify(body)} })
1465
- .then(r => { if (!r.ok) throw new Error('HTTP ' + r.status); return r.text(); })
1466
- .then(t => process.stdout.write(t))
1467
- .catch(e => { process.stderr.write('embed-error: ' + e.message); process.exit(2); });
1468
- `], { encoding: 'utf-8', timeout: 30000 });
1479
+ (async () => {
1480
+ try {
1481
+ const r = await fetch('${ACPTOAPI_URL}/v1/embeddings', { method: 'POST', headers: { 'content-type': 'application/json' }, body: ${JSON.stringify(body)} });
1482
+ if (!r.ok) {
1483
+ const errBody = await r.text();
1484
+ throw new Error('HTTP ' + r.status + ': ' + errBody.slice(0, 300));
1485
+ }
1486
+ const t = await r.text();
1487
+ process.stdout.write(t);
1488
+ } catch (e) {
1489
+ process.stderr.write('embed-error: ' + e.message);
1490
+ process.exit(2);
1491
+ }
1492
+ })();
1493
+ `], { encoding: 'utf-8', timeout: 30000, windowsHide: true });
1469
1494
  if (result.status !== 0 || !result.stdout) {
1470
- console.error('[plugkit-wasm] host_vec_embed FAILED:', result.stderr || 'no response');
1495
+ // iter13: failures here had been silently returning 0n which surfaced
1496
+ // as auto_recall.count=0 with no diagnostic. acptoapi 1.0.102+
1497
+ // returns 410 Gone on /v1/embeddings (embeddings now live in
1498
+ // rs-learn natively). Log a structured event so the failure is
1499
+ // visible in gmsniff. Dedup on the (status, reason) key so we
1500
+ // don't spam — only the first occurrence per process per reason.
1501
+ const reason = (result.stderr || 'no response').slice(0, 300);
1502
+ const key = String(result.status) + '|' + reason;
1503
+ if (!_hostVecEmbedFailKeys.has(key)) {
1504
+ _hostVecEmbedFailKeys.add(key);
1505
+ try {
1506
+ logEvent('plugkit', 'host_vec_embed.failed', {
1507
+ status: result.status,
1508
+ reason,
1509
+ text_len: text.length,
1510
+ hint: 'acptoapi 1.0.102+ returns 410 on /v1/embeddings — embeddings are served by rs-learn natively. Once rs-learn-embed sidecar is wired into host_vec_embed, this event will stop firing.',
1511
+ });
1512
+ } catch (_) {}
1513
+ }
1514
+ console.error('[plugkit-wasm] host_vec_embed FAILED:', reason);
1471
1515
  return 0n;
1472
1516
  }
1473
1517
  return writeWasmStr(instanceRef.value, result.stdout);