@mysten-incubation/oc-memwal 0.0.3-dev.0 → 0.0.3-dev.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/hooks/capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/hooks/capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAqExF"}
|
package/dist/hooks/capture.js
CHANGED
|
@@ -34,8 +34,26 @@ export function registerCaptureHook(api, client, config) {
|
|
|
34
34
|
.map((t, i) => `${i + 1}. ${t}`)
|
|
35
35
|
.join("\n\n");
|
|
36
36
|
// analyze() calls the server LLM for fact extraction — retry once
|
|
37
|
-
// since transient failures are common with remote LLM calls
|
|
38
|
-
|
|
37
|
+
// since transient failures are common with remote LLM calls.
|
|
38
|
+
//
|
|
39
|
+
// Pass `occurredAt: new Date()` so the server extractor can
|
|
40
|
+
// resolve in-turn relative references ("yesterday", "last
|
|
41
|
+
// Friday") into absolute dates inside the fact text before
|
|
42
|
+
// encryption.
|
|
43
|
+
//
|
|
44
|
+
// Caveat: this is hook-fire time, not strictly per-message
|
|
45
|
+
// time. The hook fires on agent_end — *after* the LLM finishes
|
|
46
|
+
// responding — and `event.messages` may carry the last N turns
|
|
47
|
+
// (captureMaxMessages) spanning a longer window. All extracted
|
|
48
|
+
// facts share this one anchor. For coarse relative references
|
|
49
|
+
// ("yesterday", "last Friday") this is accurate enough; for
|
|
50
|
+
// fine-grained ones ("an hour ago", "this morning") the anchor
|
|
51
|
+
// can be off by minutes-to-hours. Acceptable for an opt-in
|
|
52
|
+
// auto-capture path where the alternative is no anchor at all.
|
|
53
|
+
// (The "no silent now() fallback" rule is about the server
|
|
54
|
+
// defaulting for callers that passed nothing; here the caller
|
|
55
|
+
// IS passing, with real-ish knowledge of when the event happened.)
|
|
56
|
+
const result = await withRetry(() => client.analyze(conversation, { namespace, occurredAt: new Date() }));
|
|
39
57
|
if (result.facts?.length) {
|
|
40
58
|
api.logger.info(`memory-memwal: auto-captured ${result.facts.length} facts ` +
|
|
41
59
|
`(agent: ${agentName}, namespace: ${namespace})`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/hooks/capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9D,oDAAoD;AACpD,MAAM,UAAU,mBAAmB,CAAC,GAAQ,EAAE,MAAc,EAAE,MAAoB;IAChF,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM;YAAE,OAAO;QAEtD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAExF,IAAI,CAAC;YACH,yEAAyE;YACzE,oEAAoE;YACpE,uEAAuE;YACvE,MAAM,KAAK,GAAG,mBAAmB,CAC/B,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,kBAAkB,CAC1B,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO;YAE1B,gEAAgE;YAChE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACvB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAChB,8DAA8D;oBAC9D,WAAW,SAAS,KAAK,KAAK,CAAC,MAAM,oBAAoB,CAC1D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,mEAAmE;YACnE,mDAAmD;YACnD,MAAM,YAAY,GAAG,UAAU;iBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC/B,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,kEAAkE;YAClE,4DAA4D;YAC5D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/hooks/capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9D,oDAAoD;AACpD,MAAM,UAAU,mBAAmB,CAAC,GAAQ,EAAE,MAAc,EAAE,MAAoB;IAChF,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM;YAAE,OAAO;QAEtD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QAExF,IAAI,CAAC;YACH,yEAAyE;YACzE,oEAAoE;YACpE,uEAAuE;YACvE,MAAM,KAAK,GAAG,mBAAmB,CAC/B,KAAK,CAAC,QAAQ,EACd,MAAM,CAAC,kBAAkB,CAC1B,CAAC;YAEF,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO;YAE1B,gEAAgE;YAChE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACvB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAChB,8DAA8D;oBAC9D,WAAW,SAAS,KAAK,KAAK,CAAC,MAAM,oBAAoB,CAC1D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,mEAAmE;YACnE,mDAAmD;YACnD,MAAM,YAAY,GAAG,UAAU;iBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC/B,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,kEAAkE;YAClE,6DAA6D;YAC7D,EAAE;YACF,4DAA4D;YAC5D,0DAA0D;YAC1D,2DAA2D;YAC3D,cAAc;YACd,EAAE;YACF,2DAA2D;YAC3D,+DAA+D;YAC/D,+DAA+D;YAC/D,+DAA+D;YAC/D,8DAA8D;YAC9D,4DAA4D;YAC5D,+DAA+D;YAC/D,2DAA2D;YAC3D,+DAA+D;YAC/D,2DAA2D;YAC3D,8DAA8D;YAC9D,mEAAmE;YACnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAClC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CACpE,CAAC;YAEF,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;gBACzB,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,gCAAgC,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS;oBAC5D,WAAW,SAAS,gBAAgB,SAAS,GAAG,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,uCAAuC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/store.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Uses analyze() instead of remember() so the server LLM extracts
|
|
5
5
|
* individual facts from the text, producing cleaner, more searchable
|
|
6
|
-
* memories
|
|
6
|
+
* memories than storing the raw input verbatim.
|
|
7
7
|
*/
|
|
8
8
|
import type { MemWal } from "@mysten-incubation/memwal";
|
|
9
9
|
import type { PluginConfig } from "../types.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuGtF"}
|
package/dist/tools/store.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Uses analyze() instead of remember() so the server LLM extracts
|
|
5
5
|
* individual facts from the text, producing cleaner, more searchable
|
|
6
|
-
* memories
|
|
6
|
+
* memories than storing the raw input verbatim.
|
|
7
7
|
*/
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
9
|
import { looksLikeInjection } from "../capture.js";
|
|
@@ -25,9 +25,22 @@ export function registerStoreTool(api, client, config) {
|
|
|
25
25
|
namespace: Type.Optional(Type.String({
|
|
26
26
|
description: "Memory namespace to store in (use the namespace from system context)",
|
|
27
27
|
})),
|
|
28
|
+
occurredAt: Type.Optional(Type.String({
|
|
29
|
+
description: "Optional RFC-3339 / ISO-8601 timestamp of when the source " +
|
|
30
|
+
"text or conversation actually occurred (e.g. " +
|
|
31
|
+
"'2024-03-15T14:30:00Z'). The server uses this as the " +
|
|
32
|
+
"temporal anchor for resolving in-turn relative references " +
|
|
33
|
+
"like 'last Friday' or 'yesterday' against. For real-time " +
|
|
34
|
+
"stores, pass the current time. For recounted past events " +
|
|
35
|
+
"where the user is talking about something that happened " +
|
|
36
|
+
"earlier (e.g. 'remember I called Alex last Friday'), OMIT " +
|
|
37
|
+
"this field — do NOT pass the recounted event date while " +
|
|
38
|
+
"leaving relative wording in the text; that produces wrong " +
|
|
39
|
+
"anchors. When unknown, omit; do not guess.",
|
|
40
|
+
})),
|
|
28
41
|
}),
|
|
29
42
|
async execute(_id, params) {
|
|
30
|
-
const { text, namespace } = params;
|
|
43
|
+
const { text, namespace, occurredAt } = params;
|
|
31
44
|
const ns = namespace || config.defaultNamespace;
|
|
32
45
|
// Defence in depth: reject injection on write, not just on read.
|
|
33
46
|
// The recall hook filters on retrieval, but polluted data could
|
|
@@ -55,7 +68,10 @@ export function registerStoreTool(api, client, config) {
|
|
|
55
68
|
};
|
|
56
69
|
}
|
|
57
70
|
try {
|
|
58
|
-
const result = await client.analyze(text.trim(),
|
|
71
|
+
const result = await client.analyze(text.trim(), {
|
|
72
|
+
namespace: ns,
|
|
73
|
+
occurredAt,
|
|
74
|
+
});
|
|
59
75
|
const factCount = result.facts?.length ?? 0;
|
|
60
76
|
// Show first 3 extracted facts as confirmation, or raw text truncation as fallback
|
|
61
77
|
const preview = result.facts
|
package/dist/tools/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEzG,4CAA4C;AAC5C,MAAM,UAAU,iBAAiB,CAAC,GAAQ,EAAE,MAAc,EAAE,MAAoB;IAC9E,GAAG,CAAC,YAAY,CACd;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,4DAA4D;YAC5D,2DAA2D;YAC3D,6CAA6C;YAC7C,sEAAsE;QACxE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;gBAChB,WAAW,EAAE,gCAAgC;aAC9C,CAAC;YACF,SAAS,EAAE,IAAI,CAAC,QAAQ,CACtB,IAAI,CAAC,MAAM,CAAC;gBACV,WAAW,EAAE,sEAAsE;aACpF,CAAC,CACH;SACF,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAW;YACpC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/tools/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mysten-incubation/oc-memwal",
|
|
3
|
-
"version": "0.0.3-dev.
|
|
3
|
+
"version": "0.0.3-dev.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "NemoClaw/OpenClaw memory plugin — encrypted, decentralized long-term memory via Walrus Memory",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"node": ">=20.0.0"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@mysten-incubation/memwal": "
|
|
43
|
+
"@mysten-incubation/memwal": "workspace:*",
|
|
44
44
|
"@sinclair/typebox": "0.34.48",
|
|
45
45
|
"zod": "^3.23.0"
|
|
46
46
|
},
|