backpack-ontology 0.2.15 → 0.2.17
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;AAyJ9C,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,57 @@ 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
|
+
try {
|
|
97
|
+
await fetch(ENDPOINT, {
|
|
98
|
+
method: "POST",
|
|
99
|
+
headers: { "Content-Type": "application/json" },
|
|
100
|
+
body: JSON.stringify({ events }),
|
|
101
|
+
signal: AbortSignal.timeout(5000),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Network failures are expected (offline, DNS, etc.) — silently ignore
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Build the current session snapshot (reused by heartbeat and shutdown). */
|
|
109
|
+
async function buildSnapshot(event) {
|
|
110
|
+
let ontologyCount = 0;
|
|
111
|
+
let totalNodes = 0;
|
|
112
|
+
let totalEdges = 0;
|
|
113
|
+
if (backpackRef) {
|
|
114
|
+
try {
|
|
115
|
+
const ontologies = await backpackRef.listOntologies();
|
|
116
|
+
ontologyCount = ontologies.length;
|
|
117
|
+
for (const o of ontologies) {
|
|
118
|
+
totalNodes += o.nodeCount;
|
|
119
|
+
totalEdges += o.edgeCount;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Can't gather stats — skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
event,
|
|
128
|
+
machineId: machineId,
|
|
129
|
+
sessionId,
|
|
130
|
+
timestamp: new Date().toISOString(),
|
|
131
|
+
properties: {
|
|
132
|
+
durationMs: Date.now() - sessionStartTime,
|
|
133
|
+
toolCalls,
|
|
134
|
+
totalToolCalls: Object.values(toolCalls).reduce((a, b) => a + b, 0),
|
|
135
|
+
ontologyCount,
|
|
136
|
+
totalNodes,
|
|
137
|
+
totalEdges,
|
|
138
|
+
nodeVersion: process.version,
|
|
139
|
+
os: os.platform(),
|
|
140
|
+
arch: os.arch(),
|
|
141
|
+
backpackVersion: VERSION,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
92
145
|
/** Initialize telemetry. Call once at server startup. */
|
|
93
146
|
export async function initTelemetry(backpack) {
|
|
94
147
|
try {
|
|
@@ -97,9 +150,23 @@ export async function initTelemetry(backpack) {
|
|
|
97
150
|
backpackRef = backpack ?? null;
|
|
98
151
|
await getMachineId();
|
|
99
152
|
initialized = true;
|
|
100
|
-
// Register shutdown —
|
|
153
|
+
// Register shutdown + heartbeat first — these must always be set up,
|
|
154
|
+
// even if the session_start send below fails.
|
|
101
155
|
process.on("SIGTERM", () => shutdown().catch(() => { }));
|
|
102
156
|
process.on("SIGINT", () => shutdown().catch(() => { }));
|
|
157
|
+
heartbeatTimer = setInterval(async () => {
|
|
158
|
+
try {
|
|
159
|
+
const heartbeat = await buildSnapshot("session_heartbeat");
|
|
160
|
+
await sendEvents([heartbeat]);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Silently ignore heartbeat failures
|
|
164
|
+
}
|
|
165
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
166
|
+
heartbeatTimer.unref(); // Don't keep the process alive for heartbeats
|
|
167
|
+
// Send session_start (sendEvents never throws, so this is safe)
|
|
168
|
+
const startEvent = await buildSnapshot("session_start");
|
|
169
|
+
await sendEvents([startEvent]);
|
|
103
170
|
}
|
|
104
171
|
catch {
|
|
105
172
|
// Telemetry init failed — continue silently
|
|
@@ -126,48 +193,12 @@ export async function shutdown() {
|
|
|
126
193
|
if (disabled || !initialized || shutdownCalled)
|
|
127
194
|
return;
|
|
128
195
|
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
|
-
}
|
|
196
|
+
if (heartbeatTimer) {
|
|
197
|
+
clearInterval(heartbeatTimer);
|
|
198
|
+
heartbeatTimer = null;
|
|
146
199
|
}
|
|
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
|
-
});
|
|
200
|
+
const summary = await buildSnapshot("session_end");
|
|
201
|
+
await sendEvents([summary]);
|
|
171
202
|
}
|
|
172
203
|
catch {
|
|
173
204
|
// 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.17",
|
|
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",
|