gm-plugkit 2.0.1149 → 2.0.1151
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 +1 -1
- package/plugkit-wasm-wrapper.js +92 -6
- package/plugkit.sha256 +1 -1
- package/plugkit.version +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gm-plugkit",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1151",
|
|
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": {
|
package/plugkit-wasm-wrapper.js
CHANGED
|
@@ -14,6 +14,73 @@ const __dirname = path.dirname(__filename);
|
|
|
14
14
|
const KV_DIR = path.join(os.homedir(), '.claude', 'gm-tools', 'kv');
|
|
15
15
|
fs.mkdirSync(KV_DIR, { recursive: true });
|
|
16
16
|
|
|
17
|
+
const GM_LOG_ROOT = process.env.GM_LOG_DIR || path.join(os.homedir(), '.claude', 'gm-log');
|
|
18
|
+
const ORCHESTRATOR_VERBS = new Set(['instruction', 'transition', 'phase-status', 'prd-add', 'prd-resolve', 'prd-list', 'mutable-add', 'mutable-resolve', 'mutable-list', 'memorize-fire', 'residual-scan', 'auto-recall']);
|
|
19
|
+
|
|
20
|
+
function logEvent(sub, event, fields) {
|
|
21
|
+
if (process.env.GM_LOG_DISABLE) return;
|
|
22
|
+
try {
|
|
23
|
+
const day = new Date().toISOString().slice(0, 10);
|
|
24
|
+
const dir = path.join(GM_LOG_ROOT, day);
|
|
25
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
26
|
+
const line = JSON.stringify({
|
|
27
|
+
ts: new Date().toISOString(),
|
|
28
|
+
sub,
|
|
29
|
+
event,
|
|
30
|
+
pid: process.pid,
|
|
31
|
+
sess: process.env.CLAUDE_SESSION_ID || process.env.GM_SESSION_ID || '',
|
|
32
|
+
...fields,
|
|
33
|
+
});
|
|
34
|
+
fs.appendFileSync(path.join(dir, `${sub}.jsonl`), line + '\n');
|
|
35
|
+
} catch (_) {}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function emitOrchestratorEvents(verb, taskBase, resultStr) {
|
|
39
|
+
if (!ORCHESTRATOR_VERBS.has(verb)) return;
|
|
40
|
+
let parsed;
|
|
41
|
+
try { parsed = JSON.parse(resultStr); } catch (_) { return; }
|
|
42
|
+
if (!parsed || parsed.ok !== true) {
|
|
43
|
+
logEvent('plugkit', 'orchestrator.error', { verb, task: taskBase, error: parsed && parsed.error ? String(parsed.error) : 'unknown' });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const data = parsed.data || {};
|
|
47
|
+
switch (verb) {
|
|
48
|
+
case 'transition':
|
|
49
|
+
logEvent('plugkit', 'phase.transitioned', { task: taskBase, phase: data.phase, next_skill: data.nextSkill, recall_count: Array.isArray(data.recall_hits) ? data.recall_hits.length : 0 });
|
|
50
|
+
break;
|
|
51
|
+
case 'instruction':
|
|
52
|
+
logEvent('plugkit', 'instruction.served', { task: taskBase, phase: data.phase, prd_pending: data.prd_pending_count, mutables_pending: Array.isArray(data.mutables_pending) ? data.mutables_pending.length : 0, next_phase_hint: data.next_phase_hint });
|
|
53
|
+
break;
|
|
54
|
+
case 'phase-status':
|
|
55
|
+
logEvent('plugkit', 'phase.status', { task: taskBase, phase: data.phase, last_skill: data.last_skill });
|
|
56
|
+
break;
|
|
57
|
+
case 'prd-add':
|
|
58
|
+
logEvent('plugkit', 'prd.added', { task: taskBase, id: data.added });
|
|
59
|
+
break;
|
|
60
|
+
case 'prd-resolve':
|
|
61
|
+
logEvent('plugkit', 'prd.resolved', { task: taskBase, id: data.resolved });
|
|
62
|
+
break;
|
|
63
|
+
case 'mutable-add':
|
|
64
|
+
logEvent('plugkit', 'mutable.added', { task: taskBase, id: data.added });
|
|
65
|
+
break;
|
|
66
|
+
case 'mutable-resolve':
|
|
67
|
+
logEvent('plugkit', 'mutable.resolved', { task: taskBase, id: data.resolved, memorize_spool: data.memorize_spool });
|
|
68
|
+
break;
|
|
69
|
+
case 'memorize-fire':
|
|
70
|
+
logEvent('plugkit', 'memorize.fired', { task: taskBase, key: data.key, namespace: data.namespace, bytes: data.bytes });
|
|
71
|
+
break;
|
|
72
|
+
case 'residual-scan':
|
|
73
|
+
if (data.scan === 'fired') logEvent('plugkit', 'residual.fired', { task: taskBase, marker: data.marker });
|
|
74
|
+
else logEvent('plugkit', 'residual.skipped', { task: taskBase, reason: data.reason });
|
|
75
|
+
break;
|
|
76
|
+
case 'auto-recall':
|
|
77
|
+
logEvent('plugkit', 'auto_recall.hits', { task: taskBase, count: Array.isArray(data.hits) ? data.hits.length : 0 });
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
17
84
|
const TMP_DIR = os.tmpdir();
|
|
18
85
|
const BROWSER_PORTS_FILE = path.join(TMP_DIR, 'plugkit-browser-ports.json');
|
|
19
86
|
const BROWSER_SESSIONS_FILE = path.join(TMP_DIR, 'plugkit-browser-sessions.json');
|
|
@@ -656,8 +723,10 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
656
723
|
}
|
|
657
724
|
} catch (e) { console.error(`[plugkit-wasm] wrapper self-install failed: ${e.message}`); }
|
|
658
725
|
|
|
659
|
-
|
|
726
|
+
const _bootVersion = resolveVersion(instance);
|
|
727
|
+
console.log(`[plugkit-wasm] plugkit v${_bootVersion} (wasm)`);
|
|
660
728
|
console.log(`[plugkit-wasm] watching ${inDir}`);
|
|
729
|
+
logEvent('plugkit', 'watcher.boot', { version: _bootVersion, in_dir: inDir, out_dir: outDir, spool_dir: spoolDir });
|
|
661
730
|
|
|
662
731
|
const PROCESSED_MAX = 10000;
|
|
663
732
|
const processed = new Map();
|
|
@@ -692,6 +761,7 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
692
761
|
|
|
693
762
|
const t0 = Date.now();
|
|
694
763
|
console.log(`[dispatch] → verb=${verb} task=${taskBase} body=${bodyBytes.length}b`);
|
|
764
|
+
logEvent('plugkit', 'dispatch.start', { verb, task: taskBase, body_bytes: bodyBytes.length, cwd: process.cwd() });
|
|
695
765
|
|
|
696
766
|
const verbPtr = instance.exports.plugkit_alloc(verbBytes.length);
|
|
697
767
|
const bodyPtr = instance.exports.plugkit_alloc(bodyBytes.length);
|
|
@@ -707,7 +777,10 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
707
777
|
|
|
708
778
|
const outName = dir === '.' ? `${taskBase}.json` : `${verb}-${taskBase}.json`;
|
|
709
779
|
fs.writeFileSync(path.join(outDir, outName), resultStr);
|
|
710
|
-
|
|
780
|
+
const dur_ms = Date.now() - t0;
|
|
781
|
+
console.log(`[dispatch] ← verb=${verb} task=${taskBase} ms=${dur_ms} out=${resultStr.length}b`);
|
|
782
|
+
logEvent('plugkit', 'dispatch.end', { verb, task: taskBase, dur_ms, out_bytes: resultStr.length });
|
|
783
|
+
emitOrchestratorEvents(verb, taskBase, resultStr);
|
|
711
784
|
|
|
712
785
|
try { instance.exports.plugkit_free(verbPtr, verbBytes.length); } catch (_) {}
|
|
713
786
|
try { instance.exports.plugkit_free(bodyPtr, bodyBytes.length); } catch (_) {}
|
|
@@ -727,6 +800,7 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
727
800
|
} catch (_) {}
|
|
728
801
|
try { fs.unlinkSync(filePath); } catch (_) {}
|
|
729
802
|
unmarkProcessed(key);
|
|
803
|
+
logEvent('plugkit', 'dispatch.error', { verb, task: taskBase, error: String(e && e.message || e) });
|
|
730
804
|
}
|
|
731
805
|
};
|
|
732
806
|
|
|
@@ -819,8 +893,14 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
819
893
|
if (s.mtimeMs < cutoff) { fs.unlinkSync(fp); swept++; }
|
|
820
894
|
} catch (e) { console.error(`[retention] failed to sweep ${entry}: ${e.message}`); }
|
|
821
895
|
}
|
|
822
|
-
if (swept > 0)
|
|
823
|
-
|
|
896
|
+
if (swept > 0) {
|
|
897
|
+
console.log(`[retention] swept ${swept} out/ files older than 1h`);
|
|
898
|
+
logEvent('plugkit', 'sweep.retention', { swept });
|
|
899
|
+
}
|
|
900
|
+
} catch (e) {
|
|
901
|
+
console.error(`[retention] sweep error: ${e.message}`);
|
|
902
|
+
logEvent('plugkit', 'sweep.retention.error', { error: String(e.message || e) });
|
|
903
|
+
}
|
|
824
904
|
}, 60_000);
|
|
825
905
|
|
|
826
906
|
setInterval(() => {
|
|
@@ -848,8 +928,14 @@ async function runSpoolWatcher(instance, spoolDir) {
|
|
|
848
928
|
}
|
|
849
929
|
};
|
|
850
930
|
walk(inDir);
|
|
851
|
-
if (stale > 0)
|
|
852
|
-
|
|
931
|
+
if (stale > 0) {
|
|
932
|
+
console.log(`[stale-sweep] failed ${stale} orphaned inputs`);
|
|
933
|
+
logEvent('plugkit', 'sweep.stale', { stale });
|
|
934
|
+
}
|
|
935
|
+
} catch (e) {
|
|
936
|
+
console.error(`[stale-sweep] sweep error: ${e.message}`);
|
|
937
|
+
logEvent('plugkit', 'sweep.stale.error', { error: String(e.message || e) });
|
|
938
|
+
}
|
|
853
939
|
}, 300_000);
|
|
854
940
|
|
|
855
941
|
const existing = walkDir(inDir);
|
package/plugkit.sha256
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"plugkit.wasm":"
|
|
1
|
+
{"plugkit.wasm":"748ab8b58d5c09a447b13cd880853ddecbe1ad3a49ca7ba52501a49e3a6b92d2"}
|
package/plugkit.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.416
|