meta-sovereign 0.49.17 → 0.50.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.
Files changed (56) hide show
  1. package/README.hi.md +35 -27
  2. package/README.md +35 -28
  3. package/README.ru.md +35 -27
  4. package/README.zh.md +35 -27
  5. package/js/src/cli/browser-open.js +25 -0
  6. package/js/src/cli/contact-commands.js +42 -0
  7. package/js/src/cli/index.js +18 -4
  8. package/js/src/cli/trust-commands.js +76 -1
  9. package/js/src/index.d.ts +6 -0
  10. package/js/src/server/aggregate.js +12 -1
  11. package/js/src/server/confirmations.js +2 -1
  12. package/js/src/server/cors.js +33 -13
  13. package/js/src/server/email-attachments.js +8 -2
  14. package/js/src/server/hosted-ui.js +17 -10
  15. package/js/src/server/index.js +46 -13
  16. package/js/src/server/local-key-enclave.swift +98 -0
  17. package/js/src/server/local-key.js +85 -0
  18. package/js/src/server/local-tls.js +78 -16
  19. package/js/src/server/log.js +17 -13
  20. package/js/src/server/native-helper.js +100 -0
  21. package/js/src/server/passcode.js +7 -1
  22. package/js/src/server/routes-contacts-import.js +110 -0
  23. package/js/src/server/routes-derived.js +5 -2
  24. package/js/src/server/routes-passcode.js +5 -1
  25. package/js/src/sources/contacts-import.js +173 -0
  26. package/js/src/sources/system-contacts.js +66 -0
  27. package/js/src/sources/system-contacts.plist +7 -0
  28. package/js/src/sources/system-contacts.swift +74 -0
  29. package/js/src/sources/vcard.js +203 -0
  30. package/js/src/sources/vk-longpoll.js +33 -14
  31. package/js/src/sources/vk.js +10 -1
  32. package/js/src/storage/doublets-mirror.js +10 -5
  33. package/js/src/storage/durable.js +34 -1
  34. package/js/src/web/app.min.js +89 -89
  35. package/js/src/web/chat-account.js +38 -0
  36. package/js/src/web/chat-state.js +11 -2
  37. package/js/src/web/chat-view.js +2 -1
  38. package/js/src/web/chat-window.js +49 -12
  39. package/js/src/web/connection-guides.js +3 -0
  40. package/js/src/web/contacts-import.js +279 -0
  41. package/js/src/web/contacts-live.js +63 -0
  42. package/js/src/web/discover.js +32 -8
  43. package/js/src/web/dom.js +15 -0
  44. package/js/src/web/download/copy.js +4 -4
  45. package/js/src/web/locales/en-chat.js +2 -0
  46. package/js/src/web/locales/en.js +25 -2
  47. package/js/src/web/locales/hi-chat.js +2 -0
  48. package/js/src/web/locales/hi.js +27 -2
  49. package/js/src/web/locales/ru-chat.js +2 -0
  50. package/js/src/web/locales/ru.js +28 -2
  51. package/js/src/web/locales/zh-chat.js +1 -0
  52. package/js/src/web/locales/zh.js +25 -2
  53. package/js/src/web/views.js +74 -20
  54. package/js/src/web/web-mode-banner.js +3 -1
  55. package/js/src/web/web-mode.js +5 -9
  56. package/package.json +4 -2
package/README.hi.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # meta-sovereign (languages: [en](README.md) • [zh](README.zh.md) • hi • [ru](README.ru.md))
2
2
 
3
- `meta-sovereign` एक व्यक्तिगत **meta profile sovereign** सिस्टम है: ऐसा unified inbox, CRM और automation platform जिसका स्वामित्व सचमुच उपयोगकर्ता के पास रहता है। यह local-first और privacy-respecting है, और VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru तथा email providers से contacts, chats, email और patterns को एक जगह लाता है।
3
+ **आप जिन भी नेटवर्क पर बात करते हैं, उन सबके लिए एक इनबॉक्स, एक संपर्क सूची और एक ही ऑटोमेशन — आपकी अपनी मशीन पर।**
4
+
5
+ meta-sovereign **किसी व्यक्ति या संगठन को ऑनलाइन दर्शाता है**। Telegram, VK, WhatsApp, Facebook और Instagram, X, LinkedIn, ईमेल, GitHub, Upwork, PeoplePerHour और जॉब बोर्ड (career.habr.com, hh.ru, superjob.ru और अन्य) जोड़ें और हर बातचीत एक ही ऐप से करें। Local-first और open source: आपके संदेश, संपर्क और कुंजियाँ आपके अपने स्टोर में रहती हैं, एन्क्रिप्टेड बैकअप के साथ और बीच में कोई क्लाउड नहीं।
6
+
7
+ ### किसके लिए
8
+
9
+ | कौन / क्या | meta-sovereign कैसे मदद करता है |
10
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
+ | **व्यक्ति** | सभी चैट एक जगह, लंबे समय से चुप लोगों से फिर जुड़ना, जो कहा गया वह याद रखना (तथ्य), हर जॉब साइट पर एक जैसा CV। |
12
+ | **बिक्री** | हर नेटवर्क के लीड एक CRM में, नियम से ऑडियंस, mass-personal outreach जिसमें हर संदेश एक ही बार और शालीनता से जाता है, फ़ॉलो-अप, तेज़ उत्तर। |
13
+ | **मार्केटिंग** | ऑडियंस को broadcast, Telegram चैनल, LinkedIn और X पर पोस्ट, community सदस्य हमेशा ताज़ा, एक opt-out सूची जिसे हर स्वचालित भेजना मानता है। |
14
+ | **उपयोगकर्ता सहायता** | हर आने वाले संदेश के लिए एक Operator कतार, VK community या Telegram Business खाते से उत्तर, सुरक्षित ड्राफ़्ट के रूप में auto-reply, तथ्यों का ज्ञान-आधार। |
15
+ | **संगठन** | ब्रांड, दुकान या प्रोजेक्ट के लिए वही उपकरण: उसके खाते, उसके संपर्क, उसका डेटा उसकी अपनी मशीन पर। टीम मोड (कई ऑपरेटर) रोडमैप में है। |
16
+
17
+ हर परिदृश्य के लिए आज क्या चलता है, क्या आंशिक है और आगे क्या है — रोडमैप में: [`docs/ROADMAP.hi.md`](docs/ROADMAP.hi.md)।
4
18
 
5
19
  ## अभी चलाकर देखें (install नहीं)
6
20
 
@@ -41,9 +55,11 @@ node js/bin/meta-sovereign.js serve
41
55
 
42
56
  Package npm पर publish होने के बाद `npx -y meta-sovereign serve` (या `npm install -g meta-sovereign && meta-sovereign serve`) काम करेगा। तब तक toolchain के बिना server चलाने का तरीका desktop app (ऊपर) है।
43
57
 
44
- दोनों backend default रूप से <http://127.0.0.1:8787> पर listen करते हैं। JS server hosted app के origin (`https://link-foundation.github.io`) को CORS headers के साथ जवाब देता है; दूसरे origins `meta-sovereign serve --allow-origin=<origins>` या `MS_ALLOW_ORIGINS` से allow करें। Safari `https` pages को `http://127.0.0.1` तक नहीं पहुँचने देता, लेकिन `https://127.0.0.1` तक पहुँचने देता है; server अब उसी port पर HTTPS का भी जवाब देता है और इसके लिए localhost का अपना certificate बनाता है। एक बार `node js/bin/meta-sovereign.js trust` चलाएँ (macOS login keychain में जोड़ता है; दूसरे systems पर certificate का path print होता है) या Safari में `https://127.0.0.1:8787/trust` खोलें और prompts follow करें — उसके बाद hosted app Safari में सीधे server से connect हो जाता है। Trust से पहले notice server का नाम दिखाता है, उसकी copy (<http://127.0.0.1:8787>) और **सर्वर पर भरोसा करें** (<https://127.0.0.1:8787/trust>) का link देता है। `--tls=false` / `MS_TLS=off` HTTPS बंद करता है; server की अपनी copy fallback रहती है। Hosted SPA `discoverServer()` से local server खोजता है (saved override → `127.0.0.1` ports)। अगर browser auto-connect नहीं करता, app में **Settings → Server** खोलें और binary द्वारा print किया गया URL paste करें।
58
+ दोनों backend default रूप से <http://127.0.0.1:8787> पर listen करते हैं। JS server hosted app के origin (`https://link-foundation.github.io`) को CORS headers के साथ जवाब देता है; दूसरे origins `meta-sovereign serve --allow-origin=<origins>` या `MS_ALLOW_ORIGINS` से allow करें। Safari `https` pages को `http://127.0.0.1` तक नहीं पहुँचने देता, लेकिन `https://127.0.0.1` तक पहुँचने देता है; server अब उसी port पर HTTPS का भी जवाब देता है और इसके लिए localhost का अपना certificate बनाता है। एक बार `node js/bin/meta-sovereign.js trust` चलाएँ (macOS login keychain में जोड़ता है; दूसरे systems पर certificate का path print होता है) या Safari में `https://127.0.0.1:8787/trust` खोलें और prompts follow करें — उसके बाद hosted app Safari में सीधे server से connect हो जाता है। Trust से पहले notice server का नाम और **सर्वर पर भरोसा करें** (<https://127.0.0.1:8787/trust>) दिखाता है; localhost UI का link तभी मिलता है जब वह स्पष्ट रूप से enable हो। `--tls=false` / `MS_TLS=off` HTTPS बंद करता है। Safari trusted local HTTPS API से hosted app उपयोग करता है; localhost UI वैकल्पिक है। Hosted SPA `discoverServer()` से local server खोजता है (saved override → `127.0.0.1` ports)। अगर browser auto-connect नहीं करता, app में **Settings → Server** खोलें और binary द्वारा print किया गया URL paste करें।
45
59
 
