@psiclawops/hypermem 0.9.7 → 0.9.9

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/INSTALL.md +29 -9
  3. package/README.md +5 -1
  4. package/assets/default-config.json +20 -5
  5. package/assets/runtime-validation-fixture.json +123 -0
  6. package/bin/hypermem-cleanup.mjs +334 -0
  7. package/bin/hypermem-doctor.mjs +71 -0
  8. package/bin/hypermem-validate-runtime.mjs +282 -0
  9. package/dist/compositor.d.ts +43 -5
  10. package/dist/compositor.d.ts.map +1 -1
  11. package/dist/compositor.js +802 -30
  12. package/dist/entity-bridge-backfill.d.ts +66 -0
  13. package/dist/entity-bridge-backfill.d.ts.map +1 -0
  14. package/dist/entity-bridge-backfill.js +145 -0
  15. package/dist/entity-bridge-store.d.ts +164 -0
  16. package/dist/entity-bridge-store.d.ts.map +1 -0
  17. package/dist/entity-bridge-store.js +488 -0
  18. package/dist/entity-extractor.d.ts +124 -0
  19. package/dist/entity-extractor.d.ts.map +1 -0
  20. package/dist/entity-extractor.js +382 -0
  21. package/dist/entity-ppr.d.ts +55 -0
  22. package/dist/entity-ppr.d.ts.map +1 -0
  23. package/dist/entity-ppr.js +180 -0
  24. package/dist/hybrid-retrieval.d.ts +27 -0
  25. package/dist/hybrid-retrieval.d.ts.map +1 -1
  26. package/dist/hybrid-retrieval.js +26 -1
  27. package/dist/index.d.ts +19 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +63 -13
  30. package/dist/message-store.d.ts +36 -0
  31. package/dist/message-store.d.ts.map +1 -1
  32. package/dist/message-store.js +155 -1
  33. package/dist/open-domain.d.ts +13 -4
  34. package/dist/open-domain.d.ts.map +1 -1
  35. package/dist/open-domain.js +222 -20
  36. package/dist/profiles.js +13 -13
  37. package/dist/question-shape.d.ts +73 -0
  38. package/dist/question-shape.d.ts.map +1 -0
  39. package/dist/question-shape.js +230 -0
  40. package/dist/schema.d.ts +1 -1
  41. package/dist/schema.d.ts.map +1 -1
  42. package/dist/schema.js +92 -1
  43. package/dist/topic-detector.d.ts.map +1 -1
  44. package/dist/topic-detector.js +22 -9
  45. package/dist/types.d.ts +176 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/vector-store.d.ts +6 -0
  48. package/dist/vector-store.d.ts.map +1 -1
  49. package/dist/vector-store.js +3 -0
  50. package/docs/DIAGNOSTICS.md +32 -0
  51. package/docs/INTEGRATION_VALIDATION.md +9 -4
  52. package/docs/TUNING.md +21 -21
  53. package/memory-plugin/dist/index.js +3 -1
  54. package/memory-plugin/package.json +8 -7
  55. package/package.json +10 -4
  56. package/plugin/dist/index.d.ts.map +1 -1
  57. package/plugin/dist/index.js +114 -11
  58. package/plugin/dist/index.js.map +1 -1
  59. package/plugin/package.json +9 -8
  60. package/scripts/install-runtime.mjs +4 -1
