daedalus-cli 1.72.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ # [1.74.0](https://github.com/bgill55/daedalus/compare/v1.73.0...v1.74.0) (2026-07-26)
2
+
3
+
4
+ ### Features
5
+
6
+ * **config:** add OS & System Diagnostics Awareness module and system prompt headers ([daf9147](https://github.com/bgill55/daedalus/commit/daf914787d08a21fad9a4d8d570d87db14ae3066))
7
+
8
+ # [1.73.0](https://github.com/bgill55/daedalus/compare/v1.72.0...v1.73.0) (2026-07-26)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **tsc:** add public db getter to SessionManager and pass loaded session object to initializeSessionState ([176b703](https://github.com/bgill55/daedalus/commit/176b70387ca82e6e242261b54b0a5e4a5c9b4afa))
14
+
15
+
16
+ ### Features
17
+
18
+ * **session:** implement Chat-History Branching system (/session branch, checkout, list, merge) ([1658410](https://github.com/bgill55/daedalus/commit/1658410b19f1de1c7129ef13952bdcb4be19733d))
19
+
1
20
  # [1.72.0](https://github.com/bgill55/daedalus/compare/v1.71.2...v1.72.0) (2026-07-26)
2
21
 
3
22
 
package/README.md CHANGED
@@ -160,7 +160,7 @@ AI assistance without:
160
160
  | `/convention [text]` | Add a project convention to memory |
161
161
  | `/memory` | View project memory (facts & conventions) |
162
162
  | `/extract` | Manually extract facts from session |
163
- | `/session [name]` | Manage chat sessions /session new to start, /session load <id> to restore, /session export [path] to save transcript |
163
+ | `/session [name]` | Manage chat sessions & branches: /session <list|load|new|branch|checkout|merge|export> |
164
164
 
165
165
  ### Context & CLI Utilities
166
166
 
@@ -183,6 +183,7 @@ AI assistance without:
183
183
 
184
184
  | Command | Description |
185
185
  |---------|-------------|
186
+ | `/lite` | Show Daedalus Lite documentation |
186
187
  | `/stats` / `stats` | Display session analytics, token usage, index count, and router status |
187
188
  | `/onboard` | First-time setup — discover local models, configure, and test |
188
189
  | `/tui` | Toggle the Terminal User Interface (TUI) dashboard |
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAKhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,yBAAyB,EAAE,MAAM,MAAM,CAAC;IACxC,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC,CAAC;IACvH,qBAAqB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtF,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;IACvB,sBAAsB,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7I,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACzE;AAED,eAAO,MAAM,YAAY,EAAE,OAAO,EAsuEjC,CAAC;AAEF,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCzF"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAKhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAgBtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,yBAAyB,EAAE,MAAM,MAAM,CAAC;IACxC,kBAAkB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC,CAAC;IACvH,qBAAqB,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtF,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;IACvB,sBAAsB,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,EAAE,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7I,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,cAAc,EAAE,MAAM,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CACzE;AAED,eAAO,MAAM,YAAY,EAAE,OAAO,EA85EjC,CAAC;AAEF,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAqCzF"}
package/dist/commands.js CHANGED
@@ -11,6 +11,7 @@ import { printUserTurn, turnSeparator } from './formatting.js';
11
11
  import { getClipboardText, getClipboardImage } from './clipboard.js';
12
12
  import { spawnBackgroundAgent } from './agents/background.js';
13
13
  import { handleSpecCommand } from './agents/loop.js';
14
+ import { createSessionBranch, checkoutSessionBranch, listSessionBranches, mergeSessionBranch, } from './session/branching.js';
14
15
  export const commandsList = [
15
16
  {
16
17
  name: '/add',
@@ -594,6 +595,185 @@ export const commandsList = [
594
595
  console.log(pc.green('[OK] Coding style saved. It will be injected into every session.'));
595
596
  }
596
597
  },
598
+ {
599
+ name: '/lite',
600
+ description: 'Show Daedalus Lite documentation',
601
+ usage: '/lite',
602
+ helpText: 'Display link to Daedalus Lite documentation for building your own version of Daedalus',
603
+ execute: async (_args, _ctx) => {
604
+ console.log(pc.bold('\n--- Daedalus Lite Documentation ---'));
605
+ console.log(pc.gray(' Build your own version of Daedalus:'));
606
+ console.log(pc.cyan(' https://bgill55.github.io/daedalus-lite/'));
607
+ console.log(pc.bold('----------------------------------'));
608
+ }
609
+ },
610
+ {
611
+ name: '/session',
612
+ description: 'Manage chat sessions & branches: /session <list|load|new|branch|checkout|merge|export>',
613
+ usage: '/session <list|load|new|delete|export|branch|checkout|merge|branches> [args]',
614
+ helpText: 'Manage, snapshot, branch, load, save, and export conversation sessions.\n\nSubcommands:\n list List all saved sessions for current project\n load <id> Load a saved session by ID\n new [title] Start a new conversation session\n delete <id> Delete a saved session by ID\n export [filepath] Export the current session transcript to Markdown\n search <query> Search past sessions for keyword\n rename <title> Rename the active session\n branch <name> Create a new session branch snapshot from current state\n checkout <name> Switch active REPL session context to an existing branch\n branches Display hierarchical tree of session branches\n merge <name> Merge code patches & trajectory turns from branch into current session',
615
+ execute: async (args, ctx) => {
616
+ const parts = args.trim().split(/\s+/);
617
+ const subcommand = parts[0]?.toLowerCase();
618
+ const subcommandArg = parts.slice(1).join(' ').trim();
619
+ const db = ctx.sessionManager.db;
620
+ const sessionDir = path.join(ctx.configDir, 'sessions');
621
+ const workspaceRoot = process.cwd();
622
+ const currentSessionId = ctx.toolContext.sessionId || 'default';
623
+ if (subcommand === 'branch') {
624
+ if (!subcommandArg) {
625
+ console.log(pc.red('[WARN] Usage: /session branch <name>'));
626
+ return;
627
+ }
628
+ try {
629
+ const branch = createSessionBranch(db, currentSessionId, subcommandArg, workspaceRoot, sessionDir);
630
+ console.log(pc.green(`[OK] Created session branch '${branch.name}' (id: ${branch.id.slice(0, 8)}) at step ${branch.branch_point_step}.`));
631
+ }
632
+ catch (err) {
633
+ const msg = err instanceof Error ? err.message : String(err);
634
+ console.log(pc.red(`[ERROR] ${msg}`));
635
+ }
636
+ return;
637
+ }
638
+ if (subcommand === 'checkout') {
639
+ if (!subcommandArg) {
640
+ console.log(pc.red('[WARN] Usage: /session checkout <name>'));
641
+ return;
642
+ }
643
+ try {
644
+ const branch = checkoutSessionBranch(db, subcommandArg);
645
+ ctx.toolContext.sessionId = branch.id;
646
+ console.log(pc.green(`[OK] Switched session context to '${branch.name}' [id: ${branch.id.slice(0, 8)}].`));
647
+ }
648
+ catch (err) {
649
+ const msg = err instanceof Error ? err.message : String(err);
650
+ console.log(pc.red(`[ERROR] ${msg}`));
651
+ }
652
+ return;
653
+ }
654
+ if (subcommand === 'branches') {
655
+ const treeStr = listSessionBranches(db);
656
+ console.log(pc.bold('\n--- Session Branches ---'));
657
+ console.log(treeStr);
658
+ console.log(pc.bold('------------------------\n'));
659
+ return;
660
+ }
661
+ if (subcommand === 'merge') {
662
+ if (!subcommandArg) {
663
+ console.log(pc.red('[WARN] Usage: /session merge <name>'));
664
+ return;
665
+ }
666
+ try {
667
+ const result = await mergeSessionBranch(db, subcommandArg, workspaceRoot, sessionDir);
668
+ if (result.success) {
669
+ console.log(pc.green(`[OK] ${result.message}`));
670
+ }
671
+ else {
672
+ console.log(pc.red(`[ERROR] ${result.message}`));
673
+ }
674
+ }
675
+ catch (err) {
676
+ const msg = err instanceof Error ? err.message : String(err);
677
+ console.log(pc.red(`[ERROR] ${msg}`));
678
+ }
679
+ return;
680
+ }
681
+ if (!subcommand || subcommand === 'list') {
682
+ const sessions = ctx.sessionManager.getSessionsForProject();
683
+ console.log(pc.bold('\n--- Past Sessions ---'));
684
+ if (sessions.length === 0) {
685
+ console.log(pc.gray(' No past sessions found.'));
686
+ }
687
+ else {
688
+ sessions.forEach((s) => {
689
+ const currentTag = s.id === ctx.sessionManager.sessionId ? pc.green(' (current)') : '';
690
+ const dateStr = new Date(s.updated_at).toLocaleString();
691
+ console.log(` • ${pc.cyan(s.id)}${currentTag}`);
692
+ console.log(` Title: ${pc.white(s.title)}`);
693
+ console.log(` Updated: ${pc.dim(dateStr)}`);
694
+ });
695
+ }
696
+ console.log(pc.bold('---------------------\n'));
697
+ console.log(pc.gray('Use `/session load <id>` to resume a past session.'));
698
+ console.log(pc.gray('Use `/session new [title]` to start a new session.'));
699
+ console.log(pc.gray('Use `/session branch <name>` to snapshot & branch current session.'));
700
+ console.log(pc.gray('Use `/session checkout <name>` to switch to a branch.'));
701
+ console.log(pc.gray('Use `/session merge <name>` to merge branch edits.'));
702
+ console.log(pc.gray('Use `/session delete <id>` to delete a session.'));
703
+ console.log(pc.gray('Use `/session export [path]` to export session transcript.'));
704
+ return;
705
+ }
706
+ if (subcommand === 'load') {
707
+ if (!subcommandArg) {
708
+ console.log(pc.red('Usage: /session load <id>'));
709
+ return;
710
+ }
711
+ ctx.sessionManager.saveSessionState(ctx.messages, ctx.activeFiles, getSessionTodos(ctx.toolContext.sessionId));
712
+ const sessions = ctx.sessionManager.getSessionsForProject();
713
+ const target = sessions.find((s) => s.id === subcommandArg || s.id.startsWith(subcommandArg));
714
+ if (!target) {
715
+ console.log(pc.red(`Session not found: ${subcommandArg}`));
716
+ return;
717
+ }
718
+ const loaded = ctx.sessionManager.startSession(target.id, target.title);
719
+ ctx.initializeSessionState(loaded);
720
+ console.log(pc.green(`[OK] Loaded session: ${target.title} (${target.id})`));
721
+ return;
722
+ }
723
+ if (subcommand === 'new') {
724
+ ctx.sessionManager.saveSessionState(ctx.messages, ctx.activeFiles, getSessionTodos(ctx.toolContext.sessionId));
725
+ const newTitle = subcommandArg || `Session ${new Date().toLocaleDateString()}`;
726
+ const loaded = ctx.sessionManager.startSession(undefined, newTitle);
727
+ ctx.initializeSessionState(loaded);
728
+ console.log(pc.green(`[OK] Started new session: ${newTitle}`));
729
+ return;
730
+ }
731
+ if (subcommand === 'delete') {
732
+ if (!subcommandArg) {
733
+ console.log(pc.red('Usage: /session delete <id>'));
734
+ return;
735
+ }
736
+ ctx.sessionManager.deleteSession(subcommandArg);
737
+ console.log(pc.green(`[OK] Deleted session: ${subcommandArg}`));
738
+ return;
739
+ }
740
+ if (subcommand === 'export') {
741
+ const defaultPath = `session-export-${Date.now()}.md`;
742
+ const exportPath = subcommandArg || defaultPath;
743
+ const lines = [];
744
+ lines.push(`# Session Transcript - ${new Date().toLocaleString()}\n`);
745
+ ctx.messages.forEach((m) => {
746
+ if (m.role === 'system')
747
+ return;
748
+ lines.push(`### ${m.role.toUpperCase()}\n${m.content}\n`);
749
+ });
750
+ fs.writeFileSync(exportPath, lines.join('\n'), 'utf8');
751
+ console.log(pc.green(`[OK] Session transcript exported to ${exportPath}`));
752
+ return;
753
+ }
754
+ if (subcommand === 'search') {
755
+ if (!subcommandArg) {
756
+ console.log(pc.red('Usage: /session search <query>'));
757
+ return;
758
+ }
759
+ const query = subcommandArg.toLowerCase();
760
+ const sessions = ctx.sessionManager.getSessionsForProject();
761
+ const matches = sessions.filter((s) => s.title.toLowerCase().includes(query) || s.id.toLowerCase().includes(query));
762
+ console.log(pc.bold(`\n--- Search Results for "${query}" ---`));
763
+ if (matches.length === 0) {
764
+ console.log(pc.gray(' No matching sessions found.'));
765
+ }
766
+ else {
767
+ matches.forEach((s) => {
768
+ console.log(` • ${pc.cyan(s.id)} - ${pc.white(s.title)}`);
769
+ });
770
+ }
771
+ console.log(pc.bold('------------------------------------\n'));
772
+ return;
773
+ }
774
+ console.log(pc.yellow('[INFO] Usage: /session <list|load|new|delete|export|branch|checkout|branches|merge> [args]'));
775
+ }
776
+ },
597
777
  {
598
778
  name: '/undo',
599
779
  description: 'Undo file edits (usage: /undo [count|list])',