@sayknow-cli/coding-agent 0.6.4 → 0.6.6
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/CHANGELOG.md +35 -1
- package/README.md +2 -2
- package/dist/types/config/keybindings.d.ts +6 -1
- package/dist/types/config/settings-schema.d.ts +7 -3
- package/dist/types/i18n/messages/en.d.ts +5 -14
- package/dist/types/modes/components/session-selector.d.ts +7 -3
- package/dist/types/modes/components/sessions-dashboard.d.ts +2 -1
- package/dist/types/modes/components/user-message-selector.d.ts +5 -2
- package/dist/types/modes/components/user-message.d.ts +3 -1
- package/dist/types/modes/components/welcome.d.ts +34 -14
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +5 -0
- package/dist/types/modes/interactive-mode.d.ts +14 -2
- package/dist/types/modes/theme/defaults/index.d.ts +342 -0
- package/dist/types/modes/theme/theme.d.ts +5 -1
- package/dist/types/modes/types.d.ts +3 -1
- package/dist/types/session/session-manager.d.ts +9 -0
- package/dist/types/session/session-stars.d.ts +15 -0
- package/dist/types/tools/debug.d.ts +2 -2
- package/dist/types/tui/output-block.d.ts +12 -1
- package/dist/types/tui/utils.d.ts +1 -3
- package/dist/types/utils/session-title-generation.d.ts +6 -0
- package/dist/types/utils/title-generator.d.ts +11 -2
- package/package.json +7 -7
- package/scripts/generate-sdk-operation-inventory.ts +8 -0
- package/src/cli/session-picker.ts +4 -0
- package/src/config/keybindings.ts +8 -1
- package/src/config/settings-schema.ts +4 -3
- package/src/i18n/messages/de.messages.ts +4 -1
- package/src/i18n/messages/de.settings.ts +2 -0
- package/src/i18n/messages/de.ts +3 -12
- package/src/i18n/messages/en.ts +5 -14
- package/src/i18n/messages/es.messages.ts +4 -1
- package/src/i18n/messages/es.settings.ts +2 -0
- package/src/i18n/messages/es.ts +3 -12
- package/src/i18n/messages/fr.messages.ts +4 -1
- package/src/i18n/messages/fr.settings.ts +2 -0
- package/src/i18n/messages/fr.ts +3 -12
- package/src/i18n/messages/ja.messages.ts +4 -1
- package/src/i18n/messages/ja.settings.ts +2 -0
- package/src/i18n/messages/ja.ts +3 -12
- package/src/i18n/messages/ko.messages.ts +4 -1
- package/src/i18n/messages/ko.settings.ts +2 -0
- package/src/i18n/messages/ko.ts +4 -13
- package/src/i18n/messages/zh.messages.ts +2 -1
- package/src/i18n/messages/zh.settings.ts +2 -0
- package/src/i18n/messages/zh.ts +3 -12
- package/src/internal-urls/docs-index.generated.ts +10 -10
- package/src/lsp/render.ts +0 -1
- package/src/modes/action-registry.ts +1 -0
- package/src/modes/components/session-selector.ts +71 -21
- package/src/modes/components/sessions-dashboard.ts +8 -5
- package/src/modes/components/settings-selector.ts +1 -0
- package/src/modes/components/status-line/presets.ts +5 -5
- package/src/modes/components/status-line/separators.ts +4 -0
- package/src/modes/components/tool-execution.ts +6 -19
- package/src/modes/components/tool-status-header.ts +103 -12
- package/src/modes/components/user-message-selector.ts +57 -15
- package/src/modes/components/user-message.ts +25 -15
- package/src/modes/components/welcome.ts +298 -576
- package/src/modes/controllers/command-controller.ts +56 -7
- package/src/modes/controllers/input-controller.ts +17 -0
- package/src/modes/controllers/selector-controller.ts +91 -10
- package/src/modes/interactive-mode.ts +85 -38
- package/src/modes/theme/defaults/glow-octopus.json +114 -0
- package/src/modes/theme/defaults/index.ts +6 -0
- package/src/modes/theme/defaults/ink-octopus.json +114 -0
- package/src/modes/theme/defaults/violet-octopus.json +114 -0
- package/src/modes/theme/theme.ts +18 -2
- package/src/modes/types.ts +3 -1
- package/src/prompts/system/title-system.md +1 -1
- package/src/sdk/protocol/operation-inventory.generated.json +40 -0
- package/src/session/agent-session.ts +12 -0
- package/src/session/internal/managed-session-scope.ts +10 -0
- package/src/session/session-manager.ts +26 -1
- package/src/session/session-stars.ts +104 -0
- package/src/slash-commands/builtin-registry.ts +104 -4
- package/src/tools/debug.ts +0 -1
- package/src/tools/fetch.ts +0 -1
- package/src/tui/output-block.ts +29 -61
- package/src/tui/utils.ts +1 -8
- package/src/utils/session-title-generation.ts +29 -0
- 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
|
|
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>;
|
|
@@ -286,6 +286,8 @@ export interface InteractiveModeContext {
|
|
|
286
286
|
showUserMessageSelector(): void;
|
|
287
287
|
showTreeSelector(): void;
|
|
288
288
|
showSessionSelector(): void;
|
|
289
|
+
/** Resume the most recent saved session other than this one (the launch card's first row). */
|
|
290
|
+
continueRecentSession(): Promise<void>;
|
|
289
291
|
showSessionsDashboard(): void;
|
|
290
292
|
handleResumeSession(sessionPath: string, options?: {
|
|
291
293
|
requireIdle?: boolean;
|
|
@@ -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>;
|
|
@@ -8,6 +8,7 @@ import type { OutputMeta } from "./output-meta";
|
|
|
8
8
|
declare const debugSchema: z.ZodObject<{
|
|
9
9
|
action: z.ZodEnum<{
|
|
10
10
|
output: "output";
|
|
11
|
+
sessions: "sessions";
|
|
11
12
|
pause: "pause";
|
|
12
13
|
scopes: "scopes";
|
|
13
14
|
variables: "variables";
|
|
@@ -34,7 +35,6 @@ declare const debugSchema: z.ZodObject<{
|
|
|
34
35
|
loaded_sources: "loaded_sources";
|
|
35
36
|
custom_request: "custom_request";
|
|
36
37
|
terminate: "terminate";
|
|
37
|
-
sessions: "sessions";
|
|
38
38
|
}>;
|
|
39
39
|
program: z.ZodOptional<z.ZodString>;
|
|
40
40
|
args: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -131,6 +131,7 @@ export declare class DebugTool implements AgentTool<typeof debugSchema, DebugToo
|
|
|
131
131
|
readonly parameters: z.ZodObject<{
|
|
132
132
|
action: z.ZodEnum<{
|
|
133
133
|
output: "output";
|
|
134
|
+
sessions: "sessions";
|
|
134
135
|
pause: "pause";
|
|
135
136
|
scopes: "scopes";
|
|
136
137
|
variables: "variables";
|
|
@@ -157,7 +158,6 @@ export declare class DebugTool implements AgentTool<typeof debugSchema, DebugToo
|
|
|
157
158
|
loaded_sources: "loaded_sources";
|
|
158
159
|
custom_request: "custom_request";
|
|
159
160
|
terminate: "terminate";
|
|
160
|
-
sessions: "sessions";
|
|
161
161
|
}>;
|
|
162
162
|
program: z.ZodOptional<z.ZodString>;
|
|
163
163
|
args: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
@@ -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
|
|
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
|
-
*
|
|
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
|
+
"version": "0.6.6",
|
|
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.
|
|
58
|
-
"@sayknow-cli/agent-core": "0.6.
|
|
59
|
-
"@sayknow-cli/ai": "0.6.
|
|
60
|
-
"@sayknow-cli/natives": "0.6.
|
|
61
|
-
"@sayknow-cli/tui": "0.6.
|
|
62
|
-
"@sayknow-cli/utils": "0.6.
|
|
57
|
+
"@sayknow-cli/stats": "0.6.6",
|
|
58
|
+
"@sayknow-cli/agent-core": "0.6.6",
|
|
59
|
+
"@sayknow-cli/ai": "0.6.6",
|
|
60
|
+
"@sayknow-cli/natives": "0.6.6",
|
|
61
|
+
"@sayknow-cli/tui": "0.6.6",
|
|
62
|
+
"@sayknow-cli/utils": "0.6.6",
|
|
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);
|
|
@@ -43,6 +43,7 @@ interface AppKeybindings {
|
|
|
43
43
|
"app.session.tree": true;
|
|
44
44
|
"app.session.fork": true;
|
|
45
45
|
"app.session.resume": true;
|
|
46
|
+
"app.session.continue": true;
|
|
46
47
|
"app.session.observe": true;
|
|
47
48
|
"app.session.dashboard": true;
|
|
48
49
|
"app.jobs.open": true;
|
|
@@ -186,9 +187,15 @@ export const KEYBINDINGS = {
|
|
|
186
187
|
description: "Branch from message",
|
|
187
188
|
},
|
|
188
189
|
"app.session.resume": {
|
|
189
|
-
defaultKeys:
|
|
190
|
+
defaultKeys: "alt+r",
|
|
190
191
|
description: "Resume session",
|
|
191
192
|
},
|
|
193
|
+
// A Control chord on purpose: macOS terminals often turn Option into composed text,
|
|
194
|
+
// and continuing the last session is the one launch action that must always work.
|
|
195
|
+
"app.session.continue": {
|
|
196
|
+
defaultKeys: "ctrl+q",
|
|
197
|
+
description: "Continue the most recent session",
|
|
198
|
+
},
|
|
192
199
|
"app.session.observe": {
|
|
193
200
|
defaultKeys: "ctrl+s",
|
|
194
201
|
description: "Observe subagent sessions",
|