46
- Default UI hosted app है: `serve` उसका पता छापता है, <https://link-foundation.github.io/meta-sovereign/>, और app हमारे port 8787 पर server को खुद ढूँढ लेता है (वह 8788, 7001, 7002 और 3000 भी देखता है; किसी दूसरे port पर `serve` बताता है कि उसे **Settings → Server** में set करें), इसलिए server को web site host नहीं करनी पड़ती। <http://127.0.0.1:8787> पर उसकी अपनी copy Safari और बिना internet काम के लिए fallback रहती है; `serve --local-ui=false` (या `MS_LOCAL_UI=off`) उसे बंद करता है, और तब `/` hosted app खोलता है। `--ui-url=<url>` (या `MS_UI_URL`) कोई दूसरी hosted copy बताता है, जैसे किसी fork का Pages, और उसके origin को अनुमति देता है।
60
+ Default UI hosted app है: `serve` उसका पता छापता है, <https://link-foundation.github.io/meta-sovereign/>, और app हमारे port 8787 पर server को खुद ढूँढ लेता है (वह 8788, 7001, 7002 और 3000 भी देखता है; किसी दूसरे port पर `serve` बताता है कि उसे **Settings → Server** में set करें), इसलिए server को web site host नहीं करनी पड़ती। Default रूप से `/` GitHub Pages पर redirect करता है और server केवल API, sync transports और connection helpers देता है। बिना internet के लिए localhost web app वैकल्पिक है: `serve --local-ui=true` (या `MS_LOCAL_UI=on`) से enable करें; फिर वह <http://127.0.0.1:8787> पर मिलता है। Desktop shell अपना bundled UI स्पष्ट रूप से enable करता है। `--ui-url=<url>` (या `MS_UI_URL`) कोई दूसरी hosted copy बताता है, जैसे किसी fork का Pages, और उसके origin को अनुमति देता है।
61
+
62
+ macOS पर interactive `serve` पूरा setup करता है: इस installation की TLS key को Secure Enclave से protect करता है, certificate trust जाँचता है, जरूरत पर ही trust माँगता है और GitHub Pages app खोलता है। Headless launch: `node js/bin/meta-sovereign.js serve --trust=true --open=true`। `--trust=false` और `--open=false` से opt out करें। Swift helper को macOS Command Line Tools चाहिए; unsupported Mac पर `--hardware-key=false` स्पष्ट रूप से file key चुनता है। Hardware protection disk की key पर लागू है; Node key को memory में उपयोग करता है। नियम और सीमाएँ: [local server setup और security](docs/LOCAL-SERVER-SECURITY.md)।
47
63
 
48
64
  ## SPA को server से जोड़ें
49
65
 
