@sayknow-cli/coding-agent 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +2 -2
  3. package/dist/types/config/keybindings.d.ts +1 -1
  4. package/dist/types/config/settings-schema.d.ts +7 -3
  5. package/dist/types/i18n/messages/en.d.ts +16 -0
  6. package/dist/types/modes/components/session-selector.d.ts +7 -3
  7. package/dist/types/modes/components/sessions-dashboard.d.ts +2 -1
  8. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  9. package/dist/types/modes/components/user-message.d.ts +3 -1
  10. package/dist/types/modes/components/welcome.d.ts +49 -6
  11. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  12. package/dist/types/modes/controllers/selector-controller.d.ts +5 -0
  13. package/dist/types/modes/interactive-mode.d.ts +7 -1
  14. package/dist/types/modes/theme/defaults/index.d.ts +342 -0
  15. package/dist/types/modes/theme/theme.d.ts +5 -1
  16. package/dist/types/modes/types.d.ts +1 -1
  17. package/dist/types/session/session-manager.d.ts +9 -0
  18. package/dist/types/session/session-stars.d.ts +15 -0
  19. package/dist/types/tui/output-block.d.ts +12 -1
  20. package/dist/types/tui/utils.d.ts +1 -3
  21. package/dist/types/utils/session-title-generation.d.ts +6 -0
  22. package/dist/types/utils/title-generator.d.ts +11 -2
  23. package/package.json +7 -7
  24. package/scripts/generate-sdk-operation-inventory.ts +8 -0
  25. package/src/cli/session-picker.ts +4 -0
  26. package/src/config/keybindings.ts +1 -1
  27. package/src/config/settings-schema.ts +4 -3
  28. package/src/i18n/messages/de.messages.ts +4 -1
  29. package/src/i18n/messages/de.settings.ts +2 -0
  30. package/src/i18n/messages/de.ts +16 -0
  31. package/src/i18n/messages/en.ts +16 -0
  32. package/src/i18n/messages/es.messages.ts +4 -1
  33. package/src/i18n/messages/es.settings.ts +2 -0
  34. package/src/i18n/messages/es.ts +16 -0
  35. package/src/i18n/messages/fr.messages.ts +4 -1
  36. package/src/i18n/messages/fr.settings.ts +2 -0
  37. package/src/i18n/messages/fr.ts +16 -0
  38. package/src/i18n/messages/ja.messages.ts +4 -1
  39. package/src/i18n/messages/ja.settings.ts +2 -0
  40. package/src/i18n/messages/ja.ts +16 -0
  41. package/src/i18n/messages/ko.messages.ts +4 -1
  42. package/src/i18n/messages/ko.settings.ts +2 -0
  43. package/src/i18n/messages/ko.ts +16 -0
  44. package/src/i18n/messages/zh.messages.ts +2 -1
  45. package/src/i18n/messages/zh.settings.ts +2 -0
  46. package/src/i18n/messages/zh.ts +16 -0
  47. package/src/internal-urls/docs-index.generated.ts +10 -10
  48. package/src/lsp/render.ts +0 -1
  49. package/src/modes/components/session-selector.ts +71 -21
  50. package/src/modes/components/sessions-dashboard.ts +8 -5
  51. package/src/modes/components/settings-selector.ts +1 -0
  52. package/src/modes/components/status-line/presets.ts +5 -5
  53. package/src/modes/components/status-line/separators.ts +4 -0
  54. package/src/modes/components/tool-execution.ts +6 -19
  55. package/src/modes/components/tool-status-header.ts +103 -12
  56. package/src/modes/components/user-message-selector.ts +57 -15
  57. package/src/modes/components/user-message.ts +25 -15
  58. package/src/modes/components/welcome.ts +374 -478
  59. package/src/modes/controllers/command-controller.ts +56 -7
  60. package/src/modes/controllers/input-controller.ts +4 -0
  61. package/src/modes/controllers/selector-controller.ts +91 -10
  62. package/src/modes/interactive-mode.ts +101 -12
  63. package/src/modes/theme/defaults/glow-octopus.json +114 -0
  64. package/src/modes/theme/defaults/index.ts +6 -0
  65. package/src/modes/theme/defaults/ink-octopus.json +114 -0
  66. package/src/modes/theme/defaults/violet-octopus.json +114 -0
  67. package/src/modes/theme/theme.ts +18 -2
  68. package/src/modes/types.ts +1 -1
  69. package/src/prompts/system/title-system.md +1 -1
  70. package/src/sdk/protocol/operation-inventory.generated.json +40 -0
  71. package/src/session/agent-session.ts +12 -0
  72. package/src/session/internal/managed-session-scope.ts +10 -0
  73. package/src/session/session-manager.ts +26 -1
  74. package/src/session/session-stars.ts +104 -0
  75. package/src/slash-commands/builtin-registry.ts +104 -4
  76. package/src/tools/debug.ts +0 -1
  77. package/src/tools/fetch.ts +0 -1
  78. package/src/tui/output-block.ts +29 -61
  79. package/src/tui/utils.ts +1 -8
  80. package/src/utils/session-title-generation.ts +29 -0
  81. package/src/utils/title-generator.ts +46 -2
@@ -325,6 +325,120 @@ export declare const defaultThemes: {
325
325
  preset: string;
326
326
  };
