@relayplane/proxy 1.8.8 → 1.8.10
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/dist/cli.js +0 -0
- package/dist/signup-nudge.d.ts +45 -0
- package/dist/signup-nudge.d.ts.map +1 -0
- package/dist/signup-nudge.js +155 -0
- package/dist/signup-nudge.js.map +1 -0
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +12 -0
- package/dist/standalone-proxy.js.map +1 -1
- package/dist/star-nudge.d.ts +47 -0
- package/dist/star-nudge.d.ts.map +1 -0
- package/dist/star-nudge.js +158 -0
- package/dist/star-nudge.js.map +1 -0
- package/package.json +1 -1
- package/dist/osmosis-store.d.ts +0 -33
- package/dist/osmosis-store.d.ts.map +0 -1
- package/dist/osmosis-store.js +0 -181
- package/dist/osmosis-store.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RelayPlane Star Nudge
|
|
3
|
+
*
|
|
4
|
+
* After the 50th cumulative proxied request, prints a one-time CLI nudge
|
|
5
|
+
* to stderr encouraging the user to star the GitHub repo.
|
|
6
|
+
*
|
|
7
|
+
* Guarantees:
|
|
8
|
+
* - Fires exactly once per install (flag written to ~/.relayplane/star-nudge-shown.json)
|
|
9
|
+
* - Prints to stderr — never pollutes proxy response stdout
|
|
10
|
+
* - Zero added latency — call checkAndShowStarNudge() *after* forwarding the response
|
|
11
|
+
* - Never throws — all errors are silently swallowed
|
|
12
|
+
*/
|
|
13
|
+
declare const STAR_NUDGE_THRESHOLD = 50;
|
|
14
|
+
declare const GITHUB_URL = "https://github.com/RelayPlane/proxy";
|
|
15
|
+
/** Path to the star-nudge-shown flag file */
|
|
16
|
+
declare function getStarNudgeFlagFile(): string;
|
|
17
|
+
/** Path to the telemetry event log */
|
|
18
|
+
declare function getTelemetryFile(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Call this once at proxy startup.
|
|
21
|
+
* Reads the flag file and caches the result so we never re-read it per-request.
|
|
22
|
+
*/
|
|
23
|
+
export declare function initStarNudge(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Count cumulative requests from the telemetry.jsonl file.
|
|
26
|
+
* Returns 0 on any read/parse error.
|
|
27
|
+
*/
|
|
28
|
+
export declare function countTelemetryRequests(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Check whether the star nudge should fire and, if so, show it.
|
|
31
|
+
*
|
|
32
|
+
* Call this AFTER the proxy response has been forwarded so there is
|
|
33
|
+
* zero added latency on the request path. This function is intentionally
|
|
34
|
+
* synchronous so it can be fire-and-forgotten without creating a dangling
|
|
35
|
+
* promise.
|
|
36
|
+
*
|
|
37
|
+
* @param requestCount Optional: pass the current cumulative count if you
|
|
38
|
+
* already have it (avoids re-reading the file).
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkAndShowStarNudge(requestCount?: number): void;
|
|
41
|
+
/** Reset in-memory flag (used in tests only) */
|
|
42
|
+
export declare function _resetStarNudgeState(): void;
|
|
43
|
+
/** Expose paths for tests */
|
|
44
|
+
export { getStarNudgeFlagFile, getTelemetryFile };
|
|
45
|
+
/** Expose threshold for tests */
|
|
46
|
+
export { STAR_NUDGE_THRESHOLD, GITHUB_URL };
|
|
47
|
+
//# sourceMappingURL=star-nudge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-nudge.d.ts","sourceRoot":"","sources":["../src/star-nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,QAAA,MAAM,oBAAoB,KAAK,CAAC;AAChC,QAAA,MAAM,UAAU,wCAAwC,CAAC;AAEzD,6CAA6C;AAC7C,iBAAS,oBAAoB,IAAI,MAAM,CAEtC;AAED,sCAAsC;AACtC,iBAAS,gBAAgB,IAAI,MAAM,CAElC;AAKD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,IAAI,CASpC;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAU/C;AA4BD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAajE;AAID,gDAAgD;AAChD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,6BAA6B;AAC7B,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;AAElD,iCAAiC;AACjC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RelayPlane Star Nudge
|
|
4
|
+
*
|
|
5
|
+
* After the 50th cumulative proxied request, prints a one-time CLI nudge
|
|
6
|
+
* to stderr encouraging the user to star the GitHub repo.
|
|
7
|
+
*
|
|
8
|
+
* Guarantees:
|
|
9
|
+
* - Fires exactly once per install (flag written to ~/.relayplane/star-nudge-shown.json)
|
|
10
|
+
* - Prints to stderr — never pollutes proxy response stdout
|
|
11
|
+
* - Zero added latency — call checkAndShowStarNudge() *after* forwarding the response
|
|
12
|
+
* - Never throws — all errors are silently swallowed
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.GITHUB_URL = exports.STAR_NUDGE_THRESHOLD = void 0;
|
|
49
|
+
exports.initStarNudge = initStarNudge;
|
|
50
|
+
exports.countTelemetryRequests = countTelemetryRequests;
|
|
51
|
+
exports.checkAndShowStarNudge = checkAndShowStarNudge;
|
|
52
|
+
exports._resetStarNudgeState = _resetStarNudgeState;
|
|
53
|
+
exports.getStarNudgeFlagFile = getStarNudgeFlagFile;
|
|
54
|
+
exports.getTelemetryFile = getTelemetryFile;
|
|
55
|
+
const fs = __importStar(require("fs"));
|
|
56
|
+
const path = __importStar(require("path"));
|
|
57
|
+
const config_js_1 = require("./config.js");
|
|
58
|
+
const STAR_NUDGE_THRESHOLD = 50;
|
|
59
|
+
exports.STAR_NUDGE_THRESHOLD = STAR_NUDGE_THRESHOLD;
|
|
60
|
+
const GITHUB_URL = 'https://github.com/RelayPlane/proxy';
|
|
61
|
+
exports.GITHUB_URL = GITHUB_URL;
|
|
62
|
+
/** Path to the star-nudge-shown flag file */
|
|
63
|
+
function getStarNudgeFlagFile() {
|
|
64
|
+
return path.join((0, config_js_1.getConfigDir)(), 'star-nudge-shown.json');
|
|
65
|
+
}
|
|
66
|
+
/** Path to the telemetry event log */
|
|
67
|
+
function getTelemetryFile() {
|
|
68
|
+
return path.join((0, config_js_1.getConfigDir)(), 'telemetry.jsonl');
|
|
69
|
+
}
|
|
70
|
+
/** Whether the star nudge has already been shown (checked once at startup) */
|
|
71
|
+
let starNudgeAlreadyShown = false;
|
|
72
|
+
/**
|
|
73
|
+
* Call this once at proxy startup.
|
|
74
|
+
* Reads the flag file and caches the result so we never re-read it per-request.
|
|
75
|
+
*/
|
|
76
|
+
function initStarNudge() {
|
|
77
|
+
try {
|
|
78
|
+
const flagPath = getStarNudgeFlagFile();
|
|
79
|
+
if (fs.existsSync(flagPath)) {
|
|
80
|
+
starNudgeAlreadyShown = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Silently ignore — nudge is non-critical
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Count cumulative requests from the telemetry.jsonl file.
|
|
89
|
+
* Returns 0 on any read/parse error.
|
|
90
|
+
*/
|
|
91
|
+
function countTelemetryRequests() {
|
|
92
|
+
try {
|
|
93
|
+
const file = getTelemetryFile();
|
|
94
|
+
if (!fs.existsSync(file))
|
|
95
|
+
return 0;
|
|
96
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
97
|
+
// Each non-empty line is one request event
|
|
98
|
+
return content.split('\n').filter(l => l.trim().length > 0).length;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Write the star-nudge-shown flag so it never fires again.
|
|
106
|
+
*/
|
|
107
|
+
function markStarNudgeShown() {
|
|
108
|
+
try {
|
|
109
|
+
const flagPath = getStarNudgeFlagFile();
|
|
110
|
+
const configDir = (0, config_js_1.getConfigDir)();
|
|
111
|
+
if (!fs.existsSync(configDir)) {
|
|
112
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
fs.writeFileSync(flagPath, JSON.stringify({ shown: true, timestamp: new Date().toISOString() }), 'utf-8');
|
|
115
|
+
starNudgeAlreadyShown = true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Silently ignore
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Print the star nudge to stderr.
|
|
123
|
+
*/
|
|
124
|
+
function printStarNudge() {
|
|
125
|
+
process.stderr.write(`\n⭐ Enjoying RelayPlane? Help other devs find it → ${GITHUB_URL}\n\n`);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check whether the star nudge should fire and, if so, show it.
|
|
129
|
+
*
|
|
130
|
+
* Call this AFTER the proxy response has been forwarded so there is
|
|
131
|
+
* zero added latency on the request path. This function is intentionally
|
|
132
|
+
* synchronous so it can be fire-and-forgotten without creating a dangling
|
|
133
|
+
* promise.
|
|
134
|
+
*
|
|
135
|
+
* @param requestCount Optional: pass the current cumulative count if you
|
|
136
|
+
* already have it (avoids re-reading the file).
|
|
137
|
+
*/
|
|
138
|
+
function checkAndShowStarNudge(requestCount) {
|
|
139
|
+
// Fast path — already shown, skip all I/O
|
|
140
|
+
if (starNudgeAlreadyShown)
|
|
141
|
+
return;
|
|
142
|
+
try {
|
|
143
|
+
const count = requestCount ?? countTelemetryRequests();
|
|
144
|
+
if (count >= STAR_NUDGE_THRESHOLD) {
|
|
145
|
+
printStarNudge();
|
|
146
|
+
markStarNudgeShown();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Star nudge must never break the proxy
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ── Test-seam exports (not part of public API) ────────────────────────────────
|
|
154
|
+
/** Reset in-memory flag (used in tests only) */
|
|
155
|
+
function _resetStarNudgeState() {
|
|
156
|
+
starNudgeAlreadyShown = false;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=star-nudge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star-nudge.js","sourceRoot":"","sources":["../src/star-nudge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relayplane/proxy",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.10",
|
|
4
4
|
"description": "Open source cost intelligence proxy for AI agents. Cut LLM costs ~80% with smart model routing. Dashboard, policy engine, 11 providers. MIT licensed.",
|
|
5
5
|
"homepage": "https://relayplane.com",
|
|
6
6
|
"repository": {
|
package/dist/osmosis-store.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Osmosis Phase 1 — KnowledgeAtom capture
|
|
3
|
-
*
|
|
4
|
-
* Stores per-request atoms in ~/.relayplane/osmosis.db (SQLite via better-sqlite3).
|
|
5
|
-
* Falls back to ~/.relayplane/osmosis.jsonl if SQLite is unavailable.
|
|
6
|
-
*
|
|
7
|
-
* All writes are fire-and-forget; errors are silently swallowed.
|
|
8
|
-
*/
|
|
9
|
-
export interface SuccessAtom {
|
|
10
|
-
type: 'success';
|
|
11
|
-
model: string;
|
|
12
|
-
taskType: string;
|
|
13
|
-
latencyMs: number;
|
|
14
|
-
inputTokens: number;
|
|
15
|
-
outputTokens: number;
|
|
16
|
-
timestamp: number;
|
|
17
|
-
}
|
|
18
|
-
export interface FailureAtom {
|
|
19
|
-
type: 'failure';
|
|
20
|
-
errorType: string;
|
|
21
|
-
model: string;
|
|
22
|
-
fallbackTaken: boolean;
|
|
23
|
-
timestamp: number;
|
|
24
|
-
}
|
|
25
|
-
export type KnowledgeAtom = SuccessAtom | FailureAtom;
|
|
26
|
-
/**
|
|
27
|
-
* Capture a KnowledgeAtom (fire-and-forget).
|
|
28
|
-
* Never throws. Writes to SQLite; falls back to JSONL.
|
|
29
|
-
*/
|
|
30
|
-
export declare function captureAtom(atom: KnowledgeAtom): void;
|
|
31
|
-
/** Exposed for testing — reset singleton state. */
|
|
32
|
-
export declare function _resetStore(): void;
|
|
33
|
-
//# sourceMappingURL=osmosis-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"osmosis-store.d.ts","sourceRoot":"","sources":["../src/osmosis-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;AA+EtD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAqCrD;AAED,mDAAmD;AACnD,wBAAgB,WAAW,IAAI,IAAI,CAOlC"}
|
package/dist/osmosis-store.js
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Osmosis Phase 1 — KnowledgeAtom capture
|
|
4
|
-
*
|
|
5
|
-
* Stores per-request atoms in ~/.relayplane/osmosis.db (SQLite via better-sqlite3).
|
|
6
|
-
* Falls back to ~/.relayplane/osmosis.jsonl if SQLite is unavailable.
|
|
7
|
-
*
|
|
8
|
-
* All writes are fire-and-forget; errors are silently swallowed.
|
|
9
|
-
*/
|
|
10
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
-
if (k2 === undefined) k2 = k;
|
|
12
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
-
}
|
|
16
|
-
Object.defineProperty(o, k2, desc);
|
|
17
|
-
}) : (function(o, m, k, k2) {
|
|
18
|
-
if (k2 === undefined) k2 = k;
|
|
19
|
-
o[k2] = m[k];
|
|
20
|
-
}));
|
|
21
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
-
}) : function(o, v) {
|
|
24
|
-
o["default"] = v;
|
|
25
|
-
});
|
|
26
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
-
var ownKeys = function(o) {
|
|
28
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
-
var ar = [];
|
|
30
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
-
return ar;
|
|
32
|
-
};
|
|
33
|
-
return ownKeys(o);
|
|
34
|
-
};
|
|
35
|
-
return function (mod) {
|
|
36
|
-
if (mod && mod.__esModule) return mod;
|
|
37
|
-
var result = {};
|
|
38
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
-
__setModuleDefault(result, mod);
|
|
40
|
-
return result;
|
|
41
|
-
};
|
|
42
|
-
})();
|
|
43
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.captureAtom = captureAtom;
|
|
45
|
-
exports._resetStore = _resetStore;
|
|
46
|
-
const fs = __importStar(require("node:fs"));
|
|
47
|
-
const os = __importStar(require("node:os"));
|
|
48
|
-
const path = __importStar(require("node:path"));
|
|
49
|
-
const SCHEMA_SQL = `
|
|
50
|
-
CREATE TABLE IF NOT EXISTS knowledge_atoms (
|
|
51
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
52
|
-
type TEXT NOT NULL,
|
|
53
|
-
model TEXT,
|
|
54
|
-
task_type TEXT,
|
|
55
|
-
latency_ms INTEGER,
|
|
56
|
-
input_tokens INTEGER,
|
|
57
|
-
output_tokens INTEGER,
|
|
58
|
-
error_type TEXT,
|
|
59
|
-
fallback_taken INTEGER,
|
|
60
|
-
timestamp INTEGER NOT NULL
|
|
61
|
-
);
|
|
62
|
-
`;
|
|
63
|
-
/** Lazy-initialised SQLite database handle, or null if unavailable. */
|
|
64
|
-
let _db = undefined;
|
|
65
|
-
let _jsonlPath = null;
|
|
66
|
-
let _insertStmt = null;
|
|
67
|
-
function getRelayplaneDir() {
|
|
68
|
-
// RELAYPLANE_HOME_OVERRIDE is used in tests to avoid writing to ~/.relayplane
|
|
69
|
-
const override = process.env['RELAYPLANE_HOME_OVERRIDE'];
|
|
70
|
-
const base = override ?? os.homedir();
|
|
71
|
-
return path.join(base, '.relayplane');
|
|
72
|
-
}
|
|
73
|
-
function ensureDir(dir) {
|
|
74
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
75
|
-
}
|
|
76
|
-
function initDb() {
|
|
77
|
-
try {
|
|
78
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
79
|
-
const Database = require('better-sqlite3');
|
|
80
|
-
const dir = getRelayplaneDir();
|
|
81
|
-
ensureDir(dir);
|
|
82
|
-
const dbPath = path.join(dir, 'osmosis.db');
|
|
83
|
-
const db = new Database(dbPath);
|
|
84
|
-
db.pragma('journal_mode = WAL');
|
|
85
|
-
db.exec(SCHEMA_SQL);
|
|
86
|
-
return db;
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function getDb() {
|
|
93
|
-
if (_db !== undefined)
|
|
94
|
-
return _db;
|
|
95
|
-
_db = initDb();
|
|
96
|
-
if (_db) {
|
|
97
|
-
_insertStmt = _db.prepare(`
|
|
98
|
-
INSERT INTO knowledge_atoms
|
|
99
|
-
(type, model, task_type, latency_ms, input_tokens, output_tokens, error_type, fallback_taken, timestamp)
|
|
100
|
-
VALUES
|
|
101
|
-
(@type, @model, @task_type, @latency_ms, @input_tokens, @output_tokens, @error_type, @fallback_taken, @timestamp)
|
|
102
|
-
`);
|
|
103
|
-
}
|
|
104
|
-
return _db;
|
|
105
|
-
}
|
|
106
|
-
function getJsonlPath() {
|
|
107
|
-
if (_jsonlPath)
|
|
108
|
-
return _jsonlPath;
|
|
109
|
-
const dir = getRelayplaneDir();
|
|
110
|
-
ensureDir(dir);
|
|
111
|
-
_jsonlPath = path.join(dir, 'osmosis.jsonl');
|
|
112
|
-
return _jsonlPath;
|
|
113
|
-
}
|
|
114
|
-
function writeToJsonl(atom) {
|
|
115
|
-
try {
|
|
116
|
-
fs.appendFileSync(getJsonlPath(), JSON.stringify(atom) + '\n', 'utf-8');
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
// best-effort
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Capture a KnowledgeAtom (fire-and-forget).
|
|
124
|
-
* Never throws. Writes to SQLite; falls back to JSONL.
|
|
125
|
-
*/
|
|
126
|
-
function captureAtom(atom) {
|
|
127
|
-
try {
|
|
128
|
-
const db = getDb();
|
|
129
|
-
if (db && _insertStmt) {
|
|
130
|
-
if (atom.type === 'success') {
|
|
131
|
-
_insertStmt.run({
|
|
132
|
-
type: atom.type,
|
|
133
|
-
model: atom.model ?? null,
|
|
134
|
-
task_type: atom.taskType ?? null,
|
|
135
|
-
latency_ms: atom.latencyMs,
|
|
136
|
-
input_tokens: atom.inputTokens,
|
|
137
|
-
output_tokens: atom.outputTokens,
|
|
138
|
-
error_type: null,
|
|
139
|
-
fallback_taken: null,
|
|
140
|
-
timestamp: atom.timestamp,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
_insertStmt.run({
|
|
145
|
-
type: atom.type,
|
|
146
|
-
model: atom.model ?? null,
|
|
147
|
-
task_type: null,
|
|
148
|
-
latency_ms: null,
|
|
149
|
-
input_tokens: null,
|
|
150
|
-
output_tokens: null,
|
|
151
|
-
error_type: atom.errorType ?? null,
|
|
152
|
-
fallback_taken: atom.fallbackTaken ? 1 : 0,
|
|
153
|
-
timestamp: atom.timestamp,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
// SQLite unavailable — fall back to JSONL
|
|
159
|
-
writeToJsonl(atom);
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// best-effort fallback
|
|
163
|
-
try {
|
|
164
|
-
writeToJsonl(atom);
|
|
165
|
-
}
|
|
166
|
-
catch { /* ignore */ }
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
/** Exposed for testing — reset singleton state. */
|
|
170
|
-
function _resetStore() {
|
|
171
|
-
if (_db) {
|
|
172
|
-
try {
|
|
173
|
-
_db.close();
|
|
174
|
-
}
|
|
175
|
-
catch { /* ignore */ }
|
|
176
|
-
}
|
|
177
|
-
_db = undefined;
|
|
178
|
-
_insertStmt = null;
|
|
179
|
-
_jsonlPath = null;
|
|
180
|
-
}
|
|
181
|
-
//# sourceMappingURL=osmosis-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"osmosis-store.js","sourceRoot":"","sources":["../src/osmosis-store.ts"],"names":[],"mappings":"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"}
|