kimaki 0.4.89 → 0.4.91

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 (146) hide show
  1. package/dist/agent-model.e2e.test.js +82 -3
  2. package/dist/anthropic-auth-plugin.js +246 -195
  3. package/dist/anthropic-auth-plugin.test.js +125 -0
  4. package/dist/anthropic-auth-state.js +231 -0
  5. package/dist/bin.js +6 -3
  6. package/dist/cli-parsing.test.js +23 -0
  7. package/dist/cli-send-thread.e2e.test.js +4 -3
  8. package/dist/cli.js +76 -46
  9. package/dist/commands/btw.js +7 -2
  10. package/dist/commands/merge-worktree.js +6 -3
  11. package/dist/commands/new-worktree.js +18 -7
  12. package/dist/commands/worktrees.js +71 -7
  13. package/dist/context-awareness-plugin.js +52 -50
  14. package/dist/context-awareness-plugin.test.js +68 -1
  15. package/dist/discord-bot.js +131 -58
  16. package/dist/discord-utils.test.js +19 -0
  17. package/dist/errors.js +0 -5
  18. package/dist/event-stream-real-capture.e2e.test.js +2 -1
  19. package/dist/exec-async.js +26 -0
  20. package/dist/external-opencode-sync.js +33 -72
  21. package/dist/forum-sync/config.js +2 -2
  22. package/dist/forum-sync/markdown.js +4 -8
  23. package/dist/gateway-proxy.e2e.test.js +2 -1
  24. package/dist/hrana-server.js +11 -3
  25. package/dist/image-optimizer-plugin.js +153 -0
  26. package/dist/ipc-tools-plugin.js +11 -4
  27. package/dist/kimaki-digital-twin.e2e.test.js +2 -1
  28. package/dist/kimaki-opencode-plugin.js +1 -0
  29. package/dist/logger.js +0 -1
  30. package/dist/markdown.js +2 -2
  31. package/dist/markdown.test.js +5 -6
  32. package/dist/message-finish-field.e2e.test.js +2 -1
  33. package/dist/message-preprocessing.js +100 -16
  34. package/dist/onboarding-tutorial.js +1 -1
  35. package/dist/opencode-command-detection.js +70 -0
  36. package/dist/opencode-command-detection.test.js +210 -0
  37. package/dist/opencode-interrupt-plugin.js +64 -8
  38. package/dist/opencode-interrupt-plugin.test.js +23 -39
  39. package/dist/opencode.js +34 -32
  40. package/dist/pkce.js +23 -0
  41. package/dist/plugin-logger.js +59 -0
  42. package/dist/queue-advanced-abort.e2e.test.js +14 -15
  43. package/dist/queue-advanced-e2e-setup.js +2 -0
  44. package/dist/queue-advanced-permissions-typing.e2e.test.js +26 -24
  45. package/dist/queue-advanced-question.e2e.test.js +149 -82
  46. package/dist/queue-advanced-typing-interrupt.e2e.test.js +10 -5
  47. package/dist/queue-question-select-drain.e2e.test.js +30 -27
  48. package/dist/runtime-lifecycle.e2e.test.js +2 -1
  49. package/dist/sentry.js +7 -114
  50. package/dist/session-handler/event-stream-state.js +1 -1
  51. package/dist/session-handler/thread-runtime-state.js +9 -0
  52. package/dist/session-handler/thread-session-runtime.js +210 -53
  53. package/dist/session-title-rename.test.js +80 -0
  54. package/dist/startup-time.e2e.test.js +2 -1
  55. package/dist/store.js +1 -2
  56. package/dist/system-message.js +105 -49
  57. package/dist/system-message.test.js +598 -15
  58. package/dist/task-runner.js +7 -4
  59. package/dist/task-schedule.js +2 -0
  60. package/dist/test-utils.js +20 -0
  61. package/dist/thread-message-queue.e2e.test.js +34 -41
  62. package/dist/unnest-code-blocks.js +11 -1
  63. package/dist/unnest-code-blocks.test.js +32 -0
  64. package/dist/voice-handler.js +15 -5
  65. package/dist/voice-message.e2e.test.js +2 -1
  66. package/dist/voice.js +53 -23
  67. package/dist/voice.test.js +2 -0
  68. package/dist/worktree-lifecycle.e2e.test.js +1 -1
  69. package/dist/worktrees.js +111 -120
  70. package/dist/worktrees.test.js +2 -2
  71. package/package.json +18 -22
  72. package/skills/lintcn/SKILL.md +6 -1
  73. package/skills/new-skill/SKILL.md +211 -0
  74. package/skills/npm-package/SKILL.md +3 -2
  75. package/skills/spiceflow/SKILL.md +1 -1
  76. package/skills/usecomputer/SKILL.md +174 -249
  77. package/src/agent-model.e2e.test.ts +97 -2
  78. package/src/anthropic-auth-plugin.test.ts +159 -0
  79. package/src/anthropic-auth-plugin.ts +474 -403
  80. package/src/anthropic-auth-state.ts +282 -0
  81. package/src/bin.ts +6 -3
  82. package/src/cli-parsing.test.ts +32 -0
  83. package/src/cli-send-thread.e2e.test.ts +4 -2
  84. package/src/cli.ts +101 -63
  85. package/src/commands/btw.ts +8 -2
  86. package/src/commands/merge-worktree.ts +8 -3
  87. package/src/commands/new-worktree.ts +22 -10
  88. package/src/commands/worktrees.ts +86 -5
  89. package/src/context-awareness-plugin.test.ts +77 -1
  90. package/src/context-awareness-plugin.ts +85 -64
  91. package/src/discord-bot.ts +142 -60
  92. package/src/discord-utils.test.ts +21 -0
  93. package/src/errors.ts +0 -6
  94. package/src/event-stream-real-capture.e2e.test.ts +2 -1
  95. package/src/exec-async.ts +35 -0
  96. package/src/external-opencode-sync.ts +39 -85
  97. package/src/forum-sync/config.ts +2 -2
  98. package/src/forum-sync/markdown.ts +5 -9
  99. package/src/gateway-proxy.e2e.test.ts +2 -0
  100. package/src/hrana-server.ts +15 -3
  101. package/src/image-optimizer-plugin.ts +194 -0
  102. package/src/ipc-tools-plugin.ts +16 -8
  103. package/src/kimaki-digital-twin.e2e.test.ts +2 -1
  104. package/src/kimaki-opencode-plugin.ts +1 -0
  105. package/src/logger.ts +0 -1
  106. package/src/markdown.test.ts +4 -5
  107. package/src/markdown.ts +2 -2
  108. package/src/message-finish-field.e2e.test.ts +2 -1
  109. package/src/message-preprocessing.ts +117 -16
  110. package/src/onboarding-tutorial.ts +1 -1
  111. package/src/opencode-command-detection.test.ts +268 -0
  112. package/src/opencode-command-detection.ts +79 -0
  113. package/src/opencode-interrupt-plugin.test.ts +93 -50
  114. package/src/opencode-interrupt-plugin.ts +86 -9
  115. package/src/opencode.ts +34 -34
  116. package/src/plugin-logger.ts +68 -0
  117. package/src/queue-advanced-abort.e2e.test.ts +14 -15
  118. package/src/queue-advanced-e2e-setup.ts +2 -0
  119. package/src/queue-advanced-permissions-typing.e2e.test.ts +34 -24
  120. package/src/queue-advanced-question.e2e.test.ts +243 -179
  121. package/src/queue-advanced-typing-interrupt.e2e.test.ts +13 -5
  122. package/src/queue-question-select-drain.e2e.test.ts +31 -28
  123. package/src/runtime-lifecycle.e2e.test.ts +2 -0
  124. package/src/sentry.ts +7 -120
  125. package/src/session-handler/event-stream-state.ts +1 -1
  126. package/src/session-handler/thread-runtime-state.ts +17 -0
  127. package/src/session-handler/thread-session-runtime.ts +254 -52
  128. package/src/session-title-rename.test.ts +112 -0
  129. package/src/startup-time.e2e.test.ts +2 -1
  130. package/src/store.ts +3 -8
  131. package/src/system-message.test.ts +612 -0
  132. package/src/system-message.ts +136 -63
  133. package/src/task-runner.ts +7 -4
  134. package/src/task-schedule.ts +3 -0
  135. package/src/test-utils.ts +21 -0
  136. package/src/thread-message-queue.e2e.test.ts +38 -43
  137. package/src/undici.d.ts +12 -0
  138. package/src/unnest-code-blocks.test.ts +34 -0
  139. package/src/unnest-code-blocks.ts +18 -1
  140. package/src/voice-handler.ts +18 -4
  141. package/src/voice-message.e2e.test.ts +2 -0
  142. package/src/voice.test.ts +2 -0
  143. package/src/voice.ts +68 -23
  144. package/src/worktree-lifecycle.e2e.test.ts +1 -1
  145. package/src/worktrees.test.ts +2 -2
  146. package/src/worktrees.ts +152 -156
