@awiki/dsh-plugin 0.3.7-dsh-test.20260831.2 → 0.3.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/README.md +66 -26
- package/README.zh.md +57 -23
- package/cordis.patch.yml +7 -5
- package/lib/builtin-tenants.json +22 -0
- package/lib/builtin-tenants.sha256 +1 -0
- package/lib/client.js +7123 -1635
- package/lib/client.js.map +1 -1
- package/lib/index.js +2534 -474
- package/lib/model-proxy-contract.js +11 -3
- package/lib/provider.js +6 -3
- package/lib/{sdk-adapter-FGaOi8It.mjs → sdk-adapter-CYcJH7sM.mjs} +210 -21
- package/lib/typert.host.js +1305 -106
- package/lib/typert.remote-client.d.ts +25 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +1305 -106
- package/lib/types/builtin-tenant-config.d.ts +19 -0
- package/lib/types/builtin-tenant-config.d.ts.map +1 -0
- package/lib/types/builtin-tenant-config.js +57 -0
- package/lib/types/builtin-tenant-config.js.map +1 -0
- package/lib/types/client/AwikiDeviceJoinReminder.d.ts +15 -0
- package/lib/types/client/AwikiDeviceJoinReminder.d.ts.map +1 -0
- package/lib/types/client/AwikiDeviceJoinReminder.js +74 -0
- package/lib/types/client/AwikiDeviceJoinReminder.js.map +1 -0
- package/lib/types/client/AwikiDevices.d.ts +8 -3
- package/lib/types/client/AwikiDevices.d.ts.map +1 -1
- package/lib/types/client/AwikiDevices.js +64 -8
- package/lib/types/client/AwikiDevices.js.map +1 -1
- package/lib/types/client/AwikiGroupDetails.d.ts.map +1 -1
- package/lib/types/client/AwikiGroupDetails.js +16 -13
- package/lib/types/client/AwikiGroupDetails.js.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.d.ts +10 -4
- package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.js +139 -36
- package/lib/types/client/AwikiIdentityAccess.js.map +1 -1
- package/lib/types/client/AwikiIntegrationSettings.d.ts +21 -0
- package/lib/types/client/AwikiIntegrationSettings.d.ts.map +1 -0
- package/lib/types/client/AwikiIntegrationSettings.js +105 -0
- package/lib/types/client/AwikiIntegrationSettings.js.map +1 -0
- package/lib/types/client/AwikiMail.d.ts.map +1 -1
- package/lib/types/client/AwikiMail.js +12 -8
- package/lib/types/client/AwikiMail.js.map +1 -1
- package/lib/types/client/AwikiOverlay.d.ts +0 -1
- package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
- package/lib/types/client/AwikiOverlay.js +26 -21
- package/lib/types/client/AwikiOverlay.js.map +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts.map +1 -1
- package/lib/types/client/AwikiProfileCard.js +17 -18
- package/lib/types/client/AwikiProfileCard.js.map +1 -1
- package/lib/types/client/AwikiRecoveryForm.d.ts +5 -1
- package/lib/types/client/AwikiRecoveryForm.d.ts.map +1 -1
- package/lib/types/client/AwikiRecoveryForm.js +73 -30
- package/lib/types/client/AwikiRecoveryForm.js.map +1 -1
- package/lib/types/client/AwikiSettingsSection.d.ts +28 -13
- package/lib/types/client/AwikiSettingsSection.d.ts.map +1 -1
- package/lib/types/client/AwikiSettingsSection.js +93 -61
- package/lib/types/client/AwikiSettingsSection.js.map +1 -1
- package/lib/types/client/AwikiUpdates.d.ts +10 -0
- package/lib/types/client/AwikiUpdates.d.ts.map +1 -0
- package/lib/types/client/AwikiUpdates.js +57 -0
- package/lib/types/client/AwikiUpdates.js.map +1 -0
- package/lib/types/client/awiki-client-bridge.d.ts +1 -1
- package/lib/types/client/awiki-client-bridge.d.ts.map +1 -1
- package/lib/types/client/awiki-client-bridge.js +4 -1
- package/lib/types/client/awiki-client-bridge.js.map +1 -1
- package/lib/types/client/controller.d.ts +65 -11
- package/lib/types/client/controller.d.ts.map +1 -1
- package/lib/types/client/controller.js +480 -127
- package/lib/types/client/controller.js.map +1 -1
- package/lib/types/client/drafts.d.ts +31 -0
- package/lib/types/client/drafts.d.ts.map +1 -0
- package/lib/types/client/drafts.js +94 -0
- package/lib/types/client/drafts.js.map +1 -0
- package/lib/types/client/image-cache.d.ts +2 -2
- package/lib/types/client/image-cache.d.ts.map +1 -1
- package/lib/types/client/image-cache.js +15 -2
- package/lib/types/client/image-cache.js.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +55 -15
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/integration-operation.d.ts +9 -0
- package/lib/types/client/integration-operation.d.ts.map +1 -0
- package/lib/types/client/integration-operation.js +54 -0
- package/lib/types/client/integration-operation.js.map +1 -0
- package/lib/types/client/mail-list-cache.d.ts +2 -0
- package/lib/types/client/mail-list-cache.d.ts.map +1 -1
- package/lib/types/client/mail-list-cache.js +18 -0
- package/lib/types/client/mail-list-cache.js.map +1 -1
- package/lib/types/client/otp-cooldown.d.ts +6 -0
- package/lib/types/client/otp-cooldown.d.ts.map +1 -0
- package/lib/types/client/otp-cooldown.js +18 -0
- package/lib/types/client/otp-cooldown.js.map +1 -0
- package/lib/types/client/settings-controller.d.ts +34 -0
- package/lib/types/client/settings-controller.d.ts.map +1 -1
- package/lib/types/client/settings-controller.js +182 -2
- package/lib/types/client/settings-controller.js.map +1 -1
- package/lib/types/client/settings-locales.d.ts +1 -1
- package/lib/types/client/settings-locales.d.ts.map +1 -1
- package/lib/types/client/settings-locales.js +184 -6
- package/lib/types/client/settings-locales.js.map +1 -1
- package/lib/types/client/slots.d.ts +11 -1
- package/lib/types/client/slots.d.ts.map +1 -1
- package/lib/types/client/slots.js +0 -1
- package/lib/types/client/slots.js.map +1 -1
- package/lib/types/desktop-distribution.d.ts +25 -0
- package/lib/types/desktop-distribution.d.ts.map +1 -0
- package/lib/types/desktop-distribution.js +57 -0
- package/lib/types/desktop-distribution.js.map +1 -0
- package/lib/types/domain.d.ts +1 -1
- package/lib/types/domain.d.ts.map +1 -1
- package/lib/types/domain.js +2 -1
- package/lib/types/domain.js.map +1 -1
- package/lib/types/index.d.ts +112 -18
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +897 -205
- package/lib/types/index.js.map +1 -1
- package/lib/types/integration-client.d.ts +17 -0
- package/lib/types/integration-client.d.ts.map +1 -0
- package/lib/types/integration-client.js +233 -0
- package/lib/types/integration-client.js.map +1 -0
- package/lib/types/legacy-sent-mail-cache.d.ts +4 -0
- package/lib/types/legacy-sent-mail-cache.d.ts.map +1 -0
- package/lib/types/legacy-sent-mail-cache.js +29 -0
- package/lib/types/legacy-sent-mail-cache.js.map +1 -0
- package/lib/types/mail-list-client.d.ts +12 -0
- package/lib/types/mail-list-client.d.ts.map +1 -0
- package/lib/types/mail-list-client.js +254 -0
- package/lib/types/mail-list-client.js.map +1 -0
- package/lib/types/mail-recovery-observability.d.ts +8 -0
- package/lib/types/mail-recovery-observability.d.ts.map +1 -0
- package/lib/types/mail-recovery-observability.js +119 -0
- package/lib/types/mail-recovery-observability.js.map +1 -0
- package/lib/types/model-proxy-contract.d.ts.map +1 -1
- package/lib/types/model-proxy-contract.js +7 -0
- package/lib/types/model-proxy-contract.js.map +1 -1
- package/lib/types/package-version.generated.d.ts +4 -0
- package/lib/types/package-version.generated.d.ts.map +1 -0
- package/lib/types/package-version.generated.js +4 -0
- package/lib/types/package-version.generated.js.map +1 -0
- package/lib/types/profile-state.d.ts +6 -0
- package/lib/types/profile-state.d.ts.map +1 -0
- package/lib/types/profile-state.js +41 -0
- package/lib/types/profile-state.js.map +1 -0
- package/lib/types/provider-api.d.ts +36 -9
- package/lib/types/provider-api.d.ts.map +1 -1
- package/lib/types/provider.d.ts.map +1 -1
- package/lib/types/provider.js +5 -2
- package/lib/types/provider.js.map +1 -1
- package/lib/types/realtime-supervisor.d.ts +6 -0
- package/lib/types/realtime-supervisor.d.ts.map +1 -1
- package/lib/types/realtime-supervisor.js +14 -1
- package/lib/types/realtime-supervisor.js.map +1 -1
- package/lib/types/sdk-adapter.d.ts +32 -6
- package/lib/types/sdk-adapter.d.ts.map +1 -1
- package/lib/types/sdk-adapter.js +127 -24
- package/lib/types/sdk-adapter.js.map +1 -1
- package/lib/types/settings-rpc-contract.d.ts +58 -0
- package/lib/types/settings-rpc-contract.d.ts.map +1 -1
- package/lib/types/settings-rpc-contract.js +103 -0
- package/lib/types/settings-rpc-contract.js.map +1 -1
- package/lib/types/settings-rpc.d.ts +14 -1
- package/lib/types/settings-rpc.d.ts.map +1 -1
- package/lib/types/settings-rpc.js +130 -1
- package/lib/types/settings-rpc.js.map +1 -1
- package/lib/types/tenant-registry.d.ts +74 -0
- package/lib/types/tenant-registry.d.ts.map +1 -0
- package/lib/types/tenant-registry.js +440 -0
- package/lib/types/tenant-registry.js.map +1 -0
- package/lib/types/types.d.ts +173 -1
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js.map +1 -1
- package/lib/types/update-policy.d.ts +51 -0
- package/lib/types/update-policy.d.ts.map +1 -0
- package/lib/types/update-policy.js +379 -0
- package/lib/types/update-policy.js.map +1 -0
- package/lib/types/version.d.ts +4 -0
- package/lib/types/version.d.ts.map +1 -0
- package/lib/types/version.js +44 -0
- package/lib/types/version.js.map +1 -0
- package/package.json +34 -21
- package/lib/types/sent-mail-store.d.ts +0 -22
- package/lib/types/sent-mail-store.d.ts.map +0 -1
- package/lib/types/sent-mail-store.js +0 -246
- package/lib/types/sent-mail-store.js.map +0 -1
package/README.md
CHANGED
|
@@ -23,15 +23,17 @@ tools, or model APIs.
|
|
|
23
23
|
|
|
24
24
|
- Enter a Handle and phone through one Web UI flow and always request a registration OTP. A new Handle creates the deployment identity; an existing Handle offers ordinary Device Join first, with Recovery V4 as an explicit destructive alternative that requests a second purpose-scoped OTP.
|
|
25
25
|
- DSH can join an existing Handle as an independent member device. When DSH created or recovered the Handle and is the current ready-admin, the foreground Devices tab can list devices, verify an incoming request with SAS, approve one member, reject it, or revoke another device. These mutations are not Agent tools and require explicit `APPROVE` / `REVOKE` confirmation.
|
|
26
|
+
- A local Darwin x64 ready-admin can prepare Root Transfer for one exact active member and use native system authentication before sending management capability. Authorization handles and Root material remain Host/Core-only; unsupported or headless Hosts fail closed. A recovered old device uses the same native-authentication seam to re-Join only as a member.
|
|
26
27
|
- Open the top-left AWiki account menu to sign out locally without deleting the encrypted identity or message database; **Resume local identity** restores the same DID and Handle, including across DSH restarts. The signed-out screen reveals phone recovery only after local resume fails. Switching identities requires an explicit confirmation that permanently clears local AWiki data first.
|
|
27
28
|
- Reuse that identity across the root Agent and its subagents.
|
|
28
29
|
- Direct-message and existing-group conversation lists, unread counts, latest-message previews, and persisted display names. Core SQLite remains the persistent source of truth: the Host joins persisted peer profiles onto Direct roster rows, while the browser keeps the active identity's last trustworthy Direct profile and group title. Sparse polling identifiers therefore cannot overwrite a resolved display name or real group title. After an existing Handle is recovered, the Host synchronizes account projections before asking Core to restore old group memberships; pending or blocked groups expose a retryable status without disabling Direct messages or other groups. Opening a conversation renders the committed local timeline first, hydrates group sender labels from the Core display-profile cache, reconciles remote history and Direct profile data in the background, and keeps local messages visible if refresh fails. A failed background roster poll also leaves the usable local view quiet; explicit loads still surface their errors. This local-first path covers the newest projected page; loading older messages still requires the remote history service. Scrolling up reveals a latest-message control that counts newer arrivals without interrupting reading. A conversation is marked read only after its newest rendered message reaches the visible bottom.
|
|
29
30
|
- Create a private-discovery, open-join, transport-protected group from the Web UI with a name and 1–50 initial Handle or DID members. The group opens immediately; members that could not be added are reported without hiding the successfully created group.
|
|
30
|
-
- Text messages plus one attachment per message, with Enter-to-send, Shift+Enter line breaks, optimistic sending bubbles reconciled by an exact client message ID, image previews, and SHA verification. Verified image bytes use three bounded layers: a browser-runtime LRU makes conversation remounts immediate, identity-scoped IndexedDB survives full page reloads without a Host call, and the private Host disk cache survives browser-storage loss and Harness restarts. Clear Local Data removes all three layers.
|
|
31
|
+
- Text messages plus one attachment per message, with Enter-to-send, Shift+Enter line breaks, optimistic sending bubbles reconciled by an exact client message ID, image previews, and SHA verification. Verified image bytes use three bounded layers: a browser-runtime LRU makes conversation remounts immediate, identity-scoped IndexedDB survives full page reloads without a Host call, and the private Host disk cache survives browser-storage loss and Harness restarts. Clear Local Data removes all three layers and selectively removes every AWiki Mail list/folder localStorage projection while preserving unrelated origin storage.
|
|
31
32
|
- A draggable circular launcher that defaults to the lower-left sidebar area, adaptive popup placement, dark mode, and remembered active conversation.
|
|
32
33
|
- User-triggered AI summaries for up to 50 recent or unread messages, kept only in runtime memory with explicit stale, retry, copy, and source-navigation states.
|
|
33
34
|
- OTP identity access keeps the verification form visible and disables resend with a visible server-directed cooldown countdown. Handle classification happens before OTP delivery, so each attempt sends exactly one purpose-correct registration or recovery code.
|
|
34
|
-
-
|
|
35
|
+
- When the user continues into the recovered identity after Recovery V4 reaches `applied`, the Host resolves the recovered Handle's original mailbox under the current DID. Inbox and sent views remount for that identity; sent history is read from the Mail Service with `mail.list(direction=outbound)`, never from the removed Host-local sent store. The optional Model Proxy package independently authenticates that current DID and sends only strict `{}` to the Model endpoint; it never requests or carries a User Service recovery credential, DID path, proof, assurance, or ledger owner. It consumes only the actual outcome-only Model response (`restored`, `already_current`, or `not_applicable`); transition assurance remains a Model server-side operation/audit/DB oracle and is not inferred by DSH.
|
|
36
|
+
- Recovery E2E receipt collection uses a run-ID-first `0600` file handshake with separately operated Model/Mail producers; DSH verifies producer, target, source candidate, measurement window, receipt path, and shared operation fingerprints but never launches those external producers. The current Mail send API is text-only, so outbound attachment-preservation evidence remains blocked until DSH/Core expose an independently reviewed attachment-send seam.
|
|
35
37
|
- When the separate `@awiki/dsh-model-proxy` package is installed, an AWiki-hosted DeepSeek choice appears before the official API-key onboarding step only when Harness has no usable model provider, with an explicit opt-in and an unchanged API-key escape path. New sessions do not show AWiki model or payment prompts after the official or another provider is usable.
|
|
36
38
|
- The optional model-proxy package owns the Host short-token flow and every model-hosting Browser surface: onboarding plus Settings → Quick Recharge with Account & Recharge and Usage tabs. It registers `awiki-deepseek` with `deepseek-v4-flash` and `deepseek-v4-pro`; Flash is recommended and credentials never enter the Browser.
|
|
37
39
|
- AWiki identity, domain, and local-data settings remain in the main package. Installing only the main package does not register model opt-in, recharge, usage, or model onboarding UI.
|
|
@@ -55,8 +57,12 @@ post-creation group administration or multiple attachments in one message. The A
|
|
|
55
57
|
plain Direct text; Groups, attachments, encrypted/payload content, and unknown slash commands never
|
|
56
58
|
reach the Agent.
|
|
57
59
|
|
|
58
|
-
Mail v1
|
|
59
|
-
|
|
60
|
+
Mail v1 provides an on-demand browser mailbox/compose UI and five on-demand Agent tools. Inbox uses
|
|
61
|
+
the existing Core inbound query; sent uses a fixed Host-only, current-identity-authenticated
|
|
62
|
+
`mail.list(direction=outbound)` query. The identity-scoped browser cache may keep the last visible
|
|
63
|
+
page during an explicit refresh error, but it is never sent-history authority. A successful send is
|
|
64
|
+
attempted once and triggers one server-backed sent refresh in the browser. Mail does not wake an Agent
|
|
65
|
+
for new mail, render or send HTML, transfer mail attachments, or implement reply, forward, and
|
|
60
66
|
threading. Mail subject, addresses, preview, body, timestamps, and attachment metadata are
|
|
61
67
|
untrusted external data, never Agent instructions. `awiki_mail_mark_read` and `awiki_mail_send`
|
|
62
68
|
require execution approval. Mail send is attempted once without automatic retry; a timeout or
|
|
@@ -67,6 +73,8 @@ reconstruct historical Direct conversations; only ordinary data already retained
|
|
|
67
73
|
continues to follow Core's existing local migration rules. Mailbox and hosted-model reconciliation
|
|
68
74
|
are independent of that private-chat boundary.
|
|
69
75
|
|
|
76
|
+
Version checks, manual upgrade commands, and tenant isolation are documented in [Updates](docs/updates.md).
|
|
77
|
+
|
|
70
78
|
## Install
|
|
71
79
|
|
|
72
80
|
Install the independent identity plugin first, then AWiki:
|
|
@@ -107,16 +115,27 @@ an explicit dependency on the loaded `awiki` service.
|
|
|
107
115
|
|
|
108
116
|
Full keys, sources, purposes, and defaults: [docs/configuration.md](docs/configuration.md).
|
|
109
117
|
|
|
110
|
-
|
|
118
|
+
Fresh installations contain exactly the package's two built-in tenant slots and start on its configured
|
|
119
|
+
default slot. The repository default is AWiki China followed by AWiki Global. Existing official state is
|
|
120
|
+
promoted in place when its endpoint still matches, without moving its identity, messages, attachments,
|
|
121
|
+
Vault, or state directory. A non-empty state root created before the tenant registry keeps the immutable
|
|
122
|
+
`awiki.info` endpoint snapshot shipped by that release line. Operators who have positive deployment
|
|
123
|
+
evidence that the old root belongs to a current official slot may classify it once with
|
|
124
|
+
`DSH_AWIKI_LEGACY_TENANT_SLOT`. Settings → AWiki → Tenant switches the Host-owned
|
|
125
|
+
runtime transactionally; the two official tenants are immutable, while custom tenants use independent
|
|
126
|
+
storage scopes. Build with `pnpm run build -- --tenant-config /absolute/path/tenants.json` to replace the
|
|
127
|
+
complete two-slot catalog; partial merging and hidden official fallbacks are not supported. Set deployment
|
|
128
|
+
variables only for legacy private/development migration inputs:
|
|
111
129
|
|
|
112
130
|
| Variable | Purpose | Default |
|
|
113
131
|
| --- | --- | --- |
|
|
114
|
-
| `DSH_AWIKI_USER_SERVICE_URL` |
|
|
115
|
-
| `DSH_AWIKI_USER_SERVICE_DOMAIN` |
|
|
116
|
-
| `
|
|
132
|
+
| `DSH_AWIKI_USER_SERVICE_URL` | Legacy absolute AWiki user-service URL | Package default tenant Origin |
|
|
133
|
+
| `DSH_AWIKI_USER_SERVICE_DOMAIN` | Legacy Handle provider domain | Package default tenant DID host |
|
|
134
|
+
| `DSH_AWIKI_LEGACY_TENANT_SLOT` | Evidence-based one-time official-slot override for pre-registry state | Unset; preserve the historical `awiki.info` snapshot |
|
|
135
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_URL` | Legacy Message-service URL | Package default tenant Origin |
|
|
117
136
|
| `DSH_AWIKI_MAIL_SERVICE_URL` | Mail-service URL called by the Host | Resolved user-service URL |
|
|
118
|
-
| `DSH_AWIKI_MESSAGE_SERVICE_DID` |
|
|
119
|
-
| `DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL` |
|
|
137
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_DID` | Legacy authoritative message-service DID | Package default tenant DID |
|
|
138
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL` | Legacy public protocol endpoint | Package default tenant Origin |
|
|
120
139
|
| `DSH_AWIKI_ALLOWED_ATTACHMENT_ORIGINS` | JSON array of extra exact HTTPS origins | `[]` |
|
|
121
140
|
| `DSH_AWIKI_STATE_ROOT` | Private Rust IM Core state directory | `$DSH_HOME/awiki/im-core` or `~/.dsh/awiki/im-core` |
|
|
122
141
|
| `DSH_ANP_IDENTITY_STATE_ROOT` | Independent multi-DID ANP Identity Store | `$DSH_HOME/anp-identity` |
|
|
@@ -149,22 +168,22 @@ The former runtime import `@awiki/dsh-plugin/model-proxy` has been removed. Use
|
|
|
149
168
|
model onboarding, account/recharge, and usage entry points hidden while leaving
|
|
150
169
|
AWiki Advanced settings functional.
|
|
151
170
|
|
|
152
|
-
The
|
|
153
|
-
`@awiki/dsh-model-proxy@0.1.0
|
|
154
|
-
|
|
155
|
-
bridge
|
|
156
|
-
|
|
171
|
+
The split-package line was introduced by `@awiki/dsh-plugin@0.3.0` and
|
|
172
|
+
`@awiki/dsh-model-proxy@0.1.0`. The current candidate manifests are `0.3.9`
|
|
173
|
+
and `0.1.4`, and Model Proxy requires main `^0.3.9`. This keeps the shared
|
|
174
|
+
`awikiClient` Browser bridge and tenant-capability contract on the same
|
|
175
|
+
reviewed line.
|
|
157
176
|
|
|
158
177
|
The optional package owns these configuration variables:
|
|
159
178
|
|
|
160
179
|
| Variable | Purpose | Default |
|
|
161
180
|
| --- | --- | --- |
|
|
162
|
-
| `DSH_AWIKI_MODEL_PROXY_URL` | AWiki-hosted DeepSeek proxy root URL | `https://model.awiki.info` |
|
|
163
181
|
| `DSH_AWIKI_MODEL_CONTEXT_WINDOW` | AWiki-hosted DeepSeek context window | `1000000` |
|
|
164
182
|
| `DSH_AWIKI_MODEL_MAX_TOKENS` | Maximum AWiki-hosted DeepSeek output | `8192` |
|
|
165
183
|
| `DSH_AWIKI_MODEL_TOKEN_REFRESH_SKEW_SECONDS` | Early short-token refresh interval | `60` |
|
|
166
184
|
|
|
167
|
-
AWiki-hosted DeepSeek is disabled by default.
|
|
185
|
+
AWiki-hosted DeepSeek is disabled by default. Its opt-in and fallback selection are persisted per tenant.
|
|
186
|
+
Only an explicit choice in onboarding or Settings → Quick Recharge →
|
|
168
187
|
Account & Recharge registers the `awiki-deepseek` route and selects Flash. Disabling restores the
|
|
169
188
|
previous provider, model, and reasoning effort. A successful recharge refreshes the balance but
|
|
170
189
|
never enables AWiki or changes the selected model automatically.
|
|
@@ -188,11 +207,10 @@ closes the provider order, then restores the amount editor without creating a re
|
|
|
188
207
|
failure leaves the existing payment action available, while a payment that wins the race refreshes
|
|
189
208
|
the credited account instead of being reported as cancelled.
|
|
190
209
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
registered DID or Handle.
|
|
210
|
+
Settings → AWiki is split into Tenant, Devices, Local data, and Guest integration. Tenant changes are available
|
|
211
|
+
before registration, while recovering, while signed out, and while signed in. A successful switch opens
|
|
212
|
+
the target scope before committing the active tenant; a failure reconstructs the previous runtime. The
|
|
213
|
+
legacy `awiki.domain` setting is migration input only and continues to reference its existing state path.
|
|
196
214
|
|
|
197
215
|
The settings page talks to a plugin-owned Connection channel that the Host
|
|
198
216
|
accepts only from loopback. This keeps an independently installed `@awiki/dsh-plugin`
|
|
@@ -226,8 +244,10 @@ single Core WebSocket without depending on Workspace or Agent configuration. Dir
|
|
|
226
244
|
System Notification events schedule canonical reliable sync; WSS never advances a checkpoint or
|
|
227
245
|
authorizes a device by itself. `DSH_AWIKI_REALTIME_ENABLED=false` explicitly falls back to HTTP
|
|
228
246
|
refresh. Diagnostics report the single-session lifecycle with start/stop balance, peak active
|
|
229
|
-
count, retry generation,
|
|
230
|
-
|
|
247
|
+
count, retry generation, only closed sync failure codes, and the last successful sync's page count,
|
|
248
|
+
hydrated-message count, and `olderHistoryExcluded` flag. They never expose a cursor, page ref, token,
|
|
249
|
+
manifest, or message body. A healthy reconnect may have multiple lifetime starts while still owning
|
|
250
|
+
exactly one active session. Exact-device Node builds without an
|
|
231
251
|
active P6 lane use the existing `awiki.sync.event.v3` WebSocket subprotocol, while P6
|
|
232
252
|
delivery-context is requested only after that lane was explicitly negotiated. The optional Direct-to-Agent consumer still requires both
|
|
233
253
|
`DSH_AWIKI_LISTENER_ENABLED=true` and a non-empty exact allowlist. It reads only committed Direct
|
|
@@ -289,17 +309,37 @@ Requirements: Node.js 22.19+ (or 24+) and pnpm 11.22.
|
|
|
289
309
|
```bash
|
|
290
310
|
pnpm install --frozen-lockfile
|
|
291
311
|
pnpm run verify:workspace
|
|
312
|
+
pnpm run e2e:smoke
|
|
313
|
+
DSH_AWIKI_E2E_CONFIG=/absolute/path/to/rwiki-cn-testing.json pnpm run e2e:live
|
|
314
|
+
DSH_AWIKI_E2E_CONFIG=/absolute/path/to/awiki-info-testing.json pnpm run e2e:live -- --headed --grep RECOVERY
|
|
292
315
|
pnpm pack --dry-run
|
|
293
316
|
```
|
|
294
317
|
|
|
295
|
-
|
|
318
|
+
`e2e:smoke` uses Playwright Chromium to install the current tarball into an
|
|
319
|
+
isolated real DSH Web profile, complete the stock Harness first-run dialogs,
|
|
320
|
+
and open the AWiki identity entry without sending an OTP. The optional
|
|
321
|
+
`e2e:smoke:webkit` command provides the same no-write compatibility check.
|
|
322
|
+
The protected general `e2e:live` lane provisions one DSH identity plus one real
|
|
323
|
+
CLI peer on `rwiki-cn-testing`, verifies bidirectional Direct and Group plus a
|
|
324
|
+
same-root Harness restart, scans artifacts for secrets, and requires exact
|
|
325
|
+
managed cleanup with zero residual. The separate Recovery command above is
|
|
326
|
+
restricted to headed macOS, exact `awiki-info-testing`, and Ali-local cleanup
|
|
327
|
+
profile `awiki-info-managed-local-v1`. See the
|
|
328
|
+
[Web E2E technical design](docs/e2e-automation-testing-cli-peer.md).
|
|
329
|
+
|
|
330
|
+
`pnpm run verify` validates the frozen sibling ANP Identity and IM Core source
|
|
331
|
+
refs, then rebuilds their native fixtures and the IM Core Node TypeScript dist
|
|
332
|
+
from source. Unit results therefore do not depend on stale ignored `.node` or
|
|
333
|
+
`dist/` files left by an earlier worktree.
|
|
334
|
+
|
|
335
|
+
The production Host loads the exact `@awiki/im-core-node@0.2.3` runtime package;
|
|
296
336
|
the platform-specific native addon is selected through its optional dependencies
|
|
297
337
|
and remains external to the JavaScript bundle. Consumers do not need Rust or an
|
|
298
338
|
`awiki-cli-rs2` checkout. See `THIRD_PARTY_NOTICES.md` for provenance and
|
|
299
339
|
licensing.
|
|
300
340
|
|
|
301
341
|
The checked-in Typert Host/Remote artifacts were generated from the same Host
|
|
302
|
-
contract. `pnpm check:generated` pins their complete
|
|
342
|
+
contract. `pnpm check:generated` pins their complete 58-method surface until
|
|
303
343
|
the standalone Typert generator supports root-level packages.
|
|
304
344
|
|
|
305
345
|
## Security
|
package/README.zh.md
CHANGED
|
@@ -11,17 +11,18 @@ Host-only Provider lease 不会进入 Browser、Remote、Agent tools 或模型 A
|
|
|
11
11
|
|
|
12
12
|
## 功能
|
|
13
13
|
|
|
14
|
-
- 在 Web UI 的统一入口输入 Handle
|
|
14
|
+
- 在 Web UI 的统一入口输入 Handle 和手机号,先查找该 Handle 的未完成恢复;命中则继续原操作,否则发送注册验证码。新 Handle 创建部署级身份;已有 Handle 优先进入普通 Device Join,Recovery V4 仅作为显式危险替代项,并重新发送用途隔离的恢复验证码;根 Agent 与子 Agent 共用最终身份。
|
|
15
15
|
- DSH 可以作为独立 member 设备加入已有 Handle;当 DSH 创建或恢复 Handle、当前设备为 ready-admin 时,前台“设备”页可列出设备、通过 SAS 验证并批准 member、拒绝请求或撤销其他设备。管理动作不进入 Agent 工具,并要求显式输入 `APPROVE` / `REVOKE`。
|
|
16
|
+
- 本机 Darwin x64 ready-admin 可在“设备”页准备 Root Transfer,并经系统级用户认证把管理能力发送给一个精确的 active member;authorization handle 和 Root material 不进入 Browser。Linux、远程无头或系统认证不可用时失败关闭。Recovery 后旧设备 re-Join 复用同一认证端口,但仍只恢复为 member。
|
|
16
17
|
- 点击 AWiki 面板左上角图标可打开账户菜单;普通退出只锁定本机会话,不删除加密身份或消息数据库,重新进入及重启 DSH 后仍恢复同一个 DID 和 Handle。退出页默认只提供重新进入本机身份和使用其他身份;只有本机重新进入失败后才显示手机号恢复入口。改用其他身份必须先确认永久清除本地 AWiki 数据。
|
|
17
18
|
- 身份入口失败时保留当前挂载表单中的手机号、Handle 和验证码,以便修正后重试;手机号和验证码不进入 Browser 持久化状态、controller snapshot 或公开 Remote 结果。仅恢复操作编号可用于崩溃续跑。注册未开放、验证码状态失效和提交冲突会给出对应的安全处理提示。
|
|
18
19
|
- 私聊和已有群聊列表、未读角标、最新消息预览、时间更新与昵称持久化。Core SQLite 是持久化真相源:Host 将持久化的对端资料合并进私聊列表,浏览器再按当前身份保留最后一次可信的私聊资料和群名,稀疏轮询中的 Handle、DID 或 Group DID 占位不会覆盖真实名称。恢复已有 Handle 后,Host 会先同步账号投影,再让 Core 自动恢复旧群聊成员身份;未完成或受阻的群聊会显示可重试状态,但不影响私聊和其他群聊。打开会话时先显示 Core 已提交的本地时间线,并从 Core 显示资料缓存补齐群消息发送者名称,再在后台补齐远端历史和私聊资料;刷新失败不会清空本地消息。后台会话轮询失败也不会用全局红条打断仍可用的本地页面,用户主动加载失败仍会正常提示。当前 local-first 只覆盖本地最新一页,“加载更早消息”仍需访问远端 history。向上阅读时显示下滑箭头,新消息到达后在同一控件中累计数量且不打断阅读位置。只有最新一条已渲染消息到达可视区域底部后,当前会话才会自动标记为已读。
|
|
19
20
|
- 可从 Web UI 输入群名和 1–50 个 Handle 或 DID 发起私有发现、开放加入、传输保护的群聊。建群成功后立即进入新会话;个别成员添加失败会单独提示,不会隐藏已经创建的群。
|
|
20
|
-
- 文本和单附件消息;Enter 发送、Shift+Enter 换行,发送中立即显示带 loading 动画的乐观气泡,并通过精确的客户端消息 ID 与已提交消息对账,避免同一条消息显示两个气泡;同时支持图片预览、附件说明与 SHA 校验。校验通过的图片字节使用三层有界缓存:浏览器运行期 LRU 让会话重新挂载时立即出图,按身份隔离的 IndexedDB 在整页刷新后无需访问 Host,Host 私有磁盘缓存则应对浏览器缓存丢失并跨 Harness
|
|
21
|
+
- 文本和单附件消息;Enter 发送、Shift+Enter 换行,发送中立即显示带 loading 动画的乐观气泡,并通过精确的客户端消息 ID 与已提交消息对账,避免同一条消息显示两个气泡;同时支持图片预览、附件说明与 SHA 校验。校验通过的图片字节使用三层有界缓存:浏览器运行期 LRU 让会话重新挂载时立即出图,按身份隔离的 IndexedDB 在整页刷新后无需访问 Host,Host 私有磁盘缓存则应对浏览器缓存丢失并跨 Harness 重启复用;“清除本地数据”会删除三层缓存,并精确删除全部 AWiki Mail list/folder localStorage 投影而保留无关 origin storage。
|
|
21
22
|
- 圆形可拖动入口、自适应四角弹窗、深色模式和当前会话记忆。
|
|
22
23
|
- 用户点击后才生成的 AI 对话总结:最多处理 50 条最近或未读消息,按会话保留本次运行期缓存,并支持过期提示、重试、复制与跳转原消息。
|
|
23
24
|
- OTP 身份入口会保留验证码输入表单,并按服务端返回的冷却时间显示重发倒计时、禁用提前重发;已有 Handle 在消费 registration OTP 后再选择 Join 或 Recovery,Recovery 不复用 registration grant。
|
|
24
|
-
- Recovery V4 进入 `applied`
|
|
25
|
+
- Recovery V4 进入 `applied` 且用户继续进入恢复后的身份时,Host 会用 current DID 解析已恢复 Handle 的原邮箱,并为该身份重新挂载收件箱与发件箱;发件历史固定来自 Mail Service 的 `mail.list(direction=outbound)`,不再读取已删除的 Host 本地 sent store。可选 Model Proxy 包会独立使用 current DID 认证,并且只向现有 Model endpoint 发送严格 `{}`。它不请求或携带 User Service 恢复凭证、DID path、proof、assurance 或账本 owner,只消费 Model 实际的 outcome-only 响应(`restored`、`already_current` 或 `not_applicable`);transition assurance 由 Model 服务端 operation/audit/DB oracle 验证,DSH 不从公开响应推断。
|
|
25
26
|
- 安装独立的 `@awiki/dsh-model-proxy` 后,仅在 Harness 没有任何可用模型时,首次引导才会在官方 API Key 步骤前提供 AWiki 托管模型选项;用户可以明确启用,也可以跳过并继续原版 API Key 流程。已经配置官方或其他 Provider 时,新会话不会显示 AWiki 模型或支付提示。
|
|
26
27
|
- 可选 Model Proxy 包独占 Host 内部短期 Token 和全部模型托管界面:首次引导,以及“设置 → 快速充值”中的“账户与充值”“用量明细”。它提供 `deepseek-v4-flash` 和 `deepseek-v4-pro`,默认推荐 Flash;Token 不进入 Browser。
|
|
27
28
|
- AWiki 主包只保留身份、域名和本地数据设置。只安装主包时,不会注册模型启停、充值、用量或模型首次引导界面。
|
|
@@ -43,14 +44,19 @@ Host-only Provider lease 不会进入 Browser、Remote、Agent tools 或模型 A
|
|
|
43
44
|
首版不包含端到端加密、多身份、建群后的成员或群设置管理和单消息多附件。Agent listener 只接受明文私聊文本;
|
|
44
45
|
群聊、附件、加密/payload 内容和未知斜杠命令都不会进入 Agent。
|
|
45
46
|
|
|
46
|
-
邮件 v1
|
|
47
|
-
|
|
47
|
+
邮件 v1 提供按需浏览器邮箱/写信界面和五个按需 Agent 工具。收件箱沿用 Core inbound 查询;
|
|
48
|
+
发件箱通过固定、仅 Host 可用且绑定 current identity 的 `mail.list(direction=outbound)` 查询。
|
|
49
|
+
身份隔离的浏览器 cache 可以在显式刷新失败时保留最近可见页面,但绝不是发件历史权威;发送
|
|
50
|
+
成功后浏览器只触发一次服务端发件箱刷新。邮件不会以新邮件唤醒 Agent;不渲染或发送 HTML,
|
|
51
|
+
不传输邮件附件,也不支持回复、转发和会话串联。邮件主题、地址、预览、正文、
|
|
48
52
|
时间戳和附件元数据都是不可信外部数据,不能作为 Agent 指令。`awiki_mail_mark_read` 和
|
|
49
53
|
`awiki_mail_send` 每次执行都需要审批。邮件发送只尝试一次且不自动重试;超时或传输中断返回
|
|
50
54
|
`delivery-unknown`,再次审批发送前应先检查邮箱。
|
|
51
55
|
|
|
52
56
|
身份恢复不新增服务端私聊恢复。清空本地状态后不会重新构造历史私聊会话;只有 Rust SDK
|
|
53
|
-
已经保留的普通本地数据继续遵循 Core
|
|
57
|
+
已经保留的普通本地数据继续遵循 Core 既有迁移规则。邮箱恢复与私聊边界相互独立。
|
|
58
|
+
|
|
59
|
+
版本查询、手动升级命令及租户隔离规则见[版本与更新](docs/updates.md)。
|
|
54
60
|
|
|
55
61
|
## 安装
|
|
56
62
|
|
|
@@ -86,16 +92,24 @@ AWiki IM Core Provider 和 Summary Provider。浏览器客户端由 DSH 根据
|
|
|
86
92
|
|
|
87
93
|
完整标识符、来源、作用与默认值见 [docs/configuration.md](docs/configuration.md)。
|
|
88
94
|
|
|
89
|
-
|
|
95
|
+
全新安装只包含打包配置指定的两个内置租户槽位,并进入配置的默认槽位;仓库默认值是
|
|
96
|
+
AWiki 中国与 AWiki 全球。已有官方端点仍匹配时会原地提升并继续保持激活,身份、消息、附件、
|
|
97
|
+
Vault 与状态目录均不搬迁。租户注册表出现前已存在的非空状态根继续使用当时发布过的
|
|
98
|
+
`awiki.info` 端点快照;只有运维掌握其属于当前官方槽位的明确证据时,才通过
|
|
99
|
+
`DSH_AWIKI_LEGACY_TENANT_SLOT` 做一次性分类。
|
|
100
|
+
“设置 → AWiki → 租户”由 Host 事务化切换运行时;两个官方租户不可修改,自定义租户使用独立
|
|
101
|
+
存储 Scope。使用 `pnpm run build -- --tenant-config /绝对路径/tenants.json` 可完整替换两个
|
|
102
|
+
槽位;不做局部合并,也没有隐藏的官方 fallback。以下变量只作为旧私有/开发部署的迁移输入:
|
|
90
103
|
|
|
91
104
|
| 环境变量 | 用途 | 默认值 |
|
|
92
105
|
| --- | --- | --- |
|
|
93
|
-
| `DSH_AWIKI_USER_SERVICE_URL` | AWiki user service 绝对 URL |
|
|
94
|
-
| `DSH_AWIKI_USER_SERVICE_DOMAIN` | Handle
|
|
95
|
-
| `
|
|
106
|
+
| `DSH_AWIKI_USER_SERVICE_URL` | 旧 AWiki user service 绝对 URL | 打包默认槽位 Origin |
|
|
107
|
+
| `DSH_AWIKI_USER_SERVICE_DOMAIN` | 旧 Handle 提供方域名 | 打包默认槽位 DID host |
|
|
108
|
+
| `DSH_AWIKI_LEGACY_TENANT_SLOT` | 有部署证据时对旧状态做一次性官方槽位覆盖 | 未配置;保留历史 `awiki.info` 快照 |
|
|
109
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_URL` | 旧 message service URL | 打包默认槽位 Origin |
|
|
96
110
|
| `DSH_AWIKI_MAIL_SERVICE_URL` | Host 调用的 mail service URL | 解析后的 user service URL |
|
|
97
|
-
| `DSH_AWIKI_MESSAGE_SERVICE_DID` |
|
|
98
|
-
| `DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL` |
|
|
111
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_DID` | 旧权威消息服务 DID | 打包默认槽位 DID |
|
|
112
|
+
| `DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL` | 旧协议公开 endpoint | 打包默认槽位 Origin |
|
|
99
113
|
| `DSH_AWIKI_ALLOWED_ATTACHMENT_ORIGINS` | 额外附件 HTTPS origin 的 JSON 数组 | `[]` |
|
|
100
114
|
| `DSH_AWIKI_STATE_ROOT` | 私有 Rust IM Core 状态目录 | `$DSH_HOME/awiki/im-core` 或 `~/.dsh/awiki/im-core` |
|
|
101
115
|
| `DSH_ANP_IDENTITY_STATE_ROOT` | 独立的 ANP Identity 多 DID Store | `$DSH_HOME/anp-identity` |
|
|
@@ -126,21 +140,20 @@ AWiki IM Core Provider 和 Summary Provider。浏览器客户端由 DSH 根据
|
|
|
126
140
|
`@awiki/dsh-plugin/model-proxy-contract`。只安装主包时,模型首次引导、账户/充值和
|
|
127
141
|
用量入口保持隐藏,高级 AWiki 设置仍可正常使用。
|
|
128
142
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
`awikiClient` Browser bridge
|
|
132
|
-
|
|
143
|
+
拆包从 `@awiki/dsh-plugin@0.3.0` 与 `@awiki/dsh-model-proxy@0.1.0`
|
|
144
|
+
开始。当前候选 manifest 分别为 `0.3.9` 和 `0.1.4`,Model Proxy 要求主包
|
|
145
|
+
`^0.3.9`,从而让共享 `awikiClient` Browser bridge 与租户 capability 契约保持在同一条
|
|
146
|
+
已审查版本线上。
|
|
133
147
|
|
|
134
148
|
以下环境变量归可选包所有:
|
|
135
149
|
|
|
136
150
|
| 环境变量 | 用途 | 默认值 |
|
|
137
151
|
| --- | --- | --- |
|
|
138
|
-
| `DSH_AWIKI_MODEL_PROXY_URL` | AWiki 托管的 DeepSeek 代理服务根 URL | `https://model.awiki.info` |
|
|
139
152
|
| `DSH_AWIKI_MODEL_CONTEXT_WINDOW` | AWiki 托管模型上下文窗口 | `1000000` |
|
|
140
153
|
| `DSH_AWIKI_MODEL_MAX_TOKENS` | AWiki 托管模型单次最大输出 | `8192` |
|
|
141
154
|
| `DSH_AWIKI_MODEL_TOKEN_REFRESH_SKEW_SECONDS` | 短期 Token 提前刷新秒数 | `60` |
|
|
142
155
|
|
|
143
|
-
插件默认关闭 AWiki
|
|
156
|
+
插件默认关闭 AWiki 托管模型,启用意愿与回退模型按租户分别持久化。用户在首次引导或“设置 → 快速充值 → 账户与充值”明确启用后,
|
|
144
157
|
才注册 `awiki-deepseek` 路由并把 Flash 设为默认模型;停用时会恢复启用前的默认 Provider、
|
|
145
158
|
模型和 reasoning effort。充值到账只刷新余额,不会自动启用 AWiki 或切换当前模型。
|
|
146
159
|
|
|
@@ -158,9 +171,9 @@ AWiki IM Core Provider 和 Summary Provider。浏览器客户端由 DSH 根据
|
|
|
158
171
|
关闭支付平台订单,再恢复金额输入框,并且不会自动创建替代订单。关闭失败时原支付入口继续
|
|
159
172
|
有效;若支付在关闭竞态中先完成,界面会刷新已入账账户,而不会误报订单已取消。
|
|
160
173
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
174
|
+
“设置 → AWiki”分为“租户”“设备”“本地数据”“临时消息集成”四个页签。注册前、恢复中、退出后和
|
|
175
|
+
登录后都可进入同一租户面板。切换成功前先打开目标 Scope;任一步失败都会重建旧运行时。
|
|
176
|
+
旧 `awiki.domain` 设置仅作为迁移输入,并继续引用原有状态路径。
|
|
164
177
|
|
|
165
178
|
设置页通过插件自有的 Connection 通道访问 Host,Host 只接受 loopback 来源。
|
|
166
179
|
因此独立安装的 `@awiki/dsh-plugin` 无需修改 DSH 核心设置白名单;非本机浏览器来源不能
|
|
@@ -192,6 +205,10 @@ DSH Session route 和消息 watermark 按身份隔离持久化,重启后可续
|
|
|
192
205
|
创建并 attach 到已注册的共享 AWiki Workspace。Listener 消息始终是不可信用户数据,不会自动批准
|
|
193
206
|
工具,也不会桥接 approval 或 user-question prompt。
|
|
194
207
|
|
|
208
|
+
Host-only realtime diagnostics 另外保留最近一次成功同步的分页数、hydrated 消息数和
|
|
209
|
+
`olderHistoryExcluded`。它们只用于安全诊断;不会暴露 cursor、page ref、token、manifest、消息正文,
|
|
210
|
+
也不会进入 Browser Remote、Agent 工具或模型上下文。
|
|
211
|
+
|
|
195
212
|
默认附件上限为解码后 10 MiB;反向代理请求体上限至少应为 14 MiB,以容纳
|
|
196
213
|
base64 与 JSON 封装开销。
|
|
197
214
|
|
|
@@ -233,20 +250,33 @@ redirect,由 Rust 自动选择当前 origin 的进程内 Bearer Token 或新 H
|
|
|
233
250
|
|
|
234
251
|
## 开发与验证
|
|
235
252
|
|
|
253
|
+
依赖模式、个人配置及跨仓 PR 提交规则见 [Debug / registry / 源码联调](docs/dependency-modes.md)。
|
|
254
|
+
默认使用 registry,显式本地联调用 `pnpm run build:local`,正式构建用 `pnpm run build:release`。
|
|
255
|
+
首次切换需要按该文档确认依赖已发布并刷新 registry lock;旧 workspace 锁不能作为线上安装证据。
|
|
256
|
+
|
|
236
257
|
需要 Node.js 22.19+(或 24+)以及 pnpm 11.22:
|
|
237
258
|
|
|
238
259
|
```bash
|
|
239
260
|
pnpm install --frozen-lockfile
|
|
240
261
|
pnpm run verify:workspace
|
|
262
|
+
pnpm run e2e:smoke
|
|
263
|
+
DSH_AWIKI_E2E_CONFIG=/absolute/path/to/rwiki-cn-testing.json pnpm run e2e:live
|
|
241
264
|
pnpm pack --dry-run
|
|
242
265
|
```
|
|
243
266
|
|
|
244
|
-
|
|
267
|
+
`e2e:smoke` 使用 Playwright Chromium,把当前 tarball 安装到隔离的真实 DSH Web profile,
|
|
268
|
+
通过 Harness 自带的首次运行对话框并打开 AWiki 身份入口;它不发送 OTP。受保护的 `e2e:live`
|
|
269
|
+
在 `rwiki-cn-testing` 上创建一个 DSH 身份和一个真实 CLI Peer,验证双向私聊、群聊及同 root
|
|
270
|
+
Harness 重启,并要求 artifact secret scan 与 exact managed cleanup 零残留。当前完成门禁以
|
|
271
|
+
无桌面 Linux Chromium headless 为准;WebKit 只保留为后续可选兼容性检查。详见
|
|
272
|
+
[Web E2E 技术方案](docs/e2e-automation-testing-cli-peer.md)。
|
|
273
|
+
|
|
274
|
+
生产 Host 加载固定版本 `@awiki/im-core-node@0.2.3`;平台原生 addon 由它的
|
|
245
275
|
optional dependencies 选择,并保持在 JavaScript bundle 外。使用者无需安装 Rust,
|
|
246
276
|
也无需检出 `awiki-cli-rs2`。来源与许可证见 `THIRD_PARTY_NOTICES.md`。
|
|
247
277
|
|
|
248
278
|
Typert Host/Remote 产物与当前 Host 契约一同提交;在独立 Typert 生成器支持根级
|
|
249
|
-
包之前,`pnpm check:generated` 会固定检查完整的
|
|
279
|
+
包之前,`pnpm check:generated` 会固定检查完整的 58 个 Remote 方法。
|
|
250
280
|
|
|
251
281
|
## 安全
|
|
252
282
|
|
|
@@ -257,3 +287,7 @@ Typert Host/Remote 产物与当前 Host 契约一同提交;在独立 Typert
|
|
|
257
287
|
|
|
258
288
|
插件使用 MIT 许可证;Rust IM Core 运行时依赖使用 AGPL-3.0-only,并继续适用其
|
|
259
289
|
自带的许可证与声明。
|
|
290
|
+
|
|
291
|
+
### 群成员与发送人名称
|
|
292
|
+
|
|
293
|
+
Host `getDisplayProfiles` 返回 Core 本地展示投影并调度后台刷新;Browser 沿用会话轮询更新成员与发送人,首帧无需等待公开资料网络请求。刷新按 DID 去重,Core 管理 TTL、失败重试和 owner 隔离,既不创建联系人也不创建 Direct 会话。成功的空昵称回退到 Handle/DID,网络失败保留已缓存名称;身份切换和会话切换后的旧结果不回写界面。该路径使用 Node native API v14,必须与本地 Core Node 包配套构建。
|
package/cordis.patch.yml
CHANGED
|
@@ -6,13 +6,15 @@
|
|
|
6
6
|
- id: awiki
|
|
7
7
|
name: '@awiki/dsh-plugin'
|
|
8
8
|
config:
|
|
9
|
-
userServiceUrl: !!js process.env.DSH_AWIKI_USER_SERVICE_URL
|
|
10
|
-
userServiceDomain: !!js process.env.DSH_AWIKI_USER_SERVICE_DOMAIN
|
|
11
|
-
|
|
9
|
+
userServiceUrl: !!js process.env.DSH_AWIKI_USER_SERVICE_URL
|
|
10
|
+
userServiceDomain: !!js process.env.DSH_AWIKI_USER_SERVICE_DOMAIN
|
|
11
|
+
legacyTenantSlot: !!js process.env.DSH_AWIKI_LEGACY_TENANT_SLOT
|
|
12
|
+
messageServiceUrl: !!js process.env.DSH_AWIKI_MESSAGE_SERVICE_URL
|
|
12
13
|
mailServiceUrl: !!js process.env.DSH_AWIKI_MAIL_SERVICE_URL
|
|
13
|
-
messageServiceDid: !!js process.env.DSH_AWIKI_MESSAGE_SERVICE_DID
|
|
14
|
-
messageServicePublicUrl: !!js process.env.DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL
|
|
14
|
+
messageServiceDid: !!js process.env.DSH_AWIKI_MESSAGE_SERVICE_DID
|
|
15
|
+
messageServicePublicUrl: !!js process.env.DSH_AWIKI_MESSAGE_SERVICE_PUBLIC_URL
|
|
15
16
|
allowedAttachmentOrigins: !!js JSON.parse(process.env.DSH_AWIKI_ALLOWED_ATTACHMENT_ORIGINS ?? '[]')
|
|
17
|
+
allowInsecureLoopbackForTesting: !!js process.env.DSH_AWIKI_ALLOW_INSECURE_LOOPBACK_FOR_TESTING === 'true'
|
|
16
18
|
stateRoot: !!js process.env.DSH_AWIKI_STATE_ROOT
|
|
17
19
|
pollIntervalMs: !!js Number(process.env.DSH_AWIKI_POLL_INTERVAL_MS ?? '5000')
|
|
18
20
|
attachmentMaxBytes: !!js Number(process.env.DSH_AWIKI_ATTACHMENT_MAX_BYTES ?? '10485760')
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"default_slot": "primary",
|
|
4
|
+
"tenants": {
|
|
5
|
+
"primary": {
|
|
6
|
+
"display_name": {
|
|
7
|
+
"zh-CN": "AWiki 中国(上海)",
|
|
8
|
+
"en": "AWiki China (Shanghai)"
|
|
9
|
+
},
|
|
10
|
+
"backend_origin": "https://awiki.me",
|
|
11
|
+
"did_host": "awiki.me"
|
|
12
|
+
},
|
|
13
|
+
"secondary": {
|
|
14
|
+
"display_name": {
|
|
15
|
+
"zh-CN": "AWiki 全球(硅谷)",
|
|
16
|
+
"en": "AWiki Global (Silicon Valley)"
|
|
17
|
+
},
|
|
18
|
+
"backend_origin": "https://awiki.ai",
|
|
19
|
+
"did_host": "awiki.ai"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0c4809aabb37d4d2237a6b55a0ccf3cb2049af69b049ad3514d7558a416f9bdc
|