@awiki/dsh-plugin 0.3.7 → 0.3.11-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -73
- package/README.zh.md +91 -62
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/cordis.patch.yml +6 -5
- package/lib/builtin-tenants.json +22 -0
- package/lib/builtin-tenants.sha256 +1 -0
- package/lib/client.js +9281 -2379
- package/lib/client.js.map +1 -1
- package/lib/index.js +3553 -1138
- package/lib/model-proxy-contract.js +19 -11
- package/lib/provider.js +73 -17
- package/lib/{sdk-adapter--trNlr-T.mjs → sdk-adapter-CYcJH7sM.mjs} +374 -101
- package/lib/typert.host.js +1595 -168
- package/lib/typert.remote-client.d.ts +43 -7
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +1595 -168
- 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 +33 -0
- package/lib/types/client/AwikiDevices.d.ts.map +1 -0
- package/lib/types/client/AwikiDevices.js +141 -0
- package/lib/types/client/AwikiDevices.js.map +1 -0
- 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 +17 -8
- package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -1
- package/lib/types/client/AwikiIdentityAccess.js +269 -37
- 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 +1 -1
- package/lib/types/client/AwikiMail.d.ts.map +1 -1
- package/lib/types/client/AwikiMail.js +17 -137
- 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 -28
- 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 +6 -1
- package/lib/types/client/AwikiRecoveryForm.d.ts.map +1 -1
- package/lib/types/client/AwikiRecoveryForm.js +74 -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 +2 -2
- 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 +92 -44
- package/lib/types/client/controller.d.ts.map +1 -1
- package/lib/types/client/controller.js +761 -334
- 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 +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +64 -19
- 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 +7 -0
- package/lib/types/client/otp-cooldown.d.ts.map +1 -0
- package/lib/types/client/otp-cooldown.js +29 -0
- package/lib/types/client/otp-cooldown.js.map +1 -0
- package/lib/types/client/settings-controller.d.ts +38 -2
- package/lib/types/client/settings-controller.d.ts.map +1 -1
- package/lib/types/client/settings-controller.js +206 -10
- 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 +192 -14
- package/lib/types/client/settings-locales.js.map +1 -1
- package/lib/types/client/slots.d.ts +21 -10
- 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/client/store.d.ts +1 -1
- package/lib/types/client/store.d.ts.map +1 -1
- package/lib/types/client/store.js +1 -1
- package/lib/types/client/store.js.map +1 -1
- package/lib/types/conversation-preferences.d.ts.map +1 -1
- package/lib/types/conversation-preferences.js +0 -17
- package/lib/types/conversation-preferences.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 +165 -41
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +1594 -535
- 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/listener-state.d.ts +5 -3
- package/lib/types/listener-state.d.ts.map +1 -1
- package/lib/types/listener-state.js +28 -13
- package/lib/types/listener-state.js.map +1 -1
- package/lib/types/listener.d.ts +9 -32
- package/lib/types/listener.d.ts.map +1 -1
- package/lib/types/listener.js +13 -128
- package/lib/types/listener.js.map +1 -1
- 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/mail.d.ts +2 -28
- package/lib/types/mail.d.ts.map +1 -1
- package/lib/types/mail.js +2 -79
- package/lib/types/mail.js.map +1 -1
- package/lib/types/model-proxy-contract.d.ts +8 -8
- package/lib/types/model-proxy-contract.d.ts.map +1 -1
- package/lib/types/model-proxy-contract.js +15 -8
- 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 +2 -13
- package/lib/types/profile-state.d.ts.map +1 -1
- package/lib/types/profile-state.js +3 -20
- package/lib/types/profile-state.js.map +1 -1
- package/lib/types/provider-api.d.ts +134 -43
- package/lib/types/provider-api.d.ts.map +1 -1
- package/lib/types/provider.d.ts +8 -2
- package/lib/types/provider.d.ts.map +1 -1
- package/lib/types/provider.js +76 -16
- package/lib/types/provider.js.map +1 -1
- package/lib/types/realtime-supervisor.d.ts +60 -0
- package/lib/types/realtime-supervisor.d.ts.map +1 -0
- package/lib/types/realtime-supervisor.js +255 -0
- package/lib/types/realtime-supervisor.js.map +1 -0
- package/lib/types/registration-policy.d.ts +7 -0
- package/lib/types/registration-policy.d.ts.map +1 -0
- package/lib/types/registration-policy.js +21 -0
- package/lib/types/registration-policy.js.map +1 -0
- package/lib/types/sdk-adapter.d.ts +62 -11
- package/lib/types/sdk-adapter.d.ts.map +1 -1
- package/lib/types/sdk-adapter.js +285 -123
- package/lib/types/sdk-adapter.js.map +1 -1
- package/lib/types/settings-rpc-contract.d.ts +63 -5
- package/lib/types/settings-rpc-contract.d.ts.map +1 -1
- package/lib/types/settings-rpc-contract.js +108 -5
- 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 +132 -3
- package/lib/types/settings-rpc.js.map +1 -1
- package/lib/types/settings-transport.d.ts +7 -0
- package/lib/types/settings-transport.d.ts.map +1 -0
- package/lib/types/settings-transport.js +52 -0
- package/lib/types/settings-transport.js.map +1 -0
- 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/tools.d.ts +1 -1
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/tools.js +4 -20
- package/lib/types/tools.js.map +1 -1
- package/lib/types/types.d.ts +249 -66
- 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 +88 -61
- package/lib/types/base64.d.ts +0 -4
- package/lib/types/base64.d.ts.map +0 -1
- package/lib/types/base64.js +0 -28
- package/lib/types/base64.js.map +0 -1
- package/lib/types/client/mail-attachment.d.ts +0 -40
- package/lib/types/client/mail-attachment.d.ts.map +0 -1
- package/lib/types/client/mail-attachment.js +0 -187
- package/lib/types/client/mail-attachment.js.map +0 -1
- package/lib/types/sent-mail-store.d.ts +0 -27
- package/lib/types/sent-mail-store.d.ts.map +0 -1
- package/lib/types/sent-mail-store.js +0 -348
- package/lib/types/sent-mail-store.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awiki/dsh-plugin",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.11-rc.1",
|
|
4
4
|
"description": "AWiki identity and messaging plugin for DeepSeek Harness",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -65,6 +65,33 @@
|
|
|
65
65
|
"THIRD_PARTY_NOTICES.md",
|
|
66
66
|
"LICENSE"
|
|
67
67
|
],
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build:types": "tsc -p tsconfig.host.json && tsc -p tsconfig.client.json",
|
|
70
|
+
"build:typert": "node scripts/generate-typert.mjs",
|
|
71
|
+
"build:bundle": "pnpm run build:typert && tsdown && node scripts/normalize-built.mjs",
|
|
72
|
+
"build": "node scripts/sync-package-versions.mjs && node scripts/build.mjs",
|
|
73
|
+
"update:migration-contract": "node scripts/update-migration-contract.mjs",
|
|
74
|
+
"build:raw": "pnpm run build:types && pnpm run build:bundle",
|
|
75
|
+
"typecheck": "tsc -p tsconfig.host.json --noEmit && tsc -p tsconfig.client.json --noEmit",
|
|
76
|
+
"typecheck:e2e": "tsc -p tsconfig.e2e.json --noEmit",
|
|
77
|
+
"test": "vitest run",
|
|
78
|
+
"e2e:smoke": "node tests/e2e/support/run-e2e.ts smoke",
|
|
79
|
+
"e2e:smoke:webkit": "node tests/e2e/support/run-e2e.ts smoke-webkit",
|
|
80
|
+
"e2e:live": "node tests/e2e/support/run-e2e.ts live",
|
|
81
|
+
"prepare:test-native": "node scripts/prepare-e2e-native-fixtures.mjs",
|
|
82
|
+
"check:generated": "node scripts/sync-package-versions.mjs --check && node scripts/check-generated.mjs",
|
|
83
|
+
"check:public": "node scripts/check-public.mjs",
|
|
84
|
+
"verify": "pnpm run test:dependencies && pnpm run check:public && pnpm run build && pnpm run typecheck && pnpm run typecheck:e2e && pnpm run check:generated && pnpm run prepare:test-native && pnpm run test",
|
|
85
|
+
"verify:workspace": "pnpm run verify && pnpm --filter @awiki/dsh-model-proxy run verify",
|
|
86
|
+
"verify:candidate": "node scripts/verify-release-candidate.mjs",
|
|
87
|
+
"prepack": "pnpm run verify",
|
|
88
|
+
"build:registry": "python3 scripts/dependencies/run.py",
|
|
89
|
+
"build:local": "python3 scripts/dependencies/run.py --deps local --local-config dependencies.local.json",
|
|
90
|
+
"build:release": "python3 scripts/dependencies/run.py --profile release",
|
|
91
|
+
"check:dependencies": "node scripts/check-dependency-sources.mjs",
|
|
92
|
+
"prepublishOnly": "node scripts/check-release-dependencies.mjs",
|
|
93
|
+
"test:dependencies": "python3 -m unittest discover -s scripts/dependencies -p \"test_*.py\" -v && node --test scripts/dependencies/source-lock.test.mjs"
|
|
94
|
+
},
|
|
68
95
|
"keywords": [
|
|
69
96
|
"awiki",
|
|
70
97
|
"deepseek",
|
|
@@ -92,7 +119,7 @@
|
|
|
92
119
|
},
|
|
93
120
|
"client": {
|
|
94
121
|
"inject": [
|
|
95
|
-
"@deepseek-ai/dsh-client-
|
|
122
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
96
123
|
"@deepseek-ai/dsh-api-remotes",
|
|
97
124
|
"@deepseek-ai/dsh-client-connection",
|
|
98
125
|
"@deepseek-ai/dsh-client-locale",
|
|
@@ -103,30 +130,34 @@
|
|
|
103
130
|
}
|
|
104
131
|
},
|
|
105
132
|
"dependencies": {
|
|
106
|
-
"@awiki/im-core-node": "0.
|
|
133
|
+
"@awiki/im-core-node": "0.2.5",
|
|
107
134
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
135
|
+
"semver": "7.8.5",
|
|
108
136
|
"zod": "^4.4.3"
|
|
109
137
|
},
|
|
110
138
|
"peerDependencies": {
|
|
111
|
-
"@
|
|
112
|
-
"@deepseek-ai/
|
|
113
|
-
"@deepseek-ai/dsh-agent
|
|
114
|
-
"@deepseek-ai/dsh-
|
|
115
|
-
"@deepseek-ai/dsh-
|
|
116
|
-
"@deepseek-ai/dsh-
|
|
117
|
-
"@deepseek-ai/dsh-client-
|
|
118
|
-
"@deepseek-ai/dsh-client-
|
|
119
|
-
"@deepseek-ai/dsh-client-
|
|
120
|
-
"@deepseek-ai/dsh-client-ui-
|
|
121
|
-
"@deepseek-ai/dsh-client-ui-
|
|
122
|
-
"@deepseek-ai/dsh-client-ui-
|
|
123
|
-
"@deepseek-ai/dsh-
|
|
124
|
-
"@deepseek-ai/dsh-
|
|
125
|
-
"@deepseek-ai/dsh-
|
|
126
|
-
"@deepseek-ai/dsh-
|
|
127
|
-
"@deepseek-ai/dsh-
|
|
128
|
-
"@deepseek-ai/dsh-
|
|
129
|
-
"@deepseek-ai/dsh-
|
|
139
|
+
"@agent-network-protocol/dsh-anp-identity": "^0.1.1",
|
|
140
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
141
|
+
"@deepseek-ai/dsh-agent": "0.1.5-rc.1",
|
|
142
|
+
"@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.1",
|
|
143
|
+
"@deepseek-ai/dsh-api-remotes": "0.1.5-rc.1",
|
|
144
|
+
"@deepseek-ai/dsh-brand": "0.1.5-rc.1",
|
|
145
|
+
"@deepseek-ai/dsh-client-connection": "0.1.5-rc.1",
|
|
146
|
+
"@deepseek-ai/dsh-client-locale": "0.1.5-rc.1",
|
|
147
|
+
"@deepseek-ai/dsh-client-store": "0.1.5-rc.1",
|
|
148
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.5-rc.1",
|
|
149
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.1",
|
|
150
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.1",
|
|
151
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.1",
|
|
152
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.5-rc.1",
|
|
153
|
+
"@deepseek-ai/dsh-invariants": "0.1.5-rc.1",
|
|
154
|
+
"@deepseek-ai/dsh-llm": "0.1.5-rc.1",
|
|
155
|
+
"@deepseek-ai/dsh-session": "0.1.5-rc.1",
|
|
156
|
+
"@deepseek-ai/dsh-settings": "0.1.5-rc.1",
|
|
157
|
+
"@deepseek-ai/dsh-tools": "0.1.5-rc.1",
|
|
158
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.5-rc.1",
|
|
159
|
+
"@deepseek-ai/dsh-util-values": "0.1.5-rc.1",
|
|
160
|
+
"@deepseek-ai/dsh-workspace": "0.1.5-rc.1",
|
|
130
161
|
"react": "^18.2.0"
|
|
131
162
|
},
|
|
132
163
|
"peerDependenciesMeta": {
|
|
@@ -135,36 +166,41 @@
|
|
|
135
166
|
}
|
|
136
167
|
},
|
|
137
168
|
"devDependencies": {
|
|
138
|
-
"@
|
|
169
|
+
"@agent-network-protocol/dsh-anp-identity": "0.1.1",
|
|
170
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
139
171
|
"@deepseek-ai/cordis-plugin-include": "^1.0.6",
|
|
140
|
-
"@deepseek-ai/cordis-plugin-loader": "^1.0.
|
|
141
|
-
"@deepseek-ai/dsh": "0.1.
|
|
142
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
143
|
-
"@deepseek-ai/dsh-agent-default-model": "0.1.
|
|
144
|
-
"@deepseek-ai/dsh-api-remotes": "0.1.
|
|
145
|
-
"@deepseek-ai/dsh-brand": "0.1.
|
|
146
|
-
"@deepseek-ai/dsh-client-connection": "0.1.
|
|
147
|
-
"@deepseek-ai/dsh-client-locale": "0.1.
|
|
148
|
-
"@deepseek-ai/dsh-client-
|
|
149
|
-
"@deepseek-ai/dsh-client-
|
|
150
|
-
"@deepseek-ai/dsh-client-ui-
|
|
151
|
-
"@deepseek-ai/dsh-client-ui-
|
|
152
|
-
"@deepseek-ai/dsh-client-ui-settings": "0.1.
|
|
153
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.
|
|
154
|
-
"@deepseek-ai/dsh-invariants": "0.1.
|
|
155
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
156
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
157
|
-
"@deepseek-ai/dsh-settings": "0.1.
|
|
158
|
-
"@deepseek-ai/dsh-system-prompt": "0.1.
|
|
159
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
160
|
-
"@deepseek-ai/dsh-typert-generator": "0.1.
|
|
161
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.
|
|
162
|
-
"@deepseek-ai/dsh-user-approval": "0.1.
|
|
163
|
-
"@deepseek-ai/dsh-
|
|
172
|
+
"@deepseek-ai/cordis-plugin-loader": "^1.0.3",
|
|
173
|
+
"@deepseek-ai/dsh": "0.1.5-rc.1",
|
|
174
|
+
"@deepseek-ai/dsh-agent": "0.1.5-rc.1",
|
|
175
|
+
"@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.1",
|
|
176
|
+
"@deepseek-ai/dsh-api-remotes": "0.1.5-rc.1",
|
|
177
|
+
"@deepseek-ai/dsh-brand": "0.1.5-rc.1",
|
|
178
|
+
"@deepseek-ai/dsh-client-connection": "0.1.5-rc.1",
|
|
179
|
+
"@deepseek-ai/dsh-client-locale": "0.1.5-rc.1",
|
|
180
|
+
"@deepseek-ai/dsh-client-store": "0.1.5-rc.1",
|
|
181
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.5-rc.1",
|
|
182
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.1",
|
|
183
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.1",
|
|
184
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.1",
|
|
185
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.5-rc.1",
|
|
186
|
+
"@deepseek-ai/dsh-invariants": "0.1.5-rc.1",
|
|
187
|
+
"@deepseek-ai/dsh-llm": "0.1.5-rc.1",
|
|
188
|
+
"@deepseek-ai/dsh-session": "0.1.5-rc.1",
|
|
189
|
+
"@deepseek-ai/dsh-settings": "0.1.5-rc.1",
|
|
190
|
+
"@deepseek-ai/dsh-system-prompt": "0.1.5-rc.1",
|
|
191
|
+
"@deepseek-ai/dsh-tools": "0.1.5-rc.1",
|
|
192
|
+
"@deepseek-ai/dsh-typert-generator": "0.1.5-rc.1",
|
|
193
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.5-rc.1",
|
|
194
|
+
"@deepseek-ai/dsh-user-approval": "0.1.5-rc.1",
|
|
195
|
+
"@deepseek-ai/dsh-util-values": "0.1.5-rc.1",
|
|
196
|
+
"@deepseek-ai/dsh-workspace": "0.1.5-rc.1",
|
|
197
|
+
"@playwright/test": "1.62.1",
|
|
164
198
|
"@testing-library/react": "^16.3.2",
|
|
165
199
|
"@types/node": "^24.3.0",
|
|
166
200
|
"@types/react": "^18.3.23",
|
|
167
201
|
"@types/react-dom": "^18.3.7",
|
|
202
|
+
"@types/semver": "7.7.1",
|
|
203
|
+
"immer": "10.2.0",
|
|
168
204
|
"jsdom": "^26.1.0",
|
|
169
205
|
"lightningcss": "^1.30.1",
|
|
170
206
|
"qrcode": "1.5.4",
|
|
@@ -173,21 +209,12 @@
|
|
|
173
209
|
"tsdown": "^0.22.14",
|
|
174
210
|
"typescript": "^6.0.3",
|
|
175
211
|
"vite": "^8.2.1",
|
|
176
|
-
"vitest": "^4.1.10"
|
|
212
|
+
"vitest": "^4.1.10",
|
|
213
|
+
"yaml": "2.9.0",
|
|
214
|
+
"zustand": "4.4.7"
|
|
177
215
|
},
|
|
178
216
|
"engines": {
|
|
179
217
|
"node": "^22.19.0 || >=24.0.0"
|
|
180
218
|
},
|
|
181
|
-
"
|
|
182
|
-
|
|
183
|
-
"build:typert": "node scripts/generate-typert.mjs",
|
|
184
|
-
"build:bundle": "pnpm run build:typert && tsdown && node scripts/normalize-built.mjs",
|
|
185
|
-
"build": "pnpm run build:types && pnpm run build:bundle",
|
|
186
|
-
"typecheck": "tsc -p tsconfig.host.json --noEmit && tsc -p tsconfig.client.json --noEmit && tsc -p tsconfig.system.json",
|
|
187
|
-
"test": "vitest run",
|
|
188
|
-
"check:generated": "node scripts/check-generated.mjs",
|
|
189
|
-
"check:public": "node scripts/check-public.mjs",
|
|
190
|
-
"verify": "pnpm run check:public && pnpm run build && pnpm run typecheck && pnpm run check:generated && pnpm run test",
|
|
191
|
-
"verify:workspace": "pnpm run verify && pnpm --filter @awiki/dsh-model-proxy run verify"
|
|
192
|
-
}
|
|
193
|
-
}
|
|
219
|
+
"packageManager": "pnpm@11.22.0"
|
|
220
|
+
}
|
package/lib/types/base64.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** Linear-time standard Base64 syntax validation for bounded binary payloads. */
|
|
2
|
-
/** Reject misplaced padding and non-Base64 bytes without recursive regexp matching. */
|
|
3
|
-
export declare function standardBase64Syntax(value: string): boolean;
|
|
4
|
-
//# sourceMappingURL=base64.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/base64.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAUjF,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAY3D"}
|
package/lib/types/base64.js
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/** Linear-time standard Base64 syntax validation for bounded binary payloads. */
|
|
2
|
-
function base64Character(code) {
|
|
3
|
-
return (code >= 0x41 && code <= 0x5a)
|
|
4
|
-
|| (code >= 0x61 && code <= 0x7a)
|
|
5
|
-
|| (code >= 0x30 && code <= 0x39)
|
|
6
|
-
|| code === 0x2b
|
|
7
|
-
|| code === 0x2f;
|
|
8
|
-
}
|
|
9
|
-
/** Reject misplaced padding and non-Base64 bytes without recursive regexp matching. */
|
|
10
|
-
export function standardBase64Syntax(value) {
|
|
11
|
-
if (value.length % 4 !== 0)
|
|
12
|
-
return false;
|
|
13
|
-
let dataEnd = value.length;
|
|
14
|
-
if (dataEnd > 0 && value.charCodeAt(dataEnd - 1) === 0x3d)
|
|
15
|
-
dataEnd -= 1;
|
|
16
|
-
if (dataEnd > 0 && value.charCodeAt(dataEnd - 1) === 0x3d)
|
|
17
|
-
dataEnd -= 1;
|
|
18
|
-
for (let index = 0; index < dataEnd; index += 1) {
|
|
19
|
-
if (!base64Character(value.charCodeAt(index)))
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
for (let index = dataEnd; index < value.length; index += 1) {
|
|
23
|
-
if (value.charCodeAt(index) !== 0x3d)
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=base64.js.map
|
package/lib/types/base64.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/base64.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;WAChC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;WAC9B,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;WAC9B,IAAI,KAAK,IAAI;WACb,IAAI,KAAK,IAAI,CAAA;AACpB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IACxC,IAAI,OAAO,GAAG,KAAK,CAAC,MAAM,CAAA;IAC1B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAA;IACvE,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAA;IACvE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IAC7D,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;IACpD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/** Browser-only mail attachment selection, encoding, integrity, and download helpers. */
|
|
2
|
-
import type { AwikiDownloadedMailAttachment, AwikiMailAttachmentDownloadRequest, AwikiMailAttachmentMetadata, AwikiMailSendAttachment } from '@awiki/dsh-plugin/types';
|
|
3
|
-
import type { AwikiActionResult } from './controller.ts';
|
|
4
|
-
export interface BrowserMailAttachmentLimits {
|
|
5
|
-
readonly maxCount: number;
|
|
6
|
-
readonly maxBytes: number;
|
|
7
|
-
readonly totalMaxBytes: number;
|
|
8
|
-
}
|
|
9
|
-
export interface SelectedMailAttachment {
|
|
10
|
-
readonly id: string;
|
|
11
|
-
readonly file: File;
|
|
12
|
-
readonly fileName: string;
|
|
13
|
-
readonly contentType: string;
|
|
14
|
-
readonly sizeBytes: number;
|
|
15
|
-
readonly lastModified: number;
|
|
16
|
-
}
|
|
17
|
-
export interface DownloadableMailAttachment {
|
|
18
|
-
readonly index: number;
|
|
19
|
-
readonly fileName: string;
|
|
20
|
-
readonly contentType: string;
|
|
21
|
-
readonly sizeBytes: number;
|
|
22
|
-
}
|
|
23
|
-
export interface PreparedMailAttachmentDownload {
|
|
24
|
-
readonly fileName: string;
|
|
25
|
-
readonly contentType: string;
|
|
26
|
-
readonly bytes: Uint8Array<ArrayBuffer>;
|
|
27
|
-
}
|
|
28
|
-
/** Append browser File references after enforcing the exact Host-owned limits. */
|
|
29
|
-
export declare function selectMailAttachments(current: readonly SelectedMailAttachment[], selected: Iterable<File>, limits: BrowserMailAttachmentLimits, createId: () => string): readonly SelectedMailAttachment[];
|
|
30
|
-
/** Re-read the same approved File objects and return JSON-safe Remote attachments. */
|
|
31
|
-
export declare function encodeMailAttachments(attachments: readonly SelectedMailAttachment[], limits: BrowserMailAttachmentLimits): Promise<readonly AwikiMailSendAttachment[]>;
|
|
32
|
-
/** Return canonical download metadata only when the service supplied every required field. */
|
|
33
|
-
export declare function downloadableMailAttachment(value: AwikiMailAttachmentMetadata, maxBytes: number): DownloadableMailAttachment | undefined;
|
|
34
|
-
/** Validate exact metadata, canonical Base64, byte length, and SHA-256 before download. */
|
|
35
|
-
export declare function prepareMailAttachmentDownload(value: AwikiDownloadedMailAttachment, expected: DownloadableMailAttachment, maxBytes: number): Promise<PreparedMailAttachmentDownload>;
|
|
36
|
-
/** Trigger one download and always revoke the temporary object URL immediately. */
|
|
37
|
-
export declare function savePreparedMailAttachment(value: PreparedMailAttachmentDownload): void;
|
|
38
|
-
/** Execute the exact Browser UI download path: Remote, integrity check, Blob, and save click. */
|
|
39
|
-
export declare function downloadAndSaveMailAttachment(download: (request: AwikiMailAttachmentDownloadRequest) => Promise<AwikiActionResult<AwikiDownloadedMailAttachment>>, request: AwikiMailAttachmentDownloadRequest, expected: DownloadableMailAttachment, maxBytes: number, active?: () => boolean): Promise<boolean>;
|
|
40
|
-
//# sourceMappingURL=mail-attachment.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-attachment.d.ts","sourceRoot":"","sources":["../../../src/client/mail-attachment.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,KAAK,EACV,6BAA6B,EAC7B,kCAAkC,EAClC,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,CAAA;CACxC;AA+CD,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,EACxB,MAAM,EAAE,2BAA2B,EACnC,QAAQ,EAAE,MAAM,MAAM,GACrB,SAAS,sBAAsB,EAAE,CAuBnC;AAED,sFAAsF;AACtF,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CA4B7C;AAED,8FAA8F;AAC9F,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,2BAA2B,EAClC,QAAQ,EAAE,MAAM,GACf,0BAA0B,GAAG,SAAS,CAgBxC;AAED,2FAA2F;AAC3F,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,6BAA6B,EACpC,QAAQ,EAAE,0BAA0B,EACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,8BAA8B,CAAC,CA4BzC;AAED,mFAAmF;AACnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,8BAA8B,GAAG,IAAI,CAatF;AAED,iGAAiG;AACjG,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,CACR,OAAO,EAAE,kCAAkC,KACxC,OAAO,CAAC,iBAAiB,CAAC,6BAA6B,CAAC,CAAC,EAC9D,OAAO,EAAE,kCAAkC,EAC3C,QAAQ,EAAE,0BAA0B,EACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,OAAoB,GACjC,OAAO,CAAC,OAAO,CAAC,CAQlB"}
|
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
/** Browser-only mail attachment selection, encoding, integrity, and download helpers. */
|
|
2
|
-
import { standardBase64Syntax } from "../base64.js";
|
|
3
|
-
function invalid(message) {
|
|
4
|
-
throw new TypeError(message);
|
|
5
|
-
}
|
|
6
|
-
function fileName(value) {
|
|
7
|
-
if (value.length === 0
|
|
8
|
-
|| value.trim() !== value
|
|
9
|
-
|| value.replace(/[. ]+$/u, '') !== value
|
|
10
|
-
|| value === '.'
|
|
11
|
-
|| value === '..'
|
|
12
|
-
|| new TextEncoder().encode(value).byteLength > 255
|
|
13
|
-
|| /[\\/\p{C}]/u.test(value)) {
|
|
14
|
-
invalid('附件文件名无效。');
|
|
15
|
-
}
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
function contentType(value) {
|
|
19
|
-
if (value === '')
|
|
20
|
-
return 'application/octet-stream';
|
|
21
|
-
if (!/^[A-Za-z0-9!#$&^_.+-]+\/[A-Za-z0-9!#$&^_.+-]+$/u.test(value)) {
|
|
22
|
-
invalid('附件 MIME 类型无效。');
|
|
23
|
-
}
|
|
24
|
-
return value;
|
|
25
|
-
}
|
|
26
|
-
function assertLimits(limits) {
|
|
27
|
-
if (!Number.isSafeInteger(limits.maxCount)
|
|
28
|
-
|| limits.maxCount < 0
|
|
29
|
-
|| !Number.isSafeInteger(limits.maxBytes)
|
|
30
|
-
|| limits.maxBytes < 1
|
|
31
|
-
|| !Number.isSafeInteger(limits.totalMaxBytes)
|
|
32
|
-
|| limits.totalMaxBytes < limits.maxBytes) {
|
|
33
|
-
invalid('邮件附件限制暂不可用。');
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function base64(bytes) {
|
|
37
|
-
let binary = '';
|
|
38
|
-
const chunkSize = 0x8000;
|
|
39
|
-
for (let offset = 0; offset < bytes.length; offset += chunkSize) {
|
|
40
|
-
binary += String.fromCharCode(...bytes.subarray(offset, offset + chunkSize));
|
|
41
|
-
}
|
|
42
|
-
return btoa(binary);
|
|
43
|
-
}
|
|
44
|
-
/** Append browser File references after enforcing the exact Host-owned limits. */
|
|
45
|
-
export function selectMailAttachments(current, selected, limits, createId) {
|
|
46
|
-
assertLimits(limits);
|
|
47
|
-
const additions = Array.from(selected, (file) => ({
|
|
48
|
-
id: createId(),
|
|
49
|
-
file,
|
|
50
|
-
fileName: fileName(file.name),
|
|
51
|
-
contentType: contentType(file.type),
|
|
52
|
-
sizeBytes: file.size,
|
|
53
|
-
lastModified: file.lastModified,
|
|
54
|
-
}));
|
|
55
|
-
const combined = [...current, ...additions];
|
|
56
|
-
if (combined.length > limits.maxCount)
|
|
57
|
-
invalid(`邮件最多选择 ${limits.maxCount} 个附件。`);
|
|
58
|
-
for (const attachment of combined) {
|
|
59
|
-
if (!Number.isSafeInteger(attachment.sizeBytes) || attachment.sizeBytes < 0)
|
|
60
|
-
invalid('附件大小无效。');
|
|
61
|
-
if (attachment.sizeBytes > limits.maxBytes) {
|
|
62
|
-
invalid(`单个附件不能超过 ${limits.maxBytes} bytes。`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const total = combined.reduce((sum, attachment) => sum + attachment.sizeBytes, 0);
|
|
66
|
-
if (!Number.isSafeInteger(total) || total > limits.totalMaxBytes) {
|
|
67
|
-
invalid(`附件总大小不能超过 ${limits.totalMaxBytes} bytes。`);
|
|
68
|
-
}
|
|
69
|
-
return combined;
|
|
70
|
-
}
|
|
71
|
-
/** Re-read the same approved File objects and return JSON-safe Remote attachments. */
|
|
72
|
-
export async function encodeMailAttachments(attachments, limits) {
|
|
73
|
-
selectMailAttachments([], attachments.map(value => value.file), limits, () => 'validation-only');
|
|
74
|
-
const encoded = [];
|
|
75
|
-
for (const attachment of attachments) {
|
|
76
|
-
if (attachment.file.name !== attachment.fileName
|
|
77
|
-
|| contentType(attachment.file.type) !== attachment.contentType
|
|
78
|
-
|| attachment.file.size !== attachment.sizeBytes
|
|
79
|
-
|| attachment.file.lastModified !== attachment.lastModified) {
|
|
80
|
-
invalid(`附件 ${attachment.fileName} 已发生变化,请重新选择。`);
|
|
81
|
-
}
|
|
82
|
-
let buffer;
|
|
83
|
-
try {
|
|
84
|
-
buffer = await attachment.file.arrayBuffer();
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
invalid(`无法读取附件 ${attachment.fileName},请重新选择。`);
|
|
88
|
-
}
|
|
89
|
-
const bytes = new Uint8Array(buffer);
|
|
90
|
-
if (bytes.byteLength !== attachment.sizeBytes) {
|
|
91
|
-
invalid(`附件 ${attachment.fileName} 的大小已发生变化,请重新选择。`);
|
|
92
|
-
}
|
|
93
|
-
encoded.push({
|
|
94
|
-
fileName: attachment.fileName,
|
|
95
|
-
contentType: attachment.contentType,
|
|
96
|
-
sizeBytes: bytes.byteLength,
|
|
97
|
-
bytesBase64: base64(bytes),
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
return encoded;
|
|
101
|
-
}
|
|
102
|
-
/** Return canonical download metadata only when the service supplied every required field. */
|
|
103
|
-
export function downloadableMailAttachment(value, maxBytes) {
|
|
104
|
-
if (!Number.isSafeInteger(value.index) || value.index < 0 || value.index > 0xffff_ffff)
|
|
105
|
-
return undefined;
|
|
106
|
-
if (value.fileName === undefined || value.contentType === undefined || value.sizeBytes === undefined)
|
|
107
|
-
return undefined;
|
|
108
|
-
if (!/^(?:0|[1-9][0-9]*)$/u.test(value.sizeBytes))
|
|
109
|
-
return undefined;
|
|
110
|
-
const sizeBytes = Number(value.sizeBytes);
|
|
111
|
-
if (!Number.isSafeInteger(sizeBytes) || sizeBytes < 0 || sizeBytes > maxBytes)
|
|
112
|
-
return undefined;
|
|
113
|
-
try {
|
|
114
|
-
return {
|
|
115
|
-
index: value.index,
|
|
116
|
-
fileName: fileName(value.fileName),
|
|
117
|
-
contentType: contentType(value.contentType),
|
|
118
|
-
sizeBytes,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
return undefined;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/** Validate exact metadata, canonical Base64, byte length, and SHA-256 before download. */
|
|
126
|
-
export async function prepareMailAttachmentDownload(value, expected, maxBytes) {
|
|
127
|
-
if (fileName(value.fileName) !== expected.fileName
|
|
128
|
-
|| contentType(value.contentType) !== expected.contentType
|
|
129
|
-
|| value.sizeBytes !== expected.sizeBytes
|
|
130
|
-
|| value.sizeBytes > maxBytes) {
|
|
131
|
-
invalid('下载附件与邮件元数据不一致。');
|
|
132
|
-
}
|
|
133
|
-
if (!/^[a-f0-9]{64}$/u.test(value.sha256))
|
|
134
|
-
invalid('下载附件完整性信息无效。');
|
|
135
|
-
const expectedEncodedLength = Math.ceil(value.sizeBytes / 3) * 4;
|
|
136
|
-
if (value.bytesBase64.length !== expectedEncodedLength
|
|
137
|
-
|| value.bytesBase64.length % 4 !== 0
|
|
138
|
-
|| !standardBase64Syntax(value.bytesBase64)) {
|
|
139
|
-
invalid('下载附件编码无效。');
|
|
140
|
-
}
|
|
141
|
-
let binary;
|
|
142
|
-
try {
|
|
143
|
-
binary = atob(value.bytesBase64);
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
invalid('下载附件编码无效。');
|
|
147
|
-
}
|
|
148
|
-
const bytes = Uint8Array.from(binary, character => character.charCodeAt(0));
|
|
149
|
-
if (bytes.byteLength !== value.sizeBytes || base64(bytes) !== value.bytesBase64) {
|
|
150
|
-
invalid('下载附件大小或编码不一致。');
|
|
151
|
-
}
|
|
152
|
-
const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', bytes));
|
|
153
|
-
const sha256 = Array.from(digest, byte => byte.toString(16).padStart(2, '0')).join('');
|
|
154
|
-
if (sha256 !== value.sha256)
|
|
155
|
-
invalid('下载附件完整性校验失败。');
|
|
156
|
-
return { fileName: expected.fileName, contentType: expected.contentType, bytes };
|
|
157
|
-
}
|
|
158
|
-
/** Trigger one download and always revoke the temporary object URL immediately. */
|
|
159
|
-
export function savePreparedMailAttachment(value) {
|
|
160
|
-
const url = URL.createObjectURL(new Blob([value.bytes], { type: value.contentType }));
|
|
161
|
-
const anchor = document.createElement('a');
|
|
162
|
-
try {
|
|
163
|
-
anchor.href = url;
|
|
164
|
-
anchor.download = value.fileName;
|
|
165
|
-
anchor.hidden = true;
|
|
166
|
-
document.body.append(anchor);
|
|
167
|
-
anchor.click();
|
|
168
|
-
}
|
|
169
|
-
finally {
|
|
170
|
-
anchor.remove();
|
|
171
|
-
URL.revokeObjectURL(url);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/** Execute the exact Browser UI download path: Remote, integrity check, Blob, and save click. */
|
|
175
|
-
export async function downloadAndSaveMailAttachment(download, request, expected, maxBytes, active = () => true) {
|
|
176
|
-
const result = await download(request);
|
|
177
|
-
if (!active())
|
|
178
|
-
return false;
|
|
179
|
-
if (!result.ok)
|
|
180
|
-
invalid(result.error);
|
|
181
|
-
const prepared = await prepareMailAttachmentDownload(result.value, expected, maxBytes);
|
|
182
|
-
if (!active())
|
|
183
|
-
return false;
|
|
184
|
-
savePreparedMailAttachment(prepared);
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=mail-attachment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail-attachment.js","sourceRoot":"","sources":["../../../src/client/mail-attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/** Private, owner-bound persistence for mail successfully sent by this installation. */
|
|
2
|
-
import type { AwikiValidatedMailSendRequest } from './mail.ts';
|
|
3
|
-
import type { AwikiDid, AwikiMailAccount, AwikiMailInboxPage, AwikiMailInboxRequest, AwikiMailMessage, AwikiMailMessageId, AwikiMailSendResult } from './types.ts';
|
|
4
|
-
export declare const LOCAL_SENT_MAIL_ID_PREFIX = "awiki-sent-v1:";
|
|
5
|
-
export declare function isLocalSentMailId(messageId: AwikiMailMessageId): boolean;
|
|
6
|
-
/** Atomic, bounded history of sends accepted by the Mail Service. */
|
|
7
|
-
export declare class AwikiSentMailStore {
|
|
8
|
-
private readonly hostDirectory;
|
|
9
|
-
private readonly directory;
|
|
10
|
-
private readonly legacyDirectory;
|
|
11
|
-
private mutation;
|
|
12
|
-
constructor(stateRoot: string);
|
|
13
|
-
list(ownerDid: AwikiDid, request: AwikiMailInboxRequest): Promise<AwikiMailInboxPage>;
|
|
14
|
-
read(ownerDid: AwikiDid, messageId: AwikiMailMessageId): Promise<AwikiMailMessage | undefined>;
|
|
15
|
-
append(ownerDid: AwikiDid, request: AwikiValidatedMailSendRequest, result: AwikiMailSendResult, account?: AwikiMailAccount): Promise<void>;
|
|
16
|
-
clear(): Promise<void>;
|
|
17
|
-
resolveAttachment(ownerDid: AwikiDid, messageId: AwikiMailMessageId, attachmentIndex: number): Promise<AwikiMailMessageId | undefined>;
|
|
18
|
-
private clearDirectory;
|
|
19
|
-
private load;
|
|
20
|
-
private loadFile;
|
|
21
|
-
private write;
|
|
22
|
-
private ensureDirectory;
|
|
23
|
-
private hasDirectory;
|
|
24
|
-
private path;
|
|
25
|
-
private key;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=sent-mail-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sent-mail-store.d.ts","sourceRoot":"","sources":["../../src/sent-mail-store.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAMxF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAA;AAC9D,OAAO,KAAK,EACV,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAA;AASnB,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AA6MzD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAExE;AAED,qEAAqE;AACrE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAmC;gBAEhC,SAAS,EAAE,MAAM;IAMvB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAcrF,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAMpG,MAAM,CACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC;IA6BH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,iBAAiB,CAC5B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,kBAAkB,EAC7B,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;YAQ5B,cAAc;YAcd,IAAI;YAOJ,QAAQ;YAkCR,KAAK;YAgBL,eAAe;YAWf,YAAY;IAW1B,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,GAAG;CAGZ"}
|