@memtensor/memos-local-openclaw-plugin 1.0.3 → 1.0.4-beta.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.
Files changed (138) hide show
  1. package/README.md +38 -21
  2. package/dist/client/connector.d.ts +30 -0
  3. package/dist/client/connector.d.ts.map +1 -0
  4. package/dist/client/connector.js +219 -0
  5. package/dist/client/connector.js.map +1 -0
  6. package/dist/client/hub.d.ts +61 -0
  7. package/dist/client/hub.d.ts.map +1 -0
  8. package/dist/client/hub.js +148 -0
  9. package/dist/client/hub.js.map +1 -0
  10. package/dist/client/skill-sync.d.ts +29 -0
  11. package/dist/client/skill-sync.d.ts.map +1 -0
  12. package/dist/client/skill-sync.js +216 -0
  13. package/dist/client/skill-sync.js.map +1 -0
  14. package/dist/config.d.ts +2 -1
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +70 -3
  17. package/dist/config.js.map +1 -1
  18. package/dist/embedding/index.d.ts +4 -2
  19. package/dist/embedding/index.d.ts.map +1 -1
  20. package/dist/embedding/index.js +17 -1
  21. package/dist/embedding/index.js.map +1 -1
  22. package/dist/hub/auth.d.ts +19 -0
  23. package/dist/hub/auth.d.ts.map +1 -0
  24. package/dist/hub/auth.js +70 -0
  25. package/dist/hub/auth.js.map +1 -0
  26. package/dist/hub/server.d.ts +41 -0
  27. package/dist/hub/server.d.ts.map +1 -0
  28. package/dist/hub/server.js +747 -0
  29. package/dist/hub/server.js.map +1 -0
  30. package/dist/hub/user-manager.d.ts +29 -0
  31. package/dist/hub/user-manager.d.ts.map +1 -0
  32. package/dist/hub/user-manager.js +125 -0
  33. package/dist/hub/user-manager.js.map +1 -0
  34. package/dist/index.d.ts +2 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -3
  37. package/dist/index.js.map +1 -1
  38. package/dist/ingest/providers/index.d.ts +10 -2
  39. package/dist/ingest/providers/index.d.ts.map +1 -1
  40. package/dist/ingest/providers/index.js +203 -6
  41. package/dist/ingest/providers/index.js.map +1 -1
  42. package/dist/ingest/providers/openai.d.ts +1 -0
  43. package/dist/ingest/providers/openai.d.ts.map +1 -1
  44. package/dist/ingest/providers/openai.js +1 -0
  45. package/dist/ingest/providers/openai.js.map +1 -1
  46. package/dist/ingest/task-processor.js +1 -1
  47. package/dist/ingest/task-processor.js.map +1 -1
  48. package/dist/openclaw-api.d.ts +53 -0
  49. package/dist/openclaw-api.d.ts.map +1 -0
  50. package/dist/openclaw-api.js +189 -0
  51. package/dist/openclaw-api.js.map +1 -0
  52. package/dist/recall/engine.js +1 -1
  53. package/dist/recall/engine.js.map +1 -1
  54. package/dist/shared/llm-call.d.ts +4 -1
  55. package/dist/shared/llm-call.d.ts.map +1 -1
  56. package/dist/shared/llm-call.js +15 -0
  57. package/dist/shared/llm-call.js.map +1 -1
  58. package/dist/sharing/types.contract.d.ts +2 -0
  59. package/dist/sharing/types.contract.d.ts.map +1 -0
  60. package/dist/sharing/types.contract.js +3 -0
  61. package/dist/sharing/types.contract.js.map +1 -0
  62. package/dist/sharing/types.d.ts +80 -0
  63. package/dist/sharing/types.d.ts.map +1 -0
  64. package/dist/sharing/types.js +3 -0
  65. package/dist/sharing/types.js.map +1 -0
  66. package/dist/skill/evaluator.d.ts.map +1 -1
  67. package/dist/skill/evaluator.js +2 -2
  68. package/dist/skill/evaluator.js.map +1 -1
  69. package/dist/skill/generator.d.ts.map +1 -1
  70. package/dist/skill/generator.js +4 -4
  71. package/dist/skill/generator.js.map +1 -1
  72. package/dist/skill/upgrader.js +1 -1
  73. package/dist/skill/upgrader.js.map +1 -1
  74. package/dist/skill/validator.js +1 -1
  75. package/dist/skill/validator.js.map +1 -1
  76. package/dist/storage/sqlite.d.ts +294 -0
  77. package/dist/storage/sqlite.d.ts.map +1 -1
  78. package/dist/storage/sqlite.js +828 -8
  79. package/dist/storage/sqlite.js.map +1 -1
  80. package/dist/tools/index.d.ts +1 -0
  81. package/dist/tools/index.d.ts.map +1 -1
  82. package/dist/tools/index.js +3 -1
  83. package/dist/tools/index.js.map +1 -1
  84. package/dist/tools/memory-search.d.ts +3 -2
  85. package/dist/tools/memory-search.d.ts.map +1 -1
  86. package/dist/tools/memory-search.js +48 -7
  87. package/dist/tools/memory-search.js.map +1 -1
  88. package/dist/tools/network-memory-detail.d.ts +4 -0
  89. package/dist/tools/network-memory-detail.d.ts.map +1 -0
  90. package/dist/tools/network-memory-detail.js +34 -0
  91. package/dist/tools/network-memory-detail.js.map +1 -0
  92. package/dist/types.d.ts +47 -2
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/types.js.map +1 -1
  95. package/dist/viewer/html.d.ts.map +1 -1
  96. package/dist/viewer/html.js +2595 -345
  97. package/dist/viewer/html.js.map +1 -1
  98. package/dist/viewer/server.d.ts +45 -0
  99. package/dist/viewer/server.d.ts.map +1 -1
  100. package/dist/viewer/server.js +1153 -15
  101. package/dist/viewer/server.js.map +1 -1
  102. package/index.ts +428 -16
  103. package/openclaw.plugin.json +2 -1
  104. package/package.json +3 -3
  105. package/scripts/postinstall.cjs +282 -45
  106. package/skill/memos-memory-guide/SKILL.md +26 -2
  107. package/src/client/connector.ts +218 -0
  108. package/src/client/hub.ts +189 -0
  109. package/src/client/skill-sync.ts +202 -0
  110. package/src/config.ts +92 -3
  111. package/src/embedding/index.ts +21 -1
  112. package/src/hub/auth.ts +78 -0
  113. package/src/hub/server.ts +740 -0
  114. package/src/hub/user-manager.ts +139 -0
  115. package/src/index.ts +7 -4
  116. package/src/ingest/providers/index.ts +240 -6
  117. package/src/ingest/providers/openai.ts +1 -1
  118. package/src/ingest/task-processor.ts +1 -1
  119. package/src/openclaw-api.ts +287 -0
  120. package/src/recall/engine.ts +1 -1
  121. package/src/shared/llm-call.ts +19 -1
  122. package/src/sharing/types.contract.ts +40 -0
  123. package/src/sharing/types.ts +102 -0
  124. package/src/skill/evaluator.ts +3 -2
  125. package/src/skill/generator.ts +6 -4
  126. package/src/skill/upgrader.ts +1 -1
  127. package/src/skill/validator.ts +1 -1
  128. package/src/storage/sqlite.ts +1093 -7
  129. package/src/tools/index.ts +1 -0
  130. package/src/tools/memory-search.ts +57 -8
  131. package/src/tools/network-memory-detail.ts +34 -0
  132. package/src/types.ts +42 -2
  133. package/src/viewer/html.ts +2595 -345
  134. package/src/viewer/server.ts +1068 -18
  135. package/dist/ingest/extra-paths.d.ts +0 -13
  136. package/dist/ingest/extra-paths.d.ts.map +0 -1
  137. package/dist/ingest/extra-paths.js +0 -173
  138. package/dist/ingest/extra-paths.js.map +0 -1