@@ -0,0 +1,66 @@
1
+ /**
2
+ * entity-bridge-backfill.ts \u2014 Sprint B
3
+ *
4
+ * Operator-run backfill for the entity/facet bridge index.
5
+ *
6
+ * Constraints (Sprint B planner):
7
+ * - Never runs at startup.
8
+ * - Only ever invoked through scripts/backfill-entity-bridge.mjs.
9
+ * - Counts only \u2014 never logs message content.
10
+ *
11
+ * Usage (from script):
12
+ * const summary = await runEntityBridgeBackfill(db, {
13
+ * agentId: 'forge',
14
+ * batchSize: 200,
15
+ * limit: 5000,
16
+ * dryRun: false,
17
+ * resume: true,
18
+ * sinceMessageId: 12345,
19
+ * reconcile: false,
20
+ * });
21
+ */
22
+ import type { DatabaseSync } from 'node:sqlite';
23
+ export interface BackfillOptions {
24
+ agentId?: string;
25
+ /** Rows fetched per scan tick. Default 200. */
26
+ batchSize?: number;
27
+ /** Hard cap on total messages scanned. Default Infinity. */
28
+ limit?: number;
29
+ /** When true, do not write any rows. Default false. */
30
+ dryRun?: boolean;
31
+ /** When true, skip messages already in entity_bridge_message_index. Default true. */
32
+ resume?: boolean;
33
+ /** Lower bound on message id (exclusive of \u2018already done\u2019 unless reconcile). */
34
+ sinceMessageId?: number;
35
+ /**
36
+ * When true, reprocess messages that already have an index row. Defaults to
37
+ * false. Reconcile mode still respects `limit`.
38
+ */
39
+ reconcile?: boolean;
40
+ /** Optional progress sink. Receives counts only. */
41
+ onProgress?: (s: BackfillProgress) => void;
42
+ }
43
+ export interface BackfillProgress {
44
+ scanned: number;
45
+ written: number;
46
+ skipped: number;
47
+ failed: number;
48
+ zeroMention: number;
49
+ highestMessageId: number | null;
50
+ }
51
+ export interface BackfillSummary extends BackfillProgress {
52
+ dryRun: boolean;
53
+ reconcile: boolean;
54
+ agentId?: string;
55
+ durationMs: number;
56
+ bridgeTablesPresent: boolean;
57
+ }
58
+ /**
59
+ * Run the backfill. Returns a counts-only summary suitable for logging.
60
+ *
61
+ * On any per-message extraction error we record a 'failed' index row (when
62
+ * not in dry-run mode) and continue. The whole run never throws unless the
63
+ * DB itself is broken.
64
+ */
65
+ export declare function runEntityBridgeBackfill(db: DatabaseSync, opts?: BackfillOptions): Promise<BackfillSummary>;
66
+ //# sourceMappingURL=entity-bridge-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-bridge-backfill.d.ts","sourceRoot":"","sources":["../src/entity-bridge-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qFAAqF;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,eAAe,CAAC,CAwH1B"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * entity-bridge-backfill.ts \u2014 Sprint B
3
+ *
4
+ * Operator-run backfill for the entity/facet bridge index.
5
+ *
6
+ * Constraints (Sprint B planner):
7
+ * - Never runs at startup.
8
+ * - Only ever invoked through scripts/backfill-entity-bridge.mjs.
9
+ * - Counts only \u2014 never logs message content.
10
+ *
11
+ * Usage (from script):
12
+ * const summary = await runEntityBridgeBackfill(db, {
13
+ * agentId: 'forge',
14
+ * batchSize: 200,
15
+ * limit: 5000,
16
+ * dryRun: false,
17
+ * resume: true,
18
+ * sinceMessageId: 12345,
19
+ * reconcile: false,
20
+ * });
21
+ */
22
+ import { EntityBridgeStore } from './entity-bridge-store.js';
23
+ import { extractEntityFacetMentions } from './entity-extractor.js';
24
+ /**
25
+ * Run the backfill. Returns a counts-only summary suitable for logging.
26
+ *
27
+ * On any per-message extraction error we record a 'failed' index row (when
28
+ * not in dry-run mode) and continue. The whole run never throws unless the
29
+ * DB itself is broken.
30
+ */
31
+ export async function runEntityBridgeBackfill(db, opts = {}) {
32
+ const start = Date.now();
33
+ const batchSize = Math.max(1, Math.min(5000, opts.batchSize ?? 200));
34
+ const limit = opts.limit && opts.limit > 0 ? opts.limit : Infinity;
35
+ const dryRun = Boolean(opts.dryRun);
36
+ const reconcile = Boolean(opts.reconcile);
37
+ const resume = opts.resume ?? !reconcile;
38
+ const sinceMessageId = opts.sinceMessageId ?? 0;
39
+ const agentId = opts.agentId;
40
+ const store = new EntityBridgeStore(db);
41
+ const tablesPresent = store.tablesExist();
42
+ const progress = {
43
+ scanned: 0,
44
+ written: 0,
45
+ skipped: 0,
46
+ failed: 0,
47
+ zeroMention: 0,
48
+ highestMessageId: null,
49
+ };
50
+ if (!tablesPresent) {
51
+ return {
52
+ ...progress,
53
+ dryRun,
54
+ reconcile,
55
+ agentId,
56
+ durationMs: Date.now() - start,
57
+ bridgeTablesPresent: false,
58
+ };
59
+ }
60
+ let cursor = sinceMessageId;
61
+ let remaining = limit;
62
+ // SQL: select messages above cursor in batches, optionally filtered by agent.
63
+ // We deliberately use COALESCE(text_content,'') length>0 so we don't index
64
+ // pure tool/heartbeat rows.
65
+ const baseSelect = `
66
+ SELECT m.id, m.conversation_id, m.agent_id, m.text_content
67
+ FROM messages m
68
+ ${reconcile ? '' : 'LEFT JOIN entity_bridge_message_index idx ON idx.message_id = m.id'}
69
+ WHERE m.id > ?
70
+ AND COALESCE(m.text_content, '') != ''
71
+ AND m.is_heartbeat = 0
72
+ ${agentId ? 'AND m.agent_id = ?' : ''}
73
+ ${resume && !reconcile ? 'AND idx.message_id IS NULL' : ''}
74
+ ORDER BY m.id ASC
75
+ LIMIT ?
76
+ `;
77
+ const stmt = db.prepare(baseSelect);
78
+ while (remaining > 0) {
79
+ const fetch = Math.min(batchSize, remaining);
80
+ const params = [cursor];
81
+ if (agentId)
82
+ params.push(agentId);
83
+ params.push(fetch);
84
+ const rows = stmt.all(...params);
85
+ if (rows.length === 0)
86
+ break;
87
+ for (const row of rows) {
88
+ progress.scanned++;
89
+ cursor = row.id;
90
+ progress.highestMessageId = row.id;
91
+ try {
92
+ const mentions = extractEntityFacetMentions(row.text_content);
93
+ if (dryRun) {
94
+ if (mentions.entities.length === 0 && mentions.facets.length === 0) {
95
+ progress.zeroMention++;
96
+ }
97
+ else {
98
+ progress.written++;
99
+ }
100
+ }
101
+ else {
102
+ const r = store.recordMentions({
103
+ messageId: row.id,
104
+ agentId: row.agent_id,
105
+ threadRef: row.conversation_id,
106
+ mentions,
107
+ source: 'backfill',
108
+ });
109
+ if (r.entityCount === 0 && r.facetCount === 0) {
110
+ progress.zeroMention++;
111
+ }
112
+ else {
113
+ progress.written++;
114
+ }
115
+ }
116
+ }
117
+ catch (err) {
118
+ progress.failed++;
119
+ if (!dryRun) {
120
+ store.recordIndexFailure({
121
+ messageId: row.id,
122
+ agentId: row.agent_id,
123
+ threadRef: row.conversation_id,
124
+ error: err,
125
+ source: 'backfill',
126
+ });
127
+ }
128
+ }
129
+ }
130
+ remaining -= rows.length;
131
+ if (opts.onProgress)
132
+ opts.onProgress({ ...progress });
133
+ if (rows.length < fetch)
134
+ break;
135
+ }
136
+ return {
137
+ ...progress,
138
+ dryRun,
139
+ reconcile,
140
+ agentId,
141
+ durationMs: Date.now() - start,
142
+ bridgeTablesPresent: true,
143
+ };
144
+ }
145
+ //# sourceMappingURL=entity-bridge-backfill.js.map
@@ -0,0 +1,164 @@
1
+ /**
2
+ * entity-bridge-store.ts \u2014 Sprint B
3
+ *
4
+ * Metadata-only CRUD/query helpers for the entity/facet bridge tables.
5
+ *
6
+ * Hard rule: this module never logs message content. Mention rows store
7
+ * a `match_term` (the surface form of the matched span) and offsets, but
8
+ * full message text remains in the `messages` table only.
9
+ *
10
+ * Tables (created by schema v12 migration):
11
+ * - memory_entities (agent_id, entity_key, display_name, ...)
12
+ * - memory_facets (agent_id, facet_key, ...)
13
+ * - message_entity_mentions (message_id, entity_id, ...)
14
+ * - message_facet_mentions (message_id, facet_id, ...)
15
+ * - entity_bridge_message_index (message_id, entity_count, facet_count, status, ...)
16
+ *
17
+ * The store is created on-demand. If the v12 tables are absent (older DB),
18
+ * `tablesExist()` returns false and all writes/reads are no-ops/empty.
19
+ */
20
+ import type { DatabaseSync } from 'node:sqlite';
21
+ import type { EntityFacetMentions } from './entity-extractor.js';
22
+ export interface BridgeIndexState {
23
+ exists: boolean;
24
+ status?: string;
25
+ source?: string;
26
+ entityCount?: number;
27
+ facetCount?: number;
28
+ indexedAt?: string;
29
+ lastError?: string | null;
30
+ }
31
+ export interface BridgeWatermarkDiagnostics {
32
+ totalMessages: number;
33
+ indexedMessages: number;
34
+ failedMessages: number;
35
+ zeroMentionMessages: number;
36
+ highestIndexedMessageId: number | null;
37
+ }
38
+ export interface BridgeCandidateMessage {
39
+ messageId: number;
40
+ threadRef: number | null;
41
+ matchedEntities: string[];
42
+ matchedFacets: string[];
43
+ }
44
+ export interface BridgeGraphNeighbor {
45
+ /** Entity or facet key. */
46
+ key: string;
47
+ /** Edge weight (mention count or co-occurrence count). */
48
+ weight: number;
49
+ }
50
+ export interface BridgeGraphSnapshot {
51
+ /** Map of entityKey -> messageIds[] (capped). */
52
+ entityMessages: Map<string, number[]>;
53
+ /** Map of facetKey -> messageIds[] (capped). */
54
+ facetMessages: Map<string, number[]>;
55
+ /** Map of messageId -> entity keys. */
56
+ messageEntities: Map<number, string[]>;
57
+ /** Map of messageId -> facet keys. */
58
+ messageFacets: Map<number, string[]>;
59
+ /** Diagnostics on cap behavior. */
60
+ diagnostics: {
61
+ nodeCount: number;
62
+ edgeCount: number;
63
+ seedExpanded: number;
64
+ nodesCapped: boolean;
65
+ edgesCapped: boolean;
66
+ };
67
+ }
68
+ export declare class EntityBridgeStore {
69
+ private readonly db;
70
+ private _tablesChecked;
71
+ private _tablesExist;
72
+ private _stmtUpsertEntity?;
73
+ private _stmtTouchEntity?;
74
+ private _stmtUpsertFacet?;
75
+ private _stmtTouchFacet?;
76
+ private _stmtInsertEntityMention?;
77
+ private _stmtInsertFacetMention?;
78
+ private _stmtUpsertIndex?;
79
+ private _stmtGetIndex?;
80
+ constructor(db: DatabaseSync);
81
+ /**
82
+ * Check whether all v12 bridge tables exist in this DB.
83
+ * Cached after the first call. Cheap when cached.
84
+ */
85
+ tablesExist(): boolean;
86
+ getIndexState(messageId: number): BridgeIndexState;
87
+ /**
88
+ * Watermark diagnostics: counts of indexed/failed/zero-mention messages
89
+ * and the highest indexed message id, scoped to a single agent.
90
+ */
91
+ getWatermarkDiagnostics(agentId: string): BridgeWatermarkDiagnostics;
92
+ /**
93
+ * Record entity/facet mentions for a single message. Always writes a
94
+ * row into `entity_bridge_message_index` even when there are zero mentions
95
+ * so that callers can distinguish "never indexed" from "indexed, no mentions".
96
+ *
97
+ * Wraps all writes in a single transaction. Returns whether any write
98
+ * occurred. On failure, records a 'failed' index row when possible and
99
+ * rethrows the underlying error so the caller can decide whether to surface.
100
+ */
101
+ recordMentions(input: {
102
+ messageId: number;
103
+ agentId: string;
104
+ threadRef?: number | null;
105
+ mentions: EntityFacetMentions;
106
+ source?: 'live' | 'backfill';
107
+ }): {
108
+ wrote: boolean;
109
+ entityCount: number;
110
+ facetCount: number;
111
+ };
112
+ /**
113
+ * Emit a metadata-only failure marker without attempting any mention writes.
114
+ * Used by callers (e.g. message-store live indexing) when extraction itself
115
+ * threw before reaching the store, or to record an index attempt that never
116
+ * produced mentions due to disabled tables.
117
+ */
118
+ recordIndexFailure(input: {
119
+ messageId: number;
120
+ agentId: string;
121
+ threadRef?: number | null;
122
+ error: unknown;
123
+ source?: 'live' | 'backfill';
124
+ }): boolean;
125
+ private recordIndexFailureEvent;
126
+ /**
127
+ * Look up the internal entity rows for a list of normalized entity keys.
128
+ * Missing keys are silently dropped.
129
+ */
130
+ lookupEntityIds(agentId: string, keys: string[]): Map<string, number>;
131
+ lookupFacetIds(agentId: string, keys: string[]): Map<string, number>;
132
+ /**
133
+ * Build a metadata-only graph snapshot for PPR. Bounded by node/edge caps.
134
+ *
135
+ * Algorithm:
136
+ * - Resolve seed entity/facet keys to internal ids.
137
+ * - For each seed, fetch up to `perSeedMessageLimit` mention rows.
138
+ * - Aggregate into message \u2194 entity \u2194 facet adjacency lists, capped.
139
+ */
140
+ buildGraphSnapshot(opts: {
141
+ agentId: string;
142
+ seedEntityKeys: string[];
143
+ seedFacetKeys: string[];
144
+ maxNodes: number;
145
+ maxEdges: number;
146
+ perSeedMessageLimit: number;
147
+ }): BridgeGraphSnapshot;
148
+ /**
149
+ * Resolve a list of message ids into candidate rows joined back to
150
+ * `messages` for compose-lane consumption. Returns the matched entity/facet
151
+ * keys per message as a side-channel diagnostic.
152
+ *
153
+ * Caller is expected to gate further rendering on whether a message's
154
+ * full text should be hydrated.
155
+ */
156
+ fetchCandidates(opts: {
157
+ agentId: string;
158
+ messageIds: number[];
159
+ }): BridgeCandidateMessage[];
160
+ private ensureUpsertStmts;
161
+ private upsertEntityRow;
162
+ private upsertFacetRow;
163
+ }
164
+ //# sourceMappingURL=entity-bridge-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-bridge-store.d.ts","sourceRoot":"","sources":["../src/entity-bridge-store.ts"],"names":[],"mappings":"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"}