@linxin666/dsh-pet 0.3.6 → 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.
Files changed (52) hide show
  1. package/README.i18n.yaml +2 -2
  2. package/README.md +4 -0
  3. package/README.zh.md +4 -0
  4. package/lib/client.js +187 -88
  5. package/lib/client.js.map +1 -1
  6. package/lib/index.js +89 -11
  7. package/lib/live2d-vendor.js +106 -95
  8. package/lib/live2d-vendor.js.map +1 -1
  9. package/lib/types/announce.d.ts +53 -0
  10. package/lib/types/announce.d.ts.map +1 -0
  11. package/lib/types/announce.js +80 -0
  12. package/lib/types/client/PetDockEntry.d.ts +14 -5
  13. package/lib/types/client/PetDockEntry.d.ts.map +1 -1
  14. package/lib/types/client/PetDockEntry.js +6 -5
  15. package/lib/types/client/PetSettingsCard.d.ts +2 -1
  16. package/lib/types/client/PetSettingsCard.d.ts.map +1 -1
  17. package/lib/types/client/PetSprite.d.ts +8 -0
  18. package/lib/types/client/PetSprite.d.ts.map +1 -1
  19. package/lib/types/client/PetSprite.js +29 -4
  20. package/lib/types/client/index.d.ts +8 -5
  21. package/lib/types/client/index.d.ts.map +1 -1
  22. package/lib/types/client/index.js +11 -5
  23. package/lib/types/client/locales.d.ts +2 -2
  24. package/lib/types/client/locales.js +2 -2
  25. package/lib/types/client/pet-store.d.ts +1 -1
  26. package/lib/types/client/pet-store.d.ts.map +1 -1
  27. package/lib/types/client/pet-store.js +1 -1
  28. package/lib/types/client/settings-form.d.ts +35 -43
  29. package/lib/types/client/settings-form.d.ts.map +1 -1
  30. package/lib/types/client/settings-form.js +60 -53
  31. package/lib/types/index.d.ts.map +1 -1
  32. package/lib/types/index.js +10 -9
  33. package/lib/types/service.d.ts +18 -0
  34. package/lib/types/service.d.ts.map +1 -1
  35. package/lib/types/service.js +22 -0
  36. package/package.json +17 -13
  37. package/src/announce.ts +103 -0
  38. package/src/client/PetDockEntry.test.tsx +1 -1
  39. package/src/client/PetDockEntry.tsx +15 -4
  40. package/src/client/PetSettingsCard.tsx +2 -1
  41. package/src/client/PetSprite.test.tsx +18 -0
  42. package/src/client/PetSprite.tsx +66 -3
  43. package/src/client/gameplay-hud.test.tsx +1 -1
  44. package/src/client/index.test.tsx +2 -2
  45. package/src/client/index.ts +17 -6
  46. package/src/client/locales.ts +2 -2
  47. package/src/client/pet-store.ts +2 -2
  48. package/src/client/pet.module.css +104 -0
  49. package/src/client/settings-form.ts +78 -92
  50. package/src/dsh-home.ts +1 -1
  51. package/src/index.ts +17 -15
  52. package/src/service.ts +28 -1
package/src/service.ts CHANGED
@@ -15,6 +15,7 @@
15
15
  import { Context, Service } from '@deepseek-ai/cordis'
16
16
  import type { Session, SessionEvent } from '@deepseek-ai/dsh-session'
17
17
  import type { AffinityConfig, PetAffinityView, PetInteraction } from './affinity.ts'
18
+ import { announcementFresh, parseAnnouncement, type PetAnnouncement } from './announce.ts'
18
19
  import type { TreatConfig } from './treats.ts'
19
20
  import {
20
21
  emptyProjectionRuntime,
@@ -191,6 +192,12 @@ export interface PetStateView {
191
192
  * settles the view in memory but never writes pet.json.
192
193
  */
193
194
  gameplay?: PetGameplayStateView
195
+ /**
196
+ * The freshest plugin-authored announcement (dsh-usage linkage), within
197
+ * its TTL; absent when none is fresh. Rendered as a dedicated styled
198
+ * bubble above the session stack.
199
+ */
200
+ announcement?: PetAnnouncement
194
201
  }
195
202
 
196
203
  /** Result of `pet.interact`. */
@@ -224,7 +231,6 @@ declare module '@deepseek-ai/cordis' {
224
231
  pet: PetService
225
232
  }
226
233
  }
227
-
228
234
  /** Per-session pet activity: projection runtime plus the session's own machine. */
229
235
  interface SessionActivity {
230
236
  runtime: ProjectionRuntime
@@ -257,6 +263,8 @@ export class PetService extends Service {
257
263
  private enabled: boolean
258
264
  /** Status-decoration master switch (M5, #567); mirrored from settings. */
259
265
  private decorationEnabled: boolean
266
+ /** The freshest plugin-authored announcement (dsh-usage linkage). */
267
+ private announcement: PetAnnouncement | undefined
260
268
  private disposeActivity: (() => void) | undefined
261
269
  /** Session whose most recent meaningful event currently drives the global pet. */
262
270
  private displaySession: Session | undefined
@@ -340,6 +348,19 @@ export class PetService extends Service {
340
348
  return this.view(currentSessionId)
341
349
  }
342
350
 
351
+ /**
352
+ * RPC: one plugin-authored announcement bubble (dsh-usage linkage). The
353
+ * payload is validated into a bounded PetAnnouncement; a malformed one is
354
+ * dropped silently — a sibling plugin's bug must never surface as pet
355
+ * breakage. The announcement is in-memory only.
356
+ */
357
+ announce(input: unknown): { ok: boolean } {
358
+ const parsed = parseAnnouncement(input, Date.now())
359
+ if (parsed === undefined) return { ok: false }
360
+ this.announcement = parsed
361
+ return { ok: true }
362
+ }
363
+
343
364
  /** Current persisted display config (read-only view). */
344
365
  display(): PetDisplayConfig {
345
366
  return { ...this.ledger.snapshot.display }
@@ -813,6 +834,11 @@ export class PetService extends Service {
813
834
  }
814
835
  // Read-only: the ledger settles on economic events only, never on a read,
815
836
  // so polling the state cannot trigger pet.json writes.
837
+ // An expired announcement simply stops appearing (the client's 2 s poll
838
+ // drops it); no timer owns its removal.
839
+ const announcement = this.announcement !== undefined && announcementFresh(this.announcement, Date.now())
840
+ ? this.announcement
841
+ : undefined
816
842
  return {
817
843
  animation: snapshot.animation,
818
844
  ...(snapshot.bubble === undefined ? {} : { bubble: snapshot.bubble }),
@@ -820,6 +846,7 @@ export class PetService extends Service {
820
846
  sessionActive: snapshot.sessionActive,
821
847
  sessions,
822
848
  ...(decoration === undefined ? {} : { decoration }),
849
+ ...(announcement === undefined ? {} : { announcement }),
823
850
  affinity: this.ledger.affinityView(Date.now()),
824
851
  display: { ...this.ledger.snapshot.display },
825
852
  pet: {