kimaki 0.4.67 → 0.4.69

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 (222) hide show
  1. package/dist/ai-tool-to-genai.js +10 -4
  2. package/dist/bin.js +4 -1
  3. package/dist/channel-management.js +23 -1
  4. package/dist/cli-parsing.test.js +21 -1
  5. package/dist/cli.js +606 -397
  6. package/dist/commands/abort.js +3 -3
  7. package/dist/commands/action-buttons.js +255 -0
  8. package/dist/commands/add-project.js +2 -2
  9. package/dist/commands/agent.js +13 -4
  10. package/dist/commands/ask-question.js +3 -1
  11. package/dist/commands/compact.js +6 -5
  12. package/dist/commands/context-usage.js +3 -3
  13. package/dist/commands/create-new-project.js +8 -2
  14. package/dist/commands/diff.js +6 -3
  15. package/dist/commands/file-upload.js +9 -10
  16. package/dist/commands/fork.js +11 -5
  17. package/dist/commands/gemini-apikey.js +46 -29
  18. package/dist/commands/login.js +12 -9
  19. package/dist/commands/merge-worktree.js +1 -1
  20. package/dist/commands/model.js +94 -14
  21. package/dist/commands/permissions.js +4 -2
  22. package/dist/commands/queue.js +9 -5
  23. package/dist/commands/remove-project.js +3 -1
  24. package/dist/commands/restart-opencode-server.js +6 -4
  25. package/dist/commands/resume.js +28 -18
  26. package/dist/commands/run-command.js +10 -5
  27. package/dist/commands/session-id.js +4 -4
  28. package/dist/commands/session.js +6 -4
  29. package/dist/commands/share.js +3 -3
  30. package/dist/commands/undo-redo.js +4 -4
  31. package/dist/commands/unset-model.js +4 -1
  32. package/dist/commands/upgrade.js +1 -1
  33. package/dist/commands/user-command.js +7 -3
  34. package/dist/commands/verbosity.js +1 -1
  35. package/dist/commands/worktree-settings.js +1 -1
  36. package/dist/commands/worktree.js +23 -8
  37. package/dist/config-lock-port.test.js +17 -0
  38. package/dist/config.js +26 -1
  39. package/dist/database.js +411 -4
  40. package/dist/db.js +56 -16
  41. package/dist/db.test.js +6 -4
  42. package/dist/discord-bot.js +157 -46
  43. package/dist/discord-utils.js +26 -7
  44. package/dist/discord-utils.test.js +14 -0
  45. package/dist/errors.js +0 -1
  46. package/dist/escape-backticks.test.js +1 -1
  47. package/dist/format-tables.js +9 -2
  48. package/dist/forum-sync/config.js +79 -0
  49. package/dist/forum-sync/discord-operations.js +154 -0
  50. package/dist/forum-sync/index.js +5 -0
  51. package/dist/forum-sync/markdown.js +117 -0
  52. package/dist/forum-sync/sync-to-discord.js +417 -0
  53. package/dist/forum-sync/sync-to-files.js +190 -0
  54. package/dist/forum-sync/types.js +53 -0
  55. package/dist/forum-sync/watchers.js +309 -0
  56. package/dist/forum-sync.js +953 -0
  57. package/dist/genai.js +6 -4
  58. package/dist/generated/enums.js +21 -2
  59. package/dist/generated/internal/class.js +2 -2
  60. package/dist/generated/internal/prismaNamespace.js +54 -1
  61. package/dist/generated/internal/prismaNamespaceBrowser.js +54 -1
  62. package/dist/generated/models/forum_sync_configs.js +1 -0
  63. package/dist/generated/models/ipc_requests.js +1 -0
  64. package/dist/generated/models/scheduled_tasks.js +1 -0
  65. package/dist/generated/models/session_start_sources.js +1 -0
  66. package/dist/hrana-server.js +416 -0
  67. package/dist/hrana-server.test.js +368 -0
  68. package/dist/image-utils.js +6 -1
  69. package/dist/interaction-handler.js +46 -17
  70. package/dist/ipc-polling.js +244 -0
  71. package/dist/kimaki-digital-twin.e2e.test.js +168 -0
  72. package/dist/kimaki-real-discord.e2e.test.js +294 -0
  73. package/dist/logger.js +2 -0
  74. package/dist/markdown.js +14 -5
  75. package/dist/markdown.test.js +9 -25
  76. package/dist/message-formatting.js +23 -7
  77. package/dist/openai-realtime.js +5 -3
  78. package/dist/opencode-plugin.js +164 -66
  79. package/dist/opencode.js +131 -20
  80. package/dist/session-handler.js +289 -110
  81. package/dist/system-message.js +130 -6
  82. package/dist/task-runner.js +279 -0
  83. package/dist/task-schedule.js +191 -0
  84. package/dist/task-schedule.test.js +71 -0
  85. package/dist/tools.js +21 -8
  86. package/dist/unnest-code-blocks.js +4 -1
  87. package/dist/utils.js +1 -0
  88. package/dist/voice-handler.js +38 -16
  89. package/dist/voice.js +213 -98
  90. package/dist/voice.test.js +143 -0
  91. package/dist/wait-session.js +15 -4
  92. package/dist/worktree-utils.js +35 -10
  93. package/dist/xml.js +4 -2
  94. package/package.json +12 -4
  95. package/schema.prisma +108 -3
  96. package/skills/errore/SKILL.md +182 -752
  97. package/skills/jitter/EDITOR.md +48 -39
  98. package/skills/jitter/SKILL.md +61 -61
  99. package/skills/jitter/utils/actions.ts +46 -42
  100. package/skills/jitter/utils/export.ts +39 -34
  101. package/skills/jitter/utils/index.ts +16 -15
  102. package/skills/jitter/utils/snapshot.ts +57 -43
  103. package/skills/jitter/utils/traverse.ts +101 -83
  104. package/skills/jitter/utils/types.ts +165 -165
  105. package/skills/jitter/utils/wait.ts +45 -43
  106. package/skills/playwriter/SKILL.md +2 -1
  107. package/skills/termcast/SKILL.md +945 -0
  108. package/src/__snapshots__/compact-session-context-no-system.md +0 -2
  109. package/src/__snapshots__/compact-session-context.md +0 -2
  110. package/src/__snapshots__/first-session-no-info.md +4 -4150
  111. package/src/__snapshots__/first-session-with-info.md +7 -4153
  112. package/src/__snapshots__/session-1.md +4 -4150
  113. package/src/__snapshots__/session-2.md +5860 -6
  114. package/src/__snapshots__/session-3.md +5 -5624
  115. package/src/__snapshots__/session-with-tools.md +5481 -3773
  116. package/src/ai-tool-to-genai.ts +19 -6
  117. package/src/ai-tool.ts +7 -2
  118. package/src/bin.ts +4 -3
  119. package/src/channel-management.ts +68 -17
  120. package/src/cli-parsing.test.ts +53 -11
  121. package/src/cli.ts +1219 -646
  122. package/src/commands/abort.ts +15 -4
  123. package/src/commands/action-buttons.ts +374 -0
  124. package/src/commands/add-project.ts +15 -8
  125. package/src/commands/agent.ts +17 -6
  126. package/src/commands/ask-question.ts +15 -5
  127. package/src/commands/compact.ts +21 -6
  128. package/src/commands/context-usage.ts +31 -9
  129. package/src/commands/create-new-project.ts +29 -11
  130. package/src/commands/diff.ts +23 -8
  131. package/src/commands/file-upload.ts +43 -20
  132. package/src/commands/fork.ts +42 -15
  133. package/src/commands/gemini-apikey.ts +65 -36
  134. package/src/commands/login.ts +42 -22
  135. package/src/commands/merge-worktree.ts +17 -5
  136. package/src/commands/model.ts +200 -46
  137. package/src/commands/permissions.ts +28 -7
  138. package/src/commands/queue.ts +51 -17
  139. package/src/commands/remove-project.ts +6 -2
  140. package/src/commands/restart-opencode-server.ts +31 -9
  141. package/src/commands/resume.ts +55 -31
  142. package/src/commands/run-command.ts +27 -7
  143. package/src/commands/session-id.ts +19 -5
  144. package/src/commands/session.ts +21 -6
  145. package/src/commands/share.ts +15 -4
  146. package/src/commands/types.ts +3 -1
  147. package/src/commands/undo-redo.ts +32 -10
  148. package/src/commands/unset-model.ts +7 -2
  149. package/src/commands/upgrade.ts +3 -1
  150. package/src/commands/user-command.ts +20 -7
  151. package/src/commands/verbosity.ts +5 -1
  152. package/src/commands/worktree-settings.ts +4 -1
  153. package/src/commands/worktree.ts +68 -19
  154. package/src/config.ts +29 -1
  155. package/src/database.ts +729 -26
  156. package/src/db.test.ts +8 -4
  157. package/src/db.ts +70 -19
  158. package/src/discord-bot.ts +284 -81
  159. package/src/discord-utils.test.ts +17 -0
  160. package/src/discord-utils.ts +106 -31
  161. package/src/errors.ts +12 -6
  162. package/src/escape-backticks.test.ts +8 -3
  163. package/src/format-tables.ts +9 -2
  164. package/src/forum-sync/config.ts +92 -0
  165. package/src/forum-sync/discord-operations.ts +241 -0
  166. package/src/forum-sync/index.ts +9 -0
  167. package/src/forum-sync/markdown.ts +176 -0
  168. package/src/forum-sync/sync-to-discord.ts +595 -0
  169. package/src/forum-sync/sync-to-files.ts +294 -0
  170. package/src/forum-sync/types.ts +175 -0
  171. package/src/forum-sync/watchers.ts +456 -0
  172. package/src/genai-worker-wrapper.ts +9 -3
  173. package/src/genai-worker.ts +23 -5
  174. package/src/genai.ts +41 -9
  175. package/src/generated/browser.ts +20 -0
  176. package/src/generated/client.ts +20 -0
  177. package/src/generated/commonInputTypes.ts +240 -0
  178. package/src/generated/enums.ts +33 -2
  179. package/src/generated/internal/class.ts +42 -2
  180. package/src/generated/internal/prismaNamespace.ts +399 -2
  181. package/src/generated/internal/prismaNamespaceBrowser.ts +70 -1
  182. package/src/generated/models/bot_api_keys.ts +33 -1
  183. package/src/generated/models/bot_tokens.ts +122 -0
  184. package/src/generated/models/channel_directories.ts +179 -0
  185. package/src/generated/models/forum_sync_configs.ts +1452 -0
  186. package/src/generated/models/ipc_requests.ts +1485 -0
  187. package/src/generated/models/scheduled_tasks.ts +2320 -0
  188. package/src/generated/models/session_start_sources.ts +1408 -0
  189. package/src/generated/models/thread_sessions.ts +243 -0
  190. package/src/generated/models.ts +4 -0
  191. package/src/heap-monitor.ts +7 -2
  192. package/src/hrana-server.test.ts +428 -0
  193. package/src/hrana-server.ts +547 -0
  194. package/src/image-utils.ts +21 -6
  195. package/src/interaction-handler.ts +346 -273
  196. package/src/ipc-polling.ts +318 -0
  197. package/src/kimaki-digital-twin.e2e.test.ts +204 -0
  198. package/src/logger.ts +33 -10
  199. package/src/markdown.test.ts +83 -69
  200. package/src/markdown.ts +29 -10
  201. package/src/message-formatting.ts +63 -21
  202. package/src/openai-realtime.ts +47 -25
  203. package/src/opencode-plugin.ts +207 -81
  204. package/src/opencode.ts +254 -73
  205. package/src/schema.sql +61 -0
  206. package/src/session-handler.ts +709 -310
  207. package/src/session-search.ts +3 -1
  208. package/src/system-message.ts +136 -5
  209. package/src/task-runner.ts +422 -0
  210. package/src/task-schedule.test.ts +84 -0
  211. package/src/task-schedule.ts +287 -0
  212. package/src/tools.ts +38 -12
  213. package/src/unnest-code-blocks.test.ts +3 -1
  214. package/src/unnest-code-blocks.ts +6 -2
  215. package/src/utils.ts +11 -3
  216. package/src/voice-handler.ts +229 -156
  217. package/src/voice.test.ts +173 -0
  218. package/src/voice.ts +297 -117
  219. package/src/wait-session.ts +30 -11
  220. package/src/worktree-utils.ts +146 -45
  221. package/src/xml.test.ts +2 -1
  222. package/src/xml.ts +12 -3