327
327
  };
328
+ "glow-octopus": {
329
+ $schema: string;
330
+ name: string;
331
+ vars: {
332
+ ink: string;
333
+ mantle: string;
334
+ surface: string;
335
+ surfaceBright: string;
336
+ text: string;
337
+ muted: string;
338
+ dim: string;
339
+ accent: string;
340
+ secondary: string;
341
+ success: string;
342
+ error: string;
343
+ warning: string;
344
+ link: string;
345
+ keyword: string;
346
+ function: string;
347
+ string: string;
348
+ number: string;
349
+ type: string;
350
+ diffRemoved: string;
351
+ toolSuccessBg: string;
352
+ toolErrorBg: string;
353
+ think1: string;
354
+ think2: string;
355
+ think3: string;
356
+ think4: string;
357
+ };
358
+ colors: {
359
+ accent: string;
360
+ border: string;
361
+ borderAccent: string;
362
+ borderMuted: string;
363
+ success: string;
364
+ error: string;
365
+ warning: string;
366
+ muted: string;
367
+ dim: string;
368
+ text: string;
369
+ thinkingText: string;
370
+ selectedBg: string;
371
+ userMessageBg: string;
372
+ userMessageText: string;
373
+ customMessageBg: string;
374
+ customMessageText: string;
375
+ customMessageLabel: string;
376
+ toolPendingBg: string;
377
+ toolSuccessBg: string;
378
+ toolErrorBg: string;
379
+ toolTitle: string;
380
+ toolOutput: string;
381
+ mdHeading: string;
382
+ mdLink: string;
383
+ mdLinkUrl: string;
384
+ mdCode: string;
385
+ mdCodeBlock: string;
386
+ mdCodeBlockBorder: string;
387
+ mdQuote: string;
388
+ mdQuoteBorder: string;
389
+ mdHr: string;
390
+ mdListBullet: string;
391
+ toolDiffAdded: string;
392
+ toolDiffRemoved: string;
393
+ toolDiffContext: string;
394
+ link: string;
395
+ syntaxComment: string;
396
+ syntaxKeyword: string;
397
+ syntaxFunction: string;
398
+ syntaxVariable: string;
399
+ syntaxString: string;
400
+ syntaxNumber: string;
401
+ syntaxType: string;
402
+ syntaxOperator: string;
403
+ syntaxPunctuation: string;
404
+ thinkingOff: string;
405
+ thinkingMinimal: string;
406
+ thinkingLow: string;
407
+ thinkingMedium: string;
408
+ thinkingHigh: string;
409
+ thinkingXhigh: string;
410
+ bashMode: string;
411
+ statusLineBg: string;
412
+ statusLineSep: string;
413
+ statusLineModel: string;
414
+ statusLinePath: string;
415
+ statusLineGitClean: string;
416
+ statusLineGitDirty: string;
417
+ statusLineContext: string;
418
+ statusLineSpend: string;
419
+ statusLineStaged: string;
420
+ statusLineDirty: string;
421
+ statusLineUntracked: string;
422
+ statusLineOutput: string;
423
+ statusLineCost: string;
424
+ statusLineSubagents: string;
425
+ pythonMode: string;
426
+ };
427
+ export: {
428
+ pageBg: string;
429
+ cardBg: string;
430
+ infoBg: string;
431
+ };
432
+ symbols: {
433
+ preset: string;
434
+ overrides: {
435
+ "icon.pi": string;
436
+ "icon.agents": string;
437
+ "status.running": string;
438
+ "md.bullet": string;
439
+ };
440
+ };
441
+ };
328
442
  "gruvbox-dark": {
329
443
  $schema: string;
330
444
  name: string;
@@ -424,6 +538,120 @@ export declare const defaultThemes: {
424
538
  preset: string;
425
539
  };
426
540
  };
