@hasna/mementos 0.10.6 → 0.10.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.
- package/dist/cli/index.js +6 -0
- package/dist/db/locks.d.ts +11 -0
- package/dist/db/locks.d.ts.map +1 -1
- package/dist/db/memories.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/mcp/index.js +30 -3
- package/dist/server/index.js +6 -0
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -2850,6 +2850,12 @@ function parseMemoryRow(row) {
|
|
|
2850
2850
|
function createMemory(input, dedupeMode = "merge", db) {
|
|
2851
2851
|
const d = db || getDatabase();
|
|
2852
2852
|
const timestamp = now();
|
|
2853
|
+
if (input.project_id) {
|
|
2854
|
+
const resolved = resolvePartialId(d, "projects", input.project_id);
|
|
2855
|
+
if (resolved) {
|
|
2856
|
+
input = { ...input, project_id: resolved };
|
|
2857
|
+
}
|
|
2858
|
+
}
|
|
2853
2859
|
let expiresAt = input.expires_at || null;
|
|
2854
2860
|
if (input.ttl_ms && !expiresAt) {
|
|
2855
2861
|
expiresAt = new Date(Date.now() + input.ttl_ms).toISOString();
|
package/dist/db/locks.d.ts
CHANGED
|
@@ -48,5 +48,16 @@ export declare function listAgentLocks(agentId: string, db?: Database): Resource
|
|
|
48
48
|
/**
|
|
49
49
|
* Delete all expired locks. Called automatically by other lock functions.
|
|
50
50
|
*/
|
|
51
|
+
export interface ExpiredLockInfo {
|
|
52
|
+
id: string;
|
|
53
|
+
resource_type: string;
|
|
54
|
+
resource_id: string;
|
|
55
|
+
agent_id: string;
|
|
56
|
+
lock_type: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clean expired locks and return info about what was cleaned for notification purposes.
|
|
60
|
+
*/
|
|
61
|
+
export declare function cleanExpiredLocksWithInfo(db?: Database): ExpiredLockInfo[];
|
|
51
62
|
export declare function cleanExpiredLocks(db?: Database): number;
|
|
52
63
|
//# sourceMappingURL=locks.d.ts.map
|
package/dist/db/locks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/db/locks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAC5F,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,QAAsB,EAChC,UAAU,SAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAuDrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAOnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAI3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,EAAE,CAgBhB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAcrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,EAAE,CAS7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAIvD"}
|
|
1
|
+
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/db/locks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;AAC5F,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,YAAY,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,QAAsB,EAChC,UAAU,SAAM,EAChB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAuDrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAOnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,EAAE,CAAC,EAAE,QAAQ,GACZ,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAI3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,EAAE,CAgBhB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAcrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAG,YAAY,EAAE,CAS7E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,eAAe,EAAE,CAS1E;AAED,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAIvD"}
|
|
@@ -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;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,
|
|
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,CA8IR;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"}
|
package/dist/index.js
CHANGED
|
@@ -767,6 +767,12 @@ function parseMemoryRow(row) {
|
|
|
767
767
|
function createMemory(input, dedupeMode = "merge", db) {
|
|
768
768
|
const d = db || getDatabase();
|
|
769
769
|
const timestamp = now();
|
|
770
|
+
if (input.project_id) {
|
|
771
|
+
const resolved = resolvePartialId(d, "projects", input.project_id);
|
|
772
|
+
if (resolved) {
|
|
773
|
+
input = { ...input, project_id: resolved };
|
|
774
|
+
}
|
|
775
|
+
}
|
|
770
776
|
let expiresAt = input.expires_at || null;
|
|
771
777
|
if (input.ttl_ms && !expiresAt) {
|
|
772
778
|
expiresAt = new Date(Date.now() + input.ttl_ms).toISOString();
|
package/dist/mcp/index.js
CHANGED
|
@@ -755,6 +755,12 @@ function parseMemoryRow(row) {
|
|
|
755
755
|
function createMemory(input, dedupeMode = "merge", db) {
|
|
756
756
|
const d = db || getDatabase();
|
|
757
757
|
const timestamp = now();
|
|
758
|
+
if (input.project_id) {
|
|
759
|
+
const resolved = resolvePartialId(d, "projects", input.project_id);
|
|
760
|
+
if (resolved) {
|
|
761
|
+
input = { ...input, project_id: resolved };
|
|
762
|
+
}
|
|
763
|
+
}
|
|
758
764
|
let expiresAt = input.expires_at || null;
|
|
759
765
|
if (input.ttl_ms && !expiresAt) {
|
|
760
766
|
expiresAt = new Date(Date.now() + input.ttl_ms).toISOString();
|
|
@@ -7517,6 +7523,14 @@ function listAgentLocks(agentId, db) {
|
|
|
7517
7523
|
const rows = d.query("SELECT * FROM resource_locks WHERE agent_id = ? AND expires_at > datetime('now') ORDER BY locked_at DESC").all(agentId);
|
|
7518
7524
|
return rows.map(parseLockRow);
|
|
7519
7525
|
}
|
|
7526
|
+
function cleanExpiredLocksWithInfo(db) {
|
|
7527
|
+
const d = db || getDatabase();
|
|
7528
|
+
const expired = d.query("SELECT id, resource_type, resource_id, agent_id, lock_type FROM resource_locks WHERE expires_at <= datetime('now')").all();
|
|
7529
|
+
if (expired.length > 0) {
|
|
7530
|
+
d.run("DELETE FROM resource_locks WHERE expires_at <= datetime('now')");
|
|
7531
|
+
}
|
|
7532
|
+
return expired;
|
|
7533
|
+
}
|
|
7520
7534
|
function cleanExpiredLocks(db) {
|
|
7521
7535
|
const d = db || getDatabase();
|
|
7522
7536
|
const result = d.run("DELETE FROM resource_locks WHERE expires_at <= datetime('now')");
|
|
@@ -11184,9 +11198,22 @@ server.tool("list_agent_locks", "List all active resource locks held by an agent
|
|
|
11184
11198
|
content: [{ type: "text", text: locks.length === 0 ? "No active locks." : JSON.stringify(locks, null, 2) }]
|
|
11185
11199
|
};
|
|
11186
11200
|
});
|
|
11187
|
-
server.tool("clean_expired_locks", "Delete all expired resource locks.", {}, async () => {
|
|
11188
|
-
const
|
|
11189
|
-
|
|
11201
|
+
server.tool("clean_expired_locks", "Delete all expired resource locks. Notifies holding agents via conversations DM.", {}, async () => {
|
|
11202
|
+
const expired = cleanExpiredLocksWithInfo();
|
|
11203
|
+
const count = expired.length;
|
|
11204
|
+
if (count > 0) {
|
|
11205
|
+
const conversationsUrl = process.env.CONVERSATIONS_API_URL || "http://localhost:7020";
|
|
11206
|
+
for (const lock of expired) {
|
|
11207
|
+
const msg = `Your ${lock.lock_type} lock on ${lock.resource_type}/${lock.resource_id} has expired. Another agent may now acquire it.`;
|
|
11208
|
+
fetch(`${conversationsUrl}/api/v1/messages`, {
|
|
11209
|
+
method: "POST",
|
|
11210
|
+
headers: { "Content-Type": "application/json" },
|
|
11211
|
+
body: JSON.stringify({ from: "system", to: lock.agent_id, content: msg }),
|
|
11212
|
+
signal: AbortSignal.timeout(2000)
|
|
11213
|
+
}).catch(() => {});
|
|
11214
|
+
}
|
|
11215
|
+
}
|
|
11216
|
+
return { content: [{ type: "text", text: `Cleaned ${count} expired lock(s)${count > 0 ? ` and notified ${count} agent(s)` : ""}.` }] };
|
|
11190
11217
|
});
|
|
11191
11218
|
server.tool("set_focus", "Set focus for an agent on a project. Memory ops will auto-scope to that project's shared + agent private + global memories.", {
|
|
11192
11219
|
agent_id: exports_external.string(),
|
package/dist/server/index.js
CHANGED
|
@@ -750,6 +750,12 @@ function parseMemoryRow(row) {
|
|
|
750
750
|
function createMemory(input, dedupeMode = "merge", db) {
|
|
751
751
|
const d = db || getDatabase();
|
|
752
752
|
const timestamp = now();
|
|
753
|
+
if (input.project_id) {
|
|
754
|
+
const resolved = resolvePartialId(d, "projects", input.project_id);
|
|
755
|
+
if (resolved) {
|
|
756
|
+
input = { ...input, project_id: resolved };
|
|
757
|
+
}
|
|
758
|
+
}
|
|
753
759
|
let expiresAt = input.expires_at || null;
|
|
754
760
|
if (input.ttl_ms && !expiresAt) {
|
|
755
761
|
expiresAt = new Date(Date.now() + input.ttl_ms).toISOString();
|