@@ -61,33 +77,25 @@ SPA server को इस क्रम में चुनता है ([`js/src
61
77
 
62
78
  ## यह क्या करता है
63
79
 
64
- - **Unified inbox**: VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru और email।
65
- - **CV synchronisation**: LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV और SuperJob — हर profile को अपने ही browser से पढ़ें, field दर field अंतर देखें और तय किए गए values वापस लिखें ([`docs/CV-SYNC.hi.md`](docs/CV-SYNC.hi.md))।
66
- - **Greetings**: VK, Telegram, WhatsApp, Messenger, X और email पर "hi" या greeting sticker से बातचीत शुरू करें, जैसे [konard/vk-bot](https://github.com/konard/vk-bot) करता है — UI में stickers चुनें, देखें किसे क्या जाएगा, और messages के बीच pause के साथ भेजें ([`docs/GREETINGS.hi.md`](docs/GREETINGS.hi.md))।
67
- - **Personal CRM**: contacts, communities, group memberships, intersections और mass-personal outreach।
68
- - **Personal memory**: conversations से structured `question → answer` facts।
69
- - **Conversation automation platform**: pattern editors, reply-variation editors और n8n-style dialog graphs।
70
- - **Portable data store**: binary [Doublets](https://github.com/linksplatform/doublets-rs) + text [Links Notation](https://github.com/link-foundation/links-notation), automated backups और `.lino` import/export।
71
- - **Local-first runtime**: user-owned devices के बीच WebRTC sync और optional self-hosted personal cloud।
72
- - **Two stacks**: JS + Rust/WebAssembly default stack और pure Rust server/microservice variant; on-disk format साझा है।
73
-
74
- पूर्ण requirement → status mapping [`docs/REQUIREMENTS.hi.md`](docs/REQUIREMENTS.hi.md) में है; per-issue case studies [`docs/case-studies/`](docs/case-studies/) में हैं।
75
-
76
- Telegram क्लाइंट की हर सुविधा — समर्थित, आंशिक, रोकी हुई या असमर्थित, और API या वेब ऐप से पहुँच — [`docs/FEATURES.hi.md`](docs/FEATURES.hi.md) में दर्ज है।
80
+ - **एकीकृत इनबॉक्स**: VK, Telegram, X, WhatsApp, Facebook, Instagram, LinkedIn, ईमेल, GitHub, Upwork, PeoplePerHour और जॉब बोर्ड; जहाँ नेटवर्क अनुमति देता है वहाँ लाइव अपडेट (Telegram, VK Long Poll, incremental IMAP, GitHub), बाकी के लिए किसी भी आकार के आर्काइव का आयात।
81
+ - **Telegram के अपने ऐप जैसी चैट**: हर संदेश एक बार भेजा जाता है, डिलीवरी टिक, लाइव अपडेट और अंतराल के बाद catch-up, पढ़ा-चिह्न, cloud ड्राफ़्ट, reload के बाद भी बचे रहने वाले retry ([`docs/CHAT-REFERENCES.hi.md`](docs/CHAT-REFERENCES.hi.md))।
82
+ - **CRM**: किसी संपर्क के बारे में सब कुछ एक दृश्य में, अलग-अलग नेटवर्क पर वही व्यक्ति, communities और सदस्यताएँ, खोज, नियम से ऑडियंस (`friends:vk & chat:vk:… - list:blocked`)।
83
+ - **संपर्क आयात**: macOS Contacts (सिंक किए गए iCloud खातों सहित) या किसी भी प्लेटफ़ॉर्म के vCard निर्यात का पूर्वावलोकन करके आयात करें। दोबारा आयात करने पर रिकॉर्ड की पहचान बनी रहती है। निर्देशिका सिंक के दौरान अपडेट होती है और बिना संदेश वाले लोग भी दिखाती है। [संपर्क आयात](docs/CONTACTS-IMPORT.md) देखें।
84
+ - **Outreach, broadcast और ऑटोमेशन**: किसे, कब, किन शर्तों पर और किस पाठ से लिखना है; कौन क्या पाएगा इसका preview; डिफ़ॉल्ट रूप से सुरक्षित ड्राफ़्ट, या quiet hours, हर चैट का cooldown, दैनिक सीमा और opt-out सूची के साथ धीमी गति से स्वचालित भेजना। हर स्वचालित भेजना एक ही outbox से जाता है: अधिक से अधिक एक बार, और अस्पष्ट परिणाम अपने आप दोहराया नहीं जाता ([`docs/USER-GUIDE.hi.md`](docs/USER-GUIDE.hi.md), §11)।
85
+ - **Operator कतार और उत्तर**: अपठित संदेश चैट-दर-चैट, आपके पिछले उत्तरों से सुझाव (Tab एक चुनता है), पैटर्न और उत्तर के रूप, मिलते संदेश पर auto-reply।
86
+ - **व्यवसाय और community खाते**: VK community token Bots Long Poll चलाता है; Telegram Business के quick replies, स्वागत और अनुपस्थिति संदेश, कार्य-समय और chatbots।
87
+ - **स्मृति**: बातचीत से निकाले गए `प्रश्न → उत्तर` तथ्य, चैट में जाँच के साथ।
88
+ - **अभिवादन**: VK, Telegram, WhatsApp, Messenger, X और ईमेल पर "hi" या स्टिकर से बातचीत शुरू करें, [konard/vk-bot](https://github.com/konard/vk-bot) की तरह ([`docs/GREETINGS.hi.md`](docs/GREETINGS.hi.md))।
89
+ - **CV सिंक**: LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV और SuperJob पर आपके अपने ब्राउज़र से, फ़ील्ड-दर-फ़ील्ड ([`docs/CV-SYNC.hi.md`](docs/CV-SYNC.hi.md))।
90
+ - **आपका डेटा सुरक्षित**: crash-safe लोकल स्टोर ([Doublets](https://github.com/linksplatform/doublets-rs) + [Links Notation](https://github.com/link-foundation/links-notation)), स्वचालित schema migrations ([`docs/DATA-MIGRATIONS.hi.md`](docs/DATA-MIGRATIONS.hi.md)), streamed एन्क्रिप्टेड बैकअप, भरी डिस्क का प्रबंधन, एन्क्रिप्टेड secrets, एक लोकल सर्वर जो दूसरी साइटों को मना करता है।
91
+ - **हर जगह**: वेब ऐप, सर्वर सहित डेस्कटॉप ऐप, मोबाइल shells, आपके उपकरणों के बीच WebRTC सिंक, ऑफ़लाइन लिखे को बाद में भेजना; pure-Rust सर्वर वही on-disk format उपयोग करता है।
92
+ - **चार भाषाएँ**: ऐप और हर दस्तावेज़ अंग्रेज़ी, रूसी, हिंदी और चीनी में।
93
+
94
+ हर नेटवर्क की हर सुविधा — समर्थित, आंशिक या असमर्थित, और API या वेब ऐप से पहुँच: [`docs/FEATURES.hi.md`](docs/FEATURES.hi.md)। हर आवश्यकता और उसका प्रमाण: [`docs/REQUIREMENTS.hi.md`](docs/REQUIREMENTS.hi.md)।
77
95
 
78
96
  ## स्थिति
79
97
 
80
- issue #1 का prototype implement हो चुका है और PR #2 में track है:
81
-
82
- - **Data layer (R-A\*)**: `DualStore` Doublets binary और Links Notation text को lock-step में रखता है; AES-256-GCM backups और `secret:*` link encryption (केवल `MS_SECRET_PASSPHRASE` सेट होने पर; बाक़ी store encrypted नहीं) उपलब्ध हैं।
83
- - **Service connectors (R-E\*)**: VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru और email के archive parsers तथा live connectors।
84
- - **Pattern matching और automation (R-C\*)**: `inferRegex`, `simplifyRegex`, `compilePeg`, fuzzy reply variation extraction और `createGraph` / `runGraph`।
85
- - **CRM (R-D\*)**: contact aggregation, audience DSL, mass-personal outreach, profile और resume sync envelopes।
86
- - **CV synchronisation (R-V\*)**: सात job platforms के declarative browser plans, cross-platform diff, चुनिंदा writes और हर run के लिए HTML/screenshot artifacts वाली redacted telemetry stream।
87
- - **Distribution (R-F\*)**: NPM library, CLI, local server, Electron shell, Capacitor mobile shell और Docker web + WebRTC microservices।
88
- - **Stacks (R-G\*)**: JS server + React SPA + Rust/WASM heavy workloads, साथ में pure Rust server।
89
- - **Hardening (R-K\*)**: soft delete by default, AES-256-GCM master-key vault, multiple unlock methods और encrypted export।
90
- - **Browser publishing (R-L\*)**: GitHub Pages CI workflow, public SPA URL और user-first README/user guide।
98
+ आवश्यकताएँ R-A से R-Z24 पूरी हैं और CI में Linux, macOS और Windows पर Node, Bun और Deno के साथ जाँची जाती हैं, Chromium में browser end-to-end tests के साथ। Tests नकली सर्वर उपयोग करते हैं: किसी असली खाते से कुछ नहीं भेजा जाता, और केवल Telegram के संदेश-प्रदर्शन को असली स्टोर पर भी जाँचा गया। परिदृश्य-वार स्थिति और अगले कदम (लाइव खातों पर जाँच, OAuth साइन-इन, टीम मोड, बिक्री pipeline, अभियान परिणाम): [`docs/ROADMAP.hi.md`](docs/ROADMAP.hi.md)।
91
99
 
92
100
  ## Repository structure
93
101
 
package/README.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # meta-sovereign (languages: en • [zh](README.zh.md) • [hi](README.hi.md) • [ru](README.ru.md))
2
2
 
3
- A personal **meta profile sovereign** system — a unified inbox + CRM + automation platform that the user actually owns. Local-first, privacy-respecting, with all your contacts, chats, email, and patterns from VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru, email, GitHub, Upwork, and PeoplePerHour providers.
3
+ **One inbox, one contact book and one set of automations for every network you speak through — running on your own machine.**
4
+
5
+ meta-sovereign represents **a person or an organisation online**. Connect Telegram, VK, WhatsApp, Facebook and Instagram, X, LinkedIn, email, GitHub, Upwork, PeoplePerHour and job boards (career.habr.com, hh.ru, superjob.ru and more), and work every conversation from one app. Local-first and open source: your messages, contacts and keys stay in a store you own, with encrypted backups and no cloud in between.
6
+
7
+ ### Built for
8
+
9
+ | Who / what | How meta-sovereign helps |
10
+ | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
+ | **Individuals** | All your chats in one place, reconnect with people gone quiet, remember what was said (facts), one CV on every job site. |
12
+ | **Sales** | Leads from every network in one CRM, audiences by rule, mass-personal outreach that sends each message once and politely, follow-ups, fast replies. |
13
+ | **Marketing** | Broadcasts to audiences, posts to Telegram channels, LinkedIn and X, community members kept fresh, an opt-out list every automated send honours. |
14
+ | **User support** | One Operator queue for every incoming message, answers from a VK community or Telegram Business account, auto-replies as safe drafts, a knowledge base of facts. |
15
+ | **Organisations** | The same tools for a brand, a shop or a project: its accounts, its contacts, its data on its own machine. Team mode (several operators) is on the roadmap. |
16
+
17
+ What works for each scenario today, what is partial and what comes next is in the roadmap: [`docs/ROADMAP.md`](docs/ROADMAP.md).
4
18
 
5
19
  ## Try it now (no install)
6
20
 
@@ -41,9 +55,11 @@ node js/bin/meta-sovereign.js serve
41
55
 
42
56
  Once the package is published to npm, `npx -y meta-sovereign serve` (or `npm install -g meta-sovereign && meta-sovereign serve`) will work. Until then, the desktop app (above) is the way to run the server without a toolchain.
43
57
 
44
- Either backend listens on <http://127.0.0.1:8787> by default. The JS server answers the hosted app's origin (`https://link-foundation.github.io`) with CORS headers; allow other origins with `meta-sovereign serve --allow-origin=<origins>` or `MS_ALLOW_ORIGINS`. Safari does not let `https` pages reach `http://127.0.0.1`, but it allows `https://127.0.0.1`; the server also answers HTTPS on the same port with its own certificate for localhost — run `node js/bin/meta-sovereign.js trust` once (macOS adds it to the login keychain; other systems print the certificate path), or open `https://127.0.0.1:8787/trust` in Safari and follow the prompts, and the hosted app connects directly. Before trusting, the notice names the server, links its own copy (<http://127.0.0.1:8787>) and a **Trust the server** link (<https://127.0.0.1:8787/trust>). `--tls=false` / `MS_TLS=off` turns HTTPS off; the server's own copy remains the fallback. The hosted SPA discovers the local server automatically through `discoverServer()` (saved override → `127.0.0.1` ports). If your browser does not auto-connect, open the in-app **Settings → Server** prompt and paste the URL the binary printed.
58
+ Either backend listens on <http://127.0.0.1:8787> by default. The JS server answers the hosted app's origin (`https://link-foundation.github.io`) with CORS headers; allow other origins with `meta-sovereign serve --allow-origin=<origins>` or `MS_ALLOW_ORIGINS`. Safari does not let `https` pages reach `http://127.0.0.1`, but it allows `https://127.0.0.1`; the server also answers HTTPS on the same port with its own certificate for localhost — run `node js/bin/meta-sovereign.js trust` once (macOS adds it to the login keychain; other systems print the certificate path), or open `https://127.0.0.1:8787/trust` in Safari and follow the prompts, and the hosted app connects directly. Before trusting, the notice names the server and offers **Trust the server** (<https://127.0.0.1:8787/trust>); it links a localhost UI only if that UI was explicitly enabled. `--tls=false` / `MS_TLS=off` turns HTTPS off. Safari uses the hosted app through the trusted local HTTPS API; the localhost UI is optional. The hosted SPA discovers the local server automatically through `discoverServer()` (saved override → `127.0.0.1` ports). If your browser does not auto-connect, open the in-app **Settings → Server** prompt and paste the URL the binary printed.
45
59
 
46
- The hosted app is the default UI: `serve` prints its address, <https://link-foundation.github.io/meta-sovereign/>, and the app finds the server on our port 8787 by itself (it also looks at 8788, 7001, 7002 and 3000; on another port `serve` says to set it in **Settings → Server**), so the server does not have to host a web site. Its own copy at <http://127.0.0.1:8787> stays as a fallback for Safari and for working offline; `serve --local-ui=false` (or `MS_LOCAL_UI=off`) turns it off, and `/` then opens the hosted app. `--ui-url=<url>` (or `MS_UI_URL`) names another hosted copy, such as a fork's Pages, and allows its origin.
60
+ The hosted app is the default UI: `serve` prints its address, <https://link-foundation.github.io/meta-sovereign/>, and the app finds the server on our port 8787 by itself (it also looks at 8788, 7001, 7002 and 3000; on another port `serve` says to set it in **Settings → Server**), so the server does not have to host a web site. By default `/` redirects to GitHub Pages and the server serves only its API, sync transports and connection helpers. To opt into a localhost web app for offline use, run `serve --local-ui=true` (or set `MS_LOCAL_UI=on`); that copy is then available at <http://127.0.0.1:8787>. Desktop shells explicitly enable their bundled UI. `--ui-url=<url>` (or `MS_UI_URL`) names another hosted copy, such as a fork's Pages, and allows its origin.
61
+
62
+ On macOS, interactive `serve` now handles the full setup: it protects this installation’s TLS key with Secure Enclave, detects existing certificate trust, requests trust only when needed, and opens the GitHub Pages app. For a headless launch use `node js/bin/meta-sovereign.js serve --trust=true --open=true`. `--trust=false` and `--open=false` opt out. The Swift helper needs the macOS Command Line Tools; `--hardware-key=false` explicitly opts into a file key on unsupported Macs. Hardware protection applies to the key on disk; Node uses it in memory. See [local server setup and security](docs/LOCAL-SERVER-SECURITY.md) for the exact access rules and limits.
47
63
 
48
64
  ## Connect the SPA to your server
49
65
 
@@ -61,34 +77,25 @@ The full user-facing flow — install nothing, install Rust server, install JS s
61
77
 
62
78
  ## What it does
63
79
 
64
- - **Unified inbox** spanning VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru, email, GitHub, Upwork, and PeoplePerHour.
65
- - **CV synchronisation** across LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV and SuperJob: read every profile through your own browser, see the differences field by field, and push the agreed values back ([`docs/CV-SYNC.md`](docs/CV-SYNC.md)).
66
- - **Greetings**: open dialogs on VK, Telegram, WhatsApp, Messenger, X and email with a "hi" or a greeting sticker, the way [konard/vk-bot](https://github.com/konard/vk-bot) does — pick stickers in the UI, preview who gets what, send with a pause between messages ([`docs/GREETINGS.md`](docs/GREETINGS.md)).
67
- - **Chat** with the connected Telegram account that behaves like Telegram's own apps: each message sent once, delivery ticks, live updates and catch-up after a gap, read marking, cloud drafts, retries that survive a reload. How the open-source Telegram, Signal and Element clients do it, pinned to the commits we read, is in [`docs/CHAT-REFERENCES.md`](docs/CHAT-REFERENCES.md).
68
- - **Personal CRM**: contacts, communities, group memberships, intersections, mass-personal outreach.
69
- - **Personal memory**: structured `question → answer` facts captured automatically from conversations.
70
- - **Conversation automation platform**: pattern editors, reply-variation editors, n8n-style dialog graphs.
71
- - **Portable data store**: dual binary ([Doublets](https://github.com/linksplatform/doublets-rs)) + text ([Links Notation](https://github.com/link-foundation/links-notation)) representation, automated backups, `.lino` import/export.
72
- - **Local-first runtime**: WebRTC sync between user-owned devices, optional self-hosted personal cloud.
73
- - **Two stacks**: JS + Rust/WebAssembly (default) and pure Rust (server/microservice variant). The on-disk format is shared.
74
-
75
- The full requirement → status mapping lives in [`docs/REQUIREMENTS.md`](docs/REQUIREMENTS.md); the per-issue case studies live in [`docs/case-studies/`](docs/case-studies/).
76
-
77
- Every Telegram client feature, with what is supported, partial, parked or not supported, and whether it is reachable by API or web app, is tracked in [`docs/FEATURES.md`](docs/FEATURES.md).
80
+ - **Unified inbox** across VK, Telegram, X, WhatsApp, Facebook, Instagram, LinkedIn, email, GitHub, Upwork, PeoplePerHour and job boards, with live updates where the network allows (Telegram, the VK Long Poll, incremental IMAP, GitHub) and full-size archive imports for the rest.
81
+ - **Chat that behaves like Telegram's own apps**: each message sent once, delivery ticks, live updates and catch-up after a gap, read marking, cloud drafts, retries that survive a reload. How the open-source Telegram, Signal and Element clients do it, pinned to the commits we read, is in [`docs/CHAT-REFERENCES.md`](docs/CHAT-REFERENCES.md).
82
+ - **CRM**: everything known about a contact in one view, the same person across networks, communities and memberships, search, audiences by rule (`friends:vk & chat:vk:… - list:blocked`).
83
+ - **Contact imports**: preview and import macOS Contacts (including synced iCloud accounts) or vCard exports from any platform; repeated imports keep stable identities. The directory updates during sync and includes people without messages. See [contact imports](docs/CONTACTS-IMPORT.md).
84
+ - **Outreach, broadcasts and automations**: who to message, when, on what conditions and with which text; a preview of who gets what; safe drafts by default or paced auto-send with quiet hours, a per-chat cooldown, daily caps and an opt-out list. Every automated send goes through one outbox, so it happens at most once and an unclear result is never retried by itself ([`docs/USER-GUIDE.md` §11](docs/USER-GUIDE.md#11-automations-message-people-by-rule-safely)).
85
+ - **Operator queue and replies**: walk unread messages chat by chat, reply suggestions from your own past answers (Tab takes one), patterns and reply variations, auto-replies on a matching message.
86
+ - **Business and community accounts**: a VK community token runs the Bots Long Poll; Telegram Business quick replies, greeting and away messages, hours and chatbots.
87
+ - **Memory**: structured `question → answer` facts captured from conversations, checked in the chat.
88
+ - **Greetings**: open dialogs on VK, Telegram, WhatsApp, Messenger, X and email with a "hi" or a greeting sticker, the way [konard/vk-bot](https://github.com/konard/vk-bot) does ([`docs/GREETINGS.md`](docs/GREETINGS.md)).
89
+ - **CV synchronisation** across LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV and SuperJob through your own browser, field by field ([`docs/CV-SYNC.md`](docs/CV-SYNC.md)).
90
+ - **Your data, safe**: a crash-safe local store ([Doublets](https://github.com/linksplatform/doublets-rs) binary + [Links Notation](https://github.com/link-foundation/links-notation) text), automatic schema migrations ([`docs/DATA-MIGRATIONS.md`](docs/DATA-MIGRATIONS.md)), streamed encrypted backups, full-disk handling, encrypted secrets, a local server that refuses other sites.
91
+ - **Everywhere you are**: the hosted web app, a desktop app with the server inside, mobile shells, WebRTC sync between your own devices, offline writes replayed later; a pure-Rust server variant shares the on-disk format.
92
+ - **Four languages**: the app and every document are in English, Russian, Hindi and Chinese.
93
+
94
+ Every feature, network by network, with what is supported, partial or not supported and whether it is reachable by API or web app: [`docs/FEATURES.md`](docs/FEATURES.md). Every requirement with its evidence: [`docs/REQUIREMENTS.md`](docs/REQUIREMENTS.md).
78
95
 
79
96
  ## Status
80
97
 
81
- The prototype targeted by issue #1 is implemented and tracked in PR #2:
82
-
83
- - **Data layer (R-A\*)**: `DualStore` keeps Doublets binary + Links Notation text in lock-step, with AES-256-GCM encrypted backups (`createBackupScheduler`) and `secret:*` link encryption (only when `MS_SECRET_PASSPHRASE` is set; the rest of the store is not encrypted).
84
- - **Service connectors (R-E\*)**: archive parser + live API connector for VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru, email, GitHub, Upwork, and PeoplePerHour.
85
- - **Pattern matching and automation (R-C\*)**: `inferRegex` / `simplifyRegex` / `compilePeg`, fuzzy reply-variation extraction, and an n8n-style automation graph (`createGraph` + `runGraph`).
86
- - **CRM (R-D\*)**: contact aggregation, audience DSL, mass-personal outreach, profile and resume sync envelopes.
87
- - **CV synchronisation (R-V\*)**: declarative browser plans for seven job platforms, cross-platform diff, selective writes, and a redacted telemetry stream with HTML/screenshot artifacts for every run.
88
- - **Distribution (R-F\*)**: NPM library, CLI (`js/bin/meta-sovereign.js`), local server (`meta-sovereign serve`), Electron shell, Capacitor mobile shell, Docker microservices for web + WebRTC.
89
- - **Stacks (R-G\*)**: default JS server + React SPA + Rust/WASM heavy workloads; alternative pure-Rust server (`meta-sovereign-rs serve`).
90
- - **Hardening (R-K\*)**: soft-delete by default, AES-256-GCM master-key vault with multi-method unlock, encrypted export.
91
- - **Browser publishing (R-L\*)**: GitHub Pages CI workflow, SPA on a public URL, user-first README and user guide.
98
+ Requirements R-A to R-Z24 are done and checked in CI on Node, Bun and Deno across Linux, macOS and Windows, with browser end-to-end tests in Chromium. Tests use fakes: nothing is sent from a real account in tests, and only Telegram's message display was also checked against a real store. The scenario-by-scenario state and the next steps (live verification, guided sign-in, team mode, a sales pipeline, campaign results) are in [`docs/ROADMAP.md`](docs/ROADMAP.md).
92
99
 
93
100
  ## Repository structure
94
101
 
package/README.ru.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # meta-sovereign (languages: [en](README.md) • [zh](README.zh.md) • [hi](README.hi.md) • ru)
2
2
 
3
- `meta-sovereign` — персональная система **meta profile sovereign**: единый inbox, CRM и платформа автоматизации, которыми реально владеет пользователь. Система local-first, уважает приватность и собирает контакты, чаты, почту и паттерны из VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru и email-провайдеров.
3
+ **Один inbox, одна книга контактов и одни автоматизации для всех сетей, через которые вы общаетесь, — на вашем собственном компьютере.**
4
+
5
+ meta-sovereign представляет **человека или организацию в интернете**. Подключите Telegram, VK, WhatsApp, Facebook и Instagram, X, LinkedIn, почту, GitHub, Upwork, PeoplePerHour и сайты вакансий (career.habr.com, hh.ru, superjob.ru и другие) и ведите все разговоры в одном приложении. Local-first и open source: сообщения, контакты и ключи остаются в вашем хранилище, с зашифрованными резервными копиями и без облака посередине.
6
+
7
+ ### Для кого
8
+
9
+ | Кто / что | Чем помогает meta-sovereign |
10
+ | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
11
+ | **Люди** | Все чаты в одном месте, возобновить общение с теми, кто давно молчит, помнить, что было сказано (факты), одно резюме на всех сайтах вакансий. |
12
+ | **Продажи** | Лиды из всех сетей в одной CRM, аудитории по правилам, массово-персональные рассылки, где каждое сообщение уходит один раз и вежливо, follow-up, быстрые ответы. |
13
+ | **Маркетинг** | Рассылки по аудиториям, посты в каналы Telegram, LinkedIn и X, актуальные участники сообществ, список отписавшихся, который соблюдает каждая автоматическая отправка. |
14
+ | **Поддержка** | Одна очередь оператора для всех входящих, ответы от имени сообщества VK или аккаунта Telegram Business, автоответы как безопасные черновики, база знаний из фактов. |
15
+ | **Организации** | Те же инструменты для бренда, магазина или проекта: его аккаунты, его контакты, его данные на его компьютере. Командный режим (несколько операторов) — в дорожной карте. |
16
+
17
+ Что уже работает для каждого сценария, что частично и что дальше — в дорожной карте: [`docs/ROADMAP.ru.md`](docs/ROADMAP.ru.md).
4
18
 
5
19
  ## Попробовать сразу (без установки)
6
20
 
@@ -41,9 +55,11 @@ node js/bin/meta-sovereign.js serve
41
55
 
42
56
  Когда пакет будет опубликован в npm, заработают `npx -y meta-sovereign serve` (или `npm install -g meta-sovereign && meta-sovereign serve`). До тех пор запустить server без toolchain можно через desktop app (выше).
43
57
 
44
- Оба backend по умолчанию слушают <http://127.0.0.1:8787>. JS server отвечает origin hosted app (`https://link-foundation.github.io`) с CORS headers; другие origins разрешаются через `meta-sovereign serve --allow-origin=<origins>` или `MS_ALLOW_ORIGINS`. Safari не пускает `https` страницы на `http://127.0.0.1`, но пускает на `https://127.0.0.1`; сервер теперь отвечает по HTTPS на том же порту с собственным сертификатом для localhost. Выполните `node js/bin/meta-sovereign.js trust` один раз (macOS добавляет сертификат в login keychain; на других системах печатается путь к сертификату) или откройте `https://127.0.0.1:8787/trust` в Safari и следуйте подсказкам — после этого hosted app в Safari подключается к серверу напрямую. До того уведомление называет сервер, даёт ссылку на его копию (<http://127.0.0.1:8787>) и **Доверять серверу** (<https://127.0.0.1:8787/trust>). `--tls=false` / `MS_TLS=off` отключает HTTPS; копия приложения с сервера остаётся запасным вариантом. Hosted SPA автоматически находит локальный сервер через `discoverServer()` (сохраненный override → порты `127.0.0.1`). Если браузер не подключился сам, откройте **Settings → Server** в приложении и вставьте URL, который напечатал сервер.
58
+ Оба backend по умолчанию слушают <http://127.0.0.1:8787>. JS server отвечает origin hosted app (`https://link-foundation.github.io`) с CORS headers; другие origins разрешаются через `meta-sovereign serve --allow-origin=<origins>` или `MS_ALLOW_ORIGINS`. Safari не пускает `https` страницы на `http://127.0.0.1`, но пускает на `https://127.0.0.1`; сервер теперь отвечает по HTTPS на том же порту с собственным сертификатом для localhost. Выполните `node js/bin/meta-sovereign.js trust` один раз (macOS добавляет сертификат в login keychain; на других системах печатается путь к сертификату) или откройте `https://127.0.0.1:8787/trust` в Safari и следуйте подсказкам — после этого hosted app в Safari подключается к серверу напрямую. До того уведомление называет сервер и предлагает **Доверять серверу** (<https://127.0.0.1:8787/trust>); ссылка на localhost-копию появляется только при её явном включении. `--tls=false` / `MS_TLS=off` отключает HTTPS. Safari использует размещённое приложение через доверенный локальный HTTPS API; localhost-интерфейс необязателен. Hosted SPA автоматически находит локальный сервер через `discoverServer()` (сохраненный override → порты `127.0.0.1`). Если браузер не подключился сам, откройте **Settings → Server** в приложении и вставьте URL, который напечатал сервер.
45
59
 
46
- По умолчанию интерфейс — размещённое приложение: `serve` печатает его адрес, <https://link-foundation.github.io/meta-sovereign/>, а приложение само находит сервер на нашем порту 8787 (а также смотрит 8788, 7001, 7002 и 3000; на другом порту `serve` подскажет указать его в **Settings → Server**), так что серверу не нужно держать сайт. Своя копия на <http://127.0.0.1:8787> остаётся запасной — для Safari и работы без интернета; `serve --local-ui=false` (или `MS_LOCAL_UI=off`) её выключает, и тогда `/` открывает размещённое приложение. `--ui-url=<url>` (или `MS_UI_URL`) задаёт другую размещённую копию, например Pages форка, и разрешает её origin.
60
+ По умолчанию интерфейс — размещённое приложение: `serve` печатает его адрес, <https://link-foundation.github.io/meta-sovereign/>, а приложение само находит сервер на нашем порту 8787 (а также смотрит 8788, 7001, 7002 и 3000; на другом порту `serve` подскажет указать его в **Settings → Server**), так что серверу не нужно держать сайт. По умолчанию `/` перенаправляет на GitHub Pages, а сервер предоставляет API, синхронизацию и вспомогательные маршруты подключения. Копия на localhost для работы без интернета включается отдельно: `serve --local-ui=true` (или `MS_LOCAL_UI=on`), после чего она доступна на <http://127.0.0.1:8787>. Desktop-оболочка явно включает свой встроенный интерфейс. `--ui-url=<url>` (или `MS_UI_URL`) задаёт другую размещённую копию, например Pages форка, и разрешает её origin.
61
+
62
+ В macOS интерактивный `serve` выполняет настройку целиком: защищает TLS-ключ этой установки через Secure Enclave, проверяет доверие сертификату, запрашивает его только при необходимости и открывает приложение на GitHub Pages. Без интерактивного терминала: `node js/bin/meta-sovereign.js serve --trust=true --open=true`. `--trust=false` и `--open=false` отключают эти действия. Для Swift-помощника нужны macOS Command Line Tools; `--hardware-key=false` явно выбирает файловый ключ на неподдерживаемом Mac. Аппаратная защита действует на диске; Node использует ключ в памяти. Правила и ограничения: [настройка и безопасность локального сервера](docs/LOCAL-SERVER-SECURITY.md).
47
63
 
48
64
  ## Подключение SPA к серверу
49
65
 
@@ -61,33 +77,25 @@ SPA выбирает сервер в таком порядке ([`js/src/web/dis
61
77
 
62
78
  ## Что умеет система
63
79
 
64
- - **Единый inbox** для VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru и email.
65
- - **Синхронизация CV** между LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV и SuperJob: прочитать каждый профиль через собственный браузер, увидеть различия по полям и записать согласованные значения обратно ([`docs/CV-SYNC.ru.md`](docs/CV-SYNC.ru.md)).
66
- - **Приветствия**: начинать диалоги в VK, Telegram, WhatsApp, Messenger, X и email с «привет» или стикера-приветствия, как это делает [konard/vk-bot](https://github.com/konard/vk-bot), — выбрать стикеры в интерфейсе, посмотреть, кому что уйдёт, и отправить с паузой между сообщениями ([`docs/GREETINGS.ru.md`](docs/GREETINGS.ru.md)).
67
- - **Personal CRM**: контакты, сообщества, членства в группах, пересечения, массовый персонализированный outreach.
68
- - **Personal memory**: структурированные факты `question → answer`, автоматически извлеченные из разговоров.
69
- - **Платформа conversation automation**: редакторы паттернов, варианты ответов, n8n-style dialog graphs.
70
- - **Переносимое хранилище**: бинарное [Doublets](https://github.com/linksplatform/doublets-rs) + текстовое [Links Notation](https://github.com/link-foundation/links-notation), автоматические backup, `.lino` import/export.
71
- - **Local-first runtime**: WebRTC sync между устройствами пользователя, optional self-hosted personal cloud.
72
- - **Два стека**: JS + Rust/WebAssembly по умолчанию и pure Rust server/microservice variant. On-disk format общий.
73
-
74
- Полная карта requirement → status находится в [`docs/REQUIREMENTS.ru.md`](docs/REQUIREMENTS.ru.md); per-issue case studies — в [`docs/case-studies/`](docs/case-studies/).
75
-
76
- Каждая функция клиента Telegram — поддерживается, частично, в парковке или нет, и доступна ли через API или веб-приложение — учтена в [`docs/FEATURES.ru.md`](docs/FEATURES.ru.md).
80
+ - **Единый inbox** для VK, Telegram, X, WhatsApp, Facebook, Instagram, LinkedIn, почты, GitHub, Upwork, PeoplePerHour и сайтов вакансий: живые обновления там, где сеть это позволяет (Telegram, VK Long Poll, инкрементальный IMAP, GitHub), и импорт архивов любого размера для остальных.
81
+ - **Чат, который ведёт себя как приложения Telegram**: каждое сообщение отправляется один раз, галочки доставки, живые обновления и догрузка после разрыва, отметки о прочтении, облачные черновики, повторы, переживающие перезагрузку ([`docs/CHAT-REFERENCES.ru.md`](docs/CHAT-REFERENCES.ru.md)).
82
+ - **CRM**: всё о контакте в одном окне, один и тот же человек в разных сетях, сообщества и членства, поиск, аудитории по правилам (`friends:vk & chat:vk:… - list:blocked`).
83
+ - **Импорт контактов**: предпросмотр и импорт из Контактов macOS (включая синхронизированные учётные записи iCloud) или файлов vCard на любой платформе; повторный импорт сохраняет идентичность записей. Список обновляется при синхронизации и включает людей без сообщений. См. [импорт контактов](docs/CONTACTS-IMPORT.md).
84
+ - **Рассылки, broadcast и автоматизации**: кому писать, когда, при каких условиях и каким текстом; предпросмотр, кто что получит; по умолчанию безопасные черновики или отправка с паузами, тихими часами, перерывом для каждого чата, дневными лимитами и списком отписавшихся. Каждая автоматическая отправка идёт через один outbox: не больше одного раза, а неясный результат сам не повторяется ([`docs/USER-GUIDE.ru.md`](docs/USER-GUIDE.ru.md), §11).
85
+ - **Очередь оператора и ответы**: непрочитанные сообщения чат за чатом, подсказки ответов из ваших прошлых ответов (Tab берёт подсказку), паттерны и варианты ответов, автоответы на подходящее сообщение.
86
+ - **Аккаунты бизнеса и сообществ**: токен сообщества VK запускает Bots Long Poll; Telegram Business: быстрые ответы, приветствие и сообщение об отсутствии, часы работы, чат-боты.
87
+ - **Память**: структурированные факты `вопрос → ответ` из разговоров, с проверкой прямо в чате.
88
+ - **Приветствия**: начинать диалоги в VK, Telegram, WhatsApp, Messenger, X и почте с «привет» или стикера, как [konard/vk-bot](https://github.com/konard/vk-bot) ([`docs/GREETINGS.ru.md`](docs/GREETINGS.ru.md)).
89
+ - **Синхронизация резюме** между LinkedIn, hh.ru, Habr Career, Naukri, VietnamWorks, TopCV и SuperJob через ваш собственный браузер, поле за полем ([`docs/CV-SYNC.ru.md`](docs/CV-SYNC.ru.md)).
90
+ - **Ваши данные в безопасности**: локальное хранилище, переживающее сбои ([Doublets](https://github.com/linksplatform/doublets-rs) + [Links Notation](https://github.com/link-foundation/links-notation)), автоматические миграции схемы ([`docs/DATA-MIGRATIONS.ru.md`](docs/DATA-MIGRATIONS.ru.md)), потоковые зашифрованные резервные копии, работа при полном диске, зашифрованные секреты, локальный сервер, который не пускает чужие сайты.
91
+ - **Везде, где вы**: веб-приложение, настольное приложение со встроенным сервером, мобильные оболочки, WebRTC-синхронизация между вашими устройствами, офлайн-записи, которые доотправляются позже; вариант сервера на чистом Rust использует тот же формат на диске.
92
+ - **Четыре языка**: приложение и все документы — на английском, русском, хинди и китайском.
93
+
94
+ Каждая функция по каждой сети — поддерживается, частично или нет, и доступна ли через API или веб-приложение: [`docs/FEATURES.ru.md`](docs/FEATURES.ru.md). Каждое требование с подтверждением: [`docs/REQUIREMENTS.ru.md`](docs/REQUIREMENTS.ru.md).
77
95
 
78
96
  ## Статус
79
97
 
80
- Прототип для issue #1 реализован и отслежен в PR #2:
81
-
82
- - **Data layer (R-A\*)**: `DualStore` держит Doublets binary и Links Notation text в lock-step, поддерживает AES-256-GCM backups и encryption для `secret:*` links (только при заданной `MS_SECRET_PASSPHRASE`; остальное хранилище не шифруется).
83
- - **Service connectors (R-E\*)**: archive parsers и live API connectors для VK, Telegram, X, WhatsApp, Facebook, LinkedIn, career.habr.com, hh.ru, superjob.ru и email.
84
- - **Pattern matching and automation (R-C\*)**: `inferRegex`, `simplifyRegex`, `compilePeg`, fuzzy reply-variation extraction и `createGraph` / `runGraph`.
85
- - **CRM (R-D\*)**: contact aggregation, audience DSL, mass-personal outreach, profile и resume sync envelopes.
86
- - **Синхронизация CV (R-V\*)**: декларативные browser plans для семи job platforms, cross-platform diff, выборочная запись и redacted telemetry с HTML/screenshot artifacts для каждого запуска.
87
- - **Distribution (R-F\*)**: NPM library, CLI, local server, Electron shell, Capacitor mobile shell, Docker microservices для web + WebRTC.
88
- - **Stacks (R-G\*)**: JS server + React SPA + Rust/WASM heavy workloads; alternative pure Rust server.
89
- - **Hardening (R-K\*)**: soft-delete by default, AES-256-GCM master-key vault, несколько методов unlock, encrypted export.
90
- - **Browser publishing (R-L\*)**: GitHub Pages CI workflow, публичный SPA URL, README и user guide для пользователя.
98
+ Требования R-A–R-Z24 выполнены и проверяются в CI на Node, Bun и Deno в Linux, macOS и Windows, с браузерными end-to-end тестами в Chromium. Тесты используют подделки: ничего не отправляется с реального аккаунта, и только отображение сообщений Telegram дополнительно проверено на реальном хранилище. Состояние по сценариям и следующие шаги (проверка на живых аккаунтах, вход по OAuth, командный режим, воронка продаж, результаты кампаний) — в [`docs/ROADMAP.ru.md`](docs/ROADMAP.ru.md).
91
99
 
92
100
  ## Структура репозитория
93
101
 
package/README.zh.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # meta-sovereign (languages: [en](README.md) • zh • [hi](README.hi.md) • [ru](README.ru.md))
2
2
 
3
- `meta-sovereign` 是个人 **meta profile sovereign** 系统:用户自己拥有的统一收件箱、CRM 和自动化平台。它优先本地运行,尊重隐私,汇总来自 VK、Telegram、X、WhatsApp、Facebook、LinkedIn、career.habr.com、hh.ru、superjob.ru 以及电子邮件提供商的联系人、聊天、邮件和模式数据。
3
+ **为您使用的每个网络提供同一个收件箱、同一本通讯录和同一套自动化——运行在您自己的电脑上。**
4
+
5
+ meta-sovereign 在网上**代表一个人或一个组织**。连接 Telegram、VK、WhatsApp、Facebook 和 Instagram、X、LinkedIn、电子邮件、GitHub、Upwork、PeoplePerHour 以及招聘网站(career.habr.com、hh.ru、superjob.ru 等),在一个应用中处理所有对话。本地优先、开源:您的消息、联系人和密钥保存在您自己的存储中,有加密备份,中间没有云。
6
+
7
+ ### 适用对象
8
+
9
+ | 谁 / 什么 | meta-sovereign 如何帮助 |
10
+ | ------------ | ------------------------------------------------------------------------------------------------------------------------ |
11
+ | **个人** | 所有聊天集中一处,重新联系久未联系的人,记住说过的话(事实),在每个招聘网站上保持同一份简历。 |
12
+ | **销售** | 来自每个网络的潜在客户汇入一个 CRM,按规则划分受众,大规模个性化外联(每条消息只发一次、礼貌有节奏),跟进,快速回复。 |
13
+ | **市场营销** | 向受众群发,在 Telegram 频道、LinkedIn 和 X 发帖,社区成员保持最新,每次自动发送都遵守退订名单。 |
14
+ | **用户支持** | 所有来信进入一个 Operator 队列,以 VK 社区或 Telegram Business 账号回复,自动回复以安全草稿形式出现,事实构成知识库。 |
15
+ | **组织** | 同样的工具服务于品牌、店铺或项目:它的账号、它的联系人、它的数据都在它自己的电脑上。团队模式(多名操作员)已列入路线图。 |
16
+
17
+ 每个场景今天能用什么、哪些是部分支持、下一步做什么,请见路线图:[`docs/ROADMAP.zh.md`](docs/ROADMAP.zh.md)。
4
18
 
5
19
  ## 立即试用(无需安装)
6
20
 
@@ -41,9 +55,11 @@ node js/bin/meta-sovereign.js serve
41
55
 
42
56
  包发布到 npm 之后,`npx -y meta-sovereign serve`(或 `npm install -g meta-sovereign && meta-sovereign serve`)才会可用。在此之前,不想装工具链的话可以使用桌面 app(见上文)。
43
57
 
44
- 两个后端默认监听 <http://127.0.0.1:8787>。JS 服务器会对托管 app 的 origin(`https://link-foundation.github.io`)返回 CORS 头;其他 origin 可以用 `meta-sovereign serve --allow-origin=<origins>` 或 `MS_ALLOW_ORIGINS` 允许。Safari 不允许 `https` 页面访问 `http://127.0.0.1`,但允许访问 `https://127.0.0.1`;服务器现在也在同一端口上提供 HTTPS 服务,并使用专为 localhost 颁发的自签名证书。运行一次 `node js/bin/meta-sovereign.js trust`(macOS:将证书添加到 login keychain;其他系统:打印证书路径),或在 Safari 中打开 `https://127.0.0.1:8787/trust` 并按提示操作,之后托管 app 在 Safari 中即可直接连接服务器。信任之前,提示会显示服务器地址,并提供其自带副本的链接(<http://127.0.0.1:8787>)以及 **信任服务器**(<https://127.0.0.1:8787/trust>)链接。`--tls=false` / `MS_TLS=off` 可关闭 HTTPS;服务器自带副本仍作为备用保留。托管的 SPA 会通过 `discoverServer()` 自动发现本地服务器(保存的覆盖值 → `127.0.0.1` 端口)。如果浏览器没有自动连接,请打开应用内 **Settings → Server**,粘贴服务器打印的 URL。
58
+ 两个后端默认监听 <http://127.0.0.1:8787>。JS 服务器会对托管 app 的 origin(`https://link-foundation.github.io`)返回 CORS 头;其他 origin 可以用 `meta-sovereign serve --allow-origin=<origins>` 或 `MS_ALLOW_ORIGINS` 允许。Safari 不允许 `https` 页面访问 `http://127.0.0.1`,但允许访问 `https://127.0.0.1`;服务器现在也在同一端口上提供 HTTPS 服务,并使用专为 localhost 颁发的自签名证书。运行一次 `node js/bin/meta-sovereign.js trust`(macOS:将证书添加到 login keychain;其他系统:打印证书路径),或在 Safari 中打开 `https://127.0.0.1:8787/trust` 并按提示操作,之后托管 app 在 Safari 中即可直接连接服务器。信任之前,提示会显示服务器地址及 **信任服务器**(<https://127.0.0.1:8787/trust>)链接;仅当显式启用 localhost 界面时才显示其链接。`--tls=false` / `MS_TLS=off` 可关闭 HTTPS。Safari 通过受信任的本地 HTTPS API 使用托管应用;localhost 界面是可选的。托管的 SPA 会通过 `discoverServer()` 自动发现本地服务器(保存的覆盖值 → `127.0.0.1` 端口)。如果浏览器没有自动连接,请打开应用内 **Settings → Server**,粘贴服务器打印的 URL。
45
59
 
46
- 默认界面是托管的应用:`serve` 会打印其地址 <https://link-foundation.github.io/meta-sovereign/>,应用会自行在我们的端口 8787 上找到服务器(也会查看 8788、7001、7002 和 3000;若使用其他端口,`serve` 会提示在 **Settings → Server** 中设置),因此服务器无需自己托管网站。它在 <http://127.0.0.1:8787> 上的副本作为备用保留,供 Safari 和离线使用;`serve --local-ui=false`(或 `MS_LOCAL_UI=off`)可将其关闭,此时 `/` 会打开托管的应用。`--ui-url=<url>`(或 `MS_UI_URL`)指定另一个托管副本(例如某个 fork 的 Pages),并允许其 origin。
60
+ 默认界面是托管的应用:`serve` 会打印其地址 <https://link-foundation.github.io/meta-sovereign/>,应用会自行在我们的端口 8787 上找到服务器(也会查看 8788、7001、7002 和 3000;若使用其他端口,`serve` 会提示在 **Settings → Server** 中设置),因此服务器无需自己托管网站。默认情况下,`/` 重定向到 GitHub Pages,服务器只提供 API、同步传输和连接辅助路由。如需离线使用 localhost 网页,请显式运行 `serve --local-ui=true`(或设置 `MS_LOCAL_UI=on`),随后可在 <http://127.0.0.1:8787> 访问该副本。桌面壳会显式启用其内置界面。`--ui-url=<url>`(或 `MS_UI_URL`)指定另一个托管副本(例如某个 fork 的 Pages),并允许其 origin。
61
+
62
+ 在 macOS 交互式终端中,`serve` 会完成整个设置:使用 Secure Enclave 保护本次安装的 TLS 私钥,检测证书是否已受信任,仅在需要时请求信任,并打开 GitHub Pages 应用。无交互终端时可运行 `node js/bin/meta-sovereign.js serve --trust=true --open=true`。`--trust=false` 和 `--open=false` 可关闭相应操作。Swift 辅助程序需要 macOS Command Line Tools;不支持的 Mac 可显式使用 `--hardware-key=false` 选择文件密钥。硬件保护针对磁盘上的密钥;Node 在内存中使用密钥。详见[本地服务器设置与安全](docs/LOCAL-SERVER-SECURITY.md)。
47
63
 
48
64
  ## 将 SPA 连接到服务器
49
65
 
@@ -61,33 +77,25 @@ SPA 按以下顺序选择服务器([`js/src/web/discover.js`](js/src/web/disco
61
77
 
62
78
  ## 功能概览
63
79
 
64
- - **统一收件箱**:覆盖 VK、Telegram、X、WhatsApp、Facebook、LinkedIn、career.habr.com、hh.ru、superjob.ru 和电子邮件。
65
- - **简历同步**:覆盖 LinkedIn、hh.ru、Habr Career、Naukri、VietnamWorks、TopCV 和 SuperJob——通过你自己的浏览器读取每份简历,逐字段查看差异,再把商定的内容写回去([`docs/CV-SYNC.zh.md`](docs/CV-SYNC.zh.md))。
66
- - **问候**:像 [konard/vk-bot](https://github.com/konard/vk-bot) 那样,用一句“你好”或一个问候贴纸在 VK、Telegram、WhatsApp、Messenger、X 和电子邮件中开启对话——在界面中挑选贴纸,预览谁会收到什么,并在消息之间留出间隔发送([`docs/GREETINGS.zh.md`](docs/GREETINGS.zh.md))。
67
- - **个人 CRM**:联系人、社区、群组成员、交集、批量个性化触达。
68
- - **个人记忆**:自动从对话中抽取结构化 `question → answer` 事实。
69
- - **对话自动化平台**:模式编辑器、回复变体编辑器、类似 n8n 的对话图。
70
- - **可移植数据存储**:二进制 [Doublets](https://github.com/linksplatform/doublets-rs) + 文本 [Links Notation](https://github.com/link-foundation/links-notation) 双表示,自动备份,`.lino` 导入/导出。
71
- - **本地优先运行时**:用户自有设备之间 WebRTC 同步,可选自托管个人云。
72
- - **双技术栈**:JS + Rust/WebAssembly(默认)和纯 Rust 服务器/微服务变体。磁盘格式共享。
73
-
74
- 完整的需求到状态映射见 [`docs/REQUIREMENTS.zh.md`](docs/REQUIREMENTS.zh.md);每个 issue 的案例研究在 [`docs/case-studies/`](docs/case-studies/)。
75
-
76
- 每项 Telegram 客户端功能(已支持、部分、搁置或不支持,以及能否通过 API 或网页应用访问)记录在 [`docs/FEATURES.zh.md`](docs/FEATURES.zh.md)。
80
+ - **统一收件箱**:覆盖 VK、Telegram、X、WhatsApp、Facebook、Instagram、LinkedIn、电子邮件、GitHub、Upwork、PeoplePerHour 和招聘网站;网络允许时实时更新(Telegram、VK Long Poll、增量 IMAP、GitHub),其余可导入任意大小的存档。
81
+ - **像 Telegram 官方应用一样的聊天**:每条消息只发送一次,送达对勾,实时更新与断线后补齐,已读标记,云端草稿,刷新后仍保留的重试([`docs/CHAT-REFERENCES.zh.md`](docs/CHAT-REFERENCES.zh.md))。
82
+ - **CRM**:一个视图看到联系人的全部信息,跨网络识别同一个人,社区与成员关系,搜索,按规则定义受众(`friends:vk & chat:vk:… - list:blocked`)。
83
+ - **导入联系人**:预览并导入 macOS 通讯录(包括已同步的 iCloud 账户)或任何平台导出的 vCard;重复导入保留记录身份。目录在同步期间自动更新,也包含没有消息的联系人。参见[联系人导入](docs/CONTACTS-IMPORT.md)。
84
+ - **外联、群发与自动化**:给谁发、何时发、在什么条件下发、发什么内容;预览谁会收到什么;默认生成安全草稿,或按节奏自动发送,并有安静时段、每个聊天的冷却期、每日上限和退订名单。每次自动发送都经过同一个发件箱:最多发送一次,结果不明时不会自行重试([`docs/USER-GUIDE.zh.md`](docs/USER-GUIDE.zh.md) 第 11 节)。
85
+ - **Operator 队列与回复**:逐个聊天处理未读消息,根据您以往的回答给出回复建议(按 Tab 采用),模式与回复变体,对匹配消息自动回复。
86
+ - **企业与社区账号**:VK 社区令牌运行 Bots Long Poll;Telegram Business 的快捷回复、问候与离开消息、营业时间和聊天机器人。
87
+ - **记忆**:从对话中提取结构化的 `问题 → 答案` 事实,并可在聊天中核对。
88
+ - **问候**:像 [konard/vk-bot](https://github.com/konard/vk-bot) 一样,在 VK、Telegram、WhatsApp、Messenger、X 和电子邮件中用一句“你好”或问候贴纸开启对话([`docs/GREETINGS.zh.md`](docs/GREETINGS.zh.md))。
89
+ - **简历同步**:通过您自己的浏览器在 LinkedIn、hh.ru、Habr Career、Naukri、VietnamWorks、TopCV 和 SuperJob 之间逐字段同步([`docs/CV-SYNC.zh.md`](docs/CV-SYNC.zh.md))。
90
+ - **数据安全**:抗崩溃的本地存储([Doublets](https://github.com/linksplatform/doublets-rs) + [Links Notation](https://github.com/link-foundation/links-notation)),自动数据结构迁移([`docs/DATA-MIGRATIONS.zh.md`](docs/DATA-MIGRATIONS.zh.md)),流式加密备份,磁盘写满时的处理,加密的密钥,拒绝其他网站访问的本地服务器。
91
+ - **随处可用**:网页应用、内置服务器的桌面应用、移动外壳、设备间 WebRTC 同步、离线写入稍后补发;纯 Rust 服务器使用相同的磁盘格式。
92
+ - **四种语言**:应用和所有文档都有英文、俄文、印地文和中文版本。
93
+
94
+ 逐个网络的每项功能——已支持、部分支持或不支持,以及是否可通过 API 或网页应用实现:[`docs/FEATURES.zh.md`](docs/FEATURES.zh.md)。每条需求及其证据:[`docs/REQUIREMENTS.zh.md`](docs/REQUIREMENTS.zh.md)。
77
95
 
78
96
  ## 状态
79
97
 
80
- issue #1 目标原型已实现并在 PR #2 中跟踪:
81
-
82
- - **数据层(R-A\*)**:`DualStore` 让 Doublets 二进制和 Links Notation 文本保持同步,支持 AES-256-GCM 静态加密备份和 `secret:*` 链接加密(仅在设置了 `MS_SECRET_PASSPHRASE` 时;存储的其余部分不加密)。
83
- - **服务连接器(R-E\*)**:VK、Telegram、X、WhatsApp、Facebook、LinkedIn、career.habr.com、hh.ru、superjob.ru 和 email 的归档解析器与可用 live API 连接器。
84
- - **模式匹配和自动化(R-C\*)**:`inferRegex`、`simplifyRegex`、`compilePeg`、模糊回复变体抽取和 `createGraph` / `runGraph`。
85
- - **CRM(R-D\*)**:联系人聚合、audience DSL、批量个性化触达、资料和简历同步 envelope。
86
- - **简历同步(R-V\*)**:七个求职平台的声明式浏览器计划、跨平台差异比较、可选择字段的写入,以及每次运行都带 HTML/截图产物的脱敏遥测流。
87
- - **分发(R-F\*)**:NPM 库、CLI、本地服务器、Electron shell、Capacitor 移动 shell、Docker web + WebRTC 微服务。
88
- - **技术栈(R-G\*)**:默认 JS server + React SPA + Rust/WASM 重型任务;纯 Rust 服务器作为替代。
89
- - **加固(R-K\*)**:默认软删除、AES-256-GCM 主密钥 vault、多种解锁方式、加密导出。
90
- - **浏览器发布(R-L\*)**:GitHub Pages CI workflow、公开 SPA URL、面向用户的 README 和用户指南。
98
+ 需求 R-A 至 R-Z24 均已完成,并在 CI 中于 Linux、macOS 和 Windows 上用 Node、Bun 和 Deno 检查,另有 Chromium 浏览器端到端测试。测试使用模拟服务:测试中不会从真实账号发送任何内容,只有 Telegram 的消息显示另外在真实存储上核对过。各场景的状态与下一步(真实账号验证、OAuth 登录、团队模式、销售管道、活动结果)见 [`docs/ROADMAP.zh.md`](docs/ROADMAP.zh.md)。
91
99
 
92
100
  ## 仓库结构
93
101
 
@@ -0,0 +1,25 @@
1
+ // Open the hosted face of the app, including when the local UI is enabled.
2
+ import { spawn } from 'node:child_process';
3
+
4
+ export const maybeOpenHostedApp = (args, handle, log) => {
5
+ const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
6
+ const enabled =
7
+ args.open === undefined ? interactive : String(args.open) !== 'false';
8
+ if (args.foreground === false || !enabled) {
9
+ return;
10
+ }
11
+ const [program, ...prefix] =
12
+ process.platform === 'darwin'
13
+ ? ['open']
14
+ : process.platform === 'win32'
15
+ ? ['rundll32.exe', 'url.dll,FileProtocolHandler']
16
+ : ['xdg-open'];
17
+ const browser = spawn(program, [...prefix, handle.uiUrl], {
18
+ detached: true,
19
+ stdio: 'ignore',
20
+ });
21
+ browser.on('error', () =>
22
+ log(`open the app in your browser → ${handle.uiUrl}`)
23
+ );
24
+ browser.unref();
25
+ };
@@ -0,0 +1,42 @@
1
+ // Local address-book imports, with the same parser and plan as the app.
2
+ import { promises as fs } from 'node:fs';
3
+ import { decodeVcard, parseVcard } from '../sources/vcard.js';
4
+ import { readSystemContacts } from '../sources/system-contacts.js';
5
+ import {
6
+ planContactsImport,
7
+ applyContactsImport,
8
+ } from '../sources/contacts-import.js';
9
+
10
+ export const CONTACTS_HELP = ` contacts-import [--file=<contacts.vcf> | --system] [--store=<dir>] [--preview]
11
+ import a vCard export or macOS Contacts (including synced iCloud accounts); nothing is uploaded`;
12
+
13
+ export const createContactCommands = ({ openStore }) => ({
14
+ 'contacts-import': async (args, log) => {
15
+ const system = args.system === true || args.system === 'true';
16
+ if (system === Boolean(args.file)) {
17
+ log('choose --file=<contacts.vcf> or --system');
18
+ return 1;
19
+ }
20
+ const storeDir = args.store ?? '.meta-sovereign';
21
+ const store = await openStore(storeDir);
22
+ try {
23
+ const rows = system
24
+ ? await readSystemContacts(storeDir)
25
+ : parseVcard(decodeVcard(await fs.readFile(args.file)));
26
+ const plan = await planContactsImport(store, rows, {
27
+ source: system ? 'system' : 'vcard',
28
+ });
29
+ const preview = args.preview === true || args.preview === 'true';
30
+ log(
31
+ JSON.stringify(
32
+ preview
33
+ ? { preview: true, ...plan.stats }
34
+ : await applyContactsImport(store, plan)
35
+ )
36
+ );
37
+ return 0;
38
+ } finally {
39
+ await store.close?.();
40
+ }
41
+ },
42
+ });