kimaki 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-model.e2e.test.js +250 -164
- package/dist/anthropic-account-identity.js +9 -1
- package/dist/anthropic-auth-plugin.js +10 -13
- package/dist/anthropic-auth-plugin.test.js +17 -0
- package/dist/anthropic-auth-state.js +1 -0
- package/dist/bash-tool-schema-plugin.js +32 -0
- package/dist/bash-tool-schema-plugin.test.js +49 -0
- package/dist/bin.js +73 -19
- package/dist/cli-commands/maintenance.js +46 -7
- package/dist/cli-commands/project.js +11 -27
- package/dist/cli-commands/send.js +30 -1
- package/dist/cli-commands/session.js +322 -90
- package/dist/cli-commands/task.js +34 -15
- package/dist/cli-parsing.test.js +83 -4
- package/dist/cli-runner.js +44 -8
- package/dist/cli-runner.test.js +27 -0
- package/dist/cli-send-thread.e2e.test.js +9 -9
- package/dist/cli.js +32 -0
- package/dist/commands/abort.js +5 -1
- package/dist/commands/action-buttons.js +2 -1
- package/dist/commands/add-project.js +4 -7
- package/dist/commands/agent.js +164 -32
- package/dist/commands/ask-question.js +23 -33
- package/dist/commands/ask-question.test.js +43 -1
- package/dist/commands/btw.js +28 -6
- package/dist/commands/file-upload.js +2 -1
- package/dist/commands/fork-subagent.js +2 -4
- package/dist/commands/fork.js +4 -4
- package/dist/commands/last-sessions.js +17 -10
- package/dist/commands/login.js +6 -0
- package/dist/commands/merge-worktree.js +47 -14
- package/dist/commands/model-variant.js +8 -1
- package/dist/commands/model.js +16 -9
- package/dist/commands/multioauth.js +1 -0
- package/dist/commands/new-worktree.js +170 -102
- package/dist/commands/queue.js +3 -2
- package/dist/commands/resume.js +4 -4
- package/dist/commands/session.js +78 -63
- package/dist/commands/user-command.js +6 -8
- package/dist/commands/worktrees.js +5 -13
- package/dist/config.js +16 -1
- package/dist/cpu-profiler.js +211 -0
- package/dist/cpu-profiler.test.js +160 -0
- package/dist/database.js +152 -3
- package/dist/db.js +33 -0
- package/dist/db.test.js +267 -1
- package/dist/default-channel-provisioning.test.js +148 -0
- package/dist/discord-bot.js +517 -488
- package/dist/discord-command-registration.js +25 -10
- package/dist/discord-command-registration.test.js +17 -0
- package/dist/discord-utils.js +97 -5
- package/dist/discord-utils.test.js +151 -1
- package/dist/errors.js +10 -0
- package/dist/exec-async.js +17 -5
- package/dist/external-directory-permissions.e2e.test.js +11 -7
- package/dist/external-directory-project-deny.e2e.test.js +5 -3
- package/dist/external-opencode-sync.js +94 -17
- package/dist/external-opencode-sync.test.js +206 -0
- package/dist/extract-sdk-error-message.test.js +13 -0
- package/dist/file-edit-log.js +197 -0
- package/dist/file-edit-log.test.js +258 -0
- package/dist/format-tables.js +52 -0
- package/dist/format-tables.test.js +93 -0
- package/dist/gateway-proxy-reconnect.e2e.test.js +28 -8
- package/dist/gateway-proxy.e2e.test.js +18 -18
- package/dist/git-worktree-core.js +182 -17
- package/dist/interaction-handler.js +416 -398
- package/dist/ipc-tools-plugin.js +68 -3
- package/dist/kimaki-opencode-plugin-loading.e2e.test.js +122 -58
- package/dist/kimaki-opencode-plugin.js +9 -3
- package/dist/kimaki-workspace-adaptor.js +33 -10
- package/dist/logger.js +11 -1
- package/dist/markdown.js +3 -1
- package/dist/markdown.test.js +11 -3
- package/dist/message-formatting.js +181 -51
- package/dist/message-formatting.test.js +529 -22
- package/dist/message-preprocessing.js +105 -1
- package/dist/oauth-rotation-shared.js +10 -0
- package/dist/openai-auth-plugin.js +1 -0
- package/dist/openai-auth-state.js +1 -0
- package/dist/opencode-command.js +28 -0
- package/dist/opencode-command.test.js +109 -1
- package/dist/opencode-interrupt-plugin.js +4 -0
- package/dist/opencode-interrupt-plugin.test.js +24 -0
- package/dist/opencode.js +82 -15
- package/dist/project-add.test.js +62 -0
- package/dist/question-abort-clears-dropdown.e2e.test.js +89 -0
- package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +150 -0
- package/dist/question-text-before-dropdown.e2e.test.js +52 -0
- package/dist/queue-advanced-abort.e2e.test.js +8 -10
- package/dist/queue-advanced-action-buttons.e2e.test.js +8 -8
- package/dist/queue-advanced-e2e-setup.js +78 -5
- package/dist/queue-advanced-footer.e2e.test.js +60 -269
- package/dist/queue-advanced-model-switch.e2e.test.js +9 -11
- package/dist/queue-advanced-permissions-typing.e2e.test.js +15 -15
- package/dist/queue-advanced-question.e2e.test.js +32 -27
- package/dist/queue-advanced-typing-interrupt.e2e.test.js +10 -12
- package/dist/queue-advanced-typing.e2e.test.js +7 -9
- package/dist/queue-delete-message.e2e.test.js +3 -3
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +5 -5
- package/dist/queue-interrupt-drain.e2e.test.js +122 -12
- package/dist/queue-question-select-drain.e2e.test.js +34 -132
- package/dist/runtime-lifecycle.e2e.test.js +21 -51
- package/dist/schema.js +35 -1
- package/dist/session-handler/event-stream-state.js +391 -50
- package/dist/session-handler/event-stream-state.test.js +736 -8
- package/dist/session-handler/model-utils.js +172 -5
- package/dist/session-handler/model-utils.test.js +445 -0
- package/dist/session-handler/opencode-session-event-log.js +30 -1
- package/dist/session-handler/thread-ingress.test.js +41 -0
- package/dist/session-handler/thread-runtime-state.js +2 -0
- package/dist/session-handler/thread-session-runtime-summary.test.js +121 -0
- package/dist/session-handler/thread-session-runtime.js +574 -299
- package/dist/session-search.js +123 -4
- package/dist/session-search.test.js +248 -1
- package/dist/session-sleep.test.js +224 -0
- package/dist/session-title-rename.test.js +37 -39
- package/dist/sleep.e2e.test.js +494 -0
- package/dist/startup-time.e2e.test.js +2 -1
- package/dist/store.js +3 -0
- package/dist/system-message.js +102 -16
- package/dist/system-message.test.js +192 -15
- package/dist/task-runner.js +96 -5
- package/dist/task-schedule.js +87 -1
- package/dist/task-schedule.test.js +149 -1
- package/dist/test-utils.js +17 -9
- package/dist/thinking-utils.js +10 -0
- package/dist/thinking-utils.test.js +35 -0
- package/dist/thread-message-queue.e2e.test.js +65 -213
- package/dist/undo-redo.e2e.test.js +17 -9
- package/dist/voice-attachment.js +23 -1
- package/dist/voice-handler.js +21 -4
- package/dist/voice-message.e2e.test.js +144 -30
- package/dist/voice-routing-input.e2e.test.js +195 -0
- package/dist/voice-routing-question.e2e.test.js +125 -0
- package/dist/voice.js +28 -8
- package/dist/voice.test.js +96 -30
- package/dist/worktree-clone-isolation.e2e.test.js +188 -0
- package/dist/worktree-lifecycle.e2e.test.js +55 -36
- package/dist/worktrees.js +226 -443
- package/dist/worktrees.test.js +435 -58
- package/dist/xai-auth-plugin.js +1 -0
- package/dist/xai-auth-state.js +1 -0
- package/package.json +8 -6
- package/skills/bump-holocron-consumers/SKILL.md +137 -0
- package/skills/critique/SKILL.md +4 -4
- package/skills/errore/SKILL.md +60 -218
- package/skills/goke/SKILL.md +150 -10
- package/skills/holocron/SKILL.md +154 -17
- package/skills/npm-package/SKILL.md +55 -35
- package/skills/profano/SKILL.md +17 -2
- package/skills/spiceflow/SKILL.md +39 -3
- package/skills/strada/SKILL.md +39 -0
- package/skills/zele/SKILL.md +19 -0
- package/src/agent-model.e2e.test.ts +287 -186
- package/src/anthropic-account-identity.ts +20 -1
- package/src/anthropic-auth-plugin.test.ts +19 -0
- package/src/anthropic-auth-plugin.ts +12 -16
- package/src/anthropic-auth-state.ts +1 -0
- package/src/bash-tool-schema-plugin.test.ts +55 -0
- package/src/bash-tool-schema-plugin.ts +46 -0
- package/src/bin.ts +78 -26
- package/src/cli-commands/maintenance.ts +59 -13
- package/src/cli-commands/project.ts +14 -35
- package/src/cli-commands/send.ts +31 -1
- package/src/cli-commands/session.ts +374 -114
- package/src/cli-commands/task.ts +34 -15
- package/src/cli-parsing.test.ts +103 -4
- package/src/cli-runner.test.ts +49 -0
- package/src/cli-runner.ts +44 -7
- package/src/cli-send-thread.e2e.test.ts +9 -11
- package/src/cli.ts +53 -0
- package/src/commands/abort.ts +6 -1
- package/src/commands/action-buttons.ts +2 -1
- package/src/commands/add-project.ts +4 -8
- package/src/commands/agent.ts +205 -29
- package/src/commands/ask-question.test.ts +48 -1
- package/src/commands/ask-question.ts +23 -33
- package/src/commands/btw.ts +40 -5
- package/src/commands/file-upload.ts +2 -1
- package/src/commands/fork-subagent.ts +2 -3
- package/src/commands/fork.ts +4 -3
- package/src/commands/last-sessions.ts +10 -4
- package/src/commands/login.ts +6 -0
- package/src/commands/merge-worktree.ts +54 -16
- package/src/commands/model-variant.ts +9 -1
- package/src/commands/model.ts +20 -9
- package/src/commands/multioauth.ts +1 -0
- package/src/commands/new-worktree.ts +138 -55
- package/src/commands/queue.ts +3 -2
- package/src/commands/resume.ts +4 -3
- package/src/commands/session.ts +94 -70
- package/src/commands/user-command.ts +6 -6
- package/src/commands/worktrees.ts +5 -12
- package/src/config.ts +18 -1
- package/src/cpu-profiler.test.ts +183 -0
- package/src/cpu-profiler.ts +293 -0
- package/src/database.ts +235 -3
- package/src/db.test.ts +293 -0
- package/src/db.ts +38 -0
- package/src/default-channel-provisioning.test.ts +155 -0
- package/src/discord-bot.ts +78 -36
- package/src/discord-command-registration.test.ts +20 -0
- package/src/discord-command-registration.ts +42 -12
- package/src/discord-utils.test.ts +176 -0
- package/src/discord-utils.ts +152 -7
- package/src/errors.ts +12 -0
- package/src/exec-async.ts +20 -11
- package/src/external-directory-permissions.e2e.test.ts +11 -7
- package/src/external-directory-project-deny.e2e.test.ts +5 -3
- package/src/external-opencode-sync.test.ts +248 -0
- package/src/external-opencode-sync.ts +122 -19
- package/src/extract-sdk-error-message.test.ts +18 -0
- package/src/file-edit-log.test.ts +287 -0
- package/src/file-edit-log.ts +283 -0
- package/src/format-tables.test.ts +101 -0
- package/src/format-tables.ts +75 -0
- package/src/gateway-proxy-reconnect.e2e.test.ts +38 -8
- package/src/gateway-proxy.e2e.test.ts +18 -17
- package/src/git-worktree-core.ts +247 -20
- package/src/interaction-handler.ts +36 -13
- package/src/ipc-tools-plugin.ts +82 -5
- package/src/kimaki-opencode-plugin-loading.e2e.test.ts +188 -97
- package/src/kimaki-opencode-plugin.ts +9 -3
- package/src/kimaki-workspace-adaptor.ts +40 -11
- package/src/logger.ts +14 -4
- package/src/markdown.test.ts +13 -3
- package/src/markdown.ts +4 -1
- package/src/message-formatting.test.ts +672 -25
- package/src/message-formatting.ts +242 -53
- package/src/message-preprocessing.ts +116 -1
- package/src/oauth-rotation-shared.ts +10 -0
- package/src/openai-auth-plugin.ts +1 -0
- package/src/openai-auth-state.ts +1 -0
- package/src/opencode-command.test.ts +140 -0
- package/src/opencode-command.ts +38 -0
- package/src/opencode-interrupt-plugin.test.ts +32 -0
- package/src/opencode-interrupt-plugin.ts +3 -0
- package/src/opencode.ts +115 -15
- package/src/project-add.test.ts +80 -0
- package/src/question-abort-clears-dropdown.e2e.test.ts +109 -0
- package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +172 -0
- package/src/question-text-before-dropdown.e2e.test.ts +67 -0
- package/src/queue-advanced-abort.e2e.test.ts +8 -9
- package/src/queue-advanced-action-buttons.e2e.test.ts +8 -8
- package/src/queue-advanced-e2e-setup.ts +83 -4
- package/src/queue-advanced-footer.e2e.test.ts +67 -315
- package/src/queue-advanced-model-switch.e2e.test.ts +9 -10
- package/src/queue-advanced-permissions-typing.e2e.test.ts +15 -15
- package/src/queue-advanced-question.e2e.test.ts +36 -30
- package/src/queue-advanced-typing-interrupt.e2e.test.ts +11 -11
- package/src/queue-advanced-typing.e2e.test.ts +8 -8
- package/src/queue-delete-message.e2e.test.ts +3 -3
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +5 -5
- package/src/queue-interrupt-drain.e2e.test.ts +133 -12
- package/src/queue-question-select-drain.e2e.test.ts +36 -161
- package/src/runtime-lifecycle.e2e.test.ts +21 -54
- package/src/schema.sql +15 -2
- package/src/schema.ts +37 -1
- package/src/session-handler/event-stream-state.test.ts +790 -7
- package/src/session-handler/event-stream-state.ts +568 -53
- package/src/session-handler/model-utils.test.ts +537 -0
- package/src/session-handler/model-utils.ts +281 -5
- package/src/session-handler/opencode-session-event-log.ts +31 -1
- package/src/session-handler/thread-ingress.test.ts +54 -0
- package/src/session-handler/thread-runtime-state.ts +3 -0
- package/src/session-handler/thread-session-runtime-summary.test.ts +169 -0
- package/src/session-handler/thread-session-runtime.ts +712 -358
- package/src/session-search.test.ts +281 -0
- package/src/session-search.ts +241 -7
- package/src/session-sleep.test.ts +294 -0
- package/src/session-title-rename.test.ts +54 -48
- package/src/sleep.e2e.test.ts +565 -0
- package/src/startup-time.e2e.test.ts +5 -1
- package/src/store.ts +22 -0
- package/src/system-message.test.ts +226 -15
- package/src/system-message.ts +130 -16
- package/src/task-runner.ts +138 -3
- package/src/task-schedule.test.ts +170 -0
- package/src/task-schedule.ts +141 -1
- package/src/test-utils.ts +21 -10
- package/src/thinking-utils.test.ts +46 -0
- package/src/thinking-utils.ts +21 -0
- package/src/thread-message-queue.e2e.test.ts +65 -245
- package/src/undo-redo.e2e.test.ts +17 -9
- package/src/voice-attachment.ts +29 -1
- package/src/voice-handler.ts +23 -4
- package/src/voice-message.e2e.test.ts +149 -29
- package/src/voice-routing-input.e2e.test.ts +203 -0
- package/src/voice-routing-question.e2e.test.ts +131 -0
- package/src/voice.test.ts +107 -29
- package/src/voice.ts +34 -6
- package/src/worktree-clone-isolation.e2e.test.ts +213 -0
- package/src/worktree-lifecycle.e2e.test.ts +55 -35
- package/src/worktrees.test.ts +505 -64
- package/src/worktrees.ts +257 -603
- package/src/xai-auth-plugin.ts +1 -0
- package/src/xai-auth-state.ts +1 -0
- package/dist/message-finish-field.e2e.test.js +0 -169
- package/dist/subagent-rate-limit-plugin.js +0 -184
- package/src/message-finish-field.e2e.test.ts +0 -196
- package/src/subagent-rate-limit-plugin.ts +0 -228
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Verify startup default channels require local self-hosted guild configuration.
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, expect, test } from 'vitest';
|
|
5
|
+
import { ChannelType, Client, Events, GatewayIntentBits } from 'discord.js';
|
|
6
|
+
import { DigitalDiscord } from 'discord-digital-twin/src';
|
|
7
|
+
import { setDataDir } from './config.js';
|
|
8
|
+
import { closeDb } from './db.js';
|
|
9
|
+
import { findChannelsByDirectory, initDatabase, setChannelDirectory } from './database.js';
|
|
10
|
+
import { createProjectChannels } from './channel-management.js';
|
|
11
|
+
import { ensureDefaultChannelsWithWelcome } from './cli-runner.js';
|
|
12
|
+
import { registerInteractionHandler } from './interaction-handler.js';
|
|
13
|
+
const trustedGuildId = '100000000000000111';
|
|
14
|
+
const otherGuildId = '100000000000000222';
|
|
15
|
+
const projectChannelId = '100000000000000333';
|
|
16
|
+
let directory;
|
|
17
|
+
let discord;
|
|
18
|
+
let client;
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
const root = path.resolve('tmp/default-channel-provisioning');
|
|
21
|
+
fs.mkdirSync(root, { recursive: true });
|
|
22
|
+
directory = fs.mkdtempSync(path.join(root, 'run-'));
|
|
23
|
+
setDataDir(directory);
|
|
24
|
+
await closeDb();
|
|
25
|
+
await initDatabase();
|
|
26
|
+
discord = new DigitalDiscord({
|
|
27
|
+
dbUrl: `file:${path.join(directory, 'discord.db')}`,
|
|
28
|
+
users: [{ id: '100000000000000555', username: 'server-owner' }],
|
|
29
|
+
guilds: [
|
|
30
|
+
{ id: trustedGuildId, name: 'Configured', ownerId: '100000000000000555', channels: [
|
|
31
|
+
{ id: projectChannelId, name: 'project', type: ChannelType.GuildText },
|
|
32
|
+
] },
|
|
33
|
+
{ id: otherGuildId, name: 'Unconfigured', ownerId: '100000000000000555', channels: [
|
|
34
|
+
{ name: 'project', type: ChannelType.GuildText, topic: directory },
|
|
35
|
+
] },
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
await discord.start();
|
|
39
|
+
client = new Client({
|
|
40
|
+
intents: [GatewayIntentBits.Guilds],
|
|
41
|
+
rest: { api: discord.restUrl, version: '10' },
|
|
42
|
+
});
|
|
43
|
+
const ready = new Promise((resolve) => client.once(Events.ClientReady, () => resolve()));
|
|
44
|
+
await client.login(discord.botToken);
|
|
45
|
+
await ready;
|
|
46
|
+
});
|
|
47
|
+
afterEach(async () => {
|
|
48
|
+
await client?.destroy();
|
|
49
|
+
await discord?.stop();
|
|
50
|
+
await closeDb();
|
|
51
|
+
fs.rmSync(directory, { recursive: true, force: true });
|
|
52
|
+
});
|
|
53
|
+
test('self-hosted startup does not configure any guild without a live local mapping', async () => {
|
|
54
|
+
await setChannelDirectory({
|
|
55
|
+
channelId: '100000000000000444',
|
|
56
|
+
directory,
|
|
57
|
+
channelType: 'text',
|
|
58
|
+
guildId: otherGuildId,
|
|
59
|
+
});
|
|
60
|
+
const before = await findChannelsByDirectory({});
|
|
61
|
+
const created = await ensureDefaultChannelsWithWelcome({
|
|
62
|
+
guilds: [...client.guilds.cache.values()], discordClient: client,
|
|
63
|
+
appId: discord.botUserId, isGatewayMode: false,
|
|
64
|
+
});
|
|
65
|
+
expect(created).toEqual([]);
|
|
66
|
+
expect(await findChannelsByDirectory({})).toEqual(before);
|
|
67
|
+
for (const guild of client.guilds.cache.values()) {
|
|
68
|
+
expect((await guild.channels.fetch()).size).toBe(1);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
test('setup commands require a local channel mapping even for the server owner', async () => {
|
|
72
|
+
registerInteractionHandler({ discordClient: client, appId: discord.botUserId });
|
|
73
|
+
const channel = discord.channel(projectChannelId);
|
|
74
|
+
// An invalid project name keeps the regression safe even when the guard fails.
|
|
75
|
+
const options = [{ name: 'name', type: 3, value: '---' }];
|
|
76
|
+
const ignored = await channel.user('100000000000000555').runSlashCommand({
|
|
77
|
+
name: 'create-new-project', options,
|
|
78
|
+
});
|
|
79
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
80
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
81
|
+
expect((await channel.getInteractionResponse(ignored.id))?.acknowledged ?? false).toBe(false);
|
|
82
|
+
}
|
|
83
|
+
expect(await findChannelsByDirectory({})).toEqual([]);
|
|
84
|
+
await setChannelDirectory({ channelId: projectChannelId, directory, channelType: 'text' });
|
|
85
|
+
const allowed = await channel.user('100000000000000555').runSlashCommand({
|
|
86
|
+
name: 'create-new-project', options,
|
|
87
|
+
});
|
|
88
|
+
await channel.waitForInteractionAck({ interactionId: allowed.id });
|
|
89
|
+
await channel.waitForBotReply();
|
|
90
|
+
expect(await channel.text()).toMatchInlineSnapshot(`
|
|
91
|
+
"--- from: assistant (TestBot)
|
|
92
|
+
Invalid project name"
|
|
93
|
+
`);
|
|
94
|
+
});
|
|
95
|
+
for (const setup of ['legacy mapping', 'explicit onboarding']) {
|
|
96
|
+
test(`self-hosted startup provisions only the configured guild after ${setup}`, async () => {
|
|
97
|
+
const guild = client.guilds.cache.get(trustedGuildId);
|
|
98
|
+
if (setup === 'legacy mapping') {
|
|
99
|
+
await setChannelDirectory({ channelId: projectChannelId, directory, channelType: 'text' });
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
await createProjectChannels({ guild, projectDirectory: path.join(directory, 'project'), analyticsSource: 'onboarding' });
|
|
103
|
+
}
|
|
104
|
+
expect((await findChannelsByDirectory({}))[0]?.guild_id).toBeNull();
|
|
105
|
+
// Fetching actual guild channels must work even when startup cache is empty.
|
|
106
|
+
guild.channels.cache.clear();
|
|
107
|
+
const created = await ensureDefaultChannelsWithWelcome({
|
|
108
|
+
guilds: [...client.guilds.cache.values()], discordClient: client,
|
|
109
|
+
appId: discord.botUserId, isGatewayMode: false,
|
|
110
|
+
});
|
|
111
|
+
for (const channel of created) {
|
|
112
|
+
expect(await discord.channel(channel.id).text()).toMatchInlineSnapshot(`
|
|
113
|
+
"--- from: assistant (TestBot)
|
|
114
|
+
**Kimaki** lets you code from Discord. Send a message in any project channel and an AI agent edits code, runs commands, and searches your codebase — all on your machine.
|
|
115
|
+
**What you can do:**
|
|
116
|
+
- Use \`/add-project\` to create a Discord channel linked to one OpenCode project (git repo)
|
|
117
|
+
- Collaborate with teammates in the same session
|
|
118
|
+
- Upload images and files, the bot can share screenshots back
|
|
119
|
+
Want to build an example browser game? Respond in this thread."
|
|
120
|
+
`);
|
|
121
|
+
}
|
|
122
|
+
expect(created.map((channel) => channel.guildId)).toEqual([trustedGuildId]);
|
|
123
|
+
expect((await client.guilds.cache.get(otherGuildId).channels.fetch()).size).toBe(1);
|
|
124
|
+
expect(await ensureDefaultChannelsWithWelcome({
|
|
125
|
+
guilds: [...client.guilds.cache.values()], discordClient: client,
|
|
126
|
+
appId: discord.botUserId, isGatewayMode: false,
|
|
127
|
+
})).toEqual([]);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
test('gateway startup provisions every proxy-authorized guild without local mappings', async () => {
|
|
131
|
+
const created = await ensureDefaultChannelsWithWelcome({
|
|
132
|
+
guilds: [...client.guilds.cache.values()], discordClient: client,
|
|
133
|
+
appId: discord.botUserId, isGatewayMode: true,
|
|
134
|
+
});
|
|
135
|
+
for (const channel of created) {
|
|
136
|
+
expect(await discord.channel(channel.id).text()).toMatchInlineSnapshot(`
|
|
137
|
+
"--- from: assistant (TestBot)
|
|
138
|
+
**Kimaki** lets you code from Discord. Send a message in any project channel and an AI agent edits code, runs commands, and searches your codebase — all on your machine.
|
|
139
|
+
**What you can do:**
|
|
140
|
+
- Use \`/add-project\` to create a Discord channel linked to one OpenCode project (git repo)
|
|
141
|
+
- Collaborate with teammates in the same session
|
|
142
|
+
- Upload images and files, the bot can share screenshots back
|
|
143
|
+
Want to build an example browser game? Respond in this thread."
|
|
144
|
+
`);
|
|
145
|
+
}
|
|
146
|
+
expect(created.map((channel) => channel.guildId).sort()).toEqual([trustedGuildId, otherGuildId]);
|
|
147
|
+
expect(await findChannelsByDirectory({})).toHaveLength(2);
|
|
148
|
+
});
|