backpack-ontology 0.2.15 → 0.2.16
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqJ9C,yDAAyD;AACzD,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BtE;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACvC,IAAI,CAWN;AAED,iFAAiF;AACjF,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAe9C"}
|
package/dist/core/telemetry.js
CHANGED
|
@@ -16,6 +16,7 @@ import * as path from "node:path";
|
|
|
16
16
|
import { configDir } from "./paths.js";
|
|
17
17
|
const ENDPOINT = process.env.BACKPACK_TELEMETRY_URL ?? "https://diagnostics.backpackontology.com/api/telemetry";
|
|
18
18
|
const VERSION = "0.2.14";
|
|
19
|
+
const HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
|
|
19
20
|
// Module-level state
|
|
20
21
|
const sessionId = crypto.randomUUID();
|
|
21
22
|
const sessionStartTime = Date.now();
|
|
@@ -25,6 +26,7 @@ let disabled = null;
|
|
|
25
26
|
let backpackRef = null;
|
|
26
27
|
let initialized = false;
|
|
27
28
|
let shutdownCalled = false;
|
|
29
|
+
let heartbeatTimer = null;
|
|
28
30
|
async function isDisabled() {
|
|
29
31
|
if (disabled !== null)
|
|
30
32
|
return disabled;
|
|
@@ -89,6 +91,52 @@ function showFirstRunNotice() {
|
|
|
89
91
|
"",
|
|
90
92
|
].join("\n"));
|
|
91
93
|
}
|
|
94
|
+
/** Send events to the diagnostics endpoint. Never throws. */
|
|
95
|
+
async function sendEvents(events) {
|
|
96
|
+
await fetch(ENDPOINT, {
|
|
97
|
+
method: "POST",
|
|
98
|
+
headers: { "Content-Type": "application/json" },
|
|
99
|
+
body: JSON.stringify({ events }),
|
|
100
|
+
signal: AbortSignal.timeout(5000),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** Build the current session snapshot (reused by heartbeat and shutdown). */
|
|
104
|
+
async function buildSnapshot(event) {
|
|
105
|
+
let ontologyCount = 0;
|
|
106
|
+
let totalNodes = 0;
|
|
107
|
+
let totalEdges = 0;
|
|
108
|
+
if (backpackRef) {
|
|
109
|
+
try {
|
|
110
|
+
const ontologies = await backpackRef.listOntologies();
|
|
111
|
+
ontologyCount = ontologies.length;
|
|
112
|
+
for (const o of ontologies) {
|
|
113
|
+
totalNodes += o.nodeCount;
|
|
114
|
+
totalEdges += o.edgeCount;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Can't gather stats — skip
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
event,
|
|
123
|
+
machineId: machineId,
|
|
124
|
+
sessionId,
|
|
125
|
+
timestamp: new Date().toISOString(),
|
|
126
|
+
properties: {
|
|
127
|
+
durationMs: Date.now() - sessionStartTime,
|
|
128
|
+
toolCalls,
|
|
129
|
+
totalToolCalls: Object.values(toolCalls).reduce((a, b) => a + b, 0),
|
|
130
|
+
ontologyCount,
|
|
131
|
+
totalNodes,
|
|
132
|
+
totalEdges,
|
|
133
|
+
nodeVersion: process.version,
|
|
134
|
+
os: os.platform(),
|
|
135
|
+
arch: os.arch(),
|
|
136
|
+
backpackVersion: VERSION,
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
92
140
|
/** Initialize telemetry. Call once at server startup. */
|
|
93
141
|
export async function initTelemetry(backpack) {
|
|
94
142
|
try {
|
|
@@ -97,6 +145,20 @@ export async function initTelemetry(backpack) {
|
|
|
97
145
|
backpackRef = backpack ?? null;
|
|
98
146
|
await getMachineId();
|
|
99
147
|
initialized = true;
|
|
148
|
+
// Send session_start immediately
|
|
149
|
+
const startEvent = await buildSnapshot("session_start");
|
|
150
|
+
await sendEvents([startEvent]);
|
|
151
|
+
// Periodic heartbeat
|
|
152
|
+
heartbeatTimer = setInterval(async () => {
|
|
153
|
+
try {
|
|
154
|
+
const heartbeat = await buildSnapshot("session_heartbeat");
|
|
155
|
+
await sendEvents([heartbeat]);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// Silently ignore heartbeat failures
|
|
159
|
+
}
|
|
160
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
161
|
+
heartbeatTimer.unref(); // Don't keep the process alive for heartbeats
|
|
100
162
|
// Register shutdown — SIGTERM/SIGINT only, not beforeExit (fires repeatedly)
|
|
101
163
|
process.on("SIGTERM", () => shutdown().catch(() => { }));
|
|
102
164
|
process.on("SIGINT", () => shutdown().catch(() => { }));
|
|
@@ -126,48 +188,12 @@ export async function shutdown() {
|
|
|
126
188
|
if (disabled || !initialized || shutdownCalled)
|
|
127
189
|
return;
|
|
128
190
|
shutdownCalled = true;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let totalNodes = 0;
|
|
133
|
-
let totalEdges = 0;
|
|
134
|
-
if (backpackRef) {
|
|
135
|
-
try {
|
|
136
|
-
const ontologies = await backpackRef.listOntologies();
|
|
137
|
-
ontologyCount = ontologies.length;
|
|
138
|
-
for (const o of ontologies) {
|
|
139
|
-
totalNodes += o.nodeCount;
|
|
140
|
-
totalEdges += o.edgeCount;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
// Can't gather stats — skip
|
|
145
|
-
}
|
|
191
|
+
if (heartbeatTimer) {
|
|
192
|
+
clearInterval(heartbeatTimer);
|
|
193
|
+
heartbeatTimer = null;
|
|
146
194
|
}
|
|
147
|
-
const summary =
|
|
148
|
-
|
|
149
|
-
machineId: machineId,
|
|
150
|
-
sessionId,
|
|
151
|
-
timestamp: new Date().toISOString(),
|
|
152
|
-
properties: {
|
|
153
|
-
durationMs: Date.now() - sessionStartTime,
|
|
154
|
-
toolCalls,
|
|
155
|
-
totalToolCalls,
|
|
156
|
-
ontologyCount,
|
|
157
|
-
totalNodes,
|
|
158
|
-
totalEdges,
|
|
159
|
-
nodeVersion: process.version,
|
|
160
|
-
os: os.platform(),
|
|
161
|
-
arch: os.arch(),
|
|
162
|
-
backpackVersion: VERSION,
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
await fetch(ENDPOINT, {
|
|
166
|
-
method: "POST",
|
|
167
|
-
headers: { "Content-Type": "application/json" },
|
|
168
|
-
body: JSON.stringify({ events: [summary] }),
|
|
169
|
-
signal: AbortSignal.timeout(5000),
|
|
170
|
-
});
|
|
195
|
+
const summary = await buildSnapshot("session_end");
|
|
196
|
+
await sendEvents([summary]);
|
|
171
197
|
}
|
|
172
198
|
catch {
|
|
173
199
|
// Silently ignore
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,wDAAwD,CAAC;AACjG,MAAM,OAAO,GAAG,QAAQ,CAAC;AAUzB,qBAAqB;AACrB,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACpC,IAAI,SAAS,GAAkB,IAAI,CAAC;AACpC,IAAI,SAAS,GAA2B,EAAE,CAAC;AAC3C,IAAI,QAAQ,GAAmB,IAAI,CAAC;AACpC,IAAI,WAAW,GAAoB,IAAI,CAAC;AACxC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,cAAc,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/core/telemetry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "backpack-ontology",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16",
|
|
4
4
|
"description": "A persistent learning graph engine for Claude Code via MCP — structured knowledge that carries forward across sessions",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Noah Irzinger",
|