541
+ "ink-octopus": {
542
+ $schema: string;
543
+ name: string;
544
+ vars: {
545
+ ink: string;
546
+ mantle: string;
547
+ surface: string;
548
+ surfaceBright: string;
549
+ text: string;
550
+ muted: string;
551
+ dim: string;
552
+ accent: string;
553
+ secondary: string;
554
+ success: string;
555
+ error: string;
556
+ warning: string;
557
+ link: string;
558
+ keyword: string;
559
+ function: string;
560
+ string: string;
561
+ number: string;
562
+ type: string;
563
+ diffRemoved: string;
564
+ toolSuccessBg: string;
565
+ toolErrorBg: string;
566
+ think1: string;
567
+ think2: string;
568
+ think3: string;
569
+ think4: string;
570
+ };
571
+ colors: {
572
+ accent: string;
573
+ border: string;
574
+ borderAccent: string;
575
+ borderMuted: string;
576
+ success: string;
577
+ error: string;
578
+ warning: string;
579
+ muted: string;
580
+ dim: string;
581
+ text: string;
582
+ thinkingText: string;
583
+ selectedBg: string;
584
+ userMessageBg: string;
585
+ userMessageText: string;
586
+ customMessageBg: string;
587
+ customMessageText: string;
588
+ customMessageLabel: string;
589
+ toolPendingBg: string;
590
+ toolSuccessBg: string;
591
+ toolErrorBg: string;
592
+ toolTitle: string;
593
+ toolOutput: string;
594
+ mdHeading: string;
595
+ mdLink: string;
596
+ mdLinkUrl: string;
597
+ mdCode: string;
598
+ mdCodeBlock: string;
599
+ mdCodeBlockBorder: string;
600
+ mdQuote: string;
601
+ mdQuoteBorder: string;
602
+ mdHr: string;
603
+ mdListBullet: string;
604
+ toolDiffAdded: string;
605
+ toolDiffRemoved: string;
606
+ toolDiffContext: string;
607
+ link: string;
608
+ syntaxComment: string;
609
+ syntaxKeyword: string;
610
+ syntaxFunction: string;
611
+ syntaxVariable: string;
612
+ syntaxString: string;
613
+ syntaxNumber: string;
614
+ syntaxType: string;
615
+ syntaxOperator: string;
616
+ syntaxPunctuation: string;
617
+ thinkingOff: string;
618
+ thinkingMinimal: string;
619
+ thinkingLow: string;
620
+ thinkingMedium: string;
621
+ thinkingHigh: string;
622
+ thinkingXhigh: string;
623
+ bashMode: string;
624
+ statusLineBg: string;
625
+ statusLineSep: string;
626
+ statusLineModel: string;
627
+ statusLinePath: string;
628
+ statusLineGitClean: string;
629
+ statusLineGitDirty: string;
630
+ statusLineContext: string;
631
+ statusLineSpend: string;
632
+ statusLineStaged: string;
633
+ statusLineDirty: string;
634
+ statusLineUntracked: string;
635
+ statusLineOutput: string;
636
+ statusLineCost: string;
637
+ statusLineSubagents: string;
638
+ pythonMode: string;
639
+ };
640
+ export: {
641
+ pageBg: string;
642
+ cardBg: string;
643
+ infoBg: string;
644
+ };
645
+ symbols: {
646
+ preset: string;
647
+ overrides: {
648
+ "icon.pi": string;
649
+ "icon.agents": string;
650
+ "status.running": string;
651
+ "md.bullet": string;
652
+ };
653
+ };
654
+ };
427
655
  opencode: {
428
656
  $schema: string;
429
657
  name: string;
@@ -649,4 +877,118 @@ export declare const defaultThemes: {
649
877
  };
650
878
  };
651
879
  };
880
+ "violet-octopus": {
881
+ $schema: string;
882
+ name: string;
883
+ vars: {
884
+ ink: string;
885
+ mantle: string;
886
+ surface: string;
887
+ surfaceBright: string;
888
+ text: string;
889
+ muted: string;
890
+ dim: string;
891
+ accent: string;
892
+ secondary: string;
893
+ success: string;
894
+ error: string;
895
+ warning: string;
896
+ link: string;
897
+ keyword: string;
898
+ function: string;
899
+ string: string;
900
+ number: string;
901
+ type: string;
902
+ diffRemoved: string;
903
+ toolSuccessBg: string;
904
+ toolErrorBg: string;
905
+ think1: string;
906
+ think2: string;
907
+ think3: string;
908
+ think4: string;
909
+ };
910
+ colors: {
911
+ accent: string;
912
+ border: string;
913
+ borderAccent: string;
914
+ borderMuted: string;
915
+ success: string;
916
+ error: string;
917
+ warning: string;
918
+ muted: string;
919
+ dim: string;
920
+ text: string;
921
+ thinkingText: string;
922
+ selectedBg: string;
923
+ userMessageBg: string;
924
+ userMessageText: string;
925
+ customMessageBg: string;
926
+ customMessageText: string;
927
+ customMessageLabel: string;
928
+ toolPendingBg: string;
929
+ toolSuccessBg: string;
930
+ toolErrorBg: string;
931
+ toolTitle: string;
932
+ toolOutput: string;
933
+ mdHeading: string;
934
+ mdLink: string;
935
+ mdLinkUrl: string;
936
+ mdCode: string;
937
+ mdCodeBlock: string;
938
+ mdCodeBlockBorder: string;
939
+ mdQuote: string;
940
+ mdQuoteBorder: string;
941
+ mdHr: string;
942
+ mdListBullet: string;
943
+ toolDiffAdded: string;
944
+ toolDiffRemoved: string;
945
+ toolDiffContext: string;
946
+ link: string;
947
+ syntaxComment: string;
948
+ syntaxKeyword: string;
949
+ syntaxFunction: string;
950
+ syntaxVariable: string;
951
+ syntaxString: string;
952
+ syntaxNumber: string;
953
+ syntaxType: string;
954
+ syntaxOperator: string;
955
+ syntaxPunctuation: string;
956
+ thinkingOff: string;
957
+ thinkingMinimal: string;
958
+ thinkingLow: string;
959
+ thinkingMedium: string;
960
+ thinkingHigh: string;
961
+ thinkingXhigh: string;
962
+ bashMode: string;
963
+ statusLineBg: string;
964
+ statusLineSep: string;
965
+ statusLineModel: string;
966
+ statusLinePath: string;
967
+ statusLineGitClean: string;
968
+ statusLineGitDirty: string;
969
+ statusLineContext: string;
970
+ statusLineSpend: string;
971
+ statusLineStaged: string;
972
+ statusLineDirty: string;
973
+ statusLineUntracked: string;
974
+ statusLineOutput: string;
975
+ statusLineCost: string;
976
+ statusLineSubagents: string;
977
+ pythonMode: string;
978
+ };
979
+ export: {
980
+ pageBg: string;
981
+ cardBg: string;
982
+ infoBg: string;
983
+ };
984
+ symbols: {
985
+ preset: string;
986
+ overrides: {
987
+ "icon.pi": string;
988
+ "icon.agents": string;
989
+ "status.running": string;
990
+ "md.bullet": string;
991
+ };
992
+ };
993
+ };
652
994
  };
