0xkobold 0.7.2 → 0.8.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 (252) hide show
  1. package/HEARTBEAT.md +239 -0
  2. package/IDENTITY.md +12 -0
  3. package/README.md +138 -4
  4. package/SOUL.md +21 -0
  5. package/dist/package.json +10 -5
  6. package/dist/src/agent/bootstrap-loader.js +295 -66
  7. package/dist/src/agent/bootstrap-loader.js.map +1 -1
  8. package/dist/src/agent/context-pruning.js +10 -5
  9. package/dist/src/agent/context-pruning.js.map +1 -1
  10. package/dist/src/agent/embedded-runner.js +29 -15
  11. package/dist/src/agent/embedded-runner.js.map +1 -1
  12. package/dist/src/agent/index.js +5 -2
  13. package/dist/src/agent/index.js.map +1 -1
  14. package/dist/src/agent/system-prompt.js +167 -20
  15. package/dist/src/agent/system-prompt.js.map +1 -1
  16. package/dist/src/agent/tools/spawn-agent.js +72 -5
  17. package/dist/src/agent/tools/spawn-agent.js.map +1 -1
  18. package/dist/src/channels/slack/webhook.js +2 -2
  19. package/dist/src/channels/slack/webhook.js.map +1 -1
  20. package/dist/src/channels/telegram/bot.js +4 -4
  21. package/dist/src/channels/telegram/bot.js.map +1 -1
  22. package/dist/src/channels/whatsapp/integration.js +4 -4
  23. package/dist/src/channels/whatsapp/integration.js.map +1 -1
  24. package/dist/src/cli/commands/gateway.js +9 -10
  25. package/dist/src/cli/commands/gateway.js.map +1 -1
  26. package/dist/src/cli/commands/init.js +90 -0
  27. package/dist/src/cli/commands/init.js.map +1 -1
  28. package/dist/src/cli/commands/setup.js +53 -0
  29. package/dist/src/cli/commands/setup.js.map +1 -1
  30. package/dist/src/cli/index.js +0 -0
  31. package/dist/src/config/unified-config.js +5 -0
  32. package/dist/src/config/unified-config.js.map +1 -1
  33. package/dist/src/cron/index.js +2 -0
  34. package/dist/src/cron/index.js.map +1 -1
  35. package/dist/src/cron/nl-parser.js +522 -0
  36. package/dist/src/cron/nl-parser.js.map +1 -0
  37. package/dist/src/cron/runner.js +6 -31
  38. package/dist/src/cron/runner.js.map +1 -1
  39. package/dist/src/event-bus/index.js.map +1 -1
  40. package/dist/src/extensions/core/agent-orchestrator-extension.js +200 -148
  41. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -1
  42. package/dist/src/extensions/core/diagnostics-extension.js +93 -56
  43. package/dist/src/extensions/core/diagnostics-extension.js.map +1 -1
  44. package/dist/src/extensions/core/draconic-safety-extension.js +256 -3
  45. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -1
  46. package/dist/src/extensions/core/heartbeat-extension.js +416 -150
  47. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
  48. package/dist/src/extensions/core/{generative-agents-extension.js → learning-extension.js} +90 -128
  49. package/dist/src/extensions/core/learning-extension.js.map +1 -0
  50. package/dist/src/extensions/core/perennial-memory-extension.js +884 -87
  51. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  52. package/dist/src/extensions/core/routed-ollama-extension.js +345 -0
  53. package/dist/src/extensions/core/routed-ollama-extension.js.map +1 -0
  54. package/dist/src/extensions/core/task-manager-extension.js +25 -2
  55. package/dist/src/extensions/core/task-manager-extension.js.map +1 -1
  56. package/dist/src/extensions/core/websearch-enhanced-extension.js +81 -23
  57. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -1
  58. package/dist/src/extensions/core/workspace-footer-extension.js +40 -63
  59. package/dist/src/extensions/core/workspace-footer-extension.js.map +1 -1
  60. package/dist/src/extensions/loader.js +5 -1
  61. package/dist/src/extensions/loader.js.map +1 -1
  62. package/dist/src/gateway/gateway-server.js +74 -3
  63. package/dist/src/gateway/gateway-server.js.map +1 -1
  64. package/dist/src/gateway/index.js +2 -2
  65. package/dist/src/gateway/index.js.map +1 -1
  66. package/dist/src/gateway/methods/agent.js +1 -1
  67. package/dist/src/gateway/methods/agent.js.map +1 -1
  68. package/dist/src/gateway/methods/index.js +4 -0
  69. package/dist/src/gateway/methods/index.js.map +1 -1
  70. package/dist/src/gateway/methods/node.js +261 -0
  71. package/dist/src/gateway/methods/node.js.map +1 -0
  72. package/dist/src/gateway/queue-modes.js +356 -0
  73. package/dist/src/gateway/queue-modes.js.map +1 -0
  74. package/dist/src/index.js +47 -6
  75. package/dist/src/index.js.map +1 -1
  76. package/dist/src/llm/community-analytics.js +569 -0
  77. package/dist/src/llm/community-analytics.js.map +1 -0
  78. package/dist/src/llm/index.js +28 -4
  79. package/dist/src/llm/index.js.map +1 -1
  80. package/dist/src/llm/model-discovery.js +335 -0
  81. package/dist/src/llm/model-discovery.js.map +1 -0
  82. package/dist/src/llm/model-popularity.js +566 -0
  83. package/dist/src/llm/model-popularity.js.map +1 -0
  84. package/dist/src/llm/model-scoring-db.js +553 -0
  85. package/dist/src/llm/model-scoring-db.js.map +1 -0
  86. package/dist/src/llm/multi-provider.js +258 -0
  87. package/dist/src/llm/multi-provider.js.map +1 -0
  88. package/dist/src/llm/ollama.js +133 -187
  89. package/dist/src/llm/ollama.js.map +1 -1
  90. package/dist/src/llm/router-commands.js +773 -0
  91. package/dist/src/llm/router-commands.js.map +1 -0
  92. package/dist/src/llm/router-core.js +600 -0
  93. package/dist/src/llm/router-core.js.map +1 -0
  94. package/dist/src/memory/checkpoint-manager.js +278 -0
  95. package/dist/src/memory/checkpoint-manager.js.map +1 -0
  96. package/dist/src/memory/conflict-detector.js +279 -0
  97. package/dist/src/memory/conflict-detector.js.map +1 -0
  98. package/dist/src/memory/context-graph.js +360 -0
  99. package/dist/src/memory/context-graph.js.map +1 -0
  100. package/dist/src/memory/dialectic/benchmark-cli.js +200 -0
  101. package/dist/src/memory/dialectic/benchmark-cli.js.map +1 -0
  102. package/dist/src/memory/dialectic/debug-reasoning.js +37 -0
  103. package/dist/src/memory/dialectic/debug-reasoning.js.map +1 -0
  104. package/dist/src/memory/dialectic/index.js +135 -0
  105. package/dist/src/memory/dialectic/index.js.map +1 -0
  106. package/dist/src/memory/dialectic/nudges.js +380 -0
  107. package/dist/src/memory/dialectic/nudges.js.map +1 -0
  108. package/dist/src/memory/dialectic/reasoning-engine.js +607 -0
  109. package/dist/src/memory/dialectic/reasoning-engine.js.map +1 -0
  110. package/dist/src/memory/dialectic/reasoning.js +390 -0
  111. package/dist/src/memory/dialectic/reasoning.js.map +1 -0
  112. package/dist/src/memory/dialectic/skill-creation.js +481 -0
  113. package/dist/src/memory/dialectic/skill-creation.js.map +1 -0
  114. package/dist/src/memory/dialectic/store.js +663 -0
  115. package/dist/src/memory/dialectic/store.js.map +1 -0
  116. package/dist/src/memory/dialectic/types.js +11 -0
  117. package/dist/src/memory/dialectic/types.js.map +1 -0
  118. package/dist/src/memory/index.js +24 -2
  119. package/dist/src/memory/index.js.map +1 -1
  120. package/dist/src/memory/memory-decay.js +350 -0
  121. package/dist/src/memory/memory-decay.js.map +1 -0
  122. package/dist/src/memory/memory-integration.js +5 -5
  123. package/dist/src/memory/memory-integration.js.map +1 -1
  124. package/dist/src/memory/migrate-memory-stream.js +97 -0
  125. package/dist/src/memory/migrate-memory-stream.js.map +1 -0
  126. package/dist/src/memory/session-memory-bridge.js +49 -5
  127. package/dist/src/memory/session-memory-bridge.js.map +1 -1
  128. package/dist/src/memory/session-store.js +123 -0
  129. package/dist/src/memory/session-store.js.map +1 -1
  130. package/dist/src/memory/smart-write-rules.js +164 -0
  131. package/dist/src/memory/smart-write-rules.js.map +1 -0
  132. package/dist/src/memory/tiered-memory.js +436 -0
  133. package/dist/src/memory/tiered-memory.js.map +1 -0
  134. package/dist/src/memory/types.js +6 -0
  135. package/dist/src/memory/types.js.map +1 -0
  136. package/dist/src/memory/verify-migration.js +99 -0
  137. package/dist/src/memory/verify-migration.js.map +1 -0
  138. package/dist/src/pi-config.js +11 -9
  139. package/dist/src/pi-config.js.map +1 -1
  140. package/dist/src/skills/conditional-skills.js +464 -0
  141. package/dist/src/skills/conditional-skills.js.map +1 -0
  142. package/dist/src/skills/index.js +5 -0
  143. package/dist/src/skills/index.js.map +1 -1
  144. package/dist/src/skills/loader.js +56 -0
  145. package/dist/src/skills/loader.js.map +1 -1
  146. package/dist/src/skills/skill-manage.js +417 -0
  147. package/dist/src/skills/skill-manage.js.map +1 -0
  148. package/dist/src/tui/commands/orchestration-commands.js +62 -0
  149. package/dist/src/tui/commands/orchestration-commands.js.map +1 -1
  150. package/package.json +10 -5
  151. package/skills/model-router-test.ts +65 -0
  152. package/dist/src/extensions/core/auto-security-scan-extension.js +0 -41
  153. package/dist/src/extensions/core/auto-security-scan-extension.js.map +0 -1
  154. package/dist/src/extensions/core/cloudflare-browser-extension.js +0 -389
  155. package/dist/src/extensions/core/cloudflare-browser-extension.js.map +0 -1
  156. package/dist/src/extensions/core/compaction-safeguard.js +0 -223
  157. package/dist/src/extensions/core/compaction-safeguard.js.map +0 -1
  158. package/dist/src/extensions/core/generative-agents-extension.js.map +0 -1
  159. package/dist/src/extensions/core/obsidian-bridge-extension.js +0 -488
  160. package/dist/src/extensions/core/obsidian-bridge-extension.js.map +0 -1
  161. package/dist/src/llm/router.js +0 -145
  162. package/dist/src/llm/router.js.map +0 -1
  163. package/skills/kobold-scan-skill/node_modules/.package-lock.json +0 -172
  164. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.d.ts +0 -345
  165. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.js +0 -163
  166. package/skills/kobold-scan-skill/node_modules/ansi-styles/license +0 -9
  167. package/skills/kobold-scan-skill/node_modules/ansi-styles/package.json +0 -56
  168. package/skills/kobold-scan-skill/node_modules/ansi-styles/readme.md +0 -152
  169. package/skills/kobold-scan-skill/node_modules/balanced-match/.github/FUNDING.yml +0 -2
  170. package/skills/kobold-scan-skill/node_modules/balanced-match/LICENSE.md +0 -21
  171. package/skills/kobold-scan-skill/node_modules/balanced-match/README.md +0 -97
  172. package/skills/kobold-scan-skill/node_modules/balanced-match/index.js +0 -62
  173. package/skills/kobold-scan-skill/node_modules/balanced-match/package.json +0 -48
  174. package/skills/kobold-scan-skill/node_modules/brace-expansion/.github/FUNDING.yml +0 -2
  175. package/skills/kobold-scan-skill/node_modules/brace-expansion/LICENSE +0 -21
  176. package/skills/kobold-scan-skill/node_modules/brace-expansion/README.md +0 -135
  177. package/skills/kobold-scan-skill/node_modules/brace-expansion/index.js +0 -203
  178. package/skills/kobold-scan-skill/node_modules/brace-expansion/package.json +0 -49
  179. package/skills/kobold-scan-skill/node_modules/chalk/index.d.ts +0 -415
  180. package/skills/kobold-scan-skill/node_modules/chalk/license +0 -9
  181. package/skills/kobold-scan-skill/node_modules/chalk/package.json +0 -68
  182. package/skills/kobold-scan-skill/node_modules/chalk/readme.md +0 -341
  183. package/skills/kobold-scan-skill/node_modules/chalk/source/index.js +0 -229
  184. package/skills/kobold-scan-skill/node_modules/chalk/source/templates.js +0 -134
  185. package/skills/kobold-scan-skill/node_modules/chalk/source/util.js +0 -39
  186. package/skills/kobold-scan-skill/node_modules/color-convert/CHANGELOG.md +0 -54
  187. package/skills/kobold-scan-skill/node_modules/color-convert/LICENSE +0 -21
  188. package/skills/kobold-scan-skill/node_modules/color-convert/README.md +0 -68
  189. package/skills/kobold-scan-skill/node_modules/color-convert/conversions.js +0 -839
  190. package/skills/kobold-scan-skill/node_modules/color-convert/index.js +0 -81
  191. package/skills/kobold-scan-skill/node_modules/color-convert/package.json +0 -48
  192. package/skills/kobold-scan-skill/node_modules/color-convert/route.js +0 -97
  193. package/skills/kobold-scan-skill/node_modules/color-name/LICENSE +0 -8
  194. package/skills/kobold-scan-skill/node_modules/color-name/README.md +0 -11
  195. package/skills/kobold-scan-skill/node_modules/color-name/index.js +0 -152
  196. package/skills/kobold-scan-skill/node_modules/color-name/package.json +0 -28
  197. package/skills/kobold-scan-skill/node_modules/commander/LICENSE +0 -22
  198. package/skills/kobold-scan-skill/node_modules/commander/Readme.md +0 -1129
  199. package/skills/kobold-scan-skill/node_modules/commander/esm.mjs +0 -16
  200. package/skills/kobold-scan-skill/node_modules/commander/index.js +0 -27
  201. package/skills/kobold-scan-skill/node_modules/commander/lib/argument.js +0 -147
  202. package/skills/kobold-scan-skill/node_modules/commander/lib/command.js +0 -2179
  203. package/skills/kobold-scan-skill/node_modules/commander/lib/error.js +0 -45
  204. package/skills/kobold-scan-skill/node_modules/commander/lib/help.js +0 -461
  205. package/skills/kobold-scan-skill/node_modules/commander/lib/option.js +0 -326
  206. package/skills/kobold-scan-skill/node_modules/commander/lib/suggestSimilar.js +0 -100
  207. package/skills/kobold-scan-skill/node_modules/commander/package-support.json +0 -16
  208. package/skills/kobold-scan-skill/node_modules/commander/package.json +0 -80
  209. package/skills/kobold-scan-skill/node_modules/commander/typings/index.d.ts +0 -891
  210. package/skills/kobold-scan-skill/node_modules/fs.realpath/LICENSE +0 -43
  211. package/skills/kobold-scan-skill/node_modules/fs.realpath/README.md +0 -33
  212. package/skills/kobold-scan-skill/node_modules/fs.realpath/index.js +0 -66
  213. package/skills/kobold-scan-skill/node_modules/fs.realpath/old.js +0 -303
  214. package/skills/kobold-scan-skill/node_modules/fs.realpath/package.json +0 -26
  215. package/skills/kobold-scan-skill/node_modules/glob/LICENSE +0 -15
  216. package/skills/kobold-scan-skill/node_modules/glob/README.md +0 -399
  217. package/skills/kobold-scan-skill/node_modules/glob/common.js +0 -244
  218. package/skills/kobold-scan-skill/node_modules/glob/glob.js +0 -790
  219. package/skills/kobold-scan-skill/node_modules/glob/package.json +0 -55
  220. package/skills/kobold-scan-skill/node_modules/glob/sync.js +0 -486
  221. package/skills/kobold-scan-skill/node_modules/has-flag/index.d.ts +0 -39
  222. package/skills/kobold-scan-skill/node_modules/has-flag/index.js +0 -8
  223. package/skills/kobold-scan-skill/node_modules/has-flag/license +0 -9
  224. package/skills/kobold-scan-skill/node_modules/has-flag/package.json +0 -46
  225. package/skills/kobold-scan-skill/node_modules/has-flag/readme.md +0 -89
  226. package/skills/kobold-scan-skill/node_modules/inflight/LICENSE +0 -15
  227. package/skills/kobold-scan-skill/node_modules/inflight/README.md +0 -37
  228. package/skills/kobold-scan-skill/node_modules/inflight/inflight.js +0 -54
  229. package/skills/kobold-scan-skill/node_modules/inflight/package.json +0 -29
  230. package/skills/kobold-scan-skill/node_modules/inherits/LICENSE +0 -16
  231. package/skills/kobold-scan-skill/node_modules/inherits/README.md +0 -42
  232. package/skills/kobold-scan-skill/node_modules/inherits/inherits.js +0 -9
  233. package/skills/kobold-scan-skill/node_modules/inherits/inherits_browser.js +0 -27
  234. package/skills/kobold-scan-skill/node_modules/inherits/package.json +0 -29
  235. package/skills/kobold-scan-skill/node_modules/minimatch/LICENSE +0 -15
  236. package/skills/kobold-scan-skill/node_modules/minimatch/README.md +0 -259
  237. package/skills/kobold-scan-skill/node_modules/minimatch/lib/path.js +0 -4
  238. package/skills/kobold-scan-skill/node_modules/minimatch/minimatch.js +0 -944
  239. package/skills/kobold-scan-skill/node_modules/minimatch/package.json +0 -35
  240. package/skills/kobold-scan-skill/node_modules/once/LICENSE +0 -15
  241. package/skills/kobold-scan-skill/node_modules/once/README.md +0 -79
  242. package/skills/kobold-scan-skill/node_modules/once/once.js +0 -42
  243. package/skills/kobold-scan-skill/node_modules/once/package.json +0 -33
  244. package/skills/kobold-scan-skill/node_modules/supports-color/browser.js +0 -5
  245. package/skills/kobold-scan-skill/node_modules/supports-color/index.js +0 -135
  246. package/skills/kobold-scan-skill/node_modules/supports-color/license +0 -9
  247. package/skills/kobold-scan-skill/node_modules/supports-color/package.json +0 -53
  248. package/skills/kobold-scan-skill/node_modules/supports-color/readme.md +0 -76
  249. package/skills/kobold-scan-skill/node_modules/wrappy/LICENSE +0 -15
  250. package/skills/kobold-scan-skill/node_modules/wrappy/README.md +0 -36
  251. package/skills/kobold-scan-skill/node_modules/wrappy/package.json +0 -29
  252. package/skills/kobold-scan-skill/node_modules/wrappy/wrappy.js +0 -33
