@linxin666/dsh-pet 0.3.5 → 0.3.9
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.i18n.yaml +2 -2
- package/README.md +4 -0
- package/README.zh.md +4 -0
- package/contracts/voice-pack-v1.schema.json +30 -0
- package/cordis.patch.yml +1 -1
- package/lib/client.js +330 -103
- package/lib/client.js.map +1 -1
- package/lib/index.js +145 -28
- package/lib/invariant.js +1 -1
- package/lib/live2d-vendor.js +106 -95
- package/lib/live2d-vendor.js.map +1 -1
- package/lib/{state-DrMX22GL.js → state-NvDEoCln.js} +5 -2
- package/lib/types/access.d.ts +5 -4
- package/lib/types/access.d.ts.map +1 -1
- package/lib/types/access.js +2 -12
- package/lib/types/affinity.d.ts +2 -0
- package/lib/types/affinity.d.ts.map +1 -1
- package/lib/types/affinity.js +12 -0
- package/lib/types/announce.d.ts +53 -0
- package/lib/types/announce.d.ts.map +1 -0
- package/lib/types/announce.js +80 -0
- package/lib/types/client/PetDockEntry.d.ts +14 -5
- package/lib/types/client/PetDockEntry.d.ts.map +1 -1
- package/lib/types/client/PetDockEntry.js +6 -5
- package/lib/types/client/PetSettingsCard.d.ts +2 -1
- package/lib/types/client/PetSettingsCard.d.ts.map +1 -1
- package/lib/types/client/PetSprite.d.ts +8 -0
- package/lib/types/client/PetSprite.d.ts.map +1 -1
- package/lib/types/client/PetSprite.js +36 -5
- package/lib/types/client/index.d.ts +8 -5
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +11 -5
- package/lib/types/client/locales.d.ts +20 -2
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +20 -2
- package/lib/types/client/pet-store.d.ts +1 -1
- package/lib/types/client/pet-store.d.ts.map +1 -1
- package/lib/types/client/pet-store.js +1 -1
- package/lib/types/client/renderers/frames2d.d.ts +12 -0
- package/lib/types/client/renderers/frames2d.d.ts.map +1 -1
- package/lib/types/client/renderers/frames2d.js +143 -18
- package/lib/types/client/settings-form.d.ts +35 -43
- package/lib/types/client/settings-form.d.ts.map +1 -1
- package/lib/types/client/settings-form.js +60 -53
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +10 -9
- package/lib/types/ledger.d.ts +4 -2
- package/lib/types/ledger.d.ts.map +1 -1
- package/lib/types/ledger.js +4 -4
- package/lib/types/pair-access.d.ts +35 -0
- package/lib/types/pair-access.d.ts.map +1 -0
- package/lib/types/pair-access.js +19 -0
- package/lib/types/remarks.d.ts +1 -1
- package/lib/types/remarks.d.ts.map +1 -1
- package/lib/types/remarks.js +11 -2
- package/lib/types/service.d.ts +18 -0
- package/lib/types/service.d.ts.map +1 -1
- package/lib/types/service.js +26 -1
- package/lib/types/voice-pack.d.ts +5 -0
- package/lib/types/voice-pack.d.ts.map +1 -1
- package/lib/types/voice-pack.js +36 -2
- package/package.json +17 -13
- package/src/access.ts +7 -27
- package/src/affinity.ts +13 -0
- package/src/announce.ts +103 -0
- package/src/client/PetDockEntry.test.tsx +1 -1
- package/src/client/PetDockEntry.tsx +15 -4
- package/src/client/PetSettingsCard.tsx +2 -1
- package/src/client/PetSprite.test.tsx +36 -0
- package/src/client/PetSprite.tsx +75 -4
- package/src/client/gameplay-hud.test.tsx +1 -1
- package/src/client/index.test.tsx +2 -2
- package/src/client/index.ts +17 -6
- package/src/client/locales.ts +20 -2
- package/src/client/pet-store.ts +2 -2
- package/src/client/pet.module.css +104 -0
- package/src/client/renderers/frames2d.test.ts +101 -0
- package/src/client/renderers/frames2d.ts +138 -18
- package/src/client/settings-form.ts +78 -92
- package/src/dsh-home.ts +1 -1
- package/src/index.ts +17 -15
- package/src/ledger.ts +6 -4
- package/src/pair-access.ts +49 -0
- package/src/remarks.test.ts +10 -0
- package/src/remarks.ts +9 -2
- package/src/service.ts +32 -2
- package/src/voice-pack.test.ts +39 -0
- package/src/voice-pack.ts +37 -2
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* each plugin's client bundle; mirrors the official ui-plugin-config
|
|
8
8
|
* card-store pattern.
|
|
9
9
|
*/
|
|
10
|
-
import { createSnapshotStore } from '@deepseek-ai/dsh-client-
|
|
10
|
+
import { createSnapshotStore } from '@deepseek-ai/dsh-client-store';
|
|
11
11
|
/** A whole- or decimal-number field. An empty draft clears the field; any other draft that is not a finite number within the constraints blocks the save. */
|
|
12
12
|
export function numberField(field, constraints = {}) {
|
|
13
13
|
const { integer = false, min } = constraints;
|
|
@@ -43,8 +43,8 @@ export function textField(field) {
|
|
|
43
43
|
/**
|
|
44
44
|
* A free-text field the Host treats as a secret and redacts from the read-back
|
|
45
45
|
* (role('secret') in the section schema). The card still edits it like text,
|
|
46
|
-
* but a save never compares the redacted value back
|
|
47
|
-
*
|
|
46
|
+
* but a save never compares the redacted value back: the staged set is judged
|
|
47
|
+
* by the mutation settling (see {@link FieldSpec.secret}).
|
|
48
48
|
*/
|
|
49
49
|
export function secretField(field) {
|
|
50
50
|
return { ...textField(field), secret: true };
|
|
@@ -129,7 +129,7 @@ export class CardForm {
|
|
|
129
129
|
exposed: snapshot.status === 'ready',
|
|
130
130
|
writable: snapshot.writable,
|
|
131
131
|
dirty: plan.length > 0,
|
|
132
|
-
invalid: plan.some(item => item.
|
|
132
|
+
invalid: plan.some(item => item.judge === undefined),
|
|
133
133
|
saving: this.saving,
|
|
134
134
|
failed: this.failed,
|
|
135
135
|
...this.failedReason === undefined ? {} : { failedReason: this.failedReason },
|
|
@@ -168,22 +168,26 @@ export class CardForm {
|
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
170
|
/**
|
|
171
|
-
* Write every staged edit, then re-seed from
|
|
171
|
+
* Write every staged edit in one atomic scope mutation, then re-seed from
|
|
172
|
+
* what the Host accepted.
|
|
172
173
|
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
174
|
+
* The whole batch rides one mutate, so cross-field validate hooks
|
|
175
|
+
* (baseURL+model) judge it as a unit: the Host either applies every write
|
|
176
|
+
* or refuses the batch. The 0.1.2 scope contract never rejects a refused
|
|
177
|
+
* mutation — the scope recovers with a fresh Host view and resolves — so
|
|
178
|
+
* resolution alone proves nothing: the outcome is judged by reading the
|
|
179
|
+
* settled snapshot back, one planned write at a time, and one missed write
|
|
180
|
+
* fails the whole save. A scope that still rejects on refusal (the dsh-web
|
|
181
|
+
* bridge scope) reports through the same failure path with its rejection
|
|
182
|
+
* message. A save that did not land keeps its drafts, so the user can
|
|
183
|
+
* correct them instead of retyping.
|
|
184
|
+
* @returns settlement after the mutation and the read-back.
|
|
180
185
|
*/
|
|
181
186
|
async save() {
|
|
182
187
|
const plan = this.plan();
|
|
183
|
-
const valid = plan.filter(item => item.
|
|
188
|
+
const valid = plan.filter((item) => item.judge !== undefined);
|
|
184
189
|
if (plan.length === 0 || this.saving || valid.length !== plan.length)
|
|
185
190
|
return;
|
|
186
|
-
const plannedWrites = valid.map(item => item.op);
|
|
187
191
|
// Snapshot the staged entries this save writes, so an edit staged while it
|
|
188
192
|
// is in flight (which replaces the same key) survives: only delete the key
|
|
189
193
|
// when the entry is still the one this save started from.
|
|
@@ -194,39 +198,35 @@ export class CardForm {
|
|
|
194
198
|
this.failed = false;
|
|
195
199
|
this.failedReason = undefined;
|
|
196
200
|
this.publish();
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
this.failedReason = result.message;
|
|
209
|
-
}
|
|
201
|
+
// One atomic namespace mutation: the 0.1.2 scope contract takes ordered
|
|
202
|
+
// path operations, so the whole staged batch is validated, persisted, and
|
|
203
|
+
// recovered together — either every write lands or none does.
|
|
204
|
+
const ops = valid.map(item => item.op.op === 'set'
|
|
205
|
+
? { op: 'set', path: [item.field], value: item.op.value }
|
|
206
|
+
: { op: 'unset', path: [item.field] });
|
|
207
|
+
let failedReason;
|
|
208
|
+
try {
|
|
209
|
+
await this.scope.mutate(ops);
|
|
210
210
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
if (await item.run())
|
|
214
|
-
landed.add(item.field);
|
|
215
|
-
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
failedReason = error instanceof Error ? error.message : String(error);
|
|
216
213
|
}
|
|
214
|
+
// The 0.1.2 scope resolves even a refused mutation (it recovers with a
|
|
215
|
+
// fresh view instead of throwing), so resolution alone proves nothing:
|
|
216
|
+
// judge every planned write against the settled snapshot. The mutation is
|
|
217
|
+
// atomic, so one missed write fails the whole save and keeps the drafts.
|
|
218
|
+
const landed = failedReason === undefined && valid.every(item => item.judge());
|
|
217
219
|
for (const [field, before] of pending) {
|
|
218
|
-
if (landed
|
|
220
|
+
if (landed && this.staged.get(field) === before)
|
|
219
221
|
this.staged.delete(field);
|
|
220
222
|
}
|
|
221
223
|
this.saving = false;
|
|
222
|
-
this.failed = landed
|
|
224
|
+
this.failed = !landed;
|
|
225
|
+
// A read-back failure carries no server reason: the card surfaces its
|
|
226
|
+
// generic failure copy; a rejecting scope (the bridge) adds its message.
|
|
227
|
+
this.failedReason = failedReason;
|
|
223
228
|
this.publish();
|
|
224
229
|
}
|
|
225
|
-
/** The scope's batch surface when it supports one; undefined conservatively otherwise. */
|
|
226
|
-
batchedScope() {
|
|
227
|
-
const candidate = this.scope;
|
|
228
|
-
return typeof candidate?.mutate === 'function' ? candidate : undefined;
|
|
229
|
-
}
|
|
230
230
|
/**
|
|
231
231
|
* Every staged edit a save would write. An entry whose draft is not a value
|
|
232
232
|
* its field accepts carries no write: the form is still dirty, and the save
|
|
@@ -240,35 +240,42 @@ export class CardForm {
|
|
|
240
240
|
const spec = this.specOf(field);
|
|
241
241
|
if (staged.clear) {
|
|
242
242
|
if (this.stored(field))
|
|
243
|
-
plan.push({ field, op: { field, op: 'unset' },
|
|
243
|
+
plan.push({ field, op: { field, op: 'unset' }, judge: () => this.landedUnset(field) });
|
|
244
244
|
continue;
|
|
245
245
|
}
|
|
246
246
|
if (staged.text === spec.format(this.sectionValue(field)))
|
|
247
247
|
continue;
|
|
248
248
|
const write = spec.parse(staged.text);
|
|
249
249
|
if (write === undefined)
|
|
250
|
-
plan.push({ field, op: { field, op: 'unset' },
|
|
250
|
+
plan.push({ field, op: { field, op: 'unset' }, judge: undefined });
|
|
251
251
|
else if (write.kind === 'clear')
|
|
252
|
-
plan.push({ field, op: { field, op: 'unset' },
|
|
252
|
+
plan.push({ field, op: { field, op: 'unset' }, judge: () => this.landedUnset(field) });
|
|
253
253
|
else
|
|
254
|
-
plan.push({ field, op: { field, op: 'set', value: write.value },
|
|
254
|
+
plan.push({ field, op: { field, op: 'set', value: write.value }, judge: () => this.landedSet(field, write.value) });
|
|
255
255
|
}
|
|
256
256
|
return plan;
|
|
257
257
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
//
|
|
258
|
+
/**
|
|
259
|
+
* Read-back judgment for a planned set: the user layer must hold the
|
|
260
|
+
* intended value once the mutation has settled.
|
|
261
|
+
*/
|
|
262
|
+
landedSet(field, value) {
|
|
263
|
+
// A redacted secret never appears in any wire view layer: the Host strips
|
|
264
|
+
// role('secret') fields and reports them through a sidecar the scope
|
|
265
|
+
// snapshot does not expose, so there is nothing to compare the draft
|
|
266
|
+
// against. Settling is the only signal the form has; the rest of the
|
|
267
|
+
// batch, when one exists, still carries the atomic verdict by read-back.
|
|
268
268
|
if (this.specOf(field).secret)
|
|
269
269
|
return true;
|
|
270
270
|
return this.userLayer()?.[field] === value;
|
|
271
271
|
}
|
|
272
|
+
/**
|
|
273
|
+
* Read-back judgment for a planned unset: the field must be gone from the
|
|
274
|
+
* user layer once the mutation has settled.
|
|
275
|
+
*/
|
|
276
|
+
landedUnset(field) {
|
|
277
|
+
return !this.stored(field);
|
|
278
|
+
}
|
|
272
279
|
stage(field, edit) {
|
|
273
280
|
this.staged.set(field, edit);
|
|
274
281
|
this.failed = false;
|
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;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,CAAC,MAAM,aAAa,CAAA;AAC3B,OAAO,EAAsC,KAAK,SAAS,EAA2B,MAAM,cAAc,CAAA;AAM1G,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC9D,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,MAAM,GACP,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,GACN,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAA;AAEpB,sEAAsE;AACtE,eAAO,MAAM,IAAI,QAAQ,CAAA;AAEzB,+DAA+D;AAC/D,eAAO,MAAM,MAAM,UAAgB,CAAA;AAEnC;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;;;;;;IAU1D;AAED,0EAA0E;AAC1E,eAAO,MAAM,KAAK,kBAA6C,CAAA;AAE/D,iBAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,CAAC,MAAM,aAAa,CAAA;AAC3B,OAAO,EAAsC,KAAK,SAAS,EAA2B,MAAM,cAAc,CAAA;AAM1G,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC9D,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,MAAM,GACP,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,GACN,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,cAAc,GACf,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,kBAAkB,GACnB,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAA;AAEpB,sEAAsE;AACtE,eAAO,MAAM,IAAI,QAAQ,CAAA;AAEzB,+DAA+D;AAC/D,eAAO,MAAM,MAAM,UAAgB,CAAA;AAEnC;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;;;;;;IAU1D;AAED,0EAA0E;AAC1E,eAAO,MAAM,KAAK,kBAA6C,CAAA;AAE/D,iBAAS,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,SAAc,GAAG,IAAI,CAkE7D"}
|
package/lib/types/index.js
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* cordis.patch.yml inserts this plugin row.
|
|
11
11
|
* @module @linxin666/dsh-pet
|
|
12
12
|
*/
|
|
13
|
-
import { installSettingsSection, settingsNamespace } from '@deepseek-ai/dsh-settings';
|
|
14
13
|
import z from 'schemastery';
|
|
15
14
|
import { PetService, PET_SETTINGS_NAMESPACE } from "./service.js";
|
|
16
15
|
import { makePetRoutes } from "./routes.js";
|
|
@@ -96,14 +95,16 @@ function applyImpl(ctx, config = {}) {
|
|
|
96
95
|
disposeRoutes = undefined;
|
|
97
96
|
}
|
|
98
97
|
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
98
|
+
ctx.inject(['settings'], (settingsCtx) => {
|
|
99
|
+
settingsCtx.settings.installSection(ctx, PET_SETTINGS_NAMESPACE, makePetSettingsSchema(service.selectedPetId()), base, {
|
|
100
|
+
setSource: (source) => { current = source; },
|
|
101
|
+
onChange: () => {
|
|
102
|
+
const section = current();
|
|
103
|
+
service.applySettingsSection(section);
|
|
104
|
+
service.setEnabled(section.enabled ?? true);
|
|
105
|
+
syncRoutes();
|
|
106
|
+
},
|
|
107
|
+
});
|
|
107
108
|
});
|
|
108
109
|
syncRoutes();
|
|
109
110
|
}
|
package/lib/types/ledger.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface LedgerConfig {
|
|
|
17
17
|
treats?: Partial<TreatConfig>;
|
|
18
18
|
/** Per-pet remark pools for the selected pet (custom slots override built-ins). */
|
|
19
19
|
remarks?: PetRemarks;
|
|
20
|
+
/** Voice-pack fallback remark pools (global or pet voice pack). */
|
|
21
|
+
voiceRemarks?: PetRemarks;
|
|
20
22
|
}
|
|
21
23
|
/** Result of one ledger interaction (the shape the pet RPC returns). */
|
|
22
24
|
export interface LedgerInteractionResult {
|
|
@@ -66,9 +68,9 @@ export declare class PetLedger {
|
|
|
66
68
|
setPetName(petId: string, name: string): void;
|
|
67
69
|
/**
|
|
68
70
|
* Swap the reaction pools to another pet's custom remarks (called on pet
|
|
69
|
-
* selection). Slots the pet does not declare fall back to built-ins.
|
|
71
|
+
* selection). Slots the pet does not declare fall back to voice packs or built-ins.
|
|
70
72
|
*/
|
|
71
|
-
setRemarks(remarks?: PetRemarks): void;
|
|
73
|
+
setRemarks(remarks?: PetRemarks, voiceRemarks?: PetRemarks): void;
|
|
72
74
|
/**
|
|
73
75
|
* Settle the treat economy (work + time output since the last settlement).
|
|
74
76
|
* A zero-gain first settlement still starts the time clock (anchor write),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAErD,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B,mFAAmF;IACnF,OAAO,CAAC,EAAE,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/ledger.ts"],"names":[],"mappings":"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"}
|
package/lib/types/ledger.js
CHANGED
|
@@ -27,7 +27,7 @@ export class PetLedger {
|
|
|
27
27
|
constructor(persist, config = {}) {
|
|
28
28
|
this.affinityConfig = { ...defaultAffinityConfig, ...(config.affinity ?? {}) };
|
|
29
29
|
this.treatConfig = { ...defaultTreatConfig, ...(config.treats ?? {}) };
|
|
30
|
-
this.picker = new RemarkPicker(config.remarks);
|
|
30
|
+
this.picker = new RemarkPicker(config.remarks, config.voiceRemarks);
|
|
31
31
|
this.current = persist;
|
|
32
32
|
}
|
|
33
33
|
/** Affinity cooldown/rank tuning (read-only). */
|
|
@@ -79,10 +79,10 @@ export class PetLedger {
|
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
81
|
* Swap the reaction pools to another pet's custom remarks (called on pet
|
|
82
|
-
* selection). Slots the pet does not declare fall back to built-ins.
|
|
82
|
+
* selection). Slots the pet does not declare fall back to voice packs or built-ins.
|
|
83
83
|
*/
|
|
84
|
-
setRemarks(remarks) {
|
|
85
|
-
this.picker = new RemarkPicker(remarks);
|
|
84
|
+
setRemarks(remarks, voiceRemarks) {
|
|
85
|
+
this.picker = new RemarkPicker(remarks, voiceRemarks);
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* Settle the treat economy (work + time output since the last settlement).
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing trust fence shared by plugins that expose host routes: loopback
|
|
3
|
+
* (the desktop) always passes; a live paired-device cookie is an additional
|
|
4
|
+
* allow path when remote-web-ui is loaded. The consuming plugin never
|
|
5
|
+
* depends on that plugin — without the service the fence stays
|
|
6
|
+
* loopback-only.
|
|
7
|
+
*
|
|
8
|
+
* Per-package wrappers (access.ts) call this with their own name so each
|
|
9
|
+
* plugin keeps a self-describing export; the security decision lives only
|
|
10
|
+
* here.
|
|
11
|
+
*/
|
|
12
|
+
import type { IncomingMessage } from 'node:http';
|
|
13
|
+
/** Structural pairing lookup (no package dependency on remote-web-ui). */
|
|
14
|
+
interface PairingAccess {
|
|
15
|
+
isPairedDevice(request: IncomingMessage): boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Structural host-context shape: shared sources carry no @deepseek-ai
|
|
19
|
+
* dependency (the shared package must typecheck standalone), so the fence
|
|
20
|
+
* reads only the two members it needs; cordis Context satisfies this.
|
|
21
|
+
* ctx.get is optional on the test harness; production Context always has it.
|
|
22
|
+
*/
|
|
23
|
+
interface LookupCtx {
|
|
24
|
+
get?(name: string, strict?: boolean): unknown;
|
|
25
|
+
remoteWebUiPairing?: PairingAccess;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether this request may enter the plugin's host routes.
|
|
29
|
+
* @param ctx - host context; may expose remoteWebUiPairing.
|
|
30
|
+
* @param request - the incoming HTTP request.
|
|
31
|
+
* @returns true for loopback, or a live paired-device cookie.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isPairedOrLoopbackAllowed(ctx: LookupCtx, request: IncomingMessage): boolean;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=pair-access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pair-access.d.ts","sourceRoot":"","sources":["../../src/pair-access.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAGhD,0EAA0E;AAC1E,UAAU,aAAa;IACrB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAA;CAClD;AAED;;;;;GAKG;AACH,UAAU,SAAS;IACjB,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IAC7C,kBAAkB,CAAC,EAAE,aAAa,CAAA;CACnC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAK3F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { isLoopbackRequest } from "./loopback.js";
|
|
2
|
+
/**
|
|
3
|
+
* Whether this request may enter the plugin's host routes.
|
|
4
|
+
* @param ctx - host context; may expose remoteWebUiPairing.
|
|
5
|
+
* @param request - the incoming HTTP request.
|
|
6
|
+
* @returns true for loopback, or a live paired-device cookie.
|
|
7
|
+
*/
|
|
8
|
+
export function isPairedOrLoopbackAllowed(ctx, request) {
|
|
9
|
+
if (isLoopbackRequest(request))
|
|
10
|
+
return true;
|
|
11
|
+
const fromGet = typeof ctx.get === 'function' ? ctx.get('remoteWebUiPairing', false) : undefined;
|
|
12
|
+
const pairing = (isPairingAccess(fromGet) ? fromGet : ctx.remoteWebUiPairing);
|
|
13
|
+
return pairing?.isPairedDevice(request) === true;
|
|
14
|
+
}
|
|
15
|
+
function isPairingAccess(value) {
|
|
16
|
+
return value !== undefined
|
|
17
|
+
&& value !== null
|
|
18
|
+
&& typeof value.isPairedDevice === 'function';
|
|
19
|
+
}
|
package/lib/types/remarks.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ export declare function normalizePetRemarks(raw: unknown, onWarning?: (message:
|
|
|
47
47
|
export declare class RemarkPicker {
|
|
48
48
|
private readonly counters;
|
|
49
49
|
private readonly pools;
|
|
50
|
-
constructor(overrides?: PetRemarks);
|
|
50
|
+
constructor(overrides?: PetRemarks, voiceOverrides?: PetRemarks);
|
|
51
51
|
/** The effective pool for one slot (custom override or built-in). */
|
|
52
52
|
pool(kind: RemarkKind): readonly string[];
|
|
53
53
|
/** The next line for one slot (round-robin within its pool). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remarks.d.ts","sourceRoot":"","sources":["../../src/remarks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAA;AAErF,4CAA4C;AAC5C,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAM7C,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AAE9D,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAA;AAE/E,2EAA2E;AAC3E,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC,CA2F3E,CAAA;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EACZ,SAAS,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,GAC9C,UAAU,GAAG,SAAS,CAyBxB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAEjD,SAAS,CAAC,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"remarks.d.ts","sourceRoot":"","sources":["../../src/remarks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wDAAwD;AACxD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,aAAa,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,CAAA;AAErF,4CAA4C;AAC5C,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAM7C,CAAA;AAED,6EAA6E;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;AAE9D,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAA;AAE/E,2EAA2E;AAC3E,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC,CA2F3E,CAAA;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EACZ,SAAS,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,GAC9C,UAAU,GAAG,SAAS,CAyBxB;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;gBAEjD,SAAS,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,UAAU;IAe/D,qEAAqE;IACrE,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,MAAM,EAAE;IAIzC,gEAAgE;IAChE,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAO9B,wFAAwF;IACxF,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAIhD"}
|
package/lib/types/remarks.js
CHANGED
|
@@ -166,11 +166,20 @@ export function normalizePetRemarks(raw, onWarning = () => { }) {
|
|
|
166
166
|
export class RemarkPicker {
|
|
167
167
|
counters = new Map();
|
|
168
168
|
pools;
|
|
169
|
-
constructor(overrides) {
|
|
169
|
+
constructor(overrides, voiceOverrides) {
|
|
170
170
|
this.pools = {};
|
|
171
171
|
for (const kind of REMARK_KINDS) {
|
|
172
172
|
const custom = overrides?.[kind];
|
|
173
|
-
|
|
173
|
+
const voice = voiceOverrides?.[kind];
|
|
174
|
+
if (custom !== undefined && custom.length > 0) {
|
|
175
|
+
this.pools[kind] = custom;
|
|
176
|
+
}
|
|
177
|
+
else if (voice !== undefined && voice.length > 0) {
|
|
178
|
+
this.pools[kind] = voice;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.pools[kind] = BUILTIN_REMARKS[kind];
|
|
182
|
+
}
|
|
174
183
|
}
|
|
175
184
|
}
|
|
176
185
|
/** The effective pool for one slot (custom override or built-in). */
|
package/lib/types/service.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { Context, Service } from '@deepseek-ai/cordis';
|
|
15
15
|
import type { AffinityConfig, PetAffinityView, PetInteraction } from './affinity.ts';
|
|
16
|
+
import { type PetAnnouncement } from './announce.ts';
|
|
16
17
|
import type { TreatConfig } from './treats.ts';
|
|
17
18
|
import { type LedgerInteractionResult } from './ledger.ts';
|
|
18
19
|
import { type PetDisplayConfig } from './persist.ts';
|
|
@@ -135,6 +136,12 @@ export interface PetStateView {
|
|
|
135
136
|
* settles the view in memory but never writes pet.json.
|
|
136
137
|
*/
|
|
137
138
|
gameplay?: PetGameplayStateView;
|
|
139
|
+
/**
|
|
140
|
+
* The freshest plugin-authored announcement (dsh-usage linkage), within
|
|
141
|
+
* its TTL; absent when none is fresh. Rendered as a dedicated styled
|
|
142
|
+
* bubble above the session stack.
|
|
143
|
+
*/
|
|
144
|
+
announcement?: PetAnnouncement;
|
|
138
145
|
}
|
|
139
146
|
/** Result of `pet.interact`. */
|
|
140
147
|
export type PetInteractResult = LedgerInteractionResult;
|
|
@@ -183,6 +190,8 @@ export declare class PetService extends Service {
|
|
|
183
190
|
private enabled;
|
|
184
191
|
/** Status-decoration master switch (M5, #567); mirrored from settings. */
|
|
185
192
|
private decorationEnabled;
|
|
193
|
+
/** The freshest plugin-authored announcement (dsh-usage linkage). */
|
|
194
|
+
private announcement;
|
|
186
195
|
private disposeActivity;
|
|
187
196
|
/** Session whose most recent meaningful event currently drives the global pet. */
|
|
188
197
|
private displaySession;
|
|
@@ -215,6 +224,15 @@ export declare class PetService extends Service {
|
|
|
215
224
|
isEnabled(): boolean;
|
|
216
225
|
/** RPC: current pet state snapshot. */
|
|
217
226
|
state(currentSessionId?: string): Promise<PetStateView>;
|
|
227
|
+
/**
|
|
228
|
+
* RPC: one plugin-authored announcement bubble (dsh-usage linkage). The
|
|
229
|
+
* payload is validated into a bounded PetAnnouncement; a malformed one is
|
|
230
|
+
* dropped silently — a sibling plugin's bug must never surface as pet
|
|
231
|
+
* breakage. The announcement is in-memory only.
|
|
232
|
+
*/
|
|
233
|
+
announce(input: unknown): {
|
|
234
|
+
ok: boolean;
|
|
235
|
+
};
|
|
218
236
|
/** Current persisted display config (read-only view). */
|
|
219
237
|
display(): PetDisplayConfig;
|
|
220
238
|
/** RPC: the registry entries the browser half renders and selects from. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
|
package/lib/types/service.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* @module @linxin666/dsh-pet/service
|
|
13
13
|
*/
|
|
14
14
|
import { Service } from '@deepseek-ai/cordis';
|
|
15
|
+
import { announcementFresh, parseAnnouncement } from "./announce.js";
|
|
15
16
|
import { emptyProjectionRuntime, isActivityPhase, projectOfficialEvent, } from "./event-projection.js";
|
|
16
17
|
import { PetLedger } from "./ledger.js";
|
|
17
18
|
import { DEFAULT_PET_NAME, DISPLAY_INSET_MAX, DISPLAY_SIZE_MAX, DISPLAY_SIZE_MIN, PET_NAME_MAX_LENGTH, loadPetPersist, petHomeDir, savePetPersist, } from "./persist.js";
|
|
@@ -42,6 +43,8 @@ export class PetService extends Service {
|
|
|
42
43
|
enabled;
|
|
43
44
|
/** Status-decoration master switch (M5, #567); mirrored from settings. */
|
|
44
45
|
decorationEnabled;
|
|
46
|
+
/** The freshest plugin-authored announcement (dsh-usage linkage). */
|
|
47
|
+
announcement;
|
|
45
48
|
disposeActivity;
|
|
46
49
|
/** Session whose most recent meaningful event currently drives the global pet. */
|
|
47
50
|
displaySession;
|
|
@@ -81,10 +84,12 @@ export class PetService extends Service {
|
|
|
81
84
|
persist = { ...persist, petId: this.registry.defaultEntry().id };
|
|
82
85
|
}
|
|
83
86
|
const selected = this.registry.byId(persist.petId) ?? this.registry.defaultEntry();
|
|
87
|
+
const voiceRemarks = mergeVoicePacks(this.registry.globalVoice, selected.voice)?.remarks;
|
|
84
88
|
const ledgerConfig = {
|
|
85
89
|
affinity: config.affinity,
|
|
86
90
|
treats: config.treats,
|
|
87
91
|
remarks: selected.remarks,
|
|
92
|
+
voiceRemarks,
|
|
88
93
|
};
|
|
89
94
|
this.ledger = new PetLedger(persist, ledgerConfig);
|
|
90
95
|
this.stateConfig = { ...defaultPetStateConfig, ...(config.state ?? {}) };
|
|
@@ -117,6 +122,19 @@ export class PetService extends Service {
|
|
|
117
122
|
async state(currentSessionId) {
|
|
118
123
|
return this.view(currentSessionId);
|
|
119
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* RPC: one plugin-authored announcement bubble (dsh-usage linkage). The
|
|
127
|
+
* payload is validated into a bounded PetAnnouncement; a malformed one is
|
|
128
|
+
* dropped silently — a sibling plugin's bug must never surface as pet
|
|
129
|
+
* breakage. The announcement is in-memory only.
|
|
130
|
+
*/
|
|
131
|
+
announce(input) {
|
|
132
|
+
const parsed = parseAnnouncement(input, Date.now());
|
|
133
|
+
if (parsed === undefined)
|
|
134
|
+
return { ok: false };
|
|
135
|
+
this.announcement = parsed;
|
|
136
|
+
return { ok: true };
|
|
137
|
+
}
|
|
120
138
|
/** Current persisted display config (read-only view). */
|
|
121
139
|
display() {
|
|
122
140
|
return { ...this.ledger.snapshot.display };
|
|
@@ -164,7 +182,8 @@ export class PetService extends Service {
|
|
|
164
182
|
if (entry === undefined)
|
|
165
183
|
return { ok: false, error: 'unknown-pet' };
|
|
166
184
|
this.ledger.setPetId(entry.id);
|
|
167
|
-
this.
|
|
185
|
+
const voiceRemarks = mergeVoicePacks(this.registry.globalVoice, entry.voice)?.remarks;
|
|
186
|
+
this.ledger.setRemarks(entry.remarks, voiceRemarks);
|
|
168
187
|
this.flush();
|
|
169
188
|
this.syncSettingsFromPet();
|
|
170
189
|
return { ok: true, petId: entry.id };
|
|
@@ -602,6 +621,11 @@ export class PetService extends Service {
|
|
|
602
621
|
}
|
|
603
622
|
// Read-only: the ledger settles on economic events only, never on a read,
|
|
604
623
|
// so polling the state cannot trigger pet.json writes.
|
|
624
|
+
// An expired announcement simply stops appearing (the client's 2 s poll
|
|
625
|
+
// drops it); no timer owns its removal.
|
|
626
|
+
const announcement = this.announcement !== undefined && announcementFresh(this.announcement, Date.now())
|
|
627
|
+
? this.announcement
|
|
628
|
+
: undefined;
|
|
605
629
|
return {
|
|
606
630
|
animation: snapshot.animation,
|
|
607
631
|
...(snapshot.bubble === undefined ? {} : { bubble: snapshot.bubble }),
|
|
@@ -609,6 +633,7 @@ export class PetService extends Service {
|
|
|
609
633
|
sessionActive: snapshot.sessionActive,
|
|
610
634
|
sessions,
|
|
611
635
|
...(decoration === undefined ? {} : { decoration }),
|
|
636
|
+
...(announcement === undefined ? {} : { announcement }),
|
|
612
637
|
affinity: this.ledger.affinityView(Date.now()),
|
|
613
638
|
display: { ...this.ledger.snapshot.display },
|
|
614
639
|
pet: {
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* @module @linxin666/dsh-pet/voice-pack
|
|
29
29
|
*/
|
|
30
30
|
import { type VoicePackOverrides, type WhisperCategory, type WhisperResult } from './chatter.ts';
|
|
31
|
+
import { type PetRemarks } from './remarks.ts';
|
|
31
32
|
/** Schema version this module normalizes (optional field; missing = 1). */
|
|
32
33
|
export declare const VOICE_PACK_V1: 1;
|
|
33
34
|
/** Hover-panel action buttons a pack can show or hide (canonical order). */
|
|
@@ -54,6 +55,10 @@ export interface VoicePack {
|
|
|
54
55
|
overrides: VoicePackOverrides;
|
|
55
56
|
/** Hover-panel chrome, when the pack declares any. */
|
|
56
57
|
panel?: PetPanelView;
|
|
58
|
+
/** Pat/feed interaction remark pools (issue #1226). */
|
|
59
|
+
remarks?: PetRemarks;
|
|
60
|
+
/** Affinity rank name overrides (issue #1226). */
|
|
61
|
+
ranks?: Record<string, string>;
|
|
57
62
|
}
|
|
58
63
|
/** Hard caps shared by every pool slot (mirrors the remarks discipline). */
|
|
59
64
|
export declare const VOICE_POOL_LINES_MAX = 64;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-pack.d.ts","sourceRoot":"","sources":["../../src/voice-pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"voice-pack.d.ts","sourceRoot":"","sources":["../../src/voice-pack.ts"],"names":[],"mappings":"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"}
|