@@ -23,7 +23,7 @@ import { setBotToken, initDatabase, closeDatabase, setChannelDirectory, setChann
23
23
  import { getPrisma } from './db.js';
24
24
  import { startHranaServer, stopHranaServer } from './hrana-server.js';
25
25
  import { initializeOpencodeForDirectory, stopOpencodeServer } from './opencode.js';
26
- import { chooseLockPort, cleanupTestSessions, waitForBotMessageContaining, waitForFooterMessage, } from './test-utils.js';
26
+ import { chooseLockPort, cleanupTestSessions, initTestGitRepo, waitForBotMessageContaining, waitForFooterMessage, } from './test-utils.js';
27
27
  import { buildQuickAgentCommandDescription } from './commands/agent.js';
28
28
  const TEST_USER_ID = '200000000000000920';
29
29
  const TEXT_CHANNEL_ID = '200000000000000921';
@@ -38,6 +38,7 @@ function createRunDirectories() {
38
38
  const dataDir = fs.mkdtempSync(path.join(root, 'data-'));
39
39
  const projectDirectory = path.join(root, 'project');
40
40
  fs.mkdirSync(projectDirectory, { recursive: true });
41
+ initTestGitRepo(projectDirectory);
41
42
  return { root, dataDir, projectDirectory };
42
43
  }
43
44
  function createDiscordJsClient({ restUrl }) {
@@ -67,7 +68,7 @@ function createDeterministicMatchers() {
67
68
  when: {
68
69
  lastMessageRole: 'user',
69
70
  latestUserTextIncludes: 'Reply with exactly: system-context-check',
70
- rawPromptIncludes: `Current Discord user ID is: ${TEST_USER_ID}`,
71
+ promptTextIncludes: `<discord-user name="agent-model-tester" user-id="${TEST_USER_ID}"`,
71
72
  },
72
73
  then: {
73
74
  parts: [
@@ -88,6 +89,33 @@ function createDeterministicMatchers() {
88
89
  partDelaysMs: [0, 100, 0, 0, 0],
89
90
  },
90
91
  };
92
+ const replyContextMatcher = {
93
+ id: 'reply-context-check',
94
+ priority: 15,
95
+ when: {
96
+ lastMessageRole: 'user',
97
+ latestUserTextIncludes: 'Reply with exactly: reply-context-check',
98
+ promptTextIncludes: 'This message was a reply to message\n\n<replied-message author="agent-model-tester">\nfirst message in thread\n</replied-message>',
99
+ },
100
+ then: {
101
+ parts: [
102
+ { type: 'stream-start', warnings: [] },
103
+ { type: 'text-start', id: 'reply-context-reply' },
104
+ {
105
+ type: 'text-delta',
106
+ id: 'reply-context-reply',
107
+ delta: 'reply-context-ok',
108
+ },
109
+ { type: 'text-end', id: 'reply-context-reply' },
110
+ {
111
+ type: 'finish',
112
+ finishReason: 'stop',
113
+ usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
114
+ },
115
+ ],
116
+ partDelaysMs: [0, 100, 0, 0, 0],
117
+ },
118
+ };
91
119
  const userReplyMatcher = {
92
120
  id: 'user-reply',
93
121
  priority: 10,
@@ -110,7 +138,7 @@ function createDeterministicMatchers() {
110
138
  partDelaysMs: [0, 100, 0, 0, 0],
111
139
  },
112
140
  };
113
- return [systemContextMatcher, userReplyMatcher];
141
+ return [systemContextMatcher, replyContextMatcher, userReplyMatcher];
114
142
  }
115
143
  /**
116
144
  * Create an opencode agent .md file that uses a specific model.
@@ -348,6 +376,57 @@ describe('agent model resolution', () => {
348
376
  *project ⋅ main ⋅ Ns ⋅ N% ⋅ agent-model-v2 ⋅ **test-agent***"
349
377
  `);
350
378
  }, 15_000);
379
+ test('reply message injects replied-message context', async () => {
380
+ await discord.channel(TEXT_CHANNEL_ID).user(TEST_USER_ID).sendMessage({
381
+ content: 'first message in thread',
382
+ });
383
+ const thread = await discord.channel(TEXT_CHANNEL_ID).waitForThread({
384
+ timeout: 4_000,
385
+ predicate: (t) => {
386
+ return t.name === 'first message in thread';
387
+ },
388
+ });
389
+ const threadMessagesBeforeReply = await discord.thread(thread.id).getMessages();
390
+ const firstUserMessage = threadMessagesBeforeReply.find((message) => {
391
+ return (message.author.id === TEST_USER_ID
392
+ && message.content === 'first message in thread');
393
+ });
394
+ expect(firstUserMessage).toBeDefined();
395
+ if (!firstUserMessage) {
396
+ throw new Error('Expected first user message in thread');
397
+ }
398
+ await discord.thread(thread.id).user(TEST_USER_ID).sendMessage({
399
+ content: 'Reply with exactly: reply-context-check',
400
+ messageReference: {
401
+ message_id: firstUserMessage.id,
402
+ channel_id: thread.id,
403
+ guild_id: discord.guildId,
404
+ },
405
+ });
406
+ await waitForBotMessageContaining({
407
+ discord,
408
+ threadId: thread.id,
409
+ userId: TEST_USER_ID,
410
+ text: 'reply-context-ok',
411
+ timeout: 4_000,
412
+ });
413
+ await waitForFooterMessage({
414
+ discord,
415
+ threadId: thread.id,
416
+ timeout: 4_000,
417
+ afterMessageIncludes: 'reply-context-ok',
418
+ afterAuthorId: discord.botUserId,
419
+ });
420
+ expect(await discord.thread(thread.id).text()).toMatchInlineSnapshot(`
421
+ "--- from: user (agent-model-tester)
422
+ first message in thread
423
+ Reply with exactly: reply-context-check
424
+ --- from: assistant (TestBot)
425
+ ⬥ ok
426
+ ⬥ reply-context-ok
427
+ *project ⋅ main ⋅ Ns ⋅ N% ⋅ agent-model-v2 ⋅ **test-agent***"
428
+ `);
429
+ }, 15_000);
351
430
  test('new thread uses channel model when channel model preference is set', async () => {
352
431
  // Clear channel agent so model resolution falls through to channel model
353
432
  const prisma = await getPrisma();