pi-courier 0.1.46 → 0.1.47

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 (62) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/assets/avatars/instance-01.png +0 -0
  4. package/assets/avatars/instance-02.png +0 -0
  5. package/assets/avatars/instance-03.png +0 -0
  6. package/assets/avatars/instance-04.png +0 -0
  7. package/assets/avatars/instance-05.png +0 -0
  8. package/assets/avatars/instance-06.png +0 -0
  9. package/assets/avatars/instance-07.png +0 -0
  10. package/assets/avatars/instance-08.png +0 -0
  11. package/assets/avatars/instance-09.png +0 -0
  12. package/assets/avatars/instance-10.png +0 -0
  13. package/assets/avatars/instance-11.png +0 -0
  14. package/assets/avatars/instance-12.png +0 -0
  15. package/assets/avatars/management.png +0 -0
  16. package/assets/avatars-drafts/candy-pool/instance-01.png +0 -0
  17. package/assets/avatars-drafts/candy-pool/instance-02.png +0 -0
  18. package/assets/avatars-drafts/candy-pool/instance-03.png +0 -0
  19. package/assets/avatars-drafts/candy-pool/instance-04.png +0 -0
  20. package/assets/avatars-drafts/candy-pool/instance-05.png +0 -0
  21. package/assets/avatars-drafts/candy-pool/instance-06.png +0 -0
  22. package/assets/avatars-drafts/candy-pool/instance-07.png +0 -0
  23. package/assets/avatars-drafts/candy-pool/instance-08.png +0 -0
  24. package/assets/avatars-drafts/candy-pool/instance-09.png +0 -0
  25. package/assets/avatars-drafts/candy-pool/instance-10.png +0 -0
  26. package/assets/avatars-drafts/candy-pool/instance-11.png +0 -0
  27. package/assets/avatars-drafts/candy-pool/instance-12.png +0 -0
  28. package/assets/avatars-drafts/candy-pool/management.png +0 -0
  29. package/assets/avatars-drafts/candy-preview-cat.png +0 -0
  30. package/assets/avatars-drafts/candy-v2-jewel.png +0 -0
  31. package/assets/avatars-drafts/candy-v2-lollipop.png +0 -0
  32. package/assets/avatars-drafts/candy-v2-marshmallow.png +0 -0
  33. package/assets/avatars-drafts/candy-v3-jelly.png +0 -0
  34. package/assets/avatars-drafts/candy-v3-jewel.png +0 -0
  35. package/assets/avatars-drafts/candy-v3-lollipop.png +0 -0
  36. package/assets/avatars-drafts/candy-v3-marshmallow.png +0 -0
  37. package/assets/avatars-drafts/candy-v4-marshmallow-eyes.png +0 -0
  38. package/assets/avatars-drafts/candy-v5-marshmallow-balanced.png +0 -0
  39. package/assets/avatars-drafts/candy-v6-marshmallow-realistic-eyes.png +0 -0
  40. package/assets/avatars-drafts/candy-v7-round-realistic-eyes.png +0 -0
  41. package/assets/avatars-drafts/candy-v8-round-realistic-eyes-nolash.png +0 -0
  42. package/assets/avatars-drafts/candy-v9-nosquare-neg.png +0 -0
  43. package/dist/rpc/pmctl-controller.js +1 -1
  44. package/dist/space-identity.d.ts +17 -9
  45. package/dist/space-identity.d.ts.map +1 -1
  46. package/dist/space-identity.js +18 -10
  47. package/dist/space-identity.js.map +1 -1
  48. package/dist/space.d.ts +22 -14
  49. package/dist/space.d.ts.map +1 -1
  50. package/dist/space.js +47 -21
  51. package/dist/space.js.map +1 -1
  52. package/dist/standalone.js +1 -1
  53. package/dist/transports/interface.d.ts +10 -4
  54. package/dist/transports/interface.d.ts.map +1 -1
  55. package/dist/transports/matrix-rooms.d.ts +10 -2
  56. package/dist/transports/matrix-rooms.d.ts.map +1 -1
  57. package/dist/transports/matrix-rooms.js +21 -4
  58. package/dist/transports/matrix-rooms.js.map +1 -1
  59. package/dist/types.d.ts +6 -0
  60. package/dist/types.d.ts.map +1 -1
  61. package/package.json +1 -1
  62. package/scripts/generate-avatars-candy.mjs +276 -0
package/README.md CHANGED
@@ -263,7 +263,7 @@ One bot account can serve multiple projects — each project gets its own privat
263
263
 
264
264
  - **Management room**: with the **space feature enabled** (fresh multi-project setups default to it), the bot **creates the management room itself at startup**, inside a private Element space `π <instance>`, and invites all trusted users — no first DM needed; trusted users who join via the challenge later are invited into the management room automatically (one invite per person, failures retried by the next-start self-heal). With the space off (or if its creation fails), the classic behavior applies: the first room where the bot **successfully accepts (authorizes) a message** — a non-project, ≤2-person room — becomes the management room (renamed to `项目管理(<instance>)`, guide sent, room ID persisted to `config.managementRooms`). Either way the room is the admin console — `/pmctl` works only there — and its ID is stable afterwards.
265
265
  - **Space organization (Element)**: a purely cosmetic grouping — a private space `π <instanceName>` collects every room the bot creates (the management room and all `/pmctl new` project rooms) so they don't scatter across your room list. The space itself takes no part in authorization — who may send commands and who holds which room permissions is decided by the permission model below. `/pmctl rm` also removes the room from the space. Toggle it in `setup` (`启用空间组织?`, fresh configs default on, existing configs keep their current state); creation is lazy at the next start, and any failure just falls back to the unspace'd behavior with a warning and a retry on the next start. Users who pass the challenge later are invited into the space automatically (one invite per person, ever). A space still carrying the old `pi-courier · <instance>` name is renamed to the short form by the next-start self-heal (manually renamed spaces are left alone).
266
- - **Room avatars (pixel art)**: the bot automatically sets a bundled pixel-art avatar on every room it manages — the space and each project room pick from a 12-image pool by hashing the instance/project name (same name → same image forever, different ones usually differ), and the management room gets a dedicated image. Existing rooms are branded on the next start too; an avatar you set manually is never replaced. Not a fan of the art? Replace any PNG in `assets/avatars/` (same filename) with your own.
266
+ - **Room avatars (candy art)**: the bot automatically sets a bundled high-res candy-style avatar (fluffy marshmallow animals on a cotton-candy background, 512×512) on every room it manages — the space and each project room pick from a 12-image pool by hashing the instance/project name (same name → same image forever, different ones usually differ), and the management room gets a dedicated image. Existing rooms are branded on the next start too; an avatar you set manually is never replaced. When the bundled pool ships a full restyle, rooms the bot itself branded get the new art automatically on the next start (your own avatars are still never touched). Not a fan of the art? Replace any PNG in `assets/avatars/` (same filename) with your own.
267
267
  - **Permission model (trusted = admin)**: trusted users automatically hold **admin power** (PL 100) in every room the bot manages — the space, the management room and all project rooms — regardless of whether trust came from setup or the challenge, and regardless of membership (late joiners arrive with the level already in place). `/revoke <userId>` strips that admin power in every managed room at the same time (back to plain member); a failed demotion is retried by the next-start self-heal. Zero configuration — the first start after upgrading heals existing rooms too. Admins promoted by the pre-0.1.37 special case (project-room creator) are not in the demotion ledger: `/revoke` still demotes them on the spot, and only if that on-the-spot demotion fails do you need to lower them manually once in your client.
