@memtensor/memos-local-openclaw-plugin 1.0.4-beta.0 → 1.0.4-beta.10
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/.env.example +7 -0
- package/README.md +24 -24
- package/dist/capture/index.d.ts +1 -1
- package/dist/capture/index.d.ts.map +1 -1
- package/dist/capture/index.js +34 -2
- package/dist/capture/index.js.map +1 -1
- package/dist/client/connector.d.ts +5 -2
- package/dist/client/connector.d.ts.map +1 -1
- package/dist/client/connector.js +173 -14
- package/dist/client/connector.js.map +1 -1
- package/dist/client/hub.d.ts.map +1 -1
- package/dist/client/hub.js +22 -0
- package/dist/client/hub.js.map +1 -1
- package/dist/client/skill-sync.d.ts +7 -0
- package/dist/client/skill-sync.d.ts.map +1 -1
- package/dist/client/skill-sync.js +10 -0
- package/dist/client/skill-sync.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -11
- package/dist/config.js.map +1 -1
- package/dist/hub/server.d.ts +7 -0
- package/dist/hub/server.d.ts.map +1 -1
- package/dist/hub/server.js +301 -106
- package/dist/hub/server.js.map +1 -1
- package/dist/hub/user-manager.d.ts +3 -0
- package/dist/hub/user-manager.d.ts.map +1 -1
- package/dist/hub/user-manager.js +18 -1
- package/dist/hub/user-manager.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/ingest/providers/index.d.ts.map +1 -1
- package/dist/ingest/providers/index.js +37 -6
- package/dist/ingest/providers/index.js.map +1 -1
- package/dist/recall/engine.d.ts.map +1 -1
- package/dist/recall/engine.js +91 -1
- package/dist/recall/engine.js.map +1 -1
- package/dist/shared/llm-call.d.ts +1 -0
- package/dist/shared/llm-call.d.ts.map +1 -1
- package/dist/shared/llm-call.js +82 -8
- package/dist/shared/llm-call.js.map +1 -1
- package/dist/sharing/types.d.ts +1 -1
- package/dist/sharing/types.d.ts.map +1 -1
- package/dist/skill/evolver.d.ts +2 -0
- package/dist/skill/evolver.d.ts.map +1 -1
- package/dist/skill/evolver.js +3 -0
- package/dist/skill/evolver.js.map +1 -1
- package/dist/storage/ensure-binding.d.ts +12 -0
- package/dist/storage/ensure-binding.d.ts.map +1 -0
- package/dist/storage/ensure-binding.js +53 -0
- package/dist/storage/ensure-binding.js.map +1 -0
- package/dist/storage/sqlite.d.ts +74 -20
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +301 -207
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/telemetry.d.ts +12 -5
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +156 -40
- package/dist/telemetry.js.map +1 -1
- package/dist/tools/memory-search.d.ts +3 -1
- package/dist/tools/memory-search.d.ts.map +1 -1
- package/dist/tools/memory-search.js +3 -1
- package/dist/tools/memory-search.js.map +1 -1
- package/dist/types.d.ts +1 -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 +2991 -1041
- package/dist/viewer/html.js.map +1 -1
- package/dist/viewer/server.d.ts +32 -8
- package/dist/viewer/server.d.ts.map +1 -1
- package/dist/viewer/server.js +1122 -261
- package/dist/viewer/server.js.map +1 -1
- package/index.ts +384 -43
- package/openclaw.plugin.json +1 -1
- package/package.json +3 -2
- package/scripts/postinstall.cjs +1 -1
- package/skill/memos-memory-guide/SKILL.md +64 -26
- package/src/capture/index.ts +37 -1
- package/src/client/connector.ts +173 -16
- package/src/client/hub.ts +18 -0
- package/src/client/skill-sync.ts +14 -0
- package/src/config.ts +9 -11
- package/src/hub/server.ts +285 -98
- package/src/hub/user-manager.ts +20 -3
- package/src/index.ts +10 -2
- package/src/ingest/providers/index.ts +41 -7
- package/src/recall/engine.ts +84 -1
- package/src/shared/llm-call.ts +97 -9
- package/src/sharing/types.ts +1 -1
- package/src/skill/evolver.ts +5 -0
- package/src/storage/ensure-binding.ts +52 -0
- package/src/storage/sqlite.ts +310 -233
- package/src/telemetry.ts +172 -41
- package/src/tools/memory-search.ts +2 -1
- package/src/types.ts +1 -2
- package/src/viewer/html.ts +2991 -1041
- package/src/viewer/server.ts +984 -190
package/.env.example
CHANGED
|
@@ -23,3 +23,10 @@ SUMMARIZER_TEMPERATURE=0
|
|
|
23
23
|
# No memory content, queries, or personal data is ever sent — only tool names, latencies, and version info.
|
|
24
24
|
# Enabled by default. Set to false to opt-out.
|
|
25
25
|
# TELEMETRY_ENABLED=false
|
|
26
|
+
#
|
|
27
|
+
# Telemetry backend credentials (for maintainers / CI only).
|
|
28
|
+
# End users do NOT need to set these — they are bundled into the npm package at publish time.
|
|
29
|
+
# If not set and telemetry.credentials.json is absent, telemetry is silently disabled.
|
|
30
|
+
# MEMOS_ARMS_ENDPOINT=https://your-arms-endpoint.log.aliyuncs.com/rum/web/v2?workspace=...&service_id=...
|
|
31
|
+
# MEMOS_ARMS_PID=your-arms-pid
|
|
32
|
+
# MEMOS_ARMS_ENV=prod
|
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**, **
|
|
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**, **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 | 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
|
-
- **Scoped retrieval** — `memory_search` and `skill_search` support `local`, `group`, and `all` search scopes
|
|
54
|
-
- **Admin approval flow** — Team members are approved
|
|
55
|
-
- **Task sharing** — `task_share` / `task_unshare` push or remove task memories from the
|
|
56
|
-
- **Skill publish/pull** — Skills can be published to
|
|
57
|
-
- **Viewer support** — The Memory Viewer now includes
|
|
51
|
+
### Team Sharing (v4)
|
|
52
|
+
- **Server-Client collaboration** — One team server stores shared tasks, memories, and skills; clients keep private data local and query the server only when needed
|
|
53
|
+
- **Scoped retrieval** — `memory_search` and `skill_search` support `local`, `group`, and `all` search scopes
|
|
54
|
+
- **Admin approval flow** — Team members are approved by the admin before they can access shared data
|
|
55
|
+
- **Task sharing** — `task_share` / `task_unshare` push or remove task memories from the team without changing local private storage
|
|
56
|
+
- **Skill publish/pull** — Skills can be published to team visibility scopes and pulled back locally as full bundles for offline reuse
|
|
57
|
+
- **Viewer support** — The Memory Viewer now includes team connection state, pending approvals, scoped search, task share controls, and team 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
|
|
@@ -259,14 +259,14 @@ memos-local: started (embedding: openai_compatible)
|
|
|
259
259
|
╚══════════════════════════════════════════╝
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
-
##
|
|
262
|
+
## Team Sharing Quick Start (v4)
|
|
263
263
|
|
|
264
264
|
If you want team sharing, do this after the basic install works:
|
|
265
265
|
|
|
266
|
-
1. **Pick a
|
|
266
|
+
1. **Pick a server machine** and set `sharing.enabled=true`, `sharing.role="hub"`, plus `sharing.hub.port`, `sharing.hub.teamName`, and `sharing.hub.teamToken`.
|
|
267
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 →
|
|
269
|
-
4. **Search with scope** `Group` or `All` in Memories and Skills to query
|
|
268
|
+
3. **Open Viewer → Settings → Team Sharing** to verify connection state, current user, role, and groups.
|
|
269
|
+
4. **Search with scope** `Group` or `All` in Memories and Skills to query team data alongside local data.
|
|
270
270
|
5. **Share tasks** from the Tasks view and **pull skills** from the Skills view.
|
|
271
271
|
|
|
272
272
|
For the full end-user workflow, see [`HUB-SHARING-GUIDE.md`](./HUB-SHARING-GUIDE.md).
|
|
@@ -373,26 +373,26 @@ Query → FTS5 + Vector dual recall → RRF Fusion → MMR Rerank
|
|
|
373
373
|
|
|
374
374
|
## Agent Tools
|
|
375
375
|
|
|
376
|
-
The plugin provides local memory tools plus v4
|
|
376
|
+
The plugin provides local memory tools plus v4 team-sharing tools, and auto-installs the **memos-memory-guide** skill:
|
|
377
377
|
|
|
378
378
|
| Tool | Purpose | When to Use |
|
|
379
379
|
|------|---------|-------------|
|
|
380
380
|
| `auto_recall` | Automatically injects relevant memories into agent context each turn (via `before_agent_start` hook) | Runs automatically — no manual call needed |
|
|
381
|
-
| `memory_search` | Search memories with `scope: local | group | all`;
|
|
381
|
+
| `memory_search` | Search memories with `scope: local | group | all`; team hits are returned separately from local hits | When auto-recall returned nothing or you need local + shared context |
|
|
382
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
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
|
|
384
|
+
| `network_memory_detail` | Fetch full content for a team memory hit | When a shared search hit looks relevant and you need full detail |
|
|
385
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
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
|
|
388
|
-
| `task_unshare` | Remove a shared task from the
|
|
387
|
+
| `task_share` | Push a local task and its memories to the team | When a task should be searchable by your group or the whole team |
|
|
388
|
+
| `task_unshare` | Remove a shared task from the team | When a task should stop being shared |
|
|
389
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 |
|
|
390
390
|
| `skill_install` | Install a skill into the agent workspace | When the skill should be permanently available for future turns |
|
|
391
|
-
| `skill_search` | Search skills with `scope: local | group | all` | When an agent needs to discover local or
|
|
392
|
-
| `skill_publish` | Publish a skill to
|
|
391
|
+
| `skill_search` | Search skills with `scope: local | group | all` | When an agent needs to discover local or team-shared skills |
|
|
392
|
+
| `skill_publish` | Publish a skill to team sharing or local public visibility, depending on scope | When a skill should be shared with teammates |
|
|
393
393
|
| `skill_unpublish` | Make a previously shared skill private again | When a skill should no longer be shared |
|
|
394
|
-
| `network_skill_pull` | Pull a
|
|
395
|
-
| `network_team_info` | Show current
|
|
394
|
+
| `network_skill_pull` | Pull a team skill bundle into local storage | When a teammate's shared skill should be usable locally/offline |
|
|
395
|
+
| `network_team_info` | Show current team server URL, user, role, and groups | When you need to inspect current team connection state |
|
|
396
396
|
| `memory_viewer` | Get the URL of the Memory Viewer web UI | When the user asks where to view or manage their memories |
|
|
397
397
|
|
|
398
398
|
### Search Parameters
|
|
@@ -420,7 +420,7 @@ Open `http://127.0.0.1:18799` in your browser after starting the gateway.
|
|
|
420
420
|
| **Analytics** | Daily write/read activity charts, memory/task/skill totals, role breakdown |
|
|
421
421
|
| **Logs** | Tool call log (memory_search, auto_recall, memory_add, etc.) with input/output, duration, and tool filter; auto-refresh |
|
|
422
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 |
|
|
423
|
-
| **Settings** | Online configuration plus **
|
|
423
|
+
| **Settings** | Online configuration plus **Team Sharing** status, current role, team/groups, and admin pending-user actions |
|
|
424
424
|
|
|
425
425
|
**Viewer won't open?**
|
|
426
426
|
|
|
@@ -521,7 +521,7 @@ TELEMETRY_ENABLED=false
|
|
|
521
521
|
|
|
522
522
|
### Technical details
|
|
523
523
|
|
|
524
|
-
- Uses
|
|
524
|
+
- Uses Aliyun ARMS RUM for event collection
|
|
525
525
|
- Each installation gets a random anonymous UUID (stored at `~/.openclaw/memos-local/.anonymous-id`)
|
|
526
526
|
- Events are batched and sent in the background; failures are silently ignored
|
|
527
527
|
- The anonymous ID is never linked to any personal information
|
package/dist/capture/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare function captureMessages(messages: Array<{
|
|
|
10
10
|
role: string;
|
|
11
11
|
content: string;
|
|
12
12
|
toolName?: string;
|
|
13
|
-
}>, sessionKey: string, turnId: string, evidenceTag: string, log: Logger, owner?: string): ConversationMessage[];
|
|
13
|
+
}>, sessionKey: string, turnId: string, evidenceTag: string, log: Logger, owner?: string, userSearchTime?: number): ConversationMessage[];
|
|
14
14
|
/**
|
|
15
15
|
* Strip OpenClaw-injected inbound metadata blocks from user messages.
|
|
16
16
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAQ,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAQ,MAAM,EAAE,MAAM,UAAU,CAAC;AAsClE;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EACrE,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,KAAK,CAAC,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GACtB,mBAAmB,EAAE,CAmDvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA+CzD"}
|
package/dist/capture/index.js
CHANGED
|
@@ -26,6 +26,7 @@ const INBOUND_META_SENTINELS = [
|
|
|
26
26
|
];
|
|
27
27
|
const SENTINEL_FAST_RE = new RegExp(INBOUND_META_SENTINELS.map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|"));
|
|
28
28
|
const ENVELOPE_PREFIX_RE = /^\s*\[(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}(?::\d{2})?\s+[A-Z]{3}[+-]\d{1,2}\]\s*/;
|
|
29
|
+
const ENVELOPE_EXTRACT_RE = /^\s*\[(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}(?::\d{2})?)\s+([A-Z]{3}[+-]\d{1,2})\]/;
|
|
29
30
|
/**
|
|
30
31
|
* Extract writable messages from a conversation turn.
|
|
31
32
|
*
|
|
@@ -33,9 +34,10 @@ const ENVELOPE_PREFIX_RE = /^\s*\[(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s+\d{4}-\d{2}-
|
|
|
33
34
|
* prefixes (Sender info, conversation context, etc.) which are not user content.
|
|
34
35
|
* Only skips: system prompts and our own memory tool results (prevents loop).
|
|
35
36
|
*/
|
|
36
|
-
function captureMessages(messages, sessionKey, turnId, evidenceTag, log, owner) {
|
|
37
|
+
function captureMessages(messages, sessionKey, turnId, evidenceTag, log, owner, userSearchTime) {
|
|
37
38
|
const now = Date.now();
|
|
38
39
|
const result = [];
|
|
40
|
+
let lastTimestamp = 0;
|
|
39
41
|
for (const msg of messages) {
|
|
40
42
|
const role = msg.role;
|
|
41
43
|
if (SKIP_ROLES.has(role))
|
|
@@ -55,14 +57,25 @@ function captureMessages(messages, sessionKey, turnId, evidenceTag, log, owner)
|
|
|
55
57
|
content = stripInboundMetadata(content);
|
|
56
58
|
}
|
|
57
59
|
else {
|
|
60
|
+
content = stripThinkingTags(content);
|
|
58
61
|
content = stripEvidenceWrappers(content, evidenceTag);
|
|
59
62
|
}
|
|
60
63
|
if (!content.trim())
|
|
61
64
|
continue;
|
|
65
|
+
let ts;
|
|
66
|
+
if (role === "user" && userSearchTime && userSearchTime > 0) {
|
|
67
|
+
ts = userSearchTime;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
ts = now;
|
|
71
|
+
}
|
|
72
|
+
if (ts <= lastTimestamp)
|
|
73
|
+
ts = lastTimestamp + 1;
|
|
74
|
+
lastTimestamp = ts;
|
|
62
75
|
result.push({
|
|
63
76
|
role,
|
|
64
77
|
content,
|
|
65
|
-
timestamp:
|
|
78
|
+
timestamp: ts,
|
|
66
79
|
turnId,
|
|
67
80
|
sessionKey,
|
|
68
81
|
toolName: role === "tool" ? msg.toolName : undefined,
|
|
@@ -123,6 +136,25 @@ function stripInboundMetadata(text) {
|
|
|
123
136
|
}
|
|
124
137
|
return stripEnvelopePrefix(result.join("\n")).trim();
|
|
125
138
|
}
|
|
139
|
+
/** Strip <think…>…</think> blocks emitted by DeepSeek-style reasoning models. */
|
|
140
|
+
const THINKING_TAG_RE = /<think[\s>][\s\S]*?<\/think>\s*/gi;
|
|
141
|
+
function stripThinkingTags(text) {
|
|
142
|
+
return text.replace(THINKING_TAG_RE, "");
|
|
143
|
+
}
|
|
144
|
+
function extractEnvelopeTimestamp(text) {
|
|
145
|
+
const m = ENVELOPE_EXTRACT_RE.exec(text);
|
|
146
|
+
if (!m)
|
|
147
|
+
return null;
|
|
148
|
+
const [, date, time, tz] = m;
|
|
149
|
+
const timeStr = time.includes(":") && time.split(":").length === 3 ? time : time + ":00";
|
|
150
|
+
const offsetMatch = tz.match(/([+-])(\d{1,2})$/);
|
|
151
|
+
const offsetStr = offsetMatch
|
|
152
|
+
? `${offsetMatch[1]}${offsetMatch[2].padStart(2, "0")}:00`
|
|
153
|
+
: "+00:00";
|
|
154
|
+
const iso = `${date}T${timeStr}${offsetStr}`;
|
|
155
|
+
const ts = new Date(iso).getTime();
|
|
156
|
+
return Number.isNaN(ts) ? null : ts;
|
|
157
|
+
}
|
|
126
158
|
function stripEnvelopePrefix(text) {
|
|
127
159
|
return text.replace(ENVELOPE_PREFIX_RE, "");
|
|
128
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capture/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Logger, MemosLocalConfig } from "../types";
|
|
2
|
-
import type {
|
|
2
|
+
import type { UserRole, UserStatus } from "../sharing/types";
|
|
3
3
|
import type { SqliteStore } from "../storage/sqlite";
|
|
4
4
|
export interface HubSessionInfo {
|
|
5
5
|
hubUrl: string;
|
|
@@ -17,10 +17,13 @@ export interface HubStatusInfo {
|
|
|
17
17
|
username: string;
|
|
18
18
|
role: UserRole;
|
|
19
19
|
status: UserStatus | string;
|
|
20
|
-
groups: GroupInfo[];
|
|
21
20
|
};
|
|
22
21
|
}
|
|
23
22
|
export declare function connectToHub(store: SqliteStore, config: MemosLocalConfig, log?: Logger): Promise<HubSessionInfo>;
|
|
24
23
|
export declare function getHubStatus(store: SqliteStore, config: MemosLocalConfig): Promise<HubStatusInfo>;
|
|
25
24
|
export declare function autoJoinHub(store: SqliteStore, config: MemosLocalConfig, log: Logger): Promise<HubSessionInfo>;
|
|
25
|
+
export declare class PendingApprovalError extends Error {
|
|
26
|
+
readonly userId: string;
|
|
27
|
+
constructor(userId: string);
|
|
28
|
+
}
|
|
26
29
|
//# sourceMappingURL=connector.d.ts.map
|
|
@@ -1 +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,
|
|
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,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC7D,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;KAC7B,CAAC;CACH;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAgEtH;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmHvG;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,cAAc,CAAC,CA2DzB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,SAAgB,MAAM,EAAE,MAAM,CAAC;gBACnB,MAAM,EAAE,MAAM;CAK3B"}
|
package/dist/client/connector.js
CHANGED
|
@@ -33,6 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PendingApprovalError = void 0;
|
|
36
37
|
exports.connectToHub = connectToHub;
|
|
37
38
|
exports.getHubStatus = getHubStatus;
|
|
38
39
|
exports.autoJoinHub = autoJoinHub;
|
|
@@ -48,6 +49,41 @@ async function connectToHub(store, config, log) {
|
|
|
48
49
|
if (!userToken && config.sharing?.client?.teamToken) {
|
|
49
50
|
if (!log)
|
|
50
51
|
throw new Error("hub client connection is not configured (no userToken, has teamToken but no logger for auto-join)");
|
|
52
|
+
// If DB has a pending connection (userId exists, no token), check registration-status first
|
|
53
|
+
const persisted = store.getClientHubConnection();
|
|
54
|
+
if (persisted?.userId && !persisted.userToken && hubAddress) {
|
|
55
|
+
const hubUrl = (0, hub_1.normalizeHubUrl)(hubAddress);
|
|
56
|
+
const teamToken = config.sharing.client.teamToken;
|
|
57
|
+
try {
|
|
58
|
+
const result = await (0, hub_1.hubRequestJson)(hubUrl, "", "/api/v1/hub/registration-status", {
|
|
59
|
+
method: "POST",
|
|
60
|
+
body: JSON.stringify({ teamToken, userId: persisted.userId }),
|
|
61
|
+
});
|
|
62
|
+
if (result.status === "active" && result.userToken) {
|
|
63
|
+
log.info(`Pending user approved! Connecting with token. userId=${persisted.userId}`);
|
|
64
|
+
store.setClientHubConnection({
|
|
65
|
+
hubUrl,
|
|
66
|
+
userId: persisted.userId,
|
|
67
|
+
username: persisted.username || "",
|
|
68
|
+
userToken: result.userToken,
|
|
69
|
+
role: "member",
|
|
70
|
+
connectedAt: Date.now(),
|
|
71
|
+
});
|
|
72
|
+
return store.getClientHubConnection();
|
|
73
|
+
}
|
|
74
|
+
if (result.status === "pending") {
|
|
75
|
+
throw new PendingApprovalError(persisted.userId);
|
|
76
|
+
}
|
|
77
|
+
if (result.status === "rejected") {
|
|
78
|
+
throw new Error("Join request was rejected by the Hub admin.");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err instanceof PendingApprovalError)
|
|
83
|
+
throw err;
|
|
84
|
+
log.warn(`registration-status check failed, falling back to autoJoinHub: ${err}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
51
87
|
return autoJoinHub(store, config, log);
|
|
52
88
|
}
|
|
53
89
|
if (!hubAddress || !userToken) {
|
|
@@ -67,32 +103,115 @@ async function connectToHub(store, config, log) {
|
|
|
67
103
|
}
|
|
68
104
|
async function getHubStatus(store, config) {
|
|
69
105
|
const conn = store.getClientHubConnection();
|
|
70
|
-
const
|
|
106
|
+
const configHubAddress = config.sharing?.client?.hubAddress || "";
|
|
107
|
+
const hubAddress = conn?.hubUrl || (configHubAddress ? (0, hub_1.normalizeHubUrl)(configHubAddress) : "");
|
|
71
108
|
const userToken = conn?.userToken || config.sharing?.client?.userToken || "";
|
|
109
|
+
// If DB has a connection to a different Hub than config, the DB data is stale
|
|
110
|
+
if (conn && configHubAddress && conn.hubUrl && (0, hub_1.normalizeHubUrl)(configHubAddress) !== conn.hubUrl) {
|
|
111
|
+
store.clearClientHubConnection();
|
|
112
|
+
return { connected: false, user: null };
|
|
113
|
+
}
|
|
114
|
+
if (conn && conn.userId && (!userToken || userToken === "")) {
|
|
115
|
+
const teamToken = config.sharing?.client?.teamToken ?? "";
|
|
116
|
+
if (hubAddress && teamToken) {
|
|
117
|
+
try {
|
|
118
|
+
const result = await (0, hub_1.hubRequestJson)((0, hub_1.normalizeHubUrl)(hubAddress), "", "/api/v1/hub/registration-status", {
|
|
119
|
+
method: "POST",
|
|
120
|
+
body: JSON.stringify({ teamToken, userId: conn.userId }),
|
|
121
|
+
});
|
|
122
|
+
if (result.status === "pending") {
|
|
123
|
+
return {
|
|
124
|
+
connected: false,
|
|
125
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
126
|
+
user: {
|
|
127
|
+
id: conn.userId,
|
|
128
|
+
username: conn.username || "",
|
|
129
|
+
role: "member",
|
|
130
|
+
status: "pending",
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (result.status === "active" && result.userToken) {
|
|
135
|
+
store.setClientHubConnection({
|
|
136
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
137
|
+
userId: conn.userId,
|
|
138
|
+
username: conn.username || "",
|
|
139
|
+
userToken: result.userToken,
|
|
140
|
+
role: "member",
|
|
141
|
+
connectedAt: Date.now(),
|
|
142
|
+
});
|
|
143
|
+
const me = await (0, hub_1.hubRequestJson)((0, hub_1.normalizeHubUrl)(hubAddress), result.userToken, "/api/v1/hub/me", { method: "GET" });
|
|
144
|
+
return {
|
|
145
|
+
connected: true,
|
|
146
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
147
|
+
user: {
|
|
148
|
+
id: String(me.id),
|
|
149
|
+
username: String(me.username ?? ""),
|
|
150
|
+
role: String(me.role ?? "member"),
|
|
151
|
+
status: String(me.status ?? "active"),
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (result.status === "rejected") {
|
|
156
|
+
return {
|
|
157
|
+
connected: false,
|
|
158
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
159
|
+
user: {
|
|
160
|
+
id: conn.userId,
|
|
161
|
+
username: conn.username || "",
|
|
162
|
+
role: "member",
|
|
163
|
+
status: "rejected",
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch { /* fall through */ }
|
|
169
|
+
}
|
|
170
|
+
return { connected: false, user: null };
|
|
171
|
+
}
|
|
72
172
|
if (!hubAddress || !userToken) {
|
|
73
173
|
return { connected: false, user: null };
|
|
74
174
|
}
|
|
75
175
|
try {
|
|
76
176
|
const me = await (0, hub_1.hubRequestJson)((0, hub_1.normalizeHubUrl)(hubAddress), userToken, "/api/v1/hub/me", { method: "GET" });
|
|
177
|
+
const latestUsername = String(me.username ?? "");
|
|
178
|
+
const latestRole = String(me.role ?? "member");
|
|
179
|
+
if (conn && (conn.username !== latestUsername || conn.role !== latestRole)) {
|
|
180
|
+
store.setClientHubConnection({
|
|
181
|
+
hubUrl: conn.hubUrl,
|
|
182
|
+
userId: conn.userId,
|
|
183
|
+
username: latestUsername,
|
|
184
|
+
userToken: conn.userToken,
|
|
185
|
+
role: latestRole,
|
|
186
|
+
connectedAt: conn.connectedAt,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
77
189
|
return {
|
|
78
190
|
connected: true,
|
|
79
191
|
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
80
192
|
user: {
|
|
81
193
|
id: String(me.id),
|
|
82
|
-
username:
|
|
83
|
-
role:
|
|
194
|
+
username: latestUsername,
|
|
195
|
+
role: latestRole,
|
|
84
196
|
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
197
|
},
|
|
93
198
|
};
|
|
94
199
|
}
|
|
95
|
-
catch {
|
|
200
|
+
catch (err) {
|
|
201
|
+
const is401 = typeof err?.message === "string" && err.message.includes("(401)");
|
|
202
|
+
if (is401 && conn) {
|
|
203
|
+
store.clearClientHubConnection();
|
|
204
|
+
return {
|
|
205
|
+
connected: false,
|
|
206
|
+
hubUrl: (0, hub_1.normalizeHubUrl)(hubAddress),
|
|
207
|
+
user: {
|
|
208
|
+
id: conn.userId,
|
|
209
|
+
username: conn.username || "",
|
|
210
|
+
role: "member",
|
|
211
|
+
status: "removed",
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
96
215
|
return { connected: false, user: null };
|
|
97
216
|
}
|
|
98
217
|
}
|
|
@@ -103,13 +222,44 @@ async function autoJoinHub(store, config, log) {
|
|
|
103
222
|
throw new Error("hubAddress and teamToken are required for auto-join");
|
|
104
223
|
}
|
|
105
224
|
const hubUrl = (0, hub_1.normalizeHubUrl)(hubAddress);
|
|
106
|
-
const
|
|
107
|
-
const
|
|
225
|
+
const osModule = typeof globalThis.process !== "undefined" ? await Promise.resolve().then(() => __importStar(require("os"))) : null;
|
|
226
|
+
const hostname = osModule ? osModule.hostname() : "unknown";
|
|
227
|
+
const nickname = config.sharing?.client?.nickname;
|
|
228
|
+
const username = nickname || (osModule ? osModule.userInfo().username : "user");
|
|
229
|
+
let clientIp = "";
|
|
230
|
+
if (osModule) {
|
|
231
|
+
const nets = osModule.networkInterfaces();
|
|
232
|
+
for (const name of Object.keys(nets)) {
|
|
233
|
+
for (const net of nets[name] ?? []) {
|
|
234
|
+
if (net.family === "IPv4" && !net.internal) {
|
|
235
|
+
clientIp = net.address;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (clientIp)
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
108
243
|
log.info(`Joining Hub at ${hubUrl} as "${username}"...`);
|
|
109
244
|
const result = await (0, hub_1.hubRequestJson)(hubUrl, "", "/api/v1/hub/join", {
|
|
110
245
|
method: "POST",
|
|
111
|
-
body: JSON.stringify({ teamToken, username, deviceName: hostname }),
|
|
246
|
+
body: JSON.stringify({ teamToken, username, deviceName: hostname, clientIp }),
|
|
112
247
|
});
|
|
248
|
+
if (result.status === "pending") {
|
|
249
|
+
log.info(`Join request submitted, awaiting admin approval. userId=${result.userId}`);
|
|
250
|
+
store.setClientHubConnection({
|
|
251
|
+
hubUrl,
|
|
252
|
+
userId: String(result.userId),
|
|
253
|
+
username,
|
|
254
|
+
userToken: "",
|
|
255
|
+
role: "member",
|
|
256
|
+
connectedAt: Date.now(),
|
|
257
|
+
});
|
|
258
|
+
throw new PendingApprovalError(result.userId);
|
|
259
|
+
}
|
|
260
|
+
if (result.status === "rejected") {
|
|
261
|
+
throw new Error(`Join request was rejected by the Hub admin.`);
|
|
262
|
+
}
|
|
113
263
|
if (!result.userToken) {
|
|
114
264
|
throw new Error(`Hub join failed: ${JSON.stringify(result)}`);
|
|
115
265
|
}
|
|
@@ -124,4 +274,13 @@ async function autoJoinHub(store, config, log) {
|
|
|
124
274
|
});
|
|
125
275
|
return store.getClientHubConnection();
|
|
126
276
|
}
|
|
277
|
+
class PendingApprovalError extends Error {
|
|
278
|
+
userId;
|
|
279
|
+
constructor(userId) {
|
|
280
|
+
super("Awaiting admin approval");
|
|
281
|
+
this.name = "PendingApprovalError";
|
|
282
|
+
this.userId = userId;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.PendingApprovalError = PendingApprovalError;
|
|
127
286
|
//# sourceMappingURL=connector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/client/connector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/client/connector.ts"],"names":[],"mappings":"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"}
|
package/dist/client/hub.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/client/hub.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/client/hub.ts"],"names":[],"mappings":"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"}
|
package/dist/client/hub.js
CHANGED
|
@@ -120,11 +120,33 @@ async function hubUpdateUsername(store, ctx, newUsername) {
|
|
|
120
120
|
}
|
|
121
121
|
return result;
|
|
122
122
|
}
|
|
123
|
+
let _cachedClientIp = null;
|
|
124
|
+
function getClientIp() {
|
|
125
|
+
if (_cachedClientIp !== null)
|
|
126
|
+
return _cachedClientIp;
|
|
127
|
+
try {
|
|
128
|
+
const os = require("os");
|
|
129
|
+
const nets = os.networkInterfaces();
|
|
130
|
+
for (const name of Object.keys(nets)) {
|
|
131
|
+
for (const net of nets[name] ?? []) {
|
|
132
|
+
if (net.family === "IPv4" && !net.internal) {
|
|
133
|
+
_cachedClientIp = net.address;
|
|
134
|
+
return _cachedClientIp;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch { /* browser or no os module */ }
|
|
140
|
+
_cachedClientIp = "";
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
123
143
|
async function hubRequestJson(hubUrl, userToken, route, init = {}) {
|
|
144
|
+
const clientIp = getClientIp();
|
|
124
145
|
const res = await fetch(`${normalizeHubUrl(hubUrl)}${route}`, {
|
|
125
146
|
...init,
|
|
126
147
|
headers: {
|
|
127
148
|
authorization: `Bearer ${userToken}`,
|
|
149
|
+
...(clientIp ? { "x-client-ip": clientIp } : {}),
|
|
128
150
|
...(init.body ? { "content-type": "application/json" } : {}),
|
|
129
151
|
...(init.headers ?? {}),
|
|
130
152
|
},
|