@@ -1,488 +0,0 @@
1
- /**
2
- * Obsidian Bridge Extension - Heartbeat Integration
3
- *
4
- * Uses the Heartbeat scheduler to poll Obsidian for tasks.
5
- *
6
- * How it works:
7
- * 1. On heartbeat 'checkin' events, poll Obsidian vault for #kobold tasks
8
- * 2. Tasks found are written to ~/.0xkobold/obsidian-tasks.json
9
- * 3. On next startup (or via gateway), Kobold processes these tasks
10
- * 4. When tasks complete, Kobold marks them done in Obsidian
11
- *
12
- * This integrates with the existing Heartbeat system (no separate polling)
13
- * and stores tasks in ~/.0xkobold (managed by Kobold, not in project dir)
14
- */
15
- import { homedir } from "os";
16
- import { join } from "path";
17
- import { existsSync, mkdirSync } from "fs";
18
- // Config storage in ~/.0xkobold
19
- const KOBOLD_DIR = join(homedir(), ".0xkobold");
20
- const DEFAULT_VAULT_PATH = join(KOBOLD_DIR, "obsidian_vault");
21
- const TASKS_FILE = join(KOBOLD_DIR, "obsidian-tasks.json");
22
- const STATE_FILE = join(KOBOLD_DIR, "obsidian-bridge-state.json");
23
- const DEFAULT_CONFIG = {
24
- enabled: false,
25
- tasksFilePath: "10-Action/Tasks.md",
26
- pollOn: ["morning", "periodic"], // Poll on morning check-in and every 30 min
27
- };
28
- class ObsidianBridgeExtension {
29
- api;
30
- config;
31
- scheduler = null;
32
- vaultDetected = false;
33
- vaultPath = null;
34
- cliAvailable = false;
35
- constructor(api, config = {}) {
36
- this.api = api;
37
- this.config = { ...DEFAULT_CONFIG, ...config };
38
- // Ensure ~/.0xkobold exists
39
- if (!existsSync(KOBOLD_DIR)) {
40
- mkdirSync(KOBOLD_DIR, { recursive: true });
41
- }
42
- this.init();
43
- }
44
- async init() {
45
- if (!this.config.enabled) {
46
- console.log("[ObsidianBridge] Extension disabled");
47
- return;
48
- }
49
- console.log("[ObsidianBridge] Initializing...");
50
- // Check CLI (optional)
51
- this.checkCli();
52
- // Detect vault - prioritizes ~/.0xkobold/obsidian_vault
53
- await this.detectVault();
54
- // If no vault found, create default Kobold vault
55
- if (!this.vaultPath) {
56
- console.log(`[ObsidianBridge] Creating default vault at ${DEFAULT_VAULT_PATH}`);
57
- this.createDefaultVault();
58
- this.vaultPath = DEFAULT_VAULT_PATH;
59
- }
60
- this.vaultDetected = true;
61
- console.log(`[ObsidianBridge] Connected to vault: ${this.vaultPath}`);
62
- console.log(`[ObsidianBridge] CLI available: ${this.cliAvailable} (advanced features ${this.cliAvailable ? 'enabled' : 'disabled'})`);
63
- // Load any existing tasks
64
- await this.loadState();
65
- // Register with Heartbeat scheduler
66
- this.registerWithHeartbeat();
67
- }
68
- createDefaultVault() {
69
- const vault = DEFAULT_VAULT_PATH;
70
- // Create vault structure
71
- const paths = [
72
- vault,
73
- join(vault, ".obsidian"),
74
- join(vault, "00-Inbox"),
75
- join(vault, "01-Projects"),
76
- join(vault, "10-Action"),
77
- join(vault, "90-Archive"),
78
- join(vault, "Daily"),
79
- ];
80
- for (const path of paths) {
81
- if (!existsSync(path)) {
82
- mkdirSync(path, { recursive: true });
83
- }
84
- }
85
- // Create welcome note
86
- const welcomePath = join(vault, "00-Inbox", "Welcome.md");
87
- if (!existsSync(welcomePath)) {
88
- const welcomeContent = `# Kobold Obsidian Bridge
89
-
90
- Welcome to your Kobold-managed Obsidian vault!
91
-
92
- ## How to use
93
-
94
- 1. **Add tasks**: Create notes in \`00-Inbox/\` or add tasks to \`10-Action/Tasks.md\`
95
- 2. **Tag with #kobold**: Any task tagged #kobold will be picked up by Kobold
96
- 3. **Heartbeat polling**: Kobold checks this vault on heartbeat events
97
- 4. **Processing**: Tasks appear in Kobold kanban for processing
98
- 5. **Completion**: When done, Kobold marks tasks complete here
99
-
100
- ## Folder Structure
101
-
102
- - \`00-Inbox/\` - New tasks and notes
103
- - \`01-Projects/\` - Project-specific notes
104
- - \`10-Action/\` - Tasks and actions (Tasks.md synced with Kobold)
105
- - \`90-Archive/\` - Completed/archived items
106
- - \`Daily/\` - Daily notes exported from Kobold sessions
107
-
108
- ## Quick Start
109
-
110
- \`\`\`markdown
111
- - [ ] Review authentication system #kobold #security
112
- - [ ] Deploy v0.6.11 #kobold #deploy
113
- \`\`\`
114
-
115
- Open this vault in Obsidian: \`${vault}\`
116
- `;
117
- Bun.write(welcomePath, welcomeContent);
118
- }
119
- // Create initial Tasks.md
120
- const tasksPath = join(vault, "10-Action", "Tasks.md");
121
- if (!existsSync(tasksPath)) {
122
- const tasksContent = `# Tasks
123
-
124
- Synced with 0xKobold kanban board.
125
-
126
- ## Active
127
-
128
- - [ ] Example task from Obsidian #kobold
129
-
130
- ## Archive
131
-
132
- <!-- Completed tasks end up here -->
133
- `;
134
- Bun.write(tasksPath, tasksContent);
135
- }
136
- console.log(`[ObsidianBridge] Created default vault with structure`);
137
- }
138
- async detectVault() {
139
- // Priority 1: Check Kobold's managed vault location
140
- if (existsSync(DEFAULT_VAULT_PATH)) {
141
- // Ensure .obsidian folder exists (create if needed)
142
- const obsidianConfigPath = join(DEFAULT_VAULT_PATH, ".obsidian");
143
- if (!existsSync(obsidianConfigPath)) {
144
- mkdirSync(obsidianConfigPath, { recursive: true });
145
- console.log("[ObsidianBridge] Created .obsidian config folder in default vault");
146
- }
147
- this.vaultPath = DEFAULT_VAULT_PATH;
148
- console.log(`[ObsidianBridge] Using Kobold-managed vault: ${DEFAULT_VAULT_PATH}`);
149
- return;
150
- }
151
- // Priority 2: User-configured vault name
152
- if (this.config.vaultName) {
153
- const candidates = [
154
- join(homedir(), "Documents", "Obsidian", this.config.vaultName),
155
- join(homedir(), "Library", "Mobile Documents", "iCloud~md~obsidian", "Documents", this.config.vaultName),
156
- join(homedir(), "iCloudDrive", "Obsidian", this.config.vaultName),
157
- join(homedir(), "Obsidian", this.config.vaultName),
158
- ];
159
- for (const path of candidates) {
160
- if (existsSync(join(path, ".obsidian"))) {
161
- this.vaultPath = path;
162
- console.log(`[ObsidianBridge] Found user vault: ${path}`);
163
- return;
164
- }
165
- }
166
- }
167
- // Priority 3: Try obsidian-cli default
168
- if (this.cliAvailable) {
169
- try {
170
- const { execSync } = await import("child_process");
171
- const result = execSync("obsidian-cli print-default --path-only", {
172
- encoding: "utf-8",
173
- stdio: ["pipe", "pipe", "ignore"]
174
- }).trim();
175
- if (result && existsSync(result)) {
176
- this.vaultPath = result;
177
- console.log(`[ObsidianBridge] Found CLI default vault: ${result}`);
178
- }
179
- }
180
- catch {
181
- // CLI couldn't get default
182
- }
183
- }
184
- }
185
- checkCli() {
186
- try {
187
- const { execSync } = require("child_process");
188
- execSync("which obsidian-cli", { stdio: "ignore" });
189
- this.cliAvailable = true;
190
- }
191
- catch {
192
- this.cliAvailable = false;
193
- }
194
- }
195
- registerWithHeartbeat() {
196
- // Get the Heartbeat scheduler singleton
197
- const { getScheduler } = require("../../heartbeat/scheduler.js");
198
- this.scheduler = getScheduler();
199
- // Listen for check-in events
200
- this.scheduler.on("checkin", (event) => {
201
- if (this.shouldPollOn(event.type)) {
202
- this.pollForTasks();
203
- }
204
- });
205
- console.log(`[ObsidianBridge] Registered with Heartbeat. Polling on: ${this.config.pollOn.join(", ")}`);
206
- }
207
- shouldPollOn(checkInType) {
208
- return this.config.pollOn.includes(checkInType);
209
- }
210
- /**
211
- * Poll Obsidian vault for #kobold tasks
212
- * Called by Heartbeat on scheduled events
213
- * Works without CLI - uses direct file access
214
- */
215
- async pollForTasks() {
216
- if (!this.vaultDetected)
217
- return;
218
- console.log("[ObsidianBridge] Polling for tasks...");
219
- try {
220
- // Use direct file access (no CLI needed)
221
- const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
222
- if (!existsSync(tasksPath)) {
223
- // Create tasks file if it doesn't exist
224
- const tasksDir = join(this.vaultPath, "10-Action");
225
- if (!existsSync(tasksDir)) {
226
- mkdirSync(tasksDir, { recursive: true });
227
- }
228
- const initialContent = `# Tasks\n\nSynced with 0xKobold kanban board.\n\nTasks tagged with #kobold will be picked up by Kobold.\n\n## Active\n\n\n## Archive\n\n<!-- Completed tasks end up here -->\n`;
229
- await Bun.write(tasksPath, initialContent);
230
- console.log(`[ObsidianBridge] Created tasks file: ${tasksPath}`);
231
- return;
232
- }
233
- // Read the tasks file
234
- const content = await Bun.file(tasksPath).text();
235
- const newTasks = this.parseTasks(content);
236
- if (newTasks.length > 0) {
237
- console.log(`[ObsidianBridge] Found ${newTasks.length} new #kobold tasks`);
238
- await this.addTasks(newTasks);
239
- }
240
- else {
241
- console.log("[ObsidianBridge] No new #kobold tasks found");
242
- }
243
- // Update state
244
- await this.saveState({
245
- lastPoll: new Date().toISOString(),
246
- lastProcessedTaskId: newTasks.length > 0 ? newTasks[newTasks.length - 1].id : null,
247
- });
248
- }
249
- catch (error) {
250
- console.error("[ObsidianBridge] Failed to poll for tasks:", error);
251
- }
252
- }
253
- /**
254
- * Parse markdown tasks looking for #kobold tag
255
- */
256
- parseTasks(content) {
257
- const tasks = [];
258
- const lines = content.split("\n");
259
- for (const line of lines) {
260
- // Match: - [ ] Task title #tag1 #tag2
261
- const match = line.match(/^- \[ ] (.+)$/);
262
- if (match) {
263
- const text = match[1];
264
- const tagMatches = text.match(/#\w+/g) || [];
265
- const tags = tagMatches.map(t => t.slice(1));
266
- if (tags.includes("kobold")) {
267
- const title = text.replace(/#\w+/g, "").trim();
268
- const taskId = this.hashTask(title);
269
- tasks.push({
270
- id: taskId,
271
- title,
272
- tags,
273
- source: "obsidian",
274
- discoveredAt: new Date().toISOString(),
275
- status: "pending",
276
- });
277
- }
278
- }
279
- }
280
- return tasks;
281
- }
282
- hashTask(title) {
283
- // Simple hash for task ID
284
- let hash = 0;
285
- for (let i = 0; i < title.length; i++) {
286
- const char = title.charCodeAt(i);
287
- hash = ((hash << 5) - hash) + char;
288
- hash = hash & hash;
289
- }
290
- return `obs-${Math.abs(hash).toString(36)}`;
291
- }
292
- /**
293
- * Add new tasks to the pending list
294
- */
295
- async addTasks(newTasks) {
296
- const state = await this.loadState();
297
- const existingIds = new Set(state.pendingTasks.map(t => t.id));
298
- const trulyNew = newTasks.filter(t => !existingIds.has(t.id));
299
- if (trulyNew.length === 0)
300
- return;
301
- state.pendingTasks.push(...trulyNew);
302
- await this.saveState(state);
303
- }
304
- /**
305
- * Mark a task as complete in Obsidian
306
- * Works without CLI - uses direct file access
307
- */
308
- async completeTask(taskId) {
309
- if (!this.vaultDetected)
310
- return false;
311
- const state = await this.loadState();
312
- const task = state.pendingTasks.find(t => t.id === taskId);
313
- if (!task)
314
- return false;
315
- try {
316
- const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
317
- // Read current content
318
- let content = await Bun.file(tasksPath).text();
319
- // Find and replace [ ] with [x] for this task
320
- const escapedTitle = task.title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
321
- const regex = new RegExp(`^- (\\[ ]|\\[x]) ${escapedTitle}.*$`, "m");
322
- content = content.replace(regex, match => match.replace("[ ]", "[x]"));
323
- // Add Archive section if needed
324
- if (!content.includes("## Archive")) {
325
- content += "\n\n## Archive\n";
326
- }
327
- // Write back
328
- await Bun.write(tasksPath, content);
329
- // Update state
330
- task.status = "completed";
331
- await this.saveState(state);
332
- console.log(`[ObsidianBridge] Completed task: ${task.title}`);
333
- return true;
334
- }
335
- catch (error) {
336
- console.error("[ObsidianBridge] Failed to complete task:", error);
337
- return false;
338
- }
339
- }
340
- escapeRegex(str) {
341
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
342
- }
343
- /**
344
- * Get pending tasks (called by Kobold to process work)
345
- */
346
- async getPendingTasks() {
347
- const state = await this.loadState();
348
- return state.pendingTasks.filter(t => t.status === "pending");
349
- }
350
- /**
351
- * Mark task as in-progress (prevents duplicate processing)
352
- */
353
- async markInProgress(taskId) {
354
- const state = await this.loadState();
355
- const task = state.pendingTasks.find(t => t.id === taskId);
356
- if (task) {
357
- task.status = "in_progress";
358
- await this.saveState(state);
359
- }
360
- }
361
- /**
362
- * Load state from ~/.0xkobold/obsidian-bridge-state.json
363
- */
364
- async loadState() {
365
- if (!existsSync(STATE_FILE)) {
366
- return {
367
- lastPoll: null,
368
- lastProcessedTaskId: null,
369
- pendingTasks: [],
370
- };
371
- }
372
- try {
373
- const content = await Bun.file(STATE_FILE).text();
374
- return JSON.parse(content);
375
- }
376
- catch {
377
- return {
378
- lastPoll: null,
379
- lastProcessedTaskId: null,
380
- pendingTasks: [],
381
- };
382
- }
383
- }
384
- /**
385
- * Save state to ~/.0xkobold/obsidian-bridge-state.json
386
- */
387
- async saveState(partial) {
388
- const current = await this.loadState();
389
- const updated = { ...current, ...partial };
390
- await Bun.write(STATE_FILE, JSON.stringify(updated, null, 2));
391
- }
392
- /**
393
- * Get status for TUI/CLI display
394
- */
395
- async getStatus() {
396
- const state = await this.loadState();
397
- return {
398
- enabled: this.config.enabled,
399
- connected: this.vaultDetected && this.cliAvailable,
400
- vault: this.vaultPath,
401
- pendingCount: state.pendingTasks.filter(t => t.status === "pending").length,
402
- lastPoll: state.lastPoll,
403
- };
404
- }
405
- }
406
- // Extension factory function
407
- export async function registerObsidianBridgeExtension(api, context) {
408
- // Load config from kobold.json
409
- const { loadConfig } = await import("../../config/loader.js");
410
- const configSnapshot = await loadConfig();
411
- // Safely access obsidian config
412
- const obsConfig = configSnapshot.config?.obsidian;
413
- const bridgeConfig = {
414
- enabled: obsConfig?.enabled ?? false,
415
- vaultName: obsConfig?.vault,
416
- tasksFilePath: obsConfig?.tasksFile ?? "10-Action/Tasks.md",
417
- pollOn: obsConfig?.pollOn ?? ["morning", "periodic"],
418
- };
419
- const extension = new ObsidianBridgeExtension(api, bridgeConfig);
420
- // Register tools
421
- api.registerTool({
422
- name: "obsidian_poll_tasks",
423
- label: "/obsidian_poll",
424
- description: "Manually poll Obsidian for #kobold tasks",
425
- // @ts-ignore TSchema mismatch
426
- parameters: {},
427
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
428
- await extension.pollForTasks();
429
- const status = await extension.getStatus();
430
- return {
431
- content: [{ type: "text", text: `Polled Obsidian. Found ${status.pendingCount} pending tasks.` }],
432
- details: { status },
433
- };
434
- },
435
- });
436
- api.registerTool({
437
- name: "obsidian_get_tasks",
438
- label: "/obsidian_tasks",
439
- description: "Get pending tasks from Obsidian bridge",
440
- // @ts-ignore TSchema mismatch
441
- parameters: {},
442
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
443
- const tasks = await extension.getPendingTasks();
444
- return {
445
- content: [{ type: "text", text: `Found ${tasks.length} pending tasks from Obsidian.` }],
446
- details: { tasks, count: tasks.length },
447
- };
448
- },
449
- });
450
- api.registerTool({
451
- name: "obsidian_complete_task",
452
- label: "/obsidian_done",
453
- description: "Mark an Obsidian-sourced task as complete",
454
- // @ts-ignore TSchema mismatch
455
- parameters: {
456
- type: "object",
457
- properties: {
458
- taskId: { type: "string", description: "Task ID from obsidian_get_tasks" },
459
- },
460
- required: ["taskId"],
461
- },
462
- async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
463
- const args = params;
464
- const success = await extension.completeTask(args.taskId);
465
- return {
466
- content: [{ type: "text", text: success ? "Task marked complete in Obsidian" : "Failed to complete task" }],
467
- details: { success },
468
- };
469
- },
470
- });
471
- api.registerTool({
472
- name: "obsidian_status",
473
- label: "/obsidian_status",
474
- description: "Get Obsidian bridge status",
475
- // @ts-ignore TSchema mismatch
476
- parameters: {},
477
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
478
- const status = await extension.getStatus();
479
- return {
480
- content: [{ type: "text", text: `Obsidian Bridge: ${status.enabled ? (status.connected ? "✅ Connected" : "⚠️ Disconnected") : "🔴 Disabled"}` }],
481
- details: { status },
482
- };
483
- },
484
- });
485
- console.log("[ObsidianBridge] Extension registered");
486
- }
487
- export default registerObsidianBridgeExtension;
488
- //# sourceMappingURL=obsidian-bridge-extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"obsidian-bridge-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/obsidian-bridge-extension.ts"],"names":[],"mappings":"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"}
@@ -1,145 +0,0 @@
1
- /**
2
- * Model Router
3
- *
4
- * Smart model selection based on task complexity.
5
- * Uses fast models for simple tasks, switches to smart models for complex reasoning.
6
- */
7
- export class ModelRouter {
8
- models = new Map();
9
- defaultModel;
10
- constructor(defaultModel) {
11
- this.defaultModel = defaultModel ?? 'ollama/llama3.2';
12
- }
13
- /**
14
- * Register a model
15
- */
16
- register(config) {
17
- this.models.set(config.name, config);
18
- }
19
- /**
20
- * Select model based on message and context
21
- */
22
- selectModel(message, history) {
23
- const complexity = this.assessComplexity(message, history);
24
- // Simple queries → fast model
25
- if (complexity < 3) {
26
- const fast = this.findModel({ speed: 'fast' });
27
- if (fast)
28
- return fast.name;
29
- }
30
- // Medium complexity → balanced
31
- if (complexity < 6) {
32
- const medium = this.findModel({ speed: 'medium' });
33
- if (medium)
34
- return medium.name;
35
- }
36
- // Complex reasoning → smart model
37
- const smart = this.findModel({ speed: 'slow' });
38
- if (smart)
39
- return smart.name;
40
- return this.defaultModel;
41
- }
42
- /**
43
- * Assess complexity of a task (0-10 scale)
44
- */
45
- assessComplexity(message, history) {
46
- let score = 0;
47
- // Length factor
48
- if (message.length > 500)
49
- score += 2;
50
- if (message.length > 1000)
51
- score += 2;
52
- // Keywords indicating complexity
53
- const complexKeywords = [
54
- 'analyze', 'compare', 'evaluate', 'synthesize',
55
- 'explain in detail', 'step by step', 'reasoning',
56
- 'architecture', 'design', 'implement',
57
- 'debug', 'optimize', 'refactor',
58
- ];
59
- for (const keyword of complexKeywords) {
60
- if (message.toLowerCase().includes(keyword)) {
61
- score += 1;
62
- }
63
- }
64
- // Code indicators
65
- if (message.includes('```'))
66
- score += 1;
67
- if (/\b(function|class|interface|async|await)\b/.test(message))
68
- score += 1;
69
- // Conversation depth
70
- if (history && history.length > 10)
71
- score += 1;
72
- return Math.min(score, 10);
73
- }
74
- /**
75
- * Find model matching criteria
76
- */
77
- findModel(criteria) {
78
- for (const model of this.models.values()) {
79
- let matches = true;
80
- if (criteria.speed && model.speed !== criteria.speed)
81
- matches = false;
82
- if (criteria.cost && model.cost !== criteria.cost)
83
- matches = false;
84
- if (matches)
85
- return model;
86
- }
87
- // Return first available as fallback
88
- return this.models.values().next().value;
89
- }
90
- /**
91
- * Get provider for a model
92
- */
93
- getProvider(modelName) {
94
- const model = this.models.get(modelName);
95
- return model?.provider;
96
- }
97
- /**
98
- * Get default model
99
- */
100
- getDefaultModel() {
101
- return this.defaultModel;
102
- }
103
- /**
104
- * List available models
105
- */
106
- listModels() {
107
- return Array.from(this.models.keys());
108
- }
109
- }
110
- /**
111
- * Create default router with Ollama models
112
- */
113
- export function createOllamaRouter(provider) {
114
- const router = new ModelRouter('ollama/llama3.2');
115
- // Fast model for simple queries
116
- router.register({
117
- name: 'ollama/llama3.2:3b',
118
- provider,
119
- speed: 'fast',
120
- cost: 'free',
121
- capabilities: ['chat', 'simple'],
122
- contextWindow: 8192,
123
- });
124
- // Medium model for most tasks
125
- router.register({
126
- name: 'ollama/llama3.2',
127
- provider,
128
- speed: 'medium',
129
- cost: 'free',
130
- capabilities: ['chat', 'code', 'reasoning'],
131
- contextWindow: 128000,
132
- });
133
- // Smart model for complex reasoning
134
- router.register({
135
- name: 'ollama/llama3.2:70b',
136
- provider,
137
- speed: 'slow',
138
- cost: 'free',
139
- capabilities: ['chat', 'code', 'reasoning', 'analysis'],
140
- contextWindow: 128000,
141
- });
142
- return router;
143
- }
144
- export default ModelRouter;
145
- //# sourceMappingURL=router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/llm/router.ts"],"names":[],"mappings":"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"}