@pcircle/memesh 4.1.6 → 4.2.0
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.de.md +43 -8
- package/README.es.md +77 -15
- package/README.fr.md +44 -9
- package/README.ja.md +78 -15
- package/README.ko.md +81 -18
- package/README.md +9 -7
- package/README.pt.md +43 -8
- package/README.th.md +41 -6
- package/README.vi.md +43 -8
- package/README.zh-CN.md +78 -15
- package/README.zh-TW.md +107 -44
- package/dashboard/dist/index.html +8 -8
- package/dist/cli/view-live.js +2 -2
- package/dist/cli/view.d.ts.map +1 -1
- package/dist/cli/view.js +8 -11
- package/dist/cli/view.js.map +1 -1
- package/dist/core/auto-tagger.d.ts +7 -2
- package/dist/core/auto-tagger.d.ts.map +1 -1
- package/dist/core/auto-tagger.js +12 -4
- package/dist/core/auto-tagger.js.map +1 -1
- package/dist/core/config.d.ts +2 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +19 -11
- package/dist/core/config.js.map +1 -1
- package/dist/core/consolidator.d.ts.map +1 -1
- package/dist/core/consolidator.js +13 -4
- package/dist/core/consolidator.js.map +1 -1
- package/dist/core/digest-validator.d.ts +18 -0
- package/dist/core/digest-validator.d.ts.map +1 -0
- package/dist/core/digest-validator.js +79 -0
- package/dist/core/digest-validator.js.map +1 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +28 -11
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/dreamer.d.ts +8 -1
- package/dist/core/dreamer.d.ts.map +1 -1
- package/dist/core/dreamer.js +68 -14
- package/dist/core/dreamer.js.map +1 -1
- package/dist/core/embedder.d.ts.map +1 -1
- package/dist/core/embedder.js +2 -2
- package/dist/core/embedder.js.map +1 -1
- package/dist/core/extractor.d.ts.map +1 -1
- package/dist/core/extractor.js +2 -1
- package/dist/core/extractor.js.map +1 -1
- package/dist/core/failure-analyzer.d.ts +6 -1
- package/dist/core/failure-analyzer.d.ts.map +1 -1
- package/dist/core/failure-analyzer.js +10 -2
- package/dist/core/failure-analyzer.js.map +1 -1
- package/dist/core/install-hooks.d.ts.map +1 -1
- package/dist/core/install-hooks.js +1 -7
- package/dist/core/install-hooks.js.map +1 -1
- package/dist/core/install-id.d.ts.map +1 -1
- package/dist/core/install-id.js +2 -3
- package/dist/core/install-id.js.map +1 -1
- package/dist/core/kg-backfill.d.ts +30 -0
- package/dist/core/kg-backfill.d.ts.map +1 -0
- package/dist/core/kg-backfill.js +197 -0
- package/dist/core/kg-backfill.js.map +1 -0
- package/dist/core/llm-client.d.ts +13 -0
- package/dist/core/llm-client.d.ts.map +1 -1
- package/dist/core/llm-client.js +63 -3
- package/dist/core/llm-client.js.map +1 -1
- package/dist/core/llm-telemetry.d.ts +35 -0
- package/dist/core/llm-telemetry.d.ts.map +1 -0
- package/dist/core/llm-telemetry.js +96 -0
- package/dist/core/llm-telemetry.js.map +1 -0
- package/dist/core/llm-validator.d.ts.map +1 -1
- package/dist/core/llm-validator.js +3 -3
- package/dist/core/llm-validator.js.map +1 -1
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +4 -35
- package/dist/core/operations.js.map +1 -1
- package/dist/core/paths.d.ts +6 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +27 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/prompt-safety.d.ts.map +1 -1
- package/dist/core/prompt-safety.js.map +1 -1
- package/dist/core/scoring.d.ts +5 -0
- package/dist/core/scoring.d.ts.map +1 -1
- package/dist/core/scoring.js +8 -0
- package/dist/core/scoring.js.map +1 -1
- package/dist/core/serializer.js +1 -1
- package/dist/core/serializer.js.map +1 -1
- package/dist/core/skill-usage-log.js +2 -2
- package/dist/core/skill-usage-log.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/verifier.d.ts.map +1 -1
- package/dist/core/verifier.js +4 -4
- package/dist/core/verifier.js.map +1 -1
- package/dist/core/version-check.d.ts.map +1 -1
- package/dist/core/version-check.js +4 -3
- package/dist/core/version-check.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +71 -14
- package/dist/db.js.map +1 -1
- package/dist/knowledge-graph.d.ts +1 -1
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +1 -1
- package/dist/knowledge-graph.js.map +1 -1
- package/dist/skills-manifest.json +16 -16
- package/dist/storage/fts-index.js +1 -1
- package/dist/storage/fts-index.js.map +1 -1
- package/dist/transports/cli/cli.js +118 -6
- package/dist/transports/cli/cli.js.map +1 -1
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +192 -24
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +1 -1
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +1 -1
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/package.json +2 -2
- package/scripts/hooks/_shared.js +177 -14
- package/scripts/hooks/post-commit.js +50 -8
- package/scripts/hooks/pre-bash-orchestration-nudge.js +8 -3
- package/scripts/hooks/pre-compact.js +13 -16
- package/scripts/hooks/pre-edit-recall.js +28 -13
- package/scripts/hooks/session-start.js +194 -184
- package/scripts/hooks/session-summary.js +377 -41
- package/dist/core/query-expander.d.ts +0 -4
- package/dist/core/query-expander.d.ts.map +0 -1
- package/dist/core/query-expander.js +0 -53
- package/dist/core/query-expander.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failure-analyzer.js","sourceRoot":"","sources":["../../src/core/failure-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"failure-analyzer.js","sourceRoot":"","sources":["../../src/core/failure-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/core/install-hooks.ts"],"names":[],"mappings":"AAsDA,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"install-hooks.d.ts","sourceRoot":"","sources":["../../src/core/install-hooks.ts"],"names":[],"mappings":"AAsDA,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAyGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,aAAa,CAgFhE;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAqCtE;AAOD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAQxD"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import os from 'os';
|
|
3
2
|
import path from 'path';
|
|
3
|
+
import { homeDir, memeshDir } from './paths.js';
|
|
4
4
|
const MARKER_FILE = 'install-hooks.json';
|
|
5
|
-
function homeDir() {
|
|
6
|
-
return process.env.HOME ?? os.homedir();
|
|
7
|
-
}
|
|
8
|
-
function memeshDir() {
|
|
9
|
-
return process.env.MEMESH_DIR ?? path.join(homeDir(), '.memesh');
|
|
10
|
-
}
|
|
11
5
|
function settingsPathFor(scope, cwd) {
|
|
12
6
|
if (scope === 'project') {
|
|
13
7
|
return path.join(cwd, '.claude', 'settings.json');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/core/install-hooks.ts"],"names":[],"mappings":"AAoCA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/core/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../../src/core/install-id.ts"],"names":[],"mappings":"AAyBA,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"install-id.d.ts","sourceRoot":"","sources":["../../src/core/install-id.ts"],"names":[],"mappings":"AAyBA,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,CAAC;CACnB;AAiBD,wBAAgB,gBAAgB,IAAI,aAAa,CAmChD;AAMD,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
package/dist/core/install-id.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
import os from 'os';
|
|
3
2
|
import path from 'path';
|
|
4
3
|
import { randomUUID } from 'crypto';
|
|
4
|
+
import { memeshDir } from './paths.js';
|
|
5
5
|
const SCHEMA_VERSION = 1;
|
|
6
6
|
function installFilePath() {
|
|
7
|
-
|
|
8
|
-
return path.join(dir, 'install.json');
|
|
7
|
+
return path.join(memeshDir(), 'install.json');
|
|
9
8
|
}
|
|
10
9
|
export function getInstallRecord() {
|
|
11
10
|
const filePath = installFilePath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../../src/core/install-id.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"install-id.js","sourceRoot":"","sources":["../../src/core/install-id.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQvC,MAAM,cAAc,GAAG,CAAU,CAAC;AAElC,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,cAAc,CAAC,CAAC;AAChD,CAAC;AAWD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;YACzD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1E,OAAO;oBACL,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBAChG,cAAc,EAAE,cAAc;iBAC/B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,UAAU,EAAE,UAAU,EAAE;QACxB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,cAAc,EAAE,cAAc;KAC/B,CAAC;IAEF,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAiB,CAAC;QAC9E,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAiB,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;IAGT,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD,MAAM,UAAU,YAAY;IAC1B,OAAO,gBAAgB,EAAE,CAAC,UAAU,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
export declare function isTopicalTag(tag: string): boolean;
|
|
3
|
+
export interface RelationCandidate {
|
|
4
|
+
fromEntityId: number;
|
|
5
|
+
fromName: string;
|
|
6
|
+
toEntityId: number;
|
|
7
|
+
toName: string;
|
|
8
|
+
relationType: 'related-to' | 'belongs-to-project';
|
|
9
|
+
reason: string;
|
|
10
|
+
strength: number;
|
|
11
|
+
}
|
|
12
|
+
export interface BackfillOptions {
|
|
13
|
+
project?: string;
|
|
14
|
+
maxEdgesPerSource?: number;
|
|
15
|
+
minSharedTags?: number;
|
|
16
|
+
includeArchived?: boolean;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface BackfillResult {
|
|
20
|
+
candidatesProposed: number;
|
|
21
|
+
edgesWritten: number;
|
|
22
|
+
dryRun: boolean;
|
|
23
|
+
byRule: {
|
|
24
|
+
tagCooccurrence: number;
|
|
25
|
+
projectClustering: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function backfillRelations(opts?: BackfillOptions, db?: Database.Database): BackfillResult;
|
|
29
|
+
export declare function proposeBackfillCandidates(opts?: BackfillOptions, db?: Database.Database): RelationCandidate[];
|
|
30
|
+
//# sourceMappingURL=kg-backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kg-backfill.d.ts","sourceRoot":"","sources":["../../src/core/kg-backfill.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AA8B3C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBjD;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,GAAG,oBAAoB,CAAC;IAElD,MAAM,EAAE,MAAM,CAAC;IAEf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAE9B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;CAChE;AAoBD,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,eAAoB,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,cAAc,CA+BpG;AAED,wBAAgB,yBAAyB,CAAC,IAAI,GAAE,eAAoB,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,iBAAiB,EAAE,CAmKjH"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { getDatabase } from '../db.js';
|
|
2
|
+
const SYSTEM_TAG_PREFIXES = [
|
|
3
|
+
'project:', 'week:', 'severity:', 'scope:', 'source:', 'date:',
|
|
4
|
+
'type:', 'urgency:', 'host:', 'session:', 'release:',
|
|
5
|
+
];
|
|
6
|
+
const SYSTEM_TAG_LITERALS = new Set([
|
|
7
|
+
'session_end', 'auto_saved', 'commit', 'auto-tracked',
|
|
8
|
+
'session-summary', 'session-insight', 'session_keypoint',
|
|
9
|
+
'workflow_checkpoint', 'auto', 'auto-captured',
|
|
10
|
+
'completed', 'plan-completion', 'lesson', 'verification',
|
|
11
|
+
'engineering-judgment', 'reference', 'plan',
|
|
12
|
+
]);
|
|
13
|
+
const DATE_TAG_RE = /^\d{4}-\d{2}-\d{2}/;
|
|
14
|
+
export function isTopicalTag(tag) {
|
|
15
|
+
if (!tag)
|
|
16
|
+
return false;
|
|
17
|
+
const lower = tag.toLowerCase();
|
|
18
|
+
if (DATE_TAG_RE.test(lower))
|
|
19
|
+
return false;
|
|
20
|
+
if (SYSTEM_TAG_LITERALS.has(lower))
|
|
21
|
+
return false;
|
|
22
|
+
for (const prefix of SYSTEM_TAG_PREFIXES) {
|
|
23
|
+
if (lower.startsWith(prefix)) {
|
|
24
|
+
if (prefix === 'topic:' || prefix === 'tech:')
|
|
25
|
+
return true;
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (lower.length < 2)
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
export function backfillRelations(opts = {}, db) {
|
|
34
|
+
const conn = db ?? getDatabase();
|
|
35
|
+
const candidates = proposeBackfillCandidates(opts, conn);
|
|
36
|
+
const result = {
|
|
37
|
+
candidatesProposed: candidates.length,
|
|
38
|
+
edgesWritten: 0,
|
|
39
|
+
dryRun: !!opts.dryRun,
|
|
40
|
+
byRule: { tagCooccurrence: 0, projectClustering: 0 },
|
|
41
|
+
};
|
|
42
|
+
if (opts.dryRun)
|
|
43
|
+
return result;
|
|
44
|
+
const insert = conn.prepare('INSERT OR IGNORE INTO relations (from_entity_id, to_entity_id, relation_type) VALUES (?, ?, ?)');
|
|
45
|
+
const tx = conn.transaction((rows) => {
|
|
46
|
+
for (const c of rows) {
|
|
47
|
+
const r = insert.run(c.fromEntityId, c.toEntityId, c.relationType);
|
|
48
|
+
if (r.changes > 0) {
|
|
49
|
+
result.edgesWritten++;
|
|
50
|
+
if (c.relationType === 'related-to')
|
|
51
|
+
result.byRule.tagCooccurrence++;
|
|
52
|
+
else if (c.relationType === 'belongs-to-project')
|
|
53
|
+
result.byRule.projectClustering++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
tx(candidates);
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
export function proposeBackfillCandidates(opts = {}, db) {
|
|
61
|
+
const conn = db ?? getDatabase();
|
|
62
|
+
const maxPerSource = opts.maxEdgesPerSource ?? 3;
|
|
63
|
+
const minShared = opts.minSharedTags ?? 2;
|
|
64
|
+
const statusFilter = opts.includeArchived ? "" : "AND e.status = 'active'";
|
|
65
|
+
const projectClause = opts.project ? "AND EXISTS (SELECT 1 FROM tags t2 WHERE t2.entity_id = e.id AND t2.tag = ?)" : "";
|
|
66
|
+
const projectArgs = opts.project ? [`project:${opts.project}`] : [];
|
|
67
|
+
const orphans = conn.prepare(`
|
|
68
|
+
SELECT e.id, e.name, e.type, e.metadata
|
|
69
|
+
FROM entities e
|
|
70
|
+
WHERE 1=1 ${statusFilter}
|
|
71
|
+
${projectClause}
|
|
72
|
+
AND NOT EXISTS (SELECT 1 FROM relations r WHERE r.from_entity_id = e.id OR r.to_entity_id = e.id)
|
|
73
|
+
`).all(...projectArgs);
|
|
74
|
+
if (orphans.length === 0)
|
|
75
|
+
return [];
|
|
76
|
+
const allTagRows = conn.prepare(`
|
|
77
|
+
SELECT t.entity_id, t.tag
|
|
78
|
+
FROM tags t
|
|
79
|
+
JOIN entities e ON e.id = t.entity_id
|
|
80
|
+
WHERE 1=1 ${statusFilter}
|
|
81
|
+
`).all();
|
|
82
|
+
const tagsByEntity = new Map();
|
|
83
|
+
const entitiesByTag = new Map();
|
|
84
|
+
for (const row of allTagRows) {
|
|
85
|
+
if (!isTopicalTag(row.tag))
|
|
86
|
+
continue;
|
|
87
|
+
let set = tagsByEntity.get(row.entity_id);
|
|
88
|
+
if (!set) {
|
|
89
|
+
set = new Set();
|
|
90
|
+
tagsByEntity.set(row.entity_id, set);
|
|
91
|
+
}
|
|
92
|
+
set.add(row.tag);
|
|
93
|
+
let list = entitiesByTag.get(row.tag);
|
|
94
|
+
if (!list) {
|
|
95
|
+
list = [];
|
|
96
|
+
entitiesByTag.set(row.tag, list);
|
|
97
|
+
}
|
|
98
|
+
list.push(row.entity_id);
|
|
99
|
+
}
|
|
100
|
+
const candidates = [];
|
|
101
|
+
const orphanById = new Map();
|
|
102
|
+
for (const o of orphans)
|
|
103
|
+
orphanById.set(o.id, o);
|
|
104
|
+
const allEntities = conn.prepare(`SELECT e.id, e.name, e.type FROM entities e WHERE 1=1 ${statusFilter}`).all();
|
|
105
|
+
const entityById = new Map();
|
|
106
|
+
for (const e of allEntities)
|
|
107
|
+
entityById.set(e.id, e);
|
|
108
|
+
for (const orphan of orphans) {
|
|
109
|
+
const orphanTags = tagsByEntity.get(orphan.id);
|
|
110
|
+
if (!orphanTags || orphanTags.size < minShared)
|
|
111
|
+
continue;
|
|
112
|
+
const overlapByPeer = new Map();
|
|
113
|
+
for (const tag of orphanTags) {
|
|
114
|
+
const peerIds = entitiesByTag.get(tag) ?? [];
|
|
115
|
+
for (const peerId of peerIds) {
|
|
116
|
+
if (peerId === orphan.id)
|
|
117
|
+
continue;
|
|
118
|
+
overlapByPeer.set(peerId, (overlapByPeer.get(peerId) ?? 0) + 1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const ranked = [...overlapByPeer.entries()]
|
|
122
|
+
.filter(([_, n]) => n >= minShared)
|
|
123
|
+
.sort((a, b) => b[1] - a[1])
|
|
124
|
+
.slice(0, maxPerSource);
|
|
125
|
+
for (const [peerId, sharedCount] of ranked) {
|
|
126
|
+
const peer = entityById.get(peerId);
|
|
127
|
+
if (!peer)
|
|
128
|
+
continue;
|
|
129
|
+
candidates.push({
|
|
130
|
+
fromEntityId: orphan.id,
|
|
131
|
+
fromName: orphan.name,
|
|
132
|
+
toEntityId: peer.id,
|
|
133
|
+
toName: peer.name,
|
|
134
|
+
relationType: 'related-to',
|
|
135
|
+
reason: `shares ${sharedCount} topical tag${sharedCount > 1 ? 's' : ''}`,
|
|
136
|
+
strength: sharedCount,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const consumerTypes = new Set(['lesson_learned', 'lesson', 'decision', 'bug_fix', 'pattern', 'mistake', 'best_practice']);
|
|
141
|
+
const anchorTypes = new Set(['release', 'feature', 'architecture', 'plan']);
|
|
142
|
+
const anchorsByProject = new Map();
|
|
143
|
+
const projectAnchorRows = conn.prepare(`
|
|
144
|
+
SELECT e.id, e.name, e.type, e.created_at, t.tag AS project_tag
|
|
145
|
+
FROM entities e
|
|
146
|
+
JOIN tags t ON t.entity_id = e.id AND t.tag LIKE 'project:%'
|
|
147
|
+
WHERE 1=1 ${statusFilter}
|
|
148
|
+
AND e.type IN (${[...anchorTypes].map(() => '?').join(',')})
|
|
149
|
+
`).all(...anchorTypes);
|
|
150
|
+
for (const r of projectAnchorRows) {
|
|
151
|
+
const project = r.project_tag.slice('project:'.length);
|
|
152
|
+
let list = anchorsByProject.get(project);
|
|
153
|
+
if (!list) {
|
|
154
|
+
list = [];
|
|
155
|
+
anchorsByProject.set(project, list);
|
|
156
|
+
}
|
|
157
|
+
list.push({ id: r.id, name: r.name, type: r.type, created_at: r.created_at });
|
|
158
|
+
}
|
|
159
|
+
for (const list of anchorsByProject.values()) {
|
|
160
|
+
list.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
161
|
+
}
|
|
162
|
+
const orphanProjectRows = conn.prepare(`
|
|
163
|
+
SELECT t.entity_id, t.tag
|
|
164
|
+
FROM tags t
|
|
165
|
+
JOIN entities e ON e.id = t.entity_id
|
|
166
|
+
WHERE 1=1 ${statusFilter}
|
|
167
|
+
AND t.tag LIKE 'project:%'
|
|
168
|
+
AND NOT EXISTS (SELECT 1 FROM relations r WHERE r.from_entity_id = e.id OR r.to_entity_id = e.id)
|
|
169
|
+
`).all();
|
|
170
|
+
const orphanProject = new Map();
|
|
171
|
+
for (const r of orphanProjectRows)
|
|
172
|
+
orphanProject.set(r.entity_id, r.tag.slice('project:'.length));
|
|
173
|
+
for (const orphan of orphans) {
|
|
174
|
+
if (!consumerTypes.has(orphan.type))
|
|
175
|
+
continue;
|
|
176
|
+
const project = orphanProject.get(orphan.id);
|
|
177
|
+
if (!project)
|
|
178
|
+
continue;
|
|
179
|
+
const anchors = anchorsByProject.get(project);
|
|
180
|
+
if (!anchors || anchors.length === 0)
|
|
181
|
+
continue;
|
|
182
|
+
const anchor = anchors[0];
|
|
183
|
+
if (anchor.id === orphan.id)
|
|
184
|
+
continue;
|
|
185
|
+
candidates.push({
|
|
186
|
+
fromEntityId: orphan.id,
|
|
187
|
+
fromName: orphan.name,
|
|
188
|
+
toEntityId: anchor.id,
|
|
189
|
+
toName: anchor.name,
|
|
190
|
+
relationType: 'belongs-to-project',
|
|
191
|
+
reason: `same-project anchor (${anchor.type})`,
|
|
192
|
+
strength: 1,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
return candidates;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=kg-backfill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kg-backfill.js","sourceRoot":"","sources":["../../src/core/kg-backfill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import type { LLMConfig } from './config.js';
|
|
2
|
+
export type LLMErrorClass = 'auth' | 'rate_limit' | 'upstream' | 'bad_request' | 'network' | 'unknown';
|
|
3
|
+
export interface LLMAttempt {
|
|
4
|
+
provider: LLMConfig['provider'];
|
|
5
|
+
model?: string;
|
|
6
|
+
status: 'ok' | 'fail';
|
|
7
|
+
latencyMs: number;
|
|
8
|
+
errorClass?: LLMErrorClass;
|
|
9
|
+
errorMessage?: string;
|
|
10
|
+
index: number;
|
|
11
|
+
}
|
|
2
12
|
export interface CallLLMOptions {
|
|
3
13
|
maxTokens?: number;
|
|
14
|
+
fallbacks?: LLMConfig[];
|
|
15
|
+
onAttempt?: (attempts: LLMAttempt[]) => void;
|
|
4
16
|
}
|
|
5
17
|
export declare function callLLM(prompt: string, config: LLMConfig, opts?: CallLLMOptions): Promise<string>;
|
|
18
|
+
export declare function classifyError(e: Error): LLMErrorClass;
|
|
6
19
|
//# sourceMappingURL=llm-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/core/llm-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../../src/core/llm-client.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,YAAY,GACZ,UAAU,GACV,aAAa,GACb,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IAEtB,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,CAAC,EAAE,aAAa,CAAC;IAE3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAE7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC;IAQxB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;CAC9C;AAoBD,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqCjB;AA+ED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAgBrD"}
|
package/dist/core/llm-client.js
CHANGED
|
@@ -1,9 +1,48 @@
|
|
|
1
1
|
export async function callLLM(prompt, config, opts = {}) {
|
|
2
|
-
const
|
|
2
|
+
const chain = [config, ...(opts.fallbacks ?? [])];
|
|
3
|
+
const attempts = [];
|
|
4
|
+
const reportAttempts = () => {
|
|
5
|
+
if (!opts.onAttempt)
|
|
6
|
+
return;
|
|
7
|
+
try {
|
|
8
|
+
opts.onAttempt(attempts);
|
|
9
|
+
}
|
|
10
|
+
catch { }
|
|
11
|
+
};
|
|
12
|
+
let lastErr = null;
|
|
13
|
+
for (let i = 0; i < chain.length; i++) {
|
|
14
|
+
const cfg = chain[i];
|
|
15
|
+
const t0 = Date.now();
|
|
16
|
+
try {
|
|
17
|
+
const text = await callSingle(prompt, cfg, opts.maxTokens ?? 200);
|
|
18
|
+
attempts.push({
|
|
19
|
+
provider: cfg.provider, model: cfg.model,
|
|
20
|
+
status: 'ok', latencyMs: Date.now() - t0, index: i,
|
|
21
|
+
});
|
|
22
|
+
reportAttempts();
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
27
|
+
const klass = classifyError(e);
|
|
28
|
+
attempts.push({
|
|
29
|
+
provider: cfg.provider, model: cfg.model,
|
|
30
|
+
status: 'fail', latencyMs: Date.now() - t0,
|
|
31
|
+
errorClass: klass, errorMessage: redactSecrets(e.message), index: i,
|
|
32
|
+
});
|
|
33
|
+
lastErr = e;
|
|
34
|
+
if (klass === 'bad_request')
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
reportAttempts();
|
|
39
|
+
throw lastErr ?? new Error('callLLM: no providers configured');
|
|
40
|
+
}
|
|
41
|
+
async function callSingle(prompt, config, maxTokens) {
|
|
3
42
|
if (config.provider === 'anthropic') {
|
|
4
43
|
const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
|
|
5
44
|
if (!apiKey)
|
|
6
|
-
throw new Error('
|
|
45
|
+
throw new Error('Anthropic: no API key configured');
|
|
7
46
|
const res = await fetch('https://api.anthropic.com/v1/messages', {
|
|
8
47
|
method: 'POST',
|
|
9
48
|
headers: {
|
|
@@ -25,7 +64,7 @@ export async function callLLM(prompt, config, opts = {}) {
|
|
|
25
64
|
if (config.provider === 'openai') {
|
|
26
65
|
const apiKey = config.apiKey || process.env.OPENAI_API_KEY;
|
|
27
66
|
if (!apiKey)
|
|
28
|
-
throw new Error('
|
|
67
|
+
throw new Error('OpenAI: no API key configured');
|
|
29
68
|
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
|
30
69
|
method: 'POST',
|
|
31
70
|
headers: {
|
|
@@ -61,4 +100,25 @@ export async function callLLM(prompt, config, opts = {}) {
|
|
|
61
100
|
}
|
|
62
101
|
return '';
|
|
63
102
|
}
|
|
103
|
+
export function classifyError(e) {
|
|
104
|
+
const msg = e.message;
|
|
105
|
+
if (/\b(401|403|invalid_api_key|authentication|x-api-key|unauthorized)\b/i.test(msg))
|
|
106
|
+
return 'auth';
|
|
107
|
+
if (/no API key/i.test(msg))
|
|
108
|
+
return 'auth';
|
|
109
|
+
if (/\b(429|rate.?limit|quota)\b/i.test(msg))
|
|
110
|
+
return 'rate_limit';
|
|
111
|
+
if (/\b(50[023]|service unavailable|bad gateway)\b/i.test(msg))
|
|
112
|
+
return 'upstream';
|
|
113
|
+
if (/\b400\b/.test(msg))
|
|
114
|
+
return 'bad_request';
|
|
115
|
+
if (/(ENOTFOUND|ECONNREFUSED|ECONNRESET|ETIMEDOUT|fetch failed|aborted)/i.test(msg))
|
|
116
|
+
return 'network';
|
|
117
|
+
return 'unknown';
|
|
118
|
+
}
|
|
119
|
+
function redactSecrets(msg) {
|
|
120
|
+
return msg
|
|
121
|
+
.replace(/sk-[A-Za-z0-9_-]{8,}/g, 'sk-<REDACTED>')
|
|
122
|
+
.replace(/Bearer\s+[A-Za-z0-9_.-]{8,}/gi, 'Bearer <REDACTED>');
|
|
123
|
+
}
|
|
64
124
|
//# sourceMappingURL=llm-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/core/llm-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../../src/core/llm-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { LLMAttempt } from './llm-client.js';
|
|
3
|
+
export interface RecordTelemetryOpts {
|
|
4
|
+
flow: string;
|
|
5
|
+
project?: string;
|
|
6
|
+
db?: Database.Database;
|
|
7
|
+
}
|
|
8
|
+
export declare function recordTelemetry(attempts: LLMAttempt[], opts: RecordTelemetryOpts): void;
|
|
9
|
+
export interface TelemetrySummary {
|
|
10
|
+
flow: string;
|
|
11
|
+
total_calls: number;
|
|
12
|
+
total_attempts: number;
|
|
13
|
+
successes: number;
|
|
14
|
+
failures: number;
|
|
15
|
+
fallback_used: number;
|
|
16
|
+
median_latency_ms: number | null;
|
|
17
|
+
by_provider: Record<string, {
|
|
18
|
+
ok: number;
|
|
19
|
+
fail: number;
|
|
20
|
+
}>;
|
|
21
|
+
by_error_class: Record<string, number>;
|
|
22
|
+
window_days: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function summariseTelemetry(windowDays?: number, db?: Database.Database): TelemetrySummary[];
|
|
25
|
+
export interface PruneOptions {
|
|
26
|
+
olderThanDays?: number;
|
|
27
|
+
db?: Database.Database;
|
|
28
|
+
}
|
|
29
|
+
export interface PruneResult {
|
|
30
|
+
deletedRows: number;
|
|
31
|
+
cutoffIso: string;
|
|
32
|
+
totalRowsAfter: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function pruneTelemetry(opts?: PruneOptions): PruneResult;
|
|
35
|
+
//# sourceMappingURL=llm-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-telemetry.d.ts","sourceRoot":"","sources":["../../src/core/llm-telemetry.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,mBAAmB;IAElC,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CACxB;AAcD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAyCvF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,kBAAkB,CAAC,UAAU,SAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAkE9F;AAED,MAAM,WAAW,YAAY;IAE3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,cAAc,CAAC,IAAI,GAAE,YAAiB,GAAG,WAAW,CAkBnE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { getDatabase } from '../db.js';
|
|
2
|
+
export function recordTelemetry(attempts, opts) {
|
|
3
|
+
if (!attempts || attempts.length === 0)
|
|
4
|
+
return;
|
|
5
|
+
let db;
|
|
6
|
+
try {
|
|
7
|
+
db = opts.db ?? getDatabase();
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const stmt = db.prepare(`
|
|
13
|
+
INSERT INTO llm_telemetry (
|
|
14
|
+
flow, provider, model, project, attempt_index, status,
|
|
15
|
+
latency_ms, error_class, error_message, fallback_used
|
|
16
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
17
|
+
`);
|
|
18
|
+
const tx = db.transaction((rows) => {
|
|
19
|
+
for (const a of rows) {
|
|
20
|
+
try {
|
|
21
|
+
stmt.run(opts.flow, a.provider, a.model ?? null, opts.project ?? null, a.index, a.status, a.latencyMs, a.errorClass ?? null, a.errorMessage ?? null, a.index > 0 ? 1 : 0);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
tx(attempts);
|
|
29
|
+
}
|
|
30
|
+
catch { }
|
|
31
|
+
}
|
|
32
|
+
export function summariseTelemetry(windowDays = 30, db) {
|
|
33
|
+
const conn = db ?? getDatabase();
|
|
34
|
+
const since = new Date(Date.now() - windowDays * 86400000).toISOString();
|
|
35
|
+
const rows = conn.prepare(`
|
|
36
|
+
SELECT flow, provider, status, latency_ms, error_class, attempt_index, fallback_used
|
|
37
|
+
FROM llm_telemetry
|
|
38
|
+
WHERE ts >= ?
|
|
39
|
+
ORDER BY ts ASC
|
|
40
|
+
`).all(since);
|
|
41
|
+
const byFlow = new Map();
|
|
42
|
+
for (const r of rows) {
|
|
43
|
+
let bucket = byFlow.get(r.flow);
|
|
44
|
+
if (!bucket) {
|
|
45
|
+
bucket = { attempts: [], primaryAttempts: 0 };
|
|
46
|
+
byFlow.set(r.flow, bucket);
|
|
47
|
+
}
|
|
48
|
+
bucket.attempts.push(r);
|
|
49
|
+
if (r.attempt_index === 0)
|
|
50
|
+
bucket.primaryAttempts++;
|
|
51
|
+
}
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const [flow, bucket] of byFlow) {
|
|
54
|
+
const successes = bucket.attempts.filter(a => a.status === 'ok').length;
|
|
55
|
+
const failures = bucket.attempts.filter(a => a.status === 'fail').length;
|
|
56
|
+
const fallbackUsed = bucket.attempts.filter(a => a.fallback_used === 1).length;
|
|
57
|
+
const okLatencies = bucket.attempts.filter(a => a.status === 'ok' && a.latency_ms != null).map(a => a.latency_ms).sort((a, b) => a - b);
|
|
58
|
+
const median = okLatencies.length === 0 ? null : okLatencies[Math.floor(okLatencies.length / 2)];
|
|
59
|
+
const byProvider = {};
|
|
60
|
+
for (const a of bucket.attempts) {
|
|
61
|
+
byProvider[a.provider] ??= { ok: 0, fail: 0 };
|
|
62
|
+
byProvider[a.provider][a.status === 'ok' ? 'ok' : 'fail']++;
|
|
63
|
+
}
|
|
64
|
+
const byErrorClass = {};
|
|
65
|
+
for (const a of bucket.attempts) {
|
|
66
|
+
if (a.error_class)
|
|
67
|
+
byErrorClass[a.error_class] = (byErrorClass[a.error_class] ?? 0) + 1;
|
|
68
|
+
}
|
|
69
|
+
out.push({
|
|
70
|
+
flow,
|
|
71
|
+
total_calls: bucket.primaryAttempts,
|
|
72
|
+
total_attempts: bucket.attempts.length,
|
|
73
|
+
successes,
|
|
74
|
+
failures,
|
|
75
|
+
fallback_used: fallbackUsed,
|
|
76
|
+
median_latency_ms: median,
|
|
77
|
+
by_provider: byProvider,
|
|
78
|
+
by_error_class: byErrorClass,
|
|
79
|
+
window_days: windowDays,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return out.sort((a, b) => b.total_attempts - a.total_attempts);
|
|
83
|
+
}
|
|
84
|
+
export function pruneTelemetry(opts = {}) {
|
|
85
|
+
const olderThanDays = opts.olderThanDays ?? 180;
|
|
86
|
+
const db = opts.db ?? getDatabase();
|
|
87
|
+
const cutoffIso = new Date(Date.now() - olderThanDays * 86400000).toISOString();
|
|
88
|
+
const result = db.prepare('DELETE FROM llm_telemetry WHERE ts < ?').run(cutoffIso);
|
|
89
|
+
const totalRowsAfter = db.prepare('SELECT COUNT(*) AS c FROM llm_telemetry').get().c;
|
|
90
|
+
return {
|
|
91
|
+
deletedRows: result.changes,
|
|
92
|
+
cutoffIso,
|
|
93
|
+
totalRowsAfter,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=llm-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-telemetry.js","sourceRoot":"","sources":["../../src/core/llm-telemetry.ts"],"names":[],"mappings":"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"}
|