@staff0rd/assist 0.772.0 → 0.773.1

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/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import { Command } from "commander";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "@staff0rd/assist",
9
- version: "0.772.0",
9
+ version: "0.773.1",
10
10
  type: "module",
11
11
  main: "dist/index.js",
12
12
  bin: {
@@ -563,7 +563,7 @@ function stripLegacyConfigKeys(config) {
563
563
  }
564
564
 
565
565
  // src/shared/types.ts
566
- import { z as z4 } from "zod";
566
+ import { z as z5 } from "zod";
567
567
 
568
568
  // src/shared/adviceFragmentNames.ts
569
569
  var adviceFragmentTitles = {
@@ -601,47 +601,185 @@ var adviceFragmentNames = [
601
601
  "verify"
602
602
  ];
603
603
 
604
- // src/shared/runConfigSchema.ts
604
+ // src/shared/hotkeys/hotkeysSchema.ts
605
605
  import { z } from "zod";
606
- var runParamSchema = z.strictObject({
607
- name: z.string(),
608
- required: z.boolean().optional(),
609
- default: z.string().optional(),
610
- description: z.string().optional()
606
+
607
+ // src/shared/hotkeys/hotkeyKeyCode.ts
608
+ var PUNCTUATION_CODES = {
609
+ "/": "Slash",
610
+ ".": "Period",
611
+ ",": "Comma",
612
+ ";": "Semicolon",
613
+ "'": "Quote",
614
+ "[": "BracketLeft",
615
+ "]": "BracketRight",
616
+ "\\": "Backslash",
617
+ "-": "Minus",
618
+ "=": "Equal",
619
+ "`": "Backquote"
620
+ };
621
+ var NAMED_KEYS = [
622
+ "Enter",
623
+ "Space",
624
+ "Escape",
625
+ "Backspace",
626
+ "Delete",
627
+ "Insert",
628
+ "Home",
629
+ "End",
630
+ "PageUp",
631
+ "PageDown",
632
+ "ArrowUp",
633
+ "ArrowDown",
634
+ "ArrowLeft",
635
+ "ArrowRight"
636
+ ];
637
+ function hotkeyKeyCode(token) {
638
+ if (/^[a-z]$/i.test(token)) {
639
+ const label2 = token.toUpperCase();
640
+ return { code: `Key${label2}`, label: label2 };
641
+ }
642
+ if (/^\d$/.test(token)) return { code: `Digit${token}`, label: token };
643
+ const punctuation = PUNCTUATION_CODES[token];
644
+ if (punctuation) return { code: punctuation, label: token };
645
+ if (/^F([1-9]|1[0-2])$/i.test(token)) {
646
+ const label2 = token.toUpperCase();
647
+ return { code: label2, label: label2 };
648
+ }
649
+ const named = NAMED_KEYS.find(
650
+ (name) => name.toLowerCase() === token.toLowerCase()
651
+ );
652
+ return named ? { code: named, label: named } : void 0;
653
+ }
654
+
655
+ // src/shared/hotkeys/parseModifiers.ts
656
+ var MODIFIER_ALIASES = {
657
+ mod: "Mod",
658
+ ctrl: "Ctrl",
659
+ control: "Ctrl",
660
+ alt: "Alt",
661
+ option: "Alt",
662
+ opt: "Alt",
663
+ shift: "Shift",
664
+ meta: "Meta",
665
+ cmd: "Meta",
666
+ command: "Meta",
667
+ win: "Meta"
668
+ };
669
+ var MODIFIER_ORDER = [
670
+ "Mod",
671
+ "Ctrl",
672
+ "Alt",
673
+ "Shift",
674
+ "Meta"
675
+ ];
676
+ function parseModifiers(tokens, text17) {
677
+ const modifiers = /* @__PURE__ */ new Set();
678
+ for (const token of tokens) {
679
+ const modifier = MODIFIER_ALIASES[token.toLowerCase()];
680
+ if (!modifier)
681
+ return { ok: false, error: `"${token}" is not a modifier in "${text17}"` };
682
+ if (modifiers.has(modifier))
683
+ return { ok: false, error: `"${token}" is repeated in "${text17}"` };
684
+ modifiers.add(modifier);
685
+ }
686
+ if (![...modifiers].some((modifier) => modifier !== "Shift"))
687
+ return {
688
+ ok: false,
689
+ error: `"${text17}" needs at least one of Mod, Ctrl, Alt or Meta`
690
+ };
691
+ if (modifiers.has("Mod") && (modifiers.has("Ctrl") || modifiers.has("Meta")))
692
+ return {
693
+ ok: false,
694
+ error: `"${text17}" combines Mod with Ctrl or Meta, which Mod already means`
695
+ };
696
+ return {
697
+ ok: true,
698
+ modifiers: MODIFIER_ORDER.filter((modifier) => modifiers.has(modifier))
699
+ };
700
+ }
701
+
702
+ // src/shared/hotkeys/parseChord.ts
703
+ function parseChord(text17, { modifiersOnly = false } = {}) {
704
+ const tokens = text17.split("+").map((token) => token.trim());
705
+ const keyToken = modifiersOnly ? void 0 : tokens.pop();
706
+ const parsed = parseModifiers(tokens, text17);
707
+ if (!parsed.ok) return parsed;
708
+ const { modifiers } = parsed;
709
+ if (keyToken === void 0) return { ok: true, chord: { modifiers } };
710
+ const key = hotkeyKeyCode(keyToken);
711
+ if (!key)
712
+ return { ok: false, error: `"${keyToken}" is not a key in "${text17}"` };
713
+ return { ok: true, chord: { modifiers, key } };
714
+ }
715
+
716
+ // src/shared/hotkeys/hotkeysSchema.ts
717
+ function chordSchema(modifiersOnly) {
718
+ return z.string().superRefine((value, ctx) => {
719
+ const parsed = parseChord(value, { modifiersOnly });
720
+ if (!parsed.ok) ctx.addIssue({ code: "custom", message: parsed.error });
721
+ });
722
+ }
723
+ var keyChord = chordSchema(false).optional();
724
+ var hotkeysSchema = z.strictObject({
725
+ navTab: chordSchema(true).optional(),
726
+ focusSidebar: keyChord,
727
+ focusTerminal: keyChord,
728
+ toggleDiff: keyChord,
729
+ focusRepoPicker: keyChord,
730
+ openConfig: keyChord,
731
+ openMenu: keyChord,
732
+ focusAddAgent: keyChord,
733
+ focusVsCode: keyChord,
734
+ focusDone: keyChord,
735
+ nextWaiting: keyChord,
736
+ newSession: keyChord,
737
+ quickOpen: keyChord,
738
+ save: keyChord,
739
+ shortcutsSheet: keyChord
611
740
  });
612
- var runConfigSchema = z.strictObject({
613
- name: z.string(),
614
- command: z.string(),
615
- args: z.array(z.string()).optional(),
616
- params: z.array(runParamSchema).optional(),
617
- env: z.record(z.string(), z.string()).optional(),
618
- filter: z.string().optional(),
619
- pre: z.array(z.string()).optional(),
620
- cwd: z.string().optional(),
621
- quiet: z.boolean().optional(),
622
- server: z.union([z.boolean(), z.string().min(1)]).optional(),
623
- port: z.number().optional()
741
+
742
+ // src/shared/runConfigSchema.ts
743
+ import { z as z2 } from "zod";
744
+ var runParamSchema = z2.strictObject({
745
+ name: z2.string(),
746
+ required: z2.boolean().optional(),
747
+ default: z2.string().optional(),
748
+ description: z2.string().optional()
749
+ });
750
+ var runConfigSchema = z2.strictObject({
751
+ name: z2.string(),
752
+ command: z2.string(),
753
+ args: z2.array(z2.string()).optional(),
754
+ params: z2.array(runParamSchema).optional(),
755
+ env: z2.record(z2.string(), z2.string()).optional(),
756
+ filter: z2.string().optional(),
757
+ pre: z2.array(z2.string()).optional(),
758
+ cwd: z2.string().optional(),
759
+ quiet: z2.boolean().optional(),
760
+ server: z2.union([z2.boolean(), z2.string().min(1)]).optional(),
761
+ port: z2.number().optional()
624
762
  });
625
- var runLinkSchema = z.strictObject({
626
- link: z.string(),
627
- prefix: z.string()
763
+ var runLinkSchema = z2.strictObject({
764
+ link: z2.string(),
765
+ prefix: z2.string()
628
766
  });
629
767
 
630
768
  // src/shared/secretConfigValue.ts
631
- import { z as z2 } from "zod";
769
+ import { z as z3 } from "zod";
632
770
  var SECRET_META_KEY = "assistSecret";
633
771
  function secretConfigValue(schema2) {
634
772
  return schema2.meta({ [SECRET_META_KEY]: true });
635
773
  }
636
774
  function isSecretSchemaNode(node) {
637
- const meta = z2.globalRegistry.get(node);
775
+ const meta = z3.globalRegistry.get(node);
638
776
  return meta?.[SECRET_META_KEY] === true;
639
777
  }
640
778
 
641
779
  // src/shared/sessionLinkSchema.ts
642
- import { z as z3 } from "zod";
780
+ import { z as z4 } from "zod";
643
781
  var SSH_LINK_RETIRED = "ssh links are no longer supported; relink with `assist sessions nodes link <name> --tailscale <host> --port <port>`";
644
- var sessionLinkSchema = z3.preprocess(
782
+ var sessionLinkSchema = z4.preprocess(
645
783
  (link3, ctx) => {
646
784
  if (link3 && typeof link3 === "object" && "ssh" in link3)
647
785
  ctx.issues.push({
@@ -651,260 +789,261 @@ var sessionLinkSchema = z3.preprocess(
651
789
  });
652
790
  return link3;
653
791
  },
654
- z3.strictObject({ name: z3.string(), url: z3.string() })
792
+ z4.strictObject({ name: z4.string(), url: z4.string() })
655
793
  );
656
794
 
657
795
  // src/shared/types.ts
658
- var transcriptConfigSchema = z4.strictObject({
659
- vttDir: z4.string(),
660
- transcriptsDir: z4.string(),
661
- summaryDir: z4.string()
796
+ var transcriptConfigSchema = z5.strictObject({
797
+ vttDir: z5.string(),
798
+ transcriptsDir: z5.string(),
799
+ summaryDir: z5.string()
662
800
  });
663
- var miroExtractSchema = z4.strictObject({
664
- board: z4.string().optional(),
665
- frame: z4.string().optional(),
666
- topLeft: z4.string(),
667
- bottomRight: z4.string(),
668
- items: z4.string(),
669
- ignore: z4.string().optional(),
670
- out: z4.string().optional()
801
+ var miroExtractSchema = z5.strictObject({
802
+ board: z5.string().optional(),
803
+ frame: z5.string().optional(),
804
+ topLeft: z5.string(),
805
+ bottomRight: z5.string(),
806
+ items: z5.string(),
807
+ ignore: z5.string().optional(),
808
+ out: z5.string().optional()
671
809
  });
672
810
  var DEFAULT_BACKUP_DIR = "~/.assist/backups";
673
811
  var DEFAULT_CLONE_DIR = "~/git";
674
812
  var assistConfigShape = {
675
- advice: z4.strictObject({
676
- sections: z4.partialRecord(z4.enum(adviceFragmentNames), z4.boolean()).default({}),
677
- extra: z4.string().optional(),
678
- verify: z4.string().optional()
813
+ advice: z5.strictObject({
814
+ sections: z5.partialRecord(z5.enum(adviceFragmentNames), z5.boolean()).default({}),
815
+ extra: z5.string().optional(),
816
+ verify: z5.string().optional()
679
817
  }).optional(),
680
- backlog: z4.strictObject({
681
- previewComments: z4.boolean().default(false)
818
+ backlog: z5.strictObject({
819
+ previewComments: z5.boolean().default(false)
682
820
  }).optional(),
683
- backup: z4.strictObject({
684
- dir: z4.string().default(DEFAULT_BACKUP_DIR)
821
+ backup: z5.strictObject({
822
+ dir: z5.string().default(DEFAULT_BACKUP_DIR)
685
823
  }).default({ dir: DEFAULT_BACKUP_DIR }),
686
- clone: z4.strictObject({
687
- baseDir: z4.string().default(DEFAULT_CLONE_DIR)
824
+ clone: z5.strictObject({
825
+ baseDir: z5.string().default(DEFAULT_CLONE_DIR)
688
826
  }).default({ baseDir: DEFAULT_CLONE_DIR }),
689
- commit: z4.strictObject({
690
- conventional: z4.boolean().default(false),
691
- pull: z4.boolean().default(false),
692
- push: z4.boolean().default(false),
693
- expectedBranch: z4.string().optional()
827
+ commit: z5.strictObject({
828
+ conventional: z5.boolean().default(false),
829
+ pull: z5.boolean().default(false),
830
+ push: z5.boolean().default(false),
831
+ expectedBranch: z5.string().optional()
694
832
  }).default({ conventional: false, pull: false, push: false }),
695
- branch: z4.strictObject({
696
- prefix: z4.string().optional(),
697
- defaultBranch: z4.string().optional()
833
+ branch: z5.strictObject({
834
+ prefix: z5.string().optional(),
835
+ defaultBranch: z5.string().optional()
698
836
  }).optional(),
699
- devlog: z4.strictObject({
700
- name: z4.string().optional(),
701
- ignore: z4.array(z4.string()).optional(),
702
- skip: z4.record(z4.string(), z4.array(z4.string())).optional()
837
+ devlog: z5.strictObject({
838
+ name: z5.string().optional(),
839
+ ignore: z5.array(z5.string()).optional(),
840
+ skip: z5.record(z5.string(), z5.array(z5.string())).optional()
703
841
  }).optional(),
704
- notify: z4.strictObject({
705
- enabled: z4.boolean().default(true)
842
+ notify: z5.strictObject({
843
+ enabled: z5.boolean().default(true)
706
844
  }).default({ enabled: true }),
707
- complexity: z4.strictObject({
708
- ignore: z4.array(z4.string()).default(["**/*test.ts*"])
845
+ complexity: z5.strictObject({
846
+ ignore: z5.array(z5.string()).default(["**/*test.ts*"])
709
847
  }).default({ ignore: ["**/*test.ts*"] }),
710
- hardcodedColors: z4.strictObject({
711
- ignore: z4.array(z4.string()).default([])
848
+ hardcodedColors: z5.strictObject({
849
+ ignore: z5.array(z5.string()).default([])
712
850
  }).optional(),
713
- blockCodeComments: z4.strictObject({
714
- ignore: z4.array(z4.string()).default([])
851
+ blockCodeComments: z5.strictObject({
852
+ ignore: z5.array(z5.string()).default([])
715
853
  }).optional(),
716
- restructure: z4.strictObject({
717
- ignore: z4.array(z4.string()).default([]),
718
- pin: z4.array(z4.string()).default([]),
719
- maxDepth: z4.number().int().positive().default(10)
854
+ restructure: z5.strictObject({
855
+ ignore: z5.array(z5.string()).default([]),
856
+ pin: z5.array(z5.string()).default([]),
857
+ maxDepth: z5.number().int().positive().default(10)
720
858
  }).optional(),
721
- jira: z4.strictObject({
722
- acField: z4.string().default("customfield_11937")
859
+ jira: z5.strictObject({
860
+ acField: z5.string().default("customfield_11937")
723
861
  }).optional(),
724
- roam: z4.strictObject({
725
- clientId: secretConfigValue(z4.string()),
726
- clientSecret: secretConfigValue(z4.string()),
727
- accessToken: secretConfigValue(z4.string()).optional(),
728
- refreshToken: secretConfigValue(z4.string()).optional(),
729
- tokenExpiresAt: z4.number().optional()
862
+ roam: z5.strictObject({
863
+ clientId: secretConfigValue(z5.string()),
864
+ clientSecret: secretConfigValue(z5.string()),
865
+ accessToken: secretConfigValue(z5.string()).optional(),
866
+ refreshToken: secretConfigValue(z5.string()).optional(),
867
+ tokenExpiresAt: z5.number().optional()
730
868
  }).optional(),
731
- slack: z4.strictObject({
732
- channel: z4.string().optional()
869
+ slack: z5.strictObject({
870
+ channel: z5.string().optional()
733
871
  }).optional(),
734
- prs: z4.strictObject({
735
- slack: z4.string().optional(),
736
- required: z4.boolean().default(true),
737
- promptJira: z4.boolean().default(false),
738
- promptGithub: z4.boolean().default(false),
739
- draft: z4.boolean().default(false),
740
- readingWordsPerMinute: z4.number().int().positive().optional()
872
+ prs: z5.strictObject({
873
+ slack: z5.string().optional(),
874
+ required: z5.boolean().default(true),
875
+ promptJira: z5.boolean().default(false),
876
+ promptGithub: z5.boolean().default(false),
877
+ draft: z5.boolean().default(false),
878
+ readingWordsPerMinute: z5.number().int().positive().optional()
741
879
  }).optional(),
742
- review: z4.strictObject({
743
- codexModel: z4.string().optional(),
744
- highLevel: z4.strictObject({
745
- criticalPaths: z4.array(z4.string()).default([]),
746
- uiPaths: z4.array(z4.string()).default([]),
747
- descriptionWordCap: z4.number().int().positive().default(300)
880
+ review: z5.strictObject({
881
+ codexModel: z5.string().optional(),
882
+ highLevel: z5.strictObject({
883
+ criticalPaths: z5.array(z5.string()).default([]),
884
+ uiPaths: z5.array(z5.string()).default([]),
885
+ descriptionWordCap: z5.number().int().positive().default(300)
748
886
  }).optional()
749
887
  }).optional(),
750
- readTime: z4.strictObject({
751
- wordsPerMinute: z4.number().int().positive().default(200)
888
+ readTime: z5.strictObject({
889
+ wordsPerMinute: z5.number().int().positive().default(200)
752
890
  }).optional(),
753
- releases: z4.strictObject({
754
- streams: z4.array(
755
- z4.strictObject({
756
- name: z4.string(),
757
- repo: z4.string(),
758
- workflow: z4.string(),
759
- nodes: z4.array(
760
- z4.strictObject({
761
- id: z4.string(),
762
- environment: z4.string().optional(),
763
- kind: z4.enum(["build", "gate"]).optional(),
764
- label: z4.string().optional()
891
+ releases: z5.strictObject({
892
+ streams: z5.array(
893
+ z5.strictObject({
894
+ name: z5.string(),
895
+ repo: z5.string(),
896
+ workflow: z5.string(),
897
+ nodes: z5.array(
898
+ z5.strictObject({
899
+ id: z5.string(),
900
+ environment: z5.string().optional(),
901
+ kind: z5.enum(["build", "gate"]).optional(),
902
+ label: z5.string().optional()
765
903
  })
766
904
  ),
767
- edges: z4.array(z4.tuple([z4.string(), z4.string()])).default([])
905
+ edges: z5.array(z5.tuple([z5.string(), z5.string()])).default([])
768
906
  })
769
907
  ).default([])
770
908
  }).optional(),
771
- worktree: z4.strictObject({
772
- enabled: z4.boolean().default(false),
773
- watcher: z4.boolean().default(false),
774
- trunk: z4.boolean().default(false),
775
- includeDrafts: z4.boolean().default(false),
776
- root: z4.string().optional(),
777
- install: z4.union([z4.boolean(), z4.string(), z4.array(z4.string())]).default(true),
778
- commitBeforeManualChecks: z4.boolean().default(false),
779
- commitBeforePhaseEnd: z4.boolean().optional(),
780
- copy: z4.array(z4.string()).default([
909
+ worktree: z5.strictObject({
910
+ enabled: z5.boolean().default(false),
911
+ watcher: z5.boolean().default(false),
912
+ trunk: z5.boolean().default(false),
913
+ includeDrafts: z5.boolean().default(false),
914
+ root: z5.string().optional(),
915
+ install: z5.union([z5.boolean(), z5.string(), z5.array(z5.string())]).default(true),
916
+ commitBeforeManualChecks: z5.boolean().default(false),
917
+ commitBeforePhaseEnd: z5.boolean().optional(),
918
+ copy: z5.array(z5.string()).default([
781
919
  ".env",
782
920
  "settings.local.json",
783
921
  ".claude/settings.local.json"
784
922
  ])
785
923
  }).optional(),
786
- run: z4.array(z4.union([runConfigSchema, runLinkSchema])).optional(),
787
- subtasks: z4.array(
788
- z4.strictObject({
789
- title: z4.string(),
790
- description: z4.string().optional()
924
+ run: z5.array(z5.union([runConfigSchema, runLinkSchema])).optional(),
925
+ subtasks: z5.array(
926
+ z5.strictObject({
927
+ title: z5.string(),
928
+ description: z5.string().optional()
791
929
  })
792
930
  ).optional(),
793
931
  transcript: transcriptConfigSchema.optional(),
794
- cliReadVerbs: z4.record(z4.string(), z4.array(z4.string())).optional(),
795
- cliHook: z4.strictObject({
796
- blockNpmRun: z4.boolean().default(true)
932
+ cliReadVerbs: z5.record(z5.string(), z5.array(z5.string())).optional(),
933
+ cliHook: z5.strictObject({
934
+ blockNpmRun: z5.boolean().default(true)
797
935
  }).optional(),
798
- dotnet: z4.strictObject({
799
- inspect: z4.strictObject({
800
- suppress: z4.array(z4.string()).default([])
936
+ dotnet: z5.strictObject({
937
+ inspect: z5.strictObject({
938
+ suppress: z5.array(z5.string()).default([])
801
939
  }).default({ suppress: [] })
802
940
  }).optional(),
803
- litellm: z4.strictObject({
804
- baseUrl: z4.string().optional(),
805
- apiKey: secretConfigValue(z4.string()).optional()
941
+ litellm: z5.strictObject({
942
+ baseUrl: z5.string().optional(),
943
+ apiKey: secretConfigValue(z5.string()).optional()
806
944
  }).optional(),
807
- ravendb: z4.strictObject({
808
- connections: z4.array(
809
- z4.strictObject({
810
- name: z4.string(),
811
- url: z4.string(),
812
- database: z4.string(),
813
- apiKeyRef: z4.string()
945
+ ravendb: z5.strictObject({
946
+ connections: z5.array(
947
+ z5.strictObject({
948
+ name: z5.string(),
949
+ url: z5.string(),
950
+ database: z5.string(),
951
+ apiKeyRef: z5.string()
814
952
  })
815
953
  ).default([]),
816
- defaultConnection: z4.string().optional()
954
+ defaultConnection: z5.string().optional()
817
955
  }).optional(),
818
- seq: z4.strictObject({
819
- connections: z4.array(
820
- z4.strictObject({
821
- name: z4.string(),
822
- url: z4.string(),
823
- apiToken: secretConfigValue(z4.string())
956
+ seq: z5.strictObject({
957
+ connections: z5.array(
958
+ z5.strictObject({
959
+ name: z5.string(),
960
+ url: z5.string(),
961
+ apiToken: secretConfigValue(z5.string())
824
962
  })
825
963
  ).default([]),
826
- defaultConnection: z4.string().optional()
964
+ defaultConnection: z5.string().optional()
827
965
  }).optional(),
828
- sql: z4.strictObject({
829
- connections: z4.array(
830
- z4.strictObject({
831
- name: z4.string(),
832
- server: z4.string(),
833
- port: z4.number(),
834
- user: z4.string(),
835
- password: secretConfigValue(z4.string()),
836
- database: z4.string()
966
+ sql: z5.strictObject({
967
+ connections: z5.array(
968
+ z5.strictObject({
969
+ name: z5.string(),
970
+ server: z5.string(),
971
+ port: z5.number(),
972
+ user: z5.string(),
973
+ password: secretConfigValue(z5.string()),
974
+ database: z5.string()
837
975
  })
838
976
  ).default([]),
839
- defaultConnection: z4.string().optional()
977
+ defaultConnection: z5.string().optional()
840
978
  }).optional(),
841
- screenshot: z4.strictObject({
842
- outputDir: z4.string().default("./screenshots")
979
+ screenshot: z5.strictObject({
980
+ outputDir: z5.string().default("./screenshots")
843
981
  }).default({ outputDir: "./screenshots" }),
844
- sessions: z4.strictObject({
845
- nodeName: z4.string().optional(),
846
- links: z4.array(sessionLinkSchema).optional(),
847
- linkVersionCheck: z4.enum(["block", "warn", "off"]).default("block"),
848
- tailscaleServe: z4.boolean().default(true),
849
- includeCommittedChanges: z4.boolean().default(true),
850
- topBar: z4.boolean().default(true),
851
- floatWaiting: z4.boolean().default(true),
852
- floatWaitingAfterMs: z4.number().default(5e3),
853
- maxLive: z4.number().default(24),
854
- newSessionMode: z4.enum(["draft", "bug", "prompt", "design"]).default("draft")
982
+ sessions: z5.strictObject({
983
+ nodeName: z5.string().optional(),
984
+ links: z5.array(sessionLinkSchema).optional(),
985
+ linkVersionCheck: z5.enum(["block", "warn", "off"]).default("block"),
986
+ tailscaleServe: z5.boolean().default(true),
987
+ includeCommittedChanges: z5.boolean().default(true),
988
+ topBar: z5.boolean().default(true),
989
+ floatWaiting: z5.boolean().default(true),
990
+ floatWaitingAfterMs: z5.number().default(5e3),
991
+ maxLive: z5.number().default(24),
992
+ newSessionMode: z5.enum(["draft", "bug", "prompt", "design"]).default("draft"),
993
+ hotkeys: hotkeysSchema.optional()
855
994
  }).optional(),
856
- database: z4.strictObject({
857
- url: secretConfigValue(z4.string()).optional()
995
+ database: z5.strictObject({
996
+ url: secretConfigValue(z5.string()).optional()
858
997
  }).default({}),
859
- mermaid: z4.strictObject({
860
- krokiUrl: z4.string().default("https://kroki.io")
998
+ mermaid: z5.strictObject({
999
+ krokiUrl: z5.string().default("https://kroki.io")
861
1000
  }).default({ krokiUrl: "https://kroki.io" }),
862
- miro: z4.strictObject({
863
- extracts: z4.record(z4.string(), miroExtractSchema).optional()
1001
+ miro: z5.strictObject({
1002
+ extracts: z5.record(z5.string(), miroExtractSchema).optional()
864
1003
  }).optional(),
865
- news: z4.strictObject({
866
- showInNav: z4.boolean().default(false)
1004
+ news: z5.strictObject({
1005
+ showInNav: z5.boolean().default(false)
867
1006
  }).optional(),
868
- next: z4.strictObject({
869
- peers: z4.array(z4.string()).optional(),
870
- repos: z4.array(z4.string()).optional(),
871
- projects: z4.array(
872
- z4.string().regex(
1007
+ next: z5.strictObject({
1008
+ peers: z5.array(z5.string()).optional(),
1009
+ repos: z5.array(z5.string()).optional(),
1010
+ projects: z5.array(
1011
+ z5.string().regex(
873
1012
  /^[^/\s]+\/\d+$/,
874
1013
  "Use <owner>/<project number>, e.g. my-org/3"
875
1014
  )
876
1015
  ).optional(),
877
- pickStatuses: z4.array(z4.string()).optional(),
878
- excludeLabels: z4.array(z4.string()).optional(),
879
- excludeTypes: z4.array(z4.string()).optional()
1016
+ pickStatuses: z5.array(z5.string()).optional(),
1017
+ excludeLabels: z5.array(z5.string()).optional(),
1018
+ excludeTypes: z5.array(z5.string()).optional()
880
1019
  }).optional(),
881
- deny: z4.array(
882
- z4.strictObject({
883
- pattern: z4.string(),
884
- message: z4.string()
1020
+ deny: z5.array(
1021
+ z5.strictObject({
1022
+ pattern: z5.string(),
1023
+ message: z5.string()
885
1024
  })
886
1025
  ).optional(),
887
- forbiddenStrings: z4.array(
888
- z4.strictObject({
889
- file: z4.string(),
890
- paths: z4.array(z4.string()),
891
- disallowed: z4.string()
1026
+ forbiddenStrings: z5.array(
1027
+ z5.strictObject({
1028
+ file: z5.string(),
1029
+ paths: z5.array(z5.string()),
1030
+ disallowed: z5.string()
892
1031
  })
893
1032
  ).optional(),
894
- sync: z4.strictObject({
895
- autoConfirm: z4.boolean().default(false)
1033
+ sync: z5.strictObject({
1034
+ autoConfirm: z5.boolean().default(false)
896
1035
  }).default({ autoConfirm: false }),
897
- harness: z4.strictObject({
898
- engine: z4.enum(["claude", "codex", "pi"]).default("claude"),
899
- exposeCodexActions: z4.boolean().optional(),
900
- exposePiActions: z4.boolean().optional(),
901
- codexModel: z4.string().optional()
1036
+ harness: z5.strictObject({
1037
+ engine: z5.enum(["claude", "codex", "pi"]).default("claude"),
1038
+ exposeCodexActions: z5.boolean().optional(),
1039
+ exposePiActions: z5.boolean().optional(),
1040
+ codexModel: z5.string().optional()
902
1041
  }).default({ engine: "claude" })
903
1042
  };
904
- var repoConfigSchema = z4.strictObject(assistConfigShape).partial();
905
- var assistConfigSchema = z4.strictObject({
1043
+ var repoConfigSchema = z5.strictObject(assistConfigShape).partial();
1044
+ var assistConfigSchema = z5.strictObject({
906
1045
  ...assistConfigShape,
907
- repos: z4.record(z4.string(), repoConfigSchema).optional()
1046
+ repos: z5.record(z5.string(), repoConfigSchema).optional()
908
1047
  });
909
1048
 
910
1049
  // src/shared/loadConfigFrom.ts
@@ -5085,52 +5224,52 @@ async function loadAllItems(orm, origin) {
5085
5224
  import { readFileSync as readFileSync13 } from "fs";
5086
5225
 
5087
5226
  // src/commands/backlog/types.ts
5088
- import { z as z5 } from "zod";
5089
- var backlogStatusSchema = z5.enum(["todo", "in-progress", "done", "wontdo"]);
5090
- var backlogTypeSchema = z5.enum(["story", "bug"]);
5091
- var planTaskSchema = z5.object({
5092
- task: z5.string()
5227
+ import { z as z6 } from "zod";
5228
+ var backlogStatusSchema = z6.enum(["todo", "in-progress", "done", "wontdo"]);
5229
+ var backlogTypeSchema = z6.enum(["story", "bug"]);
5230
+ var planTaskSchema = z6.object({
5231
+ task: z6.string()
5093
5232
  }).strip();
5094
- var planPhaseSchema = z5.strictObject({
5095
- name: z5.string(),
5096
- tasks: z5.array(planTaskSchema),
5097
- manualChecks: z5.array(z5.string()).optional()
5233
+ var planPhaseSchema = z6.strictObject({
5234
+ name: z6.string(),
5235
+ tasks: z6.array(planTaskSchema),
5236
+ manualChecks: z6.array(z6.string()).optional()
5098
5237
  });
5099
- var phaseUsageSchema = z5.strictObject({
5100
- phaseIdx: z5.number(),
5101
- tokensUp: z5.number(),
5102
- tokensDown: z5.number(),
5103
- activeMs: z5.number(),
5104
- peakContextPct: z5.number()
5238
+ var phaseUsageSchema = z6.strictObject({
5239
+ phaseIdx: z6.number(),
5240
+ tokensUp: z6.number(),
5241
+ tokensDown: z6.number(),
5242
+ activeMs: z6.number(),
5243
+ peakContextPct: z6.number()
5105
5244
  });
5106
- var phaseSessionSchema = z5.strictObject({
5107
- phaseIdx: z5.number(),
5108
- claudeSessionId: z5.string(),
5109
- hostname: z5.string(),
5110
- osUser: z5.string(),
5111
- createdAt: z5.string().optional()
5245
+ var phaseSessionSchema = z6.strictObject({
5246
+ phaseIdx: z6.number(),
5247
+ claudeSessionId: z6.string(),
5248
+ hostname: z6.string(),
5249
+ osUser: z6.string(),
5250
+ createdAt: z6.string().optional()
5112
5251
  });
5113
- var phaseUsageTotalSchema = z5.strictObject({
5114
- tokensUp: z5.number(),
5115
- tokensDown: z5.number(),
5116
- activeMs: z5.number(),
5117
- peakContextPct: z5.number()
5252
+ var phaseUsageTotalSchema = z6.strictObject({
5253
+ tokensUp: z6.number(),
5254
+ tokensDown: z6.number(),
5255
+ activeMs: z6.number(),
5256
+ peakContextPct: z6.number()
5118
5257
  });
5119
- var subtaskStatusSchema = z5.enum(["todo", "in-progress", "done"]);
5120
- var subtaskSchema = z5.strictObject({
5121
- title: z5.string(),
5122
- description: z5.string().optional(),
5258
+ var subtaskStatusSchema = z6.enum(["todo", "in-progress", "done"]);
5259
+ var subtaskSchema = z6.strictObject({
5260
+ title: z6.string(),
5261
+ description: z6.string().optional(),
5123
5262
  status: subtaskStatusSchema.default("todo")
5124
5263
  });
5125
- var backlogCommentTypeSchema = z5.enum(["comment", "summary"]);
5126
- var backlogCommentSchema = z5.strictObject({
5127
- id: z5.number().optional(),
5128
- text: z5.string(),
5129
- phase: z5.number().optional(),
5130
- timestamp: z5.string(),
5264
+ var backlogCommentTypeSchema = z6.enum(["comment", "summary"]);
5265
+ var backlogCommentSchema = z6.strictObject({
5266
+ id: z6.number().optional(),
5267
+ text: z6.string(),
5268
+ phase: z6.number().optional(),
5269
+ timestamp: z6.string(),
5131
5270
  type: backlogCommentTypeSchema
5132
5271
  });
5133
- var gitRefKindSchema = z5.enum([
5272
+ var gitRefKindSchema = z6.enum([
5134
5273
  "branch",
5135
5274
  "commit",
5136
5275
  "commit-parent",
@@ -5138,41 +5277,41 @@ var gitRefKindSchema = z5.enum([
5138
5277
  "slack",
5139
5278
  "session"
5140
5279
  ]);
5141
- var gitRefSchema = z5.strictObject({
5280
+ var gitRefSchema = z6.strictObject({
5142
5281
  kind: gitRefKindSchema,
5143
- ref: z5.string(),
5144
- title: z5.string().optional(),
5145
- url: z5.string().optional(),
5146
- state: z5.string().optional(),
5147
- createdAt: z5.string().optional()
5282
+ ref: z6.string(),
5283
+ title: z6.string().optional(),
5284
+ url: z6.string().optional(),
5285
+ state: z6.string().optional(),
5286
+ createdAt: z6.string().optional()
5148
5287
  });
5149
- var backlogLinkTypeSchema = z5.enum(["relates-to", "depends-on"]);
5150
- var backlogLinkSchema = z5.strictObject({
5288
+ var backlogLinkTypeSchema = z6.enum(["relates-to", "depends-on"]);
5289
+ var backlogLinkSchema = z6.strictObject({
5151
5290
  type: backlogLinkTypeSchema,
5152
- targetId: z5.number()
5291
+ targetId: z6.number()
5153
5292
  });
5154
- var backlogItemSchema = z5.strictObject({
5155
- id: z5.number(),
5293
+ var backlogItemSchema = z6.strictObject({
5294
+ id: z6.number(),
5156
5295
  type: backlogTypeSchema.default("story"),
5157
- name: z5.string(),
5158
- description: z5.string().optional(),
5159
- acceptanceCriteria: z5.array(z5.string()),
5160
- plan: z5.array(planPhaseSchema).optional(),
5161
- currentPhase: z5.number().optional(),
5162
- starred: z5.boolean().default(false),
5296
+ name: z6.string(),
5297
+ description: z6.string().optional(),
5298
+ acceptanceCriteria: z6.array(z6.string()),
5299
+ plan: z6.array(planPhaseSchema).optional(),
5300
+ currentPhase: z6.number().optional(),
5301
+ starred: z6.boolean().default(false),
5163
5302
  status: backlogStatusSchema,
5164
- comments: z5.array(backlogCommentSchema).optional(),
5165
- subtasks: z5.array(subtaskSchema).optional(),
5166
- links: z5.array(backlogLinkSchema).optional(),
5167
- phaseUsage: z5.array(phaseUsageSchema).optional(),
5168
- phaseSessions: z5.array(phaseSessionSchema).optional(),
5303
+ comments: z6.array(backlogCommentSchema).optional(),
5304
+ subtasks: z6.array(subtaskSchema).optional(),
5305
+ links: z6.array(backlogLinkSchema).optional(),
5306
+ phaseUsage: z6.array(phaseUsageSchema).optional(),
5307
+ phaseSessions: z6.array(phaseSessionSchema).optional(),
5169
5308
  usageTotal: phaseUsageTotalSchema.optional(),
5170
- gitRefs: z5.array(gitRefSchema).optional(),
5171
- origin: z5.string().optional(),
5172
- jiraKey: z5.string().optional(),
5173
- githubIssue: z5.string().optional()
5309
+ gitRefs: z6.array(gitRefSchema).optional(),
5310
+ origin: z6.string().optional(),
5311
+ jiraKey: z6.string().optional(),
5312
+ githubIssue: z6.string().optional()
5174
5313
  });
5175
- var backlogFileSchema = z5.array(backlogItemSchema);
5314
+ var backlogFileSchema = z6.array(backlogItemSchema);
5176
5315
 
5177
5316
  // src/commands/backlog/parseBacklogJsonl.ts
5178
5317
  function parseBacklogJsonl(path106) {
@@ -6539,7 +6678,7 @@ ${issues}`);
6539
6678
  }
6540
6679
 
6541
6680
  // src/commands/backlog/propose/proposedItemSchema.ts
6542
- import { z as z6 } from "zod";
6681
+ import { z as z7 } from "zod";
6543
6682
 
6544
6683
  // src/commands/backlog/buildCommentLines.ts
6545
6684
  function buildCommentLines(comments3) {
@@ -6691,20 +6830,20 @@ function buildPhasePrompt(item, phaseNumber, phase) {
6691
6830
  }
6692
6831
 
6693
6832
  // src/commands/backlog/propose/proposedItemSchema.ts
6694
- var proposedPhaseSchema = z6.strictObject({
6695
- name: z6.string().trim().min(1, "phase name is required").refine(
6833
+ var proposedPhaseSchema = z7.strictObject({
6834
+ name: z7.string().trim().min(1, "phase name is required").refine(
6696
6835
  (name) => name.toLowerCase() !== REVIEW_PHASE_NAME.toLowerCase(),
6697
6836
  `"${REVIEW_PHASE_NAME}" is owned by the runner and appended to every plan automatically \u2014 remove this phase`
6698
6837
  ),
6699
- tasks: z6.array(z6.string().trim().min(1)).min(1, "a phase needs at least one task"),
6700
- manualChecks: z6.array(z6.string().trim().min(1)).default([])
6838
+ tasks: z7.array(z7.string().trim().min(1)).min(1, "a phase needs at least one task"),
6839
+ manualChecks: z7.array(z7.string().trim().min(1)).default([])
6701
6840
  });
6702
- var proposedItemSchema = z6.strictObject({
6703
- name: z6.string().trim().min(1, "name is required"),
6704
- type: z6.enum(["story", "bug"]),
6705
- description: z6.string().optional(),
6706
- acceptanceCriteria: z6.array(z6.string().trim().min(1)).default([]),
6707
- phases: z6.array(proposedPhaseSchema).default([])
6841
+ var proposedItemSchema = z7.strictObject({
6842
+ name: z7.string().trim().min(1, "name is required"),
6843
+ type: z7.enum(["story", "bug"]),
6844
+ description: z7.string().optional(),
6845
+ acceptanceCriteria: z7.array(z7.string().trim().min(1)).default([]),
6846
+ phases: z7.array(proposedPhaseSchema).default([])
6708
6847
  });
6709
6848
 
6710
6849
  // src/commands/backlog/propose/readProposedItem.ts
@@ -8229,19 +8368,19 @@ async function persistPhaseSessionId(itemId2, phaseIdx, claudeSessionId) {
8229
8368
  import { mkdirSync as mkdirSync9, readFileSync as readFileSync19, rmSync as rmSync2, writeFileSync as writeFileSync20 } from "fs";
8230
8369
  import { homedir as homedir11 } from "os";
8231
8370
  import { dirname as dirname18, join as join30 } from "path";
8232
- import { z as z7 } from "zod";
8233
- var activitySchema = z7.object({
8234
- kind: z7.enum(["command", "backlog"]),
8235
- harness: z7.enum(["claude", "codex", "pi"]).optional(),
8236
- name: z7.string().optional(),
8237
- itemId: z7.number().optional(),
8238
- itemName: z7.string().optional(),
8239
- phase: z7.number().optional(),
8240
- phaseName: z7.string().optional(),
8241
- totalPhases: z7.number().optional(),
8242
- claudeSessionId: z7.string().optional(),
8243
- watchState: z7.enum(["waiting", "updating"]).optional(),
8244
- startedAt: z7.number()
8371
+ import { z as z8 } from "zod";
8372
+ var activitySchema = z8.object({
8373
+ kind: z8.enum(["command", "backlog"]),
8374
+ harness: z8.enum(["claude", "codex", "pi"]).optional(),
8375
+ name: z8.string().optional(),
8376
+ itemId: z8.number().optional(),
8377
+ itemName: z8.string().optional(),
8378
+ phase: z8.number().optional(),
8379
+ phaseName: z8.string().optional(),
8380
+ totalPhases: z8.number().optional(),
8381
+ claudeSessionId: z8.string().optional(),
8382
+ watchState: z8.enum(["waiting", "updating"]).optional(),
8383
+ startedAt: z8.number()
8245
8384
  });
8246
8385
  function activityPath(sessionId) {
8247
8386
  return join30(homedir11(), ".assist", "activity", `activity-${sessionId}.json`);
@@ -10258,9 +10397,9 @@ async function update(id, options2) {
10258
10397
  import chalk102 from "chalk";
10259
10398
 
10260
10399
  // src/commands/backlog/updatePlan/planUpdateSchema.ts
10261
- import { z as z8 } from "zod";
10262
- var planUpdateSchema = z8.strictObject({
10263
- phases: z8.array(proposedPhaseSchema).min(1, "a plan needs at least one phase")
10400
+ import { z as z9 } from "zod";
10401
+ var planUpdateSchema = z9.strictObject({
10402
+ phases: z9.array(proposedPhaseSchema).min(1, "a plan needs at least one phase")
10264
10403
  });
10265
10404
 
10266
10405
  // src/commands/backlog/updatePlan/readPlanUpdate.ts
@@ -13051,6 +13190,53 @@ var nodesConfigHelp = [
13051
13190
  }
13052
13191
  ];
13053
13192
 
13193
+ // src/shared/hotkeys/defaultHotkeys.ts
13194
+ var defaultHotkeys = {
13195
+ navTab: ["Alt"],
13196
+ focusSidebar: ["Alt+A"],
13197
+ focusTerminal: ["Alt+S"],
13198
+ toggleDiff: ["Alt+D"],
13199
+ focusRepoPicker: ["Alt+R"],
13200
+ openConfig: ["Alt+W"],
13201
+ openMenu: ["Alt+E"],
13202
+ focusAddAgent: ["Alt+Z"],
13203
+ focusVsCode: ["Alt+X"],
13204
+ focusDone: ["Alt+C"],
13205
+ nextWaiting: ["Mod+."],
13206
+ newSession: ["Mod+N", "Alt+N"],
13207
+ quickOpen: ["Mod+P"],
13208
+ save: ["Mod+S"],
13209
+ shortcutsSheet: ["Mod+/"]
13210
+ };
13211
+
13212
+ // src/commands/sessions/hotkeysConfigHelp.ts
13213
+ var ACTIONS = {
13214
+ navTab: "modifier for the top-level tab digits 1\u2013N (modifiers only, e.g. Ctrl+Alt)",
13215
+ focusSidebar: "focus the active sidebar card",
13216
+ focusTerminal: "focus the active terminal",
13217
+ toggleDiff: "open / close the diff panel, or focus the preview pane",
13218
+ focusRepoPicker: "focus the toolbar repo picker",
13219
+ openConfig: "open the config page",
13220
+ openMenu: "open the hamburger menu",
13221
+ focusAddAgent: "focus the top bar's add agent button",
13222
+ focusVsCode: "focus the top bar's VS Code button",
13223
+ focusDone: "focus the top bar's done button",
13224
+ nextWaiting: "jump to the next waiting session",
13225
+ newSession: "open the new-session dialog",
13226
+ quickOpen: "quick open a file",
13227
+ save: "save the open file",
13228
+ shortcutsSheet: "show the keyboard shortcuts sheet"
13229
+ };
13230
+ var EXAMPLES = {
13231
+ navTab: "Ctrl+Alt",
13232
+ focusTerminal: "Ctrl+Alt+J"
13233
+ };
13234
+ var hotkeysConfigHelp = Object.keys(ACTIONS).map((name) => ({
13235
+ key: `sessions.hotkeys.${name}`,
13236
+ setter: `assist config set sessions.hotkeys.${name} ${EXAMPLES[name] ?? defaultHotkeys[name][0]} -g`,
13237
+ note: `${ACTIONS[name]}; default ${defaultHotkeys[name].join(" / ")}`
13238
+ }));
13239
+
13054
13240
  // src/commands/sessions/sessionsConfigHelp.ts
13055
13241
  var sessionsConfigHelp = [
13056
13242
  {
@@ -13232,6 +13418,7 @@ var configHelpEntries = [
13232
13418
  ...sessionsConfigHelp,
13233
13419
  ...nodesConfigHelp,
13234
13420
  ...webConfigHelp,
13421
+ ...hotkeysConfigHelp,
13235
13422
  ...slackConfigHelp,
13236
13423
  ...sqlConfigHelp,
13237
13424
  ...transcriptConfigHelp,
@@ -13657,6 +13844,21 @@ async function health(_req, res) {
13657
13844
  });
13658
13845
  }
13659
13846
 
13847
+ // src/shared/hotkeys/resolveHotkeys.ts
13848
+ function resolveHotkeys(overrides) {
13849
+ const bindings = { ...defaultHotkeys };
13850
+ for (const name of Object.keys(defaultHotkeys)) {
13851
+ const override = overrides?.[name];
13852
+ if (override) bindings[name] = [override];
13853
+ }
13854
+ return bindings;
13855
+ }
13856
+
13857
+ // src/commands/sessions/web/hotkeyBindings.ts
13858
+ function hotkeyBindings(_req, res) {
13859
+ respondJson(res, 200, resolveHotkeys(loadConfig().sessions?.hotkeys));
13860
+ }
13861
+
13660
13862
  // src/commands/sessions/web/jiraSite.ts
13661
13863
  function jiraSite(_req, res) {
13662
13864
  const config = loadJson("jira.json");
@@ -17205,6 +17407,7 @@ var routes2 = {
17205
17407
  "GET /api/harness": harnessCapabilities,
17206
17408
  "GET /api/session-layout": sessionLayout,
17207
17409
  "GET /api/session-view": sessionView,
17410
+ "GET /api/hotkeys": hotkeyBindings,
17208
17411
  "GET /api/new-session-defaults": newSessionDefaults,
17209
17412
  "GET /api/pr-status": prStatus,
17210
17413
  "GET /api/server-runs": handleServerRuns,
@@ -25731,37 +25934,37 @@ function stringOrUndefined(value) {
25731
25934
  }
25732
25935
 
25733
25936
  // src/commands/sessions/daemon/persistedSessionSchema.ts
25734
- import { z as z9 } from "zod";
25735
- var persistedSessionSchema = z9.object({
25736
- id: z9.string().optional(),
25737
- name: z9.string(),
25738
- title: z9.string().optional(),
25739
- generatedTitle: z9.string().optional(),
25740
- subtitle: z9.string().optional(),
25741
- commandType: z9.enum(["claude", "run", "assist"]),
25742
- harness: z9.enum(["claude", "codex", "pi"]).optional(),
25743
- status: z9.enum(["running", "waiting", "done", "error", "stopped"]).optional(),
25744
- cwd: z9.string(),
25745
- startedAt: z9.number(),
25746
- runningMs: z9.number().optional(),
25747
- claudeSessionId: z9.string().optional(),
25748
- harnessSessionId: z9.string().optional(),
25749
- initialPrompt: z9.string().optional(),
25750
- runName: z9.string().optional(),
25751
- runArgs: z9.array(z9.string()).optional(),
25752
- assistArgs: z9.array(z9.string()).optional(),
25937
+ import { z as z10 } from "zod";
25938
+ var persistedSessionSchema = z10.object({
25939
+ id: z10.string().optional(),
25940
+ name: z10.string(),
25941
+ title: z10.string().optional(),
25942
+ generatedTitle: z10.string().optional(),
25943
+ subtitle: z10.string().optional(),
25944
+ commandType: z10.enum(["claude", "run", "assist"]),
25945
+ harness: z10.enum(["claude", "codex", "pi"]).optional(),
25946
+ status: z10.enum(["running", "waiting", "done", "error", "stopped"]).optional(),
25947
+ cwd: z10.string(),
25948
+ startedAt: z10.number(),
25949
+ runningMs: z10.number().optional(),
25950
+ claudeSessionId: z10.string().optional(),
25951
+ harnessSessionId: z10.string().optional(),
25952
+ initialPrompt: z10.string().optional(),
25953
+ runName: z10.string().optional(),
25954
+ runArgs: z10.array(z10.string()).optional(),
25955
+ assistArgs: z10.array(z10.string()).optional(),
25753
25956
  activity: activitySchema.optional(),
25754
- starred: z9.boolean().optional(),
25755
- watcher: z9.boolean().optional(),
25756
- divergenceEscalation: z9.boolean().optional(),
25757
- design: z9.boolean().optional(),
25758
- auto: z9.boolean().optional(),
25759
- autoRun: z9.boolean().optional(),
25760
- autoAdvance: z9.boolean().optional(),
25761
- reviewStarted: z9.boolean().optional(),
25762
- launchedFrom: z9.string().optional(),
25763
- interrupted: z9.object({ reason: z9.string(), at: z9.number() }).optional(),
25764
- undurable: z9.object({ reason: z9.string(), removesTree: z9.boolean().optional() }).optional()
25957
+ starred: z10.boolean().optional(),
25958
+ watcher: z10.boolean().optional(),
25959
+ divergenceEscalation: z10.boolean().optional(),
25960
+ design: z10.boolean().optional(),
25961
+ auto: z10.boolean().optional(),
25962
+ autoRun: z10.boolean().optional(),
25963
+ autoAdvance: z10.boolean().optional(),
25964
+ reviewStarted: z10.boolean().optional(),
25965
+ launchedFrom: z10.string().optional(),
25966
+ interrupted: z10.object({ reason: z10.string(), at: z10.number() }).optional(),
25967
+ undurable: z10.object({ reason: z10.string(), removesTree: z10.boolean().optional() }).optional()
25765
25968
  });
25766
25969
 
25767
25970
  // src/commands/sessions/daemon/toPersistedSession.ts
@@ -38652,16 +38855,16 @@ function selectPassages(sources, selection) {
38652
38855
  }
38653
38856
 
38654
38857
  // src/commands/transcript/selectionSchema.ts
38655
- import { z as z10 } from "zod";
38656
- var selectionSchema = z10.strictObject({
38657
- keep: z10.array(
38658
- z10.strictObject({
38659
- file: z10.string().trim().min(1, "file is required"),
38660
- from: z10.string().trim().min(1, "from is required"),
38661
- to: z10.string().trim().min(1, "to is required")
38858
+ import { z as z11 } from "zod";
38859
+ var selectionSchema = z11.strictObject({
38860
+ keep: z11.array(
38861
+ z11.strictObject({
38862
+ file: z11.string().trim().min(1, "file is required"),
38863
+ from: z11.string().trim().min(1, "from is required"),
38864
+ to: z11.string().trim().min(1, "to is required")
38662
38865
  })
38663
38866
  ).min(1, "a selection needs at least one keep range"),
38664
- removed: z10.array(z10.string().trim().min(1)).default([])
38867
+ removed: z11.array(z11.string().trim().min(1)).default([])
38665
38868
  });
38666
38869
 
38667
38870
  // src/commands/transcript/widenAudienceInText.ts
@@ -41076,9 +41279,9 @@ function createAutoExit(exit, graceMs = DEFAULT_GRACE_MS) {
41076
41279
  }
41077
41280
 
41078
41281
  // src/commands/sessions/daemon/loadActiveSelection.ts
41079
- import { z as z11 } from "zod";
41282
+ import { z as z12 } from "zod";
41080
41283
  var ACTIVE_FILE = "active.json";
41081
- var activeSelectionSchema = z11.record(z11.string(), z11.string());
41284
+ var activeSelectionSchema = z12.record(z12.string(), z12.string());
41082
41285
  function loadActiveSelection() {
41083
41286
  const parsed = activeSelectionSchema.safeParse(
41084
41287
  loadJson(ACTIVE_FILE)
@@ -48282,7 +48485,11 @@ function registerSessions(program2) {
48282
48485
  const webCmd = cmd.command("web").description("Start the sessions web dashboard").option("-p, --port <number>", "Port to listen on", "3100").option("--no-open", "Do not open a browser on startup").action(
48283
48486
  (options2, command) => web({ ...options2, open: command.optsWithGlobals().open })
48284
48487
  );
48285
- configHelp(webCmd, [...nextConfigHelp, ...webConfigHelp]);
48488
+ configHelp(webCmd, [
48489
+ ...nextConfigHelp,
48490
+ ...webConfigHelp,
48491
+ ...hotkeysConfigHelp
48492
+ ]);
48286
48493
  cmd.command("summarise").description("Generate one-line summaries for Claude sessions").option("-f, --force", "Re-generate all summaries, even existing ones").option("-n, --limit <count>", "Maximum number of sessions to summarise").action(summarise2);
48287
48494
  cmd.command("close").description(
48288
48495
  "Dismiss the current daemon-managed session, ending it and reaping its worktree"