@awiki/dsh-plugin 0.2.4 → 0.3.0-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 +131 -22
- package/README.zh.md +110 -20
- package/THIRD_PARTY_NOTICES.md +8 -1
- package/cordis.patch.yml +5 -0
- package/lib/client.js +12534 -2647
- package/lib/client.js.map +1 -1
- package/lib/index.js +2431 -92
- package/lib/model-proxy-contract.js +96 -0
- package/lib/provider.js +4 -1
- package/lib/sdk-adapter-DLhLrLI6.mjs +886 -0
- package/lib/typert.host.js +1269 -534
- package/lib/typert.remote-client.d.ts +47 -1
- package/lib/typert.remote-client.d.ts.map +1 -1
- package/lib/typert.remote-client.js +1254 -141
- package/lib/types/attachment-cache.d.ts +28 -0
- package/lib/types/attachment-cache.d.ts.map +1 -0
- package/lib/types/attachment-cache.js +194 -0
- package/lib/types/attachment-cache.js.map +1 -0
- package/lib/types/client/AwikiGroupDetails.d.ts +16 -0
- package/lib/types/client/AwikiGroupDetails.d.ts.map +1 -0
- package/lib/types/client/AwikiGroupDetails.js +108 -0
- package/lib/types/client/AwikiGroupDetails.js.map +1 -0
- package/lib/types/client/AwikiIdentityAccess.d.ts +21 -0
- package/lib/types/client/AwikiIdentityAccess.d.ts.map +1 -0
- package/lib/types/client/AwikiIdentityAccess.js +148 -0
- package/lib/types/client/AwikiIdentityAccess.js.map +1 -0
- package/lib/types/client/AwikiIdentityPage.d.ts +11 -0
- package/lib/types/client/AwikiIdentityPage.d.ts.map +1 -0
- package/lib/types/client/AwikiIdentityPage.js +8 -0
- package/lib/types/client/AwikiIdentityPage.js.map +1 -0
- package/lib/types/client/AwikiMail.d.ts +15 -0
- package/lib/types/client/AwikiMail.d.ts.map +1 -0
- package/lib/types/client/AwikiMail.js +380 -0
- package/lib/types/client/AwikiMail.js.map +1 -0
- package/lib/types/client/AwikiOnboarding.d.ts +22 -0
- package/lib/types/client/AwikiOnboarding.d.ts.map +1 -0
- package/lib/types/client/AwikiOnboarding.js +104 -0
- package/lib/types/client/AwikiOnboarding.js.map +1 -0
- package/lib/types/client/AwikiOverlay.d.ts +10 -0
- package/lib/types/client/AwikiOverlay.d.ts.map +1 -1
- package/lib/types/client/AwikiOverlay.js +370 -127
- package/lib/types/client/AwikiOverlay.js.map +1 -1
- package/lib/types/client/AwikiProfileCard.d.ts +9 -0
- package/lib/types/client/AwikiProfileCard.d.ts.map +1 -0
- package/lib/types/client/AwikiProfileCard.js +90 -0
- package/lib/types/client/AwikiProfileCard.js.map +1 -0
- package/lib/types/client/AwikiRecoveryForm.d.ts +24 -0
- package/lib/types/client/AwikiRecoveryForm.d.ts.map +1 -0
- package/lib/types/client/AwikiRecoveryForm.js +148 -0
- package/lib/types/client/AwikiRecoveryForm.js.map +1 -0
- package/lib/types/client/AwikiSettingsSection.d.ts +18 -4
- package/lib/types/client/AwikiSettingsSection.d.ts.map +1 -1
- package/lib/types/client/AwikiSettingsSection.js +277 -23
- package/lib/types/client/AwikiSettingsSection.js.map +1 -1
- package/lib/types/client/MentionText.d.ts +7 -0
- package/lib/types/client/MentionText.d.ts.map +1 -0
- package/lib/types/client/MentionText.js +10 -0
- package/lib/types/client/MentionText.js.map +1 -0
- package/lib/types/client/RechargeComingSoonDialog.d.ts +11 -0
- package/lib/types/client/RechargeComingSoonDialog.d.ts.map +1 -0
- package/lib/types/client/RechargeComingSoonDialog.js +8 -0
- package/lib/types/client/RechargeComingSoonDialog.js.map +1 -0
- package/lib/types/client/controller.d.ts +174 -4
- package/lib/types/client/controller.d.ts.map +1 -1
- package/lib/types/client/controller.js +975 -79
- package/lib/types/client/controller.js.map +1 -1
- package/lib/types/client/image-cache.d.ts +20 -0
- package/lib/types/client/image-cache.d.ts.map +1 -0
- package/lib/types/client/image-cache.js +177 -0
- package/lib/types/client/image-cache.js.map +1 -0
- package/lib/types/client/index.d.ts +2 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +102 -42
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/mail-list-cache.d.ts +15 -0
- package/lib/types/client/mail-list-cache.d.ts.map +1 -0
- package/lib/types/client/mail-list-cache.js +212 -0
- package/lib/types/client/mail-list-cache.js.map +1 -0
- package/lib/types/client/mentions.d.ts +51 -0
- package/lib/types/client/mentions.d.ts.map +1 -0
- package/lib/types/client/mentions.js +165 -0
- package/lib/types/client/mentions.js.map +1 -0
- package/lib/types/client/model-availability-controller.d.ts +27 -0
- package/lib/types/client/model-availability-controller.d.ts.map +1 -0
- package/lib/types/client/model-availability-controller.js +111 -0
- package/lib/types/client/model-availability-controller.js.map +1 -0
- package/lib/types/client/model-proxy-controller.d.ts +45 -0
- package/lib/types/client/model-proxy-controller.d.ts.map +1 -0
- package/lib/types/client/model-proxy-controller.js +306 -0
- package/lib/types/client/model-proxy-controller.js.map +1 -0
- package/lib/types/client/recharge-availability.d.ts +6 -0
- package/lib/types/client/recharge-availability.d.ts.map +1 -0
- package/lib/types/client/recharge-availability.js +6 -0
- package/lib/types/client/recharge-availability.js.map +1 -0
- 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 +186 -8
- package/lib/types/client/settings-locales.js.map +1 -1
- package/lib/types/client/slots.d.ts +34 -2
- package/lib/types/client/slots.d.ts.map +1 -1
- package/lib/types/index.d.ts +95 -7
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +968 -37
- package/lib/types/index.js.map +1 -1
- package/lib/types/listener-state.d.ts +23 -0
- package/lib/types/listener-state.d.ts.map +1 -0
- package/lib/types/listener-state.js +124 -0
- package/lib/types/listener-state.js.map +1 -0
- package/lib/types/listener.d.ts +96 -0
- package/lib/types/listener.d.ts.map +1 -0
- package/lib/types/listener.js +575 -0
- package/lib/types/listener.js.map +1 -0
- package/lib/types/mail.d.ts +8 -0
- package/lib/types/mail.d.ts.map +1 -0
- package/lib/types/mail.js +75 -0
- package/lib/types/mail.js.map +1 -0
- package/lib/types/model-proxy-contract.d.ts +67 -0
- package/lib/types/model-proxy-contract.d.ts.map +1 -0
- package/lib/types/model-proxy-contract.js +135 -0
- package/lib/types/model-proxy-contract.js.map +1 -0
- package/lib/types/provider-api.d.ts +106 -2
- package/lib/types/provider-api.d.ts.map +1 -1
- package/lib/types/provider.d.ts.map +1 -1
- package/lib/types/provider.js +3 -0
- package/lib/types/provider.js.map +1 -1
- package/lib/types/sdk-adapter.d.ts +43 -2
- package/lib/types/sdk-adapter.d.ts.map +1 -1
- package/lib/types/sdk-adapter.js +622 -24
- package/lib/types/sdk-adapter.js.map +1 -1
- package/lib/types/sent-mail-store.d.ts +22 -0
- package/lib/types/sent-mail-store.d.ts.map +1 -0
- package/lib/types/sent-mail-store.js +246 -0
- package/lib/types/sent-mail-store.js.map +1 -0
- package/lib/types/tools.d.ts +10 -0
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/tools.js +98 -0
- package/lib/types/tools.js.map +1 -1
- package/lib/types/types.d.ts +254 -2
- package/lib/types/types.d.ts.map +1 -1
- package/lib/types/types.js.map +1 -1
- package/package.json +31 -17
- package/lib/sdk-adapter-DK6RqV-c.mjs +0 -355
|
@@ -3,8 +3,12 @@ import awikiRemote from '@awiki/dsh-plugin/remote';
|
|
|
3
3
|
import { AWIKI_DOMAIN_FIELD, normalizeAwikiDomain, } from "../domain.js";
|
|
4
4
|
import { AWIKI_CLEAR_LOCAL_DATA_CONFIRMATION, AWIKI_LOGOUT_CONFIRMATION } from "../types.js";
|
|
5
5
|
import { AwikiController } from "./controller.js";
|
|
6
|
+
import { AwikiOnboarding } from "./AwikiOnboarding.js";
|
|
6
7
|
import { AwikiOverlay } from "./AwikiOverlay.js";
|
|
7
8
|
import { AwikiSettingsSection } from "./AwikiSettingsSection.js";
|
|
9
|
+
import { ModelAvailabilityController } from "./model-availability-controller.js";
|
|
10
|
+
import { AwikiModelProxyController } from "./model-proxy-controller.js";
|
|
11
|
+
import { AWIKI_RECHARGE_ENABLED } from "./recharge-availability.js";
|
|
8
12
|
import { createAwikiOverlayStore } from "./store.js";
|
|
9
13
|
import { en, zh } from "./settings-locales.js";
|
|
10
14
|
import { AwikiSettingsController } from "./settings-controller.js";
|
|
@@ -20,8 +24,11 @@ export async function apply(ctx) {
|
|
|
20
24
|
const disposeRemote = await ctx.remote.$mount(awikiRemote);
|
|
21
25
|
let disposeOverlay;
|
|
22
26
|
let disposeSettings;
|
|
27
|
+
let disposeOnboarding;
|
|
23
28
|
let settingsController;
|
|
24
|
-
let
|
|
29
|
+
let modelController;
|
|
30
|
+
let availabilityController;
|
|
31
|
+
let awikiController;
|
|
25
32
|
try {
|
|
26
33
|
const remote = ctx.get('remote.awiki');
|
|
27
34
|
if (remote === undefined)
|
|
@@ -31,50 +38,88 @@ export async function apply(ctx) {
|
|
|
31
38
|
throw new Error('ui-awiki: Connection service is unavailable');
|
|
32
39
|
const settings = new AwikiSettingsController(connection);
|
|
33
40
|
settingsController = settings;
|
|
34
|
-
|
|
41
|
+
const awiki = new AwikiController(remote);
|
|
42
|
+
awikiController = awiki;
|
|
43
|
+
const availability = new ModelAvailabilityController(connection);
|
|
44
|
+
availabilityController = availability;
|
|
45
|
+
const models = new AwikiModelProxyController(connection, awiki, AWIKI_RECHARGE_ENABLED);
|
|
46
|
+
modelController = models;
|
|
47
|
+
await Promise.all([settings.load(), models.probe()]);
|
|
35
48
|
ctx.effect(() => {
|
|
36
49
|
const disposeZh = ctx.locale.register('settings.awiki', 'zh', zh);
|
|
37
50
|
const disposeEn = ctx.locale.register('settings.awiki', 'en', en);
|
|
38
51
|
return () => { disposeEn(); disposeZh(); };
|
|
39
52
|
}, 'ui-awiki: settings dictionaries');
|
|
53
|
+
ctx.effect(() => {
|
|
54
|
+
const refresh = () => { availability.refreshIfLoaded(); };
|
|
55
|
+
const disposers = [
|
|
56
|
+
ctx.remote.$on('settings/document-updated', refresh),
|
|
57
|
+
ctx.remote.$on('credentials/updated', refresh),
|
|
58
|
+
ctx.remote.$on('llm/adapters-updated', refresh),
|
|
59
|
+
ctx.on('connection/reset', refresh),
|
|
60
|
+
];
|
|
61
|
+
return () => { for (const dispose of disposers)
|
|
62
|
+
dispose(); };
|
|
63
|
+
}, 'ui-awiki: model availability invalidations');
|
|
40
64
|
disposeOverlay = ctx.slots.inject('shell.overlay', () => {
|
|
41
|
-
const controller = new AwikiController(remote);
|
|
42
|
-
activeController = controller;
|
|
43
65
|
const dispose = ctx.slots.register({
|
|
44
66
|
name: 'shell.overlay',
|
|
45
67
|
id: 'awiki',
|
|
46
68
|
order: 20,
|
|
47
69
|
store: createAwikiOverlayStore,
|
|
48
70
|
inject: () => ({
|
|
49
|
-
hooks: { awiki
|
|
50
|
-
open: () =>
|
|
51
|
-
close: () => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
71
|
+
hooks: { awiki },
|
|
72
|
+
open: () => awiki.open(),
|
|
73
|
+
close: () => { awiki.close(); },
|
|
74
|
+
inspectIdentityAccess: request => awiki.inspectIdentityAccess(request),
|
|
75
|
+
sendRegistrationOtp: request => awiki.sendRegistrationOtp(request),
|
|
76
|
+
registerIdentity: request => awiki.registerIdentity(request),
|
|
77
|
+
updateDisplayName: displayName => awiki.updateDisplayName(displayName),
|
|
78
|
+
updateProfile: request => awiki.updateProfile(request),
|
|
79
|
+
sendRecoveryOtp: request => awiki.sendRecoveryOtp(request),
|
|
80
|
+
prepareRecovery: request => awiki.prepareRecovery(request),
|
|
81
|
+
activateRecovery: () => awiki.activateRecovery(),
|
|
82
|
+
refreshRecoveryStatus: () => awiki.refreshRecoveryStatus(),
|
|
83
|
+
resumeRecovery: () => awiki.resumeRecovery(),
|
|
84
|
+
discardRecovery: () => awiki.discardRecovery(),
|
|
85
|
+
loadMoreConversations: () => awiki.loadMoreConversations(),
|
|
86
|
+
retryGroupRebindRecovery: () => awiki.retryGroupRebindRecovery(),
|
|
87
|
+
startDirectChat: handle => awiki.startDirectChat(handle),
|
|
88
|
+
createGroup: (name, members) => awiki.createGroup(name, members),
|
|
89
|
+
joinGroup: groupDid => awiki.joinGroup(groupDid),
|
|
90
|
+
refreshSelectedGroup: () => awiki.refreshSelectedGroup(),
|
|
91
|
+
loadMoreGroupMembers: () => awiki.loadMoreGroupMembers(),
|
|
92
|
+
addSelectedGroupMember: member => awiki.addSelectedGroupMember(member),
|
|
93
|
+
removeSelectedGroupMember: member => awiki.removeSelectedGroupMember(member),
|
|
94
|
+
leaveSelectedGroup: () => awiki.leaveSelectedGroup(),
|
|
95
|
+
selectConversation: conversationId => awiki.selectConversation(conversationId),
|
|
96
|
+
markSelectedConversationRead: () => awiki.markSelectedConversationRead(),
|
|
97
|
+
loadOlderHistory: () => awiki.loadOlderHistory(),
|
|
98
|
+
summarizeConversation: () => awiki.summarizeConversation(),
|
|
99
|
+
setSummaryCollapsed: (conversationId, collapsed) => { awiki.setSummaryCollapsed(conversationId, collapsed); },
|
|
100
|
+
sendText: (text, clientMessageId, mentions) => awiki.sendText(text, clientMessageId, mentions),
|
|
101
|
+
sendAttachment: file => awiki.sendAttachment(file),
|
|
102
|
+
downloadAttachment: (messageId, attachmentId) => awiki.downloadAttachment(messageId, attachmentId),
|
|
103
|
+
logout: () => awiki.logout({ confirmation: AWIKI_LOGOUT_CONFIRMATION }),
|
|
104
|
+
login: () => awiki.login(),
|
|
105
|
+
clearLocalIdentity: async () => {
|
|
106
|
+
const result = await awiki.clearLocalData({ confirmation: AWIKI_CLEAR_LOCAL_DATA_CONFIRMATION });
|
|
107
|
+
return result.ok ? { ok: true, value: undefined } : result;
|
|
108
|
+
},
|
|
109
|
+
getMailAccount: () => awiki.getMailAccount(),
|
|
110
|
+
listMailInbox: request => awiki.listMailInbox(request),
|
|
111
|
+
readMail: request => awiki.readMail(request),
|
|
112
|
+
markMailRead: request => awiki.markMailRead(request),
|
|
113
|
+
sendMail: request => awiki.sendMail(request),
|
|
67
114
|
}),
|
|
68
115
|
}, AwikiOverlay);
|
|
69
|
-
return
|
|
70
|
-
dispose();
|
|
71
|
-
controller.dispose();
|
|
72
|
-
if (activeController === controller)
|
|
73
|
-
activeController = undefined;
|
|
74
|
-
};
|
|
116
|
+
return dispose;
|
|
75
117
|
});
|
|
76
118
|
const injectedSettings = () => ({
|
|
77
|
-
hooks: { awikiSettings: settings },
|
|
119
|
+
hooks: { awikiSettings: settings, awikiModelProxy: models, awikiSession: awiki },
|
|
120
|
+
identity: awiki,
|
|
121
|
+
models,
|
|
122
|
+
rechargeEnabled: AWIKI_RECHARGE_ENABLED,
|
|
78
123
|
saveDomain: async (raw) => {
|
|
79
124
|
const domain = normalizeAwikiDomain(raw);
|
|
80
125
|
await settings.set(AWIKI_DOMAIN_FIELD, domain);
|
|
@@ -93,17 +138,9 @@ export async function apply(ctx) {
|
|
|
93
138
|
}
|
|
94
139
|
},
|
|
95
140
|
clearLocalData: async () => {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const result = await controller.clearLocalData({ confirmation: AWIKI_CLEAR_LOCAL_DATA_CONFIRMATION });
|
|
100
|
-
if (!result.ok)
|
|
101
|
-
throw new Error(result.error);
|
|
102
|
-
}
|
|
103
|
-
finally {
|
|
104
|
-
if (temporary)
|
|
105
|
-
controller.dispose();
|
|
106
|
-
}
|
|
141
|
+
const result = await awiki.clearLocalData({ confirmation: AWIKI_CLEAR_LOCAL_DATA_CONFIRMATION });
|
|
142
|
+
if (!result.ok)
|
|
143
|
+
throw new Error(result.error);
|
|
107
144
|
},
|
|
108
145
|
});
|
|
109
146
|
disposeSettings = ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
@@ -114,15 +151,38 @@ export async function apply(ctx) {
|
|
|
114
151
|
locale: 'settings.awiki',
|
|
115
152
|
inject: injectedSettings,
|
|
116
153
|
}, AwikiSettingsSection));
|
|
154
|
+
disposeOnboarding = ctx.slots.inject('settings.onboarding', () => ctx.slots.register({
|
|
155
|
+
name: 'settings.onboarding',
|
|
156
|
+
id: 'awiki-model-proxy',
|
|
157
|
+
order: -10,
|
|
158
|
+
locale: 'settings.awiki',
|
|
159
|
+
inject: () => ({
|
|
160
|
+
hooks: { awikiOnboarding: awiki, awikiModelAvailability: availability, awikiModelProxy: models },
|
|
161
|
+
identity: awiki,
|
|
162
|
+
availability,
|
|
163
|
+
models,
|
|
164
|
+
rechargeEnabled: AWIKI_RECHARGE_ENABLED,
|
|
165
|
+
}),
|
|
166
|
+
}, AwikiOnboarding));
|
|
117
167
|
}
|
|
118
168
|
catch (error) {
|
|
169
|
+
disposeOnboarding?.();
|
|
170
|
+
disposeSettings?.();
|
|
171
|
+
disposeOverlay?.();
|
|
172
|
+
modelController?.dispose();
|
|
173
|
+
availabilityController?.dispose();
|
|
174
|
+
awikiController?.dispose();
|
|
119
175
|
settingsController?.dispose();
|
|
120
176
|
await disposeRemote();
|
|
121
177
|
throw error;
|
|
122
178
|
}
|
|
123
179
|
return async () => {
|
|
124
|
-
|
|
125
|
-
|
|
180
|
+
disposeOnboarding?.();
|
|
181
|
+
disposeSettings?.();
|
|
182
|
+
disposeOverlay?.();
|
|
183
|
+
modelController?.dispose();
|
|
184
|
+
availabilityController?.dispose();
|
|
185
|
+
awikiController?.dispose();
|
|
126
186
|
settingsController?.dispose();
|
|
127
187
|
await disposeRemote();
|
|
128
188
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAItF,OAAO,WAAW,MAAM,0BAA0B,CAAA;AAMlD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,mCAAmC,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAE,eAAe,EAAoB,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAoB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAA8B,MAAM,2BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Bounded browser cache for mailbox summaries. Message bodies are never persisted here. */
|
|
2
|
+
import type { AwikiDid, AwikiMailInboxPage } from '@awiki/dsh-plugin/types';
|
|
3
|
+
export type CachedMailFolder = 'inbox' | 'sent';
|
|
4
|
+
export declare const MAIL_LIST_CACHE_MAX_AGE_MS: number;
|
|
5
|
+
/** Stable owner known before Mail Account loads, preventing cache data from crossing identities. */
|
|
6
|
+
export declare function mailListCacheOwner(ownerDid: AwikiDid): string | undefined;
|
|
7
|
+
/** Read one fresh, owner-bound cache entry. Invalid or expired data is discarded. */
|
|
8
|
+
export declare function readMailListCache(storage: Storage, ownerDid: AwikiDid, folder: CachedMailFolder, now?: number): AwikiMailInboxPage | undefined;
|
|
9
|
+
/** Persist one bounded list projection. Failures never block live mailbox behavior. */
|
|
10
|
+
export declare function writeMailListCache(storage: Storage, ownerDid: AwikiDid, folder: CachedMailFolder, page: AwikiMailInboxPage, now?: number): void;
|
|
11
|
+
/** Restore the last folder selected for one AWiki identity. */
|
|
12
|
+
export declare function readMailFolderCache(storage: Storage, ownerDid: AwikiDid): CachedMailFolder;
|
|
13
|
+
/** Remember the current folder without storing any message content. */
|
|
14
|
+
export declare function writeMailFolderCache(storage: Storage, ownerDid: AwikiDid, folder: CachedMailFolder): void;
|
|
15
|
+
//# sourceMappingURL=mail-list-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-list-cache.d.ts","sourceRoot":"","sources":["../../../src/client/mail-list-cache.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAE5F,OAAO,KAAK,EACV,QAAQ,EACR,kBAAkB,EAGnB,MAAM,yBAAyB,CAAA;AAEhC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAA;AAa/C,eAAO,MAAM,0BAA0B,QAA2B,CAAA;AAgFlE,oGAAoG;AACpG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAOzE;AAcD,qFAAqF;AACrF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,gBAAgB,EACxB,GAAG,SAAa,GACf,kBAAkB,GAAG,SAAS,CAwDhC;AAED,uFAAuF;AACvF,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,kBAAkB,EACxB,GAAG,SAAa,GACf,IAAI,CAmBN;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAQ1F;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAQzG"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/** Bounded browser cache for mailbox summaries. Message bodies are never persisted here. */
|
|
2
|
+
const CACHE_VERSION = 2;
|
|
3
|
+
const CACHE_PREFIX = 'awiki:mail-list:v2:';
|
|
4
|
+
const FOLDER_PREFIX = 'awiki:mail-folder:v1:';
|
|
5
|
+
const MAX_ITEMS = 200;
|
|
6
|
+
const MAX_CACHE_CHARACTERS = 768 * 1024;
|
|
7
|
+
const MAX_PARTICIPANTS = 20;
|
|
8
|
+
const MAX_ADDRESS_CHARACTERS = 320;
|
|
9
|
+
const MAX_SUBJECT_CHARACTERS = 4_096;
|
|
10
|
+
const MAX_PREVIEW_CHARACTERS = 16_384;
|
|
11
|
+
const MAX_TOKEN_CHARACTERS = 2_048;
|
|
12
|
+
const CLOCK_SKEW_MS = 5 * 60 * 1_000;
|
|
13
|
+
export const MAIL_LIST_CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1_000;
|
|
14
|
+
function validString(value, maxCharacters, allowEmpty = true) {
|
|
15
|
+
return typeof value === 'string'
|
|
16
|
+
&& (allowEmpty || value.length > 0)
|
|
17
|
+
&& Array.from(value).length <= maxCharacters
|
|
18
|
+
&& !/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/u.test(value);
|
|
19
|
+
}
|
|
20
|
+
function stringArray(value) {
|
|
21
|
+
if (!Array.isArray(value) || value.length > MAX_PARTICIPANTS)
|
|
22
|
+
return undefined;
|
|
23
|
+
const items = [];
|
|
24
|
+
for (const item of value) {
|
|
25
|
+
if (!validString(item, MAX_ADDRESS_CHARACTERS, false))
|
|
26
|
+
return undefined;
|
|
27
|
+
items.push(item);
|
|
28
|
+
}
|
|
29
|
+
return items;
|
|
30
|
+
}
|
|
31
|
+
function optionalString(value, maxCharacters) {
|
|
32
|
+
if (value === undefined)
|
|
33
|
+
return undefined;
|
|
34
|
+
return validString(value, maxCharacters) ? value : false;
|
|
35
|
+
}
|
|
36
|
+
function decodeSummary(input, folder) {
|
|
37
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input))
|
|
38
|
+
return undefined;
|
|
39
|
+
const value = input;
|
|
40
|
+
const from = stringArray(value.from);
|
|
41
|
+
const to = stringArray(value.to);
|
|
42
|
+
const cc = stringArray(value.cc);
|
|
43
|
+
const storedFolder = optionalString(value.folder, 32);
|
|
44
|
+
const preview = optionalString(value.preview, MAX_PREVIEW_CHARACTERS);
|
|
45
|
+
const receivedAt = optionalString(value.receivedAt, 128);
|
|
46
|
+
const sentAt = optionalString(value.sentAt, 128);
|
|
47
|
+
const attachmentCount = value.attachmentCount;
|
|
48
|
+
if (!validString(value.id, MAX_TOKEN_CHARACTERS, false)
|
|
49
|
+
|| from === undefined
|
|
50
|
+
|| to === undefined
|
|
51
|
+
|| cc === undefined
|
|
52
|
+
|| !validString(value.subject, MAX_SUBJECT_CHARACTERS)
|
|
53
|
+
|| typeof value.subjectTruncated !== 'boolean'
|
|
54
|
+
|| storedFolder === false
|
|
55
|
+
|| (storedFolder !== undefined && storedFolder !== folder)
|
|
56
|
+
|| preview === false
|
|
57
|
+
|| receivedAt === false
|
|
58
|
+
|| sentAt === false
|
|
59
|
+
|| typeof value.previewTruncated !== 'boolean'
|
|
60
|
+
|| typeof value.unread !== 'boolean'
|
|
61
|
+
|| typeof value.hasAttachments !== 'boolean'
|
|
62
|
+
|| (attachmentCount !== undefined
|
|
63
|
+
&& (!Number.isSafeInteger(attachmentCount) || attachmentCount < 0)))
|
|
64
|
+
return undefined;
|
|
65
|
+
return {
|
|
66
|
+
id: value.id,
|
|
67
|
+
...(storedFolder === undefined ? {} : { folder: storedFolder }),
|
|
68
|
+
from,
|
|
69
|
+
to,
|
|
70
|
+
cc,
|
|
71
|
+
subject: value.subject,
|
|
72
|
+
subjectTruncated: value.subjectTruncated,
|
|
73
|
+
...(preview === undefined ? {} : { preview }),
|
|
74
|
+
previewTruncated: value.previewTruncated,
|
|
75
|
+
...(receivedAt === undefined ? {} : { receivedAt }),
|
|
76
|
+
...(sentAt === undefined ? {} : { sentAt }),
|
|
77
|
+
unread: value.unread,
|
|
78
|
+
hasAttachments: value.hasAttachments,
|
|
79
|
+
...(attachmentCount === undefined ? {} : { attachmentCount: attachmentCount }),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Stable owner known before Mail Account loads, preventing cache data from crossing identities. */
|
|
83
|
+
export function mailListCacheOwner(ownerDid) {
|
|
84
|
+
const owner = String(ownerDid);
|
|
85
|
+
return owner.length > 0
|
|
86
|
+
&& Array.from(owner).length <= MAX_TOKEN_CHARACTERS
|
|
87
|
+
&& !/[\s\u0000-\u001f\u007f-\u009f]/u.test(owner)
|
|
88
|
+
? owner
|
|
89
|
+
: undefined;
|
|
90
|
+
}
|
|
91
|
+
function storageKey(owner, folder) {
|
|
92
|
+
return `${CACHE_PREFIX}${encodeURIComponent(owner)}:${folder}`;
|
|
93
|
+
}
|
|
94
|
+
function remove(storage, key) {
|
|
95
|
+
try {
|
|
96
|
+
storage.removeItem(key);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Storage can be unavailable in privacy-restricted or quota-constrained contexts.
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Read one fresh, owner-bound cache entry. Invalid or expired data is discarded. */
|
|
103
|
+
export function readMailListCache(storage, ownerDid, folder, now = Date.now()) {
|
|
104
|
+
const owner = mailListCacheOwner(ownerDid);
|
|
105
|
+
if (owner === undefined)
|
|
106
|
+
return undefined;
|
|
107
|
+
const key = storageKey(owner, folder);
|
|
108
|
+
let raw;
|
|
109
|
+
try {
|
|
110
|
+
raw = storage.getItem(key);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
if (raw === null)
|
|
116
|
+
return undefined;
|
|
117
|
+
if (raw.length > MAX_CACHE_CHARACTERS) {
|
|
118
|
+
remove(storage, key);
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
let parsed;
|
|
122
|
+
try {
|
|
123
|
+
parsed = JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
remove(storage, key);
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
130
|
+
remove(storage, key);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
const value = parsed;
|
|
134
|
+
if (value.version !== CACHE_VERSION
|
|
135
|
+
|| value.owner !== owner
|
|
136
|
+
|| value.folder !== folder
|
|
137
|
+
|| !Number.isSafeInteger(value.savedAt)
|
|
138
|
+
|| value.savedAt < 0
|
|
139
|
+
|| value.savedAt > now + CLOCK_SKEW_MS
|
|
140
|
+
|| now - value.savedAt > MAIL_LIST_CACHE_MAX_AGE_MS
|
|
141
|
+
|| !Array.isArray(value.items)
|
|
142
|
+
|| value.items.length > MAX_ITEMS
|
|
143
|
+
|| typeof value.hasMore !== 'boolean'
|
|
144
|
+
|| (value.nextOffset !== undefined
|
|
145
|
+
&& (!Number.isSafeInteger(value.nextOffset) || value.nextOffset < 0))) {
|
|
146
|
+
remove(storage, key);
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
const items = [];
|
|
150
|
+
for (const item of value.items) {
|
|
151
|
+
const decoded = decodeSummary(item, folder);
|
|
152
|
+
if (decoded === undefined) {
|
|
153
|
+
remove(storage, key);
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
items.push(decoded);
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
items,
|
|
160
|
+
...(value.nextOffset === undefined ? {} : { nextOffset: value.nextOffset }),
|
|
161
|
+
hasMore: value.hasMore,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** Persist one bounded list projection. Failures never block live mailbox behavior. */
|
|
165
|
+
export function writeMailListCache(storage, ownerDid, folder, page, now = Date.now()) {
|
|
166
|
+
const owner = mailListCacheOwner(ownerDid);
|
|
167
|
+
if (owner === undefined || page.items.length > MAX_ITEMS)
|
|
168
|
+
return;
|
|
169
|
+
const stored = {
|
|
170
|
+
version: CACHE_VERSION,
|
|
171
|
+
owner,
|
|
172
|
+
folder,
|
|
173
|
+
savedAt: now,
|
|
174
|
+
items: page.items,
|
|
175
|
+
...(page.nextOffset === undefined ? {} : { nextOffset: page.nextOffset }),
|
|
176
|
+
hasMore: page.hasMore,
|
|
177
|
+
};
|
|
178
|
+
const raw = JSON.stringify(stored);
|
|
179
|
+
if (raw.length > MAX_CACHE_CHARACTERS)
|
|
180
|
+
return;
|
|
181
|
+
try {
|
|
182
|
+
storage.setItem(storageKey(owner, folder), raw);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Caching is opportunistic; live mailbox requests remain authoritative.
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** Restore the last folder selected for one AWiki identity. */
|
|
189
|
+
export function readMailFolderCache(storage, ownerDid) {
|
|
190
|
+
const owner = mailListCacheOwner(ownerDid);
|
|
191
|
+
if (owner === undefined)
|
|
192
|
+
return 'inbox';
|
|
193
|
+
try {
|
|
194
|
+
return storage.getItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`) === 'sent' ? 'sent' : 'inbox';
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return 'inbox';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** Remember the current folder without storing any message content. */
|
|
201
|
+
export function writeMailFolderCache(storage, ownerDid, folder) {
|
|
202
|
+
const owner = mailListCacheOwner(ownerDid);
|
|
203
|
+
if (owner === undefined)
|
|
204
|
+
return;
|
|
205
|
+
try {
|
|
206
|
+
storage.setItem(`${FOLDER_PREFIX}${encodeURIComponent(owner)}`, folder);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Folder restoration is optional and must never block mailbox navigation.
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=mail-list-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-list-cache.js","sourceRoot":"","sources":["../../../src/client/mail-list-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Browser-only AWiki mention editing helpers. All ranges use Unicode code points. */
|
|
2
|
+
import type { AwikiDid, AwikiGroupMemberRecord, AwikiMention } from '@awiki/dsh-plugin/types';
|
|
3
|
+
export interface AwikiMentionDraft {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly start: number;
|
|
6
|
+
readonly end: number;
|
|
7
|
+
readonly surface: string;
|
|
8
|
+
readonly did: AwikiDid;
|
|
9
|
+
readonly displayName?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AwikiMentionQuery {
|
|
12
|
+
readonly start: number;
|
|
13
|
+
readonly end: number;
|
|
14
|
+
readonly query: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AwikiMentionCandidate {
|
|
17
|
+
readonly member: AwikiGroupMemberRecord & {
|
|
18
|
+
readonly did: AwikiDid;
|
|
19
|
+
};
|
|
20
|
+
readonly label: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AwikiMentionSegment {
|
|
23
|
+
readonly text: string;
|
|
24
|
+
readonly mention: boolean;
|
|
25
|
+
readonly id?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Convert a DOM textarea UTF-16 offset into the code-point unit used by ANP-P9. */
|
|
28
|
+
export declare function utf16IndexToCodePointIndex(value: string, utf16Index: number): number;
|
|
29
|
+
/** Convert a code-point range offset back into a DOM textarea UTF-16 offset. */
|
|
30
|
+
export declare function codePointIndexToUtf16Index(value: string, codePointIndex: number): number;
|
|
31
|
+
/** Find an unfinished @query ending at the current caret. */
|
|
32
|
+
export declare function activeMentionQuery(value: string, caret: number): AwikiMentionQuery | null;
|
|
33
|
+
export declare function shortenedDid(did: AwikiDid): string;
|
|
34
|
+
export declare function mentionMemberLabel(member: AwikiGroupMemberRecord & {
|
|
35
|
+
readonly did: AwikiDid;
|
|
36
|
+
}): string;
|
|
37
|
+
/** Keep only active human peers that have a stable DID and are not the current identity. */
|
|
38
|
+
export declare function mentionCandidates(members: readonly AwikiGroupMemberRecord[], currentDid: AwikiDid, query: string): AwikiMentionCandidate[];
|
|
39
|
+
/** Insert a selected candidate at the current query and return the next caret position. */
|
|
40
|
+
export declare function insertMention(value: string, query: AwikiMentionQuery, candidate: AwikiMentionCandidate, id: string): {
|
|
41
|
+
readonly text: string;
|
|
42
|
+
readonly caret: number;
|
|
43
|
+
readonly mention: AwikiMentionDraft;
|
|
44
|
+
};
|
|
45
|
+
/** Shift unaffected ranges after one edit and drop any mention touched by the edit. */
|
|
46
|
+
export declare function transformMentionDrafts(previousText: string, nextText: string, drafts: readonly AwikiMentionDraft[]): AwikiMentionDraft[];
|
|
47
|
+
/** Produce validated protocol mentions; stale or overlapping browser drafts are ignored. */
|
|
48
|
+
export declare function protocolMentions(value: string, drafts: readonly AwikiMentionDraft[]): AwikiMention[];
|
|
49
|
+
/** Split valid mention ranges for visual highlighting; malformed metadata becomes plain text. */
|
|
50
|
+
export declare function mentionSegments(value: string, mentions: readonly AwikiMention[] | undefined): AwikiMentionSegment[];
|
|
51
|
+
//# sourceMappingURL=mentions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/client/mentions.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE7F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAA;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CACrB;AAYD,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAazF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAGlD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,GAAG,MAAM,CAKtG;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,UAAU,EAAE,QAAQ,EACpB,KAAK,EAAE,MAAM,GACZ,qBAAqB,EAAE,CAazB;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,qBAAqB,EAChC,EAAE,EAAE,MAAM,GACT;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAkBxF;AAUD,uFAAuF;AACvF,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,iBAAiB,EAAE,GACnC,iBAAiB,EAAE,CAqBrB;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,iBAAiB,EAAE,GAAG,YAAY,EAAE,CAepG;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAuBnH"}
|