268
268
  - **Create a project** (in the management room):
269
269
  ```
package/README.zh-CN.md CHANGED
@@ -130,7 +130,7 @@ pi 工作目录 [默认 /home/你/Projects]: ← 回车或输
130
130
 
131
131
  - **管理房间**:开启**空间组织**时(全新多工程配置默认开启),bot 在启动时**自行创建**管理房间 —— 位于私有空间 `π <实例名>` 内,并邀请全部信任用户,无需先给 bot 发 DM;后续经验证码加入的信任用户也会被自动邀请进管理房间(每人只邀一次,失败由下次启动自愈重试)。空间关闭(或创建失败)时沿用经典行为:bot **第一次成功受理(授权通过)的、非项目的私有/2 人房间**固化为管理房间(自动改名 `项目管理(<实例名>)` 并发送使用说明,房间 ID 写入 `config.managementRooms`)。两种路径下管理房间都是"管理台"(`/pmctl` 仅在此可用),且房间 ID 之后保持稳定。
132
132
  - **空间组织(Element)**:纯展示层收纳 —— 私有空间 `π <实例名>` 收集 bot 创建的所有房间(管理房间 + `/pmctl new` 的项目房间),不再散落在房间列表里;空间本身不参与授权判定——谁能发命令、谁有什么房间权限,由下面的权限模型决定。`/pmctl rm` 删除项目时同步把房间移出空间。开关在 `setup`(`启用空间组织?`,全新配置默认开、已有配置保持现状);空间在下次启动时懒创建,失败仅警告并回退无空间行为、下次启动自动重试。后续通过验证码成为信任用户的用户会被自动邀请进空间(每人只邀请一次)。还叫旧名字 `pi-courier · <实例名>` 的空间会被下次启动自愈改成短名(手动改过名的空间不动)。
133
- - **房间头像(像素风)**:bot 自动为托管的所有房间设置内置像素头像 —— 空间和项目房间按实例名/项目名哈希从 12 张头像池中取图(同名永远同一张,不同部署基本不同),管理房间使用专属头像;存量房间下次启动自动补齐,手动设置过的头像绝不被覆盖。不喜欢这些图?把 `assets/avatars/` 下的同名 PNG 换成你自己的即可,无需改代码。
133
+ - **房间头像(糖果风)**:bot 自动为托管的所有房间设置内置高清糖果风头像(棉花糖质感小动物 + 棉花糖云背景,512×512)—— 空间和项目房间按实例名/项目名哈希从 12 张头像池中取图(同名永远同一张,不同部署基本不同),管理房间使用专属头像;存量房间下次启动自动补齐,手动设置过的头像绝不被覆盖。头像池整体换风格后,bot 自己刷过旧头像的房间会在下次启动自动换成新图(你手动设置的依然绝不碰)。不喜欢这些图?把 `assets/avatars/` 下的同名 PNG 换成你自己的即可,无需改代码。
134
134
  - **权限模型(信任即管理员)**:信任用户在 bot 托管的所有房间——空间、管理房间、全部项目房间——自动拥有**管理员权限**(PL 100):无论信任来自 setup 还是验证码、是否已加入该房间(后加入者进房时权限已就位)。`/revoke <userId>` 撤销信任时,该用户在全部托管房间的管理员权限**同步收回**(降回普通级别),降权失败由下次启动自愈兜底。零配置,升级后的首次启动自动补齐存量房间;旧版本(≤0.1.36)由旧特例(项目房间创建者提权)成为管理员的用户不在降权簿记内——`/revoke` 仍会即时对其降权,仅当那次即时降权也失败时才需在客户端手动降一次。
135
135
  - **创建项目**(在管理房间发):
136
136
  ```
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -161,7 +161,7 @@ export class PmctlController {
161
161
  spaceNote = `\n⚠️ 挂入空间失败(不影响项目): ${err.message}`;
162
162
  }
163
163
  }
164
- // Brand the room with its bundled pixel avatar immediately — the
164
+ // Brand the room with its bundled candy avatar immediately — the
165
165
  // startup identity heal would only reach a mid-session room on the
166
166
  // next restart. Same 只补缺 rule; a failure is cosmetic and self-heals.
167
167
  let avatarNote = "";
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * The space is named `π <instanceName>` (short; the old `pi-courier · <name>`
5
5
  * template is migrated on startup — see isLegacySpaceName). Every managed room
6
- * also gets a bundled pixel avatar (assets/avatars/, generated by
7
- * scripts/generate-avatars.mjs — original artwork, blocky-pixel style): the
8
- * space picks by instanceName hash and project rooms by project name hash, so
9
- * each deployment lands on a stable image (recreates and restarts keep it)
10
- * while different instances/projects usually differ. The management room uses
11
- * the dedicated management.png. All artwork is original — generic blocky
12
- * pixel style only, no third-party assets; users can swap any PNG for their
13
- * own (same filename) without touching code.
6
+ * also gets a bundled avatar (assets/avatars/, generated by
7
+ * scripts/generate-avatars-candy.mjs — original artwork, soft candy /
8
+ * marshmallow animal style): the space picks by instanceName hash and project
9
+ * rooms by project name hash, so each deployment lands on a stable image
10
+ * (recreates and restarts keep it) while different instances/projects usually
11
+ * differ. The management room uses the dedicated management.png. All artwork
12
+ * is original AI-generated, no third-party assets; users can swap any PNG for
13
+ * their own (same filename) without touching code.
14
14
  */
15
15
  /** Number of images in the shared pool (instance-01 … instance-12). */
16
16
  export declare const AVATAR_POOL_SIZE = 12;
@@ -26,9 +26,17 @@ export declare function nameHash(name: string): number;
26
26
  export declare function pickPoolAvatarFile(name: string): string;
27
27
  /** The management room's dedicated image (always the same, always one of a kind). */
28
28
  export declare function managementAvatarFile(): string;
29
+ /**
30
+ * Version marker for the bundled avatar pool. Bump ONLY when the pool ships
31
+ * a full restyle (v2 pixel → v3 candy bumped 1 → 2): rooms whose avatar the
32
+ * bot itself set under an older marker get re-branded once by the startup
33
+ * identity heal (see ensureRoomAvatar). User-set avatars are never touched
34
+ * regardless of markers.
35
+ */
36
+ export declare const AVATAR_POOL_VERSION = 2;
29
37
  /** Read a bundled avatar PNG. Throws if the asset is missing — callers treat
30
38
  * that like any other identity-heal failure (warn + retry next start). */
31
39
  export declare function readAvatarBundled(file: string): Buffer;
32
- /** m.room.avatar `info` sub-block describing the bundled 128×128 PNGs. */
40
+ /** m.room.avatar `info` sub-block describing the bundled 512×512 PNGs. */
33
41
  export declare function avatarInfo(data: Buffer): Record<string, unknown>;
