@jungjaehoon/mama-core 1.5.0 → 1.6.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.
Files changed (78) hide show
  1. package/README.md +48 -10
  2. package/db/migrations/032-add-memory-provenance-columns.sql +21 -0
  3. package/db/migrations/033-create-model-runs-and-tool-traces.sql +53 -0
  4. package/db/migrations/034-add-connector-event-scope-columns.sql +14 -0
  5. package/db/migrations/035-create-twin-edges.sql +63 -0
  6. package/db/migrations/036-create-agent-situation-packets.sql +61 -0
  7. package/dist/agent-graph/alias-write.d.ts +3 -0
  8. package/dist/agent-graph/alias-write.js +231 -0
  9. package/dist/agent-graph/entity-resolve.d.ts +3 -0
  10. package/dist/agent-graph/entity-resolve.js +275 -0
  11. package/dist/agent-graph/errors.d.ts +4 -0
  12. package/dist/agent-graph/errors.js +11 -0
  13. package/dist/agent-graph/graph-query.d.ts +5 -0
  14. package/dist/agent-graph/graph-query.js +359 -0
  15. package/dist/agent-graph/index.d.ts +6 -0
  16. package/dist/agent-graph/index.js +22 -0
  17. package/dist/agent-graph/types.d.ts +162 -0
  18. package/dist/agent-graph/types.js +3 -0
  19. package/dist/agent-situation/builder.d.ts +8 -0
  20. package/dist/agent-situation/builder.js +239 -0
  21. package/dist/agent-situation/cache-key.d.ts +4 -0
  22. package/dist/agent-situation/cache-key.js +64 -0
  23. package/dist/agent-situation/index.d.ts +7 -0
  24. package/dist/agent-situation/index.js +28 -0
  25. package/dist/agent-situation/packet-store.d.ts +27 -0
  26. package/dist/agent-situation/packet-store.js +228 -0
  27. package/dist/agent-situation/ranking-policy.d.ts +18 -0
  28. package/dist/agent-situation/ranking-policy.js +75 -0
  29. package/dist/agent-situation/source-readers.d.ts +52 -0
  30. package/dist/agent-situation/source-readers.js +300 -0
  31. package/dist/agent-situation/types.d.ts +195 -0
  32. package/dist/agent-situation/types.js +3 -0
  33. package/dist/cases/search-rollup.d.ts +4 -0
  34. package/dist/cases/search-rollup.js +84 -0
  35. package/dist/connectors/event-index.d.ts +1 -0
  36. package/dist/connectors/event-index.js +19 -4
  37. package/dist/connectors/raw-query.d.ts +18 -0
  38. package/dist/connectors/raw-query.js +305 -0
  39. package/dist/connectors/types.d.ts +40 -0
  40. package/dist/db-adapter/node-sqlite-adapter.d.ts +6 -0
  41. package/dist/db-adapter/node-sqlite-adapter.js +131 -0
  42. package/dist/db-manager.d.ts +8 -1
  43. package/dist/db-manager.js +53 -5
  44. package/dist/edges/ref-validation.d.ts +8 -0
  45. package/dist/edges/ref-validation.js +262 -0
  46. package/dist/edges/store.d.ts +10 -0
  47. package/dist/edges/store.js +343 -0
  48. package/dist/edges/types.d.ts +86 -0
  49. package/dist/edges/types.js +18 -0
  50. package/dist/embeddings.js +13 -0
  51. package/dist/index.d.ts +17 -3
  52. package/dist/index.js +53 -4
  53. package/dist/mama-api.d.ts +32 -35
  54. package/dist/mama-api.js +173 -22
  55. package/dist/memory/api.d.ts +17 -56
  56. package/dist/memory/api.js +494 -52
  57. package/dist/memory/event-store.d.ts +3 -0
  58. package/dist/memory/event-store.js +21 -2
  59. package/dist/memory/provenance-audit.d.ts +22 -0
  60. package/dist/memory/provenance-audit.js +112 -0
  61. package/dist/memory/provenance-query.d.ts +11 -0
  62. package/dist/memory/provenance-query.js +193 -0
  63. package/dist/memory/provenance.d.ts +29 -0
  64. package/dist/memory/provenance.js +136 -0
  65. package/dist/memory/scope-backfill.d.ts +17 -0
  66. package/dist/memory/scope-backfill.js +77 -0
  67. package/dist/memory/types.d.ts +86 -14
  68. package/dist/model-runs/store.d.ts +13 -0
  69. package/dist/model-runs/store.js +457 -0
  70. package/dist/model-runs/tool-trace-store.d.ts +4 -0
  71. package/dist/model-runs/tool-trace-store.js +114 -0
  72. package/dist/model-runs/types.d.ts +69 -0
  73. package/dist/model-runs/types.js +5 -0
  74. package/dist/runtime/trusted-provenance.d.ts +3 -0
  75. package/dist/runtime/trusted-provenance.js +6 -0
  76. package/dist/search/search-quality.d.ts +36 -0
  77. package/dist/search/search-quality.js +29 -0
  78. package/package.json +9 -2
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.appendToolTrace = appendToolTrace;
7
+ exports.listToolTracesForRun = listToolTracesForRun;
8
+ const node_crypto_1 = __importDefault(require("node:crypto"));
9
+ const db_manager_js_1 = require("../db-manager.js");
10
+ function traceId() {
11
+ return `tr_${node_crypto_1.default.randomUUID().replace(/-/g, '')}`;
12
+ }
13
+ function requiredString(value, field) {
14
+ if (typeof value !== 'string' || value.length === 0) {
15
+ throw new Error(`tool_traces.${field} must be a non-empty string: ${formatInvalidValue(value)}`);
16
+ }
17
+ return value;
18
+ }
19
+ function formatInvalidValue(value) {
20
+ return typeof value === 'string' ? JSON.stringify(value) : String(value);
21
+ }
22
+ function nullableString(value) {
23
+ return typeof value === 'string' && value.length > 0 ? value : null;
24
+ }
25
+ function normalizeTimestamp(value) {
26
+ if (value === undefined || value === null) {
27
+ return Date.now();
28
+ }
29
+ return requiredInteger(value, 'created_at');
30
+ }
31
+ function normalizeDuration(value) {
32
+ if (value === undefined || value === null) {
33
+ return 0;
34
+ }
35
+ return requiredNonNegativeInteger(value, 'duration_ms');
36
+ }
37
+ function requiredInteger(value, field) {
38
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
39
+ throw new Error(`tool_traces.${field} must be a finite number: ${formatInvalidValue(value)}`);
40
+ }
41
+ return Math.floor(value);
42
+ }
43
+ function requiredNonNegativeInteger(value, field) {
44
+ const normalized = requiredInteger(value, field);
45
+ if (normalized < 0) {
46
+ throw new Error(`tool_traces.${field} must be non-negative: ${formatInvalidValue(value)}`);
47
+ }
48
+ return normalized;
49
+ }
50
+ function mapToolTraceRow(row) {
51
+ return {
52
+ trace_id: requiredString(row.trace_id, 'trace_id'),
53
+ model_run_id: requiredString(row.model_run_id, 'model_run_id'),
54
+ gateway_call_id: nullableString(row.gateway_call_id),
55
+ tool_name: requiredString(row.tool_name, 'tool_name'),
56
+ input_summary: nullableString(row.input_summary),
57
+ output_summary: nullableString(row.output_summary),
58
+ execution_status: nullableString(row.execution_status),
59
+ duration_ms: requiredNonNegativeInteger(row.duration_ms, 'duration_ms'),
60
+ envelope_hash: nullableString(row.envelope_hash),
61
+ created_at: requiredInteger(row.created_at, 'created_at'),
62
+ };
63
+ }
64
+ async function initializedAdapter() {
65
+ await (0, db_manager_js_1.initDB)();
66
+ return (0, db_manager_js_1.getAdapter)();
67
+ }
68
+ function selectToolTrace(adapter, id) {
69
+ const row = adapter
70
+ .prepare(`
71
+ SELECT
72
+ trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
73
+ output_summary, execution_status, duration_ms, envelope_hash, created_at
74
+ FROM tool_traces
75
+ WHERE trace_id = ?
76
+ `)
77
+ .get(id);
78
+ if (!row) {
79
+ throw new Error(`Tool trace not found: ${id}`);
80
+ }
81
+ return mapToolTraceRow(row);
82
+ }
83
+ async function appendToolTrace(input) {
84
+ const adapter = await initializedAdapter();
85
+ const id = nullableString(input.trace_id) ?? traceId();
86
+ const modelRunId = requiredString(input.model_run_id, 'model_run_id');
87
+ const toolName = requiredString(input.tool_name, 'tool_name');
88
+ adapter
89
+ .prepare(`
90
+ INSERT INTO tool_traces (
91
+ trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
92
+ output_summary, execution_status, duration_ms, envelope_hash, created_at
93
+ )
94
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
95
+ `)
96
+ .run(id, modelRunId, nullableString(input.gateway_call_id), toolName, nullableString(input.input_summary), nullableString(input.output_summary), nullableString(input.execution_status), normalizeDuration(input.duration_ms), nullableString(input.envelope_hash), normalizeTimestamp(input.created_at));
97
+ return selectToolTrace(adapter, id);
98
+ }
99
+ async function listToolTracesForRun(modelRunId) {
100
+ const adapter = await initializedAdapter();
101
+ const id = requiredString(modelRunId, 'model_run_id');
102
+ const rows = adapter
103
+ .prepare(`
104
+ SELECT
105
+ trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
106
+ output_summary, execution_status, duration_ms, envelope_hash, created_at
107
+ FROM tool_traces
108
+ WHERE model_run_id = ?
109
+ ORDER BY created_at DESC, rowid DESC
110
+ `)
111
+ .all(id);
112
+ return rows.map(mapToolTraceRow);
113
+ }
114
+ //# sourceMappingURL=tool-trace-store.js.map
@@ -0,0 +1,69 @@
1
+ export declare const MODEL_RUN_STATUSES: readonly ["running", "committed", "failed", "legacy"];
2
+ export type ModelRunStatus = (typeof MODEL_RUN_STATUSES)[number];
3
+ export interface BeginModelRunInput {
4
+ model_run_id?: string;
5
+ model_id?: string | null;
6
+ model_provider?: string | null;
7
+ prompt_version?: string | null;
8
+ tool_manifest_version?: string | null;
9
+ output_schema_version?: string | null;
10
+ agent_id?: string | null;
11
+ instance_id?: string | null;
12
+ envelope_hash?: string | null;
13
+ parent_model_run_id?: string | null;
14
+ input_snapshot_ref?: string | null;
15
+ input_refs?: Record<string, unknown> | null;
16
+ input_refs_json?: string | null;
17
+ status?: ModelRunStatus;
18
+ error_summary?: string | null;
19
+ token_count?: number | null;
20
+ cost_estimate?: number | null;
21
+ created_at?: number;
22
+ }
23
+ export interface ModelRunRecord {
24
+ model_run_id: string;
25
+ model_id: string | null;
26
+ model_provider: string | null;
27
+ prompt_version: string | null;
28
+ tool_manifest_version: string | null;
29
+ output_schema_version: string | null;
30
+ agent_id: string | null;
31
+ instance_id: string | null;
32
+ envelope_hash: string | null;
33
+ parent_model_run_id: string | null;
34
+ input_snapshot_ref: string | null;
35
+ input_refs_json: string | null;
36
+ input_refs: Record<string, unknown> | null;
37
+ completion_summary: string | null;
38
+ status: ModelRunStatus;
39
+ error_summary: string | null;
40
+ token_count: number;
41
+ cost_estimate: number | null;
42
+ created_at: number;
43
+ completed_at: number | null;
44
+ }
45
+ export interface AppendToolTraceInput {
46
+ trace_id?: string;
47
+ model_run_id: string;
48
+ gateway_call_id?: string | null;
49
+ tool_name: string;
50
+ input_summary?: string | null;
51
+ output_summary?: string | null;
52
+ execution_status?: string | null;
53
+ duration_ms?: number | null;
54
+ envelope_hash?: string | null;
55
+ created_at?: number;
56
+ }
57
+ export interface ToolTraceRecord {
58
+ trace_id: string;
59
+ model_run_id: string;
60
+ gateway_call_id: string | null;
61
+ tool_name: string;
62
+ input_summary: string | null;
63
+ output_summary: string | null;
64
+ execution_status: string | null;
65
+ duration_ms: number;
66
+ envelope_hash: string | null;
67
+ created_at: number;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MODEL_RUN_STATUSES = void 0;
4
+ exports.MODEL_RUN_STATUSES = ['running', 'committed', 'failed', 'legacy'];
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,3 @@
1
+ export { createTrustedProvenanceCapability } from '../memory/provenance.js';
2
+ export type { TrustedMemoryWriteOptions, TrustedProvenanceCapability, } from '../memory/provenance.js';
3
+ //# sourceMappingURL=trusted-provenance.d.ts.map
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTrustedProvenanceCapability = void 0;
4
+ var provenance_js_1 = require("../memory/provenance.js");
5
+ Object.defineProperty(exports, "createTrustedProvenanceCapability", { enumerable: true, get: function () { return provenance_js_1.createTrustedProvenanceCapability; } });
6
+ //# sourceMappingURL=trusted-provenance.js.map
@@ -0,0 +1,36 @@
1
+ export type SearchStrictness = 'recall' | 'balanced' | 'strict';
2
+ export interface SearchQualityOptions {
3
+ threshold?: number;
4
+ strict?: boolean;
5
+ strictness?: SearchStrictness;
6
+ disableRecency?: boolean;
7
+ includeRelated?: boolean;
8
+ topicPrefix?: string;
9
+ minLexicalSupport?: boolean;
10
+ diagnostics?: boolean;
11
+ }
12
+ export interface NormalizedSearchQualityOptions {
13
+ threshold: number;
14
+ strictness: SearchStrictness;
15
+ disableRecency: boolean;
16
+ includeRelated: boolean;
17
+ topicPrefix?: string;
18
+ minLexicalSupport: boolean;
19
+ diagnostics: boolean;
20
+ }
21
+ export interface SearchHitDiagnostics {
22
+ retrieval_source: string;
23
+ vector_similarity: number | null;
24
+ lexical_support: boolean;
25
+ entity_support: boolean;
26
+ scope_support: boolean;
27
+ graph_source: 'primary' | 'expanded' | null;
28
+ is_vector_only: boolean;
29
+ /** Relevance confirmations only: never include scope or graph position here. */
30
+ confirmation_signals: string[];
31
+ /** Non-relevance metadata useful for diagnostics and audit output. */
32
+ metadata_signals: string[];
33
+ candidate_threshold_used: number;
34
+ }
35
+ export declare function normalizeSearchQualityOptions(options?: SearchQualityOptions): NormalizedSearchQualityOptions;
36
+ //# sourceMappingURL=search-quality.d.ts.map
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeSearchQualityOptions = normalizeSearchQualityOptions;
4
+ function normalizeSearchQualityOptions(options = {}) {
5
+ // Validate strictness at runtime — untyped callers can otherwise pass invalid
6
+ // strings that silently fall through and skew filtering.
7
+ const strictnessCandidate = options.strict === true ? 'strict' : options.strictness;
8
+ const strictness = strictnessCandidate === 'strict' ||
9
+ strictnessCandidate === 'balanced' ||
10
+ strictnessCandidate === 'recall'
11
+ ? strictnessCandidate
12
+ : 'recall';
13
+ const defaultThreshold = strictness === 'strict' ? 0.6 : strictness === 'balanced' ? 0.45 : 0.3;
14
+ const rawThreshold = typeof options.threshold === 'number' ? options.threshold : defaultThreshold;
15
+ // Clamp threshold to [0, 1]; fall back to default for non-finite values (NaN, ±Inf).
16
+ const threshold = Number.isFinite(rawThreshold)
17
+ ? Math.min(1, Math.max(0, rawThreshold))
18
+ : defaultThreshold;
19
+ return {
20
+ threshold,
21
+ strictness,
22
+ disableRecency: options.disableRecency === true,
23
+ includeRelated: options.includeRelated ?? strictness !== 'strict',
24
+ topicPrefix: options.topicPrefix,
25
+ minLexicalSupport: options.minLexicalSupport ?? strictness !== 'recall',
26
+ diagnostics: options.diagnostics === true,
27
+ };
28
+ }
29
+ //# sourceMappingURL=search-quality.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jungjaehoon/mama-core",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "MAMA Core - Shared modules for Memory-Augmented MCP Assistant",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,7 +45,13 @@
45
45
  "./cases/wiki-page-index": "./dist/cases/wiki-page-index.js",
46
46
  "./connectors": "./dist/connectors/event-index.js",
47
47
  "./connectors/event-index": "./dist/connectors/event-index.js",
48
- "./connectors/types": "./dist/connectors/types.js"
48
+ "./connectors/raw-query": "./dist/connectors/raw-query.js",
49
+ "./connectors/types": "./dist/connectors/types.js",
50
+ "./agent-situation": "./dist/agent-situation/index.js",
51
+ "./agent-graph": "./dist/agent-graph/index.js",
52
+ "./edges/types": "./dist/edges/types.js",
53
+ "./edges/store": "./dist/edges/store.js",
54
+ "./edges/ref-validation": "./dist/edges/ref-validation.js"
49
55
  },
50
56
  "scripts": {
51
57
  "build": "tsc",
@@ -90,6 +96,7 @@
90
96
  "@types/better-sqlite3": "^7.6.13",
91
97
  "@types/node": "^22.0.0",
92
98
  "@types/ws": "^8.18.1",
99
+ "typescript": "^5.9.3",
93
100
  "vitest": "^1.0.0"
94
101
  },
95
102
  "files": [