@@ -38,11 +38,13 @@ function jsonSchemaToGenAISchema(jsonSchema) {
38
38
  break;
39
39
  case 'number':
40
40
  schema.type = Type.NUMBER;
41
- schema.format = typeof jsonSchema.format === 'string' ? jsonSchema.format : 'float';
41
+ schema.format =
42
+ typeof jsonSchema.format === 'string' ? jsonSchema.format : 'float';
42
43
  break;
43
44
  case 'integer':
44
45
  schema.type = Type.INTEGER;
45
- schema.format = typeof jsonSchema.format === 'string' ? jsonSchema.format : 'int32';
46
+ schema.format =
47
+ typeof jsonSchema.format === 'string' ? jsonSchema.format : 'int32';
46
48
  break;
47
49
  case 'boolean':
48
50
  schema.type = Type.BOOLEAN;
@@ -169,13 +171,17 @@ export function aiToolToCallableTool(tool, name) {
169
171
  const parts = [];
170
172
  for (const functionCall of functionCalls) {
171
173
  // Check if this function call matches our tool
172
- if (functionCall.name !== toolName && name && functionCall.name !== name) {
174
+ if (functionCall.name !== toolName &&
175
+ name &&
176
+ functionCall.name !== name) {
173
177
  continue;
174
178
  }
175
179
  // Execute the tool if it has an execute function
176
180
  if (tool.execute) {
177
181
  try {
178
- const args = isRecord(functionCall.args) ? functionCall.args : {};
182
+ const args = isRecord(functionCall.args)
183
+ ? functionCall.args
184
+ : {};
179
185
  const result = await tool.execute(args, {
180
186
  toolCallId: functionCall.id || '',
181
187
  messages: [],
package/dist/bin.js CHANGED
@@ -41,7 +41,10 @@ else {
41
41
  if (!fs.existsSync(HEAP_SNAPSHOT_DIR)) {
42
42
  fs.mkdirSync(HEAP_SNAPSHOT_DIR, { recursive: true });
43
43
  }
44
- const heapArgs = [`--heapsnapshot-near-heap-limit=3`, `--diagnostic-dir=${HEAP_SNAPSHOT_DIR}`];
44
+ const heapArgs = [
45
+ `--heapsnapshot-near-heap-limit=3`,
46
+ `--diagnostic-dir=${HEAP_SNAPSHOT_DIR}`,
47
+ ];
45
48
  child = spawn(process.argv[0], [...heapArgs, ...process.execArgv, ...process.argv.slice(1)], {
46
49
  stdio: 'inherit',
47
50
  env: { ...process.env, __KIMAKI_CHILD: '1' },
@@ -1,7 +1,7 @@
1
1
  // Discord channel and category management.
2
2
  // Creates and manages Kimaki project channels (text + voice pairs),
3
3
  // extracts channel metadata from topic tags, and ensures category structure.
4
- import { ChannelType } from 'discord.js';
4
+ import { ChannelType, } from 'discord.js';
5
5
  import path from 'node:path';
6
6
  import { getChannelDirectory, setChannelDirectory } from './database.js';
7
7
  export async function ensureKimakiCategory(guild, botName) {
@@ -81,6 +81,28 @@ export async function createProjectChannels({ guild, projectDirectory, appId, bo
81
81
  channelName,
82
82
  };
83
83
  }
84
+ /**
85
+ * Ensure a forum channel named "{botName}-memory" exists in the Kimaki category.
86
+ * Creates it if missing. Returns the forum channel ID.
87
+ */
88
+ export async function ensureMemoryForumChannel({ guild, botName, }) {
89
+ const isKimakiBot = botName?.toLowerCase() === 'kimaki';
90
+ const forumName = botName && !isKimakiBot ? `${botName}-memory` : 'kimaki-memory';
91
+ const existing = guild.channels.cache.find((channel) => {
92
+ if (channel.type !== ChannelType.GuildForum)
93
+ return false;
94
+ return channel.name.toLowerCase() === forumName.toLowerCase();
95
+ });
96
+ if (existing)
97
+ return existing;
98
+ const kimakiCategory = await ensureKimakiCategory(guild, botName);
99
+ return guild.channels.create({
100
+ name: forumName,
101
+ type: ChannelType.GuildForum,
102
+ parent: kimakiCategory,
103
+ topic: 'Persistent memory files synced from ~/.kimaki/memory/',
104
+ });
105
+ }
84
106
  export async function getChannelsWithDescriptions(guild) {
85
107
  const channels = [];
86
108
  const textChannels = guild.channels.cache.filter((channel) => channel.isTextBased());
@@ -7,7 +7,8 @@ function createCliForIdParsing() {
7
7
  .command('send', 'Send a message')
8
8
  .option('-c, --channel <channelId>', 'Discord channel ID')
9
9
  .option('--thread <threadId>', 'Thread ID')
10
- .option('--session <sessionId>', 'Session ID');
10
+ .option('--session <sessionId>', 'Session ID')
11
+ .option('--send-at <schedule>', 'Schedule');
11
12
  cli.command('session archive <threadId>', 'Archive a thread');
12
13
  cli
13
14
  .command('session search <query>', 'Search sessions')
@@ -16,6 +17,7 @@ function createCliForIdParsing() {
16
17
  cli
17
18
  .command('add-project', 'Add a project')
18
19
  .option('-g, --guild <guildId>', 'Discord guild/server ID');
20
+ cli.command('task delete <id>', 'Delete task');
19
21
  return cli;
20
22
  }
21
23
  describe('goke CLI ID parsing', () => {
@@ -66,4 +68,22 @@ describe('goke CLI ID parsing', () => {
66
68
  expect(result.options.channel).toBe(channelId);
67
69
  expect(typeof result.options.channel).toBe('string');
68
70
  });
71
+ test('keeps --send-at cron string intact', () => {
72
+ const cli = createCliForIdParsing();
73
+ const cron = '0 9 * * 1';
74
+ const result = cli.parse(['node', 'kimaki', 'send', '--send-at', cron], {
75
+ run: false,
76
+ });
77
+ expect(result.options.sendAt).toBe(cron);
78
+ expect(typeof result.options.sendAt).toBe('string');
79
+ });
80
+ test('keeps task delete ID as string before validation', () => {
81
+ const cli = createCliForIdParsing();
82
+ const taskId = '0012345';
83
+ const result = cli.parse(['node', 'kimaki', 'task', 'delete', taskId], {
84
+ run: false,
85
+ });
86
+ expect(result.args[0]).toBe(taskId);
87
+ expect(typeof result.args[0]).toBe('string');
88
+ });
69
89
  });