@deepseek-harness-tui/dsh-tui 0.12.0 → 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 +41 -5
- 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 +8 -3
- package/cordis.patch.yml +7 -1
- package/guide/dsh-tui-guide/configuration.en.md +6 -1
- package/guide/dsh-tui-guide/configuration.md +6 -1
- package/guide/dsh-tui-guide/getting-started.en.md +6 -3
- package/guide/dsh-tui-guide/getting-started.md +4 -2
- package/guide/dsh-tui-guide/interaction.en.md +68 -4
- package/guide/dsh-tui-guide/interaction.md +49 -3
- package/guide/dsh-tui-guide/plugins.en.md +16 -6
- package/guide/dsh-tui-guide/plugins.md +14 -6
- package/guide/dsh-tui-guide/themes.en.md +7 -2
- package/guide/dsh-tui-guide/themes.md +5 -2
- package/guide/dsh-tui-guide/user-guide.en.md +124 -21
- package/guide/dsh-tui-guide/user-guide.md +96 -16
- package/lib/settings.json +215 -1
- package/lib/types/adapter/channel/ui-policy.d.ts +6 -2
- package/lib/types/adapter/channel/ui-policy.d.ts.map +1 -1
- package/lib/types/adapter/channel/ui-policy.js +14 -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-ui.d.ts +62 -2
- package/lib/types/adapter/ports/channel-ui.d.ts.map +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts +94 -0
- 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 +18 -1
- package/lib/types/components/Chat/JobCard.d.ts.map +1 -1
- package/lib/types/components/Chat/JobCard.js +90 -22
- 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/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 +147 -14
- 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 +212 -18
- 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/PromptInput.d.ts +20 -22
- package/lib/types/components/PromptInput.d.ts.map +1 -1
- package/lib/types/components/PromptInput.js +413 -156
- 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/SubagentCard.d.ts.map +1 -1
- package/lib/types/components/SubagentCard.js +17 -2
- 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 +54 -5
- 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/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/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/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/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/mode-actions.d.ts +0 -3
- package/lib/types/dsh-adapter/channel/mode-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/mode-actions.js +7 -2
- 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 +0 -1
- 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 +9 -1
- 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 +18 -2
- package/lib/types/dsh-adapter/channel/state.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/state.js +2 -1
- 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 +56 -3
- 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 +14 -0
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +24 -0
- 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/migrate/sessionize.d.ts.map +1 -1
- package/lib/types/dsh-adapter/migrate/sessionize.js +11 -12
- 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 +17 -1
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +169 -32
- package/lib/types/dsh-adapter/presets.d.ts +26 -6
- package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/presets.js +29 -7
- 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/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 +734 -15
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +302 -6
- 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 +62 -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 +36 -3
- package/lib/types/ink/parse-keypress.d.ts.map +1 -1
- package/lib/types/ink/parse-keypress.js +262 -108
- 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/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/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 +22 -1
- package/lib/types/screens/Chat.d.ts.map +1 -1
- package/lib/types/screens/Chat.js +1126 -299
- 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.map +1 -1
- package/lib/types/screens/StatusLine.js +32 -14
- 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 +83 -0
- package/lib/types/tips.js +5 -5
- 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 +101 -44
- 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/package.json +19 -8
- 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/{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,8 +1,9 @@
|
|
|
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
3
|
import { Box, Text, useAnimationFrame, useTerminalSize } from '../../ui.js';
|
|
4
4
|
import { formatJobDuration } from '../../dsh-adapter/jobs.js';
|
|
5
5
|
import { t } from '../../i18n.js';
|
|
6
|
+
import wrapText from '../../ink/wrap-text.js';
|
|
6
7
|
import { stringWidth } from '../../ink/stringWidth.js';
|
|
7
8
|
import { isMinimalUiMode } from '../../minimalUiMode.js';
|
|
8
9
|
import { ProgressBar } from '../design-system/ProgressBar.js';
|
|
@@ -46,23 +47,34 @@ export function JobProgress({ progress }) {
|
|
|
46
47
|
}
|
|
47
48
|
return (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(ProgressBar, { ratio: Math.min(current, total) / total, width: 5, fillColor: "accent", emptyColor: "inactive" }), _jsx(Text, { color: "accent", children: progress.trim() })] }));
|
|
48
49
|
}
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The waterfall window: every entry is WRAPPED at the card width FIRST, then
|
|
52
|
+
* the last `budget` VISUAL rows are kept. A 400-cell JSON line therefore
|
|
53
|
+
* shows its ending folded over the rows instead of a clipped head — and the
|
|
54
|
+
* window still costs a constant number of rows, which is what the
|
|
55
|
+
* transcript's virtualization measures.
|
|
56
|
+
*/
|
|
57
|
+
function waterfallWindow(entries, width, budget) {
|
|
58
|
+
const rows = [];
|
|
59
|
+
// One cell of slack: a line that lands exactly on the boundary is re-wrapped
|
|
60
|
+
// by ink's own renderer, which would silently double that row's height.
|
|
61
|
+
const textWidth = Math.max(1, width - 1);
|
|
62
|
+
for (let index = entries.length - 1; index >= 0 && rows.length < budget; index--) {
|
|
63
|
+
const entry = entries[index];
|
|
64
|
+
if (entry.kind === 'gap') {
|
|
65
|
+
rows.unshift({ key: `gap-${index}`, text: '', gap: true });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const wrapped = wrapText(entry.line.text, textWidth, 'wrap').split('\n');
|
|
69
|
+
for (let row = wrapped.length - 1; row >= 0 && rows.length < budget; row--) {
|
|
70
|
+
rows.unshift({
|
|
71
|
+
key: `${index}-${row}`,
|
|
72
|
+
text: wrapped[row] ?? '',
|
|
73
|
+
...(entry.line.channel === undefined ? {} : { channel: entry.line.channel }),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
64
76
|
}
|
|
65
|
-
return
|
|
77
|
+
return rows;
|
|
66
78
|
}
|
|
67
79
|
/**
|
|
68
80
|
* Live background-job card embedded in the transcript (`kind: 'job'`),
|
|
@@ -78,8 +90,20 @@ function clipLine(text, maxWidth) {
|
|
|
78
90
|
* is consuming and reserved for the owning agent, so the card shows the
|
|
79
91
|
* tail of the agent's own job_output results as they stream through the
|
|
80
92
|
* transcript.
|
|
93
|
+
*
|
|
94
|
+
* `rail` marks the card as a member of a job GROUP (see JobGroupRow): the
|
|
95
|
+
* card gets a 2-cell chain column on its left, and `rail.open` / `rail.close`
|
|
96
|
+
* round its ends (`╭` on the first line, `╰` on the last) so the run reads as
|
|
97
|
+
* one bracket from the first card to the last — the group's summary line stays
|
|
98
|
+
* OUTSIDE it. A lone card renders as before.
|
|
99
|
+
*
|
|
100
|
+
* The rail is drawn per line, which means this component owns the card's
|
|
101
|
+
* HEIGHT: the label is pre-wrapped against an explicit column width (so the
|
|
102
|
+
* wrap count is known, not guessed from the flex result), and the rail column
|
|
103
|
+
* paints exactly that many glyphs. Both use ink's own `wrapText`/`stringWidth`,
|
|
104
|
+
* so the pre-wrap breaks where the renderer would have broken.
|
|
81
105
|
*/
|
|
82
|
-
export function JobCard({ job, marginTopOnTurn, onClick }) {
|
|
106
|
+
export function JobCard({ job, marginTopOnTurn, onClick, rail }) {
|
|
83
107
|
const settled = job.status === 'completed' || job.status === 'failed' || job.status === 'killed';
|
|
84
108
|
// 动画订阅仅限存活卡片:settled 后退订共享 clock(同 SubagentMessage 的
|
|
85
109
|
// 约定)。1s tick 只驱动运行时长跳动——状态标是静态的(见 statusInfo)。
|
|
@@ -88,7 +112,13 @@ export function JobCard({ job, marginTopOnTurn, onClick }) {
|
|
|
88
112
|
const info = statusInfo(job.status);
|
|
89
113
|
const [hovered, setHovered] = React.useState(false);
|
|
90
114
|
const clickable = onClick !== undefined;
|
|
91
|
-
const
|
|
115
|
+
const grouped = rail !== undefined;
|
|
116
|
+
const cardColumns = columns ?? 80;
|
|
117
|
+
// A grouped card spends two columns on the rail — the glyph column plus its
|
|
118
|
+
// 1-cell gutter. Every width below is measured against that, or the rows
|
|
119
|
+
// would wrap a second time inside ink and the card would grow past the
|
|
120
|
+
// height the rail was painted for.
|
|
121
|
+
const rowWidth = Math.max(20, cardColumns - WATERFALL_GUTTER - (grouped ? 2 : 0));
|
|
92
122
|
// Waterfall entries: gap banners interleave as their own rows, then the
|
|
93
123
|
// window keeps the LAST WATERFALL_ROWS entries so a banner never pushes a
|
|
94
124
|
// fresher line out — the card stays constant-height.
|
|
@@ -98,7 +128,7 @@ export function JobCard({ job, marginTopOnTurn, onClick }) {
|
|
|
98
128
|
waterfall.push({ kind: 'gap' });
|
|
99
129
|
waterfall.push({ kind: 'line', line });
|
|
100
130
|
}
|
|
101
|
-
const activity = waterfall
|
|
131
|
+
const activity = waterfallWindow(waterfall, rowWidth, WATERFALL_ROWS);
|
|
102
132
|
// A settled job's terminal detail ('exit code: 0') rides the header; a
|
|
103
133
|
// failed/killed one also keeps it as the explanatory tail line.
|
|
104
134
|
const headerDetail = job.detail !== undefined && job.detail !== '' ? job.detail : undefined;
|
|
@@ -107,14 +137,52 @@ export function JobCard({ job, marginTopOnTurn, onClick }) {
|
|
|
107
137
|
// Only a LIVE job carries a progress chip; a settled one has dropped it, so
|
|
108
138
|
// reserving width for it unconditionally would clip the label for nothing.
|
|
109
139
|
const liveProgress = settled || job.progress === undefined || job.progress === '' ? undefined : job.progress;
|
|
140
|
+
// A grouped card paints its rail line by line, so its HEIGHT must be known
|
|
141
|
+
// before the render: measure every fixed column and pre-wrap the label into
|
|
142
|
+
// whatever is left. The label column is then given that width EXPLICITLY —
|
|
143
|
+
// never a flex leftover — so the pre-wrapped line count is exactly what the
|
|
144
|
+
// renderer paints (both sides use ink's own wrapText/stringWidth, so the
|
|
145
|
+
// breaks match the ones a plain wrapping Text would have chosen).
|
|
146
|
+
const railBody = settled && job.status !== 'completed' && headerDetail !== undefined;
|
|
147
|
+
const fixedWidths = [
|
|
148
|
+
stringWidth(info.glyph),
|
|
149
|
+
stringWidth(headerName),
|
|
150
|
+
stringWidth(job.kind),
|
|
151
|
+
...(liveProgress === undefined ? [] : [12]),
|
|
152
|
+
stringWidth(duration),
|
|
153
|
+
...(headerDetail === undefined ? [] : [stringWidth(headerDetail)]),
|
|
154
|
+
stringWidth(info.label),
|
|
155
|
+
];
|
|
156
|
+
// One gap between each pair of columns: (fixed + label) - 1 = fixed count.
|
|
157
|
+
const labelWidth = Math.max(8, cardColumns - (grouped ? 2 : 0) - fixedWidths.reduce((sum, width) => sum + width, 0) - fixedWidths.length);
|
|
158
|
+
// wrapText returns the wrapped STRING (newline separated), so the line
|
|
159
|
+
// count comes straight out of it.
|
|
160
|
+
const labelLines = grouped ? wrapText(job.label, labelWidth, 'wrap').split('\n') : undefined;
|
|
161
|
+
const contentLines = (labelLines?.length ?? 1) + activity.length + (railBody ? 1 : 0);
|
|
162
|
+
const railGlyphs = [];
|
|
163
|
+
if (grouped) {
|
|
164
|
+
for (let index = 0; index < contentLines; index++) {
|
|
165
|
+
const opens = index === 0 && rail?.open === true;
|
|
166
|
+
const closes = index === contentLines - 1 && rail?.close === true;
|
|
167
|
+
railGlyphs.push(opens ? '╭' : closes ? '╰' : '│');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
110
170
|
// 点击打开 /jobs 面板;hover 不刷整行背景(转录视觉保持安静),只把
|
|
111
171
|
// 状态 glyph 提亮为品牌色作为可点指示。无外层缩进:任务卡是上方工具
|
|
112
172
|
// 调用(run_in_background 卡)的延续,与工具卡通栏左对齐;子代理卡才
|
|
113
173
|
// 是嵌套子实体、保留缩进。瀑布的 ` │ ` 槽自带两格,正好与工具卡正文
|
|
114
174
|
// 的 ` ⎿ ` 槽位一致。
|
|
115
|
-
|
|
175
|
+
//
|
|
176
|
+
// 成组时的竖线不在 body 里:继续中的成员把 body 包进一个只有左边框的
|
|
177
|
+
// Box(见下方 bordered),边框覆盖整张卡的每一行——标签折行出的续行也
|
|
178
|
+
// 有线,链条不断。收口的尾成员用 `└ ` 字形 + 2 格空槽,两者都把正文
|
|
179
|
+
// 落在第 2 列。
|
|
180
|
+
const body = (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { color: hovered && clickable ? 'accent' : info.color, children: info.glyph }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, color: hovered && clickable ? 'accent' : undefined, children: headerName }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: job.kind }) }), labelLines === undefined ? (_jsx(Box, { flexGrow: 1, flexShrink: 1, children: _jsx(Text, { children: job.label }) })) : (_jsx(Box, { width: labelWidth, flexShrink: 0, flexDirection: "column", children: labelLines.map((line, index) => _jsx(Text, { children: line }, index)) })), liveProgress !== undefined && (_jsx(Box, { width: 12, flexShrink: 0, children: _jsx(JobProgress, { progress: liveProgress }) })), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: duration }) }), headerDetail !== undefined && _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, wrap: "truncate-end", children: headerDetail }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { color: info.color, children: info.label }) })] }), !settled && activity.length > 0 && activity.map(entry => (
|
|
116
181
|
// key 不含 time(同 SubagentMessage 的约定):内容更新走 in-place
|
|
117
182
|
// diff,避免每个 tick 都 unmount+mount。瀑布只在有镜像输出时出现
|
|
118
183
|
// (后台任务静默是常态——无输出时卡片就是头行,不摆空 gutter)。
|
|
119
|
-
|
|
184
|
+
// Rows are pre-wrapped to the row width, so truncate is a belt-and-braces
|
|
185
|
+
// guard against a re-wrap (which would break the constant height).
|
|
186
|
+
entry.gap === true ? (_jsx(Text, { dimColor: true, italic: true, wrap: "truncate", children: ` · ${t('jobs-output-gap')}` }, entry.key)) : (_jsx(Text, { color: entry.channel === 'stderr' ? 'error' : undefined, dimColor: entry.channel !== 'stderr', wrap: "truncate", children: ` │ ${entry.text}` }, entry.key)))), railBody && (_jsx(Text, { dimColor: true, children: ` └ ${headerDetail}` }))] }));
|
|
187
|
+
return _jsx(Box, { flexDirection: "column", marginTop: marginTopOnTurn ? 1 : 0, ref: viewportRef, onClick: onClick, onMouseEnter: clickable ? () => setHovered(true) : undefined, onMouseLeave: clickable ? () => setHovered(false) : undefined, children: grouped ? (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 1, flexShrink: 0, children: _jsx(Text, { color: "inactive", children: railGlyphs.join('\n') }) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingLeft: 1, children: body })] })) : body });
|
|
120
188
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { JobGroupRow } from '../../adapter/ports/channel-view.js';
|
|
3
|
+
/**
|
|
4
|
+
* Header line of a consecutive-job group (`row.jobGroup`): the run summary
|
|
5
|
+
* while the group is open, and the fold line once it is closed.
|
|
6
|
+
*
|
|
7
|
+
* ▾ 后台任务 ×6 · 2 运行中 · 4 已完成 · 合计 12.3s
|
|
8
|
+
* ▸ 已折叠 6 个后台任务 · 4 已完成 · 2 失败 · 合计 12.3s · 点击展开
|
|
9
|
+
*
|
|
10
|
+
* The fold line keeps the header's row and glyph slot, so a settling group
|
|
11
|
+
* reads as the SAME block tucking its body away (the thinking/compact fold
|
|
12
|
+
* convention) instead of a new row appearing. The whole line is clickable
|
|
13
|
+
* and brightens on hover — the same mouse gesture the job cards use — and
|
|
14
|
+
* Ctrl+O expands every group at once.
|
|
15
|
+
*
|
|
16
|
+
* The summary line sits OUTSIDE the group's rail: the cards below it carry
|
|
17
|
+
* the bracket (`╭` on the first card, `╰` on the last), so this line reads as
|
|
18
|
+
* the run's title rather than its first row.
|
|
19
|
+
*
|
|
20
|
+
* Failures stay LOUD while folded: the failed/killed counts are painted in
|
|
21
|
+
* the error color, because folding must never bury a job that died.
|
|
22
|
+
*/
|
|
23
|
+
export declare function JobGroupHeader({ group, onToggle }: {
|
|
24
|
+
group: JobGroupRow;
|
|
25
|
+
onToggle?(): void;
|
|
26
|
+
}): React.ReactNode;
|
|
27
|
+
//# sourceMappingURL=JobGroupHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JobGroupHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/Chat/JobGroupHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAQtE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAClD,KAAK,EAAE,WAAW,CAAA;IAClB,QAAQ,CAAC,IAAI,IAAI,CAAA;CAClB,GAAG,KAAK,CAAC,SAAS,CAoElB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text, useAnimationFrame } from '../../ui.js';
|
|
4
|
+
import { formatJobDuration } from '../../dsh-adapter/jobs.js';
|
|
5
|
+
import { t } from '../../i18n.js';
|
|
6
|
+
import { isMinimalUiMode } from '../../minimalUiMode.js';
|
|
7
|
+
/**
|
|
8
|
+
* Header line of a consecutive-job group (`row.jobGroup`): the run summary
|
|
9
|
+
* while the group is open, and the fold line once it is closed.
|
|
10
|
+
*
|
|
11
|
+
* ▾ 后台任务 ×6 · 2 运行中 · 4 已完成 · 合计 12.3s
|
|
12
|
+
* ▸ 已折叠 6 个后台任务 · 4 已完成 · 2 失败 · 合计 12.3s · 点击展开
|
|
13
|
+
*
|
|
14
|
+
* The fold line keeps the header's row and glyph slot, so a settling group
|
|
15
|
+
* reads as the SAME block tucking its body away (the thinking/compact fold
|
|
16
|
+
* convention) instead of a new row appearing. The whole line is clickable
|
|
17
|
+
* and brightens on hover — the same mouse gesture the job cards use — and
|
|
18
|
+
* Ctrl+O expands every group at once.
|
|
19
|
+
*
|
|
20
|
+
* The summary line sits OUTSIDE the group's rail: the cards below it carry
|
|
21
|
+
* the bracket (`╭` on the first card, `╰` on the last), so this line reads as
|
|
22
|
+
* the run's title rather than its first row.
|
|
23
|
+
*
|
|
24
|
+
* Failures stay LOUD while folded: the failed/killed counts are painted in
|
|
25
|
+
* the error color, because folding must never bury a job that died.
|
|
26
|
+
*/
|
|
27
|
+
export function JobGroupHeader({ group, onToggle }) {
|
|
28
|
+
const minimalUi = isMinimalUiMode();
|
|
29
|
+
const [hovered, setHovered] = React.useState(false);
|
|
30
|
+
// Only a LIVE group ticks: its elapsed keeps counting. A settled group's
|
|
31
|
+
// duration is frozen, so it must not keep re-rendering the row.
|
|
32
|
+
const [tickRef] = useAnimationFrame(group.running > 0 ? 1000 : null);
|
|
33
|
+
const clickable = onToggle !== undefined;
|
|
34
|
+
const duration = formatJobDuration({
|
|
35
|
+
startedAt: group.startedAt,
|
|
36
|
+
...(group.endedAt === undefined ? {} : { finishedAt: group.endedAt }),
|
|
37
|
+
});
|
|
38
|
+
const chipColor = (color) => minimalUi ? undefined : color;
|
|
39
|
+
const chips = [];
|
|
40
|
+
if (group.running > 0)
|
|
41
|
+
chips.push({ key: 'running', text: t('jobs-group-running', { count: group.running }), color: chipColor('warning') });
|
|
42
|
+
if (group.failed > 0)
|
|
43
|
+
chips.push({ key: 'failed', text: t('jobs-group-failed', { count: group.failed }), color: chipColor('error') });
|
|
44
|
+
if (group.killed > 0)
|
|
45
|
+
chips.push({ key: 'killed', text: t('jobs-group-killed', { count: group.killed }), color: chipColor('error') });
|
|
46
|
+
if (group.folded && group.running === 0 && group.failed === 0 && group.killed === 0) {
|
|
47
|
+
// Folded and clean: "全部完成" says more than "6 已完成" — the group is
|
|
48
|
+
// the unit being reported on now.
|
|
49
|
+
chips.push({ key: 'all', text: t('jobs-group-all-completed'), color: chipColor('success') });
|
|
50
|
+
}
|
|
51
|
+
else if (group.completed > 0) {
|
|
52
|
+
chips.push({ key: 'completed', text: t('jobs-group-completed', { count: group.completed }), color: undefined });
|
|
53
|
+
}
|
|
54
|
+
// The mouse affordance: a folded line always teaches the way back in; an
|
|
55
|
+
// open group only says it while hovered (its ▾ already carries the hint).
|
|
56
|
+
const hint = group.folded
|
|
57
|
+
? t('jobs-group-hint-expand')
|
|
58
|
+
: hovered && clickable ? t('jobs-group-hint-fold') : undefined;
|
|
59
|
+
return (_jsxs(Box, { flexDirection: "row", gap: 1, ref: tickRef, onClick: clickable ? onToggle : undefined, onMouseEnter: clickable ? () => setHovered(true) : undefined, onMouseLeave: clickable ? () => setHovered(false) : undefined, children: [_jsx(Text, { color: hovered && clickable && !minimalUi ? 'accent' : 'inactive', children: group.folded ? '▸' : '▾' }), _jsx(Text, { wrap: "truncate-end", color: hovered && clickable ? 'text' : undefined, dimColor: !(hovered && clickable), children: group.folded
|
|
60
|
+
? t('jobs-group-folded', { count: group.count })
|
|
61
|
+
: t('jobs-group-title', { count: group.count }) }), chips.map(chip => (_jsxs(React.Fragment, { children: [_jsx(Text, { color: "inactive", children: "\u00B7" }), _jsx(Text, { color: chip.color, dimColor: chip.color === undefined, children: chip.text })] }, chip.key))), _jsx(Text, { color: "inactive", children: "\u00B7" }), _jsx(Text, { dimColor: true, children: t('jobs-group-elapsed', { duration }) }), hint !== undefined && (_jsxs(React.Fragment, { children: [_jsx(Text, { color: "inactive", children: "\u00B7" }), _jsx(Text, { color: group.folded ? 'inactive' : 'accent', children: hint })] }))] }));
|
|
62
|
+
}
|
|
@@ -28,11 +28,23 @@ export declare function GoalStatusChip({ goal, minimal }: {
|
|
|
28
28
|
* id first appears, frozen on completion) — deliberately not derived from
|
|
29
29
|
* session-event timestamps.
|
|
30
30
|
*/
|
|
31
|
-
export declare function GoalTodoPanel({ channel, collapsed, onToggle, }: {
|
|
31
|
+
export declare function GoalTodoPanel({ channel, collapsed, onToggle, variant, visible, maxTodos, wrapWidth, }: {
|
|
32
32
|
channel: Channel;
|
|
33
33
|
/** Fold the whole todo section to its summary header line. */
|
|
34
34
|
collapsed?: boolean;
|
|
35
35
|
/** Toggle the fold (click on the header row; shares the hotkey state). */
|
|
36
36
|
onToggle?: () => void;
|
|
37
|
+
/** 'panel' = 侧栏 Todo Panel 形态:更紧凑(去外层 padding 与折叠
|
|
38
|
+
* 提示行),计时走共享动画时钟(visible=false 时零订阅)。 */
|
|
39
|
+
variant?: 'default' | 'panel';
|
|
40
|
+
/** 侧栏 visible 契约:非 active Panel 时 false——暂停本地计时,
|
|
41
|
+
* store(channel.goal/todos)照常更新,重新打开直接读最新值。 */
|
|
42
|
+
visible?: boolean;
|
|
43
|
+
/** 覆盖 MAX_TODOS(panel variant 按宿主高度传入)。 */
|
|
44
|
+
maxTodos?: number;
|
|
45
|
+
/** panel variant:todo 行按此宽度折行——单条最多 2 行,超出部分截断
|
|
46
|
+
* 加省略号;maxTodos 预算按「行」折算,放不下仍走「…N more」。缺省
|
|
47
|
+
* (default 形态)不折行,保持单行 truncate 的 chat 页现状。 */
|
|
48
|
+
wrapWidth?: number;
|
|
37
49
|
}): React.ReactNode;
|
|
38
50
|
//# sourceMappingURL=GoalTodoPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoalTodoPanel.d.ts","sourceRoot":"","sources":["../../../src/components/GoalTodoPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"GoalTodoPanel.d.ts","sourceRoot":"","sources":["../../../src/components/GoalTodoPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,2BAA2B,CAAA;AAmC3E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,OAAe,EAAE,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAQnH;AA2CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,SAAiB,EACjB,QAAQ,EACR,OAAmB,EACnB,OAAc,EACd,QAAQ,EACR,SAAS,GACV,EAAE;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB;8CAC0C;IAC1C,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC7B;oDACgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;oDAEgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,KAAK,CAAC,SAAS,CAiMlB"}
|
|
@@ -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"}
|