0xkobold 0.4.3 → 0.5.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.
Files changed (130) hide show
  1. package/README.md +226 -383
  2. package/dist/package.json +13 -4
  3. package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
  4. package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
  5. package/dist/src/agent/DraconicErrorClassifier.js +606 -0
  6. package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
  7. package/dist/src/agent/DraconicRunRegistry.js +460 -0
  8. package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
  9. package/dist/src/agent/DraconicTokenPredictor.js +500 -0
  10. package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
  11. package/dist/src/agent/embedded-runner.js +3 -2
  12. package/dist/src/agent/embedded-runner.js.map +1 -1
  13. package/dist/src/cli/commands/doctor.js +199 -0
  14. package/dist/src/cli/commands/doctor.js.map +1 -0
  15. package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
  16. package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
  17. package/dist/src/cli/commands/migrate.js +6 -4
  18. package/dist/src/cli/commands/migrate.js.map +1 -1
  19. package/dist/src/cli/program.js +3 -1
  20. package/dist/src/cli/program.js.map +1 -1
  21. package/dist/src/config/unified-config.js +195 -0
  22. package/dist/src/config/unified-config.js.map +1 -0
  23. package/dist/src/cron/notifications.js +1 -1
  24. package/dist/src/cron/notifications.js.map +1 -1
  25. package/dist/src/cron/runner.js +9 -3
  26. package/dist/src/cron/runner.js.map +1 -1
  27. package/dist/src/event-bus/index.js +3 -1
  28. package/dist/src/event-bus/index.js.map +1 -1
  29. package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
  30. package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
  31. package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
  32. package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
  33. package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
  34. package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
  35. package/dist/src/extensions/core/compaction-safeguard.js +206 -137
  36. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
  37. package/dist/src/extensions/core/config-extension.js +122 -0
  38. package/dist/src/extensions/core/config-extension.js.map +1 -0
  39. package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
  40. package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
  41. package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
  42. package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
  43. package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
  44. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
  45. package/dist/src/extensions/core/ext-manager.js +40 -0
  46. package/dist/src/extensions/core/ext-manager.js.map +1 -0
  47. package/dist/src/extensions/core/gateway-extension.js +413 -624
  48. package/dist/src/extensions/core/gateway-extension.js.map +1 -1
  49. package/dist/src/extensions/core/generative-agents-extension.js +704 -0
  50. package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
  51. package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
  52. package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
  53. package/dist/src/extensions/core/ollama-extension.js +442 -0
  54. package/dist/src/extensions/core/ollama-extension.js.map +1 -0
  55. package/dist/src/extensions/core/ollama-router-extension.js +34 -93
  56. package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
  57. package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
  58. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  59. package/dist/src/extensions/core/persona-loader-extension.js +41 -15
  60. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  61. package/dist/src/extensions/core/pi-notify-extension.js +6 -0
  62. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
  63. package/dist/src/extensions/core/session-bridge-extension.js +8 -72
  64. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
  65. package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
  66. package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
  67. package/dist/src/extensions/core/tui-integration-extension.js +984 -0
  68. package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
  69. package/dist/src/gateway/persistence/AgentStore.js +399 -0
  70. package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
  71. package/dist/src/gateway/persistence/index.js +9 -0
  72. package/dist/src/gateway/persistence/index.js.map +1 -0
  73. package/dist/src/hoard/DraconicHoardSystem.js +465 -0
  74. package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
  75. package/dist/src/index.js +7 -5
  76. package/dist/src/index.js.map +1 -1
  77. package/dist/src/infra/DraconicConnectionPool.js +492 -0
  78. package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
  79. package/dist/src/lair/DraconicLairSystem.js +387 -0
  80. package/dist/src/lair/DraconicLairSystem.js.map +1 -0
  81. package/dist/src/llm/ollama.js +143 -99
  82. package/dist/src/llm/ollama.js.map +1 -1
  83. package/dist/src/migration/openclaw.js +5 -5
  84. package/dist/src/migration/openclaw.js.map +1 -1
  85. package/dist/src/pi-config.js +52 -27
  86. package/dist/src/pi-config.js.map +1 -1
  87. package/dist/src/sessions/SessionManager.js +416 -0
  88. package/dist/src/sessions/SessionManager.js.map +1 -0
  89. package/dist/src/sessions/SessionStore.js +580 -0
  90. package/dist/src/sessions/SessionStore.js.map +1 -0
  91. package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
  92. package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
  93. package/dist/src/sessions/index.js +15 -0
  94. package/dist/src/sessions/index.js.map +1 -0
  95. package/dist/src/sessions/migration/index.js +156 -0
  96. package/dist/src/sessions/migration/index.js.map +1 -0
  97. package/dist/src/sessions/types.js +8 -0
  98. package/dist/src/sessions/types.js.map +1 -0
  99. package/dist/src/skills/framework.js +1 -1
  100. package/dist/src/skills/framework.js.map +1 -1
  101. package/dist/src/tui/commands/final-functions.js +39 -0
  102. package/dist/src/tui/commands/final-functions.js.map +1 -0
  103. package/dist/src/tui/commands/natural-language-commands.js +231 -0
  104. package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
  105. package/dist/src/tui/commands/orchestration-commands.js +340 -0
  106. package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
  107. package/dist/src/tui/commands/orchestration-final-section.js +84 -0
  108. package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
  109. package/dist/src/tui/components/agent-tree-overlay.js +210 -0
  110. package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
  111. package/dist/src/tui/components/agent-tree-panel.js +229 -0
  112. package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
  113. package/dist/src/tui/components/sidebar.js +82 -0
  114. package/dist/src/tui/components/sidebar.js.map +1 -0
  115. package/dist/src/tui/components/status-bar.js +115 -0
  116. package/dist/src/tui/components/status-bar.js.map +1 -0
  117. package/dist/src/tui/components/tree-header.js +85 -0
  118. package/dist/src/tui/components/tree-header.js.map +1 -0
  119. package/dist/src/tui/draconic-tui.js +291 -0
  120. package/dist/src/tui/draconic-tui.js.map +1 -0
  121. package/dist/src/tui/index.js +93 -0
  122. package/dist/src/tui/index.js.map +1 -0
  123. package/dist/src/tui/pi-tui-integration.js +260 -0
  124. package/dist/src/tui/pi-tui-integration.js.map +1 -0
  125. package/dist/src/utils/nl-patterns.js +145 -0
  126. package/dist/src/utils/nl-patterns.js.map +1 -0
  127. package/package.json +13 -4
  128. package/scripts/migrate-from-openclaw.sh +498 -0
  129. package/HEARTBEAT.md +0 -121
  130. package/USAGE.md +0 -191