34
42
  //# sourceMappingURL=space-identity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"space-identity.d.ts","sourceRoot":"","sources":["../src/space-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,uEAAuE;AACvE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;yEACyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;2DAC2D;AAC3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;2EAC2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AASD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE"}
1
+ {"version":3,"file":"space-identity.d.ts","sourceRoot":"","sources":["../src/space-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,uEAAuE;AACvE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;yEACyE;AACzE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;2DAC2D;AAC3D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7C;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;2EAC2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AASD,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE"}
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * The space is named `π <instanceName>` (short; the old `pi-courier · <name>`
5
5
  * template is migrated on startup — see isLegacySpaceName). Every managed room
6
- * also gets a bundled pixel avatar (assets/avatars/, generated by
7
- * scripts/generate-avatars.mjs — original artwork, blocky-pixel style): the
8
- * space picks by instanceName hash and project rooms by project name hash, so
9
- * each deployment lands on a stable image (recreates and restarts keep it)
10
- * while different instances/projects usually differ. The management room uses
11
- * the dedicated management.png. All artwork is original — generic blocky
12
- * pixel style only, no third-party assets; users can swap any PNG for their
13
- * own (same filename) without touching code.
6
+ * also gets a bundled avatar (assets/avatars/, generated by
7
+ * scripts/generate-avatars-candy.mjs — original artwork, soft candy /
8
+ * marshmallow animal style): the space picks by instanceName hash and project
9
+ * rooms by project name hash, so each deployment lands on a stable image
10
+ * (recreates and restarts keep it) while different instances/projects usually
11
+ * differ. The management room uses the dedicated management.png. All artwork
12
+ * is original AI-generated, no third-party assets; users can swap any PNG for
13
+ * their own (same filename) without touching code.
14
14
  */
15
15
  import { readFileSync } from "node:fs";
16
16
  /** Number of images in the shared pool (instance-01 … instance-12). */
@@ -41,6 +41,14 @@ export function pickPoolAvatarFile(name) {
41
41
  export function managementAvatarFile() {
42
42
  return "management.png";
43
43
  }
44
+ /**
45
+ * Version marker for the bundled avatar pool. Bump ONLY when the pool ships
46
+ * a full restyle (v2 pixel → v3 candy bumped 1 → 2): rooms whose avatar the
47
+ * bot itself set under an older marker get re-branded once by the startup
48
+ * identity heal (see ensureRoomAvatar). User-set avatars are never touched
49
+ * regardless of markers.
50
+ */
51
+ export const AVATAR_POOL_VERSION = 2;
44
52
  /** Read a bundled avatar PNG. Throws if the asset is missing — callers treat
45
53
  * that like any other identity-heal failure (warn + retry next start). */
46
54
  export function readAvatarBundled(file) {
@@ -53,8 +61,8 @@ function avatarAssetUrl(file) {
53
61
  throw new Error(`非法的头像文件名: ${file}`);
54
62
  return new URL(`../assets/avatars/${file}`, import.meta.url);
55
63
  }
56
- /** m.room.avatar `info` sub-block describing the bundled 128×128 PNGs. */
64
+ /** m.room.avatar `info` sub-block describing the bundled 512×512 PNGs. */
57
65
  export function avatarInfo(data) {
58
- return { mimetype: "image/png", width: 128, height: 128, size: data.length };
66
+ return { mimetype: "image/png", width: 512, height: 512, size: data.length };
59
67
  }
60
68
  //# sourceMappingURL=space-identity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"space-identity.js","sourceRoot":"","sources":["../src/space-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,OAAO,KAAK,YAAY,EAAE,CAAC;AAC7B,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,YAAoB;IAClE,OAAO,IAAI,KAAK,gBAAgB,YAAY,EAAE,CAAC;AACjD,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAAE,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;AAC1D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,oBAAoB;IAClC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;2EAC2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,GAAG,CAAC,qBAAqB,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"space-identity.js","sourceRoot":"","sources":["../src/space-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,OAAO,KAAK,YAAY,EAAE,CAAC;AAC7B,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,YAAoB;IAClE,OAAO,IAAI,KAAK,gBAAgB,YAAY,EAAE,CAAC;AACjD,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;QAAE,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;AAC1D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,oBAAoB;IAClC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;2EAC2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,GAAG,CAAC,qBAAqB,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/E,CAAC"}
package/dist/space.d.ts CHANGED
@@ -44,23 +44,31 @@ export type SpaceEnsureResult = "skipped" | "ready" | "degraded";
44
44
  * rule — deliberately not configurable. */
45
45
  export declare const TRUSTED_POWER_LEVEL = 100;
46
46
  export declare function ensureSpaceAndManagementRoom(deps: SpaceEnsureDeps): Promise<SpaceEnsureResult>;
47
- /** Set the bundled avatar on ONE room but only when the room has none:
48
- * anything the user set themselves is never replaced. Throws on failure —
49
- * callers pick the policy (the startup heal warns + retries next start; the
50
- * /pmctl new path surfaces a non-fatal note). Returns true when an avatar
51
- * was set, false when the room already had one. Shared by the startup
52
- * identity heal and the project-room creation path (a mid-session room
53
- * must not wait for the next restart to get its face). */
54
- export declare function ensureRoomAvatar(roomOps: RoomOps, roomId: string, file: string): Promise<boolean>;
47
+ /** Brand ONE room with the bundled avatar. Default policy is 只补缺: a room
48
+ * that already has an avatar keeps it — anything the user set themselves is
49
+ * never replaced. With `rebrandIfBotOwned` (the startup heal, while an
50
+ * avatar-pool version migration is pending), an existing avatar is replaced
51
+ * ONLY when the bot itself set it the sender check is what separates our
52
+ * own outdated branding from user intent. Throws on failure — callers pick
53
+ * the policy (the startup heal warns + retries next start; the /pmctl new
54
+ * path surfaces a non-fatal note). Returns what happened: "set" (room had
55
+ * none), "rebranded" (bot-owned old avatar replaced) or "kept" (user-owned
56
+ * or rebrand not requested). Shared by the startup identity heal and the
57
+ * project-room creation path (a mid-session room must not wait for the next
58
+ * restart to get its face). */
59
+ export declare function ensureRoomAvatar(roomOps: RoomOps, roomId: string, file: string, opts?: {
60
+ rebrandIfBotOwned?: boolean;
61
+ }): Promise<"set" | "rebranded" | "kept">;
55
62
  /** Startup identity self-heal: brand the managed rooms with the short space
56
- * name and the bundled pixel avatars (space + management + project rooms).
63
+ * name and the bundled candy avatars (space + management + project rooms).
57
64
  * Space mode only — a degraded run's adopted management DM is never touched.
58
- * Two safety rules keep user intent sticky: a space is renamed ONLY when its
65
+ * Safety rules keep user intent sticky: a space is renamed ONLY when its
59
66
  * name still exactly matches the legacy `pi-courier · <instance>` template,
60
- * and an avatar is set ONLY when the room has none — anything the user set
61
- * themselves is left alone. Per-room failures warn and retry on the next
62
- * start; like healTrustedPowerLevels this never throws and never affects
63
- * the startup tri-state. */
67
+ * and an avatar is set when the room has none — plus, while an avatar-pool
68
+ * version migration is pending, replaced when the bot itself set the old
69
+ * one. Anything a user set themselves is left alone. Per-room failures warn
70
+ * and retry on the next start; like healTrustedPowerLevels this never throws
71
+ * and never affects the startup tri-state. */
64
72
  export declare function healRoomIdentities(roomOps: RoomOps, store: ConfigStore): Promise<void>;
65
73
  /** Unified idempotent elevation for ONE room (#42): read the room's power
66
74
  * levels once, then write TRUSTED_POWER_LEVEL only for trusted users whose
@@ -1 +1 @@
1
- {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EAAqB,KAAK,WAAW,EAAoE,MAAM,aAAa,CAAC;AAWpI,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE;4CAC4C;AAC5C,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkGpG;AAED;;;;;;2DAM2D;AAC3D,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMvG;AAED;;;;;;;;6BAQ6B;AAC7B,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C5F;AAED;;;;;;;;;6BAS6B;AAC7B,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BnB;AAED;;;+CAG+C;AAC/C,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CAQ7D;AAED;;;;;;;gCAOgC;AAChC,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhG;AAED;;;;;;;;yDAQyD;AACzD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAyBD;;;;;8DAK8D;AAC9D,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;;;;gBAQgB;AAChB,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;qEAEqE;AACrE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG1D"}
1
+ {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EAAqB,KAAK,WAAW,EAAoE,MAAM,aAAa,CAAC;AAYpI,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE;4CAC4C;AAC5C,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkGpG;AAED;;;;;;;;;;;gCAWgC;AAChC,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC,CAWvC;AAED;;;;;;;;;+CAS+C;AAC/C,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5F;AAED;;;;;;;;;6BAS6B;AAC7B,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BnB;AAED;;;+CAG+C;AAC/C,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,EAAE,CAQ7D;AAED;;;;;;;gCAOgC;AAChC,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhG;AAED;;;;;;;;yDAQyD;AACzD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAyBD;;;;;8DAK8D;AAC9D,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;;;;gBAQgB;AAChB,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;qEAEqE;AACrE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG1D"}
package/dist/space.js CHANGED
@@ -34,7 +34,7 @@
34
34
  import { activeSpaceRoomId, effectiveInstanceName, effectiveWorkdir, isSpaceMode, nativeMxid } from "./config.js";
35
35
  import { logger } from "./logger.js";
36
36
  import { buildManagementRoomHelp, managementRoomName } from "./management-room.js";
37
- import { avatarInfo, isLegacySpaceName, managementAvatarFile, pickPoolAvatarFile, readAvatarBundled, spaceDisplayName, } from "./space-identity.js";
37
+ import { AVATAR_POOL_VERSION, avatarInfo, isLegacySpaceName, managementAvatarFile, pickPoolAvatarFile, readAvatarBundled, spaceDisplayName, } from "./space-identity.js";
38
38
  /** Trusted users are admins in every room pi-courier manages (#42). A fixed
39
39
  * rule — deliberately not configurable. */
40
40
  export const TRUSTED_POWER_LEVEL = 100;
@@ -125,30 +125,41 @@ export async function ensureSpaceAndManagementRoom(deps) {
125
125
  return "degraded";
126
126
  }
127
127
  }
128
- /** Set the bundled avatar on ONE room but only when the room has none:
129
- * anything the user set themselves is never replaced. Throws on failure —
130
- * callers pick the policy (the startup heal warns + retries next start; the
131
- * /pmctl new path surfaces a non-fatal note). Returns true when an avatar
132
- * was set, false when the room already had one. Shared by the startup
133
- * identity heal and the project-room creation path (a mid-session room
134
- * must not wait for the next restart to get its face). */
135
- export async function ensureRoomAvatar(roomOps, roomId, file) {
136
- if (await roomOps.getRoomAvatar(roomId))
137
- return false;
128
+ /** Brand ONE room with the bundled avatar. Default policy is 只补缺: a room
129
+ * that already has an avatar keeps it — anything the user set themselves is
130
+ * never replaced. With `rebrandIfBotOwned` (the startup heal, while an
131
+ * avatar-pool version migration is pending), an existing avatar is replaced
132
+ * ONLY when the bot itself set it the sender check is what separates our
133
+ * own outdated branding from user intent. Throws on failure — callers pick
134
+ * the policy (the startup heal warns + retries next start; the /pmctl new
135
+ * path surfaces a non-fatal note). Returns what happened: "set" (room had
136
+ * none), "rebranded" (bot-owned old avatar replaced) or "kept" (user-owned
137
+ * or rebrand not requested). Shared by the startup identity heal and the
138
+ * project-room creation path (a mid-session room must not wait for the next
139
+ * restart to get its face). */
140
+ export async function ensureRoomAvatar(roomOps, roomId, file, opts = {}) {
141
+ const avatar = await roomOps.getRoomAvatarEvent(roomId);
142
+ if (avatar?.url) {
143
+ const botId = roomOps.getBotUserId();
144
+ const botOwned = !!opts.rebrandIfBotOwned && !!botId && avatar.sender === botId;
145
+ if (!botOwned)
146
+ return "kept";
147
+ }
138
148
  const data = readAvatarBundled(file);
139
149
  const mxcUrl = await roomOps.uploadMedia(data, "image/png");
140
150
  await roomOps.setRoomAvatar(roomId, mxcUrl, avatarInfo(data));
141
- return true;
151
+ return avatar?.url ? "rebranded" : "set";
142
152
  }
143
153
  /** Startup identity self-heal: brand the managed rooms with the short space
144
- * name and the bundled pixel avatars (space + management + project rooms).
154
+ * name and the bundled candy avatars (space + management + project rooms).
145
155
  * Space mode only — a degraded run's adopted management DM is never touched.
146
- * Two safety rules keep user intent sticky: a space is renamed ONLY when its
156
+ * Safety rules keep user intent sticky: a space is renamed ONLY when its
147
157
  * name still exactly matches the legacy `pi-courier · <instance>` template,
148
- * and an avatar is set ONLY when the room has none — anything the user set
149
- * themselves is left alone. Per-room failures warn and retry on the next
150
- * start; like healTrustedPowerLevels this never throws and never affects
151
- * the startup tri-state. */
158
+ * and an avatar is set when the room has none — plus, while an avatar-pool
159
+ * version migration is pending, replaced when the bot itself set the old
160
+ * one. Anything a user set themselves is left alone. Per-room failures warn
161
+ * and retry on the next start; like healTrustedPowerLevels this never throws
162
+ * and never affects the startup tri-state. */
152
163
  export async function healRoomIdentities(roomOps, store) {
153
164
  const cfg = store.get();
154
165
  if (!isSpaceMode(cfg))
@@ -171,7 +182,12 @@ export async function healRoomIdentities(roomOps, store) {
171
182
  }
172
183
  // Avatars: space picks by instance name, the management room has its own
173
184
  // dedicated image, project rooms pick by project name (roomId fallback for
174
- // legacy records without one) — same name, same image, forever.
185
+ // legacy records without one) — same name, same image, forever. While the
186
+ // bundled pool version in config lags behind AVATAR_POOL_VERSION (a full
187
+ // restyle shipped), bot-set old avatars are re-branded once; user-set ones
188
+ // are still never touched. The marker is booked only after every room
189
+ // succeeded — a failed room retries the whole migration next start.
190
+ const rebrandPending = (cfg.avatarPoolVersion ?? 1) < AVATAR_POOL_VERSION;
175
191
  const targets = [
176
192
  { roomId: spaceId, file: pickPoolAvatarFile(instanceName), label: "空间" },
177
193
  ];
@@ -182,16 +198,26 @@ export async function healRoomIdentities(roomOps, store) {
182
198
  for (const [roomId, project] of Object.entries(cfg.projects ?? {})) {
183
199
  targets.push({ roomId, file: pickPoolAvatarFile(project.name ?? roomId), label: `项目房间 ${project.name ?? roomId}` });
184
200
  }
201
+ let allOk = true;
185
202
  for (const target of targets) {
186
203
  try {
187
- if (await ensureRoomAvatar(roomOps, target.roomId, target.file)) {
204
+ const result = await ensureRoomAvatar(roomOps, target.roomId, target.file, {
205
+ rebrandIfBotOwned: rebrandPending,
206
+ });
207
+ if (result === "set")
188
208
  logger.info(`[identity] ${target.label}头像已设置: ${target.file}`);
189
- }
209
+ if (result === "rebranded")
210
+ logger.info(`[identity] ${target.label}头像已升级为新风格: ${target.file}`);
190
211
  }
191
212
  catch (err) {
213
+ allOk = false;
192
214
  logger.warn(`[identity] ${target.label}(${target.roomId})头像设置失败(跳过,下次启动自动重试): ${err.message}`);
193
215
  }
194
216
  }
217
+ // Migration done: book the marker so later starts never re-rebrand (a user
218
+ // who sets a custom avatar afterwards must keep it forever).
219
+ if (rebrandPending && allOk)
220
+ store.update({ avatarPoolVersion: AVATAR_POOL_VERSION });
195
221
  }
196
222
  /** Unified idempotent elevation for ONE room (#42): read the room's power
197
223
  * levels once, then write TRUSTED_POWER_LEVEL only for trusted users whose
package/dist/space.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"space.js","sourceRoot":"","sources":["../src/space.ts"],"names":[],"mappings":"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"}
@@ -239,7 +239,7 @@ export async function main(argv = process.argv.slice(2)) {
239
239
  // one); per-room failures warn inside and never touch the startup
240
240
  // tri-state above.
241
241
  await healTrustedPowerLevels(roomOps, store);
242
- // Room identity (short space name + pixel avatars): space mode only,
242
+ // Room identity (short space name + candy avatars): space mode only,
243
243
  // best-effort per room — never blocks or fails the startup.
244
244
  await healRoomIdentities(roomOps, store);
245
245
  }
@@ -8,7 +8,7 @@
8
8
  * Failure semantics are uniform for operations: every method THROWS with a
9
9
  * meaningful message (callers reply with it). No null returns, no silent
10
10
  * no-ops. The exceptions are the QUERY members (getBotUserId,
11
- * encryptionAvailable, getPowerLevels, getRoomName, getRoomAvatar), which
11
+ * encryptionAvailable, getPowerLevels, getRoomName, getRoomAvatarEvent), which
12
12
  * legitimately report a
13
13
  * not-yet-connected or unavailable/not-present capability instead of
14
14
  * throwing.
@@ -44,9 +44,15 @@ export interface RoomOps {
44
44
  * has no (visible) name — 404 / M_NOT_FOUND. Query member: reports absence
45
45
  * instead of throwing (same contract as getPowerLevels). */
46
46
  getRoomName(roomId: string): Promise<string | null>;
47
- /** Read a room's avatar mxc URL (m.room.avatar content url), or null when
48
- * unset/not visible 404 / M_NOT_FOUND. Query member: same contract. */
49
- getRoomAvatar(roomId: string): Promise<string | null>;
47
+ /** Read a room's avatar state event: its mxc URL and the mxid that set it,
48
+ * or null when the room has none (or the event is not visible) — 404 /
49
+ * M_NOT_FOUND. The sender is what lets the identity heal tell "an avatar
50
+ * the bot itself branded" (safe to restyle on a pool upgrade) apart from
51
+ * "an avatar a human set" (never touched). Query member: same contract. */
52
+ getRoomAvatarEvent(roomId: string): Promise<{
53
+ url: string | null;
54
+ sender: string | null;
55
+ } | null>;
50
56
  /** Set a room's avatar (m.room.avatar) from an already-uploaded mxc URL. */
51
57
  setRoomAvatar(roomId: string, avatarUrl: string, info?: Record<string, unknown>): Promise<void>;
52
58
  /** Upload media to the content repository; returns the mxc:// URL. */
@@ -1 +1 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/transports/interface.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,OAAO;IACtB;oFACgF;IAChF,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClG,oFAAoF;IACpF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,wFAAwF;IACxF,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E;;2EAEuE;IACvE,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE;;uBAEmB;IACnB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,qBAAqB;IACrB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;iEAE6D;IAC7D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD;8EAC0E;IAC1E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtD,4EAA4E;IAC5E,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,sEAAsE;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,qDAAqD;IACrD,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B;;0CAEsC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC;6CACyC;IACzC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF;;;;kBAIc;IACd,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,0CAA0C;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/transports/interface.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,OAAO;IACtB;oFACgF;IAChF,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClG,oFAAoF;IACpF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,wFAAwF;IACxF,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E;;2EAEuE;IACvE,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE;;uBAEmB;IACnB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,4EAA4E;IAC5E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,qBAAqB;IACrB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;iEAE6D;IAC7D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpD;;;;gFAI4E;IAC5E,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAClG,4EAA4E;IAC5E,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,sEAAsE;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,qDAAqD;IACrD,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B;;0CAEsC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC;6CACyC;IACzC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF;;;;kBAIc;IACd,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,0CAA0C;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D"}
@@ -49,8 +49,16 @@ export declare class MatrixRoomOps implements RoomOps {
49
49
  /** Read a room's display name; null when absent (query-member contract,
50
50
  * same 404 / M_NOT_FOUND handling as getPowerLevels). */
51
51
  getRoomName(roomId: string): Promise<string | null>;
52
- /** Read a room's avatar mxc URL; null when the room has none. */
53
- getRoomAvatar(roomId: string): Promise<string | null>;
52
+ /** Read a room's avatar state event (mxc URL + who set it); null when the
53
+ * room has none. matrix-bot-sdk's getRoomStateEvent resolves to the event
54
+ * CONTENT (its own getPublishedAlias reads event['alias'] directly), so
55
+ * the sender is NOT on this response — the sender comes from the full
56
+ * state list instead. Two requests, but the avatar query is startup-only
57
+ * and the room state list is small. */
58
+ getRoomAvatarEvent(roomId: string): Promise<{
59
+ url: string | null;
60
+ sender: string | null;
61
+ } | null>;
54
62
  /** Set a room's avatar from an uploaded mxc URL (m.room.avatar state). */
55
63
  setRoomAvatar(roomId: string, avatarUrl: string, info?: Record<string, unknown>): Promise<void>;
56
64
  /** Upload media to the homeserver's content repository; returns mxc URL. */
@@ -1 +1 @@
1
- {"version":3,"file":"matrix-rooms.d.ts","sourceRoot":"","sources":["../../src/transports/matrix-rooms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,OAAO;IAKzC,OAAO,CAAC,IAAI;IAJd,gFAAgF;IAChF,mBAAmB,UAAS;gBAGlB,IAAI,EAAE;QACZ,SAAS,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;QAC1C,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;QACvC,uEAAuE;QACvE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC;IAGH,OAAO,KAAK,MAAM,GAIjB;IAED;4EACwE;IAClE,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvG,0DAA0D;IACpD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E,iEAAiE;IAC3D,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUnF,mEAAmE;IAC7D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7E,sDAAsD;IAChD,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalF,oDAAoD;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,mEAAmE;IAC7D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D;8DAC0D;IACpD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUzD,iEAAiE;IAC3D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU3D,0EAA0E;IACpE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrG,4EAA4E;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE,iFAAiF;IAC3E,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF;6EACyE;IACnE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAY7E,8DAA8D;IACxD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,4DAA4D;IAC5D,YAAY,IAAI,MAAM,GAAG,IAAI;CAG9B"}
1
+ {"version":3,"file":"matrix-rooms.d.ts","sourceRoot":"","sources":["../../src/transports/matrix-rooms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAc,YAAW,OAAO;IAKzC,OAAO,CAAC,IAAI;IAJd,gFAAgF;IAChF,mBAAmB,UAAS;gBAGlB,IAAI,EAAE;QACZ,SAAS,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;QAC1C,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;QACvC,uEAAuE;QACvE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC;IAGH,OAAO,KAAK,MAAM,GAIjB;IAED;4EACwE;IAClE,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBvG,0DAA0D;IACpD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E,iEAAiE;IAC3D,WAAW,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAUnF,mEAAmE;IAC7D,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7E,sDAAsD;IAChD,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAalF,oDAAoD;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,mEAAmE;IAC7D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D;8DAC0D;IACpD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUzD;;;;;4CAKwC;IAClC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAwBvG,0EAA0E;IACpE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrG,4EAA4E;IACtE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrE,iFAAiF;IAC3E,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrF;6EACyE;IACnE,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAY7E,8DAA8D;IACxD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D,4DAA4D;IAC5D,YAAY,IAAI,MAAM,GAAG,IAAI;CAG9B"}
@@ -119,17 +119,34 @@ export class MatrixRoomOps {
119
119
  throw err;
120
120
  }
121
121
  }
122
- /** Read a room's avatar mxc URL; null when the room has none. */
123
- async getRoomAvatar(roomId) {
122
+ /** Read a room's avatar state event (mxc URL + who set it); null when the
123
+ * room has none. matrix-bot-sdk's getRoomStateEvent resolves to the event
124
+ * CONTENT (its own getPublishedAlias reads event['alias'] directly), so
125
+ * the sender is NOT on this response — the sender comes from the full
126
+ * state list instead. Two requests, but the avatar query is startup-only
127
+ * and the room state list is small. */
128
+ async getRoomAvatarEvent(roomId) {
129
+ let url = null;
124
130
  try {
125
- const event = (await this.client.getRoomStateEvent(roomId, "m.room.avatar", ""));
126
- return event?.url ?? null;
131
+ const content = (await this.client.getRoomStateEvent(roomId, "m.room.avatar", ""));
132
+ url = content?.url ?? null;
127
133
  }
128
134
  catch (err) {
129
135
  if (isStateNotFound(err))
130
136
  return null;
131
137
  throw err;
132
138
  }
139
+ if (!url)
140
+ return { url: null, sender: null };
141
+ try {
142
+ const state = (await this.client.getRoomState(roomId));
143
+ const event = state.find((e) => e?.type === "m.room.avatar" && (e?.state_key ?? "") === "");
144
+ return { url, sender: event?.sender ?? null };
145
+ }
146
+ catch {
147
+ // Sender unknown: callers must treat the avatar as user-owned (never restyle).
148
+ return { url, sender: null };
149
+ }
133
150
  }
134
151
  /** Set a room's avatar from an uploaded mxc URL (m.room.avatar state). */
135
152
  async setRoomAvatar(roomId, avatarUrl, info) {
@@ -1 +1 @@
1
- {"version":3,"file":"matrix-rooms.js","sourceRoot":"","sources":["../../src/transports/matrix-rooms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"matrix-rooms.js","sourceRoot":"","sources":["../../src/transports/matrix-rooms.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -124,6 +124,12 @@ export interface MsgBridgeConfig {
124
124
  * 避免重启后重复改名/重复发送使用说明)。
125
125
  */
126
126
  managementRooms?: string[];
127
+ /**
128
+ * 内置头像池版本簿记(见 space-identity.ts AVATAR_POOL_VERSION):
129
+ * 头像池整体换风格时,启动自愈把"bot 自己设的旧版头像"主动刷成新版
130
+ * (用户手动设置的头像绝不碰)。缺省视为 v1(像素池时代)。
131
+ */
132
+ avatarPoolVersion?: number;
127
133
  /**
128
134
  * Element 空间(Space)组织视图——把本实例创建的房间收纳进一个私有空间,
129
135
  * 便于在 Element 中管理。空间本身仍是展示层;信任用户的房间权限
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-courier",
3
- "version": "0.1.46",
3
+ "version": "0.1.47",
4
4
  "description": "Run pi coding agent from Matrix. Slash commands, skills and prompts fully work from messengers via the RPC protocol.",
5
5
  "type": "module",
6
6
  "main": "dist/standalone.js",
@@ -0,0 +1,276 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 头像池 v3 —— 棉花糖软萌高清风(2026-09-11 定稿提示词)。
4
+ *
5
+ * 推翻 v1/v2 的像素风:每只小动物 = 棉花糖+翻糖质感圆脑袋、真实小奶猫式眼睛
6
+ * (非玻璃珠)、爱心糖鼻子、闭嘴 ω 笑、粉扑腮红,背景是粉紫青三色棉花糖云。
7
+ * 提示词经 6 轮人工审定收敛(v9 橘猫稿获用户认可),本脚本将其固化为模板:
8
+ * 固定"画框" + 每只动物的 subject/nose/eyes/accent 插槽。
9
+ *
10
+ * 输出:assets/avatars-drafts/candy-pool/<name>.png(实际多为 JPEG,先落草稿)
11
+ * 审定后用 --ship 把选中稿转成 512×512 真 PNG 写入 assets/avatars/。
12
+ *
13
+ * 用法:
14
+ * node scripts/generate-avatars-candy.mjs # 全量 13 张
15
+ * node scripts/generate-avatars-candy.mjs --only=instance-03,management
16
+ * node scripts/generate-avatars-candy.mjs --ship # 草稿 → 正式 512 PNG
17
+ */
18
+
19
+ import { execFileSync } from "node:child_process";
20
+ import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
21
+ import { homedir } from "node:os";
22
+ import { dirname, join } from "node:path";
23
+ import { fileURLToPath } from "node:url";
24
+
25
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
26
+ const DRAFT_DIR = join(ROOT, "assets", "avatars-drafts", "candy-pool");
27
+ const SHIP_DIR = join(ROOT, "assets", "avatars");
28
+ const API = "https://openrouter.ai/api/v1/images";
29
+ const MODEL = process.env.OPENROUTER_IMAGE_MODEL || "bytedance-seed/seedream-4.5";
30
+ const SHIP_SIZE = 512;
31
+
32
+ /** 画框默认头型描述。尖耳动物够用;圆头/无耳动物(企鹅、猫头鹰、熊、青蛙、小鸡)
33
+ * 实测会被模型理解成"方形糖块贴脸",必须用 head 插槽显式要"完整圆球头"。 */
34
+ const DEFAULT_HEAD = "A single soft rounded head silhouette, like a plush round marshmallow puff.";
35
+ const BALL_HEAD =
36
+ "The whole head is one perfectly round ball of marshmallow — a complete soft sphere, " +
37
+ "like a round plush ball, with the face features sitting directly on the ball.";
38
+
39
+ /** 每只动物的插槽内容;画框(风格/构图/背景)对所有动物一致。 */
40
+ const ANIMALS = [
41
+ {
42
+ name: "instance-01",
43
+ subject: "an orange tabby cat's head",
44
+ texture: "powdery matte pastel-orange fur with darker orange tabby stripes",
45
+ nose: "a soft pink candy heart nose",
46
+ eyes: "warm amber-green iris with a vertical slit pupil",
47
+ accent: "Small triangular ears with pink fondant inner ears.",
48
+ },
49
+ {
50
+ name: "instance-02",
51
+ subject: "a penguin's head",
52
+ head: BALL_HEAD,
53
+ texture: "powdery matte black-and-white fondant feathers",
54
+ nose: "a small glossy orange candy beak",
55
+ eyes: "round dark brown iris with a round pupil",
56
+ accent: "A patch of white fondant feathers framing the face, black cap on top.",
57
+ },
58
+ {
59
+ name: "instance-03",
60
+ subject: "a red fox's head",
61
+ texture: "powdery matte rust-orange fur with a white fondant muzzle",
62
+ nose: "a tiny black candy nose",
63
+ eyes: "warm amber iris with a vertical slit pupil",
64
+ accent: "Tall pointed ears with dark chocolate-brown fondant tips.",
65
+ },
66
+ {
67
+ name: "instance-04",
68
+ subject: "a brown owl's head",
69
+ head: BALL_HEAD,
70
+ texture: "powdery matte soft-brown fondant feathers with fine speckles",
71
+ nose: "a small sharp caramel candy beak",
72
+ eyes: "big round golden-amber iris with a round pupil",
73
+ accent: "A pale heart-shaped facial disc, tiny feather tufts above the eyes. Only the head — nothing below the chin.",
74
+ },
75
+ {
76
+ name: "instance-05",
77
+ subject: "a white rabbit's head",
78
+ texture: "powdery matte snow-white fur with a dusting of powdered sugar",
79
+ nose: "a soft pink candy heart nose",
80
+ eyes: "round rose-brown iris with a round pupil",
81
+ accent: "Two long upright ears with pink fondant inner ears.",
82
+ },
83
+ {
84
+ name: "instance-06",
85
+ subject: "a shiba inu dog's head",
86
+ texture: "powdery matte cream-and-orange fur",
87
+ nose: "a small black candy nose",
88
+ eyes: "warm dark brown iris with a round pupil",
89
+ accent: "Perky triangular ears, white fondant muzzle and cheeks.",
90
+ },
91
+ {
92
+ name: "instance-07",
93
+ subject: "a gray cat's head",
94
+ texture: "powdery matte blue-gray fur",
95
+ nose: "a soft pink candy heart nose",
96
+ eyes: "yellow-green iris with a vertical slit pupil",
97
+ accent: "Wide triangular ears with pale pink inner ears, faint darker stripes.",
98
+ },
99
+ {
100
+ name: "instance-08",
101
+ subject: "a brown bear cub's head",
102
+ texture: "powdery matte milk-chocolate-brown fur",
103
+ nose: "a big soft brown candy nose",
104
+ eyes: "round dark honey-brown iris with a round pupil",
105
+ accent: "Small round fondant ears with caramel centers.",
106
+ },
107
+ {
108
+ name: "instance-09",
109
+ subject: "a giant panda's head",
110
+ texture: "powdery matte white fur with black fondant eye patches and ears",
111
+ nose: "a small black candy nose",
112
+ eyes: "round dark brown iris with a round pupil",
113
+ accent: "Round black fondant ears, classic black eye patches around the eyes.",
114
+ },
115
+ {
116
+ name: "instance-10",
117
+ subject: "a green frog's head",
118
+ head: BALL_HEAD,
119
+ texture: "powdery matte pastel-green fondant skin with tiny sugar dots",
120
+ nose: "two tiny nostril dots",
121
+ eyes: "round golden iris with a vertical slit pupil, both eyes wide open looking at the viewer",
122
+ accent: "Two soft bumps on top of the head where the eyes sit, wide cheerful closed mouth line.",
123
+ },
124
+ {
125
+ name: "instance-11",
126
+ subject: "a red squirrel's head",
127
+ texture: "powdery matte russet-orange fur with a cream muzzle",
128
+ nose: "a tiny pink candy nose",
129
+ eyes: "round bright dark-brown iris with a round pupil",
130
+ accent: "Big fluffy ears with cream tufts, cheeky alert look.",
131
+ },
132
+ {
133
+ name: "instance-12",
134
+ subject: "a yellow chick's head",
135
+ head: BALL_HEAD,
136
+ texture: "powdery matte butter-yellow fondant fluff",
137
+ nose: "a tiny glossy orange candy beak",
138
+ eyes: "round dark brown iris with a round pupil",
139
+ mouth: "no mouth line at all — the little beak is closed and is the only mouth",
140
+ accent: "A small tuft of fluff on top of the head.",
141
+ },
142
+ {
143
+ name: "management",
144
+ subject: "an orange tabby cat's head wearing a small golden candy crown",
145
+ texture: "powdery matte pastel-orange fur with darker orange tabby stripes",
146
+ nose: "a soft pink candy heart nose",
147
+ eyes: "warm amber-green iris with a vertical slit pupil",
148
+ accent:
149
+ "A tiny glossy golden candy crown with three points and a sugar gem sits between the ears; small triangular ears with pink fondant inner ears.",
150
+ },
151
+ ];
152
+
153
+ /** 定稿画框(v9 模板):除插槽外逐字保留,改动需重新人工审定。 */
154
+ const promptFor = (a) =>
155
+ `A high-definition soft candy avatar of ${a.subject}, perfectly symmetrical front-facing view, ` +
156
+ `looking directly at the viewer, head only, no body. The animal is made of fluffy marshmallow and ` +
157
+ `sugar-dusted fondant: ${a.texture}, with a fine dusting of white powdered sugar, pillowy rounded ` +
158
+ `cheeks, ${a.nose}, ${a.mouth ?? "a sweet shy closed-mouth smile drawn as a small 'w' line"}, round ` +
159
+ `marshmallow blush cheeks. ${a.head ?? DEFAULT_HEAD} Natural well-proportioned cute animal face: the ` +
160
+ `eyes are realistic young animal eyes set naturally into the plush face — soft almond-round, ` +
161
+ `${a.eyes}, gentle natural shine with one small catchlight, smooth bare fur eyelids with no lashes, ` +
162
+ `bright and soulful, modest in size. ${a.accent} ` +
163
+ `Cute gentle expression. Background: a dreamy cloud of cotton candy in pastel pink, lilac and mint, ` +
164
+ `floating sugar floss wisps, tiny sprinkles and soft glowing bokeh, airy bright pastel palette. ` +
165
+ `Smooth polished 3D render, soft studio lighting, pastel candy colors, crisp details, centered ` +
166
+ `square composition for a profile picture.`;
167
+
168
+ // 负面词教训:绝不写 square/blocky 之外的形状否定(写 square 反而招来方头);
169
+ // 封杀吐舌头、张嘴、大眼、玻璃珠眼、睫毛、糖棍与像素风。
170
+ const NEGATIVE =
171
+ "eyelashes, false lashes, heavy eyeliner, makeup eyes, candy eyes, glass bead eyes, jelly eyes, " +
172
+ "big eyes, oversized eyes, anime eyes, star glints in eyes, tongue, sticking out tongue, open mouth, " +
173
+ "teeth, wink, winking, closed eye, sleepy eyes, lollipop stick, pixel art, pixels, blocky, low " +
174
+ "resolution, blurry, text, watermark, logo, signature, body, neck, shoulders, extra limbs, deformed " +
175
+ "face, scary, dark mood";
176
+
177
+ // ---- key --------------------------------------------------------------------
178
+
179
+ function apiKey() {
180
+ if (process.env.OPENROUTER_API_KEY) return process.env.OPENROUTER_API_KEY;
181
+ try {
182
+ const cfg = JSON.parse(readFileSync(join(homedir(), ".zcode", "v2", "config.json"), "utf8"));
183
+ for (const p of Object.values(cfg.provider ?? {})) {
184
+ const opts = p.options ?? {};
185
+ if (String(opts.baseURL ?? "").includes("openrouter.ai") && opts.apiKey) return opts.apiKey;
186
+ }
187
+ } catch {
188
+ // fall through
189
+ }
190
+ console.error("缺少 OPENROUTER_API_KEY(或 ~/.zcode 里配置 OpenRouter provider)");
191
+ process.exit(1);
192
+ }
193
+
194
+ // ---- API --------------------------------------------------------------------
195
+
196
+ async function generateImage(key, prompt) {
197
+ const res = await fetch(API, {
198
+ method: "POST",
199
+ headers: { authorization: `Bearer ${key}`, "content-type": "application/json" },
200
+ body: JSON.stringify({ model: MODEL, prompt, negative_prompt: NEGATIVE, aspect_ratio: "1:1" }),
201
+ signal: AbortSignal.timeout(180_000), // 挂起的连接最多等 3 分钟,失败进重试
202
+ });
203
+ if (!res.ok) throw new Error(`HTTP ${res.status}: ${(await res.text()).slice(0, 250)}`);
204
+ const data = await res.json();
205
+ const item = data?.data?.[0];
206
+ if (item?.b64_json) return Buffer.from(item.b64_json, "base64");
207
+ if (item?.url) {
208
+ const img = await fetch(item.url);
209
+ if (!img.ok) throw new Error(`图片下载失败: HTTP ${img.status}`);
210
+ return Buffer.from(await img.arrayBuffer());
211
+ }
212
+ throw new Error(`响应无图: ${JSON.stringify(data).slice(0, 200)}`);
213
+ }
214
+
215
+ // ---- ship(草稿 → 正式 512×512 真 PNG) --------------------------------------
216
+
217
+ function shipDrafts(names) {
218
+ for (const name of names) {
219
+ const draft = join(DRAFT_DIR, `${name}.png`);
220
+ const out = join(SHIP_DIR, `${name}.png`);
221
+ // 高清平滑缩放用 lanczos(像素风时代的 neighbor 已退役)
222
+ execFileSync(
223
+ "ffmpeg",
224
+ ["-y", "-loglevel", "error", "-i", draft, "-vf", `scale=${SHIP_SIZE}:${SHIP_SIZE}:flags=lanczos`, out],
225
+ { stdio: "ignore" }
226
+ );
227
+ const magic = readFileSync(out).subarray(0, 8).toString("hex");
228
+ if (magic !== "89504e470d0a1a0a") throw new Error(`${out} 不是真 PNG(魔数 ${magic})`);
229
+ console.log(`✔ ${name} → ${out}(${SHIP_SIZE}×${SHIP_SIZE} PNG)`);
230
+ }
231
+ }
232
+
233
+ // ---- run --------------------------------------------------------------------
234
+
235
+ const argv = process.argv.slice(2);
236
+ const flagValue = (prefix) => {
237
+ const hit = argv.find((a) => a.startsWith(`${prefix}=`));
238
+ return hit ? hit.slice(prefix.length + 1) : null;
239
+ };
240
+ const only = flagValue("--only")?.split(",").filter(Boolean) ?? null;
241
+ const targets = only ? ANIMALS.filter((a) => only.includes(a.name)) : ANIMALS;
242
+ if (only && targets.length !== only.length) {
243
+ const known = new Set(ANIMALS.map((a) => a.name));
244
+ console.error(`未知头像名: ${only.filter((n) => !known.has(n)).join(",")}`);
245
+ process.exit(1);
246
+ }
247
+
248
+ if (argv.includes("--ship")) {
249
+ shipDrafts(targets.map((a) => a.name));
250
+ console.log(`\n出货完成 ${targets.length} 张 → ${SHIP_DIR}`);
251
+ process.exit(0);
252
+ }
253
+
254
+ const key = apiKey();
255
+ mkdirSync(DRAFT_DIR, { recursive: true });
256
+
257
+ let ok = 0;
258
+ for (const avatar of targets) {
259
+ const attempts = 3;
260
+ for (let attempt = 1; attempt <= attempts; attempt++) {
261
+ try {
262
+ const bytes = await generateImage(key, promptFor(avatar));
263
+ const outPath = join(DRAFT_DIR, `${avatar.name}.png`);
264
+ writeFileSync(outPath, bytes);
265
+ console.log(`✔ ${avatar.name}(${(bytes.length / 1024).toFixed(0)} KB)→ ${outPath}`);
266
+ ok++;
267
+ break;
268
+ } catch (err) {
269
+ console.warn(`✗ ${avatar.name} 第 ${attempt}/${attempts} 次失败: ${err.message ?? err}`);
270
+ if (attempt === attempts) console.error(`✗✗ ${avatar.name} 放弃,可 --only=${avatar.name} 重试`);
271
+ else await new Promise((r) => setTimeout(r, 2000));
272
+ }
273
+ }
274
+ }
275
+ console.log(`\n完成 ${ok}/${targets.length} → ${DRAFT_DIR}`);
276
+ if (ok < targets.length) process.exit(1);