@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
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { Box, Text } from '../ui.js';
|
|
3
|
+
import { Box, Text, useAnimationFrame } from '../ui.js';
|
|
4
|
+
import wrapText from '../ink/wrap-text.js';
|
|
4
5
|
import { t } from '../i18n.js';
|
|
5
6
|
import { primaryComboString } from '../utils/keymap.js';
|
|
6
7
|
/** Maximum todo rows shown before the overflow line. */
|
|
@@ -82,16 +83,22 @@ function BranchPrefix({ last }) {
|
|
|
82
83
|
* id first appears, frozen on completion) — deliberately not derived from
|
|
83
84
|
* session-event timestamps.
|
|
84
85
|
*/
|
|
85
|
-
export function GoalTodoPanel({ channel, collapsed = false, onToggle, }) {
|
|
86
|
+
export function GoalTodoPanel({ channel, collapsed = false, onToggle, variant = 'default', visible = true, maxTodos, wrapWidth, }) {
|
|
86
87
|
const goal = channel.goal;
|
|
87
88
|
const allTodos = channel.todos ?? [];
|
|
88
89
|
const doneCount = allTodos.filter(todo => todo.status === 'completed').length;
|
|
89
90
|
// Completed rows are useful progress while a turn is running, but become
|
|
90
91
|
// stale footer noise once the agent is idle. Keep unfinished work visible;
|
|
91
92
|
// the header count carries the done summary either way.
|
|
92
|
-
|
|
93
|
+
// panel 形态不自动隐藏完成行:侧栏折叠头常驻显示 ✓ done/total,用户
|
|
94
|
+
// 「点开」是显式展开动作——idle 时把完成行过滤光就是「明明有 9 个、
|
|
95
|
+
// 点开一条都没有」(完成行以 dim 呈现,进度语义不丢)。default 形态
|
|
96
|
+
// (chat 页底部 chrome)保留原 auto-fold。
|
|
97
|
+
const todos = variant === 'panel'
|
|
93
98
|
? allTodos
|
|
94
|
-
:
|
|
99
|
+
: channel.working
|
|
100
|
+
? allTodos
|
|
101
|
+
: allTodos.filter(todo => todo.status !== 'completed');
|
|
95
102
|
// Local goal timer: remember when this goal id first rendered. Written in
|
|
96
103
|
// render (idempotent lazy ref init) so a fresh mount with a live goal
|
|
97
104
|
// starts counting immediately.
|
|
@@ -102,30 +109,64 @@ export function GoalTodoPanel({ channel, collapsed = false, onToggle, }) {
|
|
|
102
109
|
const [now, setNow] = React.useState(() => Date.now());
|
|
103
110
|
// Hover tint for the clickable todo fold header (mouse affordance).
|
|
104
111
|
const [headerHovered, setHeaderHovered] = React.useState(false);
|
|
112
|
+
const goalOpen = goal !== undefined && goal.phase !== 'complete';
|
|
113
|
+
// Panel 形态:计时挂在共享动画时钟上(ClockProvider 单一定时源,
|
|
114
|
+
// 终端失焦自动降频),visible=false 时传 null——零订阅。时钟只负责
|
|
115
|
+
// 驱动重渲染;读数仍按墙钟(Date.now())算,隐藏期间计时冻结的只是
|
|
116
|
+
// 显示,重新打开立刻显示真实经过时间(mountPolicy=enabled 下面板
|
|
117
|
+
// 保持挂载,startRef 不会重置)。
|
|
118
|
+
const [clockRef] = useAnimationFrame(variant === 'panel' && goalOpen && visible ? 1000 : null);
|
|
105
119
|
React.useEffect(() => {
|
|
120
|
+
// default 形态保留原来的本地 1s 计时(底部 chrome 的既有行为)。
|
|
121
|
+
if (variant === 'panel')
|
|
122
|
+
return;
|
|
106
123
|
// Tick only while the goal is open; a complete goal freezes the last
|
|
107
124
|
// elapsed reading instead of counting past the finish line.
|
|
108
125
|
if (goal === undefined || goal.phase === 'complete')
|
|
109
126
|
return;
|
|
110
127
|
const timer = setInterval(() => setNow(Date.now()), 1000);
|
|
111
128
|
return () => clearInterval(timer);
|
|
112
|
-
}, [goal]);
|
|
129
|
+
}, [goal, variant]);
|
|
113
130
|
const elapsed = goal !== undefined && startRef.current !== undefined
|
|
114
|
-
? formatDuration(now - startRef.current.at)
|
|
131
|
+
? formatDuration((variant === 'panel' ? Date.now() : now) - startRef.current.at)
|
|
115
132
|
: undefined;
|
|
116
133
|
// All-completed idle snapshot with no goal: nothing left to narrate —
|
|
117
134
|
// the whole panel folds away (historical behavior).
|
|
118
135
|
const anyUnfinished = allTodos.some(todo => todo.status !== 'completed');
|
|
119
|
-
const showTodoSection = allTodos.length > 0 &&
|
|
136
|
+
const showTodoSection = allTodos.length > 0 &&
|
|
137
|
+
(channel.working || anyUnfinished || goal !== undefined || variant === 'panel');
|
|
120
138
|
if (goal === undefined && !showTodoSection)
|
|
121
139
|
return null;
|
|
122
|
-
const
|
|
123
|
-
|
|
140
|
+
const budget = maxTodos ?? MAX_TODOS;
|
|
141
|
+
// 折行形态(panel):每条 todo 占 1~2 行,预算按「行」折算——放不下
|
|
142
|
+
// 的整条让位给「…N more」,不撑破面板高度(§16.6 盒高恒定)。cap:
|
|
143
|
+
// 折出 >2 行时保留第一行、其余拼回一行截断加省略号(wrapText truncate)。
|
|
144
|
+
// 单行形态(default):与原 slice 语义逐字节一致。
|
|
145
|
+
const display = [];
|
|
146
|
+
if (wrapWidth !== undefined && wrapWidth > 4) {
|
|
147
|
+
let used = 0;
|
|
148
|
+
for (const todo of todos) {
|
|
149
|
+
const wrapped = wrapText(todo.content, wrapWidth, 'wrap').split('\n');
|
|
150
|
+
const lines = wrapped.length <= 2
|
|
151
|
+
? wrapped
|
|
152
|
+
: [wrapped[0], wrapText(wrapped.slice(1).join(''), wrapWidth, 'truncate')];
|
|
153
|
+
if (display.length > 0 && used + lines.length > budget)
|
|
154
|
+
break;
|
|
155
|
+
display.push({ todo, lines });
|
|
156
|
+
used += lines.length;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
for (const todo of todos.slice(0, budget))
|
|
161
|
+
display.push({ todo, lines: [todo.content] });
|
|
162
|
+
}
|
|
163
|
+
const visibleTodos = display;
|
|
164
|
+
const hidden = todos.length - display.length;
|
|
124
165
|
// Collapsed preview: the live task when one runs, else the next open row.
|
|
125
166
|
const preview = allTodos.find(todo => todo.status === 'in_progress')
|
|
126
167
|
?? allTodos.find(todo => todo.status !== 'completed');
|
|
127
|
-
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, paddingRight: 2, paddingTop: 1, children: [goal !== undefined && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: "100%", height: 1, children: [_jsx(Text, { color: "suggestion", children: "\uD83C\uDFAF " }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { bold: true, wrap: "truncate", children: goal.objective }) }), _jsx(Box, { flexShrink: 0, marginLeft: 1, children: _jsx(PhaseBadge, { phase: goal.phase, roundsStarted: goal.roundsStarted, maxGoalRounds: goal.maxGoalRounds, elapsed: elapsed }) })] }), goal.phase === 'blocked' && goal.blockedReason !== undefined && (_jsxs(Box, { flexDirection: "row", marginTop: 1, height: 1, children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { color: "error", wrap: "truncate", children: goal.blockedReason.message })] }))] })), showTodoSection && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", height: 1, onClick: onToggle, onMouseEnter: () => setHeaderHovered(true), onMouseLeave: () => setHeaderHovered(false), backgroundColor: headerHovered ? 'userMessageBackgroundHover' : undefined, children: [_jsxs(Text, { dimColor: true, children: [collapsed ? '▸' : '▾', " "] }), _jsxs(Text, { dimColor: true, children: ["\u2713 ", doneCount, "/", allTodos.length] }), collapsed && preview !== undefined && (_jsx(Box, { flexGrow: 1, flexShrink: 1, marginLeft: 1, children: preview.status === 'in_progress' ? (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: "suggestion", children: "\u25CF " }), preview.content] })) : (_jsxs(Text, { wrap: "truncate", dimColor: true, children: ["\u25CB ", preview.content] })) }))] }), !collapsed && (_jsxs(Box, { flexDirection: "column", children: [
|
|
128
|
-
const last = index ===
|
|
129
|
-
return (_jsxs(Box, { flexDirection: "row", height: 1, children: [_jsx(BranchPrefix, { last: last }), _jsx(TodoGlyph, { status: todo.status }), _jsx(Text, { wrap: "truncate", dimColor: todo.status === 'completed', children:
|
|
130
|
-
}), hidden > 0 && (_jsxs(Box, { flexDirection: "row", height: 1, children: [_jsx(BranchPrefix, { last: true }), _jsxs(Text, { dimColor: true, children: ["\u2026 ", hidden, " more"] })] })), _jsxs(Text, { dimColor: true, children: [" ", t('goal-todo-fold-hint', { key: primaryComboString('todoFold') })] })] }))] }))] }));
|
|
168
|
+
return (_jsxs(Box, { ref: variant === 'panel' ? clockRef : undefined, flexDirection: "column", paddingLeft: variant === 'panel' ? 1 : 2, paddingRight: variant === 'panel' ? 1 : 2, paddingTop: 1, children: [goal !== undefined && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: "100%", height: 1, children: [_jsx(Text, { color: "suggestion", children: "\uD83C\uDFAF " }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { bold: true, wrap: "truncate", children: goal.objective }) }), _jsx(Box, { flexShrink: 0, marginLeft: 1, children: _jsx(PhaseBadge, { phase: goal.phase, roundsStarted: goal.roundsStarted, maxGoalRounds: goal.maxGoalRounds, elapsed: elapsed }) })] }), goal.phase === 'blocked' && goal.blockedReason !== undefined && (_jsxs(Box, { flexDirection: "row", marginTop: 1, height: 1, children: [_jsx(Text, { dimColor: true, children: "\u2502 " }), _jsx(Text, { color: "error", wrap: "truncate", children: goal.blockedReason.message })] }))] })), showTodoSection && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", height: 1, onClick: onToggle, onMouseEnter: () => setHeaderHovered(true), onMouseLeave: () => setHeaderHovered(false), backgroundColor: headerHovered ? 'userMessageBackgroundHover' : undefined, children: [_jsxs(Text, { dimColor: true, children: [collapsed ? '▸' : '▾', " "] }), _jsxs(Text, { dimColor: true, children: ["\u2713 ", doneCount, "/", allTodos.length] }), collapsed && preview !== undefined && (_jsx(Box, { flexGrow: 1, flexShrink: 1, marginLeft: 1, children: preview.status === 'in_progress' ? (_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: "suggestion", children: "\u25CF " }), preview.content] })) : (_jsxs(Text, { wrap: "truncate", dimColor: true, children: ["\u25CB ", preview.content] })) }))] }), !collapsed && (_jsxs(Box, { flexDirection: "column", children: [visibleTodos.map((item, index) => {
|
|
169
|
+
const last = index === visibleTodos.length - 1 && hidden === 0;
|
|
170
|
+
return item.lines.map((line, li) => (_jsxs(Box, { flexDirection: "row", height: 1, children: [li === 0 ? (_jsxs(_Fragment, { children: [_jsx(BranchPrefix, { last: last }), _jsx(TodoGlyph, { status: item.todo.status })] })) : (_jsx(Text, { dimColor: true, children: last ? ' ' : '\u2502 ' })), _jsx(Text, { wrap: "truncate", dimColor: item.todo.status === 'completed', children: line })] }, li)));
|
|
171
|
+
}), hidden > 0 && (_jsxs(Box, { flexDirection: "row", height: 1, children: [_jsx(BranchPrefix, { last: true }), _jsxs(Text, { dimColor: true, children: ["\u2026 ", hidden, " more"] })] })), variant !== 'panel' && (_jsxs(Text, { dimColor: true, children: [" ", t('goal-todo-fold-hint', { key: primaryComboString('todoFold') })] }))] }))] }))] }));
|
|
131
172
|
}
|
|
@@ -1,10 +1,50 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { type BackgroundJobState } from '../dsh-adapter/jobs.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pure width→column allocation for the roster row (kept side-effect free so
|
|
5
|
+
* regressions can assert the table directly). There is no pid column in this
|
|
6
|
+
* roster. Side-panel tiers: the label always truncates and every column
|
|
7
|
+
* leaves it ≥8 cells — progress drops first, then duration, then the
|
|
8
|
+
* id/status columns narrow — so a 38-col panel never folds a command into
|
|
9
|
+
* per-word lines. The full-screen form keeps its wrap-the-label contract.
|
|
10
|
+
*/
|
|
11
|
+
export interface JobsRowColumns {
|
|
12
|
+
readonly showProgress: boolean;
|
|
13
|
+
readonly showDuration: boolean;
|
|
14
|
+
readonly showStatus: boolean;
|
|
15
|
+
readonly idWidth: number;
|
|
16
|
+
readonly statusWidth: number;
|
|
17
|
+
/** 整屏形态 label 折行(长命令可读全文);panel 形态 truncate-end
|
|
18
|
+
* (行高恒定,全文由焦点行的 detail 块承担)。 */
|
|
19
|
+
readonly labelWrap: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function resolveJobsRowColumns(width: number): JobsRowColumns;
|
|
3
22
|
export interface JobsPanelProps {
|
|
4
23
|
jobs: readonly BackgroundJobState[];
|
|
5
|
-
|
|
24
|
+
/** Focus this job on open (a transcript card click opens the panel AT its
|
|
25
|
+
* job); absent or unknown ids fall back to the roster head. */
|
|
26
|
+
initialFocusId?: string;
|
|
27
|
+
/** Panel-variant focus lane: same intent as initialFocusId but re-fireable
|
|
28
|
+
* (nonce bumps on every request, so clicking the same card twice refocuses).
|
|
29
|
+
* Ignored by the default (full-screen) variant. */
|
|
30
|
+
focusRequest?: {
|
|
31
|
+
readonly id: string | null;
|
|
32
|
+
readonly nonce: number;
|
|
33
|
+
} | null;
|
|
34
|
+
onClose?: () => void;
|
|
6
35
|
/** Kill the focused live job (`job_kill` with the session's authority). */
|
|
7
36
|
onKill: (id: string) => void;
|
|
37
|
+
/** Send to Chat(§6.7):把焦点任务作为附加上下文送进草稿(chip 出现在
|
|
38
|
+
* 输入框上方,随下一次提交附给模型)。仅 panel 形态;未接时不提供 's'。 */
|
|
39
|
+
onSendToChat?: (job: BackgroundJobState) => void;
|
|
40
|
+
/** 'panel' mounts inside the side-panel host (no outer padding, host-owned
|
|
41
|
+
* chrome, keyboard via usePanelInput). Default keeps the full-screen
|
|
42
|
+
* behavior byte-for-byte. */
|
|
43
|
+
variant?: 'default' | 'panel';
|
|
44
|
+
/** Panel variant: the host reports focus/visibility; inactive panels keep
|
|
45
|
+
* their state but receive no keys and pause the clock. */
|
|
46
|
+
focused?: boolean;
|
|
47
|
+
visible?: boolean;
|
|
8
48
|
}
|
|
9
49
|
/**
|
|
10
50
|
* `/jobs` overlay panel — every background job of the current session with
|
|
@@ -13,5 +53,5 @@ export interface JobsPanelProps {
|
|
|
13
53
|
* row expands a detail block (full label, start/finish times, mirrored
|
|
14
54
|
* output tail). The panel is the deep view behind the transcript job cards.
|
|
15
55
|
*/
|
|
16
|
-
export declare function JobsPanel({ jobs, onClose, onKill }: JobsPanelProps): React.ReactNode;
|
|
56
|
+
export declare function JobsPanel({ jobs, onClose, onKill, onSendToChat, initialFocusId, focusRequest, variant, focused, visible }: JobsPanelProps): React.ReactNode;
|
|
17
57
|
//# sourceMappingURL=JobsPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JobsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/JobsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAqB,KAAK,kBAAkB,EAA4B,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"JobsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/JobsPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAqB,KAAK,kBAAkB,EAA4B,MAAM,wBAAwB,CAAA;AAY7G;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B;qCACiC;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAKnE;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAA;IACnC;oEACgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;wDAEoD;IACpD,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAC5E,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,2EAA2E;IAC3E,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B;mDAC+C;IAC/C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAChD;;kCAE8B;IAC9B,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC7B;+DAC2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAoND;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,OAAmB,EAAE,OAAc,EAAE,OAAc,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CA6QrL"}
|
|
@@ -1,54 +1,90 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { Box, Text, useInput, ScrollBox, useTerminalSize, useAnimationFrame } from '../ui.js';
|
|
4
4
|
import { formatJobDuration } from '../dsh-adapter/jobs.js';
|
|
5
|
+
import { JobProgress } from './Chat/JobCard.js';
|
|
6
|
+
import { Markdown } from './Markdown.js';
|
|
5
7
|
import { t } from '../i18n.js';
|
|
6
8
|
import { Divider } from './design-system/Divider.js';
|
|
7
9
|
import { ExitButton } from './SubagentDashboard.js';
|
|
8
10
|
import { isPlainReturnInput } from '../utils/modifiers.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
+
import { isMinimalUiMode } from '../minimalUiMode.js';
|
|
12
|
+
import { usePanelInput } from './sidePanel/usePanelInput.js';
|
|
13
|
+
export function resolveJobsRowColumns(width) {
|
|
14
|
+
if (width >= 52)
|
|
15
|
+
return { showProgress: true, showDuration: true, showStatus: true, idWidth: 9, statusWidth: 9, labelWrap: false };
|
|
16
|
+
if (width >= 44)
|
|
17
|
+
return { showProgress: false, showDuration: true, showStatus: true, idWidth: 9, statusWidth: 9, labelWrap: false };
|
|
18
|
+
if (width >= 34)
|
|
19
|
+
return { showProgress: false, showDuration: true, showStatus: true, idWidth: 8, statusWidth: 6, labelWrap: false };
|
|
20
|
+
return { showProgress: false, showDuration: false, showStatus: true, idWidth: 7, statusWidth: 6, labelWrap: false };
|
|
21
|
+
}
|
|
11
22
|
function statusInfo(status) {
|
|
12
|
-
const
|
|
23
|
+
const minimalUi = isMinimalUiMode();
|
|
13
24
|
switch (status) {
|
|
14
25
|
case 'completed':
|
|
15
|
-
return { glyph:
|
|
26
|
+
return { glyph: minimalUi ? '✓' : '●', label: t('jobs-status-completed'), color: minimalUi ? undefined : 'success' };
|
|
16
27
|
case 'failed':
|
|
17
|
-
return { glyph:
|
|
28
|
+
return { glyph: minimalUi ? '×' : '●', label: t('jobs-status-failed'), color: minimalUi ? undefined : 'error' };
|
|
18
29
|
case 'killed':
|
|
19
|
-
return { glyph:
|
|
30
|
+
return { glyph: minimalUi ? '×' : '●', label: t('jobs-status-killed'), color: minimalUi ? undefined : 'error' };
|
|
20
31
|
case 'stopping':
|
|
21
|
-
return { glyph:
|
|
32
|
+
return { glyph: minimalUi ? '·' : '●', label: t('jobs-status-stopping'), color: minimalUi ? undefined : 'warning' };
|
|
22
33
|
default:
|
|
23
|
-
return { glyph:
|
|
34
|
+
return { glyph: minimalUi ? '·' : '●', label: t('jobs-status-running'), color: minimalUi ? undefined : 'warning' };
|
|
24
35
|
}
|
|
25
36
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
function isTerminalStatus(status) {
|
|
38
|
+
return status === 'completed' || status === 'killed' || status === 'failed';
|
|
39
|
+
}
|
|
40
|
+
/** 12.3 KB / 1.4 MB — byte counter for the detail block. */
|
|
41
|
+
function formatBytes(bytes) {
|
|
42
|
+
if (bytes < 1024)
|
|
43
|
+
return `${bytes} B`;
|
|
44
|
+
if (bytes < 1024 * 1024)
|
|
45
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
46
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
47
|
+
}
|
|
48
|
+
function renderOutputRuns(job) {
|
|
49
|
+
const runs = [];
|
|
50
|
+
let markdown = [];
|
|
51
|
+
const flush = () => {
|
|
52
|
+
if (markdown.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
runs.push({ kind: 'markdown', text: markdown.join('\n') });
|
|
55
|
+
markdown = [];
|
|
56
|
+
};
|
|
57
|
+
for (const line of job.outputLines ?? []) {
|
|
58
|
+
if (line.gapBefore === true) {
|
|
59
|
+
flush();
|
|
60
|
+
runs.push({ kind: 'gap' });
|
|
61
|
+
}
|
|
62
|
+
if (line.channel === 'stderr') {
|
|
63
|
+
flush();
|
|
64
|
+
runs.push({ kind: 'stderr', text: line.text });
|
|
65
|
+
}
|
|
66
|
+
else if (line.channel === 'log') {
|
|
67
|
+
flush();
|
|
68
|
+
runs.push({ kind: 'log', text: line.text });
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
markdown.push(line.text);
|
|
72
|
+
}
|
|
40
73
|
}
|
|
41
|
-
|
|
74
|
+
flush();
|
|
75
|
+
return runs;
|
|
42
76
|
}
|
|
43
|
-
function JobRowLine({ job, focused }) {
|
|
44
|
-
const { columns } = useTerminalSize();
|
|
77
|
+
function JobRowLine({ job, focused, armed, columns, onFocus }) {
|
|
45
78
|
const info = statusInfo(job.status);
|
|
46
79
|
const duration = formatJobDuration(job);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
80
|
+
const live = !isTerminalStatus(job.status);
|
|
81
|
+
const progress = live && job.progress !== undefined && job.progress !== '' ? job.progress : undefined;
|
|
82
|
+
return (_jsxs(Box, { flexDirection: "column", onClick: onFocus, children: [_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsxs(Box, { width: 2, flexShrink: 0, children: [_jsx(Text, { color: focused ? 'accent' : undefined, children: focused ? '❯' : ' ' }), _jsx(Text, { color: info.color, children: info.glyph })] }), _jsx(Box, { width: columns.idWidth, flexShrink: 0, children: _jsx(Text, { bold: focused, color: focused ? 'accent' : undefined, wrap: "truncate-end", children: job.id }) }), _jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { bold: focused, wrap: columns.labelWrap ? undefined : 'truncate-end', children: job.label }) }), columns.showProgress && (_jsx(Box, { width: 11, flexShrink: 0, justifyContent: "flex-end", children: progress !== undefined ? _jsx(JobProgress, { progress: progress }) : _jsx(Text, { children: " " }) })), armed === true ? (_jsx(Text, { bold: true, color: "error", wrap: "truncate-end", children: t('jobs-kill-armed') })) : (_jsxs(_Fragment, { children: [columns.showDuration && (_jsx(Box, { width: 6, flexShrink: 0, justifyContent: "flex-end", children: _jsx(Text, { dimColor: true, children: duration }) })), columns.showStatus && (_jsx(Box, { width: columns.statusWidth, flexShrink: 0, justifyContent: "flex-end", children: _jsx(Text, { color: info.color, wrap: "truncate-end", children: info.label }) }))] }))] }), focused && (_jsxs(Box, { flexDirection: "column", paddingLeft: 4, children: [job.command !== undefined && job.command !== '' && job.command !== job.label && (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Box, { width: 7, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: t('jobs-panel-command') }) }), _jsx(Text, { dimColor: true, children: job.command })] })), _jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Box, { width: 7, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: t('jobs-panel-started') }) }), _jsx(Text, { dimColor: true, children: timeOf(job.startedAt)
|
|
83
|
+
+ (job.finishedAt !== undefined ? ` · ${t('jobs-panel-finished')} ${timeOf(job.finishedAt)}` : '')
|
|
84
|
+
+ (job.lastOutputAt !== undefined ? ` · ${t('jobs-panel-output-at')} ${timeOf(job.lastOutputAt)}` : '') })] }), (job.outputTotalBytes !== undefined || job.outputDropped === true) && (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Box, { width: 7, flexShrink: 0, children: _jsx(Text, { dimColor: true, children: t('jobs-panel-output') }) }), _jsx(Text, { dimColor: true, children: (job.outputTotalBytes !== undefined ? formatBytes(job.outputTotalBytes) : '')
|
|
85
|
+
+ (job.outputDropped === true
|
|
86
|
+
? `${job.outputTotalBytes !== undefined ? ' · ' : ''}${t('jobs-output-dropped')}`
|
|
87
|
+
: '') })] })), job.spillPaths !== undefined && job.spillPaths.length > 0 && (_jsx(Box, { paddingLeft: 8, children: _jsx(Text, { dimColor: true, children: t('jobs-output-spill', { path: job.spillPaths[job.spillPaths.length - 1] ?? '' }) }) })), (job.outputLines?.length ?? 0) > 0 ? (_jsx(Box, { flexDirection: "column", marginTop: 1, children: renderOutputRuns(job).map((run, runIndex) => (_jsxs(Box, { flexDirection: "column", marginTop: runIndex === 0 ? 0 : 1, children: [run.kind === 'gap' && (_jsx(Text, { dimColor: true, italic: true, children: t('jobs-output-gap') })), run.kind === 'markdown' && (_jsx(Markdown, { cacheTokens: true, children: run.text })), run.kind === 'stderr' && (_jsx(Text, { color: "error", children: `│ ${run.text}` })), run.kind === 'log' && (_jsx(Text, { dimColor: true, italic: true, children: `│ ${run.text}` }))] }, `${job.id}-run-${runIndex}`))) })) : (_jsx(Text, { dimColor: true, children: t('jobs-panel-no-output-yet') }))] }))] }));
|
|
52
88
|
}
|
|
53
89
|
/** HH:MM:SS wall-clock of an epoch ms value (locale-independent). */
|
|
54
90
|
function timeOf(ms) {
|
|
@@ -63,27 +99,99 @@ function timeOf(ms) {
|
|
|
63
99
|
* row expands a detail block (full label, start/finish times, mirrored
|
|
64
100
|
* output tail). The panel is the deep view behind the transcript job cards.
|
|
65
101
|
*/
|
|
66
|
-
export function JobsPanel({ jobs, onClose, onKill }) {
|
|
67
|
-
const
|
|
102
|
+
export function JobsPanel({ jobs, onClose, onKill, onSendToChat, initialFocusId, focusRequest, variant = 'default', focused = true, visible = true }) {
|
|
103
|
+
const panelMode = variant === 'panel';
|
|
104
|
+
const [focusIndex, setFocusIndex] = React.useState(() => {
|
|
105
|
+
if (initialFocusId === undefined)
|
|
106
|
+
return 0;
|
|
107
|
+
const found = jobs.findIndex(job => job.id === initialFocusId);
|
|
108
|
+
return found >= 0 ? found : 0;
|
|
109
|
+
});
|
|
110
|
+
// A card click may race the roster: the id can land after the panel opened
|
|
111
|
+
// (late kernel push), so re-apply once when it first becomes findable.
|
|
112
|
+
const initialFocusApplied = React.useRef(initialFocusId === undefined);
|
|
113
|
+
React.useEffect(() => {
|
|
114
|
+
if (initialFocusApplied.current || initialFocusId === undefined)
|
|
115
|
+
return;
|
|
116
|
+
const found = jobs.findIndex(job => job.id === initialFocusId);
|
|
117
|
+
if (found < 0)
|
|
118
|
+
return;
|
|
119
|
+
initialFocusApplied.current = true;
|
|
120
|
+
setFocusIndex(found);
|
|
121
|
+
scrollRef.current?.scrollTo(Math.max(0, found - 2));
|
|
122
|
+
}, [jobs, initialFocusId]);
|
|
123
|
+
// Panel-variant focus lane: the same "open AT this job" intent, but each
|
|
124
|
+
// request carries a nonce so re-clicking the same card refocuses. The
|
|
125
|
+
// nonce is only consumed once the id resolves against the roster (the
|
|
126
|
+
// late-kernel-push race from initialFocusId applies here too).
|
|
127
|
+
const focusRequestNonceRef = React.useRef(-1);
|
|
128
|
+
React.useEffect(() => {
|
|
129
|
+
if (panelMode === false || focusRequest === undefined || focusRequest === null)
|
|
130
|
+
return;
|
|
131
|
+
if (focusRequestNonceRef.current === focusRequest.nonce)
|
|
132
|
+
return;
|
|
133
|
+
if (focusRequest.id === null) {
|
|
134
|
+
focusRequestNonceRef.current = focusRequest.nonce;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const found = jobs.findIndex(job => job.id === focusRequest.id);
|
|
138
|
+
if (found < 0)
|
|
139
|
+
return;
|
|
140
|
+
focusRequestNonceRef.current = focusRequest.nonce;
|
|
141
|
+
initialFocusApplied.current = true;
|
|
142
|
+
setFocusIndex(found);
|
|
143
|
+
scrollRef.current?.scrollTo(Math.max(0, found - 2));
|
|
144
|
+
}, [jobs, focusRequest, panelMode]);
|
|
145
|
+
/** Armed kill: first `k` primes, second within the window confirms; any
|
|
146
|
+
* navigation or other key disarms. Mirrors the web two-press stop. */
|
|
147
|
+
const [killArmed, setKillArmed] = React.useState(undefined);
|
|
68
148
|
const scrollRef = React.useRef(null);
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
const
|
|
149
|
+
// PanelHost overrides the terminal-size context to the panel's own
|
|
150
|
+
// columns/rows, so the same hook reports the panel geometry in panel mode.
|
|
151
|
+
const { columns: terminalColumns, rows } = useTerminalSize();
|
|
152
|
+
// 1s tick keeps live durations counting while the panel is open (a hidden
|
|
153
|
+
// panel variant suspends the clock — zero subscriptions when invisible).
|
|
154
|
+
const [clockRef] = useAnimationFrame(panelMode ? (visible ? 1000 : null) : 1000);
|
|
155
|
+
// Bring an initial deep focus into view on mount (rows are ~1 line each;
|
|
156
|
+
// two rows of headroom above reads better than pinning to the top edge).
|
|
157
|
+
React.useEffect(() => {
|
|
158
|
+
if (initialFocusId === undefined || initialFocusApplied.current === false)
|
|
159
|
+
return;
|
|
160
|
+
if (initialFocusId !== undefined && jobs.findIndex(job => job.id === initialFocusId) > 2) {
|
|
161
|
+
scrollRef.current?.scrollTo(Math.max(0, jobs.findIndex(job => job.id === initialFocusId) - 2));
|
|
162
|
+
}
|
|
163
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- mount-only scroll placement
|
|
164
|
+
}, []);
|
|
72
165
|
const focus = Math.min(focusIndex, Math.max(0, jobs.length - 1));
|
|
166
|
+
// The armed confirmation decays after 4s so a stray later `k` never kills.
|
|
167
|
+
React.useEffect(() => {
|
|
168
|
+
if (killArmed === undefined)
|
|
169
|
+
return;
|
|
170
|
+
const timer = setTimeout(() => setKillArmed(undefined), 4000);
|
|
171
|
+
return () => clearTimeout(timer);
|
|
172
|
+
}, [killArmed]);
|
|
173
|
+
// Full-screen form: byte-identical to the pre-panel behavior (the only
|
|
174
|
+
// delta is isActive, which is always true in default mode). In panel mode
|
|
175
|
+
// this stays registered-but-inactive so the hook order never changes; the
|
|
176
|
+
// host dispatcher (usePanelInput) owns the keys instead.
|
|
73
177
|
useInput((input, key, event) => {
|
|
178
|
+
if (panelMode)
|
|
179
|
+
return;
|
|
74
180
|
if (key.escape || (key.ctrl && input === 'c')) {
|
|
75
181
|
event.stopImmediatePropagation();
|
|
76
|
-
onClose();
|
|
182
|
+
onClose?.();
|
|
77
183
|
return;
|
|
78
184
|
}
|
|
79
185
|
if (key.upArrow) {
|
|
80
186
|
event.stopImmediatePropagation();
|
|
187
|
+
setKillArmed(undefined);
|
|
81
188
|
setFocusIndex(i => Math.max(0, i - 1));
|
|
82
189
|
scrollRef.current?.scrollBy(-1);
|
|
83
190
|
return;
|
|
84
191
|
}
|
|
85
192
|
if (key.downArrow) {
|
|
86
193
|
event.stopImmediatePropagation();
|
|
194
|
+
setKillArmed(undefined);
|
|
87
195
|
setFocusIndex(i => Math.min(jobs.length - 1, i + 1));
|
|
88
196
|
scrollRef.current?.scrollBy(1);
|
|
89
197
|
return;
|
|
@@ -92,7 +200,13 @@ export function JobsPanel({ jobs, onClose, onKill }) {
|
|
|
92
200
|
const selected = jobs[focus];
|
|
93
201
|
if (selected !== undefined && (selected.status === 'running' || selected.status === 'stopping')) {
|
|
94
202
|
event.stopImmediatePropagation();
|
|
95
|
-
|
|
203
|
+
if (killArmed === selected.id) {
|
|
204
|
+
setKillArmed(undefined);
|
|
205
|
+
onKill(selected.id);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
setKillArmed(selected.id);
|
|
209
|
+
}
|
|
96
210
|
}
|
|
97
211
|
return;
|
|
98
212
|
}
|
|
@@ -103,9 +217,75 @@ export function JobsPanel({ jobs, onClose, onKill }) {
|
|
|
103
217
|
return;
|
|
104
218
|
}
|
|
105
219
|
event.stopImmediatePropagation();
|
|
106
|
-
});
|
|
220
|
+
}, { isActive: !panelMode });
|
|
221
|
+
// Panel form: same business keys through the host dispatcher. Esc/Ctrl+C
|
|
222
|
+
// RETURN FALSE — the host fallback then walks the focus back to chat (the
|
|
223
|
+
// panel never closes the sidebar itself); everything unconsumed also
|
|
224
|
+
// returns false so [/]/z/+/-/digits keep working.
|
|
225
|
+
const panelKeyHandler = (input, key) => {
|
|
226
|
+
if (key.escape === true || (key.ctrl === true && input === 'c'))
|
|
227
|
+
return false;
|
|
228
|
+
if (key.upArrow === true) {
|
|
229
|
+
setKillArmed(undefined);
|
|
230
|
+
setFocusIndex(i => Math.max(0, i - 1));
|
|
231
|
+
scrollRef.current?.scrollBy(-1);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
if (key.downArrow === true) {
|
|
235
|
+
setKillArmed(undefined);
|
|
236
|
+
setFocusIndex(i => Math.min(jobs.length - 1, i + 1));
|
|
237
|
+
scrollRef.current?.scrollBy(1);
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
if (input === 'k') {
|
|
241
|
+
const selected = jobs[focus];
|
|
242
|
+
if (selected !== undefined && (selected.status === 'running' || selected.status === 'stopping')) {
|
|
243
|
+
if (killArmed === selected.id) {
|
|
244
|
+
setKillArmed(undefined);
|
|
245
|
+
onKill(selected.id);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
setKillArmed(selected.id);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return true;
|
|
252
|
+
}
|
|
253
|
+
// 's' = Send to Chat:焦点任务附为下一次提交的上下文(chip 在输入框
|
|
254
|
+
// 上方,Esc 可撤)。未接通道时让出。
|
|
255
|
+
if (input === 's') {
|
|
256
|
+
if (onSendToChat === undefined)
|
|
257
|
+
return false;
|
|
258
|
+
const selected = jobs[focus];
|
|
259
|
+
if (selected === undefined)
|
|
260
|
+
return true;
|
|
261
|
+
onSendToChat(selected);
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// Enter keeps the same "panel owns the keyboard" semantics (no extra
|
|
265
|
+
// action on a live job — the row IS the view).
|
|
266
|
+
if (key.return_ === true)
|
|
267
|
+
return true;
|
|
268
|
+
return false;
|
|
269
|
+
};
|
|
270
|
+
usePanelInput(panelKeyHandler, { active: panelMode && focused && visible });
|
|
107
271
|
const running = jobs.filter(job => job.status === 'running' || job.status === 'stopping').length;
|
|
272
|
+
// One live job with a progress line reserves the column on every row, so the
|
|
273
|
+
// right-hand grid does not shift as jobs start and finish.
|
|
274
|
+
const progressEligible = jobs.some(job => (job.status === 'running' || job.status === 'stopping') && job.progress !== undefined && job.progress !== '');
|
|
275
|
+
// Column allocation: the full-screen form keeps the historical layout
|
|
276
|
+
// (progress eligible as computed, duration and status always shown); the
|
|
277
|
+
// panel form derives everything from the panel width.
|
|
278
|
+
const rowColumns = panelMode
|
|
279
|
+
? resolveJobsRowColumns(terminalColumns)
|
|
280
|
+
: { showProgress: progressEligible, showDuration: true, showStatus: true, idWidth: 9, statusWidth: 9, labelWrap: true };
|
|
108
281
|
const completed = jobs.filter(job => job.status === 'completed').length;
|
|
109
282
|
const failed = jobs.filter(job => job.status === 'failed' || job.status === 'killed').length;
|
|
110
|
-
|
|
283
|
+
if (panelMode) {
|
|
284
|
+
// Panel layout aligned with TodoPanelAdapter: no outer padding beyond
|
|
285
|
+
// one left/right cell, no title divider / exit button / hint footer
|
|
286
|
+
// (PanelBar + the host hint row already carry that chrome), the summary
|
|
287
|
+
// line kept but tightened for narrow widths.
|
|
288
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, paddingRight: 1, paddingTop: 0, flexGrow: 1, ref: clockRef, children: [_jsxs(Box, { flexDirection: "row", gap: 1, marginTop: 0, marginBottom: 1, children: [_jsxs(Text, { children: [_jsx(Text, { color: "accent", children: running }), _jsxs(Text, { dimColor: true, children: [" ", t('jobs-panel-count-running')] })] }), (terminalColumns >= 34 || failed > 0) && (_jsxs(Text, { children: [_jsx(Text, { color: failed > 0 ? 'error' : 'success', children: failed > 0 ? failed : completed }), _jsxs(Text, { dimColor: true, children: [" ", failed > 0 ? t('jobs-panel-count-failed') : t('jobs-panel-count-completed')] })] }))] }), _jsx(Box, { flexDirection: "column", maxHeight: Math.max(6, rows - 4), marginTop: 0, children: _jsx(ScrollBox, { ref: scrollRef, flexDirection: "column", flexGrow: 1, children: jobs.length === 0 ? (_jsxs(Box, { flexDirection: "column", alignItems: "center", marginTop: 2, children: [_jsx(Text, { dimColor: true, children: '○' }), _jsx(Text, { dimColor: true, children: t('jobs-panel-empty') })] })) : (jobs.map((job, index) => (_jsx(JobRowLine, { job: job, focused: index === focus, armed: killArmed === job.id, columns: rowColumns, onFocus: () => { setKillArmed(undefined); setFocusIndex(index); } }, job.id)))) }) })] }));
|
|
289
|
+
}
|
|
290
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 1, ref: clockRef, children: [_jsx(Divider, { color: "accent", title: t('jobs-panel-title') }), _jsxs(Box, { flexDirection: "row", gap: 3, marginTop: 1, marginBottom: 1, children: [_jsxs(Text, { children: [_jsx(Text, { color: "accent", children: running }), _jsxs(Text, { dimColor: true, children: [" ", t('jobs-panel-count-running')] })] }), _jsxs(Text, { children: [_jsx(Text, { color: "success", children: completed }), _jsxs(Text, { dimColor: true, children: [" ", t('jobs-panel-count-completed')] })] }), failed > 0 && (_jsxs(Text, { children: [_jsx(Text, { color: "error", children: failed }), _jsxs(Text, { dimColor: true, children: [" ", t('jobs-panel-count-failed')] })] })), _jsx(Box, { flexGrow: 1 }), _jsx(ExitButton, { onClick: () => onClose?.() })] }), _jsx(Box, { flexDirection: "column", maxHeight: Math.max(10, rows - 10), marginTop: 1, children: _jsx(ScrollBox, { ref: scrollRef, flexDirection: "column", flexGrow: 1, children: jobs.length === 0 ? (_jsxs(Box, { flexDirection: "column", alignItems: "center", marginTop: Math.max(2, Math.floor((rows - 16) / 3)), children: [_jsx(Text, { dimColor: true, children: '○' }), _jsx(Text, { dimColor: true, children: t('jobs-panel-empty') }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: t('jobs-panel-empty-hint') }) })] })) : (jobs.map((job, index) => (_jsx(JobRowLine, { job: job, focused: index === focus, armed: killArmed === job.id, columns: rowColumns, onFocus: () => { setKillArmed(undefined); setFocusIndex(index); } }, job.id)))) }) }), _jsx(Divider, { color: "subtle", title: "" }), _jsx(Box, { marginTop: 0, children: _jsx(Text, { dimColor: true, children: t('jobs-panel-hint') }) })] }));
|
|
111
291
|
}
|
|
@@ -31,10 +31,11 @@ import { type WhaleIntroId } from './whaleFrames.js';
|
|
|
31
31
|
* with a clickable "star us on GitHub" line whose indent is recomputed from
|
|
32
32
|
* its own width.
|
|
33
33
|
*/
|
|
34
|
-
export declare function LogoV2({ model, effort, cwd, skipIntro, intro, tip, fontId, whale, whaleIdle, whaleGirl, starred, starReveal, onStarClick, working, drift, egg, starChance, }: {
|
|
35
|
-
|
|
34
|
+
export declare function LogoV2({ model, effort, cwd, skipIntro, intro, tip, fontId, whale, whaleIdle, whaleGirl, starred, starReveal, onStarClick, working, drift, egg, starChance, align, chrome, arrangement, companionSkin, }: {
|
|
35
|
+
/** 模型/effort/工作目录只画在 full 形态里;minimal(落地页)不传也行。 */
|
|
36
|
+
model?: string;
|
|
36
37
|
effort?: string | undefined;
|
|
37
|
-
cwd
|
|
38
|
+
cwd?: string;
|
|
38
39
|
/** Test seam: mount straight into the settled header (probes skip the intro). */
|
|
39
40
|
skipIntro?: boolean;
|
|
40
41
|
/** Test seam: pin the intro animation instead of rolling one at startup. */
|
|
@@ -82,5 +83,44 @@ export declare function LogoV2({ model, effort, cwd, skipIntro, intro, tip, font
|
|
|
82
83
|
/** Test seam: pin/suppress the upstream-drift notice (`null` forces it off;
|
|
83
84
|
* `undefined` — the production default — auto-detects the install). */
|
|
84
85
|
drift?: UpstreamDriftSummary | null;
|
|
86
|
+
/**
|
|
87
|
+
* 排版对齐,默认 `start` = 转录区顶部那一版(逐字节不变):
|
|
88
|
+
*
|
|
89
|
+
* - `start` —— 并排行**占满整行**(`width="100%"`),欢迎语靠
|
|
90
|
+
* `welcomePad` 对齐到鲸鱼的视觉中线。转录区顶部要的正是这个:它左对齐在
|
|
91
|
+
* 内容列上,下面的消息行也跟着左对齐。
|
|
92
|
+
* - `center` —— 落地页要的那一版:**整块按内容宽度居中**(并排行不再是
|
|
93
|
+
* 100% 宽,根盒 `alignItems="center"`),欢迎语交给外层居中、不再自己
|
|
94
|
+
* 加缩进。缩进那套是"左对齐时把标语钉在鲸鱼下方"的解,居中的版面上
|
|
95
|
+
* 再用一次就整体右移了。
|
|
96
|
+
*
|
|
97
|
+
* 内容完全同源(鲸鱼、字体、彩蛋、提示、漂移告警都走同一套代码),只有
|
|
98
|
+
* 对齐交给父级。
|
|
99
|
+
*/
|
|
100
|
+
align?: 'start' | 'center';
|
|
101
|
+
/**
|
|
102
|
+
* 装饰密度,默认 full = 转录区顶部那一版(逐字节不变):词标 + 版本、
|
|
103
|
+
* 模型/effort、工作目录、启动提示、漂移告警、欢迎语一应俱全。
|
|
104
|
+
*
|
|
105
|
+
* - full —— 对话页开屏的信息密度(「我在哪、用的哪个模型」的答案)。
|
|
106
|
+
* - minimal —— 落地页那一版(opencode 式留白):只留立绘与块体
|
|
107
|
+
* DEEPSEEK/HARNESS 大字,其余信息行一概不画;欢迎语平时也不画
|
|
108
|
+
* (落地页的版面契约里它整行删除),只有求 star 里程碑标语出现时才
|
|
109
|
+
* 画那几行——里程碑的露出不因落地页改版而丢。
|
|
110
|
+
*
|
|
111
|
+
* 内容与交互(字体、彩蛋、点击爱心/女仆娘、idle 规划器)两条 chrome
|
|
112
|
+
* 完全同源,差异只在文字列的密度。
|
|
113
|
+
*/
|
|
114
|
+
chrome?: 'full' | 'minimal';
|
|
115
|
+
/**
|
|
116
|
+
* 立绘与词标的排布:`row`(默认,转录区开屏形态:图在左、字在右)或
|
|
117
|
+
* `column`(落地页形态:图在上、字在下,两者各自水平居中)。
|
|
118
|
+
* 用户实测反馈「logo 和标题一定要居中」——并排时是**整组**居中,词标仍然
|
|
119
|
+
* 偏在右半边;上下排布让两块各自落在中轴上,居中这件事不再有歧义。
|
|
120
|
+
*/
|
|
121
|
+
arrangement?: 'row' | 'column';
|
|
122
|
+
/** 测试缝:钉住启动页吉祥物皮肤(undefined——生产——读 companion.skin;
|
|
123
|
+
* 'whale'/未知 = 维持原鲸鱼/女仆娘路径,见 SplashMascot.tsx)。 */
|
|
124
|
+
companionSkin?: string;
|
|
85
125
|
}): React.ReactNode;
|
|
86
126
|
//# sourceMappingURL=LogoV2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAWxH,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"LogoV2.d.ts","sourceRoot":"","sources":["../../../src/components/LogoV2.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAWxH,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAS/E,OAAO,EAA+E,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AA+CjI;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,MAAM,CAAC,EACrB,KAAU,EACV,MAAM,EACN,GAAQ,EACR,SAAiB,EACjB,KAAK,EACL,GAAG,EACH,MAAM,EACN,KAAY,EACZ,SAAgB,EAChB,SAAiB,EACjB,OAAe,EACf,UAAU,EACV,WAAW,EACX,OAAe,EACf,KAAK,EACL,GAAG,EACH,UAAU,EACV,KAAe,EACf,MAAe,EACf,WAAmB,EACnB,aAAa,GACd,EAAE;IACD,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;0CACsC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,6EAA6E;IAC7E,GAAG,CAAC,EAAE,GAAG,CAAA;IACT;;qCAEiC;IACjC,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB;oEACgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;8CAO0C;IAC1C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gDAAgD;IAChD,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB;sCACkC;IAClC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB;;;4CAGwC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;mCAG+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;2EACuE;IACvE,KAAK,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACnC;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC1B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IAC9B;wDACoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,KAAK,CAAC,SAAS,CA8clB"}
|