@@ -6,7 +6,7 @@ export type SymbolPreset = "unicode" | "nerd" | "ascii";
6
6
  /**
7
7
  * All available symbol keys organized by category.
8
8
  */
9
- export type SymbolKey = "status.success" | "status.error" | "status.warning" | "status.info" | "status.pending" | "status.disabled" | "status.enabled" | "status.running" | "status.shadowed" | "status.aborted" | "nav.cursor" | "nav.selected" | "nav.expand" | "nav.collapse" | "nav.back" | "tree.branch" | "tree.last" | "tree.vertical" | "tree.horizontal" | "tree.hook" | "boxRound.topLeft" | "boxRound.topRight" | "boxRound.bottomLeft" | "boxRound.bottomRight" | "boxRound.horizontal" | "boxRound.vertical" | "boxSharp.topLeft" | "boxSharp.topRight" | "boxSharp.bottomLeft" | "boxSharp.bottomRight" | "boxSharp.horizontal" | "boxSharp.vertical" | "boxSharp.cross" | "boxSharp.teeDown" | "boxSharp.teeUp" | "boxSharp.teeRight" | "boxSharp.teeLeft" | "sep.powerline" | "sep.powerlineThin" | "sep.powerlineLeft" | "sep.powerlineRight" | "sep.powerlineThinLeft" | "sep.powerlineThinRight" | "sep.block" | "sep.space" | "sep.asciiLeft" | "sep.asciiRight" | "sep.dot" | "sep.slash" | "sep.pipe" | "icon.model" | "icon.plan" | "icon.goal" | "icon.pause" | "icon.folder" | "icon.scratchFolder" | "icon.file" | "icon.git" | "icon.branch" | "icon.pr" | "icon.tokens" | "icon.context" | "icon.cost" | "icon.time" | "icon.pi" | "icon.agents" | "icon.cache" | "icon.input" | "icon.output" | "icon.host" | "icon.session" | "icon.package" | "icon.warning" | "icon.rewind" | "icon.auto" | "icon.fast" | "icon.extensionSkill" | "icon.extensionTool" | "icon.extensionSlashCommand" | "icon.extensionMcp" | "icon.extensionRule" | "icon.extensionHook" | "icon.extensionPrompt" | "icon.extensionContextFile" | "icon.extensionInstruction" | "icon.mic" | "thinking.minimal" | "thinking.low" | "thinking.medium" | "thinking.high" | "thinking.xhigh" | "thinking.max" | "checkbox.checked" | "checkbox.unchecked" | "format.bullet" | "format.dash" | "format.bracketLeft" | "format.bracketRight" | "md.quoteBorder" | "md.hrChar" | "md.bullet" | "lang.default" | "lang.typescript" | "lang.javascript" | "lang.python" | "lang.rust" | "lang.go" | "lang.java" | "lang.c" | "lang.cpp" | "lang.csharp" | "lang.ruby" | "lang.php" | "lang.swift" | "lang.kotlin" | "lang.shell" | "lang.html" | "lang.css" | "lang.json" | "lang.yaml" | "lang.markdown" | "lang.sql" | "lang.docker" | "lang.lua" | "lang.text" | "lang.env" | "lang.toml" | "lang.xml" | "lang.ini" | "lang.conf" | "lang.log" | "lang.csv" | "lang.tsv" | "lang.image" | "lang.pdf" | "lang.archive" | "lang.binary" | "tab.appearance" | "tab.model" | "tab.interaction" | "tab.context" | "tab.editing" | "tab.tools" | "tab.memory" | "tab.tasks" | "tab.providers" | "tab.integrations";
9
+ export type SymbolKey = "status.success" | "status.error" | "status.warning" | "status.info" | "status.pending" | "status.disabled" | "status.enabled" | "status.running" | "status.shadowed" | "status.aborted" | "nav.cursor" | "nav.selected" | "nav.expand" | "nav.collapse" | "nav.back" | "tree.branch" | "tree.last" | "tree.vertical" | "tree.horizontal" | "tree.hook" | "boxRound.topLeft" | "boxRound.topRight" | "boxRound.bottomLeft" | "boxRound.bottomRight" | "boxRound.horizontal" | "boxRound.vertical" | "boxSharp.topLeft" | "boxSharp.topRight" | "boxSharp.bottomLeft" | "boxSharp.bottomRight" | "boxSharp.horizontal" | "boxSharp.vertical" | "boxSharp.cross" | "boxSharp.teeDown" | "boxSharp.teeUp" | "boxSharp.teeRight" | "boxSharp.teeLeft" | "sep.powerline" | "sep.powerlineThin" | "sep.powerlineLeft" | "sep.powerlineRight" | "sep.powerlineThinLeft" | "sep.powerlineThinRight" | "sep.block" | "sep.space" | "sep.asciiLeft" | "sep.asciiRight" | "sep.dot" | "sep.slash" | "sep.pipe" | "icon.model" | "icon.plan" | "icon.goal" | "icon.pause" | "icon.folder" | "icon.scratchFolder" | "icon.file" | "icon.git" | "icon.branch" | "icon.pr" | "icon.tokens" | "icon.context" | "icon.cost" | "icon.time" | "icon.pi" | "icon.agents" | "icon.cache" | "icon.input" | "icon.output" | "icon.host" | "icon.session" | "icon.star" | "icon.package" | "icon.warning" | "icon.rewind" | "icon.auto" | "icon.fast" | "icon.extensionSkill" | "icon.extensionTool" | "icon.extensionSlashCommand" | "icon.extensionMcp" | "icon.extensionRule" | "icon.extensionHook" | "icon.extensionPrompt" | "icon.extensionContextFile" | "icon.extensionInstruction" | "icon.mic" | "thinking.minimal" | "thinking.low" | "thinking.medium" | "thinking.high" | "thinking.xhigh" | "thinking.max" | "checkbox.checked" | "checkbox.unchecked" | "format.bullet" | "format.dash" | "format.bracketLeft" | "format.bracketRight" | "md.quoteBorder" | "md.hrChar" | "md.bullet" | "rail.user" | "lang.default" | "lang.typescript" | "lang.javascript" | "lang.python" | "lang.rust" | "lang.go" | "lang.java" | "lang.c" | "lang.cpp" | "lang.csharp" | "lang.ruby" | "lang.php" | "lang.swift" | "lang.kotlin" | "lang.shell" | "lang.html" | "lang.css" | "lang.json" | "lang.yaml" | "lang.markdown" | "lang.sql" | "lang.docker" | "lang.lua" | "lang.text" | "lang.env" | "lang.toml" | "lang.xml" | "lang.ini" | "lang.conf" | "lang.log" | "lang.csv" | "lang.tsv" | "lang.image" | "lang.pdf" | "lang.archive" | "lang.binary" | "tab.appearance" | "tab.model" | "tab.interaction" | "tab.context" | "tab.editing" | "tab.tools" | "tab.memory" | "tab.tasks" | "tab.providers" | "tab.integrations";
10
10
  export type SpinnerType = "status" | "activity";