@@ -0,0 +1,115 @@
1
+ /**
2
+ * 🐉 Draconic TUI Status Bar
3
+ *
4
+ * Displays real-time agent status in TUI status bar.
5
+ * Updates every 500ms with: active agents, current task, hierarchy depth.
6
+ */
7
+ export class DraconicStatusBar {
8
+ tui;
9
+ updateInterval;
10
+ state = { active: 0, total: 0, depth: 0 };
11
+ interval;
12
+ lastUpdate = 0;
13
+ constructor(tui, updateInterval = 500) {
14
+ this.tui = tui;
15
+ this.updateInterval = updateInterval;
16
+ }
17
+ start() {
18
+ this.interval = setInterval(() => this.refresh(), this.updateInterval);
19
+ this.refresh();
20
+ }
21
+ stop() {
22
+ if (this.interval) {
23
+ clearInterval(this.interval);
24
+ this.interval = undefined;
25
+ }
26
+ }
27
+ getText() {
28
+ if (this.state.active === 0) {
29
+ return "🐉 idle";
30
+ }
31
+ const task = this.state.currentTask?.slice(0, 25) || "working...";
32
+ const taskDisplay = task.length > 25 ? `${task}...` : task;
33
+ return `🐉 ${this.state.active} | ${taskDisplay}`;
34
+ }
35
+ getTooltip() {
36
+ const lines = [
37
+ `Active agents: ${this.state.active}`,
38
+ `Total agents: ${this.state.total}`,
39
+ `Max depth: ${this.state.depth}`,
40
+ ];
41
+ if (this.state.tokens) {
42
+ lines.push(`Tokens: ${this.state.tokens.actual}/${this.state.tokens.estimated}k`);
43
+ }
44
+ if (this.state.currentAgent) {
45
+ lines.push(`Current: ${this.state.currentAgent}`);
46
+ }
47
+ return lines.join("\n");
48
+ }
49
+ getDetailedStatus() {
50
+ if (this.state.active === 0) {
51
+ return "🐉 Draconic Orchestrator ready";
52
+ }
53
+ return [
54
+ `🐉 ${this.state.active} active agent${this.state.active > 1 ? "s" : ""}`,
55
+ this.state.currentTask ? ` Task: ${this.state.currentTask.slice(0, 40)}` : "",
56
+ this.state.depth > 0 ? ` Depth: ${this.state.depth}` : "",
57
+ ].filter(Boolean).join("\n");
58
+ }
59
+ async refresh() {
60
+ // Throttle: max 1 update per second
61
+ const now = Date.now();
62
+ if (now - this.lastUpdate < 1000)
63
+ return;
64
+ this.lastUpdate = now;
65
+ try {
66
+ const tree = await this.tui.getAgentTree();
67
+ this.state = this.aggregateTree(tree);
68
+ }
69
+ catch {
70
+ // Ignore errors - registry might be temporarily unavailable
71
+ }
72
+ }
73
+ aggregateTree(tree) {
74
+ if (!tree) {
75
+ return { active: 0, total: 0, depth: 0 };
76
+ }
77
+ return this.countTree(tree, 0);
78
+ }
79
+ countTree(node, depth) {
80
+ const isActive = node.status === "running";
81
+ let maxChildDepth = depth;
82
+ const result = {
83
+ active: isActive ? 1 : 0,
84
+ total: 1,
85
+ currentTask: isActive ? node.task : undefined,
86
+ currentAgent: isActive ? node.runId : undefined,
87
+ depth,
88
+ };
89
+ for (const child of node.children) {
90
+ const childResult = this.countTree(child, depth + 1);
91
+ result.active += childResult.active;
92
+ result.total += childResult.total;
93
+ maxChildDepth = Math.max(maxChildDepth, childResult.depth);
94
+ // Track first active task found
95
+ if (!result.currentTask && childResult.currentTask) {
96
+ result.currentTask = childResult.currentTask;
97
+ result.currentAgent = childResult.currentAgent;
98
+ }
99
+ }
100
+ result.depth = maxChildDepth;
101
+ return result;
102
+ }
103
+ }
104
+ // Factory for PI TUI integration
105
+ export function createStatusBarProvider(tui) {
106
+ const statusBar = new DraconicStatusBar(tui);
107
+ return {
108
+ start: () => statusBar.start(),
109
+ stop: () => statusBar.stop(),
110
+ getText: () => statusBar.getText(),
111
+ getTooltip: () => statusBar.getTooltip(),
112
+ getDetailedStatus: () => statusBar.getDetailedStatus(),
113
+ };
114
+ }
115
+ //# sourceMappingURL=status-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../../../../src/tui/components/status-bar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,OAAO,iBAAiB;IAKR;IAA0B;IAJtC,KAAK,GAAmB,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC1D,QAAQ,CAAkB;IAC1B,UAAU,GAAG,CAAC,CAAC;IAEvB,YAAoB,GAAgB,EAAU,iBAAiB,GAAG;QAA9C,QAAG,GAAH,GAAG,CAAa;QAAU,mBAAc,GAAd,cAAc,CAAM;IAAG,CAAC;IAEtE,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3D,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,MAAM,WAAW,EAAE,CAAC;IACpD,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG;YACZ,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrC,iBAAiB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACnC,cAAc,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;SACjC,CAAC;QAEF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,gCAAgC,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACzE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC9E,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;SAC3D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI;YAAE,OAAO;QACzC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,4DAA4D;QAC9D,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAsB;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC;IAEO,SAAS,CAAC,IAAe,EAAE,KAAa;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;QAC3C,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,MAAM,MAAM,GAAmB;YAC7B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC7C,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC/C,KAAK;SACN,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;YACpC,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC;YAClC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;YAE3D,gCAAgC;YAChC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;gBACnD,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;gBAC7C,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;YACjD,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,UAAU,uBAAuB,CAAC,GAAgB;IACtD,MAAM,SAAS,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAE7C,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;QAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;QAC5B,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;QAClC,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE;QACxC,iBAAiB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE;KACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 🐉 Tree Header Component
3
+ *
4
+ * Persistent header showing agent tree at the top of TUI
5
+ */
6
+ export class TreeHeader {
7
+ registry;
8
+ maxHeight = 5; // Max 5 lines for header
9
+ constructor(registry) {
10
+ this.registry = registry;
11
+ }
12
+ /**
13
+ * Render the tree as compact header lines
14
+ */
15
+ render(width) {
16
+ // 🔧 FIX: Only show ACTIVE runs, not completed
17
+ const activeRuns = this.registry.query({ status: "running" }).runs;
18
+ if (activeRuns.length === 0) {
19
+ return ["🐉 No active agents"];
20
+ }
21
+ const stats = this.registry.getStats();
22
+ const lines = [];
23
+ // Header line - just show ACTIVE count (not active/total)
24
+ const totalActive = activeRuns.length;
25
+ lines.push(`🐉 Agents: ${totalActive} running`);
26
+ // Find root runs (depth 0 or no parent) - only active
27
+ const rootRuns = activeRuns.filter(r => !r.parentId || r.depth === 0);
28
+ // Show compact tree
29
+ rootRuns.slice(0, 2).forEach((run, i) => {
30
+ const status = run.status === "running" ? "●" :
31
+ run.status === "completed" ? "✓" :
32
+ run.status === "error" ? "✗" : "○";
33
+ const type = run.type?.[0]?.toUpperCase() || "?";
34
+ const task = run.task?.slice(0, width - 25) || "";
35
+ // Find direct children - only active
36
+ const children = activeRuns.filter(r => r.parentId === run.id);
37
+ const childCount = children.length > 0 ? ` [+${children.length}]` : "";
38
+ lines.push(` ${status} [${type}] ${run.id.slice(-6)}${childCount} ${task}`);
39
+ // Show up to 2 children
40
+ children.slice(0, 2).forEach((child, ci) => {
41
+ const cStatus = child.status === "running" ? "●" :
42
+ child.status === "completed" ? "✓" :
43
+ child.status === "error" ? "✗" : "○";
44
+ const cType = child.type?.[0]?.toUpperCase() || "?";
45
+ const isLast = ci === Math.min(children.length - 1, 1);
46
+ const prefix = isLast ? " └─" : " ├─";
47
+ lines.push(`${prefix} ${cStatus} [${cType}] ${child.id.slice(-6)} ${child.task?.slice(0, width - 35) || ""}`);
48
+ });
49
+ if (children.length > 2) {
50
+ lines.push(` └─ ... and ${children.length - 2} more`);
51
+ }
52
+ });
53
+ if (rootRuns.length > 2) {
54
+ lines.push(` ... and ${rootRuns.length - 2} more agent trees`);
55
+ }
56
+ return lines.slice(0, this.maxHeight);
57
+ }
58
+ /**
59
+ * Get compact one-line status for footer
60
+ */
61
+ getCompactStatus() {
62
+ const stats = this.registry.getStats();
63
+ const activeRuns = this.registry.query({ status: "running" }).runs;
64
+ if (stats.activeRuns === 0)
65
+ return "🐉 idle";
66
+ // Prioritize running subagents (depth > 0)
67
+ const displayRun = activeRuns
68
+ .filter(r => r.depth > 0)
69
+ .sort((a, b) => (b.metrics?.lastActivityAt || 0) - (a.metrics?.lastActivityAt || 0))[0]
70
+ || activeRuns[0];
71
+ // 🔧 Show "X running" (not X/Y which is confusing)
72
+ const completedCount = stats.totalRuns - stats.activeRuns;
73
+ const completedInfo = completedCount > 0 ? ` (+${completedCount} completed)` : "";
74
+ if (displayRun) {
75
+ const emoji = displayRun.type === "specialist" ? "👨‍💻" :
76
+ displayRun.type === "researcher" ? "🔬" :
77
+ displayRun.type === "planner" ? "📋" :
78
+ displayRun.type === "reviewer" ? "👁️" : "🐉";
79
+ const task = displayRun.task?.slice(0, 15) || "";
80
+ return `🐉 ${stats.activeRuns} running${completedInfo} ${emoji} ${task}`;
81
+ }
82
+ return `🐉 ${stats.activeRuns} running${completedInfo}`;
83
+ }
84
+ }
85
+ //# sourceMappingURL=tree-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-header.js","sourceRoot":"","sources":["../../../../src/tui/components/tree-header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * 🐉 Draconic TUI - Dual Mode Orchestration Interface
3
+ *
4
+ * Provides unified interface for both local (direct) and remote (gateway) modes.
5
+ * Local mode is default - uses agent_orchestrate tool directly.
6
+ * Remote mode connects via WebSocket to gateway.
7
+ */
8
+ import { EventEmitter } from "node:events";
9
+ import { getDraconicRunRegistry } from "../agent/DraconicRunRegistry";
10
+ // Mode detection
11
+ export function detectMode() {
12
+ if (process.env.KOBOLD_REMOTE_URL)
13
+ return "remote";
14
+ if (process.argv.includes("--remote"))
15
+ return "remote";
16
+ return "local";
17
+ }
18
+ // Factory function
19
+ export function createDraconicTUI() {
20
+ const mode = detectMode();
21
+ if (mode === "remote") {
22
+ const url = process.env.KOBOLD_REMOTE_URL ||
23
+ process.argv[process.argv.indexOf("--remote") + 1] ||
24
+ "ws://localhost:18789";
25
+ return new GatewayDraconicTUI(url);
26
+ }
27
+ return new DirectDraconicTUI();
28
+ }
29
+ // ============================================================================
30
+ // LOCAL MODE: Direct registry access (default, superior)
31
+ // ============================================================================
32
+ class DirectDraconicTUI extends EventEmitter {
33
+ mode = "local";
34
+ url = undefined;
35
+ currentRunId;
36
+ registry = getDraconicRunRegistry();
37
+ constructor() {
38
+ super();
39
+ // Get current run ID from environment if available
40
+ this.currentRunId = process.env.DRACONIC_RUN_ID;
41
+ }
42
+ async spawnSubagent(options) {
43
+ // Create run in registry
44
+ const run = this.registry.create({
45
+ sessionKey: process.env.DRACONIC_SESSION_KEY || "default",
46
+ name: `${options.type}-${Date.now()}`,
47
+ type: options.type,
48
+ task: options.task,
49
+ workspace: process.cwd(),
50
+ capabilities: {
51
+ primary: [options.type],
52
+ secondary: [],
53
+ },
54
+ parentId: options.parentId || this.currentRunId,
55
+ depth: options.parentId ? (this.registry.get(options.parentId)?.depth ?? 0) + 1 : 1,
56
+ isProcessingQueue: false,
57
+ });
58
+ this.registry.updateStatus(run.id, "running");
59
+ const spawnResult = {
60
+ runId: run.id,
61
+ parentId: options.parentId || this.currentRunId,
62
+ type: options.type,
63
+ status: "running",
64
+ task: options.task,
65
+ tokens: { estimated: 1000 }, // Would calculate
66
+ };
67
+ this.emit("spawned", spawnResult);
68
+ return spawnResult;
69
+ }
70
+ async listAgents() {
71
+ const stats = this.registry.getStats();
72
+ if (stats.totalRuns === 0)
73
+ return [];
74
+ // Get all root-level runs
75
+ const allRuns = this.registry.query({}).runs;
76
+ const rootRuns = allRuns.filter(r => !r.parentId);
77
+ return rootRuns.map(run => this.runToTree(run));
78
+ }
79
+ async getAgentTree(runId) {
80
+ // If no runId specified, get first root run or return null
81
+ if (!runId) {
82
+ const allRuns = this.registry.query({}).runs;
83
+ const rootRuns = allRuns.filter(r => !r.parentId);
84
+ if (rootRuns.length === 0)
85
+ return null;
86
+ return this.runToTree(rootRuns[0]);
87
+ }
88
+ const run = this.registry.get(runId);
89
+ if (!run)
90
+ return null;
91
+ return this.runToTree(run);
92
+ }
93
+ async getResult(runId) {
94
+ const run = this.registry.get(runId);
95
+ if (!run)
96
+ return null;
97
+ if (run.artifacts && run.artifacts.length > 0) {
98
+ return run.artifacts.map(a => ({ ...a, runId }));
99
+ }
100
+ // Fallback: try to read from file
101
+ try {
102
+ const fs = await import("node:fs/promises");
103
+ const path = await import("node:path");
104
+ const os = await import("node:os");
105
+ const artifactDir = path.join(os.homedir(), ".0xkobold", "agents", "outputs");
106
+ const artifactPath = path.join(artifactDir, `${runId}.json`);
107
+ const content = await fs.readFile(artifactPath, "utf-8");
108
+ const artifact = { ...JSON.parse(content), runId };
109
+ return [artifact];
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ }
115
+ async killAgent(runId) {
116
+ const run = this.registry.get(runId);
117
+ if (!run)
118
+ return false;
119
+ this.registry.updateStatus(runId, "error");
120
+ return true;
121
+ }
122
+ async getStatus(runId) {
123
+ if (runId) {
124
+ const run = this.registry.get(runId);
125
+ return run ? { run } : null;
126
+ }
127
+ return this.registry.getStats();
128
+ }
129
+ runToTree(run) {
130
+ const children = [];
131
+ for (const childId of run.children) {
132
+ const childRun = this.registry.get(childId);
133
+ if (childRun) {
134
+ children.push(this.runToTree(childRun));
135
+ }
136
+ }
137
+ return {
138
+ runId: run.id,
139
+ type: run.type,
140
+ status: run.status,
141
+ task: run.task,
142
+ children,
143
+ };
144
+ }
145
+ }
146
+ // ============================================================================
147
+ // REMOTE MODE: WebSocket gateway client
148
+ // ============================================================================
149
+ class GatewayDraconicTUI extends EventEmitter {
150
+ url;
151
+ mode = "remote";
152
+ ws = null;
153
+ messageId = 0;
154
+ pending = new Map();
155
+ constructor(url) {
156
+ super();
157
+ this.url = url;
158
+ this.connect();
159
+ }
160
+ async spawnSubagent(options) {
161
+ const result = await this.wsRequest({
162
+ method: "agent.spawn",
163
+ params: {
164
+ type: options.type,
165
+ task: options.task,
166
+ parentId: options.parentId,
167
+ strategy: options.strategy,
168
+ },
169
+ });
170
+ const spawnResult = {
171
+ runId: result.runId,
172
+ parentId: options.parentId,
173
+ type: options.type,
174
+ status: "running",
175
+ task: options.task,
176
+ tokens: result.tokens,
177
+ };
178
+ this.emit("spawned", spawnResult);
179
+ // Listen for completion
180
+ this.once(`completed:${result.runId}`, (completed) => {
181
+ Object.assign(spawnResult, completed);
182
+ this.emit("completed", spawnResult);
183
+ });
184
+ return spawnResult;
185
+ }
186
+ async listAgents() {
187
+ const result = await this.wsRequest({
188
+ method: "agent.list",
189
+ });
190
+ return result.agents || [];
191
+ }
192
+ async getAgentTree(runId) {
193
+ const result = await this.wsRequest({
194
+ method: "agent.tree",
195
+ params: { runId },
196
+ });
197
+ return result.tree || null;
198
+ }
199
+ async getResult(runId) {
200
+ const result = await this.wsRequest({
201
+ method: "agent.artifacts",
202
+ params: { runId },
203
+ });
204
+ return result.artifacts || null;
205
+ }
206
+ async killAgent(runId) {
207
+ const result = await this.wsRequest({
208
+ method: "agent.kill",
209
+ params: { runId },
210
+ });
211
+ return result.success;
212
+ }
213
+ async getStatus(runId) {
214
+ const result = await this.wsRequest({
215
+ method: "agent.status",
216
+ params: { runId },
217
+ });
218
+ return result.status;
219
+ }
220
+ async connect() {
221
+ // WebSocket connection with auto-reconnect
222
+ // Implementation would use native WebSocket or ws library
223
+ console.log(`[DraconicTUI] Connecting to ${this.url}...`);
224
+ }
225
+ async wsRequest(message) {
226
+ return new Promise((resolve, reject) => {
227
+ const id = String(++this.messageId);
228
+ this.pending.set(id, { resolve, reject });
229
+ if (this.ws?.readyState === WebSocket.OPEN) {
230
+ this.ws.send(JSON.stringify({ ...message, id }));
231
+ }
232
+ else {
233
+ reject(new Error("WebSocket not connected"));
234
+ }
235
+ // Timeout
236
+ setTimeout(() => {
237
+ if (this.pending.has(id)) {
238
+ this.pending.delete(id);
239
+ reject(new Error("Request timeout"));
240
+ }
241
+ }, 30000);
242
+ });
243
+ }
244
+ }
245
+ export function createOrchestratorStatus(tui) {
246
+ let lastStatus = { active: 0, total: 0, current: "" };
247
+ // Subscribe to updates
248
+ tui.on("spawned", () => update());
249
+ tui.on("completed", () => update());
250
+ async function update() {
251
+ try {
252
+ const tree = await tui.getAgentTree();
253
+ const agents = await countAgents(tree);
254
+ lastStatus = {
255
+ active: agents.active,
256
+ total: agents.total,
257
+ current: agents.currentTask || "idle",
258
+ };
259
+ }
260
+ catch {
261
+ // Ignore errors
262
+ }
263
+ }
264
+ async function countAgents(tree) {
265
+ if (!tree)
266
+ return { active: 0, total: 0 };
267
+ let active = tree.status === "running" ? 1 : 0;
268
+ let total = 1;
269
+ let currentTask = tree.status === "running" ? tree.task : undefined;
270
+ for (const child of tree.children) {
271
+ const childCount = await countAgents(child);
272
+ active += childCount.active;
273
+ total += childCount.total;
274
+ if (!currentTask && childCount.currentTask) {
275
+ currentTask = childCount.currentTask;
276
+ }
277
+ }
278
+ return { active, total, currentTask };
279
+ }
280
+ return {
281
+ getText() {
282
+ if (lastStatus.active === 0)
283
+ return "🐉 idle";
284
+ return `🐉 ${lastStatus.current.slice(0, 20)}... (${lastStatus.active})`;
285
+ },
286
+ getTooltip() {
287
+ return `${lastStatus.active} active agents, ${lastStatus.total} total`;
288
+ },
289
+ };
290
+ }
291
+ //# sourceMappingURL=draconic-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draconic-tui.js","sourceRoot":"","sources":["../../../src/tui/draconic-tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 🐉 0xKobold TUI Entry Point
3
+ *
4
+ * Mode-aware TUI initialization:
5
+ * - LOCAL mode (default): Direct Draconic orchestration
6
+ * - REMOTE mode (--remote): Gateway client
7
+ *
8
+ * Usage:
9
+ * bun run tui # Local mode (superior)
10
+ * bun run tui --remote # Remote gateway mode
11
+ */
12
+ import { createDraconicTUI, detectMode, } from "./draconic-tui";
13
+ import { createStatusBarProvider } from "./components/status-bar";
14
+ import { createAgentTreeComponent } from "./components/agent-tree-overlay";
15
+ import { createOrchestrationCommandHandlers } from "./commands/orchestration-commands";
16
+ export function createKoboldTUI(options = {}) {
17
+ // Detect or use provided mode
18
+ const mode = options.mode || detectMode();
19
+ console.log(`🐉 0xKobold TUI starting in ${mode.toUpperCase()} mode...`);
20
+ // Create Draconic TUI (dual-mode)
21
+ const tui = createDraconicTUI();
22
+ // Create status bar
23
+ const statusBar = createStatusBarProvider(tui);
24
+ // Create command context (simplified - would integrate with actual TUI)
25
+ const commandContext = {
26
+ tui,
27
+ chatLog: {
28
+ addSystem: (msg) => console.log("[SYSTEM]", msg),
29
+ addUser: (msg) => console.log("[USER]", msg),
30
+ addAssistant: (msg) => console.log("[ASSISTANT]", msg),
31
+ },
32
+ openOverlay: (component) => console.log("[OVERLAY]", component),
33
+ closeOverlay: () => console.log("[OVERLAY CLOSED]"),
34
+ requestRender: () => { },
35
+ getCurrentSession: () => ({ agentId: options.agentId, runId: process.env.DRACONIC_RUN_ID }),
36
+ };
37
+ // Create command handlers
38
+ const commands = createOrchestrationCommandHandlers(commandContext);
39
+ // Tree overlay factory
40
+ const getTreeOverlay = () => createAgentTreeComponent(tui);
41
+ // Subscribe to events
42
+ tui.on("spawned", (result) => {
43
+ commandContext.chatLog.addSystem(`🐉 Agent spawned: ${result.runId} [${result.type}]`);
44
+ });
45
+ tui.on("completed", (result) => {
46
+ commandContext.chatLog.addSystem(`✅ ${result.runId} completed (${result.duration}ms, ${result.tokens?.actual} tokens)`);
47
+ });
48
+ tui.on("error", (error) => {
49
+ commandContext.chatLog.addSystem(`❌ Orchestrator error: ${error.message}`);
50
+ });
51
+ return {
52
+ tui,
53
+ statusBar,
54
+ commands,
55
+ getTreeOverlay,
56
+ mode,
57
+ };
58
+ }
59
+ // CLI entry point
60
+ if (import.meta.main) {
61
+ const args = process.argv.slice(2);
62
+ const isRemote = args.includes("--remote");
63
+ const remoteUrl = isRemote
64
+ ? (args[args.indexOf("--remote") + 1] || process.env.KOBOLD_REMOTE_URL || "ws://localhost:18789")
65
+ : undefined;
66
+ const kobold = createKoboldTUI({
67
+ mode: isRemote ? "remote" : "local",
68
+ remoteUrl,
69
+ });
70
+ // Start status bar updates
71
+ kobold.statusBar.start();
72
+ // Print initial status
73
+ console.log("🐉 0xKobold TUI Ready");
74
+ console.log(` Mode: ${kobold.mode.toUpperCase()}`);
75
+ console.log(` Status: ${kobold.statusBar.getText()}`);
76
+ console.log("");
77
+ console.log("Commands:");
78
+ console.log(kobold.commands.getHelp());
79
+ console.log("");
80
+ // Demo: Show tree (would be interactive in real TUI)
81
+ setTimeout(async () => {
82
+ const tree = await kobold.tui.getAgentTree();
83
+ if (tree) {
84
+ console.log("Current agent tree:");
85
+ console.log(JSON.stringify(tree, null, 2));
86
+ }
87
+ else {
88
+ console.log("No agents running. Try: /agent-spawn researcher 'hello world'");
89
+ }
90
+ }, 1000);
91
+ }
92
+ export default createKoboldTUI;
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/index.ts"],"names":[],"mappings":"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"}