@anionex/dsh-eye-care 0.1.0 → 0.1.2
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/CHANGELOG.md +8 -0
- package/README.i18n.yaml +2 -2
- package/README.md +3 -2
- package/README.zh.md +3 -2
- package/lib/client.js +734 -25
- package/lib/client.js.map +1 -1
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/rpc.js +9 -3
- package/lib/rpc.js.map +1 -1
- package/lib/settings.js +12 -2
- package/lib/settings.js.map +1 -1
- package/lib/shared.js +4 -1
- package/lib/shared.js.map +1 -1
- package/lib/transport.js +63 -0
- package/lib/transport.js.map +1 -0
- package/lib/types/client/controller.d.ts +4 -2
- package/lib/types/client/controller.d.ts.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/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/rpc.d.ts.map +1 -1
- package/lib/types/settings.d.ts +4 -1
- package/lib/types/settings.d.ts.map +1 -1
- package/lib/types/shared.d.ts +2 -0
- package/lib/types/shared.d.ts.map +1 -1
- package/lib/types/transport.d.ts +6 -0
- package/lib/types/transport.d.ts.map +1 -0
- package/package.json +44 -13
- package/src/client/controller.ts +35 -6
- package/src/client/index.tsx +3 -2
- package/src/index.ts +3 -1
- package/src/rpc.ts +9 -3
- package/src/settings.ts +11 -2
- package/src/shared.ts +5 -1
- package/src/transport.ts +57 -0
package/lib/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,OAAO,EAAE,qBAAqB,EAA2B,MAAM,2BAA2B,CAAA;AAE1F,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
|
package/lib/settings.js
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
/** Host-only schema and branded namespace for eye-care settings. */
|
|
2
2
|
import z from '@deepseek-ai/schemastery';
|
|
3
|
-
import
|
|
3
|
+
import SettingsService from '@deepseek-ai/dsh-settings';
|
|
4
4
|
import { DEFAULT_EYE_CARE_SETTINGS, EYE_CARE_INTENSITIES, EYE_CARE_MODES, EYE_CARE_SETTINGS_NAMESPACE, INTENSITY_FIELD, MODE_FIELD, } from "./shared.js";
|
|
5
5
|
/** Branded settings namespace used by the Host service. */
|
|
6
|
-
export const EYE_CARE_SETTINGS_NS =
|
|
6
|
+
export const EYE_CARE_SETTINGS_NS = EYE_CARE_SETTINGS_NAMESPACE;
|
|
7
7
|
/** Host schema for the eye-care settings section. */
|
|
8
8
|
export const EyeCareSettingsSchema = z.object({
|
|
9
9
|
[MODE_FIELD]: z.union([...EYE_CARE_MODES]).default(DEFAULT_EYE_CARE_SETTINGS.mode),
|
|
10
10
|
[INTENSITY_FIELD]: z.union([...EYE_CARE_INTENSITIES]).default(DEFAULT_EYE_CARE_SETTINGS.intensity),
|
|
11
|
+
restoreTheme: z.union(['light', 'dark', 'system']),
|
|
11
12
|
});
|
|
13
|
+
/** Modern Settings projects live Config fields; legacy hosts register a section. */
|
|
14
|
+
export const Config = (() => {
|
|
15
|
+
if (typeof SettingsService.prototype.register === 'function')
|
|
16
|
+
return EyeCareSettingsSchema;
|
|
17
|
+
const schema = new z(EyeCareSettingsSchema.toJSON());
|
|
18
|
+
for (const field of Object.values(schema.dict ?? {}))
|
|
19
|
+
field.meta.volatile = true;
|
|
20
|
+
return schema;
|
|
21
|
+
})();
|
|
12
22
|
//# sourceMappingURL=settings.js.map
|
package/lib/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,eAA2C,MAAM,2BAA2B,CAAA;AACnF,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,EAC3B,eAAe,EACf,UAAU,GAEX,MAAM,aAAa,CAAA;AAEpB,2DAA2D;AAC3D,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAAgD,CAAA;AAEpF,qDAAqD;AACrD,MAAM,CAAC,MAAM,qBAAqB,GAAuB,CAAC,CAAC,MAAM,CAAC;IAChE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC;IAClF,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC;IAClG,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;CACnD,CAAC,CAAA;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,MAAM,GAAuB,CAAC,GAAG,EAAE;IAC9C,IAAI,OAAQ,eAAe,CAAC,SAAoC,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,qBAAqB,CAAA;IACtH,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAuB,CAAA;IAC1E,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IAChF,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,EAAE,CAAA"}
|
package/lib/shared.js
CHANGED
|
@@ -35,7 +35,10 @@ export function decodeEyeCareSettings(value) {
|
|
|
35
35
|
const record = value;
|
|
36
36
|
if (!isEyeCareMode(record[MODE_FIELD]) || !isEyeCareIntensity(record[INTENSITY_FIELD]))
|
|
37
37
|
return undefined;
|
|
38
|
-
|
|
38
|
+
const restoreTheme = record['restoreTheme'];
|
|
39
|
+
if (restoreTheme !== undefined && restoreTheme !== 'light' && restoreTheme !== 'dark' && restoreTheme !== 'system')
|
|
40
|
+
return undefined;
|
|
41
|
+
return { mode: record[MODE_FIELD], intensity: record[INTENSITY_FIELD], ...(restoreTheme === undefined ? {} : { restoreTheme }) };
|
|
39
42
|
}
|
|
40
43
|
/** Decode one complete Host snapshot from the RPC boundary. */
|
|
41
44
|
export function decodeEyeCareSnapshot(value) {
|
package/lib/shared.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,gDAAgD;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AAEvE,uDAAuD;AACvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAU,CAAA;AAQzE,gDAAgD;AAChD,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAA;AAErD,kEAAkE;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAA;AAE/C,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAEhD,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAEhD,iDAAiD;AACjD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAA;AAEhC,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAA;AAE1C,iDAAiD;AACjD,MAAM,CAAC,MAAM,yBAAyB,GAA8B,MAAM,CAAC,MAAM,CAAC;IAChF,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,UAAU;CACtB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
package/lib/transport.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { EYE_CARE_RPC_CHANNEL, EYE_CARE_RPC_READ, EYE_CARE_RPC_SAVE } from "./shared.js";
|
|
2
|
+
export function loopbackAuthority(authority) {
|
|
3
|
+
if (!authority)
|
|
4
|
+
return false;
|
|
5
|
+
try {
|
|
6
|
+
const host = new URL(`http://${authority}`).hostname;
|
|
7
|
+
return host === 'localhost' || host === '[::1]' || /^127\.\d+\.\d+\.\d+$/.test(host);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** The official Connection still owns authentication and the Host/Origin fence. */
|
|
14
|
+
export function installLoopbackTransport(ctx, handle) {
|
|
15
|
+
ctx.inject(['webServer'], web => {
|
|
16
|
+
web.effect(() => web.webServer.register({ kind: 'prefix', path: EYE_CARE_RPC_CHANNEL, handler: async (req, res) => {
|
|
17
|
+
const reject = ctx.connection.requestRejection(req);
|
|
18
|
+
if (reject !== undefined || !loopbackAuthority(req.headers.host)) {
|
|
19
|
+
res.writeHead(reject ?? 403).end('forbidden');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const endpoint = new URL(req.url ?? '/', 'http://localhost').pathname.slice(EYE_CARE_RPC_CHANNEL.length + 1);
|
|
23
|
+
if (req.method !== 'POST' || ![EYE_CARE_RPC_READ, EYE_CARE_RPC_SAVE].includes(endpoint)) {
|
|
24
|
+
res.writeHead(404).end('not found');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (req.headers['content-type']?.split(';')[0]?.trim() !== 'application/json') {
|
|
28
|
+
res.writeHead(415).end('content type must be application/json');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
let size = 0;
|
|
32
|
+
const chunks = [];
|
|
33
|
+
try {
|
|
34
|
+
for await (const chunk of req) {
|
|
35
|
+
const bytes = Buffer.from(chunk);
|
|
36
|
+
size += bytes.length;
|
|
37
|
+
if (size > 65536) {
|
|
38
|
+
res.writeHead(413).end('request too large');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
chunks.push(bytes);
|
|
42
|
+
}
|
|
43
|
+
const message = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
44
|
+
if (message === null || typeof message !== 'object' || !('type' in message) || message.type !== 'client-request'
|
|
45
|
+
|| !('rpcId' in message) || typeof message.rpcId !== 'string' || message.rpcId.length === 0
|
|
46
|
+
|| !('method' in message) || message.method !== endpoint || !('payload' in message)) {
|
|
47
|
+
res.writeHead(400).end('invalid request');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const abort = new AbortController();
|
|
51
|
+
res.once('close', () => abort.abort());
|
|
52
|
+
const result = await handle(endpoint, message.payload, abort.signal, ctx.connection.operator);
|
|
53
|
+
res.writeHead(200, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' });
|
|
54
|
+
res.end(JSON.stringify({ type: 'server-response', rpcId: message.rpcId, result }));
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
if (!res.headersSent)
|
|
58
|
+
res.writeHead(400).end('invalid request');
|
|
59
|
+
}
|
|
60
|
+
} }), 'dsh-eye-care: loopback RPC');
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Eye-care state owner: durable settings synchronization plus theme lifecycle. */
|
|
2
2
|
import type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client';
|
|
3
|
-
import { type SnapshotStore } from '@deepseek-ai/dsh-client-
|
|
3
|
+
import { type SnapshotStore } from '@deepseek-ai/dsh-client-store';
|
|
4
4
|
import type { ThemeRuntime, ThemeSnapshot } from '@deepseek-ai/dsh-client-ui-theme/client';
|
|
5
5
|
import { type EyeCareIntensity, type EyeCareMode, type EyeCareSettings } from '../shared.ts';
|
|
6
6
|
/** State consumed by the General-settings row. */
|
|
@@ -19,7 +19,7 @@ export interface EyeCareState {
|
|
|
19
19
|
/** Inputs isolated for deterministic controller tests. */
|
|
20
20
|
export interface EyeCareControllerOptions {
|
|
21
21
|
/** DSH theme registry. */
|
|
22
|
-
theme: Pick<ThemeRuntime, 'getTheme' | 'setTheme' | 'register'
|
|
22
|
+
theme: Pick<ThemeRuntime, 'getTheme' | 'setTheme' | 'register'> & Partial<Pick<ThemeRuntime, 'overrideTokens'>>;
|
|
23
23
|
/** Snapshot change subscription. */
|
|
24
24
|
subscribeTheme(listener: (snapshot: ThemeSnapshot) => void): () => void;
|
|
25
25
|
/** Loopback-only Connection RPC; absent remote browsers stay process-local. */
|
|
@@ -50,6 +50,8 @@ export declare class EyeCareController {
|
|
|
50
50
|
private acceptedRemoteSnapshot;
|
|
51
51
|
private startupBaseTheme;
|
|
52
52
|
private startupBaseThemeDeadline;
|
|
53
|
+
private removeTokenLayer;
|
|
54
|
+
private activeBaseTheme;
|
|
53
55
|
/**
|
|
54
56
|
* Register the concrete themes and lifecycle listeners.
|
|
55
57
|
* @param options - theme, transport, and system-scheme collaborators.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/client/controller.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AACpF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/client/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** DSH Web browser half for the eye-care profile bundle. */
|
|
2
|
-
import type { ClientContext } from '@deepseek-ai/
|
|
2
|
+
import type { Context as ClientContext } from '@deepseek-ai/cordis';
|
|
3
3
|
import type { ThemeRuntime } from '@deepseek-ai/dsh-client-ui-theme/client';
|
|
4
4
|
import { type EyeCareKey } from './locales.ts';
|
|
5
5
|
/** Required browser services. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,4DAA4D;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,4DAA4D;AAI5D,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,yCAAyC,CAAA;AAO1F,OAAO,EAAU,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAEtD,iCAAiC;AACjC,eAAO,MAAM,MAAM,UAAuD,CAAA;AAE1E,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,iCAAiC;QACjC,kBAAkB,EAAE,UAAU,CAAA;KAC/B;CACF;AAED,6EAA6E;AAC7E,KAAK,oBAAoB,GAAG,aAAa,GAAG;IAAE,KAAK,EAAE,YAAY,CAAA;CAAE,CAAA;AAEnE,qEAAqE;AACrE,wBAAgB,KAAK,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAuCrD;AAED,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import type { Context } from '@deepseek-ai/cordis';
|
|
3
3
|
export { DEFAULT_EYE_CARE_SETTINGS, EYE_CARE_INTENSITIES, EYE_CARE_MODES, EYE_CARE_SETTINGS_NAMESPACE, EYE_CARE_RPC_CHANNEL, EYE_CARE_RPC_READ, EYE_CARE_RPC_SAVE, type EyeCareIntensity, type EyeCareMode, type EyeCareSettings, } from './shared.ts';
|
|
4
4
|
export { EYE_CARE_SETTINGS_NS, EyeCareSettingsSchema } from './settings.ts';
|
|
5
|
+
export { Config } from './settings.ts';
|
|
5
6
|
export { EyeCareRpcBackend } from './rpc.ts';
|
|
6
7
|
/** Required Host capability. */
|
|
7
8
|
export declare const inject: string[];
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,EAC3B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE5C,gCAAgC;AAChC,eAAO,MAAM,MAAM,UAAe,CAAA;AAElC,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,EAC3B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE5C,gCAAgC;AAChC,eAAO,MAAM,MAAM,UAAe,CAAA;AAElC,kFAAkF;AAClF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAIxC"}
|
package/lib/types/rpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/rpc.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAG9E,OAAO,EAML,KAAK,uBAAuB,EAE7B,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/rpc.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAG9E,OAAO,EAML,KAAK,uBAAuB,EAE7B,MAAM,aAAa,CAAA;AAkCpB,0EAA0E;AAC1E,qBAAa,iBAAiB;IAEhB,OAAO,CAAC,QAAQ,CAAC,GAAG;IADhC,yDAAyD;gBAC5B,GAAG,EAAE,OAAO;IAEzC,uDAAuD;IACvD,QAAQ,IAAI,uBAAuB;IAenC,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAuDpC;CACF;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAcpD"}
|
package/lib/types/settings.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/** Host-only schema and branded namespace for eye-care settings. */
|
|
2
2
|
import z from '@deepseek-ai/schemastery';
|
|
3
|
+
import { type SettingsNamespace } from '@deepseek-ai/dsh-settings';
|
|
3
4
|
import { type EyeCareSettings } from './shared.ts';
|
|
4
5
|
/** Branded settings namespace used by the Host service. */
|
|
5
|
-
export declare const EYE_CARE_SETTINGS_NS:
|
|
6
|
+
export declare const EYE_CARE_SETTINGS_NS: SettingsNamespace;
|
|
6
7
|
/** Host schema for the eye-care settings section. */
|
|
7
8
|
export declare const EyeCareSettingsSchema: z<EyeCareSettings>;
|
|
9
|
+
/** Modern Settings projects live Config fields; legacy hosts register a section. */
|
|
10
|
+
export declare const Config: z<EyeCareSettings>;
|
|
8
11
|
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,CAAC,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAwB,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AACnF,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AAEpB,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,EAAkC,iBAAiB,CAAA;AAEpF,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,eAAe,CAInD,CAAA;AAEF,oFAAoF;AACpF,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,eAAe,CAKlC,CAAA"}
|
package/lib/types/shared.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export interface EyeCareSettings {
|
|
|
27
27
|
mode: EyeCareMode;
|
|
28
28
|
/** Warmth applied by the active eye-care palette. */
|
|
29
29
|
intensity: EyeCareIntensity;
|
|
30
|
+
/** Built-in preference to restore after a token-layer host reload. */
|
|
31
|
+
restoreTheme?: 'light' | 'dark' | 'system';
|
|
30
32
|
}
|
|
31
33
|
/** Browser-safe Host snapshot returned through the loopback RPC channel. */
|
|
32
34
|
export interface EyeCareSettingsSnapshot {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/shared.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,gDAAgD;AAChD,eAAO,MAAM,cAAc,2CAA4C,CAAA;AAEvE,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,uCAAwC,CAAA;AAEzE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AAEvD,6BAA6B;AAC7B,MAAM,MAAM,gBAAgB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAElE,gDAAgD;AAChD,eAAO,MAAM,2BAA2B,aAAa,CAAA;AAErD,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,iDAAiD;AACjD,eAAO,MAAM,UAAU,SAAS,CAAA;AAEhC,mDAAmD;AACnD,eAAO,MAAM,eAAe,cAAc,CAAA;AAE1C,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,eAAe,CAG9D,CAAA;AAEF,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,IAAI,EAAE,WAAW,CAAA;IACjB,qDAAqD;IACrD,SAAS,EAAE,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/shared.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,gDAAgD;AAChD,eAAO,MAAM,cAAc,2CAA4C,CAAA;AAEvE,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,uCAAwC,CAAA;AAEzE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;AAEvD,6BAA6B;AAC7B,MAAM,MAAM,gBAAgB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAA;AAElE,gDAAgD;AAChD,eAAO,MAAM,2BAA2B,aAAa,CAAA;AAErD,kEAAkE;AAClE,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAEhD,iDAAiD;AACjD,eAAO,MAAM,UAAU,SAAS,CAAA;AAEhC,mDAAmD;AACnD,eAAO,MAAM,eAAe,cAAc,CAAA;AAE1C,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,eAAe,CAG9D,CAAA;AAEF,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,IAAI,EAAE,WAAW,CAAA;IACjB,qDAAqD;IACrD,SAAS,EAAE,gBAAgB,CAAA;IAC3B,sEAAsE;IACtE,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;CAC3C;AAED,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,uDAAuD;IACvD,aAAa,EAAE,CAAC,CAAA;IAChB,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAA;IACjB,iEAAiE;IACjE,QAAQ,EAAE;QACR,KAAK,EAAE,eAAe,CAAA;QACtB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;CAClD;AAED,qCAAqC;AACrC,MAAM,WAAW,2BAA2B;IAC1C,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,uDAAuD;AACvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,CAOjF;AAED,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS,CAwBzF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
2
|
+
import type { ConnectionRpcHandler } from '@deepseek-ai/dsh-client-connection';
|
|
3
|
+
export declare function loopbackAuthority(authority: string | undefined): boolean;
|
|
4
|
+
/** The official Connection still owns authentication and the Host/Origin fence. */
|
|
5
|
+
export declare function installLoopbackTransport(ctx: Context, handle: ConnectionRpcHandler): void;
|
|
6
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAG9E,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMxE;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAwCzF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anionex/dsh-eye-care",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Warm light, warm dark, and system-aware eye-care themes for DSH Web",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek",
|
|
@@ -43,7 +43,8 @@
|
|
|
43
43
|
"README.i18n.yaml",
|
|
44
44
|
"assets",
|
|
45
45
|
"cordis.patch.yml",
|
|
46
|
-
"LICENSE"
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"CHANGELOG.md"
|
|
47
48
|
],
|
|
48
49
|
"scripts": {
|
|
49
50
|
"build": "node --input-type=module -e \"import { rmSync } from 'node:fs'; for (const path of ['lib', '.client-build']) rmSync(path, { recursive: true, force: true })\" && tsc -p tsconfig.json && tsc -p tsconfig.client.json && tsdown -c tsdown.config.mjs",
|
|
@@ -58,27 +59,42 @@
|
|
|
58
59
|
"client": {
|
|
59
60
|
"platform": "web",
|
|
60
61
|
"inject": [
|
|
62
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
61
63
|
"@deepseek-ai/dsh-client-connection",
|
|
62
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
63
64
|
"@deepseek-ai/dsh-client-locale",
|
|
64
65
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
65
66
|
"@deepseek-ai/dsh-api-remotes",
|
|
66
67
|
"@deepseek-ai/dsh-client-ui-theme"
|
|
67
68
|
]
|
|
69
|
+
},
|
|
70
|
+
"compatibility": {
|
|
71
|
+
"dsh": ">=0.1.0-rc.8 <0.2.0 || 0.2.0-rc.2",
|
|
72
|
+
"dshReleases": {
|
|
73
|
+
"0.1.0-rc.8": "compatible",
|
|
74
|
+
"0.1.1-rc.1": "compatible",
|
|
75
|
+
"0.1.1-rc.2": "compatible",
|
|
76
|
+
"0.1.2-alpha.3": "compatible",
|
|
77
|
+
"0.1.2-alpha.4": "compatible",
|
|
78
|
+
"0.1.2-alpha.5": "compatible",
|
|
79
|
+
"0.2.0-rc.2": "compatible"
|
|
80
|
+
},
|
|
81
|
+
"profiles": [
|
|
82
|
+
"web"
|
|
83
|
+
]
|
|
68
84
|
}
|
|
69
85
|
},
|
|
70
86
|
"peerDependencies": {
|
|
71
|
-
"@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6",
|
|
72
|
-
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6",
|
|
73
|
-
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6",
|
|
74
|
-
"@deepseek-ai/dsh-client-
|
|
75
|
-
"@deepseek-ai/dsh-client-ui-
|
|
76
|
-
"@deepseek-ai/dsh-client-ui-
|
|
77
|
-
"@deepseek-ai/dsh-
|
|
78
|
-
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6",
|
|
87
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-client-ui-theme": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-settings": "^0.1.0-rc.6 || 0.2.0-rc.2",
|
|
79
94
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
80
95
|
"react": "^18.2.0",
|
|
81
|
-
"@deepseek-ai/schemastery": "^3.18.1"
|
|
96
|
+
"@deepseek-ai/schemastery": "^3.18.1",
|
|
97
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6 || 0.2.0-rc.2"
|
|
82
98
|
},
|
|
83
99
|
"devDependencies": {
|
|
84
100
|
"@testing-library/react": "16.3.2",
|
|
@@ -93,7 +109,22 @@
|
|
|
93
109
|
"tsdown": "0.22.2",
|
|
94
110
|
"typescript": "6.0.3",
|
|
95
111
|
"vite-tsconfig-paths": "6.1.1",
|
|
96
|
-
"vitest": "4.1.8"
|
|
112
|
+
"vitest": "4.1.8",
|
|
113
|
+
"@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
|
|
114
|
+
"zustand": "~4.4.7",
|
|
115
|
+
"immer": "^10.1.1",
|
|
116
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2",
|
|
117
|
+
"@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
|
|
118
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
119
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2",
|
|
120
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
|
|
121
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.2.0-rc.2",
|
|
122
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.2",
|
|
123
|
+
"@deepseek-ai/cordis": "4.0.4",
|
|
124
|
+
"@deepseek-ai/schemastery": "3.18.4",
|
|
125
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.0-rc.2",
|
|
126
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
127
|
+
"dsh-settings-legacy": "npm:@deepseek-ai/dsh-settings@0.1.0-rc.6"
|
|
97
128
|
},
|
|
98
129
|
"license": "MIT"
|
|
99
130
|
}
|
package/src/client/controller.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Eye-care state owner: durable settings synchronization plus theme lifecycle. */
|
|
2
2
|
|
|
3
3
|
import type { ClientConnectionRpc } from '@deepseek-ai/dsh-client-connection/client'
|
|
4
|
-
import { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-
|
|
4
|
+
import { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-store'
|
|
5
5
|
import type { ThemeRuntime, ThemeSnapshot } from '@deepseek-ai/dsh-client-ui-theme/client'
|
|
6
6
|
import {
|
|
7
7
|
DEFAULT_EYE_CARE_SETTINGS,
|
|
@@ -37,7 +37,7 @@ export interface EyeCareState {
|
|
|
37
37
|
/** Inputs isolated for deterministic controller tests. */
|
|
38
38
|
export interface EyeCareControllerOptions {
|
|
39
39
|
/** DSH theme registry. */
|
|
40
|
-
theme: Pick<ThemeRuntime, 'getTheme' | 'setTheme' | 'register'>
|
|
40
|
+
theme: Pick<ThemeRuntime, 'getTheme' | 'setTheme' | 'register'> & Partial<Pick<ThemeRuntime, 'overrideTokens'>>
|
|
41
41
|
/** Snapshot change subscription. */
|
|
42
42
|
subscribeTheme(listener: (snapshot: ThemeSnapshot) => void): () => void
|
|
43
43
|
/** Loopback-only Connection RPC; absent remote browsers stay process-local. */
|
|
@@ -89,6 +89,8 @@ export class EyeCareController {
|
|
|
89
89
|
private acceptedRemoteSnapshot = false
|
|
90
90
|
private startupBaseTheme: 'light' | 'dark' | 'system' | undefined
|
|
91
91
|
private startupBaseThemeDeadline = 0
|
|
92
|
+
private removeTokenLayer: (() => void) | undefined
|
|
93
|
+
private activeBaseTheme: string | undefined
|
|
92
94
|
|
|
93
95
|
/**
|
|
94
96
|
* Register the concrete themes and lifecycle listeners.
|
|
@@ -187,7 +189,9 @@ export class EyeCareController {
|
|
|
187
189
|
await this.tail
|
|
188
190
|
|
|
189
191
|
const current = this.theme.getTheme()
|
|
190
|
-
|
|
192
|
+
this.removeTokenLayer?.()
|
|
193
|
+
this.removeTokenLayer = undefined
|
|
194
|
+
if (isEyeCareThemeId(current.preference) || current.preference === this.activeBaseTheme) {
|
|
191
195
|
try {
|
|
192
196
|
this.setTheme(this.resolveRestoreTheme())
|
|
193
197
|
} catch (error) {
|
|
@@ -233,7 +237,11 @@ export class EyeCareController {
|
|
|
233
237
|
this.setUnavailable(state.error)
|
|
234
238
|
return Promise.resolve()
|
|
235
239
|
}
|
|
236
|
-
this.pendingSettings = {
|
|
240
|
+
this.pendingSettings = { mode: settings.mode, intensity: settings.intensity }
|
|
241
|
+
if (this.theme.overrideTokens !== undefined && settings.mode !== 'off'
|
|
242
|
+
&& (this.restoreTheme === 'light' || this.restoreTheme === 'dark' || this.restoreTheme === 'system')) {
|
|
243
|
+
this.pendingSettings.restoreTheme = this.restoreTheme
|
|
244
|
+
}
|
|
237
245
|
return this.enqueue(async () => { await this.flushPending() })
|
|
238
246
|
}
|
|
239
247
|
|
|
@@ -336,7 +344,7 @@ export class EyeCareController {
|
|
|
336
344
|
this.hasRestoreTheme = true
|
|
337
345
|
}
|
|
338
346
|
} else if (firstRemote) {
|
|
339
|
-
const base = snapshot.baseThemePreference
|
|
347
|
+
const base = next.restoreTheme ?? snapshot.baseThemePreference
|
|
340
348
|
if (base === undefined) {
|
|
341
349
|
if (!this.hasRestoreTheme) this.captureRestoreTheme()
|
|
342
350
|
} else {
|
|
@@ -388,12 +396,31 @@ export class EyeCareController {
|
|
|
388
396
|
const { mode, intensity } = this.store.getSnapshot().settings
|
|
389
397
|
const current = this.theme.getTheme().preference
|
|
390
398
|
if (mode === 'off') {
|
|
391
|
-
|
|
399
|
+
this.applyingTheme += 1
|
|
400
|
+
try {
|
|
401
|
+
this.removeTokenLayer?.()
|
|
402
|
+
this.removeTokenLayer = undefined
|
|
403
|
+
if (isEyeCareThemeId(current) || current === this.activeBaseTheme) this.setTheme(this.resolveRestoreTheme())
|
|
404
|
+
this.activeBaseTheme = undefined
|
|
405
|
+
} finally { this.applyingTheme -= 1 }
|
|
392
406
|
this.hasRestoreTheme = false
|
|
393
407
|
return
|
|
394
408
|
}
|
|
395
409
|
if (!this.hasRestoreTheme) this.captureRestoreTheme()
|
|
396
410
|
const scheme = mode === 'auto' ? (this.media?.matches === true ? 'dark' : 'light') : mode
|
|
411
|
+
// ConfigForms hosts re-adopt their durable built-in preference on every
|
|
412
|
+
// settings refresh. Use the public token layer so warmth survives adoption.
|
|
413
|
+
if (this.theme.overrideTokens !== undefined) {
|
|
414
|
+
const definition = EYE_CARE_THEMES.find(theme => theme.id === eyeCareThemeId(scheme, intensity))!
|
|
415
|
+
const tokens = Object.fromEntries(Object.entries(definition.tokens).map(([name, value]) => [name, { light: value, dark: value }]))
|
|
416
|
+
this.applyingTheme += 1
|
|
417
|
+
try {
|
|
418
|
+
this.activeBaseTheme = mode === 'auto' ? 'system' : mode
|
|
419
|
+
this.removeTokenLayer = this.theme.overrideTokens('@anionex/dsh-eye-care', tokens)
|
|
420
|
+
this.setTheme(this.activeBaseTheme)
|
|
421
|
+
} finally { this.applyingTheme -= 1 }
|
|
422
|
+
return
|
|
423
|
+
}
|
|
397
424
|
this.setTheme(eyeCareThemeId(scheme, intensity))
|
|
398
425
|
}
|
|
399
426
|
|
|
@@ -409,6 +436,7 @@ export class EyeCareController {
|
|
|
409
436
|
|
|
410
437
|
private onThemeChanged(snapshot: ThemeSnapshot): void {
|
|
411
438
|
if (this.disposed || this.applyingTheme > 0 || isEyeCareThemeId(snapshot.preference)) return
|
|
439
|
+
if (snapshot.preference === this.activeBaseTheme) return
|
|
412
440
|
if (this.startupBaseTheme !== undefined) {
|
|
413
441
|
const expected = this.startupBaseTheme
|
|
414
442
|
const withinStartupWindow = this.now() <= this.startupBaseThemeDeadline
|
|
@@ -430,6 +458,7 @@ export class EyeCareController {
|
|
|
430
458
|
next.settings = settings
|
|
431
459
|
next.error = null
|
|
432
460
|
})
|
|
461
|
+
this.applyCurrentTheme()
|
|
433
462
|
void this.persist(settings)
|
|
434
463
|
}
|
|
435
464
|
}
|
package/src/client/index.tsx
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** DSH Web browser half for the eye-care profile bundle. */
|
|
2
2
|
|
|
3
|
+
import type {} from '@deepseek-ai/dsh-client-ui-renderer/client'
|
|
3
4
|
import type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'
|
|
4
|
-
import type { ClientContext } from '@deepseek-ai/
|
|
5
|
+
import type { Context as ClientContext } from '@deepseek-ai/cordis'
|
|
5
6
|
import type { ThemeRuntime, ThemeSnapshot } from '@deepseek-ai/dsh-client-ui-theme/client'
|
|
6
7
|
import type {} from '@deepseek-ai/dsh-client-ui-settings/client'
|
|
7
8
|
import type {} from '@deepseek-ai/dsh-api-remotes/client'
|
|
@@ -36,7 +37,7 @@ export function apply(ctx: EyeCareClientContext): void {
|
|
|
36
37
|
ctx.effect(() => ctx.locale.register('settings.eyeCare', { zh, en }), 'dsh-eye-care: dictionaries')
|
|
37
38
|
ctx.effect(() => {
|
|
38
39
|
const refresh = (namespace?: string): void => {
|
|
39
|
-
if (namespace !== undefined && namespace !== 'eye-care') return
|
|
40
|
+
if (namespace !== undefined && namespace !== 'eye-care' && namespace !== 'dsh-eye-care') return
|
|
40
41
|
controller.refresh()
|
|
41
42
|
}
|
|
42
43
|
const disposers = [
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ export {
|
|
|
18
18
|
type EyeCareSettings,
|
|
19
19
|
} from './shared.ts'
|
|
20
20
|
export { EYE_CARE_SETTINGS_NS, EyeCareSettingsSchema } from './settings.ts'
|
|
21
|
+
export { Config } from './settings.ts'
|
|
21
22
|
export { EyeCareRpcBackend } from './rpc.ts'
|
|
22
23
|
|
|
23
24
|
/** Required Host capability. */
|
|
@@ -25,6 +26,7 @@ export const inject = ['settings']
|
|
|
25
26
|
|
|
26
27
|
/** Register the durable namespace and the optional loopback browser transport. */
|
|
27
28
|
export function apply(ctx: Context): void {
|
|
28
|
-
ctx.settings
|
|
29
|
+
const settings = ctx.settings as unknown as { register?: (ns: string, schema: typeof EyeCareSettingsSchema) => unknown }
|
|
30
|
+
settings.register?.(EYE_CARE_SETTINGS_NS, EyeCareSettingsSchema)
|
|
29
31
|
installEyeCareRpc(ctx)
|
|
30
32
|
}
|
package/src/rpc.ts
CHANGED
|
@@ -14,9 +14,10 @@ import {
|
|
|
14
14
|
type EyeCareSettingsWriteRequest,
|
|
15
15
|
} from './shared.ts'
|
|
16
16
|
import { EYE_CARE_SETTINGS_NS } from './settings.ts'
|
|
17
|
+
import { installLoopbackTransport } from './transport.ts'
|
|
17
18
|
|
|
18
19
|
function descriptorOf(ctx: Context): SettingsDescriptor {
|
|
19
|
-
const descriptor = ctx.settings.describe().find(row => row.ns === EYE_CARE_SETTINGS_NS)
|
|
20
|
+
const descriptor = ctx.settings.describe().find(row => row.ns === EYE_CARE_SETTINGS_NS || String(row.ns) === 'dsh-eye-care')
|
|
20
21
|
if (descriptor === undefined) throw new Error('eye-care settings namespace is not registered')
|
|
21
22
|
return descriptor
|
|
22
23
|
}
|
|
@@ -96,7 +97,7 @@ export class EyeCareRpcBackend {
|
|
|
96
97
|
}
|
|
97
98
|
try {
|
|
98
99
|
if (!this.ctx.settings.writable) throw new Error('settings provider is read-only')
|
|
99
|
-
await this.ctx.settings.replace(
|
|
100
|
+
await this.ctx.settings.replace(descriptorOf(this.ctx).ns, request.value, request.expectedRevision)
|
|
100
101
|
return { ok: true, value: this.snapshot() }
|
|
101
102
|
} catch (error) {
|
|
102
103
|
if (error instanceof SettingsConflictError) {
|
|
@@ -129,7 +130,12 @@ export class EyeCareRpcBackend {
|
|
|
129
130
|
export function installEyeCareRpc(ctx: Context): void {
|
|
130
131
|
const backend = new EyeCareRpcBackend(ctx)
|
|
131
132
|
ctx.inject(['connection'], (connectionCtx) => {
|
|
132
|
-
connectionCtx.connection.
|
|
133
|
+
if (typeof connectionCtx.connection.requestRejection === 'function') {
|
|
134
|
+
installLoopbackTransport(connectionCtx, backend.handle)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
const legacy = connectionCtx.connection as unknown as { rpc: { handle: (channel: string, handler: ConnectionRpcHandler, options: { authority: 'loopback' }) => unknown } }
|
|
138
|
+
legacy.rpc.handle(
|
|
133
139
|
EYE_CARE_RPC_CHANNEL,
|
|
134
140
|
backend.handle,
|
|
135
141
|
{ authority: 'loopback' },
|
package/src/settings.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Host-only schema and branded namespace for eye-care settings. */
|
|
2
2
|
|
|
3
3
|
import z from '@deepseek-ai/schemastery'
|
|
4
|
-
import {
|
|
4
|
+
import SettingsService, { type SettingsNamespace } from '@deepseek-ai/dsh-settings'
|
|
5
5
|
import {
|
|
6
6
|
DEFAULT_EYE_CARE_SETTINGS,
|
|
7
7
|
EYE_CARE_INTENSITIES,
|
|
@@ -13,10 +13,19 @@ import {
|
|
|
13
13
|
} from './shared.ts'
|
|
14
14
|
|
|
15
15
|
/** Branded settings namespace used by the Host service. */
|
|
16
|
-
export const EYE_CARE_SETTINGS_NS =
|
|
16
|
+
export const EYE_CARE_SETTINGS_NS = EYE_CARE_SETTINGS_NAMESPACE as SettingsNamespace
|
|
17
17
|
|
|
18
18
|
/** Host schema for the eye-care settings section. */
|
|
19
19
|
export const EyeCareSettingsSchema: z<EyeCareSettings> = z.object({
|
|
20
20
|
[MODE_FIELD]: z.union([...EYE_CARE_MODES]).default(DEFAULT_EYE_CARE_SETTINGS.mode),
|
|
21
21
|
[INTENSITY_FIELD]: z.union([...EYE_CARE_INTENSITIES]).default(DEFAULT_EYE_CARE_SETTINGS.intensity),
|
|
22
|
+
restoreTheme: z.union(['light', 'dark', 'system']),
|
|
22
23
|
})
|
|
24
|
+
|
|
25
|
+
/** Modern Settings projects live Config fields; legacy hosts register a section. */
|
|
26
|
+
export const Config: z<EyeCareSettings> = (() => {
|
|
27
|
+
if (typeof (SettingsService.prototype as { register?: unknown }).register === 'function') return EyeCareSettingsSchema
|
|
28
|
+
const schema = new z(EyeCareSettingsSchema.toJSON()) as z<EyeCareSettings>
|
|
29
|
+
for (const field of Object.values(schema.dict ?? {})) field.meta.volatile = true
|
|
30
|
+
return schema
|
|
31
|
+
})()
|
package/src/shared.ts
CHANGED
|
@@ -42,6 +42,8 @@ export interface EyeCareSettings {
|
|
|
42
42
|
mode: EyeCareMode
|
|
43
43
|
/** Warmth applied by the active eye-care palette. */
|
|
44
44
|
intensity: EyeCareIntensity
|
|
45
|
+
/** Built-in preference to restore after a token-layer host reload. */
|
|
46
|
+
restoreTheme?: 'light' | 'dark' | 'system'
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
/** Browser-safe Host snapshot returned through the loopback RPC channel. */
|
|
@@ -81,7 +83,9 @@ export function decodeEyeCareSettings(value: unknown): EyeCareSettings | undefin
|
|
|
81
83
|
if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined
|
|
82
84
|
const record = value as Record<string, unknown>
|
|
83
85
|
if (!isEyeCareMode(record[MODE_FIELD]) || !isEyeCareIntensity(record[INTENSITY_FIELD])) return undefined
|
|
84
|
-
|
|
86
|
+
const restoreTheme = record['restoreTheme']
|
|
87
|
+
if (restoreTheme !== undefined && restoreTheme !== 'light' && restoreTheme !== 'dark' && restoreTheme !== 'system') return undefined
|
|
88
|
+
return { mode: record[MODE_FIELD], intensity: record[INTENSITY_FIELD], ...(restoreTheme === undefined ? {} : { restoreTheme }) }
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
/** Decode one complete Host snapshot from the RPC boundary. */
|