@deepseek-harness-tui/dsh-tui 0.11.2 → 0.13.0
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.md +60 -8
- package/assets/deepy/README.md +60 -0
- package/assets/deepy/frames.json +1 -0
- package/assets/whale-girl/whale-girl-happy.png +0 -0
- package/assets/whaleGirl/README.md +7 -0
- package/assets/whaleGirl/frames.json +1 -0
- package/assets/whaleGirl/img/building/00.png +0 -0
- package/assets/whaleGirl/img/building/01.png +0 -0
- package/assets/whaleGirl/img/building/02.png +0 -0
- package/assets/whaleGirl/img/building/03.png +0 -0
- package/assets/whaleGirl/img/building/04.png +0 -0
- package/assets/whaleGirl/img/building/05.png +0 -0
- package/assets/whaleGirl/img/building/06.png +0 -0
- package/assets/whaleGirl/img/building/07.png +0 -0
- package/assets/whaleGirl/img/building/08.png +0 -0
- package/assets/whaleGirl/img/building/09.png +0 -0
- package/assets/whaleGirl/img/building/10.png +0 -0
- package/assets/whaleGirl/img/building/11.png +0 -0
- package/assets/whaleGirl/img/building/12.png +0 -0
- package/assets/whaleGirl/img/building/13.png +0 -0
- package/assets/whaleGirl/img/building/14.png +0 -0
- package/assets/whaleGirl/img/building/15.png +0 -0
- package/assets/whaleGirl/img/building/16.png +0 -0
- package/assets/whaleGirl/img/building/17.png +0 -0
- package/assets/whaleGirl/img/building/18.png +0 -0
- package/assets/whaleGirl/img/building/19.png +0 -0
- package/assets/whaleGirl/img/building/20.png +0 -0
- package/assets/whaleGirl/img/building/21.png +0 -0
- package/assets/whaleGirl/img/building/22.png +0 -0
- package/assets/whaleGirl/img/building/23.png +0 -0
- package/assets/whaleGirl/img/carrying/00.png +0 -0
- package/assets/whaleGirl/img/carrying/01.png +0 -0
- package/assets/whaleGirl/img/carrying/02.png +0 -0
- package/assets/whaleGirl/img/carrying/03.png +0 -0
- package/assets/whaleGirl/img/carrying/04.png +0 -0
- package/assets/whaleGirl/img/carrying/05.png +0 -0
- package/assets/whaleGirl/img/carrying/06.png +0 -0
- package/assets/whaleGirl/img/carrying/07.png +0 -0
- package/assets/whaleGirl/img/compacting/00.png +0 -0
- package/assets/whaleGirl/img/compacting/01.png +0 -0
- package/assets/whaleGirl/img/compacting/02.png +0 -0
- package/assets/whaleGirl/img/compacting/03.png +0 -0
- package/assets/whaleGirl/img/compacting/04.png +0 -0
- package/assets/whaleGirl/img/compacting/05.png +0 -0
- package/assets/whaleGirl/img/compacting/06.png +0 -0
- package/assets/whaleGirl/img/compacting/07.png +0 -0
- package/assets/whaleGirl/img/compacting/08.png +0 -0
- package/assets/whaleGirl/img/compacting/09.png +0 -0
- package/assets/whaleGirl/img/conducting/00.png +0 -0
- package/assets/whaleGirl/img/conducting/01.png +0 -0
- package/assets/whaleGirl/img/conducting/02.png +0 -0
- package/assets/whaleGirl/img/conducting/03.png +0 -0
- package/assets/whaleGirl/img/conducting/04.png +0 -0
- package/assets/whaleGirl/img/conducting/05.png +0 -0
- package/assets/whaleGirl/img/conducting/06.png +0 -0
- package/assets/whaleGirl/img/conducting/07.png +0 -0
- package/assets/whaleGirl/img/conducting/08.png +0 -0
- package/assets/whaleGirl/img/conducting/09.png +0 -0
- package/assets/whaleGirl/img/conducting/10.png +0 -0
- package/assets/whaleGirl/img/conducting/11.png +0 -0
- package/assets/whaleGirl/img/drag/00.png +0 -0
- package/assets/whaleGirl/img/drag/01.png +0 -0
- package/assets/whaleGirl/img/drag/02.png +0 -0
- package/assets/whaleGirl/img/drag/03.png +0 -0
- package/assets/whaleGirl/img/drag/04.png +0 -0
- package/assets/whaleGirl/img/drag/05.png +0 -0
- package/assets/whaleGirl/img/drag/06.png +0 -0
- package/assets/whaleGirl/img/drag/07.png +0 -0
- package/assets/whaleGirl/img/drag/08.png +0 -0
- package/assets/whaleGirl/img/drag/09.png +0 -0
- package/assets/whaleGirl/img/error/00.png +0 -0
- package/assets/whaleGirl/img/error/01.png +0 -0
- package/assets/whaleGirl/img/error/02.png +0 -0
- package/assets/whaleGirl/img/error/03.png +0 -0
- package/assets/whaleGirl/img/error/04.png +0 -0
- package/assets/whaleGirl/img/error/05.png +0 -0
- package/assets/whaleGirl/img/error/06.png +0 -0
- package/assets/whaleGirl/img/error/07.png +0 -0
- package/assets/whaleGirl/img/error/08.png +0 -0
- package/assets/whaleGirl/img/error/09.png +0 -0
- package/assets/whaleGirl/img/happy/00.png +0 -0
- package/assets/whaleGirl/img/happy/01.png +0 -0
- package/assets/whaleGirl/img/happy/02.png +0 -0
- package/assets/whaleGirl/img/happy/03.png +0 -0
- package/assets/whaleGirl/img/happy/04.png +0 -0
- package/assets/whaleGirl/img/happy/05.png +0 -0
- package/assets/whaleGirl/img/happy/06.png +0 -0
- package/assets/whaleGirl/img/happy/07.png +0 -0
- package/assets/whaleGirl/img/happy/08.png +0 -0
- package/assets/whaleGirl/img/happy/09.png +0 -0
- package/assets/whaleGirl/img/happy/10.png +0 -0
- package/assets/whaleGirl/img/idle/00.png +0 -0
- package/assets/whaleGirl/img/idle/01.png +0 -0
- package/assets/whaleGirl/img/idle/02.png +0 -0
- package/assets/whaleGirl/img/idle/03.png +0 -0
- package/assets/whaleGirl/img/idle/04.png +0 -0
- package/assets/whaleGirl/img/idle/05.png +0 -0
- package/assets/whaleGirl/img/idle/06.png +0 -0
- package/assets/whaleGirl/img/idle/07.png +0 -0
- package/assets/whaleGirl/img/idle/08.png +0 -0
- package/assets/whaleGirl/img/idle/09.png +0 -0
- package/assets/whaleGirl/img/idle/10.png +0 -0
- package/assets/whaleGirl/img/idle/11.png +0 -0
- package/assets/whaleGirl/img/idle/12.png +0 -0
- package/assets/whaleGirl/img/idle/13.png +0 -0
- package/assets/whaleGirl/img/idle/14.png +0 -0
- package/assets/whaleGirl/img/idle/15.png +0 -0
- package/assets/whaleGirl/img/idle/16.png +0 -0
- package/assets/whaleGirl/img/idle/17.png +0 -0
- package/assets/whaleGirl/img/idle/18.png +0 -0
- package/assets/whaleGirl/img/idle/19.png +0 -0
- package/assets/whaleGirl/img/idle/20.png +0 -0
- package/assets/whaleGirl/img/idle-look/00.png +0 -0
- package/assets/whaleGirl/img/idle-look/01.png +0 -0
- package/assets/whaleGirl/img/idle-look/02.png +0 -0
- package/assets/whaleGirl/img/idle-look/03.png +0 -0
- package/assets/whaleGirl/img/idle-look/04.png +0 -0
- package/assets/whaleGirl/img/idle-look/05.png +0 -0
- package/assets/whaleGirl/img/idle-look/06.png +0 -0
- package/assets/whaleGirl/img/idle-look/07.png +0 -0
- package/assets/whaleGirl/img/idle-look/08.png +0 -0
- package/assets/whaleGirl/img/idle-look/09.png +0 -0
- package/assets/whaleGirl/img/idle-look/10.png +0 -0
- package/assets/whaleGirl/img/idle-look/11.png +0 -0
- package/assets/whaleGirl/img/idle-look/12.png +0 -0
- package/assets/whaleGirl/img/idle-spout/00.png +0 -0
- package/assets/whaleGirl/img/idle-spout/01.png +0 -0
- package/assets/whaleGirl/img/idle-spout/02.png +0 -0
- package/assets/whaleGirl/img/idle-spout/03.png +0 -0
- package/assets/whaleGirl/img/idle-spout/04.png +0 -0
- package/assets/whaleGirl/img/idle-spout/05.png +0 -0
- package/assets/whaleGirl/img/idle-spout/06.png +0 -0
- package/assets/whaleGirl/img/idle-spout/07.png +0 -0
- package/assets/whaleGirl/img/idle-spout/08.png +0 -0
- package/assets/whaleGirl/img/idle-spout/09.png +0 -0
- package/assets/whaleGirl/img/idle-spout/10.png +0 -0
- package/assets/whaleGirl/img/music/00.png +0 -0
- package/assets/whaleGirl/img/music/01.png +0 -0
- package/assets/whaleGirl/img/music/02.png +0 -0
- package/assets/whaleGirl/img/music/03.png +0 -0
- package/assets/whaleGirl/img/music/04.png +0 -0
- package/assets/whaleGirl/img/music/05.png +0 -0
- package/assets/whaleGirl/img/music/06.png +0 -0
- package/assets/whaleGirl/img/music/07.png +0 -0
- package/assets/whaleGirl/img/notification/00.png +0 -0
- package/assets/whaleGirl/img/notification/01.png +0 -0
- package/assets/whaleGirl/img/notification/02.png +0 -0
- package/assets/whaleGirl/img/notification/03.png +0 -0
- package/assets/whaleGirl/img/notification/04.png +0 -0
- package/assets/whaleGirl/img/notification/05.png +0 -0
- package/assets/whaleGirl/img/notification/06.png +0 -0
- package/assets/whaleGirl/img/notification/07.png +0 -0
- package/assets/whaleGirl/img/poke-left/00.png +0 -0
- package/assets/whaleGirl/img/poke-left/01.png +0 -0
- package/assets/whaleGirl/img/poke-left/02.png +0 -0
- package/assets/whaleGirl/img/poke-left/03.png +0 -0
- package/assets/whaleGirl/img/poke-left/04.png +0 -0
- package/assets/whaleGirl/img/poke-left/05.png +0 -0
- package/assets/whaleGirl/img/poke-left/06.png +0 -0
- package/assets/whaleGirl/img/poke-left/07.png +0 -0
- package/assets/whaleGirl/img/poke-left/08.png +0 -0
- package/assets/whaleGirl/img/poke-left/09.png +0 -0
- package/assets/whaleGirl/img/poke-left/10.png +0 -0
- package/assets/whaleGirl/img/poke-right/00.png +0 -0
- package/assets/whaleGirl/img/poke-right/01.png +0 -0
- package/assets/whaleGirl/img/poke-right/02.png +0 -0
- package/assets/whaleGirl/img/poke-right/03.png +0 -0
- package/assets/whaleGirl/img/poke-right/04.png +0 -0
- package/assets/whaleGirl/img/poke-right/05.png +0 -0
- package/assets/whaleGirl/img/poke-right/06.png +0 -0
- package/assets/whaleGirl/img/poke-right/07.png +0 -0
- package/assets/whaleGirl/img/poke-right/08.png +0 -0
- package/assets/whaleGirl/img/poke-right/09.png +0 -0
- package/assets/whaleGirl/img/poke-right/10.png +0 -0
- package/assets/whaleGirl/img/sleeping/00.png +0 -0
- package/assets/whaleGirl/img/sleeping/01.png +0 -0
- package/assets/whaleGirl/img/sleeping/02.png +0 -0
- package/assets/whaleGirl/img/sleeping/03.png +0 -0
- package/assets/whaleGirl/img/sleeping/04.png +0 -0
- package/assets/whaleGirl/img/sleeping/05.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/00.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/01.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/02.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/03.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/04.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/05.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/06.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/07.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/08.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/09.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/10.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/11.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/12.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/13.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/14.png +0 -0
- package/assets/whaleGirl/img/smile-hearts/15.png +0 -0
- package/assets/whaleGirl/img/swim/00.png +0 -0
- package/assets/whaleGirl/img/swim/01.png +0 -0
- package/assets/whaleGirl/img/swim/02.png +0 -0
- package/assets/whaleGirl/img/swim/03.png +0 -0
- package/assets/whaleGirl/img/swim/04.png +0 -0
- package/assets/whaleGirl/img/swim/05.png +0 -0
- package/assets/whaleGirl/img/swim/06.png +0 -0
- package/assets/whaleGirl/img/swim/07.png +0 -0
- package/assets/whaleGirl/img/thinking/00.png +0 -0
- package/assets/whaleGirl/img/thinking/01.png +0 -0
- package/assets/whaleGirl/img/thinking/02.png +0 -0
- package/assets/whaleGirl/img/thinking/03.png +0 -0
- package/assets/whaleGirl/img/thinking/04.png +0 -0
- package/assets/whaleGirl/img/thinking/05.png +0 -0
- package/assets/whaleGirl/img/thinking/06.png +0 -0
- package/assets/whaleGirl/img/thinking/07.png +0 -0
- package/assets/whaleGirl/img/thinking/08.png +0 -0
- package/assets/whaleGirl/img/thinking/09.png +0 -0
- package/assets/whaleGirl/img/thinking/10.png +0 -0
- package/assets/whaleGirl/img/thinking/11.png +0 -0
- package/assets/whaleGirl/img/thinking/12.png +0 -0
- package/assets/whaleGirl/img/thinking/13.png +0 -0
- package/assets/whaleGirl/img/thinking/14.png +0 -0
- package/assets/whaleGirl/img/thinking/15.png +0 -0
- package/assets/whaleGirl/img/thinking/16.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/00.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/01.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/02.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/03.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/04.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/05.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/06.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/07.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/08.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/09.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/10.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/11.png +0 -0
- package/assets/whaleGirl/img/thumbs-up/12.png +0 -0
- package/assets/whaleGirl/img/tickle/00.png +0 -0
- package/assets/whaleGirl/img/tickle/01.png +0 -0
- package/assets/whaleGirl/img/tickle/02.png +0 -0
- package/assets/whaleGirl/img/tickle/03.png +0 -0
- package/assets/whaleGirl/img/tickle/04.png +0 -0
- package/assets/whaleGirl/img/tickle/05.png +0 -0
- package/assets/whaleGirl/img/tickle/06.png +0 -0
- package/assets/whaleGirl/img/tickle/07.png +0 -0
- package/assets/whaleGirl/img/tickle/08.png +0 -0
- package/assets/whaleGirl/img/tickle/09.png +0 -0
- package/assets/whaleGirl/img/tickle/10.png +0 -0
- package/assets/whaleGirl/img/tickle/11.png +0 -0
- package/assets/whaleGirl/img/tickle/12.png +0 -0
- package/assets/whaleGirl/img/tickle/13.png +0 -0
- package/assets/whaleGirl/img/timings.json +1 -0
- package/assets/whaleGirl/img/typing/00.png +0 -0
- package/assets/whaleGirl/img/typing/01.png +0 -0
- package/assets/whaleGirl/img/typing/02.png +0 -0
- package/assets/whaleGirl/img/typing/03.png +0 -0
- package/assets/whaleGirl/img/typing/04.png +0 -0
- package/assets/whaleGirl/img/typing/05.png +0 -0
- package/assets/whaleGirl/img/typing/06.png +0 -0
- package/assets/whaleGirl/img/typing/07.png +0 -0
- package/assets/whaleGirl/img/typing/08.png +0 -0
- package/assets/whaleGirl/img/typing/09.png +0 -0
- package/assets/whaleGirl/img/typing/10.png +0 -0
- package/assets/whaleGirl/img/typing/11.png +0 -0
- package/assets/whaleGirl/img/typing/12.png +0 -0
- package/assets/whaleGirl/img/typing/13.png +0 -0
- package/assets/whaleGirl/img/waking/00.png +0 -0
- package/assets/whaleGirl/img/waking/01.png +0 -0
- package/assets/whaleGirl/img/waking/02.png +0 -0
- package/assets/whaleGirl/img/waking/03.png +0 -0
- package/assets/whaleGirl/img/waking/04.png +0 -0
- package/assets/whaleGirl/img/waking/05.png +0 -0
- package/assets/whaleGirl/img/waking/06.png +0 -0
- package/assets/whaleGirl/img/waking/07.png +0 -0
- package/assets/whaleGirl/img/waking/08.png +0 -0
- package/assets/whaleGirl/img/waking/09.png +0 -0
- package/assets/whaleGirl/img/waking/10.png +0 -0
- package/bin/dsh-tui.js +38 -6
- package/cordis.patch.yml +31 -6
- package/guide/dsh-tui-guide/SKILL.md +37 -0
- package/guide/dsh-tui-guide/configuration.en.md +415 -0
- package/guide/dsh-tui-guide/configuration.md +354 -0
- package/guide/dsh-tui-guide/getting-started.en.md +401 -0
- package/guide/dsh-tui-guide/getting-started.md +399 -0
- package/guide/dsh-tui-guide/interaction.en.md +738 -0
- package/guide/dsh-tui-guide/interaction.md +793 -0
- package/guide/dsh-tui-guide/migrate.en.md +166 -0
- package/guide/dsh-tui-guide/migrate.md +132 -0
- package/guide/dsh-tui-guide/plugins.en.md +78 -0
- package/guide/dsh-tui-guide/plugins.md +64 -0
- package/guide/dsh-tui-guide/themes.en.md +197 -0
- package/guide/dsh-tui-guide/themes.md +188 -0
- package/guide/dsh-tui-guide/user-guide.en.md +711 -0
- package/guide/dsh-tui-guide/user-guide.md +666 -0
- package/guide/dsh-tui-guide/vscode.en.md +301 -0
- package/guide/dsh-tui-guide/vscode.md +272 -0
- package/lib/settings.json +219 -5
- package/lib/types/adapter/channel/ui-policy.d.ts +7 -2
- package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui-policy.js +18 -1
- package/lib/types/adapter/index.d.ts +1 -1
- package/lib/types/adapter/index.js +1 -1
- package/lib/types/adapter/kernel/host-facade.d.ts +4 -1
- package/lib/types/adapter/kernel/host-facade.d.ts.map +1 -1
- package/lib/types/adapter/kernel/host-facade.js +8 -1
- package/lib/types/adapter/kernel/runtime.d.ts.map +1 -1
- package/lib/types/adapter/kernel/runtime.js +13 -0
- package/lib/types/adapter/kernel/slices/index.d.ts +1 -0
- package/lib/types/adapter/kernel/slices/index.d.ts.map +1 -1
- package/lib/types/adapter/kernel/slices/index.js +3 -0
- package/lib/types/adapter/kernel/slices/panels.d.ts +3 -0
- package/lib/types/adapter/kernel/slices/panels.d.ts.map +1 -0
- package/lib/types/adapter/kernel/slices/panels.js +14 -0
- package/lib/types/adapter/ports/channel-capabilities.d.ts +48 -0
- package/lib/types/adapter/ports/channel-capabilities.d.ts.map +1 -0
- package/lib/types/adapter/ports/channel-capabilities.js +2 -0
- package/lib/types/adapter/ports/channel-catalog.d.ts +7 -0
- package/lib/types/adapter/ports/channel-catalog.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-display.d.ts +10 -0
- package/lib/types/adapter/ports/channel-display.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-settings.d.ts +2 -1
- package/lib/types/adapter/ports/channel-settings.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-ui.d.ts +91 -4
- package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts +137 -9
- package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel.d.ts +1 -1
- package/lib/types/adapter/ports/channel.js +1 -1
- package/lib/types/adapter/ports/descriptor.d.ts +1 -1
- package/lib/types/adapter/ports/descriptor.js +1 -1
- package/lib/types/adapter/ports/index.d.ts +1 -1
- package/lib/types/adapter/ports/index.js +1 -1
- package/lib/types/adapter/ports/panels.d.ts +28 -0
- package/lib/types/adapter/ports/panels.d.ts.map +1 -0
- package/lib/types/adapter/ports/panels.js +8 -0
- package/lib/types/adapter/ports/workspace.d.ts +1 -1
- package/lib/types/adapter/ports/workspace.js +1 -1
- package/lib/types/adapter/spec/index.d.ts +2 -2
- package/lib/types/adapter/spec/index.js +2 -2
- package/lib/types/adapter/spec/profile.d.ts +6 -6
- package/lib/types/adapter/spec/profile.d.ts.map +1 -1
- package/lib/types/adapter/spec/profile.js +6 -6
- package/lib/types/adapter/spec/protocol-constants.d.ts +3 -3
- package/lib/types/adapter/spec/protocol-constants.d.ts.map +1 -1
- package/lib/types/adapter/spec/protocol-constants.js +5 -5
- package/lib/types/adapter/spec/tui-contributions.d.ts +4 -4
- package/lib/types/adapter/spec/tui-contributions.d.ts.map +1 -1
- package/lib/types/adapter/spec/tui-contributions.js +5 -5
- package/lib/types/adapter/standard/descriptor.js +1 -1
- package/lib/types/adapter/standard/index.d.ts +3 -3
- package/lib/types/adapter/standard/index.js +3 -3
- package/lib/types/adapter/standard/registry.d.ts +3 -2
- package/lib/types/adapter/standard/registry.d.ts.map +1 -1
- package/lib/types/adapter/standard/registry.js +6 -5
- package/lib/types/adapter/standard/tui-extension.d.ts +1 -1
- package/lib/types/adapter/standard/tui-extension.js +1 -1
- package/lib/types/adapter/upstream/index.d.ts +1 -0
- package/lib/types/adapter/upstream/index.d.ts.map +1 -1
- package/lib/types/adapter/upstream/index.js +1 -0
- package/lib/types/adapter/upstream/panels-driver.d.ts +18 -0
- package/lib/types/adapter/upstream/panels-driver.d.ts.map +1 -0
- package/lib/types/adapter/upstream/panels-driver.js +159 -0
- package/lib/types/api.d.ts +2 -0
- package/lib/types/api.d.ts.map +1 -1
- package/lib/types/api.js +3 -1
- package/lib/types/commands.d.ts.map +1 -1
- package/lib/types/commands.js +12 -4
- package/lib/types/components/ActivityLine.d.ts +6 -9
- package/lib/types/components/ActivityLine.d.ts.map +1 -1
- package/lib/types/components/ActivityLine.js +7 -8
- package/lib/types/components/Chat/JobCard.d.ts +27 -1
- package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.js +128 -33
- package/lib/types/components/Chat/JobGroupHeader.d.ts +27 -0
- package/lib/types/components/Chat/JobGroupHeader.d.ts.map +1 -0
- package/lib/types/components/Chat/JobGroupHeader.js +62 -0
- package/lib/types/components/Chat/SubagentMessage.js +6 -6
- package/lib/types/components/GoalTodoPanel.d.ts +13 -1
- package/lib/types/components/GoalTodoPanel.d.ts.map +1 -1
- package/lib/types/components/GoalTodoPanel.js +55 -14
- package/lib/types/components/JobsPanel.d.ts +42 -2
- package/lib/types/components/JobsPanel.d.ts.map +1 -1
- package/lib/types/components/JobsPanel.js +220 -40
- package/lib/types/components/LogoV2.d.ts +43 -3
- package/lib/types/components/LogoV2.d.ts.map +1 -1
- package/lib/types/components/LogoV2.js +42 -15
- package/lib/types/components/MessageList.d.ts +8 -2
- package/lib/types/components/MessageList.d.ts.map +1 -1
- package/lib/types/components/MessageList.js +215 -21
- package/lib/types/components/OverlayAbove.d.ts +11 -1
- package/lib/types/components/OverlayAbove.d.ts.map +1 -1
- package/lib/types/components/OverlayAbove.js +2 -12
- package/lib/types/components/PageMargin.d.ts.map +1 -1
- package/lib/types/components/PageMargin.js +3 -1
- package/lib/types/components/PluginSceneBoundary.d.ts +1 -1
- package/lib/types/components/PluginSceneBoundary.js +1 -1
- package/lib/types/components/PresetPicker.d.ts +4 -0
- package/lib/types/components/PresetPicker.d.ts.map +1 -1
- package/lib/types/components/PresetPicker.js +5 -1
- package/lib/types/components/PromptInput.d.ts +20 -22
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +425 -157
- package/lib/types/components/SearchBox.d.ts +22 -5
- package/lib/types/components/SearchBox.d.ts.map +1 -1
- package/lib/types/components/SearchBox.js +17 -13
- package/lib/types/components/StarPrompt.d.ts +6 -0
- package/lib/types/components/StarPrompt.d.ts.map +1 -1
- package/lib/types/components/StarPrompt.js +45 -0
- package/lib/types/components/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +24 -9
- package/lib/types/components/SubagentDashboard.d.ts +18 -3
- package/lib/types/components/SubagentDashboard.d.ts.map +1 -1
- package/lib/types/components/SubagentDashboard.js +53 -5
- package/lib/types/components/SubagentDetailScene.d.ts +7 -1
- package/lib/types/components/SubagentDetailScene.d.ts.map +1 -1
- package/lib/types/components/SubagentDetailScene.js +160 -13
- package/lib/types/components/SurfaceEdges.d.ts +21 -0
- package/lib/types/components/SurfaceEdges.d.ts.map +1 -0
- package/lib/types/components/SurfaceEdges.js +7 -0
- package/lib/types/components/ThemePicker.d.ts +9 -0
- package/lib/types/components/ThemePicker.d.ts.map +1 -1
- package/lib/types/components/ThemePicker.js +74 -10
- package/lib/types/components/ThemePreviewPane.d.ts +26 -0
- package/lib/types/components/ThemePreviewPane.d.ts.map +1 -0
- package/lib/types/components/ThemePreviewPane.js +99 -0
- package/lib/types/components/WhaleGirl.d.ts +6 -0
- package/lib/types/components/WhaleGirl.d.ts.map +1 -1
- package/lib/types/components/WhaleGirl.js +18 -0
- package/lib/types/components/design-system/Divider.d.ts.map +1 -1
- package/lib/types/components/design-system/Divider.js +14 -9
- package/lib/types/components/launchpadActions.d.ts +73 -0
- package/lib/types/components/launchpadActions.d.ts.map +1 -0
- package/lib/types/components/launchpadActions.js +111 -0
- package/lib/types/components/launchpadLayout.d.ts +62 -0
- package/lib/types/components/launchpadLayout.d.ts.map +1 -0
- package/lib/types/components/launchpadLayout.js +176 -0
- package/lib/types/components/messages/AssistantThinkingMessage.js +4 -4
- package/lib/types/components/onboardingModel.d.ts +83 -0
- package/lib/types/components/onboardingModel.d.ts.map +1 -0
- package/lib/types/components/onboardingModel.js +128 -0
- package/lib/types/components/sidePanel/InfoPanel.d.ts +17 -0
- package/lib/types/components/sidePanel/InfoPanel.d.ts.map +1 -0
- package/lib/types/components/sidePanel/InfoPanel.js +124 -0
- package/lib/types/components/sidePanel/PanelBar.d.ts +45 -0
- package/lib/types/components/sidePanel/PanelBar.d.ts.map +1 -0
- package/lib/types/components/sidePanel/PanelBar.js +104 -0
- package/lib/types/components/sidePanel/PanelErrorBoundary.d.ts +21 -0
- package/lib/types/components/sidePanel/PanelErrorBoundary.d.ts.map +1 -0
- package/lib/types/components/sidePanel/PanelErrorBoundary.js +30 -0
- package/lib/types/components/sidePanel/PanelHost.d.ts +36 -0
- package/lib/types/components/sidePanel/PanelHost.d.ts.map +1 -0
- package/lib/types/components/sidePanel/PanelHost.js +81 -0
- package/lib/types/components/sidePanel/PanelPicker.d.ts +24 -0
- package/lib/types/components/sidePanel/PanelPicker.d.ts.map +1 -0
- package/lib/types/components/sidePanel/PanelPicker.js +45 -0
- package/lib/types/components/sidePanel/PanelStore.d.ts +55 -0
- package/lib/types/components/sidePanel/PanelStore.d.ts.map +1 -0
- package/lib/types/components/sidePanel/PanelStore.js +109 -0
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts +31 -0
- package/lib/types/components/sidePanel/SidePanelColumn.d.ts.map +1 -0
- package/lib/types/components/sidePanel/SidePanelColumn.js +70 -0
- package/lib/types/components/sidePanel/SidePanelLayout.d.ts +54 -0
- package/lib/types/components/sidePanel/SidePanelLayout.d.ts.map +1 -0
- package/lib/types/components/sidePanel/SidePanelLayout.js +81 -0
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts +43 -0
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.d.ts.map +1 -0
- package/lib/types/components/sidePanel/SidePanelRuntimeContext.js +26 -0
- package/lib/types/components/sidePanel/TrajectoryPanel.d.ts +7 -0
- package/lib/types/components/sidePanel/TrajectoryPanel.d.ts.map +1 -0
- package/lib/types/components/sidePanel/TrajectoryPanel.js +263 -0
- package/lib/types/components/sidePanel/WorkspacePanel.d.ts +4 -0
- package/lib/types/components/sidePanel/WorkspacePanel.d.ts.map +1 -0
- package/lib/types/components/sidePanel/WorkspacePanel.js +171 -0
- package/lib/types/components/sidePanel/builtinPanels.d.ts +3 -0
- package/lib/types/components/sidePanel/builtinPanels.d.ts.map +1 -0
- package/lib/types/components/sidePanel/builtinPanels.js +229 -0
- package/lib/types/components/sidePanel/companion/CompanionPanel.d.ts +53 -0
- package/lib/types/components/sidePanel/companion/CompanionPanel.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/CompanionPanel.js +528 -0
- package/lib/types/components/sidePanel/companion/SplashMascot.d.ts +32 -0
- package/lib/types/components/sidePanel/companion/SplashMascot.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/SplashMascot.js +103 -0
- package/lib/types/components/sidePanel/companion/deepy.d.ts +75 -0
- package/lib/types/components/sidePanel/companion/deepy.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/deepy.js +222 -0
- package/lib/types/components/sidePanel/companion/mood.d.ts +176 -0
- package/lib/types/components/sidePanel/companion/mood.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/mood.js +212 -0
- package/lib/types/components/sidePanel/companion/pose.d.ts +43 -0
- package/lib/types/components/sidePanel/companion/pose.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/pose.js +34 -0
- package/lib/types/components/sidePanel/companion/skins.d.ts +102 -0
- package/lib/types/components/sidePanel/companion/skins.d.ts.map +1 -0
- package/lib/types/components/sidePanel/companion/skins.js +408 -0
- package/lib/types/components/sidePanel/dimensions.d.ts +60 -0
- package/lib/types/components/sidePanel/dimensions.d.ts.map +1 -0
- package/lib/types/components/sidePanel/dimensions.js +75 -0
- package/lib/types/components/sidePanel/jobsFocusStore.d.ts +21 -0
- package/lib/types/components/sidePanel/jobsFocusStore.d.ts.map +1 -0
- package/lib/types/components/sidePanel/jobsFocusStore.js +30 -0
- package/lib/types/components/sidePanel/panelBridge.d.ts +44 -0
- package/lib/types/components/sidePanel/panelBridge.d.ts.map +1 -0
- package/lib/types/components/sidePanel/panelBridge.js +55 -0
- package/lib/types/components/sidePanel/pluginPanelAdapter.d.ts +22 -0
- package/lib/types/components/sidePanel/pluginPanelAdapter.d.ts.map +1 -0
- package/lib/types/components/sidePanel/pluginPanelAdapter.js +148 -0
- package/lib/types/components/sidePanel/types.d.ts +110 -0
- package/lib/types/components/sidePanel/types.d.ts.map +1 -0
- package/lib/types/components/sidePanel/types.js +1 -0
- package/lib/types/components/sidePanel/usePanelInput.d.ts +5 -0
- package/lib/types/components/sidePanel/usePanelInput.d.ts.map +1 -0
- package/lib/types/components/sidePanel/usePanelInput.js +44 -0
- package/lib/types/components/sidePanel/useSidePanel.d.ts +47 -0
- package/lib/types/components/sidePanel/useSidePanel.d.ts.map +1 -0
- package/lib/types/components/sidePanel/useSidePanel.js +284 -0
- package/lib/types/components/trajectory/MiniWake.d.ts +11 -1
- package/lib/types/components/trajectory/MiniWake.d.ts.map +1 -1
- package/lib/types/components/trajectory/MiniWake.js +9 -3
- package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts +3 -1
- package/lib/types/components/workspaces/HomeWorkspaceRow.d.ts.map +1 -1
- package/lib/types/components/workspaces/HomeWorkspaceRow.js +3 -2
- package/lib/types/deepseekPricing.d.ts +10 -9
- package/lib/types/deepseekPricing.d.ts.map +1 -1
- package/lib/types/deepseekPricing.js +18 -11
- package/lib/types/dsh-adapter/channel/attached-context.d.ts +58 -0
- package/lib/types/dsh-adapter/channel/attached-context.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/attached-context.js +109 -0
- package/lib/types/dsh-adapter/channel/binding-events.d.ts +6 -0
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +43 -0
- package/lib/types/dsh-adapter/channel/capabilities.d.ts +82 -0
- package/lib/types/dsh-adapter/channel/capabilities.d.ts.map +1 -0
- package/lib/types/dsh-adapter/channel/capabilities.js +165 -0
- package/lib/types/dsh-adapter/channel/command-completions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/command-completions.js +8 -0
- package/lib/types/dsh-adapter/channel/context-bookkeeping.d.ts +4 -12
- package/lib/types/dsh-adapter/channel/context-bookkeeping.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/context-bookkeeping.js +9 -4
- package/lib/types/dsh-adapter/channel/external-commands.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/external-commands.js +8 -2
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts +13 -2
- package/lib/types/dsh-adapter/channel/input-delivery.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/input-delivery.js +18 -1
- package/lib/types/dsh-adapter/channel/job-projection.d.ts +1 -0
- package/lib/types/dsh-adapter/channel/job-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/job-projection.js +88 -3
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts +13 -3
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-actions.js +55 -9
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts +8 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-permission-actions.js +25 -10
- package/lib/types/dsh-adapter/channel/preferences.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/preferences.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/preferences.js +26 -8
- package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +42 -37
- package/lib/types/dsh-adapter/channel/reports.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/reports.js +13 -4
- package/lib/types/dsh-adapter/channel/session-reset.d.ts +5 -1
- package/lib/types/dsh-adapter/channel/session-reset.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-reset.js +1 -0
- package/lib/types/dsh-adapter/channel/state.d.ts +21 -3
- package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/state.js +3 -2
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.js +5 -0
- package/lib/types/dsh-adapter/channel/types.d.ts +1 -1
- package/lib/types/dsh-adapter/channel/types.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/usage.d.ts +18 -1
- package/lib/types/dsh-adapter/channel/usage.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/usage.js +97 -2
- package/lib/types/dsh-adapter/channel.d.ts +1 -1
- package/lib/types/dsh-adapter/channel.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel.js +72 -4
- package/lib/types/dsh-adapter/context-occupancy.d.ts +204 -0
- package/lib/types/dsh-adapter/context-occupancy.d.ts.map +1 -0
- package/lib/types/dsh-adapter/context-occupancy.js +299 -0
- package/lib/types/dsh-adapter/contract.d.ts +19 -4
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +33 -3
- package/lib/types/dsh-adapter/index.d.ts +32 -0
- package/lib/types/dsh-adapter/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/index.js +20 -1
- package/lib/types/dsh-adapter/jobs.d.ts +82 -16
- package/lib/types/dsh-adapter/jobs.d.ts.map +1 -1
- package/lib/types/dsh-adapter/jobs.js +104 -9
- package/lib/types/dsh-adapter/migrate/sessionize.d.ts.map +1 -1
- package/lib/types/dsh-adapter/migrate/sessionize.js +11 -12
- package/lib/types/dsh-adapter/oauth/bonus.d.ts +27 -0
- package/lib/types/dsh-adapter/oauth/bonus.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/bonus.js +69 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.d.ts +2 -1
- package/lib/types/dsh-adapter/oauth/command.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/command.js +7 -4
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.d.ts +13 -10
- package/lib/types/dsh-adapter/oauth/credentials.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/credentials.js +61 -23
- package/lib/types/dsh-adapter/oauth/deepseek.d.ts +39 -0
- package/lib/types/dsh-adapter/oauth/deepseek.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/deepseek.js +189 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.d.ts +24 -16
- package/lib/types/dsh-adapter/oauth/index.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/index.js +34 -20
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/interaction.d.ts +14 -12
- package/lib/types/dsh-adapter/oauth/interaction.d.ts.map +1 -0
- package/lib/types/dsh-adapter/oauth/interaction.js +283 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.d.ts +2 -1
- package/lib/types/dsh-adapter/oauth/opener.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/opener.js +1 -1
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.d.ts +10 -3
- package/lib/types/dsh-adapter/oauth/pi-ai.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/pi-ai.js +8 -3
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.d.ts +6 -3
- package/lib/types/dsh-adapter/oauth/profiles.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/profiles.js +11 -3
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.d.ts +14 -7
- package/lib/types/dsh-adapter/oauth/service.d.ts.map +1 -0
- package/{node_modules/@deepseek-harness-tui/dsh-auth/lib → lib/types/dsh-adapter/oauth}/service.js +82 -17
- package/lib/types/dsh-adapter/panel-runtime-registry.d.ts +39 -0
- package/lib/types/dsh-adapter/panel-runtime-registry.d.ts.map +1 -0
- package/lib/types/dsh-adapter/panel-runtime-registry.js +84 -0
- package/lib/types/dsh-adapter/panels.d.ts +251 -0
- package/lib/types/dsh-adapter/panels.d.ts.map +1 -0
- package/lib/types/dsh-adapter/panels.js +407 -0
- package/lib/types/dsh-adapter/plugin-host.js +1 -1
- package/lib/types/dsh-adapter/plugin.d.ts +25 -2
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +241 -44
- package/lib/types/dsh-adapter/presets.d.ts +26 -4
- package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/presets.js +29 -5
- package/lib/types/dsh-adapter/providerWizard.d.ts.map +1 -1
- package/lib/types/dsh-adapter/providerWizard.js +6 -2
- package/lib/types/dsh-adapter/startup-args.d.ts +8 -0
- package/lib/types/dsh-adapter/startup-args.d.ts.map +1 -0
- package/lib/types/dsh-adapter/startup-args.js +34 -0
- package/lib/types/dsh-adapter/subagents.d.ts +1 -0
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
- package/lib/types/dsh-adapter/subagents.js +10 -1
- package/lib/types/history.d.ts +24 -7
- package/lib/types/history.d.ts.map +1 -1
- package/lib/types/history.js +77 -18
- package/lib/types/i18n.d.ts +908 -33
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +355 -17
- package/lib/types/ink/components/App.d.ts +14 -1
- package/lib/types/ink/components/App.d.ts.map +1 -1
- package/lib/types/ink/components/App.js +71 -61
- package/lib/types/ink/components/TerminalSizeContext.d.ts +7 -0
- package/lib/types/ink/components/TerminalSizeContext.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-input.d.ts +11 -0
- package/lib/types/ink/hooks/use-input.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-input.js +8 -2
- package/lib/types/ink/hooks/use-terminal-viewport.d.ts.map +1 -1
- package/lib/types/ink/hooks/use-terminal-viewport.js +3 -1
- package/lib/types/ink/ink.d.ts +18 -0
- package/lib/types/ink/ink.d.ts.map +1 -1
- package/lib/types/ink/ink.js +51 -8
- package/lib/types/ink/output.d.ts +10 -1
- package/lib/types/ink/output.d.ts.map +1 -1
- package/lib/types/ink/output.js +3 -3
- package/lib/types/ink/parse-keypress.d.ts +71 -3
- package/lib/types/ink/parse-keypress.d.ts.map +1 -1
- package/lib/types/ink/parse-keypress.js +815 -133
- package/lib/types/ink/render-node-to-output.d.ts +1 -1
- package/lib/types/ink/render-node-to-output.d.ts.map +1 -1
- package/lib/types/ink/render-node-to-output.js +37 -5
- package/lib/types/ink/screen.d.ts +26 -1
- package/lib/types/ink/screen.d.ts.map +1 -1
- package/lib/types/ink/screen.js +96 -1
- package/lib/types/ink/selection.d.ts +23 -1
- package/lib/types/ink/selection.d.ts.map +1 -1
- package/lib/types/ink/selection.js +102 -26
- package/lib/types/ink/sixel-codec.d.ts +11 -0
- package/lib/types/ink/sixel-codec.d.ts.map +1 -1
- package/lib/types/ink/sixel-codec.js +42 -8
- package/lib/types/ink/terminal-querier.d.ts +25 -0
- package/lib/types/ink/terminal-querier.d.ts.map +1 -1
- package/lib/types/ink/terminal-querier.js +42 -0
- package/lib/types/ink/update-overflow-guard.d.ts +24 -0
- package/lib/types/ink/update-overflow-guard.d.ts.map +1 -1
- package/lib/types/ink/update-overflow-guard.js +25 -3
- package/lib/types/math/renderer.d.ts +2 -0
- package/lib/types/math/renderer.d.ts.map +1 -1
- package/lib/types/math/renderer.js +4 -0
- package/lib/types/minimalUiMode.d.ts +19 -0
- package/lib/types/minimalUiMode.d.ts.map +1 -0
- package/lib/types/minimalUiMode.js +23 -0
- package/lib/types/oauth.d.ts +5 -10
- package/lib/types/oauth.d.ts.map +1 -1
- package/lib/types/oauth.js +5 -10
- package/lib/types/onboardingPrefs.d.ts +52 -0
- package/lib/types/onboardingPrefs.d.ts.map +1 -0
- package/lib/types/onboardingPrefs.js +107 -0
- package/lib/types/panels.d.ts +4 -0
- package/lib/types/panels.d.ts.map +1 -0
- package/lib/types/panels.js +4 -0
- package/lib/types/screens/Chat.d.ts +25 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +1149 -302
- package/lib/types/screens/Launchpad.d.ts +194 -0
- package/lib/types/screens/Launchpad.d.ts.map +1 -0
- package/lib/types/screens/Launchpad.js +607 -0
- package/lib/types/screens/Onboarding.d.ts +37 -0
- package/lib/types/screens/Onboarding.d.ts.map +1 -0
- package/lib/types/screens/Onboarding.js +492 -0
- package/lib/types/screens/SessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/SessionSupervisor.js +18 -12
- package/lib/types/screens/StatusLine.d.ts +4 -0
- package/lib/types/screens/StatusLine.d.ts.map +1 -1
- package/lib/types/screens/StatusLine.js +43 -25
- package/lib/types/screens/StatusMetrics.d.ts +22 -0
- package/lib/types/screens/StatusMetrics.d.ts.map +1 -1
- package/lib/types/screens/StatusMetrics.js +20 -0
- package/lib/types/screens/chatOverlay.d.ts +18 -1
- package/lib/types/screens/chatOverlay.d.ts.map +1 -1
- package/lib/types/screens/chatOverlay.js +3 -0
- package/lib/types/screens/sessionSupervisor/model.d.ts +1 -2
- package/lib/types/screens/sessionSupervisor/model.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/model.js +4 -2
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.d.ts.map +1 -1
- package/lib/types/screens/sessionSupervisor/useSessionSupervisor.js +7 -3
- package/lib/types/settings/definitions.d.ts +93 -0
- package/lib/types/settings/definitions.d.ts.map +1 -1
- package/lib/types/settings/definitions.js +87 -4
- package/lib/types/tips.d.ts.map +1 -1
- package/lib/types/tips.js +13 -7
- package/lib/types/tuiDisplayPrefs.d.ts +42 -2
- package/lib/types/tuiDisplayPrefs.d.ts.map +1 -1
- package/lib/types/tuiDisplayPrefs.js +74 -0
- package/lib/types/update.d.ts +53 -9
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +103 -46
- package/lib/types/utils/bmp.d.ts.map +1 -1
- package/lib/types/utils/bmp.js +8 -1
- package/lib/types/utils/clipboard.d.ts.map +1 -1
- package/lib/types/utils/clipboard.js +25 -6
- package/lib/types/utils/credentials.d.ts.map +1 -1
- package/lib/types/utils/credentials.js +5 -1
- package/lib/types/utils/draftWordBoundary.d.ts +23 -0
- package/lib/types/utils/draftWordBoundary.d.ts.map +1 -0
- package/lib/types/utils/draftWordBoundary.js +161 -0
- package/lib/types/utils/fileTarget.d.ts.map +1 -1
- package/lib/types/utils/fileTarget.js +7 -9
- package/lib/types/utils/inputPaste.d.ts +62 -0
- package/lib/types/utils/inputPaste.d.ts.map +1 -0
- package/lib/types/utils/inputPaste.js +111 -0
- package/lib/types/utils/intl.d.ts +8 -0
- package/lib/types/utils/intl.d.ts.map +1 -1
- package/lib/types/utils/intl.js +11 -0
- package/lib/types/utils/keymap.d.ts +13 -3
- package/lib/types/utils/keymap.d.ts.map +1 -1
- package/lib/types/utils/keymap.js +27 -5
- package/lib/types/utils/pastedImagePath.d.ts +8 -0
- package/lib/types/utils/pastedImagePath.d.ts.map +1 -1
- package/lib/types/utils/pastedImagePath.js +29 -5
- package/package.json +128 -106
- package/presets/liangshen/agent.cordis.yml +4 -1
- package/presets/liangshen/preset.yml +1 -1
- package/{dsh-ecosystem-spec → tui-profile}/registry/README.md +1 -1
- package/{dsh-ecosystem-spec → tui-profile}/registry/registry-0.15.json +1 -1
- package/lib/types/minimalMode.d.ts +0 -13
- package/lib/types/minimalMode.d.ts.map +0 -1
- package/lib/types/minimalMode.js +0 -17
- package/node_modules/@deepseek-harness-tui/dsh-auth/LICENSE +0 -21
- package/node_modules/@deepseek-harness-tui/dsh-auth/README.md +0 -143
- package/node_modules/@deepseek-harness-tui/dsh-auth/cordis.patch.yml +0 -11
- package/node_modules/@deepseek-harness-tui/dsh-auth/dsh-plugin.json +0 -44
- package/node_modules/@deepseek-harness-tui/dsh-auth/lib/interaction.js +0 -193
- package/node_modules/@deepseek-harness-tui/dsh-auth/package.json +0 -69
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/profile-definitions.d.ts +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/profile-definitions.js +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-channel-http.d.ts +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-channel-http.js +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-channel.d.ts +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-channel.js +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-contributions.d.ts +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/protocols/tui-contributions.js +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/contracts/decision-events-v1alpha1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/contracts/scene-v1alpha1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/contracts/settings-section-v1alpha1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/contracts/tui-channel-v1alpha1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/contracts/workspace-provider-v1alpha1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/host-descriptor.tui.example.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/registry/permissions-0.1.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/schemas/conformance-claim.schema.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/schemas/effect-ledger-record.schema.json +0 -0
- /package/{dsh-ecosystem-spec → tui-profile}/schemas/host-descriptor.schema.json +0 -0
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* CompanionPanel(设计分文档 §4 + v2.1 + 2026-10 沉底/互动/气泡改造):
|
|
4
|
+
*
|
|
5
|
+
* 信号 ─▶ mood.ts 的派生 + 平滑层(防闪烁五规则)─▶ 显示语义
|
|
6
|
+
* ─▶ deepy 动画键(20 个全接上)─▶ 半块渲染(42×15)
|
|
7
|
+
*
|
|
8
|
+
* 布局(沉底):宠物锚定在面板最底部(贴着 SidePanelColumn 底部 hint 行
|
|
9
|
+
* 上方),腾出的上方空间放一个克制的状态区:心情 + 会话/工具统计行、
|
|
10
|
+
* 「当前动作」行(kit 自带中文 title,不走 i18n)、互动提示行。
|
|
11
|
+
* 宽度分三档:<44 列紧凑(不画皮肤,只留紧凑行);连紧凑形态都摆不下
|
|
12
|
+
* (< PANEL_MIN_COLUMNS,分栏几何的列宽下限)只留一条居中的「好挤呀,
|
|
13
|
+
* 暂时躲起来了」标语(companion-cramped,{{name}}=皮肤 title;皮肤无关,
|
|
14
|
+
* 判定在面板层)。
|
|
15
|
+
*
|
|
16
|
+
* 互动(鼠标):
|
|
17
|
+
* - 点击宠物左半/右半 → poke-left / poke-right(ClickEvent.localCol),
|
|
18
|
+
* 保留爱心 pass(whale 回退皮肤的 pose.heart);
|
|
19
|
+
* - TICKLE_WINDOW_MS 内 ≥3 次点击 → tickle,窗口结束回平滑情绪;
|
|
20
|
+
* - 按住拖动(onDragStart/Move/End)→ drag 动画 + **真拖动**:本体跟着
|
|
21
|
+
* 指针在面板内容区内移动(clamp 在面板盒内,可以窜到状态区文字上面
|
|
22
|
+
* ——调皮是特性),松手后 PET_REBOUND_MS 内插值弹回底部 home。位移是
|
|
23
|
+
* 面板层状态(两套皮肤共用),皮肤输出不动:水平=行内定宽 spacer
|
|
24
|
+
* (左 spacer + 宠物 + 右 spacer 恒等于面板宽,§16.6 列宽不变式天然
|
|
25
|
+
* 成立),垂直=定高 home 槽行内负 marginTop(溢出可见)——刻意不用
|
|
26
|
+
* position:absolute:图像版皮肤的可见性门与渲染路径要求宠物留在流内;
|
|
27
|
+
* - 指针进面板(near/左/右)→ idle-look(东张西望);碰到宠物本体 →
|
|
28
|
+
* idle-spout(开心喷水);睡眠中被碰到 → waking(官方 trigger)。
|
|
29
|
+
* 鼠标契约:点击/拖拽 stopImmediatePropagation,hover 离开面板即复原。
|
|
30
|
+
*
|
|
31
|
+
* 通知气泡:channel.notifications(最新在最后)的新条目由宠物用圆角对话
|
|
32
|
+
* 气泡说出来(面板内的**加一层**表达;输入框上方的 toast 照旧,不动)。
|
|
33
|
+
* 颜色配反应动画:error→error、success→happy、warning→notification、
|
|
34
|
+
* 无色→idle-look。visible=false 期间清空队列,切回来不弹旧账。
|
|
35
|
+
*
|
|
36
|
+
* 活动自述气泡:working 回合里聊天区 ⏵ 工作行(ActivityLine)的那句
|
|
37
|
+
* 模型自述,由头顶气泡**逐字同步转述**(同一数据源 runtimeCtx.activity
|
|
38
|
+
* 的 line 字段,不自行派生;判定条件与 Chat 相同:working 且 line 非空
|
|
39
|
+
* 且 phase≠idle)。派生值、随渲染实时换词,无进出场可重触发;瞬态气泡
|
|
40
|
+
* (通知/戳一戳)有效期内盖过它,到期仍在 working 则回落。回合结束
|
|
41
|
+
* (working=false)即收起——庆祝动画走 mood 层,与此无关。拖动会话
|
|
42
|
+
* (含回弹)期间两层气泡都抑制,落定后恢复(气泡不跟宠物走:孤零零
|
|
43
|
+
* 留在 home 上方出戏,选抑制)。
|
|
44
|
+
*
|
|
45
|
+
* 时钟:visible=false 零订阅(useAnimationFrame 传 null)+ 零自有定时器;
|
|
46
|
+
* 可见时由 160ms(睡眠 1000ms)的本地 tick 驱动动画帧与气泡/互动过期——
|
|
47
|
+
* PanelHost 内 useAnimationFrame 因视口测量问题不订阅(见
|
|
48
|
+
* verify-companion-panel.tsx 文件头的既有 finding),本地 tick 是等价替代。
|
|
49
|
+
*/
|
|
50
|
+
import React from 'react';
|
|
51
|
+
import { Box, Text, useAnimationFrame } from '../../../ui.js';
|
|
52
|
+
import instances from '../../../ink/instances.js';
|
|
53
|
+
import { t } from '../../../i18n.js';
|
|
54
|
+
import wrapText from '../../../ink/wrap-text.js';
|
|
55
|
+
import { truncateWidth } from '../../../trajectory/format.js';
|
|
56
|
+
import { panelStore } from '../PanelStore.js';
|
|
57
|
+
import { PANEL_MIN_COLUMNS } from '../dimensions.js';
|
|
58
|
+
import { getCompanionSkin, subscribeCompanionSkin } from '../../../tuiDisplayPrefs.js';
|
|
59
|
+
import { useSidePanelChannel, SidePanelRuntimeContext } from '../SidePanelRuntimeContext.js';
|
|
60
|
+
import { usePanelInput } from '../usePanelInput.js';
|
|
61
|
+
import { CARRYING_FLASH_MS, CELEBRATE_DWELL_MS, IDLE_ROTATE_MS, NOTIFICATION_BUBBLE_MS, POKE_MS, TICKLE_MIN_CLICKS, TICKLE_WINDOW_MS, WAKING_FLASH_MS, countRunningJobs, countRunningSubagents, countSessionsRunning, createNotificationTracker, deriveCompanionContext, deriveCompanionMood, idleRotationIndex, initialCompanionDisplayState, notificationReactionKind, resolveTargetSemantic, stepCompanionDisplay, stepNotificationTracker, } from './mood.js';
|
|
62
|
+
import { initialCompanionPoseState, nextCompanionPoseStep } from './pose.js';
|
|
63
|
+
import { DeepySkin, resolveCompanionSkin } from './skins.js';
|
|
64
|
+
import { DEEPY_IDLE_ROTATION, DEEPY_NOTIFICATION_REACTION, deepyAnimationFor, frameAt, loadDeepyKit, renderedDeepyAnimation, } from './deepy.js';
|
|
65
|
+
/** 入睡延迟:Panel 常驻,沿用分文档的 60s(开屏 splash 保持 10s)。 */
|
|
66
|
+
const SLEEP_AFTER_MS = 60_000;
|
|
67
|
+
/** 单次 poke 反应的展示时长(poke-left/poke-right 帧表一轮 2100ms,取一轮多的头段)。 */
|
|
68
|
+
const POKE_REACTION_MS = 1400;
|
|
69
|
+
/** Enter 键戳一戳用的反应档。 */
|
|
70
|
+
const ENTER_POKE_SIDE = 'poke-right';
|
|
71
|
+
/** 气泡最多展示的文本行数(超出按 truncateWidth 截断)。 */
|
|
72
|
+
const BUBBLE_MAX_LINES = 3;
|
|
73
|
+
/** 松手弹回的插值时长(约两个动画 tick;无弹簧物理,克制优先)。 */
|
|
74
|
+
const PET_REBOUND_MS = 360;
|
|
75
|
+
/** 本地动画 tick:PanelHost 内 useAnimationFrame 不订阅(既有 finding),由它代位。 */
|
|
76
|
+
const TICK_MS = 160;
|
|
77
|
+
const TICK_MS_SLEEPING = 1000;
|
|
78
|
+
const MOOD_LABEL_KEY = {
|
|
79
|
+
sleeping: 'companion-mood-sleeping',
|
|
80
|
+
idle: 'companion-mood-idle',
|
|
81
|
+
waiting: 'companion-mood-waiting',
|
|
82
|
+
thinking: 'companion-mood-thinking',
|
|
83
|
+
working: 'companion-mood-working',
|
|
84
|
+
responding: 'companion-mood-responding',
|
|
85
|
+
attention: 'companion-mood-attention',
|
|
86
|
+
celebrate: 'companion-mood-celebrate',
|
|
87
|
+
error: 'companion-mood-error',
|
|
88
|
+
};
|
|
89
|
+
/** 显示语义 → 心情(pose/标签用;whale 皮肤的分层姿态与心情标签同源)。 */
|
|
90
|
+
const SEMANTIC_MOOD = {
|
|
91
|
+
thinking: 'thinking',
|
|
92
|
+
typing: 'working',
|
|
93
|
+
notification: 'attention',
|
|
94
|
+
error: 'error',
|
|
95
|
+
happy: 'celebrate',
|
|
96
|
+
sleeping: 'sleeping',
|
|
97
|
+
idle: 'idle',
|
|
98
|
+
music: 'working',
|
|
99
|
+
conducting: 'working',
|
|
100
|
+
building: 'working',
|
|
101
|
+
compacting: 'working',
|
|
102
|
+
};
|
|
103
|
+
const MOOD_COLOR = {
|
|
104
|
+
sleeping: 'inactive',
|
|
105
|
+
idle: 'accent',
|
|
106
|
+
waiting: 'accent',
|
|
107
|
+
thinking: 'accent',
|
|
108
|
+
working: 'accent',
|
|
109
|
+
responding: 'accent',
|
|
110
|
+
attention: 'warning',
|
|
111
|
+
celebrate: 'success',
|
|
112
|
+
error: 'error',
|
|
113
|
+
};
|
|
114
|
+
const BUBBLE_COLOR = {
|
|
115
|
+
error: 'error',
|
|
116
|
+
warning: 'warning',
|
|
117
|
+
success: 'success',
|
|
118
|
+
};
|
|
119
|
+
function formatElapsed(ms) {
|
|
120
|
+
const seconds = Math.max(0, Math.floor(ms / 1000));
|
|
121
|
+
if (seconds < 60)
|
|
122
|
+
return seconds + 's';
|
|
123
|
+
return Math.floor(seconds / 60) + 'm' + (seconds % 60) + 's';
|
|
124
|
+
}
|
|
125
|
+
function hoverSemantic(zone) {
|
|
126
|
+
if (zone === 'pet')
|
|
127
|
+
return 'notice';
|
|
128
|
+
if (zone === 'near' || zone === 'left' || zone === 'right')
|
|
129
|
+
return 'look';
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
export function CompanionPanel({ width, height, focused, visible }) {
|
|
133
|
+
const channel = useSidePanelChannel();
|
|
134
|
+
const runtimeCtx = React.useContext(SidePanelRuntimeContext);
|
|
135
|
+
const activity = runtimeCtx?.activity;
|
|
136
|
+
const attentionCtx = runtimeCtx?.attention;
|
|
137
|
+
const jobsBadge = React.useSyncExternalStore(panelStore.subscribe, () => panelStore.get('jobs')?.badge ?? null);
|
|
138
|
+
const jobsFailedUnread = jobsBadge !== null && jobsBadge.level === 'error' ? jobsBadge.unread : 0;
|
|
139
|
+
const subagents = channel.subagents ?? [];
|
|
140
|
+
const backgroundJobs = channel.backgroundJobs ?? [];
|
|
141
|
+
const failedSubagents = subagents.filter(s => s.status === 'failed').length;
|
|
142
|
+
// 本地重渲染驱动(互动/气泡/动画帧都要在事件之外推进)。
|
|
143
|
+
const [, setBump] = React.useState(0);
|
|
144
|
+
const bump = React.useCallback(() => { setBump(n => n + 1); }, []);
|
|
145
|
+
// 活动 = 任何会话动静 + 面板交互;睡眠由这个时钟驱动(60s 无活动)。
|
|
146
|
+
const lastInputAtRef = React.useRef(Date.now());
|
|
147
|
+
React.useEffect(() => {
|
|
148
|
+
lastInputAtRef.current = Date.now();
|
|
149
|
+
}, [channel.version]);
|
|
150
|
+
// 回合完成(working true→false)触发一次庆祝(happy 只在边沿 armed)。
|
|
151
|
+
const [celebrateUntil, setCelebrateUntil] = React.useState(0);
|
|
152
|
+
const prevWorkingRef = React.useRef(channel.working);
|
|
153
|
+
React.useEffect(() => {
|
|
154
|
+
const was = prevWorkingRef.current;
|
|
155
|
+
prevWorkingRef.current = channel.working;
|
|
156
|
+
if (was && !channel.working)
|
|
157
|
+
setCelebrateUntil(Date.now() + CELEBRATE_DWELL_MS);
|
|
158
|
+
}, [channel.working]);
|
|
159
|
+
// --- 覆盖层(互动/反应)与气泡:渲染期 ref 步进,过期由本地 tick 收 ----
|
|
160
|
+
const overrideRef = React.useRef(undefined);
|
|
161
|
+
const bubbleRef = React.useRef(undefined);
|
|
162
|
+
const notifyTrackerRef = React.useRef(null);
|
|
163
|
+
if (notifyTrackerRef.current === null)
|
|
164
|
+
notifyTrackerRef.current = createNotificationTracker();
|
|
165
|
+
const clicksRef = React.useRef([]);
|
|
166
|
+
const carryRef = React.useRef({ branch: undefined, until: 0 });
|
|
167
|
+
const heartPendingRef = React.useRef(false);
|
|
168
|
+
// 真拖动位移(面板层状态,两套皮肤共用):session 锚住拖起点的屏幕坐标
|
|
169
|
+
// 与宠物当时的面板内位置;dragPos 是当前跟手位置;flyback 是松手后的
|
|
170
|
+
// 时间插值弹回(渲染期按 now 推进,本地 tick 驱动重渲染)。
|
|
171
|
+
const dragSessionRef = React.useRef(undefined);
|
|
172
|
+
const dragPosRef = React.useRef(undefined);
|
|
173
|
+
const flybackRef = React.useRef(undefined);
|
|
174
|
+
const [hoverState, setHoverState] = React.useState(undefined);
|
|
175
|
+
const now = Date.now();
|
|
176
|
+
// 恢复可见的第一帧:语义跳闸对齐 + 通知积压静默吞掉。
|
|
177
|
+
const prevVisibleRef = React.useRef(visible);
|
|
178
|
+
const realignPending = visible && !prevVisibleRef.current;
|
|
179
|
+
prevVisibleRef.current = visible;
|
|
180
|
+
// 通知观察:新条目(比已见的更新)→ 气泡 + 反应动画;不可见或刚恢复
|
|
181
|
+
// 可见(realign)的那一帧只记账不弹——切回来不弹旧账。
|
|
182
|
+
const newestNotify = stepNotificationTracker(notifyTrackerRef.current, channel.notifications ?? [], { silent: !visible || realignPending });
|
|
183
|
+
if (newestNotify !== undefined && visible) {
|
|
184
|
+
const reaction = notificationReactionKind(newestNotify.color);
|
|
185
|
+
overrideRef.current = {
|
|
186
|
+
semantic: DEEPY_NOTIFICATION_REACTION[reaction] ?? 'idle-look',
|
|
187
|
+
since: now,
|
|
188
|
+
until: now + NOTIFICATION_BUBBLE_MS,
|
|
189
|
+
};
|
|
190
|
+
bubbleRef.current = { text: newestNotify.text, color: newestNotify.color, kind: 'notify', until: now + NOTIFICATION_BUBBLE_MS };
|
|
191
|
+
}
|
|
192
|
+
if (!visible) {
|
|
193
|
+
// 面板非 active:清空覆盖层与气泡(切回来不弹旧账);语义在 realign 对齐。
|
|
194
|
+
overrideRef.current = undefined;
|
|
195
|
+
bubbleRef.current = undefined;
|
|
196
|
+
clicksRef.current = [];
|
|
197
|
+
dragSessionRef.current = undefined;
|
|
198
|
+
dragPosRef.current = undefined;
|
|
199
|
+
flybackRef.current = undefined;
|
|
200
|
+
}
|
|
201
|
+
// --- 派生(纯)→ 目标语义 → 平滑层 --------------------------------------
|
|
202
|
+
const derived = deriveCompanionMood({
|
|
203
|
+
working: channel.working,
|
|
204
|
+
spinnerMode: channel.spinnerMode,
|
|
205
|
+
activity,
|
|
206
|
+
attention: {
|
|
207
|
+
approvalPending: (attentionCtx?.approvals ?? 0) > 0,
|
|
208
|
+
questionPending: (attentionCtx?.questions ?? 0) > 0,
|
|
209
|
+
},
|
|
210
|
+
failures: { failedJobsUnread: jobsFailedUnread, failedSubagents },
|
|
211
|
+
lastInputAt: lastInputAtRef.current,
|
|
212
|
+
celebration: celebrateUntil > now ? { kind: 'turn-done', until: celebrateUntil } : undefined,
|
|
213
|
+
sleepAfterMs: SLEEP_AFTER_MS,
|
|
214
|
+
}, now);
|
|
215
|
+
const context = deriveCompanionContext({
|
|
216
|
+
working: channel.working,
|
|
217
|
+
subagents,
|
|
218
|
+
backgroundJobs,
|
|
219
|
+
compaction: channel.compaction,
|
|
220
|
+
});
|
|
221
|
+
const targetSemantic = resolveTargetSemantic(derived.mood, context);
|
|
222
|
+
// carrying(顶箱子):gitBranch 变更是「新建/切换分支-工作树」在 channel
|
|
223
|
+
// 上唯一的可见信号,变更时闪现一次。
|
|
224
|
+
const gitBranch = channel.gitBranch;
|
|
225
|
+
if (gitBranch !== undefined) {
|
|
226
|
+
if (carryRef.current.branch === undefined || carryRef.current.branch !== gitBranch) {
|
|
227
|
+
const changed = carryRef.current.branch !== undefined && carryRef.current.until <= now;
|
|
228
|
+
carryRef.current = { branch: gitBranch, until: changed ? now + CARRYING_FLASH_MS : carryRef.current.until };
|
|
229
|
+
if (changed && visible) {
|
|
230
|
+
overrideRef.current = { semantic: 'carrying', since: now, until: now + CARRYING_FLASH_MS };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const displayRef = React.useRef(initialCompanionDisplayState);
|
|
235
|
+
displayRef.current = stepCompanionDisplay(displayRef.current, targetSemantic, now, { realign: realignPending });
|
|
236
|
+
const display = displayRef.current;
|
|
237
|
+
// 醒来闪现:显示语义刚离开 sleeping → waking(官方 trigger:睡眠中被扰)。
|
|
238
|
+
const prevSemanticRef = React.useRef(initialCompanionDisplayState.semantic);
|
|
239
|
+
if (prevSemanticRef.current === 'sleeping' && display.semantic !== 'sleeping'
|
|
240
|
+
&& (overrideRef.current === undefined || overrideRef.current.until <= now)) {
|
|
241
|
+
overrideRef.current = { semantic: 'waking', since: now, until: now + WAKING_FLASH_MS };
|
|
242
|
+
}
|
|
243
|
+
prevSemanticRef.current = display.semantic;
|
|
244
|
+
const activeOverride = overrideRef.current !== undefined && overrideRef.current.until > now ? overrideRef.current : undefined;
|
|
245
|
+
// --- 最终动画键(互动覆盖 > 悬停 > idle 轮换 > 平滑语义)-----------------
|
|
246
|
+
const hover = hoverState !== undefined && visible ? hoverState : undefined;
|
|
247
|
+
let animationSemantic;
|
|
248
|
+
let animSince;
|
|
249
|
+
if (activeOverride !== undefined) {
|
|
250
|
+
animationSemantic = activeOverride.semantic;
|
|
251
|
+
animSince = activeOverride.since;
|
|
252
|
+
}
|
|
253
|
+
else if (display.semantic === 'idle') {
|
|
254
|
+
const hoverSem = hoverSemantic(hover?.zone);
|
|
255
|
+
if (hoverSem !== undefined) {
|
|
256
|
+
animationSemantic = hoverSem;
|
|
257
|
+
animSince = hover?.since ?? now;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const index = idleRotationIndex(display.since, now, DEEPY_IDLE_ROTATION.length);
|
|
261
|
+
animationSemantic = DEEPY_IDLE_ROTATION[index] ?? 'idle';
|
|
262
|
+
animSince = display.since + Math.max(0, Math.floor((now - display.since) / IDLE_ROTATE_MS)) * IDLE_ROTATE_MS;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
animationSemantic = display.semantic;
|
|
267
|
+
animSince = display.since;
|
|
268
|
+
}
|
|
269
|
+
const animationKey = deepyAnimationFor(animationSemantic);
|
|
270
|
+
// 时钟(v2.1 契约保持):visible=false 零订阅;本地 tick 代位驱动帧。
|
|
271
|
+
const [clockRef] = useAnimationFrame(!visible ? null : display.semantic === 'sleeping' ? 1000 : 120);
|
|
272
|
+
const tickMs = !visible
|
|
273
|
+
? 0
|
|
274
|
+
: display.semantic === 'sleeping' && activeOverride === undefined && hover === undefined
|
|
275
|
+
? TICK_MS_SLEEPING
|
|
276
|
+
: TICK_MS;
|
|
277
|
+
React.useEffect(() => {
|
|
278
|
+
if (tickMs <= 0)
|
|
279
|
+
return undefined;
|
|
280
|
+
const id = setInterval(() => setBump(n => n + 1), tickMs);
|
|
281
|
+
return () => { clearInterval(id); };
|
|
282
|
+
}, [tickMs]);
|
|
283
|
+
// --- 皮肤与帧 -------------------------------------------------------------
|
|
284
|
+
const skinId = React.useSyncExternalStore(subscribeCompanionSkin, getCompanionSkin);
|
|
285
|
+
const skin = resolveCompanionSkin(skinId);
|
|
286
|
+
const useDeepy = skinId === DeepySkin.id;
|
|
287
|
+
const kit = useDeepy ? loadDeepyKit() : undefined;
|
|
288
|
+
const rendered = kit !== undefined ? renderedDeepyAnimation(kit, animationKey) : undefined;
|
|
289
|
+
const animation = kit?.byKey[animationKey];
|
|
290
|
+
const petColumns = skin.cells.columns;
|
|
291
|
+
const compact = width < petColumns + 2;
|
|
292
|
+
const deepyRows = useDeepy && rendered !== undefined && animation !== undefined
|
|
293
|
+
? (rendered[frameAt(animation, Math.max(0, now - animSince))] ?? [])
|
|
294
|
+
: undefined;
|
|
295
|
+
// --- 宠物位移(面板层):home 几何 + 拖动/弹回放置 ------------------------
|
|
296
|
+
// home = 面板内容盒的底部居中(与原沉底布局同一几何:居中列 + 底行)。
|
|
297
|
+
const petRows = skin.cells.rows;
|
|
298
|
+
const homeLeft = Math.max(0, Math.floor((width - petColumns) / 2));
|
|
299
|
+
const homeTop = Math.max(0, height - petRows);
|
|
300
|
+
const maxLeft = Math.max(0, width - petColumns);
|
|
301
|
+
const maxTop = Math.max(0, height - petRows);
|
|
302
|
+
const clampPet = (left, top) => ({
|
|
303
|
+
left: Math.min(Math.max(0, left), maxLeft),
|
|
304
|
+
top: Math.min(Math.max(0, top), maxTop),
|
|
305
|
+
});
|
|
306
|
+
// 放置优先级:拖动跟手 > 弹回插值 > home。弹回按墙钟确定性推进(渲染
|
|
307
|
+
// 期读 now,本地 tick 驱动重渲染;p>=1 即归位并清档)。petTop 以「距
|
|
308
|
+
// 面板顶的行数」表达,渲染时换算成 home 槽行内的负 marginTop(升起行数)。
|
|
309
|
+
let petLeft = homeLeft;
|
|
310
|
+
let petTop = homeTop;
|
|
311
|
+
if (flybackRef.current !== undefined) {
|
|
312
|
+
const progress = Math.min(1, (now - flybackRef.current.since) / PET_REBOUND_MS);
|
|
313
|
+
const ease = (1 - progress) * (1 - progress);
|
|
314
|
+
petLeft = Math.round(homeLeft + (flybackRef.current.fromLeft - homeLeft) * ease);
|
|
315
|
+
petTop = Math.round(homeTop + (flybackRef.current.fromTop - homeTop) * ease);
|
|
316
|
+
if (progress >= 1)
|
|
317
|
+
flybackRef.current = undefined;
|
|
318
|
+
}
|
|
319
|
+
if (dragPosRef.current !== undefined) {
|
|
320
|
+
petLeft = dragPosRef.current.left;
|
|
321
|
+
petTop = dragPosRef.current.top;
|
|
322
|
+
}
|
|
323
|
+
const petRise = maxTop - petTop;
|
|
324
|
+
// --- 残影防线:位移改位时作废上一帧的 blit 基线 --------------------------
|
|
325
|
+
// 宠物溢出行画压到流内兄弟(状态区/空隙/气泡)上时,差分渲染的两个前
|
|
326
|
+
// 提被打破:clean 节点的 blit 快路径会把 prevScreen 里宠物更早位置的像
|
|
327
|
+
// 素抄回模型(自污染),而移走方的 clear 只记 damage 不写内容——差分看
|
|
328
|
+
// 到 prev==next 就永不发修复,终端留下残影(用户实测:拖到面板中上部
|
|
329
|
+
// 留残影)。renderer 为这类「高覆盖物移动」提供的官方逃生口是
|
|
330
|
+
// App.invalidatePrevFrame():标记上一帧不可信,下一帧做全损伤差分、
|
|
331
|
+
// 逐格对照真实树重导出——被让出的格子作为变化正常发空格擦除。宠物在
|
|
332
|
+
// 悬空状态下每改一次位(拖动/回弹的一帧)就作废一次;归位的那一帧
|
|
333
|
+
//(rise>0→0 的最后让出)也作废。静止时零开销。
|
|
334
|
+
const ink = instances.get(process.stdout) ?? instances.values().next().value;
|
|
335
|
+
const petDisplaced = petRise > 0;
|
|
336
|
+
const petWasDisplacedRef = React.useRef(false);
|
|
337
|
+
React.useEffect(() => {
|
|
338
|
+
// effect 落在 commit 之后、下一帧之前——正好是两帧之间的窗口(渲染期
|
|
339
|
+
// 调用会被当帧 onRender 复位,等于没调)。悬空期间每次改位、以及归位
|
|
340
|
+
// 的那一次,都作废上一帧的 blit 基线。
|
|
341
|
+
if (petDisplaced || petWasDisplacedRef.current)
|
|
342
|
+
ink?.invalidatePrevFrame();
|
|
343
|
+
petWasDisplacedRef.current = petDisplaced;
|
|
344
|
+
}, [petLeft, petRise, petDisplaced, ink]);
|
|
345
|
+
const poseRef = React.useRef(initialCompanionPoseState(now));
|
|
346
|
+
const poseStep = nextCompanionPoseStep(poseRef.current, { mood: SEMANTIC_MOOD[display.semantic], heart: heartPendingRef.current }, now);
|
|
347
|
+
poseRef.current = poseStep.state;
|
|
348
|
+
heartPendingRef.current = false;
|
|
349
|
+
// --- 键盘:Enter 戳一戳(保留);'s' → Send to Chat(保留)---------------
|
|
350
|
+
const moodLabel = t(MOOD_LABEL_KEY[SEMANTIC_MOOD[display.semantic]]);
|
|
351
|
+
const runningSubagents = countRunningSubagents(subagents);
|
|
352
|
+
const runningJobs = countRunningJobs(backgroundJobs);
|
|
353
|
+
const sessionsRunning = countSessionsRunning(channel.working, runningSubagents, runningJobs);
|
|
354
|
+
const statsText = (() => {
|
|
355
|
+
if (runningSubagents > 0 || runningJobs > 0) {
|
|
356
|
+
const parts = [];
|
|
357
|
+
if (runningSubagents > 0)
|
|
358
|
+
parts.push(t('companion-stat-subagents', { n: runningSubagents }));
|
|
359
|
+
if (sessionsRunning > 1)
|
|
360
|
+
parts.push(t('companion-stat-sessions', { n: sessionsRunning }));
|
|
361
|
+
return parts.join(' · ');
|
|
362
|
+
}
|
|
363
|
+
if (activity !== undefined && channel.working && activity.phaseStartedAt > 0) {
|
|
364
|
+
const elapsed = formatElapsed(now - activity.phaseStartedAt);
|
|
365
|
+
return activity.toolCount > 0
|
|
366
|
+
? t('companion-stats-working', { duration: elapsed, count: activity.toolCount })
|
|
367
|
+
: elapsed;
|
|
368
|
+
}
|
|
369
|
+
return moodLabel;
|
|
370
|
+
})();
|
|
371
|
+
usePanelInput((input, key) => {
|
|
372
|
+
if (key.return_ === true || input === '\r') {
|
|
373
|
+
const at = Date.now();
|
|
374
|
+
overrideRef.current = { semantic: ENTER_POKE_SIDE, since: at, until: at + POKE_REACTION_MS };
|
|
375
|
+
if (activity?.line !== undefined && activity.line !== '') {
|
|
376
|
+
bubbleRef.current = { text: activity.line, kind: 'poke', until: at + POKE_MS };
|
|
377
|
+
}
|
|
378
|
+
heartPendingRef.current = true;
|
|
379
|
+
lastInputAtRef.current = at;
|
|
380
|
+
bump();
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
if (input === 's') {
|
|
384
|
+
if (typeof channel.attachContext !== 'function')
|
|
385
|
+
return false;
|
|
386
|
+
const content = [
|
|
387
|
+
'宠物心情:' + moodLabel,
|
|
388
|
+
activity?.line !== undefined && activity.line !== '' ? '当前活动:' + activity.line : undefined,
|
|
389
|
+
'统计:' + statsText,
|
|
390
|
+
].filter((line) => line !== undefined).join('\n');
|
|
391
|
+
channel.attachContext({ source: 'panel', sourceId: 'companion', title: t('companion-send-title'), content });
|
|
392
|
+
channel.notify(t('panel-sent-to-chat', { title: t('companion-send-title') }), { color: 'success' });
|
|
393
|
+
lastInputAtRef.current = Date.now();
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
return false;
|
|
397
|
+
}, { active: focused && visible });
|
|
398
|
+
// --- 鼠标互动 -------------------------------------------------------------
|
|
399
|
+
const registerClick = (side) => {
|
|
400
|
+
const at = Date.now();
|
|
401
|
+
lastInputAtRef.current = at;
|
|
402
|
+
heartPendingRef.current = true;
|
|
403
|
+
clicksRef.current = [...clicksRef.current.filter(ts => ts > at - TICKLE_WINDOW_MS), at];
|
|
404
|
+
overrideRef.current = clicksRef.current.length >= TICKLE_MIN_CLICKS
|
|
405
|
+
? { semantic: 'tickle', since: at, until: at + TICKLE_WINDOW_MS }
|
|
406
|
+
: { semantic: side, since: at, until: at + POKE_REACTION_MS };
|
|
407
|
+
bump();
|
|
408
|
+
};
|
|
409
|
+
const onPetClick = (event) => {
|
|
410
|
+
event.stopImmediatePropagation();
|
|
411
|
+
registerClick(event.localCol < petColumns / 2 ? 'poke-left' : 'poke-right');
|
|
412
|
+
};
|
|
413
|
+
const onDragStart = (event) => {
|
|
414
|
+
event.stopImmediatePropagation();
|
|
415
|
+
const at = Date.now();
|
|
416
|
+
lastInputAtRef.current = at;
|
|
417
|
+
// 锚在当前显示位置(在家,或上一段弹回的中途被再次抓住)。
|
|
418
|
+
flybackRef.current = undefined;
|
|
419
|
+
const base = dragPosRef.current ?? { left: homeLeft, top: homeTop };
|
|
420
|
+
dragSessionRef.current = {
|
|
421
|
+
baseLeft: base.left,
|
|
422
|
+
baseTop: base.top,
|
|
423
|
+
startCol: event.startCol,
|
|
424
|
+
startRow: event.startRow,
|
|
425
|
+
};
|
|
426
|
+
dragPosRef.current = { left: base.left, top: base.top };
|
|
427
|
+
overrideRef.current = { semantic: 'drag', since: at, until: Number.POSITIVE_INFINITY };
|
|
428
|
+
bump();
|
|
429
|
+
};
|
|
430
|
+
const onDragMove = (event) => {
|
|
431
|
+
event.stopImmediatePropagation();
|
|
432
|
+
lastInputAtRef.current = Date.now();
|
|
433
|
+
const session = dragSessionRef.current;
|
|
434
|
+
if (session === undefined)
|
|
435
|
+
return;
|
|
436
|
+
// 位移 = 指针相对拖起点的位移(绝对坐标差,不依赖渲染帧的缓存矩形),
|
|
437
|
+
// clamp 在面板内容盒内——抓取点保持在指针下,本体不出面板。
|
|
438
|
+
dragPosRef.current = clampPet(session.baseLeft + (event.col - session.startCol), session.baseTop + (event.row - session.startRow));
|
|
439
|
+
bump();
|
|
440
|
+
};
|
|
441
|
+
const onDragEnd = (event) => {
|
|
442
|
+
event.stopImmediatePropagation();
|
|
443
|
+
const at = Date.now();
|
|
444
|
+
lastInputAtRef.current = at;
|
|
445
|
+
dragSessionRef.current = undefined;
|
|
446
|
+
const resting = dragPosRef.current;
|
|
447
|
+
dragPosRef.current = undefined;
|
|
448
|
+
// 有实际位移才弹回(≤1 格的抖动直接归位,克制优先)。
|
|
449
|
+
if (resting !== undefined && (Math.abs(resting.left - homeLeft) > 1 || Math.abs(resting.top - homeTop) > 1)) {
|
|
450
|
+
flybackRef.current = { fromLeft: resting.left, fromTop: resting.top, since: at };
|
|
451
|
+
}
|
|
452
|
+
if (overrideRef.current?.semantic === 'drag')
|
|
453
|
+
overrideRef.current = undefined;
|
|
454
|
+
bump();
|
|
455
|
+
};
|
|
456
|
+
const enterZone = (zone) => {
|
|
457
|
+
const at = Date.now();
|
|
458
|
+
if (zone === 'pet')
|
|
459
|
+
lastInputAtRef.current = at;
|
|
460
|
+
setHoverState(prev => {
|
|
461
|
+
if (prev?.zone === zone)
|
|
462
|
+
return prev;
|
|
463
|
+
// 同档(look)内换侧不重置动画;换档(look↔notice)重开一段。
|
|
464
|
+
const prevSem = hoverSemantic(prev?.zone);
|
|
465
|
+
const nextSem = hoverSemantic(zone);
|
|
466
|
+
return { zone, since: prevSem === nextSem && prev !== undefined ? prev.since : at };
|
|
467
|
+
});
|
|
468
|
+
bump();
|
|
469
|
+
};
|
|
470
|
+
const enterPanelDefault = () => {
|
|
471
|
+
// 只有当前没有更具体的分区时才落 'near'(链上子节点的 enter 先于根)。
|
|
472
|
+
setHoverState(prev => prev ?? { zone: 'near', since: Date.now() });
|
|
473
|
+
bump();
|
|
474
|
+
};
|
|
475
|
+
const leavePanel = () => {
|
|
476
|
+
setHoverState(undefined);
|
|
477
|
+
bump();
|
|
478
|
+
};
|
|
479
|
+
// --- 状态区文案 -----------------------------------------------------------
|
|
480
|
+
const phrase = derived.bubble?.replace(/^\s*[⏵▸]+\s*/u, '');
|
|
481
|
+
const animTitle = (deepyRows !== undefined ? kit?.byKey[animationKey]?.title : undefined) ?? skin.title ?? 'Deepy';
|
|
482
|
+
// --- 气泡(宠物上方;空间不足时让位给宠物本体)---------------------------
|
|
483
|
+
// 裁决:瞬态气泡(通知/Enter 戳,带 until 窗)> 活动自述(派生常驻层)。
|
|
484
|
+
// 活动自述读 runtimeCtx.activity.line——与聊天区 ⏵ 工作行(ActivityLine)
|
|
485
|
+
// 逐字同源;判定条件照 Chat.tsx 的渲染门:working 且 line 非空且
|
|
486
|
+
// phase≠idle。回合结束/面板隐藏时派生层自动消失;瞬态到期后回落。
|
|
487
|
+
// 拖动会话(按住跟手 + 360ms 回弹全程)抑制两层气泡:宠物被拎在半空,
|
|
488
|
+
// 气泡孤零零留在 home 上方既出戏又会被宠物本体遮住(用户实测反馈);
|
|
489
|
+
// 落定后自然恢复(用户实测诉求:要么跟着走要么不显示——选抑制,简单
|
|
490
|
+
// 可靠)。
|
|
491
|
+
const dragHold = dragSessionRef.current !== undefined || flybackRef.current !== undefined;
|
|
492
|
+
const transientBubble = bubbleRef.current !== undefined && bubbleRef.current.until > now && visible && !dragHold ? bubbleRef.current : undefined;
|
|
493
|
+
const activityNarration = visible && channel.working && activity !== undefined
|
|
494
|
+
&& activity.line !== '' && activity.phase !== 'idle' && !dragHold ? activity.line : undefined;
|
|
495
|
+
const bubble = transientBubble !== undefined
|
|
496
|
+
? transientBubble
|
|
497
|
+
: activityNarration !== undefined
|
|
498
|
+
? { text: activityNarration, kind: 'poke', until: Number.POSITIVE_INFINITY }
|
|
499
|
+
: undefined;
|
|
500
|
+
const statusRows = 1 /*paddingTop*/ + 3 + (phrase !== undefined && phrase !== '' ? 1 : 0);
|
|
501
|
+
const bubbleRoom = Math.max(0, height - statusRows - skin.cells.rows);
|
|
502
|
+
const bubbleLines = bubbleRoom >= BUBBLE_MAX_LINES + 2
|
|
503
|
+
? BUBBLE_MAX_LINES
|
|
504
|
+
: bubbleRoom >= 3 ? bubbleRoom - 2 : 0;
|
|
505
|
+
let bubbleNode = null;
|
|
506
|
+
if (bubble !== undefined && bubbleLines > 0 && !compact) {
|
|
507
|
+
const inner = Math.max(4, width - 4);
|
|
508
|
+
const wrapped = wrapText(bubble.text, inner, 'wrap').split('\n');
|
|
509
|
+
const shown = wrapped.length > bubbleLines
|
|
510
|
+
? [...wrapped.slice(0, bubbleLines - 1), truncateWidth(wrapped[bubbleLines - 1] + '…', inner)]
|
|
511
|
+
: wrapped;
|
|
512
|
+
bubbleNode = (_jsx(Box, { flexDirection: "column", flexShrink: 0, alignSelf: "center", borderStyle: "round", paddingX: 1, borderColor: bubble.kind === 'poke' ? 'accent' : BUBBLE_COLOR[bubble.color ?? ''] ?? 'accent', children: shown.map((line, index) => (_jsx(Text, { wrap: "truncate-end", color: BUBBLE_COLOR[bubble.color ?? ''], children: line }, index))) }));
|
|
513
|
+
}
|
|
514
|
+
// 连紧凑形态都摆不下(紧凑阈值体系的地板 = PANEL_MIN_COLUMNS,分栏
|
|
515
|
+
// 几何的列宽下限):不硬塞——宠物本体与紧凑行都不渲染,只留一条居中
|
|
516
|
+
// 标语;对列宽的需求不变(§16.6)。
|
|
517
|
+
if (width < PANEL_MIN_COLUMNS) {
|
|
518
|
+
return (_jsx(Box, { ref: clockRef, flexDirection: "column", flexGrow: 1, overflow: "hidden", alignItems: "center", justifyContent: "center", paddingX: 1, children: _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: "accent", children: '♥ ' }), _jsx(Text, { dimColor: true, children: t('companion-cramped', { name: skin.title ?? 'Deepy' }) })] }) }));
|
|
519
|
+
}
|
|
520
|
+
if (compact) {
|
|
521
|
+
// 窄栏 compact:心情图标 + 气泡/统计,不画皮肤(永不超宽,§16.6)。
|
|
522
|
+
return (_jsx(Box, { ref: clockRef, flexDirection: "column", flexGrow: 1, overflow: "hidden", children: _jsxs(Box, { flexDirection: "column", paddingX: 1, paddingTop: 1, children: [_jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: "accent", children: '♥ ' }), _jsx(Text, { dimColor: true, children: moodLabel }), channel.working && _jsxs(Text, { dimColor: true, children: [' · ', statsText] })] }) }), phrase !== undefined && phrase !== '' && (_jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ['⏵ ', phrase] }) })), _jsx(Box, { height: 1, flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: t('companion-hint') }) })] }) }));
|
|
523
|
+
}
|
|
524
|
+
return (_jsxs(Box, { ref: clockRef, flexDirection: "column", flexGrow: 1, overflow: "hidden", onMouseEnter: enterPanelDefault, onMouseLeave: leavePanel, children: [_jsxs(Box, { flexDirection: "column", flexShrink: 0, paddingX: 1, paddingTop: 1, onMouseEnter: () => enterZone('near'), children: [_jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: MOOD_COLOR[SEMANTIC_MOOD[display.semantic]], children: '● ' }), _jsx(Text, { children: moodLabel }), statsText !== moodLabel && _jsxs(Text, { dimColor: true, children: [' · ', statsText] })] }) }), phrase !== undefined && phrase !== '' && (_jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: ['⏵ ', phrase] }) })), _jsx(Box, { height: 1, flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: t('companion-now-playing', { anim: animTitle }) }) }), _jsx(Box, { height: 1, flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: t('companion-hint') }) })] }), _jsx(Box, { flexGrow: 1, flexShrink: 1, minHeight: 0, onMouseEnter: () => enterZone('near') }), bubbleNode, _jsxs(Box, { flexDirection: "row", flexShrink: 0, height: petRows, children: [_jsx(Box, { width: petLeft, flexShrink: 0, onMouseEnter: () => enterZone('left') }), _jsx(Box, { width: petColumns, height: petRows, marginTop: -petRise, flexShrink: 0, flexDirection: "column", alignItems: "center", onClick: onPetClick, onDragStart: onDragStart, onDragMove: onDragMove, onDragEnd: onDragEnd, onMouseEnter: () => enterZone('pet'), children: deepyRows !== undefined
|
|
525
|
+
? deepyRows.map((row, index) => _jsx(Text, { wrap: "truncate-end", children: row }, index))
|
|
526
|
+
: skin.render({ pose: poseStep.pose, moodSince: animSince, now, width: petColumns, animationSemantic: animationKey }) }), _jsx(Box, { width: Math.max(0, width - petColumns - petLeft), flexShrink: 0, onMouseEnter: () => enterZone('right') })] })] }));
|
|
527
|
+
}
|
|
528
|
+
export const COMPANION_SKIN_DEFAULT = DeepySkin.id;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 启动页吉祥物(LogoV2 艺术槽,2026-10 复用轮)。
|
|
3
|
+
*
|
|
4
|
+
* 吉祥物跟随 companion.skin:deepy → 字母格动画;whaleGirl → 鲸娘动画
|
|
5
|
+
* (经 WhaleGirlSkin 内部的图像协议自适应:kitty/sixel 走 img/ 帧管线,
|
|
6
|
+
* 无协议回退字母格帧包——首帧字母格同步可画,图像异步解码完成后替换,
|
|
7
|
+
* 绝不让启动帧等 IO)。whale 皮肤不进本组件(LogoV2 维持原分层鲸路径)。
|
|
8
|
+
*
|
|
9
|
+
* 动画/互动语义与侧栏宠物同源(零复制),但按 2026-10 用户拍板收窄:
|
|
10
|
+
* 启动页是瞬时门面——**不做空闲轮换**,稳态恒播单一 idle 动画(循环);
|
|
11
|
+
* 点击 = poke(左/右半判定,播 poke-left/right 头段;鲸娘在 poke 后接一段
|
|
12
|
+
* smile-hearts 爱心——同面板「亲昵互动」语义,deepy 帧包无爱心键故只 poke);
|
|
13
|
+
* 连点 = 900ms 内 ≥3 次触发 tickle(复用 mood.ts 的 TICKLE_WINDOW_MS/
|
|
14
|
+
* TICKLE_MIN_CLICKS 判定);播完自然回稳态 idle。不做拖拽。
|
|
15
|
+
* active=false(第一个任务后冻结,照鲸鱼的 whaleFrozen 契约)或卸载后零
|
|
16
|
+
* 时钟:定格 idle 帧 0,interval 清空。
|
|
17
|
+
*
|
|
18
|
+
* 欢迎语/求星标语不在本组件——按 2026-10 用户拍板保持原「艺术下方居中」
|
|
19
|
+
* 渲染路径(LogoV2 底部块,welcomePad 缩进)。
|
|
20
|
+
*/
|
|
21
|
+
import React from 'react';
|
|
22
|
+
export type SplashMascotSkin = 'deepy' | 'whaleGirl';
|
|
23
|
+
/** 读 companion.skin(LogoV2 的测试缝 prop 优先);非吉祥物皮肤返回
|
|
24
|
+
* undefined(LogoV2 走原鲸鱼/女仆娘路径,零改动)。 */
|
|
25
|
+
export declare function useSplashMascotSkin(pinned?: string): SplashMascotSkin | undefined;
|
|
26
|
+
/** 启动页吉祥物本体:按 skin 渲染动画,点击交互(poke/连点)在内层盒。 */
|
|
27
|
+
export declare function SplashMascot({ skin, active }: {
|
|
28
|
+
readonly skin: SplashMascotSkin;
|
|
29
|
+
/** 动画许可:false(冻结/落地页 whaleIdle=false)时定格 idle 帧 0、零时钟。 */
|
|
30
|
+
readonly active: boolean;
|
|
31
|
+
}): React.ReactNode;
|
|
32
|
+
//# sourceMappingURL=SplashMascot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplashMascot.d.ts","sourceRoot":"","sources":["../../../../../src/components/sidePanel/companion/SplashMascot.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAiBzB,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAA;AAEpD;wCACwC;AACxC,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAIjF;AAGD,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC7C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CACzB,GAAG,KAAK,CAAC,SAAS,CAqElB"}
|