@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/lib/rpc.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
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 { settingsNamespace } from '@deepseek-ai/dsh-settings';
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 = settingsNamespace(EYE_CARE_SETTINGS_NAMESPACE);
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
@@ -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,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,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,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;AAElF,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;CACnG,CAAC,CAAA"}
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
- return { mode: record[MODE_FIELD], intensity: record[INTENSITY_FIELD] };
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":"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"}
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;AAkCF,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAA;AACpD,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,CAAA;AACpE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACzF,MAAM,MAAM,GAAG,KAAgC,CAAA;IAC/C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACxG,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;IAC3C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IACpI,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;AAClI,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACzF,MAAM,MAAM,GAAG,KAAgC,CAAA;IAC/C,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAC3C,IAAI,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS;WACvE,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3H,MAAM,cAAc,GAAG,gBAA2C,CAAA;IAClE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;IAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAK,QAAmB,GAAG,CAAC;WACpF,cAAc,CAAC,SAAS,CAAC,KAAK,MAAM;QAAE,OAAO,SAAS,CAAA;IAC3D,MAAM,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;IACzD,IAAI,mBAAmB,KAAK,SAAS;WAChC,mBAAmB,KAAK,OAAO,IAAI,mBAAmB,KAAK,MAAM,IAAI,mBAAmB,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC5H,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;QAC5B,QAAQ,EAAE;YACR,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,QAAkB;YAC5B,OAAO,EAAE,MAAM;SAChB;QACD,GAAG,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACtE,CAAA;AACH,CAAC"}
@@ -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-runtime/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":"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"}
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/dsh-client-runtime/client';
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;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,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"}
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"}
@@ -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[];
@@ -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,CAGxC"}
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"}
@@ -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;AAiCpB,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,CASpD"}
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"}
@@ -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: import("@deepseek-ai/dsh-settings").SettingsNamespace;
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;AAExC,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,aAAa,CAAA;AAEpB,2DAA2D;AAC3D,eAAO,MAAM,oBAAoB,uDAAiD,CAAA;AAElF,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,eAAe,CAGnD,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"}
@@ -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;CAC5B;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,CAKjF;AAED,+DAA+D;AAC/D,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,GAAG,SAAS,CAwBzF"}
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.0",
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-runtime": "^0.1.0-rc.6",
75
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.0-rc.6",
76
- "@deepseek-ai/dsh-client-ui-slots": "^0.1.0-rc.6",
77
- "@deepseek-ai/dsh-client-ui-theme": "^0.1.0-rc.6",
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
  }
@@ -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-runtime/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
- if (isEyeCareThemeId(current.preference)) {
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 = { ...settings }
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
- if (isEyeCareThemeId(current)) this.setTheme(this.resolveRestoreTheme())
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
  }
@@ -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/dsh-client-runtime/client'
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.register(EYE_CARE_SETTINGS_NS, EyeCareSettingsSchema)
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(EYE_CARE_SETTINGS_NS, request.value, request.expectedRevision)
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.rpc.handle(
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 { settingsNamespace } from '@deepseek-ai/dsh-settings'
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 = settingsNamespace(EYE_CARE_SETTINGS_NAMESPACE)
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
- return { mode: record[MODE_FIELD], intensity: record[INTENSITY_FIELD] }
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. */