@@ -1,3 +1,4 @@
1
1
  export { createMemorySearchTool } from "./memory-search";
2
2
  export { createMemoryTimelineTool } from "./memory-timeline";
3
3
  export { createMemoryGetTool } from "./memory-get";
4
+ export { createNetworkMemoryDetailTool } from "./network-memory-detail";
@@ -1,12 +1,30 @@
1
+ import { hubSearchMemories } from "../client/hub";
2
+ import type { HubScope, HubSearchResult } from "../sharing/types";
1
3
  import type { RecallEngine } from "../recall/engine";
2
- import type { ToolDefinition } from "../types";
4
+ import type { PluginContext, ToolDefinition } from "../types";
5
+ import type { SqliteStore } from "../storage/sqlite";
3
6
 
4
7
  function resolveOwnerFilter(owner: unknown): string[] {
5
8
  const resolvedOwner = typeof owner === "string" && owner.trim().length > 0 ? owner : "agent:main";
6
9
  return resolvedOwner === "public" ? ["public"] : [resolvedOwner, "public"];
7
10
  }
8
11
 
9
- export function createMemorySearchTool(engine: RecallEngine): ToolDefinition {
12
+ function resolveScope(scope: unknown): HubScope {
13
+ return scope === "group" || scope === "all" ? scope : "local";
14
+ }
15
+
16
+ function emptyHubResult(scope: HubScope): HubSearchResult {
17
+ return {
18
+ hits: [],
19
+ meta: {
20
+ totalCandidates: 0,
21
+ searchedGroups: [],
22
+ includedPublic: scope === "all",
23
+ },
24
+ };
25
+ }
26
+
27
+ export function createMemorySearchTool(engine: RecallEngine, store?: SqliteStore, ctx?: PluginContext): ToolDefinition {
10
28
  return {
11
29
  name: "memory_search",
12
30
  description:
@@ -27,16 +45,47 @@ export function createMemorySearchTool(engine: RecallEngine): ToolDefinition {
27
45
  type: "number",
28
46
  description: "Minimum relevance score threshold 0-1 (default 0.45, floor 0.35).",
29
47
  },
48
+ scope: {
49
+ type: "string",
50
+ description: "Search scope: local (default), group, or all. Group/all return split local and hub sections.",
51
+ },
52
+ hubAddress: {
53
+ type: "string",
54
+ description: "Optional hub address override for group/all search, integration tests, or manual routing.",
55
+ },
56
+ userToken: {
57
+ type: "string",
58
+ description: "Optional hub bearer token override for group/all search or integration tests.",
59
+ },
30
60
  },
31
61
  },
32
62
  handler: async (input) => {
33
- const result = await engine.search({
34
- query: (input.query as string) ?? "",
35
- maxResults: input.maxResults as number | undefined,
36
- minScore: input.minScore as number | undefined,
37
- ownerFilter: resolveOwnerFilter(input.owner),
63
+ const query = (input.query as string) ?? "";
64
+ const maxResults = input.maxResults as number | undefined;
65
+ const minScore = input.minScore as number | undefined;
66
+ const ownerFilter = resolveOwnerFilter(input.owner);
67
+ const scope = resolveScope(input.scope);
68
+
69
+ const localSearch = engine.search({
70
+ query,
71
+ maxResults,
72
+ minScore,
73
+ ownerFilter,
38
74
  });
39
- return result;
75
+
76
+ if (scope === "local" || !store || !ctx) {
77
+ return localSearch;
78
+ }
79
+
80
+ const [local, hub] = await Promise.all([
81
+ localSearch,
82
+ hubSearchMemories(store, ctx, { query, maxResults, scope, hubAddress: input.hubAddress as string | undefined, userToken: input.userToken as string | undefined }).catch((err) => {
83
+ ctx.log.warn(`Hub search failed, using local-only results: ${err}`);
84
+ return emptyHubResult(scope);
85
+ }),
86
+ ]);
87
+
88
+ return { local, hub };
40
89
  },
41
90
  };
42
91
  }
@@ -0,0 +1,34 @@
1
+ import { hubGetMemoryDetail } from "../client/hub";
2
+ import type { PluginContext, ToolDefinition } from "../types";
3
+ import type { SqliteStore } from "../storage/sqlite";
4
+
5
+ export function createNetworkMemoryDetailTool(store: SqliteStore, ctx: PluginContext): ToolDefinition {
6
+ return {
7
+ name: "network_memory_detail",
8
+ description:
9
+ "Fetch the full detail for one Hub search hit using its remoteHitId. Use this after memory_search(scope=group|all) when you need the full shared content.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ remoteHitId: {
14
+ type: "string",
15
+ description: "The remoteHitId returned by memory_search hub results.",
16
+ },
17
+ hubAddress: {
18
+ type: "string",
19
+ description: "Optional hub address override for integration tests or manual routing.",
20
+ },
21
+ userToken: {
22
+ type: "string",
23
+ description: "Optional hub bearer token override for integration tests.",
24
+ },
25
+ },
26
+ required: ["remoteHitId"],
27
+ },
28
+ handler: async (input) => hubGetMemoryDetail(store, ctx, {
29
+ remoteHitId: String(input.remoteHitId ?? ""),
30
+ hubAddress: input.hubAddress as string | undefined,
31
+ userToken: input.userToken as string | undefined,
32
+ }),
33
+ };
34
+ }
package/src/types.ts CHANGED
@@ -150,7 +150,8 @@ export type SummaryProvider =
150
150
  | "bailian"