11
11
  export declare const THEME_COLOR_KEYS: readonly ["accent", "border", "borderAccent", "borderMuted", "success", "error", "warning", "muted", "dim", "text", "thinkingText", "selectedBg", "userMessageBg", "userMessageText", "customMessageBg", "customMessageText", "customMessageLabel", "toolPendingBg", "toolSuccessBg", "toolErrorBg", "toolTitle", "toolOutput", "mdHeading", "mdLink", "mdLinkUrl", "mdCode", "mdCodeBlock", "mdCodeBlockBorder", "mdQuote", "mdQuoteBorder", "mdHr", "mdListBullet", "toolDiffAdded", "toolDiffRemoved", "toolDiffContext", "syntaxComment", "syntaxKeyword", "syntaxFunction", "syntaxVariable", "syntaxString", "syntaxNumber", "syntaxType", "syntaxOperator", "syntaxPunctuation", "thinkingOff", "thinkingMinimal", "thinkingLow", "thinkingMedium", "thinkingHigh", "thinkingXhigh", "bashMode", "pythonMode", "statusLineBg", "statusLineSep", "statusLineModel", "statusLinePath", "statusLineGitClean", "statusLineGitDirty", "statusLineContext", "statusLineSpend", "statusLineStaged", "statusLineDirty", "statusLineUntracked", "statusLineOutput", "statusLineCost", "statusLineSubagents"];
12
12
  export type ThemeColor = "accent" | "border" | "borderAccent" | "borderMuted" | "success" | "error" | "warning" | "muted" | "dim" | "text" | "thinkingText" | "userMessageText" | "customMessageText" | "customMessageLabel" | "toolTitle" | "toolOutput" | "mdHeading" | "mdLink" | "mdLinkUrl" | "mdCode" | "mdCodeBlock" | "mdCodeBlockBorder" | "mdQuote" | "mdQuoteBorder" | "mdHr" | "mdListBullet" | "toolDiffAdded" | "toolDiffRemoved" | "toolDiffContext" | "syntaxComment" | "syntaxKeyword" | "syntaxFunction" | "syntaxVariable" | "syntaxString" | "syntaxNumber" | "syntaxType" | "syntaxOperator" | "syntaxPunctuation" | "thinkingOff" | "thinkingMinimal" | "thinkingLow" | "thinkingMedium" | "thinkingHigh" | "thinkingXhigh" | "bashMode" | "pythonMode" | "statusLineSep" | "statusLineModel" | "statusLinePath" | "statusLineGitClean" | "statusLineGitDirty" | "statusLineContext" | "statusLineSpend" | "statusLineStaged" | "statusLineDirty" | "statusLineUntracked" | "statusLineOutput" | "statusLineCost" | "statusLineSubagents";
