@hasna/mementos 0.6.0 → 0.8.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/dist/cli/index.js +2015 -170
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/entities.d.ts.map +1 -1
- package/dist/db/memories.d.ts.map +1 -1
- package/dist/db/relations.d.ts.map +1 -1
- package/dist/db/synthesis.d.ts +101 -0
- package/dist/db/synthesis.d.ts.map +1 -0
- package/dist/db/webhook_hooks.d.ts +25 -0
- package/dist/db/webhook_hooks.d.ts.map +1 -0
- package/dist/index.js +229 -9
- package/dist/lib/built-in-hooks.d.ts +12 -0
- package/dist/lib/built-in-hooks.d.ts.map +1 -0
- package/dist/lib/focus.d.ts.map +1 -1
- package/dist/lib/hooks.d.ts +50 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/synthesis/corpus-builder.d.ts +30 -0
- package/dist/lib/synthesis/corpus-builder.d.ts.map +1 -0
- package/dist/lib/synthesis/executor.d.ts +14 -0
- package/dist/lib/synthesis/executor.d.ts.map +1 -0
- package/dist/lib/synthesis/index.d.ts +37 -0
- package/dist/lib/synthesis/index.d.ts.map +1 -0
- package/dist/lib/synthesis/llm-analyzer.d.ts +18 -0
- package/dist/lib/synthesis/llm-analyzer.d.ts.map +1 -0
- package/dist/lib/synthesis/metrics.d.ts +13 -0
- package/dist/lib/synthesis/metrics.d.ts.map +1 -0
- package/dist/lib/synthesis/scheduler.d.ts +18 -0
- package/dist/lib/synthesis/scheduler.d.ts.map +1 -0
- package/dist/lib/synthesis/validator.d.ts +19 -0
- package/dist/lib/synthesis/validator.d.ts.map +1 -0
- package/dist/mcp/index.js +8102 -6127
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3627 -1726
- package/dist/types/hooks.d.ts +136 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmCtC,wBAAgB,SAAS,IAAI,MAAM,CAkBlC;
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmCtC,wBAAgB,SAAS,IAAI,MAAM,CAkBlC;AA4WD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAerD;AA+BD,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,wBAAgB,IAAI,IAAI,MAAM,CAE7B;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAef"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/db/entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EACV,MAAM,EACN,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACX,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/db/entities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EACV,MAAM,EACN,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAQ3B,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAWnE;AAMD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CA+D5E;AAMD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAO3D;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,GAAG,IAAI,CAoBf;AAMD,wBAAgB,YAAY,CAC1B,MAAM,GAAE;IACN,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,EACN,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,CAoCV;AAMD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAiCR;AAMD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAI5D;AAMD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CA0CR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/db/memories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"memories.d.ts","sourceRoot":"","sources":["../../src/db/memories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AA6B3B,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAwBnE;AAMD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,UAAU,GAAE,UAAoB,EAChC,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAqIR;AAMD,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,GAAG,IAAI,CA4Bf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,CAuBV;AAMD,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,EAAE,CA4G3E;AAMD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAiHR;AAMD,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAW/D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAmBvE;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAM3D;AAUD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAsBpE;AAMD,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAiB1D;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,aAAa,EAAE,CAwBlF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/db/relations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/db/relations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAO7F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAUvE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAWnE;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAmClF;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAK/D;AAMD,wBAAgB,aAAa,CAC3B,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;CAC9C,EACD,EAAE,CAAC,EAAE,QAAQ,GACZ,QAAQ,EAAE,CA2BZ;AAMD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,IAAI,CAI9D;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,YAAY,EAC3B,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,CA6BV;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAU,EACjB,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAqC/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,EACpB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,EAAE,GAAG,IAAI,CAgCjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
export interface SynthesisRun {
|
|
3
|
+
id: string;
|
|
4
|
+
triggered_by: "scheduler" | "manual" | "threshold" | "hook";
|
|
5
|
+
project_id: string | null;
|
|
6
|
+
agent_id: string | null;
|
|
7
|
+
corpus_size: number;
|
|
8
|
+
proposals_generated: number;
|
|
9
|
+
proposals_accepted: number;
|
|
10
|
+
proposals_rejected: number;
|
|
11
|
+
status: "pending" | "running" | "completed" | "failed" | "rolled_back";
|
|
12
|
+
error: string | null;
|
|
13
|
+
started_at: string;
|
|
14
|
+
completed_at: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface SynthesisProposal {
|
|
17
|
+
id: string;
|
|
18
|
+
run_id: string;
|
|
19
|
+
proposal_type: "merge" | "archive" | "promote" | "update_value" | "add_tag" | "remove_duplicate";
|
|
20
|
+
memory_ids: string[];
|
|
21
|
+
target_memory_id: string | null;
|
|
22
|
+
proposed_changes: Record<string, unknown>;
|
|
23
|
+
reasoning: string | null;
|
|
24
|
+
confidence: number;
|
|
25
|
+
status: "pending" | "accepted" | "rejected" | "rolled_back";
|
|
26
|
+
created_at: string;
|
|
27
|
+
executed_at: string | null;
|
|
28
|
+
rollback_data: Record<string, unknown> | null;
|
|
29
|
+
}
|
|
30
|
+
export interface SynthesisMetric {
|
|
31
|
+
id: string;
|
|
32
|
+
run_id: string;
|
|
33
|
+
metric_type: string;
|
|
34
|
+
value: number;
|
|
35
|
+
baseline: number | null;
|
|
36
|
+
created_at: string;
|
|
37
|
+
}
|
|
38
|
+
export interface SynthesisEvent {
|
|
39
|
+
id: string;
|
|
40
|
+
event_type: "recalled" | "searched" | "saved" | "updated" | "deleted" | "injected";
|
|
41
|
+
memory_id: string | null;
|
|
42
|
+
agent_id: string | null;
|
|
43
|
+
project_id: string | null;
|
|
44
|
+
session_id: string | null;
|
|
45
|
+
query: string | null;
|
|
46
|
+
importance_at_time: number | null;
|
|
47
|
+
metadata: Record<string, unknown>;
|
|
48
|
+
created_at: string;
|
|
49
|
+
}
|
|
50
|
+
export declare function createSynthesisRun(input: {
|
|
51
|
+
triggered_by: SynthesisRun["triggered_by"];
|
|
52
|
+
project_id?: string | null;
|
|
53
|
+
agent_id?: string | null;
|
|
54
|
+
corpus_size?: number;
|
|
55
|
+
}, db?: Database): SynthesisRun;
|
|
56
|
+
export declare function getSynthesisRun(id: string, db?: Database): SynthesisRun | null;
|
|
57
|
+
export declare function listSynthesisRuns(filter: {
|
|
58
|
+
project_id?: string | null;
|
|
59
|
+
status?: SynthesisRun["status"];
|
|
60
|
+
limit?: number;
|
|
61
|
+
}, db?: Database): SynthesisRun[];
|
|
62
|
+
export declare function updateSynthesisRun(id: string, updates: Partial<Pick<SynthesisRun, "status" | "error" | "corpus_size" | "proposals_generated" | "proposals_accepted" | "proposals_rejected" | "completed_at">>, db?: Database): SynthesisRun;
|
|
63
|
+
export declare function createProposal(input: {
|
|
64
|
+
run_id: string;
|
|
65
|
+
proposal_type: SynthesisProposal["proposal_type"];
|
|
66
|
+
memory_ids: string[];
|
|
67
|
+
target_memory_id?: string | null;
|
|
68
|
+
proposed_changes: Record<string, unknown>;
|
|
69
|
+
reasoning?: string | null;
|
|
70
|
+
confidence: number;
|
|
71
|
+
}, db?: Database): SynthesisProposal;
|
|
72
|
+
export declare function getProposal(id: string, db?: Database): SynthesisProposal | null;
|
|
73
|
+
export declare function listProposals(run_id: string, filter?: {
|
|
74
|
+
status?: SynthesisProposal["status"];
|
|
75
|
+
}, db?: Database): SynthesisProposal[];
|
|
76
|
+
export declare function updateProposal(id: string, updates: Partial<Pick<SynthesisProposal, "status" | "executed_at" | "rollback_data">>, db?: Database): SynthesisProposal;
|
|
77
|
+
export declare function createMetric(input: {
|
|
78
|
+
run_id: string;
|
|
79
|
+
metric_type: string;
|
|
80
|
+
value: number;
|
|
81
|
+
baseline?: number | null;
|
|
82
|
+
}, db?: Database): SynthesisMetric;
|
|
83
|
+
export declare function listMetrics(run_id: string, db?: Database): SynthesisMetric[];
|
|
84
|
+
export declare function recordSynthesisEvent(input: {
|
|
85
|
+
event_type: SynthesisEvent["event_type"];
|
|
86
|
+
memory_id?: string | null;
|
|
87
|
+
agent_id?: string | null;
|
|
88
|
+
project_id?: string | null;
|
|
89
|
+
session_id?: string | null;
|
|
90
|
+
query?: string | null;
|
|
91
|
+
importance_at_time?: number | null;
|
|
92
|
+
metadata?: Record<string, unknown>;
|
|
93
|
+
}, db?: Database): void;
|
|
94
|
+
export declare function listSynthesisEvents(filter: {
|
|
95
|
+
memory_id?: string;
|
|
96
|
+
project_id?: string;
|
|
97
|
+
event_type?: SynthesisEvent["event_type"];
|
|
98
|
+
since?: string;
|
|
99
|
+
limit?: number;
|
|
100
|
+
}, db?: Database): SynthesisEvent[];
|
|
101
|
+
//# sourceMappingURL=synthesis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/db/synthesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import type { WebhookHook, HookType } from "../types/hooks.js";
|
|
3
|
+
export interface CreateWebhookHookInput {
|
|
4
|
+
type: HookType;
|
|
5
|
+
handlerUrl: string;
|
|
6
|
+
priority?: number;
|
|
7
|
+
blocking?: boolean;
|
|
8
|
+
agentId?: string;
|
|
9
|
+
projectId?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function createWebhookHook(input: CreateWebhookHookInput, db?: Database): WebhookHook;
|
|
13
|
+
export declare function getWebhookHook(id: string, db?: Database): WebhookHook | null;
|
|
14
|
+
export declare function listWebhookHooks(filter?: {
|
|
15
|
+
type?: HookType;
|
|
16
|
+
enabled?: boolean;
|
|
17
|
+
}, db?: Database): WebhookHook[];
|
|
18
|
+
export declare function updateWebhookHook(id: string, updates: {
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
description?: string;
|
|
21
|
+
priority?: number;
|
|
22
|
+
}, db?: Database): WebhookHook | null;
|
|
23
|
+
export declare function deleteWebhookHook(id: string, db?: Database): boolean;
|
|
24
|
+
export declare function recordWebhookInvocation(id: string, success: boolean, db?: Database): void;
|
|
25
|
+
//# sourceMappingURL=webhook_hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook_hooks.d.ts","sourceRoot":"","sources":["../../src/db/webhook_hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA2B/D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,sBAAsB,EAC7B,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,CAuBb;AAMD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAM5E;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,GAAE;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,EACnD,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,EAAE,CAoBf;AAMD,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EACvE,EAAE,CAAC,EAAE,QAAQ,GACZ,WAAW,GAAG,IAAI,CA2BpB;AAMD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAIpE;AAMD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,IAAI,CAaN"}
|
package/dist/index.js
CHANGED
|
@@ -346,6 +346,94 @@ var MIGRATIONS = [
|
|
|
346
346
|
ALTER TABLE memories ADD COLUMN recall_count INTEGER NOT NULL DEFAULT 0;
|
|
347
347
|
CREATE INDEX IF NOT EXISTS idx_memories_recall_count ON memories(recall_count DESC);
|
|
348
348
|
INSERT OR IGNORE INTO _migrations (id) VALUES (9);
|
|
349
|
+
`,
|
|
350
|
+
`
|
|
351
|
+
CREATE TABLE IF NOT EXISTS synthesis_events (
|
|
352
|
+
id TEXT PRIMARY KEY,
|
|
353
|
+
event_type TEXT NOT NULL CHECK(event_type IN ('recalled','searched','saved','updated','deleted','injected')),
|
|
354
|
+
memory_id TEXT,
|
|
355
|
+
agent_id TEXT,
|
|
356
|
+
project_id TEXT,
|
|
357
|
+
session_id TEXT,
|
|
358
|
+
query TEXT,
|
|
359
|
+
importance_at_time INTEGER,
|
|
360
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
361
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
362
|
+
);
|
|
363
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_events_memory ON synthesis_events(memory_id);
|
|
364
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_events_project ON synthesis_events(project_id);
|
|
365
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_events_type ON synthesis_events(event_type);
|
|
366
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_events_created ON synthesis_events(created_at);
|
|
367
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (11);
|
|
368
|
+
`,
|
|
369
|
+
`
|
|
370
|
+
CREATE TABLE IF NOT EXISTS synthesis_runs (
|
|
371
|
+
id TEXT PRIMARY KEY,
|
|
372
|
+
triggered_by TEXT NOT NULL DEFAULT 'manual' CHECK(triggered_by IN ('scheduler','manual','threshold','hook')),
|
|
373
|
+
project_id TEXT,
|
|
374
|
+
agent_id TEXT,
|
|
375
|
+
corpus_size INTEGER NOT NULL DEFAULT 0,
|
|
376
|
+
proposals_generated INTEGER NOT NULL DEFAULT 0,
|
|
377
|
+
proposals_accepted INTEGER NOT NULL DEFAULT 0,
|
|
378
|
+
proposals_rejected INTEGER NOT NULL DEFAULT 0,
|
|
379
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','running','completed','failed','rolled_back')),
|
|
380
|
+
error TEXT,
|
|
381
|
+
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
382
|
+
completed_at TEXT
|
|
383
|
+
);
|
|
384
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_runs_project ON synthesis_runs(project_id);
|
|
385
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_runs_status ON synthesis_runs(status);
|
|
386
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_runs_started ON synthesis_runs(started_at);
|
|
387
|
+
|
|
388
|
+
CREATE TABLE IF NOT EXISTS synthesis_proposals (
|
|
389
|
+
id TEXT PRIMARY KEY,
|
|
390
|
+
run_id TEXT NOT NULL REFERENCES synthesis_runs(id) ON DELETE CASCADE,
|
|
391
|
+
proposal_type TEXT NOT NULL CHECK(proposal_type IN ('merge','archive','promote','update_value','add_tag','remove_duplicate')),
|
|
392
|
+
memory_ids TEXT NOT NULL DEFAULT '[]',
|
|
393
|
+
target_memory_id TEXT,
|
|
394
|
+
proposed_changes TEXT NOT NULL DEFAULT '{}',
|
|
395
|
+
reasoning TEXT,
|
|
396
|
+
confidence REAL NOT NULL DEFAULT 0.5,
|
|
397
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending','accepted','rejected','rolled_back')),
|
|
398
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
399
|
+
executed_at TEXT,
|
|
400
|
+
rollback_data TEXT
|
|
401
|
+
);
|
|
402
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_proposals_run ON synthesis_proposals(run_id);
|
|
403
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_proposals_status ON synthesis_proposals(status);
|
|
404
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_proposals_type ON synthesis_proposals(proposal_type);
|
|
405
|
+
|
|
406
|
+
CREATE TABLE IF NOT EXISTS synthesis_metrics (
|
|
407
|
+
id TEXT PRIMARY KEY,
|
|
408
|
+
run_id TEXT NOT NULL REFERENCES synthesis_runs(id) ON DELETE CASCADE,
|
|
409
|
+
metric_type TEXT NOT NULL,
|
|
410
|
+
value REAL NOT NULL,
|
|
411
|
+
baseline REAL,
|
|
412
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
413
|
+
);
|
|
414
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_metrics_run ON synthesis_metrics(run_id);
|
|
415
|
+
CREATE INDEX IF NOT EXISTS idx_synthesis_metrics_type ON synthesis_metrics(metric_type);
|
|
416
|
+
|
|
417
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (12);
|
|
418
|
+
`,
|
|
419
|
+
`
|
|
420
|
+
CREATE TABLE IF NOT EXISTS webhook_hooks (
|
|
421
|
+
id TEXT PRIMARY KEY,
|
|
422
|
+
type TEXT NOT NULL,
|
|
423
|
+
handler_url TEXT NOT NULL,
|
|
424
|
+
priority INTEGER NOT NULL DEFAULT 50,
|
|
425
|
+
blocking INTEGER NOT NULL DEFAULT 0,
|
|
426
|
+
agent_id TEXT,
|
|
427
|
+
project_id TEXT,
|
|
428
|
+
description TEXT,
|
|
429
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
430
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
431
|
+
invocation_count INTEGER NOT NULL DEFAULT 0,
|
|
432
|
+
failure_count INTEGER NOT NULL DEFAULT 0
|
|
433
|
+
);
|
|
434
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_hooks_type ON webhook_hooks(type);
|
|
435
|
+
CREATE INDEX IF NOT EXISTS idx_webhook_hooks_enabled ON webhook_hooks(enabled);
|
|
436
|
+
INSERT OR IGNORE INTO _migrations (id) VALUES (10);
|
|
349
437
|
`
|
|
350
438
|
];
|
|
351
439
|
var _db = null;
|
|
@@ -443,6 +531,87 @@ function containsSecrets(text) {
|
|
|
443
531
|
return false;
|
|
444
532
|
}
|
|
445
533
|
|
|
534
|
+
// src/lib/hooks.ts
|
|
535
|
+
var _idCounter = 0;
|
|
536
|
+
function generateHookId() {
|
|
537
|
+
return `hook_${++_idCounter}_${Date.now().toString(36)}`;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
class HookRegistry {
|
|
541
|
+
hooks = new Map;
|
|
542
|
+
register(reg) {
|
|
543
|
+
const id = generateHookId();
|
|
544
|
+
const hook = {
|
|
545
|
+
...reg,
|
|
546
|
+
id,
|
|
547
|
+
priority: reg.priority ?? 50
|
|
548
|
+
};
|
|
549
|
+
this.hooks.set(id, hook);
|
|
550
|
+
return id;
|
|
551
|
+
}
|
|
552
|
+
unregister(hookId) {
|
|
553
|
+
const hook = this.hooks.get(hookId);
|
|
554
|
+
if (!hook)
|
|
555
|
+
return false;
|
|
556
|
+
if (hook.builtin)
|
|
557
|
+
return false;
|
|
558
|
+
this.hooks.delete(hookId);
|
|
559
|
+
return true;
|
|
560
|
+
}
|
|
561
|
+
list(type) {
|
|
562
|
+
const all = [...this.hooks.values()];
|
|
563
|
+
if (!type)
|
|
564
|
+
return all;
|
|
565
|
+
return all.filter((h) => h.type === type);
|
|
566
|
+
}
|
|
567
|
+
async runHooks(type, context) {
|
|
568
|
+
const matching = this.getMatchingHooks(type, context);
|
|
569
|
+
if (matching.length === 0)
|
|
570
|
+
return true;
|
|
571
|
+
matching.sort((a, b) => a.priority - b.priority);
|
|
572
|
+
for (const hook of matching) {
|
|
573
|
+
if (hook.blocking) {
|
|
574
|
+
try {
|
|
575
|
+
const result = await hook.handler(context);
|
|
576
|
+
if (result === false)
|
|
577
|
+
return false;
|
|
578
|
+
} catch (err) {
|
|
579
|
+
console.error(`[hooks] blocking hook ${hook.id} (${type}) threw:`, err);
|
|
580
|
+
}
|
|
581
|
+
} else {
|
|
582
|
+
Promise.resolve().then(() => hook.handler(context)).catch((err) => console.error(`[hooks] non-blocking hook ${hook.id} (${type}) threw:`, err));
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
return true;
|
|
586
|
+
}
|
|
587
|
+
getMatchingHooks(type, context) {
|
|
588
|
+
const ctx = context;
|
|
589
|
+
return [...this.hooks.values()].filter((hook) => {
|
|
590
|
+
if (hook.type !== type)
|
|
591
|
+
return false;
|
|
592
|
+
if (hook.agentId && hook.agentId !== ctx.agentId)
|
|
593
|
+
return false;
|
|
594
|
+
if (hook.projectId && hook.projectId !== ctx.projectId)
|
|
595
|
+
return false;
|
|
596
|
+
return true;
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
stats() {
|
|
600
|
+
const all = [...this.hooks.values()];
|
|
601
|
+
const byType = {};
|
|
602
|
+
for (const hook of all) {
|
|
603
|
+
byType[hook.type] = (byType[hook.type] ?? 0) + 1;
|
|
604
|
+
}
|
|
605
|
+
return {
|
|
606
|
+
total: all.length,
|
|
607
|
+
byType,
|
|
608
|
+
blocking: all.filter((h) => h.blocking).length,
|
|
609
|
+
nonBlocking: all.filter((h) => !h.blocking).length
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
var hookRegistry = new HookRegistry;
|
|
614
|
+
|
|
446
615
|
// src/db/entity-memories.ts
|
|
447
616
|
function parseEntityRow(row) {
|
|
448
617
|
return {
|
|
@@ -628,9 +797,15 @@ function createMemory(input, dedupeMode = "merge", db) {
|
|
|
628
797
|
insertTag.run(id, tag);
|
|
629
798
|
}
|
|
630
799
|
const memory = getMemory(id, d);
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
800
|
+
runEntityExtraction(memory, input.project_id, d);
|
|
801
|
+
hookRegistry.runHooks("PostMemorySave", {
|
|
802
|
+
memory,
|
|
803
|
+
wasUpdated: false,
|
|
804
|
+
agentId: input.agent_id,
|
|
805
|
+
projectId: input.project_id,
|
|
806
|
+
sessionId: input.session_id,
|
|
807
|
+
timestamp: Date.now()
|
|
808
|
+
});
|
|
634
809
|
return memory;
|
|
635
810
|
}
|
|
636
811
|
function getMemory(id, db) {
|
|
@@ -854,20 +1029,33 @@ function updateMemory(id, input, db) {
|
|
|
854
1029
|
params.push(id);
|
|
855
1030
|
d.run(`UPDATE memories SET ${sets.join(", ")} WHERE id = ?`, params);
|
|
856
1031
|
const updated = getMemory(id, d);
|
|
857
|
-
|
|
858
|
-
|
|
1032
|
+
if (input.value !== undefined) {
|
|
1033
|
+
try {
|
|
859
1034
|
const oldLinks = getEntityMemoryLinks(undefined, updated.id, d);
|
|
860
1035
|
for (const link of oldLinks) {
|
|
861
1036
|
unlinkEntityFromMemory(link.entity_id, updated.id, d);
|
|
862
1037
|
}
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
1038
|
+
} catch {}
|
|
1039
|
+
}
|
|
1040
|
+
hookRegistry.runHooks("PostMemoryUpdate", {
|
|
1041
|
+
memory: updated,
|
|
1042
|
+
previousValue: existing.value,
|
|
1043
|
+
agentId: existing.agent_id ?? undefined,
|
|
1044
|
+
projectId: existing.project_id ?? undefined,
|
|
1045
|
+
sessionId: existing.session_id ?? undefined,
|
|
1046
|
+
timestamp: Date.now()
|
|
1047
|
+
});
|
|
866
1048
|
return updated;
|
|
867
1049
|
}
|
|
868
1050
|
function deleteMemory(id, db) {
|
|
869
1051
|
const d = db || getDatabase();
|
|
870
1052
|
const result = d.run("DELETE FROM memories WHERE id = ?", [id]);
|
|
1053
|
+
if (result.changes > 0) {
|
|
1054
|
+
hookRegistry.runHooks("PostMemoryDelete", {
|
|
1055
|
+
memoryId: id,
|
|
1056
|
+
timestamp: Date.now()
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
871
1059
|
return result.changes > 0;
|
|
872
1060
|
}
|
|
873
1061
|
function bulkDeleteMemories(ids, db) {
|
|
@@ -1182,8 +1370,25 @@ class MemoryLockConflictError extends Error {
|
|
|
1182
1370
|
// src/lib/focus.ts
|
|
1183
1371
|
var sessionFocus = new Map;
|
|
1184
1372
|
function setFocus(agentId, projectId) {
|
|
1373
|
+
const previous = getFocusCached(agentId);
|
|
1185
1374
|
sessionFocus.set(agentId, projectId);
|
|
1186
1375
|
updateAgent(agentId, { active_project_id: projectId });
|
|
1376
|
+
if (projectId && projectId !== previous) {
|
|
1377
|
+
hookRegistry.runHooks("OnSessionStart", {
|
|
1378
|
+
agentId,
|
|
1379
|
+
projectId,
|
|
1380
|
+
timestamp: Date.now()
|
|
1381
|
+
});
|
|
1382
|
+
} else if (!projectId && previous) {
|
|
1383
|
+
hookRegistry.runHooks("OnSessionEnd", {
|
|
1384
|
+
agentId,
|
|
1385
|
+
projectId: previous,
|
|
1386
|
+
timestamp: Date.now()
|
|
1387
|
+
});
|
|
1388
|
+
}
|
|
1389
|
+
}
|
|
1390
|
+
function getFocusCached(agentId) {
|
|
1391
|
+
return sessionFocus.get(agentId) ?? null;
|
|
1187
1392
|
}
|
|
1188
1393
|
function getFocus(agentId) {
|
|
1189
1394
|
if (sessionFocus.has(agentId)) {
|
|
@@ -1319,6 +1524,13 @@ function createEntity(input, db) {
|
|
|
1319
1524
|
timestamp,
|
|
1320
1525
|
timestamp
|
|
1321
1526
|
]);
|
|
1527
|
+
hookRegistry.runHooks("PostEntityCreate", {
|
|
1528
|
+
entityId: id,
|
|
1529
|
+
name: input.name,
|
|
1530
|
+
entityType: input.type,
|
|
1531
|
+
projectId: input.project_id,
|
|
1532
|
+
timestamp: Date.now()
|
|
1533
|
+
});
|
|
1322
1534
|
return getEntity(id, d);
|
|
1323
1535
|
}
|
|
1324
1536
|
function getEntity(id, db) {
|
|
@@ -2491,7 +2703,15 @@ function createRelation(input, db) {
|
|
|
2491
2703
|
DO UPDATE SET weight = excluded.weight, metadata = excluded.metadata`, [id, input.source_entity_id, input.target_entity_id, input.relation_type, weight, metadata, timestamp]);
|
|
2492
2704
|
const row = d.query(`SELECT * FROM relations
|
|
2493
2705
|
WHERE source_entity_id = ? AND target_entity_id = ? AND relation_type = ?`).get(input.source_entity_id, input.target_entity_id, input.relation_type);
|
|
2494
|
-
|
|
2706
|
+
const relation = parseRelationRow(row);
|
|
2707
|
+
hookRegistry.runHooks("PostRelationCreate", {
|
|
2708
|
+
relationId: relation.id,
|
|
2709
|
+
sourceEntityId: relation.source_entity_id,
|
|
2710
|
+
targetEntityId: relation.target_entity_id,
|
|
2711
|
+
relationType: relation.relation_type,
|
|
2712
|
+
timestamp: Date.now()
|
|
2713
|
+
});
|
|
2714
|
+
return relation;
|
|
2495
2715
|
}
|
|
2496
2716
|
function getRelation(id, db) {
|
|
2497
2717
|
const d = db || getDatabase();
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in hooks — registered at server/MCP startup.
|
|
3
|
+
* These are system-level hooks that power the auto-memory pipeline.
|
|
4
|
+
*
|
|
5
|
+
* Built-in hooks cannot be unregistered (builtin: true).
|
|
6
|
+
* They are always non-blocking so they never delay the calling operation.
|
|
7
|
+
*/
|
|
8
|
+
import type { HookType } from "../types/hooks.js";
|
|
9
|
+
export declare function loadWebhooksFromDb(): void;
|
|
10
|
+
export declare function reloadWebhooks(): void;
|
|
11
|
+
export type { HookType };
|
|
12
|
+
//# sourceMappingURL=built-in-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-in-hooks.d.ts","sourceRoot":"","sources":["../../src/lib/built-in-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAwHlD,wBAAgB,kBAAkB,IAAI,IAAI,CAyBzC;AAuBD,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAGD,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/lib/focus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/lib/focus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/lib/focus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAqBxE;AAOD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAClC,iBAAiB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC3C,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAClC,iBAAiB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GACvC,gBAAgB,GAAG,IAAI,CAazB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAKnC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook registry — the central nervous system connecting all memory operations.
|
|
3
|
+
*
|
|
4
|
+
* Blocking hooks: await handler, return false = cancel the operation.
|
|
5
|
+
* Non-blocking hooks: fire-and-forget in background, never delay caller.
|
|
6
|
+
*
|
|
7
|
+
* Hooks run in priority order (ascending — lower number first).
|
|
8
|
+
* Per-agent and per-project scoping supported.
|
|
9
|
+
*/
|
|
10
|
+
import type { Hook, HookType, HookHandler, HookRegistration, HookContextMap } from "../types/hooks.js";
|
|
11
|
+
declare class HookRegistry {
|
|
12
|
+
private hooks;
|
|
13
|
+
/**
|
|
14
|
+
* Register a hook. Returns the assigned hookId.
|
|
15
|
+
* Built-in hooks (builtin: true) cannot be unregistered.
|
|
16
|
+
*/
|
|
17
|
+
register<T extends HookType>(reg: HookRegistration<T>): string;
|
|
18
|
+
/**
|
|
19
|
+
* Unregister a hook by ID.
|
|
20
|
+
* Returns false if hook not found or is a built-in.
|
|
21
|
+
*/
|
|
22
|
+
unregister(hookId: string): boolean;
|
|
23
|
+
/** List all hooks, optionally filtered by type */
|
|
24
|
+
list(type?: HookType): Hook[];
|
|
25
|
+
/**
|
|
26
|
+
* Run all hooks of a given type for a given context.
|
|
27
|
+
*
|
|
28
|
+
* Returns true if the operation should proceed.
|
|
29
|
+
* Returns false if any blocking hook cancelled it.
|
|
30
|
+
*
|
|
31
|
+
* Non-blocking hooks are fired async and never delay the return.
|
|
32
|
+
*/
|
|
33
|
+
runHooks<T extends HookType>(type: T, context: HookContextMap[T]): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Get hooks matching type + agent/project scope.
|
|
36
|
+
* A hook with no agentId/projectId matches everything.
|
|
37
|
+
*/
|
|
38
|
+
private getMatchingHooks;
|
|
39
|
+
/** Get stats about registered hooks */
|
|
40
|
+
stats(): {
|
|
41
|
+
total: number;
|
|
42
|
+
byType: Record<string, number>;
|
|
43
|
+
blocking: number;
|
|
44
|
+
nonBlocking: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** Singleton — shared across the whole process */
|
|
48
|
+
export declare const hookRegistry: HookRegistry;
|
|
49
|
+
export type { Hook, HookType, HookHandler, HookRegistration };
|
|
50
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAO3B,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAA2B;IAExC;;;OAGG;IACH,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM;IAW9D;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAQnC,kDAAkD;IAClD,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE;IAM7B;;;;;;;OAOG;IACG,QAAQ,CAAC,CAAC,SAAS,QAAQ,EAC/B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,OAAO,CAAC;IA8BnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB,uCAAuC;IACvC,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;CAalG;AAED,kDAAkD;AAClD,eAAO,MAAM,YAAY,cAAqB,CAAC;AAG/C,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import type { Memory } from "../../types/index.js";
|
|
3
|
+
export interface MemoryCorpusItem {
|
|
4
|
+
memory: Memory;
|
|
5
|
+
recallCount: number;
|
|
6
|
+
lastRecalled: string | null;
|
|
7
|
+
searchHits: number;
|
|
8
|
+
similarMemoryIds: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface AnalysisCorpus {
|
|
11
|
+
projectId: string | null;
|
|
12
|
+
totalMemories: number;
|
|
13
|
+
items: MemoryCorpusItem[];
|
|
14
|
+
staleMemories: Memory[];
|
|
15
|
+
duplicateCandidates: Array<{
|
|
16
|
+
a: Memory;
|
|
17
|
+
b: Memory;
|
|
18
|
+
similarity: number;
|
|
19
|
+
}>;
|
|
20
|
+
lowImportanceHighRecall: Memory[];
|
|
21
|
+
highImportanceLowRecall: Memory[];
|
|
22
|
+
generatedAt: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function buildCorpus(options: {
|
|
25
|
+
projectId?: string;
|
|
26
|
+
agentId?: string;
|
|
27
|
+
limit?: number;
|
|
28
|
+
db?: Database;
|
|
29
|
+
}): Promise<AnalysisCorpus>;
|
|
30
|
+
//# sourceMappingURL=corpus-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus-builder.d.ts","sourceRoot":"","sources":["../../../src/lib/synthesis/corpus-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AASnD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAyDD,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf,GAAG,OAAO,CAAC,cAAc,CAAC,CAyH1B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { type SynthesisProposal } from "../../db/synthesis.js";
|
|
3
|
+
export interface ExecutionResult {
|
|
4
|
+
runId: string;
|
|
5
|
+
executed: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
rollbackData: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare function executeProposals(runId: string, proposals: SynthesisProposal[], db?: Database): Promise<ExecutionResult>;
|
|
10
|
+
export declare function rollbackRun(runId: string, db?: Database): Promise<{
|
|
11
|
+
rolled_back: number;
|
|
12
|
+
errors: string[];
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/lib/synthesis/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAM/B,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAMD,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,EAAE,EAC9B,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,eAAe,CAAC,CAsC1B;AAgND,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmBpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { type SynthesisProposal, type SynthesisRun } from "../../db/synthesis.js";
|
|
3
|
+
import { type SafetyConfig } from "./validator.js";
|
|
4
|
+
import { type EffectivenessReport } from "./metrics.js";
|
|
5
|
+
export type { SafetyConfig } from "./validator.js";
|
|
6
|
+
export type { EffectivenessReport } from "./metrics.js";
|
|
7
|
+
export type { AnalysisCorpus, MemoryCorpusItem } from "./corpus-builder.js";
|
|
8
|
+
export type { SynthesisAnalysisResult } from "./llm-analyzer.js";
|
|
9
|
+
export type { ValidationResult, SafetyConfig as SafetyConfigType } from "./validator.js";
|
|
10
|
+
export type { ExecutionResult } from "./executor.js";
|
|
11
|
+
export type { SchedulerConfig, SchedulerState } from "./scheduler.js";
|
|
12
|
+
export interface SynthesisOptions {
|
|
13
|
+
projectId?: string;
|
|
14
|
+
agentId?: string;
|
|
15
|
+
provider?: string;
|
|
16
|
+
maxProposals?: number;
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
safetyConfig?: Partial<SafetyConfig>;
|
|
19
|
+
db?: Database;
|
|
20
|
+
}
|
|
21
|
+
export interface SynthesisResult {
|
|
22
|
+
run: SynthesisRun;
|
|
23
|
+
proposals: SynthesisProposal[];
|
|
24
|
+
executed: number;
|
|
25
|
+
metrics: EffectivenessReport | null;
|
|
26
|
+
dryRun: boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function runSynthesis(options?: SynthesisOptions): Promise<SynthesisResult>;
|
|
29
|
+
export declare function rollbackSynthesis(runId: string, db?: Database): Promise<{
|
|
30
|
+
rolled_back: number;
|
|
31
|
+
errors: string[];
|
|
32
|
+
}>;
|
|
33
|
+
export declare function getSynthesisStatus(runId?: string, projectId?: string, db?: Database): {
|
|
34
|
+
lastRun: SynthesisRun | null;
|
|
35
|
+
recentRuns: SynthesisRun[];
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/synthesis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAM9E,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMtE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrC,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,YAAY,CAAC;IAClB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD,wBAAsB,YAAY,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwJ3F;AAMD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAUpD;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ;IAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,YAAY,EAAE,CAAA;CAAE,CAwB9D"}
|