151
151
  | "cohere"
152
152
  | "mistral"
153
- | "voyage";
153
+ | "voyage"
154
+ | "openclaw";
154
155
 
155
156
  export type EmbeddingProvider =
156
157
  | "openai"
@@ -160,7 +161,8 @@ export type EmbeddingProvider =
160
161
  | "cohere"
161
162
  | "mistral"
162
163
  | "voyage"
163
- | "local";
164
+ | "local"
165
+ | "openclaw";
164
166
 
165
167
  export interface ProviderConfig {
166
168
  provider: string;
@@ -170,6 +172,7 @@ export interface ProviderConfig {
170
172
  headers?: Record<string, string>;
171
173
  timeoutMs?: number;
172
174
  temperature?: number;
175
+ capabilities?: SharingCapabilities;
173
176
  }
174
177
 
175
178
  export interface SummarizerConfig extends ProviderConfig {
@@ -246,6 +249,7 @@ export interface SkillEvolutionConfig {
246
249
  minConfidence?: number;
247
250
  maxSkillLines?: number;
248
251
  autoInstall?: boolean;
252
+ /** Optional independent LLM config for skill evaluation/validation. Falls back to main summarizer if not set. */
249
253
  summarizer?: SummarizerConfig;
250
254
  }
251
255
 
@@ -255,6 +259,35 @@ export interface TelemetryConfig {
255
259
  posthogHost?: string;
256
260
  }
257
261
 
262
+ export type SharingRole = "hub" | "client";
263
+
264
+ export interface SharingCapabilities {
265
+ hostEmbedding?: boolean;
266
+ hostCompletion?: boolean;
267
+ hostSkill?: boolean;
268
+ }
269
+
270
+ export interface HubModeConfig {
271
+ port?: number;
272
+ teamName?: string;
273
+ teamToken?: string;
274
+ }
275
+
276
+ export interface ClientModeConfig {
277
+ hubAddress?: string;
278
+ userToken?: string;
279
+ teamToken?: string;
280
+ pendingUserId?: string;
281
+ }
282
+
283
+ export interface SharingConfig {
284
+ enabled?: boolean;
285
+ role?: SharingRole;
286
+ hub?: HubModeConfig;
287
+ client?: ClientModeConfig;
288
+ capabilities?: SharingCapabilities;
289
+ }
290
+
258
291
  export interface MemosLocalConfig {
259
292
  summarizer?: SummarizerConfig;
260
293
  embedding?: EmbeddingConfig;
@@ -280,6 +313,7 @@ export interface MemosLocalConfig {
280
313
  };
281
314
  skillEvolution?: SkillEvolutionConfig;
282
315
  telemetry?: TelemetryConfig;
316
+ sharing?: SharingConfig;
283
317
  }
284
318
 
285
319
  // ─── Defaults ───
@@ -320,6 +354,12 @@ export interface PluginContext {
320
354
  workspaceDir: string;
321
355
  config: MemosLocalConfig;
322
356
  log: Logger;
357
+ openclawAPI?: OpenClawAPI;
358
+ }
359
+
360
+ export interface OpenClawAPI {
361
+ embed(request: { texts: string[]; model?: string }): Promise<{ embeddings: number[][]; dimensions: number }>;
362
+ complete(request: { prompt: string; maxTokens?: number; temperature?: number; model?: string }): Promise<{ text: string }>;
323
363
  }
324
364
 
325
365
  export interface Logger {