@@ -128,6 +128,7 @@ export declare class Theme {
128
128
  output: string;
129
129
  host: string;
130
130
  session: string;
131
+ star: string;
131
132
  package: string;
132
133
  warning: string;
133
134
  rewind: string;
@@ -162,6 +163,9 @@ export declare class Theme {
162
163
  bracketLeft: string;
163
164
  bracketRight: string;
164
165
  };
166
+ get rail(): {
167
+ user: string;
168
+ };
165
169
  get md(): {
166
170
  quoteBorder: string;
167
171
  hrChar: string;
@@ -256,7 +256,7 @@ export interface InteractiveModeContext {
256
256
  handleHandoffCommand(customInstructions?: string): Promise<void>;
257
257
  handleContributionPrepCommand(customInstructions?: string): Promise<void>;
258
258
  handleMoveCommand(targetPath: string): Promise<void>;
259
- handleRenameCommand(title: string): Promise<void>;
259
+ handleRenameCommand(title?: string): Promise<void>;
260
260
  handleMemoryCommand(text: string): Promise<void>;
261
261
  handleSTTToggle(): Promise<void>;
262
262
  executeCompaction(customInstructionsOrOptions?: string | CompactOptions, isAuto?: boolean): Promise<CompactionOutcome>;
@@ -403,6 +403,8 @@ export interface SessionInfo {
403
403
  /** Working directory where the session was started. Empty string for old sessions. */
404
404
  cwd: string;
405
405
  title?: string;
406
+ /** Starred for discovery (see session-stars.ts); never affects resolution or retention. */
407
+ starred: boolean;
406
408
  /** Path to the parent session (if this session was forked). */
407
409
  parentSessionPath?: string;
408
410
  created: Date;
@@ -555,6 +557,8 @@ interface ResidentBlobSentinel {
555
557
  }
556
558
  export declare function residentBlobSentinelForTests(kind: ResidentBlobKind, ref: string): ResidentBlobSentinel;
557
559
  export declare function materializeResidentEntriesForPersistenceForTests<T>(entries: T[], textStore: BlobStore, imageStore?: BlobStore): T[];
560
+ /** Starred sessions first, each group keeping its incoming (recency) order. */
561
+ export declare function prioritizeStarredSessions(sessions: readonly SessionInfo[]): SessionInfo[];
558
562
  /** Get recent sessions for display in welcome screen */
559
563
  export declare function getRecentSessions(sessionDir: string, limit?: number, storage?: SessionStorage): Promise<RecentSessionInfo[]>;
560
564
  export declare function getRecentSessionDisplay(sessions: readonly SessionInfo[], limit?: number): Array<{
@@ -769,6 +773,11 @@ export declare class SessionManager {
769
773
  /** The source that set the session name: "user" (manual /rename or RPC) or "auto" (generated title). */
770
774
  get titleSource(): "auto" | "user" | undefined;
771
775
  getSessionName(): string | undefined;
776
+ isSessionStarred(): boolean;
777
+ /** Star or unstar this session. Returns `false` when it was already in that state. */
778
+ setSessionStarred(starred: boolean): Promise<boolean>;
779
+ /** Star or unstar a session listed in the resume picker (not necessarily this one). */
780
+ setSessionStarredForPicker(session: Pick<SessionInfo, "id">, starred: boolean): Promise<void>;
772
781
  setSessionName(name: string, source?: "auto" | "user"): Promise<boolean>;
773
782
  _persist(entry: SessionEntry): void;
774
783
  /** Append a configured fallback chain as child of current leaf, then advance leaf. Returns entry id. */
@@ -0,0 +1,15 @@
1
+ export declare function getSessionStarIndexPath(agentDir?: string): string;
2
+ /**
3
+ * Ids of starred sessions. Cheap to call per listed session: the parsed index is
4
+ * cached until the file's mtime or size changes. A missing or unreadable index
5
+ * means nothing is starred; listing never fails because of stars.
6
+ */
7
+ export declare function readStarredSessionIds(agentDir?: string): ReadonlySet<string>;
8
+ export declare function isSessionIdStarred(sessionId: string, agentDir?: string): boolean;
9
+ /**
10
+ * Star or unstar a session by id. Returns `true` when the index changed and
11
+ * `false` when the session was already in the requested state. The
12
+ * read-modify-write runs under a cross-process lock and lands with an atomic
13
+ * rename, so two CLIs toggling different sessions cannot drop each other's star.
14
+ */
15
+ export declare function setSessionIdStarred(sessionId: string, starred: boolean, agentDir?: string): Promise<boolean>;
@@ -9,8 +9,19 @@ export interface OutputBlockOptions {
9
9
  lines: string[];
10
10
  }>;
11
11
  width: number;
12
- applyBg?: boolean;
13
12
  }
13
+ /**
14
+ * Render a tool output block as an open rail: a header line, then content hung
15
+ * off a single left rule in the state color. There is no enclosing box and no
16
+ * filled background in any state; the rail color alone carries running/success/error.
17
+ *
18
+ * ```
19
+ * ✓ Bash · 0.4s
20
+ * │ $ bun test
21
+ * ├ Output
22
+ * │ 12 pass
23
+ * ```
24
+ */
14
25
  export declare function renderOutputBlock(options: OutputBlockOptions, theme: Theme): string[];
15
26
  /**
16
27
  * Cached wrapper around `renderOutputBlock`.
@@ -1,5 +1,4 @@
1
- import type { Theme, ThemeBg } from "../modes/theme/theme";
2
- import type { State } from "./types";
1
+ import type { Theme } from "../modes/theme/theme";
3
2
  export { Ellipsis, truncateToWidth } from "@sayknow-cli/tui";
4
3
  /**
5
4
  * Incremental xxHash64 key builder.
@@ -33,4 +32,3 @@ export declare function buildTreePrefix(ancestors: boolean[], theme: Theme): str
33
32
  export declare function getTreeBranch(isLast: boolean, theme: Theme): string;
34
33
  export declare function getTreeContinuePrefix(isLast: boolean, theme: Theme): string;
35
34
  export declare function padToWidth(text: string, width: number, bgFn?: (s: string) => string): string;
36
- export declare function getStateBgColor(state: State): ThemeBg;
@@ -0,0 +1,6 @@
1
+ /** Start a new regeneration and invalidate every older completion. */
2
+ export declare function beginSessionTitleGeneration(owner: object): number;
3
+ /** Invalidate pending regeneration after a newer session mutation is accepted. */
4
+ export declare function invalidateSessionTitleGeneration(owner: object): void;
5
+ /** Return whether a regeneration still owns the latest generation lease. */
6
+ export declare function isSessionTitleGenerationCurrent(owner: object, generation: number): boolean;
@@ -1,10 +1,19 @@
1
+ import type { AgentMessage } from "@sayknow-cli/agent-core";
1
2
  import { type Api, type Model } from "@sayknow-cli/ai";
2
3
  import type { ModelRegistry } from "../config/model-registry";
3
4
  import type { Settings } from "../config/settings";
4
5
  /**
5
- * Generate a title for a session based on the first user message.
6
+ * Build a bounded conversation digest for title regeneration. Regeneration
7
+ * reads several messages so a throwaway first prompt can be corrected, while
8
+ * the automatic first-message path intentionally uses only its initial input.
9
+ */
10
+ export declare function buildConversationTitleInput(messages: readonly AgentMessage[]): string | undefined;
11
+ /**
12
+ * Generate a title for a session based on the provided user-message input.
13
+ * Automatic titles pass the first user message; regeneration passes a bounded
14
+ * conversation digest.
6
15
  *
7
- * @param firstMessage The first user message
16
+ * @param firstMessage The first user message or bounded conversation digest
8
17
  * @param registry Model registry
9
18
  * @param settings Settings used to resolve the smol role
10
19
  * @param sessionId Optional session id for sticky API key selection
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sayknow-cli/coding-agent",
4
- "version": "0.6.4",
4
+ "version": "0.6.5",
5
5
  "description": "Sayknow-CLI CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://sayknow-cli.com",
7
7
  "author": "jaybeyond",
@@ -54,12 +54,12 @@
54
54
  "@agentclientprotocol/sdk": "1.3.0",
55
55
  "@babel/parser": "^7.29.3",
56
56
  "@mozilla/readability": "^0.6.0",
57
- "@sayknow-cli/stats": "0.6.4",
58
- "@sayknow-cli/agent-core": "0.6.4",
59
- "@sayknow-cli/ai": "0.6.4",
60
- "@sayknow-cli/natives": "0.6.4",
61
- "@sayknow-cli/tui": "0.6.4",
62
- "@sayknow-cli/utils": "0.6.4",
57
+ "@sayknow-cli/stats": "0.6.5",
58
+ "@sayknow-cli/agent-core": "0.6.5",
59
+ "@sayknow-cli/ai": "0.6.5",
60
+ "@sayknow-cli/natives": "0.6.5",
61
+ "@sayknow-cli/tui": "0.6.5",
62
+ "@sayknow-cli/utils": "0.6.5",
63
63
  "@puppeteer/browsers": "^2.13.0",
64
64
  "@types/turndown": "5.0.6",
65
65
  "@xterm/headless": "^6.0.0",
@@ -34,6 +34,10 @@ const LOCKED_EXCLUSIONS: Readonly<Record<string, string>> = {
34
34
  "slash_command:pet": "visual/local-only command, not a user-facing SDK control seam",
35
35
  "slash_command:transcript": "visual/local-only transcript viewer, not a user-facing SDK control seam",
36
36
  "slash_command:sessions": "visual/local-only sessions dashboard, not a user-facing SDK control seam",
37
+ "slash_command:star":
38
+ "local session-discovery metadata command; no SDK operation counterpart or runtime/retention authority",
39
+ "slash_command:unstar":
40
+ "local session-discovery metadata command; no SDK operation counterpart or runtime/retention authority",
37
41
  "slash_command:import-session":
38
42
  "local transcript-file import into a new session; ACP is explicitly disabled and no SDK operation reads caller-selected host paths",
39
43
  "agent_session:constructor": "internal accessor/plumbing, not a user-facing control seam",
@@ -226,6 +230,10 @@ const SEAM_TO_SDK: Readonly<Record<string, string>> = {
226
230
  "agent_session:abortBash": "bash.abort",
227
231
  "agent_session:switchSession": "session.switch",
228
232
  "agent_session:branch": "session.branch",
233
+ // `/fork` opens the user-prompt selector, which commits via
234
+ // `session.branch(entryId)` (selector-controller.ts). Despite the command and
235
+ // keybinding name, it is NOT the exact-state `session.fork` operation.
236
+ "slash_command:fork": "session.branch",
229
237
  "agent_session:handoff": "session.handoff",
230
238
  "agent_session:exportToHtml": "session.export_html",
231
239
  "agent_session:getAvailableModels": "models.list/current",
@@ -3,6 +3,7 @@ import { ProcessTerminal, TUI } from "@sayknow-cli/tui";
3
3
  import { pathIsWithin } from "@sayknow-cli/utils";
4
4
  import { type SessionSelectionResult, SessionSelectorComponent } from "../modes/components/session-selector";
5
5
  import { type SessionInfo, SessionManager } from "../session/session-manager";
6
+ import { setSessionIdStarred } from "../session/session-stars";
6
7
  import { FileSessionStorage } from "../session/session-storage";
7
8
 
8
9
  export async function deleteSessionPickerCandidate(sessionPath: string, explicitSessionDir?: string): Promise<void> {
@@ -43,6 +44,9 @@ export async function selectSession(
43
44
  },
44
45
  SessionManager.inspectSessionTailReadOnly,
45
46
  settle,
47
+ async (session, starred) => {
48
+ await setSessionIdStarred(session.id, starred);
49
+ },
46
50
  );
47
51
  selector.setOnRequestRender(() => ui.requestRender());
48
52
  ui.addChild(selector);
@@ -186,7 +186,7 @@ export const KEYBINDINGS = {
186
186
  description: "Branch from message",
187
187
  },
188
188
  "app.session.resume": {
189
- defaultKeys: [],
189
+ defaultKeys: "alt+r",
190
190
  description: "Resume session",
191
191
  },
192
192
  "app.session.observe": {
@@ -530,7 +530,7 @@ export const SETTINGS_SCHEMA = {
530
530
  // Theme
531
531
  "theme.dark": {
532
532
  type: "string",
533
- default: "blue-octopus",
533
+ default: "ink-octopus",
534
534
  ui: {
535
535
  tab: "appearance",
536
536
  label: "Dark Theme",
@@ -644,13 +644,14 @@ export const SETTINGS_SCHEMA = {
644
644
 
645
645
  "statusLine.separator": {
646
646
  type: "enum",
647
- values: ["powerline", "powerline-thin", "slash", "pipe", "block", "none", "ascii"] as const,
648
- default: "slash",
647
+ values: ["dot", "powerline", "powerline-thin", "slash", "pipe", "block", "none", "ascii"] as const,
648
+ default: "dot",
649
649
  ui: {
650
650
  tab: "appearance",
651
651
  label: "Status Line Separator",
652
652
  description: "Style of separators between segments",
653
653
  options: [
654
+ { value: "dot", label: "Dot", description: "Middle dots on the bare terminal (SKC default)" },
654
655
  { value: "powerline", label: "Powerline", description: "Solid arrows (Nerd Font)" },
655
656
  { value: "powerline-thin", label: "Thin chevron", description: "Thin arrows (Nerd Font)" },
656
657
  { value: "slash", label: "Slash", description: "Forward slashes" },
@@ -287,7 +287,10 @@ export const deMsgs: Record<string, string> = {
287
287
  "Usage: /memory mm history <id>": "Verwendung: /memory mm history <id>",
288
288
  "Usage: /memory mm show <id>": "Verwendung: /memory mm show <id>",
289
289
  "Usage: /move <path>": "Verwendung: /move <Pfad>",
290
- "Usage: /rename <title>": "Verwendung: /rename <Titel>",
290
+ "Nothing to summarize yet — pass a title: /rename <title>":
291
+ "Noch nichts zum Zusammenfassen — gib einen Titel an: /rename <Titel>",
292
+ "Could not generate a session title — pass one: /rename <title>":
293
+ "Sitzungstitel konnte nicht erzeugt werden — gib einen an: /rename <Titel>",
291
294
  "Usage: /ssh add <name> --host <host> [--user <user>] [--port <port>] [--key <keyPath>] [--desc <description>] [--compat] [--scope project|user]":
292
295
  "Verwendung: /ssh add <Name> --host <host> [--user <Benutzer>] [--port <Port>] [--key <Schlüsselpfad>] [--desc <Beschreibung>] [--compat] [--scope project|user]",
293
296
  "Usage: /todo append [<phase>] <task...>": "Verwendung: /todo append [<Phase>] <Aufgabe...>",
@@ -46,6 +46,8 @@ export const deSettings: Record<string, string> = {
46
46
  "set:statusLine.preset:o:custom:d": "Benutzerdefinierte Segmente",
47
47
  "set:statusLine.separator:l": "Statusleisten-Trennzeichen",
48
48
  "set:statusLine.separator:d": "Stil der Trennzeichen zwischen Segmenten",
49
+ "set:statusLine.separator:o:dot:l": "Punkt",
50
+ "set:statusLine.separator:o:dot:d": "Mittelpunkte auf dem Terminalhintergrund (SKC-Standard)",
49
51
  "set:statusLine.separator:o:powerline:d": "Volle Pfeile (Nerd Font)",
50
52
  "set:statusLine.separator:o:powerline-thin:l": "Dünner Chevron",
51
53
  "set:statusLine.separator:o:powerline-thin:d": "Dünne Pfeile (Nerd Font)",