@memtensor/memos-local-openclaw-plugin 1.0.3 → 1.0.4-beta.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/README.md +38 -21
- package/dist/client/connector.d.ts +26 -0
- package/dist/client/connector.d.ts.map +1 -0
- package/dist/client/connector.js +127 -0
- package/dist/client/connector.js.map +1 -0
- package/dist/client/hub.d.ts +61 -0
- package/dist/client/hub.d.ts.map +1 -0
- package/dist/client/hub.js +148 -0
- package/dist/client/hub.js.map +1 -0
- package/dist/client/skill-sync.d.ts +29 -0
- package/dist/client/skill-sync.d.ts.map +1 -0
- package/dist/client/skill-sync.js +216 -0
- package/dist/client/skill-sync.js.map +1 -0
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +70 -3
- package/dist/config.js.map +1 -1
- package/dist/embedding/index.d.ts +4 -2
- package/dist/embedding/index.d.ts.map +1 -1
- package/dist/embedding/index.js +17 -1
- package/dist/embedding/index.js.map +1 -1
- package/dist/hub/auth.d.ts +19 -0
- package/dist/hub/auth.d.ts.map +1 -0
- package/dist/hub/auth.js +70 -0
- package/dist/hub/auth.js.map +1 -0
- package/dist/hub/server.d.ts +41 -0
- package/dist/hub/server.d.ts.map +1 -0
- package/dist/hub/server.js +742 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/hub/user-manager.d.ts +28 -0
- package/dist/hub/user-manager.d.ts.map +1 -0
- package/dist/hub/user-manager.js +112 -0
- package/dist/hub/user-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/ingest/providers/index.d.ts +10 -2
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +203 -6
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/ingest/providers/openai.d.ts +1 -0
- package/dist/ingest/providers/openai.d.ts.map +1 -1
- package/dist/ingest/providers/openai.js +1 -0
- package/dist/ingest/providers/openai.js.map +1 -1
- package/dist/ingest/task-processor.js +1 -1
- package/dist/ingest/task-processor.js.map +1 -1
- package/dist/openclaw-api.d.ts +53 -0
- package/dist/openclaw-api.d.ts.map +1 -0
- package/dist/openclaw-api.js +189 -0
- package/dist/openclaw-api.js.map +1 -0
- package/dist/recall/engine.js +1 -1
- package/dist/recall/engine.js.map +1 -1
- package/dist/shared/llm-call.d.ts +4 -1
- package/dist/shared/llm-call.d.ts.map +1 -1
- package/dist/shared/llm-call.js +15 -0
- package/dist/shared/llm-call.js.map +1 -1
- package/dist/sharing/types.contract.d.ts +2 -0
- package/dist/sharing/types.contract.d.ts.map +1 -0
- package/dist/sharing/types.contract.js +3 -0
- package/dist/sharing/types.contract.js.map +1 -0
- package/dist/sharing/types.d.ts +80 -0
- package/dist/sharing/types.d.ts.map +1 -0
- package/dist/sharing/types.js +3 -0
- package/dist/sharing/types.js.map +1 -0
- package/dist/skill/evaluator.d.ts.map +1 -1
- package/dist/skill/evaluator.js +2 -2
- package/dist/skill/evaluator.js.map +1 -1
- package/dist/skill/generator.d.ts.map +1 -1
- package/dist/skill/generator.js +4 -4
- package/dist/skill/generator.js.map +1 -1
- package/dist/skill/upgrader.js +1 -1
- package/dist/skill/upgrader.js.map +1 -1
- package/dist/skill/validator.js +1 -1
- package/dist/skill/validator.js.map +1 -1
- package/dist/storage/sqlite.d.ts +294 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +902 -8
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-search.d.ts +3 -2
- package/dist/tools/memory-search.d.ts.map +1 -1
- package/dist/tools/memory-search.js +48 -7
- package/dist/tools/memory-search.js.map +1 -1
- package/dist/tools/network-memory-detail.d.ts +4 -0
- package/dist/tools/network-memory-detail.d.ts.map +1 -0
- package/dist/tools/network-memory-detail.js +34 -0
- package/dist/tools/network-memory-detail.js.map +1 -0
- package/dist/types.d.ts +47 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/viewer/html.d.ts.map +1 -1
- package/dist/viewer/html.js +2323 -252
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +43 -0
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +1064 -15
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +428 -16
- package/openclaw.plugin.json +2 -1
- package/package.json +3 -3
- package/scripts/postinstall.cjs +282 -45
- package/skill/memos-memory-guide/SKILL.md +26 -2
- package/src/client/connector.ts +124 -0
- package/src/client/hub.ts +189 -0
- package/src/client/skill-sync.ts +202 -0
- package/src/config.ts +92 -3
- package/src/embedding/index.ts +21 -1
- package/src/hub/auth.ts +78 -0
- package/src/hub/server.ts +734 -0
- package/src/hub/user-manager.ts +126 -0
- package/src/index.ts +7 -4
- package/src/ingest/providers/index.ts +240 -6
- package/src/ingest/providers/openai.ts +1 -1
- package/src/ingest/task-processor.ts +1 -1
- package/src/openclaw-api.ts +287 -0
- package/src/recall/engine.ts +1 -1
- package/src/shared/llm-call.ts +19 -1
- package/src/sharing/types.contract.ts +40 -0
- package/src/sharing/types.ts +102 -0
- package/src/skill/evaluator.ts +3 -2
- package/src/skill/generator.ts +6 -4
- package/src/skill/upgrader.ts +1 -1
- package/src/skill/validator.ts +1 -1
- package/src/storage/sqlite.ts +1167 -7
- package/src/tools/index.ts +1 -0
- package/src/tools/memory-search.ts +57 -8
- package/src/tools/network-memory-detail.ts +34 -0
- package/src/types.ts +42 -2
- package/src/viewer/html.ts +2323 -252
- package/src/viewer/server.ts +985 -18
- package/dist/ingest/extra-paths.d.ts +0 -13
- package/dist/ingest/extra-paths.d.ts.map +0 -1
- package/dist/ingest/extra-paths.js +0 -173
- package/dist/ingest/extra-paths.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
[](https://nodejs.org/)
|
|
6
6
|
[](https://github.com/MemTensor/MemOS/tree/main/apps/memos-local-openclaw)
|
|
7
7
|
|
|
8
|
-
Persistent local conversation memory for [OpenClaw](https://github.com/nicepkg/openclaw) AI Agents. Every conversation is automatically captured, semantically indexed, and instantly recallable — with **task summarization & skill evolution**, and **multi-agent collaborative memory**.
|
|
8
|
+
Persistent local conversation memory for [OpenClaw](https://github.com/nicepkg/openclaw) AI Agents. Every conversation is automatically captured, semantically indexed, and instantly recallable — with **task summarization & skill evolution**, **Hub-based team sharing for memories and skills**, and **multi-agent collaborative memory**.
|
|
9
9
|
|
|
10
|
-
**Full-write | Hybrid Search | Task Summarization & Skill Evolution |
|
|
10
|
+
**Full-write | Hybrid Search | Task Summarization & Skill Evolution | Hub Team Sharing | Memory Viewer**
|
|
11
11
|
|
|
12
12
|
> **Homepage:** 🌐 [Homepage](https://memos-claw.openmem.net) · 📖 [Documentation](https://memos-claw.openmem.net/docs/index.html) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-openclaw-plugin)
|
|
13
13
|
|
|
@@ -48,13 +48,13 @@ Persistent local conversation memory for [OpenClaw](https://github.com/nicepkg/o
|
|
|
48
48
|
- **Dedicated model** — Optional separate LLM model for skill generation (e.g., Claude 4.6 for higher quality)
|
|
49
49
|
- **LLM fallback chain** — `skillSummarizer` → `summarizer` → OpenClaw native model (auto-detected from `openclaw.json`). If all configured models fail, the next in chain is tried automatically
|
|
50
50
|
|
|
51
|
-
###
|
|
52
|
-
- **
|
|
53
|
-
- **
|
|
54
|
-
- **
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
51
|
+
### Hub Team Sharing (v4)
|
|
52
|
+
- **Hub-Spoke collaboration** — One Hub stores shared tasks, memories, and skills; clients keep private data local and query the Hub only when needed
|
|
53
|
+
- **Scoped retrieval** — `memory_search` and `skill_search` support `local`, `group`, and `all` search scopes in v4 flows
|
|
54
|
+
- **Admin approval flow** — Team members are approved through the Hub before they can access shared data
|
|
55
|
+
- **Task sharing** — `task_share` / `task_unshare` push or remove task memories from the Hub without changing local private storage
|
|
56
|
+
- **Skill publish/pull** — Skills can be published to Hub visibility scopes and pulled back locally as full bundles for offline reuse
|
|
57
|
+
- **Viewer support** — The Memory Viewer now includes Hub connection state, pending approvals, scoped search, task share controls, and Hub skill pull actions
|
|
58
58
|
|
|
59
59
|
### Memory Migration — Reconnect 🦐
|
|
60
60
|
- **One-click import** — Seamlessly migrate OpenClaw's native built-in memories (SQLite + JSONL) into the MemOS intelligent memory system
|
|
@@ -184,7 +184,7 @@ Add the plugin config to `~/.openclaw/openclaw.json`:
|
|
|
184
184
|
| Mistral | `mistral` | `mistral-embed` | |
|
|
185
185
|
| Local (offline) | `local` | — | Uses `Xenova/all-MiniLM-L6-v2`, no API needed |
|
|
186
186
|
|
|
187
|
-
> **No embedding config?**
|
|
187
|
+
> **No embedding config?** In the current sidecar build, the plugin falls back to the local embedding model automatically. If you need deterministic team-wide behavior, configure an explicit provider.
|
|
188
188
|
|
|
189
189
|
#### Summarizer Provider Options
|
|
190
190
|
|
|
@@ -259,6 +259,18 @@ memos-local: started (embedding: openai_compatible)
|
|
|
259
259
|
╚══════════════════════════════════════════╝
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
+
## Hub Sharing Quick Start (v4)
|
|
263
|
+
|
|
264
|
+
If you want team sharing, do this after the basic install works:
|
|
265
|
+
|
|
266
|
+
1. **Pick a Hub machine** and set `sharing.enabled=true`, `sharing.role="hub"`, plus `sharing.hub.port`, `sharing.hub.teamName`, and `sharing.hub.teamToken`.
|
|
267
|
+
2. **Configure each client machine** with `sharing.enabled=true`, `sharing.role="client"`, `sharing.client.hubAddress`, and `sharing.client.userToken`.
|
|
268
|
+
3. **Open Viewer → Settings → Hub & Team** to verify connection state, current user, role, and groups.
|
|
269
|
+
4. **Search with scope** `Group` or `All` in Memories and Skills to query Hub data alongside local data.
|
|
270
|
+
5. **Share tasks** from the Tasks view and **pull skills** from the Skills view.
|
|
271
|
+
|
|
272
|
+
For the full end-user workflow, see [`HUB-SHARING-GUIDE.md`](./HUB-SHARING-GUIDE.md).
|
|
273
|
+
|
|
262
274
|
### 5. Verify Memory is Working
|
|
263
275
|
|
|
264
276
|
**Step A** — Have a conversation with your OpenClaw agent about anything.
|
|
@@ -361,21 +373,26 @@ Query → FTS5 + Vector dual recall → RRF Fusion → MMR Rerank
|
|
|
361
373
|
|
|
362
374
|
## Agent Tools
|
|
363
375
|
|
|
364
|
-
The plugin provides
|
|
376
|
+
The plugin provides local memory tools plus v4 Hub-sharing tools, and auto-installs the **memos-memory-guide** skill:
|
|
365
377
|
|
|
366
378
|
| Tool | Purpose | When to Use |
|
|
367
379
|
|------|---------|-------------|
|
|
368
380
|
| `auto_recall` | Automatically injects relevant memories into agent context each turn (via `before_agent_start` hook) | Runs automatically — no manual call needed |
|
|
369
|
-
| `memory_search` | Search memories
|
|
370
|
-
| `memory_get` | Get full original text of a memory chunk | When you need to verify exact details from a search hit |
|
|
371
|
-
| `memory_timeline` | Surrounding conversation around a chunk | When you need the exact dialogue before/after a hit |
|
|
372
|
-
| `
|
|
373
|
-
| `
|
|
374
|
-
| `
|
|
381
|
+
| `memory_search` | Search memories with `scope: local | group | all`; Hub hits are returned separately from local hits | When auto-recall returned nothing or you need local + shared context |
|
|
382
|
+
| `memory_get` | Get full original text of a local memory chunk | When you need to verify exact details from a local search hit |
|
|
383
|
+
| `memory_timeline` | Surrounding conversation around a local chunk | When you need the exact dialogue before/after a local hit |
|
|
384
|
+
| `network_memory_detail` | Fetch full content for a Hub memory hit | When a shared search hit looks relevant and you need full detail |
|
|
385
|
+
| `memory_write_public` | Write a memory to the local shared public space (`owner="public"`) | When the agent discovers knowledge all local agents should access |
|
|
386
|
+
| `task_summary` | Full structured summary of a completed task | When a hit has `task_id` and you need the full story |
|
|
387
|
+
| `task_share` | Push a local task and its memories to the Hub | When a task should be searchable by your group or the whole team |
|
|
388
|
+
| `task_unshare` | Remove a shared task from the Hub | When a task should stop being shared |
|
|
389
|
+
| `skill_get` | Get local skill content by `skillId` or `taskId` | When a hit has a linked task/skill and you want the reusable guide |
|
|
375
390
|
| `skill_install` | Install a skill into the agent workspace | When the skill should be permanently available for future turns |
|
|
376
|
-
| `skill_search` | Search skills
|
|
377
|
-
| `skill_publish` |
|
|
378
|
-
| `skill_unpublish` |
|
|
391
|
+
| `skill_search` | Search skills with `scope: local | group | all` | When an agent needs to discover local or Hub-shared skills |
|
|
392
|
+
| `skill_publish` | Publish a skill to Hub sharing or local public visibility, depending on scope | When a skill should be shared with teammates |
|
|
393
|
+
| `skill_unpublish` | Make a previously shared skill private again | When a skill should no longer be shared |
|
|
394
|
+
| `network_skill_pull` | Pull a Hub skill bundle into local storage | When a teammate's shared skill should be usable locally/offline |
|
|
395
|
+
| `network_team_info` | Show current Hub URL, user, role, and groups | When you need to inspect current team connection state |
|
|
379
396
|
| `memory_viewer` | Get the URL of the Memory Viewer web UI | When the user asks where to view or manage their memories |
|
|
380
397
|
|
|
381
398
|
### Search Parameters
|
|
@@ -403,7 +420,7 @@ Open `http://127.0.0.1:18799` in your browser after starting the gateway.
|
|
|
403
420
|
| **Analytics** | Daily write/read activity charts, memory/task/skill totals, role breakdown |
|
|
404
421
|
| **Logs** | Tool call log (memory_search, auto_recall, memory_add, etc.) with input/output, duration, and tool filter; auto-refresh |
|
|
405
422
|
| **Import** | 🦐 OpenClaw native memory migration — scan, one-click import with real-time SSE progress, smart dedup, pause/resume; post-processing for task & skill generation |
|
|
406
|
-
| **Settings** | Online configuration
|
|
423
|
+
| **Settings** | Online configuration plus **Hub & Team** status, current role, team/groups, and admin pending-user actions |
|
|
407
424
|
|
|
408
425
|
**Viewer won't open?**
|
|
409
426
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Logger, MemosLocalConfig } from "../types";
|
|
2
|
+
import type { GroupInfo, UserRole, UserStatus } from "../sharing/types";
|
|
3
|
+
import type { SqliteStore } from "../storage/sqlite";
|
|
4
|
+
export interface HubSessionInfo {
|
|
5
|
+
hubUrl: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
username: string;
|
|
8
|
+
userToken: string;
|
|
9
|
+
role: UserRole;
|
|
10
|
+
connectedAt: number;
|
|
11
|
+
}
|
|
12
|
+
export interface HubStatusInfo {
|
|
13
|
+
connected: boolean;
|
|
14
|
+
hubUrl?: string;
|
|
15
|
+
user: null | {
|
|
16
|
+
id: string;
|
|
17
|
+
username: string;
|
|
18
|
+
role: UserRole;
|
|
19
|
+
status: UserStatus | string;
|
|
20
|
+
groups: GroupInfo[];
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare function connectToHub(store: SqliteStore, config: MemosLocalConfig, log?: Logger): Promise<HubSessionInfo>;
|
|
24
|
+
export declare function getHubStatus(store: SqliteStore, config: MemosLocalConfig): Promise<HubStatusInfo>;
|
|
25
|
+
export declare function autoJoinHub(store: SqliteStore, config: MemosLocalConfig, log: Logger): Promise<HubSessionInfo>;
|
|
26
|
+
//# sourceMappingURL=connector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../../src/client/connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,GAAG;QACX,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;QAC5B,MAAM,EAAE,SAAS,EAAE,CAAC;KACrB,CAAC;CACH;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6BtH;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BvG;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CA8BzB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.connectToHub = connectToHub;
|
|
37
|
+
exports.getHubStatus = getHubStatus;
|
|
38
|
+
exports.autoJoinHub = autoJoinHub;
|
|
39
|
+
const hub_1 = require("./hub");
|
|
40
|
+
async function connectToHub(store, config, log) {
|
|
41
|
+
const hubAddress = config.sharing?.client?.hubAddress ?? "";
|
|
42
|
+
let userToken = config.sharing?.client?.userToken ?? "";
|
|
43
|
+
if (!userToken) {
|
|
44
|
+
const persisted = store.getClientHubConnection();
|
|
45
|
+
if (persisted?.userToken)
|
|
46
|
+
userToken = persisted.userToken;
|
|
47
|
+
}
|
|
48
|
+
if (!userToken && config.sharing?.client?.teamToken) {
|
|
49
|
+
if (!log)
|
|
50
|
+
throw new Error("hub client connection is not configured (no userToken, has teamToken but no logger for auto-join)");
|
|
51
|
+
return autoJoinHub(store, config, log);
|
|
52
|
+
}
|
|
53
|
+
if (!hubAddress || !userToken) {
|
|
54
|
+
throw new Error("hub client connection is not configured");
|
|
55
|
+
}
|
|
56
|
+
const hubUrl = (0, hub_1.normalizeHubUrl)(hubAddress);
|
|
57
|
+
const me = await (0, hub_1.hubRequestJson)(hubUrl, userToken, "/api/v1/hub/me", { method: "GET" });
|
|
58
|
+
store.setClientHubConnection({
|
|
59
|
+
hubUrl,
|
|
60
|
+
userId: String(me.id),
|
|
61
|
+
username: String(me.username ?? ""),
|
|
62
|
+
userToken,
|
|
63
|
+
role: String(me.role ?? "member"),
|
|
64
|
+
connectedAt: Date.now(),
|
|
65
|
+
});
|
|
66
|
+
return store.getClientHubConnection();
|
|
67
|
+
}
|
|
68
|
+
async function getHubStatus(store, config) {
|
|
69
|
+
const conn = store.getClientHubConnection();
|
|
70
|
+
const hubAddress = conn?.hubUrl || config.sharing?.client?.hubAddress || "";
|
|
71
|
+
const userToken = conn?.userToken || config.sharing?.client?.userToken || "";
|
|
72
|
+
if (!hubAddress || !userToken) {
|
|
73
|
+
return { connected: false, user: null };
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const me = await (0, hub_1.hubRequestJson)((0, hub_1.normalizeHubUrl)(hubAddress), userToken, "/api/v1/hub/me", { method: "GET" });
|
|
77
|
+
return {
|
|
78
|
+
connected: true,
|
|
79
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
80
|
+
user: {
|
|
81
|
+
id: String(me.id),
|
|
82
|
+
username: String(me.username ?? ""),
|
|
83
|
+
role: String(me.role ?? "member"),
|
|
84
|
+
status: String(me.status ?? "active"),
|
|
85
|
+
groups: Array.isArray(me.groups)
|
|
86
|
+
? me.groups.map((group) => ({
|
|
87
|
+
id: String(group.id),
|
|
88
|
+
name: String(group.name),
|
|
89
|
+
description: typeof group.description === "string" ? group.description : undefined,
|
|
90
|
+
}))
|
|
91
|
+
: [],
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return { connected: false, user: null };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function autoJoinHub(store, config, log) {
|
|
100
|
+
const hubAddress = config.sharing?.client?.hubAddress ?? "";
|
|
101
|
+
const teamToken = config.sharing?.client?.teamToken ?? "";
|
|
102
|
+
if (!hubAddress || !teamToken) {
|
|
103
|
+
throw new Error("hubAddress and teamToken are required for auto-join");
|
|
104
|
+
}
|
|
105
|
+
const hubUrl = (0, hub_1.normalizeHubUrl)(hubAddress);
|
|
106
|
+
const hostname = typeof globalThis.process !== "undefined" ? (await Promise.resolve().then(() => __importStar(require("os")))).hostname() : "unknown";
|
|
107
|
+
const username = typeof globalThis.process !== "undefined" ? (await Promise.resolve().then(() => __importStar(require("os")))).userInfo().username : "user";
|
|
108
|
+
log.info(`Joining Hub at ${hubUrl} as "${username}"...`);
|
|
109
|
+
const result = await (0, hub_1.hubRequestJson)(hubUrl, "", "/api/v1/hub/join", {
|
|
110
|
+
method: "POST",
|
|
111
|
+
body: JSON.stringify({ teamToken, username, deviceName: hostname }),
|
|
112
|
+
});
|
|
113
|
+
if (!result.userToken) {
|
|
114
|
+
throw new Error(`Hub join failed: ${JSON.stringify(result)}`);
|
|
115
|
+
}
|
|
116
|
+
log.info(`Joined Hub successfully! userId=${result.userId}`);
|
|
117
|
+
store.setClientHubConnection({
|
|
118
|
+
hubUrl,
|
|
119
|
+
userId: String(result.userId),
|
|
120
|
+
username,
|
|
121
|
+
userToken: result.userToken,
|
|
122
|
+
role: "member",
|
|
123
|
+
connectedAt: Date.now(),
|
|
124
|
+
});
|
|
125
|
+
return store.getClientHubConnection();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/client/connector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { PluginContext } from "../types";
|
|
2
|
+
import type { SqliteStore } from "../storage/sqlite";
|
|
3
|
+
import type { HubMemoryDetail, HubScope, HubSearchResult, HubSkillSearchResult } from "../sharing/types";
|
|
4
|
+
export interface ResolvedHubClient {
|
|
5
|
+
hubUrl: string;
|
|
6
|
+
userToken: string;
|
|
7
|
+
userId: string;
|
|
8
|
+
username: string;
|
|
9
|
+
role: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveHubClient(store: SqliteStore, ctx: PluginContext, overrides?: {
|
|
12
|
+
hubAddress?: string;
|
|
13
|
+
userToken?: string;
|
|
14
|
+
}): Promise<ResolvedHubClient>;
|
|
15
|
+
export declare function hubListMemories(store: SqliteStore, ctx: PluginContext, input?: {
|
|
16
|
+
limit?: number;
|
|
17
|
+
hubAddress?: string;
|
|
18
|
+
userToken?: string;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
memories: Array<any>;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function hubListTasks(store: SqliteStore, ctx: PluginContext, input?: {
|
|
23
|
+
limit?: number;
|
|
24
|
+
hubAddress?: string;
|
|
25
|
+
userToken?: string;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
tasks: Array<any>;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function hubListSkills(store: SqliteStore, ctx: PluginContext, input?: {
|
|
30
|
+
limit?: number;
|
|
31
|
+
hubAddress?: string;
|
|
32
|
+
userToken?: string;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
skills: Array<any>;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function hubSearchMemories(store: SqliteStore, ctx: PluginContext, input: {
|
|
37
|
+
query: string;
|
|
38
|
+
maxResults?: number;
|
|
39
|
+
scope?: HubScope;
|
|
40
|
+
hubAddress?: string;
|
|
41
|
+
userToken?: string;
|
|
42
|
+
}): Promise<HubSearchResult>;
|
|
43
|
+
export declare function hubSearchSkills(store: SqliteStore, ctx: PluginContext, input: {
|
|
44
|
+
query: string;
|
|
45
|
+
maxResults?: number;
|
|
46
|
+
hubAddress?: string;
|
|
47
|
+
userToken?: string;
|
|
48
|
+
}): Promise<HubSkillSearchResult>;
|
|
49
|
+
export declare function hubGetMemoryDetail(store: SqliteStore, ctx: PluginContext, input: {
|
|
50
|
+
remoteHitId: string;
|
|
51
|
+
hubAddress?: string;
|
|
52
|
+
userToken?: string;
|
|
53
|
+
}): Promise<HubMemoryDetail>;
|
|
54
|
+
export declare function hubUpdateUsername(store: SqliteStore, ctx: PluginContext, newUsername: string): Promise<{
|
|
55
|
+
ok: boolean;
|
|
56
|
+
username: string;
|
|
57
|
+
userToken: string;
|
|
58
|
+
}>;
|
|
59
|
+
export declare function hubRequestJson(hubUrl: string, userToken: string, route: string, init?: RequestInit): Promise<unknown>;
|
|
60
|
+
export declare function normalizeHubUrl(hubAddress: string): string;
|
|
61
|
+
//# sourceMappingURL=hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/client/hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveHubClient = resolveHubClient;
|
|
4
|
+
exports.hubListMemories = hubListMemories;
|
|
5
|
+
exports.hubListTasks = hubListTasks;
|
|
6
|
+
exports.hubListSkills = hubListSkills;
|
|
7
|
+
exports.hubSearchMemories = hubSearchMemories;
|
|
8
|
+
exports.hubSearchSkills = hubSearchSkills;
|
|
9
|
+
exports.hubGetMemoryDetail = hubGetMemoryDetail;
|
|
10
|
+
exports.hubUpdateUsername = hubUpdateUsername;
|
|
11
|
+
exports.hubRequestJson = hubRequestJson;
|
|
12
|
+
exports.normalizeHubUrl = normalizeHubUrl;
|
|
13
|
+
async function resolveHubClient(store, ctx, overrides) {
|
|
14
|
+
const persisted = store.getClientHubConnection();
|
|
15
|
+
if (persisted?.hubUrl && persisted?.userToken) {
|
|
16
|
+
return {
|
|
17
|
+
hubUrl: normalizeHubUrl(String(persisted.hubUrl)),
|
|
18
|
+
userToken: String(persisted.userToken),
|
|
19
|
+
userId: String(persisted.userId),
|
|
20
|
+
username: String(persisted.username ?? ""),
|
|
21
|
+
role: String(persisted.role ?? "member"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const hubAddress = overrides?.hubAddress ?? ctx.config.sharing?.client?.hubAddress ?? "";
|
|
25
|
+
const userToken = overrides?.userToken ?? ctx.config.sharing?.client?.userToken ?? "";
|
|
26
|
+
if (!hubAddress || !userToken) {
|
|
27
|
+
throw new Error("hub client connection is not configured");
|
|
28
|
+
}
|
|
29
|
+
const hubUrl = normalizeHubUrl(hubAddress);
|
|
30
|
+
const me = await hubRequestJson(hubUrl, userToken, "/api/v1/hub/me", { method: "GET" });
|
|
31
|
+
return {
|
|
32
|
+
hubUrl,
|
|
33
|
+
userToken,
|
|
34
|
+
userId: String(me.id),
|
|
35
|
+
username: String(me.username ?? ""),
|
|
36
|
+
role: String(me.role ?? "member"),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async function hubListMemories(store, ctx, input) {
|
|
40
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input?.hubAddress, userToken: input?.userToken });
|
|
41
|
+
const url = new URL(`${client.hubUrl}/api/v1/hub/memories`);
|
|
42
|
+
if (input?.limit != null)
|
|
43
|
+
url.searchParams.set("limit", String(input.limit));
|
|
44
|
+
return hubRequestJson(url.origin, client.userToken, `${url.pathname}${url.search}`, {
|
|
45
|
+
method: "GET",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function hubListTasks(store, ctx, input) {
|
|
49
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input?.hubAddress, userToken: input?.userToken });
|
|
50
|
+
const url = new URL(`${client.hubUrl}/api/v1/hub/tasks`);
|
|
51
|
+
if (input?.limit != null)
|
|
52
|
+
url.searchParams.set("limit", String(input.limit));
|
|
53
|
+
return hubRequestJson(url.origin, client.userToken, `${url.pathname}${url.search}`, {
|
|
54
|
+
method: "GET",
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async function hubListSkills(store, ctx, input) {
|
|
58
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input?.hubAddress, userToken: input?.userToken });
|
|
59
|
+
const url = new URL(`${client.hubUrl}/api/v1/hub/skills/list`);
|
|
60
|
+
if (input?.limit != null)
|
|
61
|
+
url.searchParams.set("limit", String(input.limit));
|
|
62
|
+
return hubRequestJson(url.origin, client.userToken, `${url.pathname}${url.search}`, {
|
|
63
|
+
method: "GET",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function hubSearchMemories(store, ctx, input) {
|
|
67
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input.hubAddress, userToken: input.userToken });
|
|
68
|
+
return hubRequestJson(client.hubUrl, client.userToken, "/api/v1/hub/search", {
|
|
69
|
+
method: "POST",
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
query: input.query,
|
|
72
|
+
maxResults: input.maxResults,
|
|
73
|
+
scope: input.scope,
|
|
74
|
+
}),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function hubSearchSkills(store, ctx, input) {
|
|
78
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input.hubAddress, userToken: input.userToken });
|
|
79
|
+
const url = new URL(`${client.hubUrl}/api/v1/hub/skills`);
|
|
80
|
+
url.searchParams.set("query", input.query);
|
|
81
|
+
if (input.maxResults != null)
|
|
82
|
+
url.searchParams.set("maxResults", String(input.maxResults));
|
|
83
|
+
return hubRequestJson(url.origin, client.userToken, `${url.pathname}${url.search}`, {
|
|
84
|
+
method: "GET",
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async function hubGetMemoryDetail(store, ctx, input) {
|
|
88
|
+
const client = await resolveHubClient(store, ctx, { hubAddress: input.hubAddress, userToken: input.userToken });
|
|
89
|
+
const detail = await hubRequestJson(client.hubUrl, client.userToken, "/api/v1/hub/memory-detail", {
|
|
90
|
+
method: "POST",
|
|
91
|
+
body: JSON.stringify({
|
|
92
|
+
remoteHitId: input.remoteHitId,
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
remoteHitId: input.remoteHitId,
|
|
97
|
+
content: String(detail.content ?? ""),
|
|
98
|
+
summary: String(detail.summary ?? ""),
|
|
99
|
+
source: {
|
|
100
|
+
ts: Number(detail.source?.ts ?? 0),
|
|
101
|
+
role: String(detail.source?.role ?? "assistant"),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function hubUpdateUsername(store, ctx, newUsername) {
|
|
106
|
+
const client = await resolveHubClient(store, ctx);
|
|
107
|
+
const result = await hubRequestJson(client.hubUrl, client.userToken, "/api/v1/hub/me/update-profile", {
|
|
108
|
+
method: "POST",
|
|
109
|
+
body: JSON.stringify({ username: newUsername }),
|
|
110
|
+
});
|
|
111
|
+
if (result.ok && result.userToken) {
|
|
112
|
+
store.setClientHubConnection({
|
|
113
|
+
hubUrl: client.hubUrl,
|
|
114
|
+
userId: client.userId,
|
|
115
|
+
username: result.username,
|
|
116
|
+
userToken: result.userToken,
|
|
117
|
+
role: client.role,
|
|
118
|
+
connectedAt: Date.now(),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
async function hubRequestJson(hubUrl, userToken, route, init = {}) {
|
|
124
|
+
const res = await fetch(`${normalizeHubUrl(hubUrl)}${route}`, {
|
|
125
|
+
...init,
|
|
126
|
+
headers: {
|
|
127
|
+
authorization: `Bearer ${userToken}`,
|
|
128
|
+
...(init.body ? { "content-type": "application/json" } : {}),
|
|
129
|
+
...(init.headers ?? {}),
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
if (!res.ok) {
|
|
133
|
+
const body = await res.text();
|
|
134
|
+
throw new Error(`hub request failed (${res.status}): ${body || res.statusText}`);
|
|
135
|
+
}
|
|
136
|
+
if (res.status === 204)
|
|
137
|
+
return null;
|
|
138
|
+
return res.json();
|
|
139
|
+
}
|
|
140
|
+
function normalizeHubUrl(hubAddress) {
|
|
141
|
+
const trimmed = hubAddress.trim().replace(/\/+$/, "");
|
|
142
|
+
if (!trimmed)
|
|
143
|
+
return "";
|
|
144
|
+
if (/^https?:\/\//i.test(trimmed))
|
|
145
|
+
return trimmed;
|
|
146
|
+
return `http://${trimmed}`;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../../src/client/hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PluginContext } from "../types";
|
|
2
|
+
import type { SqliteStore } from "../storage/sqlite";
|
|
3
|
+
import type { SkillBundle } from "../sharing/types";
|
|
4
|
+
export declare function buildSkillBundleForHub(store: SqliteStore, skillId: string): SkillBundle;
|
|
5
|
+
export declare function publishSkillBundleToHub(store: SqliteStore, ctx: PluginContext, input: {
|
|
6
|
+
skillId: string;
|
|
7
|
+
visibility: "public" | "group";
|
|
8
|
+
groupId?: string;
|
|
9
|
+
hubAddress?: string;
|
|
10
|
+
userToken?: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
skillId: string;
|
|
13
|
+
visibility: "public" | "group";
|
|
14
|
+
}>;
|
|
15
|
+
export declare function fetchHubSkillBundle(store: SqliteStore, ctx: PluginContext, input: {
|
|
16
|
+
skillId: string;
|
|
17
|
+
hubAddress?: string;
|
|
18
|
+
userToken?: string;
|
|
19
|
+
}): Promise<SkillBundle & {
|
|
20
|
+
skillId: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function restoreSkillBundleFromHub(store: SqliteStore, ctx: PluginContext, payload: SkillBundle & {
|
|
23
|
+
skillId?: string;
|
|
24
|
+
}): {
|
|
25
|
+
localSkillId: string;
|
|
26
|
+
localName: string;
|
|
27
|
+
dirPath: string;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=skill-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-sync.d.ts","sourceRoot":"","sources":["../../src/client/skill-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,UAAU,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAwBvF;AAwCD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACpH,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAA;CAAE,CAAC,CAY9D;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,OAAO,CAAC,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAK5C;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,WAAW,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAuD9D"}
|