kimaki 0.30.1 → 1.0.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-ui.d.ts +33 -0
- package/dist/agent-ui.e2e.test.d.ts +1 -0
- package/dist/agent-ui.e2e.test.js +140 -0
- package/dist/agent-ui.e2e.test.js.map +1 -0
- package/dist/agent-ui.js +199 -0
- package/dist/agent-ui.js.map +1 -0
- package/dist/analytics.d.ts +42 -0
- package/dist/analytics.e2e.test.d.ts +1 -0
- package/dist/analytics.e2e.test.js +112 -0
- package/dist/analytics.e2e.test.js.map +1 -0
- package/dist/analytics.js +162 -221
- package/dist/analytics.js.map +1 -0
- package/dist/analytics.test.d.ts +1 -0
- package/dist/analytics.test.js +121 -157
- package/dist/analytics.test.js.map +1 -0
- package/dist/autostart.d.ts +7 -0
- package/dist/autostart.js +75 -0
- package/dist/autostart.js.map +1 -0
- package/dist/bot.d.ts +90 -0
- package/dist/bot.js +120 -0
- package/dist/bot.js.map +1 -0
- package/dist/btw.e2e.test.d.ts +1 -0
- package/dist/btw.e2e.test.js +102 -0
- package/dist/btw.e2e.test.js.map +1 -0
- package/dist/catalog-refresh.e2e.test.d.ts +1 -0
- package/dist/catalog-refresh.e2e.test.js +90 -0
- package/dist/catalog-refresh.e2e.test.js.map +1 -0
- package/dist/cli/bot.d.ts +5 -0
- package/dist/cli/bot.js +427 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/discord.d.ts +3 -0
- package/dist/cli/discord.js +118 -0
- package/dist/cli/discord.js.map +1 -0
- package/dist/cli/project.d.ts +5 -0
- package/dist/cli/project.js +143 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/schedule.d.ts +3 -0
- package/dist/cli/schedule.js +156 -0
- package/dist/cli/schedule.js.map +1 -0
- package/dist/cli/session.d.ts +4 -0
- package/dist/cli/session.js +281 -0
- package/dist/cli/session.js.map +1 -0
- package/dist/cli/shared.d.ts +55 -0
- package/dist/cli/shared.js +138 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli-discord.e2e.test.d.ts +1 -0
- package/dist/cli-discord.e2e.test.js +64 -0
- package/dist/cli-discord.e2e.test.js.map +1 -0
- package/dist/cli-lock.e2e.test.d.ts +1 -0
- package/dist/cli-lock.e2e.test.js +520 -0
- package/dist/cli-lock.e2e.test.js.map +1 -0
- package/dist/cli-read.e2e.test.d.ts +1 -0
- package/dist/cli-read.e2e.test.js +81 -0
- package/dist/cli-read.e2e.test.js.map +1 -0
- package/dist/cli-sessions.e2e.test.d.ts +1 -0
- package/dist/cli-sessions.e2e.test.js +116 -0
- package/dist/cli-sessions.e2e.test.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +34 -263
- package/dist/cli.js.map +1 -0
- package/dist/commands/login-commands.d.ts +59 -0
- package/dist/commands/login-commands.js +341 -0
- package/dist/commands/login-commands.js.map +1 -0
- package/dist/commands/preference-commands.d.ts +44 -0
- package/dist/commands/preference-commands.js +551 -0
- package/dist/commands/preference-commands.js.map +1 -0
- package/dist/commands/session-commands.d.ts +8 -0
- package/dist/commands/session-commands.js +267 -0
- package/dist/commands/session-commands.js.map +1 -0
- package/dist/commands/thread-commands.d.ts +16 -0
- package/dist/commands/thread-commands.js +285 -0
- package/dist/commands/thread-commands.js.map +1 -0
- package/dist/commands/worktree-commands.d.ts +41 -0
- package/dist/commands/worktree-commands.js +279 -0
- package/dist/commands/worktree-commands.js.map +1 -0
- package/dist/commands.e2e.test.d.ts +1 -0
- package/dist/commands.e2e.test.js +255 -0
- package/dist/commands.e2e.test.js.map +1 -0
- package/dist/credentials.d.ts +84 -0
- package/dist/credentials.js +320 -0
- package/dist/credentials.js.map +1 -0
- package/dist/db.d.ts +1532 -0
- package/dist/db.js +57 -245
- package/dist/db.js.map +1 -0
- package/dist/db.test.d.ts +1 -0
- package/dist/db.test.js +352 -673
- package/dist/db.test.js.map +1 -0
- package/dist/duration.d.ts +2 -0
- package/dist/duration.js +18 -0
- package/dist/duration.js.map +1 -0
- package/dist/effects.d.ts +15 -0
- package/dist/effects.js +291 -0
- package/dist/effects.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.js +40 -170
- package/dist/errors.js.map +1 -0
- package/dist/event-loop.d.ts +40 -0
- package/dist/event-loop.js +414 -0
- package/dist/event-loop.js.map +1 -0
- package/dist/file-edit-log.d.ts +41 -0
- package/dist/file-edit-log.js +122 -164
- package/dist/file-edit-log.js.map +1 -0
- package/dist/file-edit-log.test.d.ts +1 -0
- package/dist/file-edit-log.test.js +68 -244
- package/dist/file-edit-log.test.js.map +1 -0
- package/dist/format-parts.d.ts +137 -0
- package/dist/format-parts.js +300 -0
- package/dist/format-parts.js.map +1 -0
- package/dist/format-parts.test.d.ts +1 -0
- package/dist/format-parts.test.js +144 -0
- package/dist/format-parts.test.js.map +1 -0
- package/dist/gateway-replay.e2e.test.d.ts +1 -0
- package/dist/gateway-replay.e2e.test.js +95 -0
- package/dist/gateway-replay.e2e.test.js.map +1 -0
- package/dist/harness.e2e.test.d.ts +1 -0
- package/dist/harness.e2e.test.js +107 -0
- package/dist/harness.e2e.test.js.map +1 -0
- package/dist/hello-thread.e2e.test.d.ts +1 -0
- package/dist/hello-thread.e2e.test.js +194 -0
- package/dist/hello-thread.e2e.test.js.map +1 -0
- package/dist/ingress.d.ts +7 -0
- package/dist/ingress.js +337 -0
- package/dist/ingress.js.map +1 -0
- package/dist/interaction-context.d.ts +45 -0
- package/dist/interaction-context.js +77 -0
- package/dist/interaction-context.js.map +1 -0
- package/dist/interrupt.e2e.test.d.ts +1 -0
- package/dist/interrupt.e2e.test.js +124 -0
- package/dist/interrupt.e2e.test.js.map +1 -0
- package/dist/legacy.e2e.test.d.ts +1 -0
- package/dist/legacy.e2e.test.js +85 -0
- package/dist/legacy.e2e.test.js.map +1 -0
- package/dist/live-call.d.ts +51 -0
- package/dist/live-call.js +207 -0
- package/dist/live-call.js.map +1 -0
- package/dist/lock-routes.d.ts +812 -0
- package/dist/lock-routes.js +635 -0
- package/dist/lock-routes.js.map +1 -0
- package/dist/lock-server.d.ts +36 -0
- package/dist/lock-server.js +223 -0
- package/dist/lock-server.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.js +112 -162
- package/dist/logger.js.map +1 -0
- package/dist/login.e2e.test.d.ts +1 -0
- package/dist/login.e2e.test.js +83 -0
- package/dist/login.e2e.test.js.map +1 -0
- package/dist/main.d.ts +32 -0
- package/dist/main.js +190 -0
- package/dist/main.js.map +1 -0
- package/dist/markdown/components.d.ts +10 -0
- package/dist/markdown/components.js +77 -0
- package/dist/markdown/components.js.map +1 -0
- package/dist/markdown/markdown.test.d.ts +1 -0
- package/dist/markdown/markdown.test.js +393 -0
- package/dist/markdown/markdown.test.js.map +1 -0
- package/dist/markdown/render-markdown.d.ts +30 -0
- package/dist/markdown/render-markdown.js +265 -0
- package/dist/markdown/render-markdown.js.map +1 -0
- package/dist/message-tool.e2e.test.d.ts +1 -0
- package/dist/message-tool.e2e.test.js +39 -0
- package/dist/message-tool.e2e.test.js.map +1 -0
- package/dist/migrations.d.ts +8 -0
- package/dist/migrations.js +187 -0
- package/dist/migrations.js.map +1 -0
- package/dist/onboarding-cli.e2e.test.d.ts +1 -0
- package/dist/onboarding-cli.e2e.test.js +178 -0
- package/dist/onboarding-cli.e2e.test.js.map +1 -0
- package/dist/onboarding.d.ts +36 -0
- package/dist/onboarding.e2e.test.d.ts +1 -0
- package/dist/onboarding.e2e.test.js +148 -0
- package/dist/onboarding.e2e.test.js.map +1 -0
- package/dist/onboarding.js +261 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/opencode-server.d.ts +54 -0
- package/dist/opencode-server.js +413 -0
- package/dist/opencode-server.js.map +1 -0
- package/dist/opencode-server.test.d.ts +1 -0
- package/dist/opencode-server.test.js +21 -0
- package/dist/opencode-server.test.js.map +1 -0
- package/dist/permissions.d.ts +31 -0
- package/dist/permissions.e2e.test.d.ts +1 -0
- package/dist/permissions.e2e.test.js +166 -0
- package/dist/permissions.e2e.test.js.map +1 -0
- package/dist/permissions.js +95 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugin/anthropic/index.d.ts +13 -0
- package/dist/plugin/anthropic/index.js +201 -0
- package/dist/plugin/anthropic/index.js.map +1 -0
- package/dist/plugin/anthropic/index.test.d.ts +1 -0
- package/dist/plugin/anthropic/index.test.js +39 -0
- package/dist/plugin/anthropic/index.test.js.map +1 -0
- package/dist/plugin/index.d.ts +3 -0
- package/dist/plugin/index.js +106 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/session-id/index.d.ts +3 -0
- package/dist/plugin/session-id/index.js +18 -0
- package/dist/plugin/session-id/index.js.map +1 -0
- package/dist/plugin.e2e.test.d.ts +1 -0
- package/dist/plugin.e2e.test.js +87 -0
- package/dist/plugin.e2e.test.js.map +1 -0
- package/dist/preference-commands.e2e.test.d.ts +1 -0
- package/dist/preference-commands.e2e.test.js +555 -0
- package/dist/preference-commands.e2e.test.js.map +1 -0
- package/dist/probe-live.tmp.d.ts +1 -0
- package/dist/probe-live.tmp.js +82 -0
- package/dist/probe-live.tmp.js.map +1 -0
- package/dist/project.d.ts +58 -0
- package/dist/project.js +169 -0
- package/dist/project.js.map +1 -0
- package/dist/prompt.d.ts +112 -0
- package/dist/prompt.js +578 -0
- package/dist/prompt.js.map +1 -0
- package/dist/questions.d.ts +59 -0
- package/dist/questions.e2e.test.d.ts +1 -0
- package/dist/questions.e2e.test.js +290 -0
- package/dist/questions.e2e.test.js.map +1 -0
- package/dist/questions.js +231 -0
- package/dist/questions.js.map +1 -0
- package/dist/queue.d.ts +45 -0
- package/dist/queue.e2e.test.d.ts +1 -0
- package/dist/queue.e2e.test.js +220 -0
- package/dist/queue.e2e.test.js.map +1 -0
- package/dist/queue.js +132 -0
- package/dist/queue.js.map +1 -0
- package/dist/remote-send.d.ts +32 -0
- package/dist/remote-send.e2e.test.d.ts +1 -0
- package/dist/remote-send.e2e.test.js +89 -0
- package/dist/remote-send.e2e.test.js.map +1 -0
- package/dist/remote-send.js +105 -0
- package/dist/remote-send.js.map +1 -0
- package/dist/renderer.e2e.test.d.ts +1 -0
- package/dist/renderer.e2e.test.js +357 -0
- package/dist/renderer.e2e.test.js.map +1 -0
- package/dist/restart.e2e.test.d.ts +1 -0
- package/dist/restart.e2e.test.js +68 -0
- package/dist/restart.e2e.test.js.map +1 -0
- package/dist/routes.d.ts +24 -0
- package/dist/routes.js +42 -0
- package/dist/routes.js.map +1 -0
- package/dist/routes.test.d.ts +1 -0
- package/dist/routes.test.js +79 -0
- package/dist/routes.test.js.map +1 -0
- package/dist/routines.e2e.test.d.ts +1 -0
- package/dist/routines.e2e.test.js +188 -0
- package/dist/routines.e2e.test.js.map +1 -0
- package/dist/scheduler.d.ts +116 -0
- package/dist/scheduler.e2e.test.d.ts +1 -0
- package/dist/scheduler.e2e.test.js +163 -0
- package/dist/scheduler.e2e.test.js.map +1 -0
- package/dist/scheduler.js +602 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/scheduler.test.d.ts +1 -0
- package/dist/scheduler.test.js +180 -0
- package/dist/scheduler.test.js.map +1 -0
- package/dist/schema-sql.d.ts +1 -0
- package/dist/schema-sql.js +3 -0
- package/dist/schema-sql.js.map +1 -0
- package/dist/schema.d.ts +2968 -0
- package/dist/schema.js +95 -252
- package/dist/schema.js.map +1 -0
- package/dist/session-commands.e2e.test.d.ts +1 -0
- package/dist/session-commands.e2e.test.js +285 -0
- package/dist/session-commands.e2e.test.js.map +1 -0
- package/dist/session-events.d.ts +55 -0
- package/dist/session-events.js +190 -0
- package/dist/session-events.js.map +1 -0
- package/dist/session-ops.e2e.test.d.ts +1 -0
- package/dist/session-ops.e2e.test.js +114 -0
- package/dist/session-ops.e2e.test.js.map +1 -0
- package/dist/sessions.d.ts +121 -0
- package/dist/sessions.js +662 -0
- package/dist/sessions.js.map +1 -0
- package/dist/shell.e2e.test.d.ts +1 -0
- package/dist/shell.e2e.test.js +147 -0
- package/dist/shell.e2e.test.js.map +1 -0
- package/dist/slash-commands.d.ts +62 -0
- package/dist/slash-commands.js +475 -0
- package/dist/slash-commands.js.map +1 -0
- package/dist/slash-commands.test.d.ts +1 -0
- package/dist/slash-commands.test.js +87 -0
- package/dist/slash-commands.test.js.map +1 -0
- package/dist/sleep.e2e.test.d.ts +1 -0
- package/dist/sleep.e2e.test.js +115 -487
- package/dist/sleep.e2e.test.js.map +1 -0
- package/dist/sleeps.d.ts +37 -0
- package/dist/sleeps.js +220 -0
- package/dist/sleeps.js.map +1 -0
- package/dist/store.d.ts +10 -0
- package/dist/store.js +8 -28
- package/dist/store.js.map +1 -0
- package/dist/system-prompt.d.ts +65 -0
- package/dist/system-prompt.js +875 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/tasks.e2e.test.d.ts +1 -0
- package/dist/tasks.e2e.test.js +173 -0
- package/dist/tasks.e2e.test.js.map +1 -0
- package/dist/test/auth-plugin/index.d.ts +3 -0
- package/dist/test/auth-plugin/index.js +18 -0
- package/dist/test/auth-plugin/index.js.map +1 -0
- package/dist/test/fake-mcp-server.d.ts +1 -0
- package/dist/test/fake-mcp-server.js +45 -0
- package/dist/test/fake-mcp-server.js.map +1 -0
- package/dist/test/harness.d.ts +246 -0
- package/dist/test/harness.js +704 -0
- package/dist/test/harness.js.map +1 -0
- package/dist/test/replay.d.ts +14 -0
- package/dist/test/replay.js +75 -0
- package/dist/test/replay.js.map +1 -0
- package/dist/thread-reducer.d.ts +172 -0
- package/dist/thread-reducer.fixtures.test.d.ts +1 -0
- package/dist/thread-reducer.fixtures.test.js +360 -0
- package/dist/thread-reducer.fixtures.test.js.map +1 -0
- package/dist/thread-reducer.js +497 -0
- package/dist/thread-reducer.js.map +1 -0
- package/dist/thread-reducer.test.d.ts +1 -0
- package/dist/thread-reducer.test.js +369 -0
- package/dist/thread-reducer.test.js.map +1 -0
- package/dist/tts.test.d.ts +1 -0
- package/dist/tts.test.js +147 -0
- package/dist/tts.test.js.map +1 -0
- package/dist/voice-agent.d.ts +33 -0
- package/dist/voice-agent.js +159 -0
- package/dist/voice-agent.js.map +1 -0
- package/dist/voice-attachments.e2e.test.d.ts +1 -0
- package/dist/voice-attachments.e2e.test.js +253 -0
- package/dist/voice-attachments.e2e.test.js.map +1 -0
- package/dist/voice-call.d.ts +59 -0
- package/dist/voice-call.e2e.test.d.ts +1 -0
- package/dist/voice-call.e2e.test.js +259 -0
- package/dist/voice-call.e2e.test.js.map +1 -0
- package/dist/voice-call.js +760 -0
- package/dist/voice-call.js.map +1 -0
- package/dist/voice-openai.e2e.test.d.ts +1 -0
- package/dist/voice-openai.e2e.test.js +161 -0
- package/dist/voice-openai.e2e.test.js.map +1 -0
- package/dist/voice.d.ts +116 -0
- package/dist/voice.js +648 -646
- package/dist/voice.js.map +1 -0
- package/dist/working-directory.e2e.test.d.ts +1 -0
- package/dist/working-directory.e2e.test.js +231 -0
- package/dist/working-directory.e2e.test.js.map +1 -0
- package/dist/worktrees.d.ts +54 -0
- package/dist/worktrees.js +247 -709
- package/dist/worktrees.js.map +1 -0
- package/dist/worktrees.test.d.ts +1 -0
- package/dist/worktrees.test.js +97 -952
- package/dist/worktrees.test.js.map +1 -0
- package/package.json +40 -79
- package/src/agent-ui.e2e.test.ts +134 -0
- package/src/agent-ui.ts +216 -0
- package/src/analytics.e2e.test.ts +138 -0
- package/src/analytics.test.ts +122 -182
- package/src/analytics.ts +206 -256
- package/src/autostart.ts +78 -0
- package/src/bot.ts +194 -0
- package/src/btw.e2e.test.ts +130 -0
- package/src/catalog-refresh.e2e.test.ts +112 -0
- package/src/cli/bot.ts +419 -0
- package/src/cli/discord.ts +116 -0
- package/src/cli/project.ts +147 -0
- package/src/cli/schedule.ts +151 -0
- package/src/cli/session.ts +285 -0
- package/src/cli/shared.ts +139 -0
- package/src/cli-discord.e2e.test.ts +62 -0
- package/src/cli-lock.e2e.test.ts +530 -0
- package/src/cli-read.e2e.test.ts +78 -0
- package/src/cli-sessions.e2e.test.ts +122 -0
- package/src/cli.ts +35 -418
- package/src/commands/login-commands.ts +360 -0
- package/src/commands/preference-commands.ts +586 -0
- package/src/commands/session-commands.ts +289 -0
- package/src/commands/thread-commands.ts +324 -0
- package/src/commands/worktree-commands.ts +288 -0
- package/src/commands.e2e.test.ts +290 -0
- package/src/credentials.ts +425 -0
- package/src/db.test.ts +345 -748
- package/src/db.ts +66 -284
- package/src/duration.ts +18 -0
- package/src/effects.ts +303 -0
- package/src/errors.ts +39 -222
- package/src/event-loop.ts +462 -0
- package/src/file-edit-log.test.ts +68 -272
- package/src/file-edit-log.ts +108 -231
- package/src/fixtures/v1-schema.sql +241 -0
- package/src/fixtures/voice.ogg +0 -0
- package/src/format-parts.test.ts +150 -0
- package/src/format-parts.ts +405 -0
- package/src/gateway-replay.e2e.test.ts +116 -0
- package/src/harness.e2e.test.ts +124 -0
- package/src/hello-thread.e2e.test.ts +223 -0
- package/src/ingress.ts +334 -0
- package/src/interaction-context.ts +131 -0
- package/src/interrupt.e2e.test.ts +151 -0
- package/src/legacy.e2e.test.ts +105 -0
- package/src/live-call.ts +249 -0
- package/src/lock-routes.ts +625 -0
- package/src/lock-server.ts +233 -0
- package/src/logger.ts +120 -207
- package/src/login.e2e.test.ts +86 -0
- package/src/main.ts +230 -0
- package/src/markdown/components.ts +102 -0
- package/src/markdown/markdown.test.ts +414 -0
- package/src/markdown/render-markdown.ts +288 -0
- package/src/migrations.ts +198 -0
- package/src/onboarding-cli.e2e.test.ts +215 -0
- package/src/onboarding.e2e.test.ts +171 -0
- package/src/onboarding.ts +297 -0
- package/src/opencode-server.test.ts +24 -0
- package/src/opencode-server.ts +461 -0
- package/src/permissions.e2e.test.ts +191 -0
- package/src/permissions.ts +121 -0
- package/src/plugin/anthropic/index.test.ts +39 -0
- package/src/plugin/anthropic/index.ts +213 -0
- package/src/plugin/index.ts +93 -0
- package/src/plugin/session-id/index.ts +19 -0
- package/src/plugin.e2e.test.ts +112 -0
- package/src/preference-commands.e2e.test.ts +597 -0
- package/src/project.ts +216 -0
- package/src/prompt.ts +664 -0
- package/src/questions.e2e.test.ts +328 -0
- package/src/questions.ts +322 -0
- package/src/queue.e2e.test.ts +253 -0
- package/src/queue.ts +158 -0
- package/src/remote-send.e2e.test.ts +91 -0
- package/src/remote-send.ts +110 -0
- package/src/renderer.e2e.test.ts +390 -0
- package/src/restart.e2e.test.ts +90 -0
- package/src/routes.test.ts +81 -0
- package/src/routes.ts +48 -0
- package/src/routines.e2e.test.ts +210 -0
- package/src/scheduler.e2e.test.ts +182 -0
- package/src/scheduler.test.ts +183 -0
- package/src/scheduler.ts +648 -0
- package/src/schema-sql.ts +3 -0
- package/src/schema.ts +95 -271
- package/src/session-commands.e2e.test.ts +326 -0
- package/src/session-events.ts +218 -0
- package/src/session-ops.e2e.test.ts +141 -0
- package/src/sessions.ts +803 -0
- package/src/shell.e2e.test.ts +173 -0
- package/src/slash-commands.test.ts +89 -0
- package/src/slash-commands.ts +539 -0
- package/src/sleep.e2e.test.ts +135 -552
- package/src/sleeps.ts +230 -0
- package/src/store.ts +19 -217
- package/src/system-prompt.ts +944 -0
- package/src/test/auth-plugin/index.ts +17 -0
- package/src/test/fake-mcp-server.ts +49 -0
- package/src/test/harness.ts +957 -0
- package/src/test/replay.ts +90 -0
- package/src/thread-reducer.fixtures.test.ts +374 -0
- package/src/thread-reducer.test.ts +380 -0
- package/src/thread-reducer.ts +671 -0
- package/src/tts.test.ts +150 -0
- package/src/voice-agent.ts +196 -0
- package/src/voice-attachments.e2e.test.ts +298 -0
- package/src/voice-call.e2e.test.ts +293 -0
- package/src/voice-call.ts +764 -0
- package/src/voice-openai.e2e.test.ts +191 -0
- package/src/voice.ts +691 -890
- package/src/working-directory.e2e.test.ts +226 -0
- package/src/worktrees.test.ts +89 -1115
- package/src/worktrees.ts +195 -957
- package/bin.js +0 -2
- package/dist/agent-model.e2e.test.js +0 -1215
- package/dist/ai-tool-to-genai.js +0 -233
- package/dist/ai-tool-to-genai.test.js +0 -267
- package/dist/ai-tool.js +0 -6
- package/dist/anthropic-account-identity.js +0 -70
- package/dist/anthropic-account-identity.test.js +0 -38
- package/dist/anthropic-auth-plugin.js +0 -958
- package/dist/anthropic-auth-plugin.test.js +0 -115
- package/dist/anthropic-auth-state.js +0 -186
- package/dist/anthropic-auth-state.test.js +0 -203
- package/dist/bash-tool-schema-plugin.js +0 -50
- package/dist/bash-tool-schema-plugin.test.js +0 -68
- package/dist/bin.js +0 -151
- package/dist/bot-lifecycle.test.js +0 -206
- package/dist/btw-prefix-detection.js +0 -15
- package/dist/btw-prefix-detection.test.js +0 -93
- package/dist/cache-drift-plugin.js +0 -183
- package/dist/cache-rewrite.js +0 -39
- package/dist/cache-rewrite.test.js +0 -41
- package/dist/channel-management.js +0 -347
- package/dist/cli-commands/bot.js +0 -254
- package/dist/cli-commands/maintenance.js +0 -171
- package/dist/cli-commands/misc.js +0 -153
- package/dist/cli-commands/project.js +0 -510
- package/dist/cli-commands/send.js +0 -659
- package/dist/cli-commands/session.js +0 -889
- package/dist/cli-commands/task.js +0 -277
- package/dist/cli-commands/thread.js +0 -63
- package/dist/cli-commands/user.js +0 -145
- package/dist/cli-parsing.test.js +0 -226
- package/dist/cli-runner.js +0 -1579
- package/dist/cli-runner.test.js +0 -86
- package/dist/cli-send-thread.e2e.test.js +0 -470
- package/dist/cloudflare-transcription.js +0 -56
- package/dist/commands/abort.js +0 -84
- package/dist/commands/action-buttons.js +0 -248
- package/dist/commands/add-project.js +0 -111
- package/dist/commands/agent.js +0 -658
- package/dist/commands/ask-question.js +0 -371
- package/dist/commands/ask-question.test.js +0 -150
- package/dist/commands/btw.js +0 -167
- package/dist/commands/compact.js +0 -117
- package/dist/commands/context-usage.js +0 -147
- package/dist/commands/create-new-project.js +0 -138
- package/dist/commands/diff.js +0 -63
- package/dist/commands/file-upload.js +0 -280
- package/dist/commands/fork-subagent.js +0 -175
- package/dist/commands/fork.js +0 -260
- package/dist/commands/gemini-apikey.js +0 -123
- package/dist/commands/last-sessions.js +0 -129
- package/dist/commands/login.js +0 -893
- package/dist/commands/mcp.js +0 -239
- package/dist/commands/memory-snapshot.js +0 -24
- package/dist/commands/mention-mode.js +0 -42
- package/dist/commands/merge-worktree.js +0 -205
- package/dist/commands/model-variant.js +0 -390
- package/dist/commands/model.js +0 -957
- package/dist/commands/multioauth.js +0 -425
- package/dist/commands/new-worktree.js +0 -622
- package/dist/commands/paginated-select.js +0 -57
- package/dist/commands/permissions.js +0 -327
- package/dist/commands/queue.js +0 -340
- package/dist/commands/queue.test.js +0 -15
- package/dist/commands/remove-project.js +0 -111
- package/dist/commands/restart-opencode-server.js +0 -133
- package/dist/commands/resume.js +0 -148
- package/dist/commands/run-command.js +0 -79
- package/dist/commands/screenshare.js +0 -307
- package/dist/commands/screenshare.test.js +0 -20
- package/dist/commands/session-id.js +0 -78
- package/dist/commands/session.js +0 -243
- package/dist/commands/share.js +0 -80
- package/dist/commands/tasks.js +0 -296
- package/dist/commands/types.js +0 -2
- package/dist/commands/undo-redo.js +0 -313
- package/dist/commands/unset-model.js +0 -116
- package/dist/commands/upgrade.js +0 -41
- package/dist/commands/user-command.js +0 -196
- package/dist/commands/verbosity.js +0 -124
- package/dist/commands/vscode.js +0 -295
- package/dist/commands/worktrees.js +0 -548
- package/dist/condense-memory.js +0 -33
- package/dist/config.js +0 -126
- package/dist/context-awareness-plugin.js +0 -357
- package/dist/context-awareness-plugin.test.js +0 -126
- package/dist/cpu-profiler.js +0 -211
- package/dist/cpu-profiler.test.js +0 -160
- package/dist/critique-utils.js +0 -95
- package/dist/database.js +0 -1074
- package/dist/debounce-timeout.js +0 -28
- package/dist/debounced-process-flush.js +0 -77
- package/dist/default-channel-provisioning.test.js +0 -149
- package/dist/discord-bot.js +0 -1409
- package/dist/discord-command-registration.js +0 -519
- package/dist/discord-command-registration.test.js +0 -17
- package/dist/discord-urls.js +0 -81
- package/dist/discord-utils.js +0 -789
- package/dist/discord-utils.test.js +0 -400
- package/dist/escape-backticks.test.js +0 -429
- package/dist/event-stream-real-capture.e2e.test.js +0 -533
- package/dist/eventsource-parser.test.js +0 -327
- package/dist/exec-async.js +0 -38
- package/dist/external-directory-permissions.e2e.test.js +0 -86
- package/dist/external-directory-project-deny.e2e.test.js +0 -70
- package/dist/external-opencode-sync.js +0 -620
- package/dist/external-opencode-sync.test.js +0 -206
- package/dist/extract-sdk-error-message.test.js +0 -13
- package/dist/format-tables.js +0 -728
- package/dist/format-tables.test.js +0 -915
- package/dist/forum-sync/config.js +0 -79
- package/dist/forum-sync/discord-operations.js +0 -157
- package/dist/forum-sync/index.js +0 -5
- package/dist/forum-sync/markdown.js +0 -110
- package/dist/forum-sync/sync-to-discord.js +0 -417
- package/dist/forum-sync/sync-to-files.js +0 -190
- package/dist/forum-sync/types.js +0 -53
- package/dist/forum-sync/watchers.js +0 -322
- package/dist/gateway-proxy-reconnect.e2e.test.js +0 -414
- package/dist/gateway-proxy.e2e.test.js +0 -488
- package/dist/genai-worker-wrapper.js +0 -111
- package/dist/genai-worker.js +0 -309
- package/dist/genai.js +0 -232
- package/dist/git-worktree-core.js +0 -461
- package/dist/guild-categories.test.js +0 -225
- package/dist/heap-monitor.js +0 -122
- package/dist/hrana-server.js +0 -322
- package/dist/hrana-server.test.js +0 -99
- package/dist/html-actions.js +0 -123
- package/dist/html-actions.test.js +0 -70
- package/dist/html-components.js +0 -115
- package/dist/html-components.test.js +0 -34
- package/dist/image-optimizer-plugin.js +0 -153
- package/dist/image-utils.js +0 -112
- package/dist/interaction-handler.js +0 -578
- package/dist/ipc-polling.js +0 -245
- package/dist/ipc-tools-plugin.js +0 -251
- package/dist/kimaki-digital-twin.e2e.test.js +0 -161
- package/dist/kimaki-opencode-plugin-loading.e2e.test.js +0 -158
- package/dist/kimaki-opencode-plugin.js +0 -33
- package/dist/kimaki-opencode-plugin.test.js +0 -126
- package/dist/kimaki-workspace-adaptor.js +0 -118
- package/dist/limit-heading-depth.js +0 -25
- package/dist/limit-heading-depth.test.js +0 -105
- package/dist/list-channel-threads.js +0 -163
- package/dist/list-channel-threads.test.js +0 -80
- package/dist/markdown.js +0 -455
- package/dist/markdown.test.js +0 -411
- package/dist/memory-overview-plugin.js +0 -123
- package/dist/message-formatting.js +0 -763
- package/dist/message-formatting.test.js +0 -1132
- package/dist/message-preprocessing.js +0 -441
- package/dist/oauth-rotation-shared.js +0 -253
- package/dist/onboarding-tutorial.js +0 -163
- package/dist/onboarding-welcome.js +0 -37
- package/dist/openai-auth-plugin.js +0 -125
- package/dist/openai-auth-state.js +0 -237
- package/dist/openai-realtime.js +0 -224
- package/dist/opencode-command-detection.js +0 -65
- package/dist/opencode-command-detection.test.js +0 -240
- package/dist/opencode-command.js +0 -181
- package/dist/opencode-command.test.js +0 -218
- package/dist/opencode-interrupt-plugin.js +0 -253
- package/dist/opencode-interrupt-plugin.test.js +0 -293
- package/dist/opencode.js +0 -1217
- package/dist/parse-permission-rules.test.js +0 -117
- package/dist/patch-text-parser.js +0 -97
- package/dist/plugin-logger.js +0 -105
- package/dist/plugin-opencode-client.js +0 -54
- package/dist/privacy-sanitizer.js +0 -105
- package/dist/project-add.test.js +0 -62
- package/dist/question-abort-clears-dropdown.e2e.test.js +0 -89
- package/dist/question-abort-resume.e2e.test.js +0 -100
- package/dist/question-abort-retry-text-before-dropdown.e2e.test.js +0 -150
- package/dist/question-text-before-dropdown.e2e.test.js +0 -52
- package/dist/queue-advanced-abort.e2e.test.js +0 -348
- package/dist/queue-advanced-action-buttons.e2e.test.js +0 -209
- package/dist/queue-advanced-e2e-setup.js +0 -1043
- package/dist/queue-advanced-footer.e2e.test.js +0 -286
- package/dist/queue-advanced-model-switch.e2e.test.js +0 -297
- package/dist/queue-advanced-permissions-typing.e2e.test.js +0 -189
- package/dist/queue-advanced-question.e2e.test.js +0 -266
- package/dist/queue-advanced-typing-interrupt.e2e.test.js +0 -113
- package/dist/queue-advanced-typing.e2e.test.js +0 -151
- package/dist/queue-delete-message.e2e.test.js +0 -75
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +0 -120
- package/dist/queue-interrupt-drain.e2e.test.js +0 -246
- package/dist/queue-question-select-drain.e2e.test.js +0 -162
- package/dist/runtime-idle-sweeper.js +0 -52
- package/dist/runtime-lifecycle.e2e.test.js +0 -570
- package/dist/sentry.js +0 -23
- package/dist/session-handler/agent-utils.js +0 -66
- package/dist/session-handler/event-stream-state.js +0 -1217
- package/dist/session-handler/event-stream-state.test.js +0 -3034
- package/dist/session-handler/global-event-listener.js +0 -212
- package/dist/session-handler/model-utils.js +0 -311
- package/dist/session-handler/model-utils.test.js +0 -445
- package/dist/session-handler/opencode-session-event-log.js +0 -121
- package/dist/session-handler/thread-ingress.test.js +0 -41
- package/dist/session-handler/thread-runtime-state.js +0 -209
- package/dist/session-handler/thread-session-runtime-summary.test.js +0 -121
- package/dist/session-handler/thread-session-runtime.js +0 -4252
- package/dist/session-handler.js +0 -9
- package/dist/session-search.js +0 -219
- package/dist/session-search.test.js +0 -287
- package/dist/session-sleep.test.js +0 -224
- package/dist/session-title-rename.test.js +0 -128
- package/dist/skill-filter.js +0 -43
- package/dist/skill-filter.test.js +0 -86
- package/dist/startup-service.js +0 -153
- package/dist/startup-time.e2e.test.js +0 -297
- package/dist/system-message.js +0 -984
- package/dist/system-message.test.js +0 -1093
- package/dist/task-id-plugin.js +0 -16
- package/dist/task-runner.js +0 -554
- package/dist/task-schedule.js +0 -298
- package/dist/task-schedule.test.js +0 -366
- package/dist/test-utils.js +0 -359
- package/dist/thinking-utils.js +0 -45
- package/dist/thinking-utils.test.js +0 -35
- package/dist/thread-message-queue.e2e.test.js +0 -1155
- package/dist/tools.js +0 -357
- package/dist/undo-redo.e2e.test.js +0 -171
- package/dist/unnest-code-blocks.js +0 -146
- package/dist/unnest-code-blocks.test.js +0 -673
- package/dist/upgrade.js +0 -114
- package/dist/utils.js +0 -148
- package/dist/voice-attachment.js +0 -56
- package/dist/voice-handler.js +0 -726
- package/dist/voice-message.e2e.test.js +0 -1263
- package/dist/voice-routing-input.e2e.test.js +0 -195
- package/dist/voice-routing-question.e2e.test.js +0 -125
- package/dist/voice.test.js +0 -352
- package/dist/wait-session.js +0 -193
- package/dist/websockify.js +0 -69
- package/dist/worker-types.js +0 -4
- package/dist/worktree-clone-isolation.e2e.test.js +0 -188
- package/dist/worktree-lifecycle.e2e.test.js +0 -735
- package/dist/worktree-utils.js +0 -3
- package/dist/xai-auth-plugin.js +0 -238
- package/dist/xai-auth-state.js +0 -234
- package/dist/xai-auth-state.test.js +0 -183
- package/dist/xml.js +0 -92
- package/dist/xml.test.js +0 -32
- package/skills/bump-holocron-consumers/SKILL.md +0 -137
- package/skills/critique/SKILL.md +0 -112
- package/skills/egaki/SKILL.md +0 -86
- package/skills/errore/SKILL.md +0 -501
- package/skills/goke/SKILL.md +0 -695
- package/skills/holocron/SKILL.md +0 -942
- package/skills/lintcn/SKILL.md +0 -873
- package/skills/new-skill/SKILL.md +0 -339
- package/skills/npm-package/SKILL.md +0 -692
- package/skills/opensrc/SKILL.md +0 -95
- package/skills/playwriter/SKILL.md +0 -35
- package/skills/profano/SKILL.md +0 -33
- package/skills/readme.md +0 -20
- package/skills/sigillo/SKILL.md +0 -370
- package/skills/spiceflow/SKILL.md +0 -80
- package/skills/strada/SKILL.md +0 -104
- package/skills/termcast/SKILL.md +0 -133
- package/skills/tuistory/SKILL.md +0 -237
- package/skills/usecomputer/SKILL.md +0 -264
- package/skills/zele/SKILL.md +0 -81
- package/src/agent-model.e2e.test.ts +0 -1548
- package/src/ai-tool-to-genai.test.ts +0 -296
- package/src/ai-tool-to-genai.ts +0 -283
- package/src/ai-tool.ts +0 -39
- package/src/anthropic-account-identity.test.ts +0 -52
- package/src/anthropic-account-identity.ts +0 -96
- package/src/anthropic-auth-plugin.test.ts +0 -135
- package/src/anthropic-auth-plugin.ts +0 -1180
- package/src/anthropic-auth-state.test.ts +0 -259
- package/src/anthropic-auth-state.ts +0 -272
- package/src/bash-tool-schema-plugin.test.ts +0 -84
- package/src/bash-tool-schema-plugin.ts +0 -77
- package/src/bin.ts +0 -173
- package/src/bot-lifecycle.test.ts +0 -252
- package/src/btw-prefix-detection.test.ts +0 -104
- package/src/btw-prefix-detection.ts +0 -19
- package/src/cache-drift-plugin.ts +0 -249
- package/src/cache-rewrite.test.ts +0 -49
- package/src/cache-rewrite.ts +0 -96
- package/src/channel-management.ts +0 -494
- package/src/cli-commands/bot.ts +0 -374
- package/src/cli-commands/maintenance.ts +0 -237
- package/src/cli-commands/misc.ts +0 -208
- package/src/cli-commands/project.ts +0 -680
- package/src/cli-commands/send.ts +0 -879
- package/src/cli-commands/session.ts +0 -1181
- package/src/cli-commands/task.ts +0 -358
- package/src/cli-commands/thread.ts +0 -86
- package/src/cli-commands/user.ts +0 -195
- package/src/cli-parsing.test.ts +0 -305
- package/src/cli-runner.test.ts +0 -129
- package/src/cli-runner.ts +0 -2141
- package/src/cli-send-thread.e2e.test.ts +0 -609
- package/src/cloudflare-transcription.ts +0 -76
- package/src/commands/abort.ts +0 -113
- package/src/commands/action-buttons.ts +0 -371
- package/src/commands/add-project.ts +0 -146
- package/src/commands/agent.ts +0 -911
- package/src/commands/ask-question.test.ts +0 -177
- package/src/commands/ask-question.ts +0 -532
- package/src/commands/btw.ts +0 -246
- package/src/commands/compact.ts +0 -154
- package/src/commands/context-usage.ts +0 -208
- package/src/commands/create-new-project.ts +0 -203
- package/src/commands/diff.ts +0 -91
- package/src/commands/file-upload.ts +0 -398
- package/src/commands/fork-subagent.ts +0 -262
- package/src/commands/fork.ts +0 -388
- package/src/commands/gemini-apikey.ts +0 -205
- package/src/commands/last-sessions.ts +0 -176
- package/src/commands/login.ts +0 -1182
- package/src/commands/mcp.ts +0 -307
- package/src/commands/memory-snapshot.ts +0 -30
- package/src/commands/mention-mode.ts +0 -66
- package/src/commands/merge-worktree.ts +0 -282
- package/src/commands/model-variant.ts +0 -522
- package/src/commands/model.ts +0 -1310
- package/src/commands/multioauth.ts +0 -508
- package/src/commands/new-worktree.ts +0 -832
- package/src/commands/paginated-select.ts +0 -81
- package/src/commands/permissions.ts +0 -458
- package/src/commands/queue.test.ts +0 -19
- package/src/commands/queue.ts +0 -455
- package/src/commands/remove-project.ts +0 -152
- package/src/commands/restart-opencode-server.ts +0 -173
- package/src/commands/resume.ts +0 -229
- package/src/commands/run-command.ts +0 -123
- package/src/commands/screenshare.test.ts +0 -30
- package/src/commands/screenshare.ts +0 -388
- package/src/commands/session-id.ts +0 -109
- package/src/commands/session.ts +0 -311
- package/src/commands/share.ts +0 -106
- package/src/commands/tasks.ts +0 -399
- package/src/commands/types.ts +0 -25
- package/src/commands/undo-redo.ts +0 -394
- package/src/commands/unset-model.ts +0 -152
- package/src/commands/upgrade.ts +0 -51
- package/src/commands/user-command.ts +0 -260
- package/src/commands/verbosity.ts +0 -172
- package/src/commands/vscode.ts +0 -378
- package/src/commands/worktrees.ts +0 -762
- package/src/condense-memory.ts +0 -36
- package/src/config.ts +0 -147
- package/src/context-awareness-plugin.test.ts +0 -144
- package/src/context-awareness-plugin.ts +0 -508
- package/src/cpu-profiler.test.ts +0 -183
- package/src/cpu-profiler.ts +0 -293
- package/src/critique-utils.ts +0 -139
- package/src/database.ts +0 -1484
- package/src/debounce-timeout.ts +0 -43
- package/src/debounced-process-flush.ts +0 -104
- package/src/default-channel-provisioning.test.ts +0 -156
- package/src/discord-bot.ts +0 -1836
- package/src/discord-command-registration.test.ts +0 -20
- package/src/discord-command-registration.ts +0 -704
- package/src/discord-urls.ts +0 -88
- package/src/discord-utils.test.ts +0 -470
- package/src/discord-utils.ts +0 -1079
- package/src/escape-backticks.test.ts +0 -469
- package/src/event-stream-real-capture.e2e.test.ts +0 -692
- package/src/eventsource-parser.test.ts +0 -351
- package/src/exec-async.ts +0 -44
- package/src/external-directory-permissions.e2e.test.ts +0 -103
- package/src/external-directory-project-deny.e2e.test.ts +0 -84
- package/src/external-opencode-sync.test.ts +0 -248
- package/src/external-opencode-sync.ts +0 -867
- package/src/extract-sdk-error-message.test.ts +0 -18
- package/src/format-tables.test.ts +0 -988
- package/src/format-tables.ts +0 -1031
- package/src/forum-sync/config.ts +0 -92
- package/src/forum-sync/discord-operations.ts +0 -245
- package/src/forum-sync/index.ts +0 -9
- package/src/forum-sync/markdown.ts +0 -172
- package/src/forum-sync/sync-to-discord.ts +0 -595
- package/src/forum-sync/sync-to-files.ts +0 -294
- package/src/forum-sync/types.ts +0 -175
- package/src/forum-sync/watchers.ts +0 -474
- package/src/gateway-proxy-reconnect.e2e.test.ts +0 -553
- package/src/gateway-proxy.e2e.test.ts +0 -648
- package/src/genai-worker-wrapper.ts +0 -164
- package/src/genai-worker.ts +0 -385
- package/src/genai.ts +0 -318
- package/src/git-worktree-core.ts +0 -616
- package/src/guild-categories.test.ts +0 -260
- package/src/heap-monitor.ts +0 -152
- package/src/hrana-server.test.ts +0 -130
- package/src/hrana-server.ts +0 -399
- package/src/html-actions.test.ts +0 -87
- package/src/html-actions.ts +0 -174
- package/src/html-components.test.ts +0 -38
- package/src/html-components.ts +0 -177
- package/src/image-optimizer-plugin.ts +0 -194
- package/src/image-utils.ts +0 -150
- package/src/interaction-handler.ts +0 -775
- package/src/ipc-polling.ts +0 -325
- package/src/ipc-tools-plugin.ts +0 -306
- package/src/kimaki-digital-twin.e2e.test.ts +0 -199
- package/src/kimaki-opencode-plugin-loading.e2e.test.ts +0 -208
- package/src/kimaki-opencode-plugin.test.ts +0 -142
- package/src/kimaki-opencode-plugin.ts +0 -34
- package/src/kimaki-workspace-adaptor.ts +0 -144
- package/src/limit-heading-depth.test.ts +0 -116
- package/src/limit-heading-depth.ts +0 -26
- package/src/list-channel-threads.test.ts +0 -90
- package/src/list-channel-threads.ts +0 -252
- package/src/markdown.test.ts +0 -498
- package/src/markdown.ts +0 -577
- package/src/memory-overview-plugin.ts +0 -159
- package/src/message-formatting.test.ts +0 -1401
- package/src/message-formatting.ts +0 -972
- package/src/message-preprocessing.ts +0 -579
- package/src/oauth-rotation-shared.ts +0 -332
- package/src/onboarding-tutorial.ts +0 -167
- package/src/onboarding-welcome.ts +0 -49
- package/src/openai-auth-plugin.ts +0 -158
- package/src/openai-auth-state.ts +0 -297
- package/src/openai-realtime.ts +0 -358
- package/src/opencode-command-detection.test.ts +0 -307
- package/src/opencode-command-detection.ts +0 -76
- package/src/opencode-command.test.ts +0 -290
- package/src/opencode-command.ts +0 -251
- package/src/opencode-interrupt-plugin.test.ts +0 -419
- package/src/opencode-interrupt-plugin.ts +0 -306
- package/src/opencode.ts +0 -1590
- package/src/parse-permission-rules.test.ts +0 -127
- package/src/patch-text-parser.ts +0 -107
- package/src/plugin-logger.ts +0 -139
- package/src/plugin-opencode-client.ts +0 -71
- package/src/privacy-sanitizer.ts +0 -142
- package/src/project-add.test.ts +0 -80
- package/src/question-abort-clears-dropdown.e2e.test.ts +0 -109
- package/src/question-abort-resume.e2e.test.ts +0 -121
- package/src/question-abort-retry-text-before-dropdown.e2e.test.ts +0 -172
- package/src/question-text-before-dropdown.e2e.test.ts +0 -67
- package/src/queue-advanced-abort.e2e.test.ts +0 -449
- package/src/queue-advanced-action-buttons.e2e.test.ts +0 -271
- package/src/queue-advanced-e2e-setup.ts +0 -1164
- package/src/queue-advanced-footer.e2e.test.ts +0 -357
- package/src/queue-advanced-model-switch.e2e.test.ts +0 -382
- package/src/queue-advanced-permissions-typing.e2e.test.ts +0 -256
- package/src/queue-advanced-question.e2e.test.ts +0 -322
- package/src/queue-advanced-typing-interrupt.e2e.test.ts +0 -147
- package/src/queue-advanced-typing.e2e.test.ts +0 -199
- package/src/queue-delete-message.e2e.test.ts +0 -102
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +0 -152
- package/src/queue-interrupt-drain.e2e.test.ts +0 -288
- package/src/queue-question-select-drain.e2e.test.ts +0 -206
- package/src/runtime-idle-sweeper.ts +0 -76
- package/src/runtime-lifecycle.e2e.test.ts +0 -714
- package/src/schema.sql +0 -251
- package/src/sentry.ts +0 -26
- package/src/session-handler/agent-utils.ts +0 -99
- package/src/session-handler/event-stream-fixtures/real-session-action-buttons.jsonl +0 -45
- package/src/session-handler/event-stream-fixtures/real-session-footer-suppressed-on-pre-idle-interrupt.jsonl +0 -40
- package/src/session-handler/event-stream-fixtures/real-session-permission-external-file.jsonl +0 -23
- package/src/session-handler/event-stream-fixtures/real-session-task-normal.jsonl +0 -22
- package/src/session-handler/event-stream-fixtures/real-session-task-three-parallel-sleeps.jsonl +0 -277
- package/src/session-handler/event-stream-fixtures/real-session-task-user-interruption.jsonl +0 -46
- package/src/session-handler/event-stream-fixtures/session-abort-after-idle-race.jsonl +0 -21
- package/src/session-handler/event-stream-fixtures/session-concurrent-messages-serialized.jsonl +0 -56
- package/src/session-handler/event-stream-fixtures/session-explicit-abort.jsonl +0 -44
- package/src/session-handler/event-stream-fixtures/session-normal-completion.jsonl +0 -29
- package/src/session-handler/event-stream-fixtures/session-tool-call-noisy-stream.jsonl +0 -29
- package/src/session-handler/event-stream-fixtures/session-two-completions-same-session.jsonl +0 -50
- package/src/session-handler/event-stream-fixtures/session-user-interruption.jsonl +0 -59
- package/src/session-handler/event-stream-fixtures/session-voice-queued-followup.jsonl +0 -52
- package/src/session-handler/event-stream-state.test.ts +0 -3304
- package/src/session-handler/event-stream-state.ts +0 -1773
- package/src/session-handler/global-event-listener.ts +0 -258
- package/src/session-handler/model-utils.test.ts +0 -537
- package/src/session-handler/model-utils.ts +0 -489
- package/src/session-handler/opencode-session-event-log.ts +0 -159
- package/src/session-handler/thread-ingress.test.ts +0 -54
- package/src/session-handler/thread-runtime-state.ts +0 -351
- package/src/session-handler/thread-session-runtime-summary.test.ts +0 -169
- package/src/session-handler/thread-session-runtime.ts +0 -5608
- package/src/session-handler.ts +0 -15
- package/src/session-search.test.ts +0 -331
- package/src/session-search.ts +0 -382
- package/src/session-sleep.test.ts +0 -294
- package/src/session-title-rename.test.ts +0 -186
- package/src/skill-filter.test.ts +0 -110
- package/src/skill-filter.ts +0 -63
- package/src/startup-service.ts +0 -200
- package/src/startup-time.e2e.test.ts +0 -377
- package/src/system-message.test.ts +0 -1176
- package/src/system-message.ts +0 -1179
- package/src/task-id-plugin.ts +0 -17
- package/src/task-runner.ts +0 -768
- package/src/task-schedule.test.ts +0 -424
- package/src/task-schedule.ts +0 -470
- package/src/test-utils.ts +0 -506
- package/src/thinking-utils.test.ts +0 -46
- package/src/thinking-utils.ts +0 -82
- package/src/thread-message-queue.e2e.test.ts +0 -1395
- package/src/tools.ts +0 -430
- package/src/undici.d.ts +0 -12
- package/src/undo-redo.e2e.test.ts +0 -219
- package/src/unnest-code-blocks.test.ts +0 -713
- package/src/unnest-code-blocks.ts +0 -185
- package/src/upgrade.ts +0 -127
- package/src/utils.ts +0 -216
- package/src/voice-attachment.ts +0 -79
- package/src/voice-handler.ts +0 -999
- package/src/voice-message.e2e.test.ts +0 -1524
- package/src/voice-routing-input.e2e.test.ts +0 -203
- package/src/voice-routing-question.e2e.test.ts +0 -131
- package/src/voice.test.ts +0 -415
- package/src/wait-session.ts +0 -291
- package/src/websockify.ts +0 -101
- package/src/worker-types.ts +0 -64
- package/src/worktree-clone-isolation.e2e.test.ts +0 -213
- package/src/worktree-lifecycle.e2e.test.ts +0 -900
- package/src/worktree-utils.ts +0 -4
- package/src/xai-auth-plugin.ts +0 -303
- package/src/xai-auth-state.test.ts +0 -224
- package/src/xai-auth-state.ts +0 -294
- package/src/xml.test.ts +0 -38
- package/src/xml.ts +0 -121
|
@@ -1,735 +0,0 @@
|
|
|
1
|
-
// E2e test for worktree lifecycle: /new-worktree inside an existing thread
|
|
2
|
-
// creates a separate worktree thread that reuses session context. Each thread
|
|
3
|
-
// stays bound to one directory for its whole lifetime.
|
|
4
|
-
//
|
|
5
|
-
// Uses opencode-deterministic-provider (no real LLM calls).
|
|
6
|
-
// Poll timeouts: 4s max, 100ms interval (except worktree creation which
|
|
7
|
-
// involves real git operations — 10s timeout there).
|
|
8
|
-
import fs from 'node:fs';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
import url from 'node:url';
|
|
11
|
-
import { describe, beforeAll, afterAll, test, expect } from 'vitest';
|
|
12
|
-
import { ChannelType, Client, GatewayIntentBits, Partials, Routes } from 'discord.js';
|
|
13
|
-
import YAML from 'yaml';
|
|
14
|
-
import { DigitalDiscord } from 'discord-digital-twin/src';
|
|
15
|
-
import { buildDeterministicOpencodeConfig, } from 'opencode-deterministic-provider';
|
|
16
|
-
import { setDataDir } from './config.js';
|
|
17
|
-
import { store } from './store.js';
|
|
18
|
-
import { startDiscordBot } from './discord-bot.js';
|
|
19
|
-
import { getRuntime } from './session-handler/thread-session-runtime.js';
|
|
20
|
-
import { setBotToken, initDatabase, closeDatabase, setChannelDirectory, setChannelVerbosity, setChannelWorktreesEnabled, getThreadSession, getThreadWorktreeOrWorkspace, getSessionModel, setSessionModel, } from './database.js';
|
|
21
|
-
import { startHranaServer, stopHranaServer } from './hrana-server.js';
|
|
22
|
-
import { initializeOpencodeForDirectory, stopOpencodeServer, } from './opencode.js';
|
|
23
|
-
import { chooseLockPort, cleanupTestSessions, waitForBotMessageContaining, } from './test-utils.js';
|
|
24
|
-
import { execAsync } from './worktrees.js';
|
|
25
|
-
const TEST_USER_ID = '200000000000000901';
|
|
26
|
-
const TEXT_CHANNEL_ID = '200000000000000902';
|
|
27
|
-
const NON_GIT_CHANNEL_ID = '200000000000000903';
|
|
28
|
-
const AUTO_WORKTREE_CHANNEL_ID = '200000000000000904';
|
|
29
|
-
// Unique worktree name per run to avoid collisions with leftover worktrees
|
|
30
|
-
const WORKTREE_SUFFIX = Date.now().toString(36).slice(-6);
|
|
31
|
-
const WORKTREE_NAME = `wt-e2e-${WORKTREE_SUFFIX}`;
|
|
32
|
-
const CHANNEL_WORKTREE_NAME = `wt-chan-${WORKTREE_SUFFIX}`;
|
|
33
|
-
const AUTO_WORKTREE_SUFFIX = `wt-auto-${WORKTREE_SUFFIX}`;
|
|
34
|
-
const SOURCE_MODEL = 'source-model-v2';
|
|
35
|
-
function normalizeWorktreeLifecycleText(text) {
|
|
36
|
-
return text
|
|
37
|
-
.replaceAll(CHANNEL_WORKTREE_NAME, 'CHANNEL_WORKTREE_NAME')
|
|
38
|
-
.replaceAll(AUTO_WORKTREE_SUFFIX, 'AUTO_WORKTREE_NAME')
|
|
39
|
-
.replaceAll(WORKTREE_NAME, 'WORKTREE_NAME')
|
|
40
|
-
.replace(/opencode\/kimaki-rply-wth-exctly-snd-at-wt-[a-z0-9]+/g, 'AUTO_WORKTREE_BRANCH')
|
|
41
|
-
.replaceAll(WORKTREE_SUFFIX, 'SUFFIX')
|
|
42
|
-
.replace(/ses_[a-zA-Z0-9]+/g, 'ses_TEST')
|
|
43
|
-
.replace(/<#\d+>/g, '<#THREAD_ID>')
|
|
44
|
-
.replace(/`[^`\n]*\/worktrees\/[^`\n]*`/g, '`/tmp/worktrees/WORKTREE_NAME`');
|
|
45
|
-
}
|
|
46
|
-
function createRunDirectories() {
|
|
47
|
-
const root = path.resolve(process.cwd(), 'tmp', 'worktree-lifecycle-e2e');
|
|
48
|
-
fs.mkdirSync(root, { recursive: true });
|
|
49
|
-
const dataDir = fs.mkdtempSync(path.join(root, 'data-'));
|
|
50
|
-
const projectDirectory = path.join(root, 'project');
|
|
51
|
-
const nonGitDirectory = path.join(root, 'non-git-project');
|
|
52
|
-
fs.mkdirSync(projectDirectory, { recursive: true });
|
|
53
|
-
fs.mkdirSync(nonGitDirectory, { recursive: true });
|
|
54
|
-
return { root, dataDir, projectDirectory, nonGitDirectory };
|
|
55
|
-
}
|
|
56
|
-
function createDiscordJsClient({ restUrl }) {
|
|
57
|
-
return new Client({
|
|
58
|
-
intents: [
|
|
59
|
-
GatewayIntentBits.Guilds,
|
|
60
|
-
GatewayIntentBits.GuildMessages,
|
|
61
|
-
GatewayIntentBits.MessageContent,
|
|
62
|
-
GatewayIntentBits.GuildVoiceStates,
|
|
63
|
-
],
|
|
64
|
-
partials: [
|
|
65
|
-
Partials.Channel,
|
|
66
|
-
Partials.Message,
|
|
67
|
-
Partials.User,
|
|
68
|
-
Partials.ThreadMember,
|
|
69
|
-
],
|
|
70
|
-
rest: {
|
|
71
|
-
api: restUrl,
|
|
72
|
-
version: '10',
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
/** Initialize a git repo with an initial commit so worktrees can be created. */
|
|
77
|
-
async function initGitRepo(directory) {
|
|
78
|
-
// Check if already a git repo (directory may persist across runs)
|
|
79
|
-
const isRepo = fs.existsSync(path.join(directory, '.git'));
|
|
80
|
-
if (isRepo) {
|
|
81
|
-
// Commit any new/changed files (opencode.json may have been rewritten)
|
|
82
|
-
await execAsync('git add -A && git diff --cached --quiet || git commit -m "update"', {
|
|
83
|
-
cwd: directory,
|
|
84
|
-
}).catch(() => { return; });
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
await execAsync('git init -b main', { cwd: directory });
|
|
88
|
-
await execAsync('git config user.email "test@test.com"', { cwd: directory });
|
|
89
|
-
await execAsync('git config user.name "Test"', { cwd: directory });
|
|
90
|
-
await execAsync('git add -A && git commit -m "initial"', { cwd: directory });
|
|
91
|
-
}
|
|
92
|
-
function createDeterministicMatchers() {
|
|
93
|
-
const userReplyMatcher = {
|
|
94
|
-
id: 'user-reply',
|
|
95
|
-
priority: 10,
|
|
96
|
-
when: {
|
|
97
|
-
lastMessageRole: 'user',
|
|
98
|
-
latestUserTextIncludes: 'Reply with exactly:',
|
|
99
|
-
},
|
|
100
|
-
then: {
|
|
101
|
-
parts: [
|
|
102
|
-
{ type: 'stream-start', warnings: [] },
|
|
103
|
-
{ type: 'text-start', id: 'default-reply' },
|
|
104
|
-
{ type: 'text-delta', id: 'default-reply', delta: 'ok' },
|
|
105
|
-
{ type: 'text-end', id: 'default-reply' },
|
|
106
|
-
{
|
|
107
|
-
type: 'finish',
|
|
108
|
-
finishReason: 'stop',
|
|
109
|
-
usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 },
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
partDelaysMs: [0, 100, 0, 0, 0],
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
return [userReplyMatcher];
|
|
116
|
-
}
|
|
117
|
-
describe('worktree lifecycle', () => {
|
|
118
|
-
let directories;
|
|
119
|
-
let discord;
|
|
120
|
-
let botClient;
|
|
121
|
-
let previousDefaultVerbosity = null;
|
|
122
|
-
let testStartTime = Date.now();
|
|
123
|
-
beforeAll(async () => {
|
|
124
|
-
testStartTime = Date.now();
|
|
125
|
-
directories = createRunDirectories();
|
|
126
|
-
const lockPort = chooseLockPort({ key: TEXT_CHANNEL_ID });
|
|
127
|
-
process.env['KIMAKI_LOCK_PORT'] = String(lockPort);
|
|
128
|
-
setDataDir(directories.dataDir);
|
|
129
|
-
previousDefaultVerbosity = store.getState().defaultVerbosity;
|
|
130
|
-
store.setState({ defaultVerbosity: 'tools_and_text' });
|
|
131
|
-
const digitalDiscordDbPath = path.join(directories.dataDir, 'digital-discord.db');
|
|
132
|
-
discord = new DigitalDiscord({
|
|
133
|
-
guild: {
|
|
134
|
-
name: 'Worktree E2E Guild',
|
|
135
|
-
ownerId: TEST_USER_ID,
|
|
136
|
-
},
|
|
137
|
-
channels: [
|
|
138
|
-
{
|
|
139
|
-
id: TEXT_CHANNEL_ID,
|
|
140
|
-
name: 'worktree-e2e',
|
|
141
|
-
type: ChannelType.GuildText,
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
id: NON_GIT_CHANNEL_ID,
|
|
145
|
-
name: 'non-git-worktree-e2e',
|
|
146
|
-
type: ChannelType.GuildText,
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
id: AUTO_WORKTREE_CHANNEL_ID,
|
|
150
|
-
name: 'auto-worktree-e2e',
|
|
151
|
-
type: ChannelType.GuildText,
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
users: [
|
|
155
|
-
{
|
|
156
|
-
id: TEST_USER_ID,
|
|
157
|
-
username: 'worktree-tester',
|
|
158
|
-
},
|
|
159
|
-
],
|
|
160
|
-
dbUrl: `file:${digitalDiscordDbPath}`,
|
|
161
|
-
});
|
|
162
|
-
await discord.start();
|
|
163
|
-
const providerNpm = url
|
|
164
|
-
.pathToFileURL(path.resolve(process.cwd(), '..', 'opencode-deterministic-provider', 'src', 'index.ts'))
|
|
165
|
-
.toString();
|
|
166
|
-
const opencodeConfig = buildDeterministicOpencodeConfig({
|
|
167
|
-
providerName: 'deterministic-provider',
|
|
168
|
-
providerNpm,
|
|
169
|
-
model: 'deterministic-v2',
|
|
170
|
-
smallModel: 'deterministic-v2',
|
|
171
|
-
settings: {
|
|
172
|
-
strict: false,
|
|
173
|
-
matchers: createDeterministicMatchers(),
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
const providerConfig = opencodeConfig.provider['deterministic-provider'];
|
|
177
|
-
if (!providerConfig)
|
|
178
|
-
throw new Error('Missing deterministic provider config');
|
|
179
|
-
providerConfig.models[SOURCE_MODEL] = { name: SOURCE_MODEL };
|
|
180
|
-
fs.writeFileSync(path.join(directories.projectDirectory, 'opencode.json'), JSON.stringify(opencodeConfig, null, 2));
|
|
181
|
-
fs.writeFileSync(path.join(directories.nonGitDirectory, 'opencode.json'), JSON.stringify(opencodeConfig, null, 2));
|
|
182
|
-
// Initialize git repo after writing opencode.json so the initial commit
|
|
183
|
-
// includes it. Worktrees require at least one commit.
|
|
184
|
-
await initGitRepo(directories.projectDirectory);
|
|
185
|
-
const dbPath = path.join(directories.dataDir, 'discord-sessions.db');
|
|
186
|
-
const hranaResult = await startHranaServer({ dbPath });
|
|
187
|
-
if (hranaResult instanceof Error) {
|
|
188
|
-
throw hranaResult;
|
|
189
|
-
}
|
|
190
|
-
process.env['KIMAKI_DB_URL'] = hranaResult;
|
|
191
|
-
await initDatabase();
|
|
192
|
-
await setBotToken(discord.botUserId, discord.botToken);
|
|
193
|
-
await setChannelDirectory({
|
|
194
|
-
channelId: TEXT_CHANNEL_ID,
|
|
195
|
-
directory: directories.projectDirectory,
|
|
196
|
-
channelType: 'text',
|
|
197
|
-
});
|
|
198
|
-
await setChannelDirectory({
|
|
199
|
-
channelId: NON_GIT_CHANNEL_ID,
|
|
200
|
-
directory: directories.nonGitDirectory,
|
|
201
|
-
channelType: 'text',
|
|
202
|
-
});
|
|
203
|
-
await setChannelDirectory({
|
|
204
|
-
channelId: AUTO_WORKTREE_CHANNEL_ID,
|
|
205
|
-
directory: directories.projectDirectory,
|
|
206
|
-
channelType: 'text',
|
|
207
|
-
});
|
|
208
|
-
await setChannelVerbosity(TEXT_CHANNEL_ID, 'tools_and_text');
|
|
209
|
-
await setChannelVerbosity(NON_GIT_CHANNEL_ID, 'tools_and_text');
|
|
210
|
-
await setChannelVerbosity(AUTO_WORKTREE_CHANNEL_ID, 'tools_and_text');
|
|
211
|
-
await setChannelWorktreesEnabled(NON_GIT_CHANNEL_ID, true);
|
|
212
|
-
await setChannelWorktreesEnabled(AUTO_WORKTREE_CHANNEL_ID, true);
|
|
213
|
-
botClient = createDiscordJsClient({ restUrl: discord.restUrl });
|
|
214
|
-
await startDiscordBot({
|
|
215
|
-
token: discord.botToken,
|
|
216
|
-
appId: discord.botUserId,
|
|
217
|
-
discordClient: botClient,
|
|
218
|
-
});
|
|
219
|
-
// Pre-warm the opencode server
|
|
220
|
-
const warmup = await initializeOpencodeForDirectory(directories.projectDirectory);
|
|
221
|
-
if (warmup instanceof Error) {
|
|
222
|
-
throw warmup;
|
|
223
|
-
}
|
|
224
|
-
}, 20_000);
|
|
225
|
-
afterAll(async () => {
|
|
226
|
-
if (directories) {
|
|
227
|
-
await cleanupTestSessions({
|
|
228
|
-
projectDirectory: directories.projectDirectory,
|
|
229
|
-
testStartTime,
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
if (botClient) {
|
|
233
|
-
void botClient.destroy();
|
|
234
|
-
}
|
|
235
|
-
await stopOpencodeServer();
|
|
236
|
-
await Promise.all([
|
|
237
|
-
closeDatabase().catch(() => { return; }),
|
|
238
|
-
stopHranaServer().catch(() => { return; }),
|
|
239
|
-
discord?.stop().catch(() => { return; }),
|
|
240
|
-
]);
|
|
241
|
-
delete process.env['KIMAKI_LOCK_PORT'];
|
|
242
|
-
delete process.env['KIMAKI_DB_URL'];
|
|
243
|
-
if (previousDefaultVerbosity) {
|
|
244
|
-
store.setState({ defaultVerbosity: previousDefaultVerbosity });
|
|
245
|
-
}
|
|
246
|
-
// Clean up the git worktrees created during the tests
|
|
247
|
-
if (directories) {
|
|
248
|
-
const branchesToClean = [
|
|
249
|
-
`opencode/kimaki-${WORKTREE_NAME}`,
|
|
250
|
-
`opencode/kimaki-${CHANNEL_WORKTREE_NAME}`,
|
|
251
|
-
];
|
|
252
|
-
await execAsync(`git worktree list --porcelain`, { cwd: directories.projectDirectory }).then(async ({ stdout }) => {
|
|
253
|
-
const lines = stdout.split('\n');
|
|
254
|
-
let currentPath = '';
|
|
255
|
-
for (const line of lines) {
|
|
256
|
-
if (line.startsWith('worktree ')) {
|
|
257
|
-
currentPath = line.slice('worktree '.length);
|
|
258
|
-
}
|
|
259
|
-
if (line.startsWith('branch ') && currentPath) {
|
|
260
|
-
for (const branch of branchesToClean) {
|
|
261
|
-
if (line.includes(branch)) {
|
|
262
|
-
await execAsync(`git worktree remove --force ${JSON.stringify(currentPath)}`, { cwd: directories.projectDirectory }).catch(() => { return; });
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}).catch(() => { return; });
|
|
268
|
-
// Also clean up auto-worktree branches (pattern: opencode/kimaki-<suffix>)
|
|
269
|
-
await execAsync('git worktree prune', { cwd: directories.projectDirectory }).catch(() => { return; });
|
|
270
|
-
for (const branch of branchesToClean) {
|
|
271
|
-
await execAsync(`git branch -D ${JSON.stringify(branch)}`, { cwd: directories.projectDirectory }).catch(() => { return; });
|
|
272
|
-
}
|
|
273
|
-
// Clean auto-worktree branches (auto-derived names contain the suffix)
|
|
274
|
-
await execAsync(`git branch --list 'opencode/kimaki-*${WORKTREE_SUFFIX}*'`, { cwd: directories.projectDirectory }).then(async ({ stdout }) => {
|
|
275
|
-
for (const branch of stdout.trim().split('\n').filter(Boolean)) {
|
|
276
|
-
await execAsync(`git branch -D ${JSON.stringify(branch.trim())}`, { cwd: directories.projectDirectory }).catch(() => { return; });
|
|
277
|
-
}
|
|
278
|
-
}).catch(() => { return; });
|
|
279
|
-
fs.rmSync(directories.dataDir, {
|
|
280
|
-
recursive: true,
|
|
281
|
-
force: true,
|
|
282
|
-
maxRetries: 3,
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
}, 5_000);
|
|
286
|
-
test('/new-worktree in a session thread forks into a new worktree thread', async () => {
|
|
287
|
-
// 1. Send a message to create a thread and establish a session
|
|
288
|
-
await discord.channel(TEXT_CHANNEL_ID).user(TEST_USER_ID).sendMessage({
|
|
289
|
-
content: 'Reply with exactly: before-worktree',
|
|
290
|
-
});
|
|
291
|
-
const thread = await discord.channel(TEXT_CHANNEL_ID).waitForThread({
|
|
292
|
-
timeout: 4_000,
|
|
293
|
-
predicate: (t) => {
|
|
294
|
-
return t.name === 'Reply with exactly: before-worktree';
|
|
295
|
-
},
|
|
296
|
-
});
|
|
297
|
-
const th = discord.thread(thread.id);
|
|
298
|
-
// Wait for the first run to produce visible assistant output before
|
|
299
|
-
// running /new-worktree in the same thread.
|
|
300
|
-
await waitForBotMessageContaining({
|
|
301
|
-
discord,
|
|
302
|
-
threadId: thread.id,
|
|
303
|
-
userId: TEST_USER_ID,
|
|
304
|
-
text: 'ok',
|
|
305
|
-
afterUserMessageIncludes: 'before-worktree',
|
|
306
|
-
timeout: 10_000,
|
|
307
|
-
});
|
|
308
|
-
// Capture source runtime — it should stay bound to the base checkout.
|
|
309
|
-
const runtimeBefore = getRuntime(thread.id);
|
|
310
|
-
expect(runtimeBefore).toBeDefined();
|
|
311
|
-
expect(runtimeBefore.sdkDirectory).toBe(directories.projectDirectory);
|
|
312
|
-
const sessionBefore = await getThreadSession(thread.id);
|
|
313
|
-
expect(sessionBefore).toBeTruthy();
|
|
314
|
-
if (!sessionBefore)
|
|
315
|
-
throw new Error('Source session was not persisted');
|
|
316
|
-
await setSessionModel({
|
|
317
|
-
sessionId: sessionBefore,
|
|
318
|
-
modelId: `deterministic-provider/${SOURCE_MODEL}`,
|
|
319
|
-
});
|
|
320
|
-
// 2. Run /new-worktree inside the source thread.
|
|
321
|
-
// This should create a new worktree thread instead of switching this one.
|
|
322
|
-
const { id: interactionId } = await th
|
|
323
|
-
.user(TEST_USER_ID)
|
|
324
|
-
.runSlashCommand({
|
|
325
|
-
name: 'new-worktree',
|
|
326
|
-
options: [{ name: 'name', type: 3, value: WORKTREE_NAME }],
|
|
327
|
-
});
|
|
328
|
-
// Wait for the slash command ack
|
|
329
|
-
await discord
|
|
330
|
-
.channel(thread.id)
|
|
331
|
-
.waitForInteractionAck({ interactionId, timeout: 4_000 });
|
|
332
|
-
const worktreeThread = await discord.channel(TEXT_CHANNEL_ID).waitForThread({
|
|
333
|
-
timeout: 4_000,
|
|
334
|
-
predicate: (t) => {
|
|
335
|
-
if (!t.name) {
|
|
336
|
-
return false;
|
|
337
|
-
}
|
|
338
|
-
return t.id !== thread.id
|
|
339
|
-
&& t.name.startsWith('⬦ worktree: opencode/kimaki-')
|
|
340
|
-
&& t.name.includes(WORKTREE_NAME);
|
|
341
|
-
},
|
|
342
|
-
});
|
|
343
|
-
const worktreeTh = discord.thread(worktreeThread.id);
|
|
344
|
-
// 3. Wait for worktree to become ready in the new thread — the
|
|
345
|
-
// background creation edits the starter message to include the branch.
|
|
346
|
-
// Git worktree creation involves real git operations, so allow more time.
|
|
347
|
-
await waitForBotMessageContaining({
|
|
348
|
-
discord,
|
|
349
|
-
threadId: worktreeThread.id,
|
|
350
|
-
userId: TEST_USER_ID,
|
|
351
|
-
text: 'Branch:',
|
|
352
|
-
timeout: 10_000,
|
|
353
|
-
});
|
|
354
|
-
// Messages sent as soon as the checkout is ready must wait for the
|
|
355
|
-
// source session fork and keep its model.
|
|
356
|
-
await worktreeTh.user(TEST_USER_ID).sendMessage({
|
|
357
|
-
content: 'Reply with exactly: after-worktree-thread',
|
|
358
|
-
});
|
|
359
|
-
await waitForBotMessageContaining({
|
|
360
|
-
discord,
|
|
361
|
-
threadId: worktreeThread.id,
|
|
362
|
-
userId: TEST_USER_ID,
|
|
363
|
-
text: 'Reusing context from',
|
|
364
|
-
timeout: 10_000,
|
|
365
|
-
});
|
|
366
|
-
const sourceSessionAfterFork = await getThreadSession(thread.id);
|
|
367
|
-
expect(sourceSessionAfterFork).toBe(sessionBefore);
|
|
368
|
-
const worktreeSession = await getThreadSession(worktreeThread.id);
|
|
369
|
-
expect(worktreeSession).toBeTruthy();
|
|
370
|
-
if (!worktreeSession)
|
|
371
|
-
throw new Error('Worktree session was not persisted');
|
|
372
|
-
expect(worktreeSession).not.toBe(sessionBefore);
|
|
373
|
-
await expect(getSessionModel(worktreeSession)).resolves.toMatchInlineSnapshot(`
|
|
374
|
-
{
|
|
375
|
-
"modelId": "deterministic-provider/source-model-v2",
|
|
376
|
-
"variant": null,
|
|
377
|
-
}
|
|
378
|
-
`);
|
|
379
|
-
await expect(getThreadWorktreeOrWorkspace(thread.id)).resolves.toBeUndefined();
|
|
380
|
-
const worktreeInfo = await getThreadWorktreeOrWorkspace(worktreeThread.id);
|
|
381
|
-
expect(worktreeInfo?.status).toBe('ready');
|
|
382
|
-
expect(worktreeInfo?.workspace_directory).toContain(WORKTREE_NAME);
|
|
383
|
-
const worktreeDirectory = worktreeInfo?.workspace_directory;
|
|
384
|
-
if (!worktreeDirectory)
|
|
385
|
-
throw new Error('Worktree directory was not persisted');
|
|
386
|
-
const getWorktreeClient = await initializeOpencodeForDirectory(worktreeDirectory);
|
|
387
|
-
if (getWorktreeClient instanceof Error)
|
|
388
|
-
throw getWorktreeClient;
|
|
389
|
-
const worktreeSessionResponse = await getWorktreeClient().session.get({
|
|
390
|
-
sessionID: worktreeSession,
|
|
391
|
-
directory: worktreeDirectory,
|
|
392
|
-
});
|
|
393
|
-
expect(worktreeSessionResponse.data?.directory).toBe(worktreeDirectory);
|
|
394
|
-
const runtimeAfter = getRuntime(thread.id);
|
|
395
|
-
expect(runtimeAfter).toBe(runtimeBefore);
|
|
396
|
-
expect(runtimeAfter.sdkDirectory).toBe(directories.projectDirectory);
|
|
397
|
-
const worktreeRuntime = getRuntime(worktreeThread.id);
|
|
398
|
-
expect(worktreeRuntime).toBeDefined();
|
|
399
|
-
expect(worktreeRuntime.sdkDirectory).toContain(WORKTREE_NAME);
|
|
400
|
-
expect(worktreeRuntime.sdkDirectory).toContain(`${path.sep}worktrees${path.sep}`);
|
|
401
|
-
// 4. Send messages to both threads. The source continues in the base
|
|
402
|
-
// checkout, and the new thread runs in the worktree checkout.
|
|
403
|
-
await th.user(TEST_USER_ID).sendMessage({
|
|
404
|
-
content: 'Reply with exactly: after-source-thread',
|
|
405
|
-
});
|
|
406
|
-
await waitForBotMessageContaining({
|
|
407
|
-
discord,
|
|
408
|
-
threadId: worktreeThread.id,
|
|
409
|
-
userId: TEST_USER_ID,
|
|
410
|
-
text: 'ok',
|
|
411
|
-
afterUserMessageIncludes: 'after-worktree-thread',
|
|
412
|
-
timeout: 4_000,
|
|
413
|
-
});
|
|
414
|
-
await waitForBotMessageContaining({
|
|
415
|
-
discord,
|
|
416
|
-
threadId: thread.id,
|
|
417
|
-
userId: TEST_USER_ID,
|
|
418
|
-
text: 'ok',
|
|
419
|
-
afterUserMessageIncludes: 'after-source-thread',
|
|
420
|
-
timeout: 4_000,
|
|
421
|
-
});
|
|
422
|
-
// Wait for footers to confirm full completion in both threads.
|
|
423
|
-
await waitForBotMessageContaining({
|
|
424
|
-
discord,
|
|
425
|
-
threadId: worktreeThread.id,
|
|
426
|
-
userId: TEST_USER_ID,
|
|
427
|
-
text: SOURCE_MODEL,
|
|
428
|
-
afterUserMessageIncludes: 'after-worktree-thread',
|
|
429
|
-
timeout: 4_000,
|
|
430
|
-
});
|
|
431
|
-
await waitForBotMessageContaining({
|
|
432
|
-
discord,
|
|
433
|
-
threadId: thread.id,
|
|
434
|
-
userId: TEST_USER_ID,
|
|
435
|
-
text: SOURCE_MODEL,
|
|
436
|
-
afterUserMessageIncludes: 'after-source-thread',
|
|
437
|
-
timeout: 4_000,
|
|
438
|
-
});
|
|
439
|
-
const sourceText = await th.text();
|
|
440
|
-
expect(normalizeWorktreeLifecycleText(sourceText)).toMatchInlineSnapshot(`
|
|
441
|
-
"--- from: user (worktree-tester)
|
|
442
|
-
Reply with exactly: before-worktree
|
|
443
|
-
--- from: assistant (TestBot)
|
|
444
|
-
-# *using deterministic-provider/deterministic-v2*
|
|
445
|
-
> ok
|
|
446
|
-
Creating worktree in <#THREAD_ID>
|
|
447
|
-
-# *project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
448
|
-
--- from: user (worktree-tester)
|
|
449
|
-
Reply with exactly: after-source-thread
|
|
450
|
-
--- from: assistant (TestBot)
|
|
451
|
-
> ok
|
|
452
|
-
-# *project ⋅ main ⋅ Ns ⋅ N% ⋅ source-model-v2*"
|
|
453
|
-
`);
|
|
454
|
-
expect(sourceText).toContain('Reply with exactly: before-worktree');
|
|
455
|
-
expect(sourceText).toContain('Reply with exactly: after-source-thread');
|
|
456
|
-
expect(sourceText).not.toContain('Worktree:');
|
|
457
|
-
expect((sourceText.match(/ok/g) || []).length).toBe(2);
|
|
458
|
-
const worktreeText = await worktreeTh.text();
|
|
459
|
-
expect(normalizeWorktreeLifecycleText(worktreeText)).toMatchInlineSnapshot(`
|
|
460
|
-
"--- from: assistant (TestBot)
|
|
461
|
-
🌳 **Worktree: opencode/kimaki-WORKTREE_NAME**
|
|
462
|
-
📁 \`/tmp/worktrees/WORKTREE_NAME\`
|
|
463
|
-
🌿 Branch: \`opencode/kimaki-WORKTREE_NAME\`
|
|
464
|
-
Reusing context from <#THREAD_ID> in worktree session \`ses_TEST\`.
|
|
465
|
-
--- from: user (worktree-tester)
|
|
466
|
-
Reply with exactly: after-worktree-thread
|
|
467
|
-
--- from: assistant (TestBot)
|
|
468
|
-
> ok
|
|
469
|
-
-# *WORKTREE_NAME ⋅ opencode/kimaki-WORKTREE_NAME ⋅ Ns ⋅ N% ⋅ source-model-v2*"
|
|
470
|
-
`);
|
|
471
|
-
expect(worktreeText).toContain('Worktree:');
|
|
472
|
-
expect(worktreeText).toContain('Branch:');
|
|
473
|
-
expect(worktreeText).toContain('Reusing context from');
|
|
474
|
-
expect(worktreeText).toContain('Reply with exactly: after-worktree-thread');
|
|
475
|
-
expect(worktreeText).toContain('ok');
|
|
476
|
-
}, 30_000);
|
|
477
|
-
test('/new-worktree from a text channel creates a worktree thread that responds to messages', async () => {
|
|
478
|
-
// 1. Run /new-worktree from the text channel (not inside a thread)
|
|
479
|
-
const { id: interactionId } = await discord
|
|
480
|
-
.channel(TEXT_CHANNEL_ID)
|
|
481
|
-
.user(TEST_USER_ID)
|
|
482
|
-
.runSlashCommand({
|
|
483
|
-
name: 'new-worktree',
|
|
484
|
-
options: [{ name: 'name', type: 3, value: CHANNEL_WORKTREE_NAME }],
|
|
485
|
-
});
|
|
486
|
-
await discord
|
|
487
|
-
.channel(TEXT_CHANNEL_ID)
|
|
488
|
-
.waitForInteractionAck({ interactionId, timeout: 4_000 });
|
|
489
|
-
// 2. Wait for the worktree thread to appear in the channel
|
|
490
|
-
const worktreeThread = await discord.channel(TEXT_CHANNEL_ID).waitForThread({
|
|
491
|
-
timeout: 4_000,
|
|
492
|
-
predicate: (t) => {
|
|
493
|
-
return Boolean(t.name
|
|
494
|
-
&& t.name.startsWith('⬦ worktree: opencode/kimaki-')
|
|
495
|
-
&& t.name.includes(CHANNEL_WORKTREE_NAME));
|
|
496
|
-
},
|
|
497
|
-
});
|
|
498
|
-
const wt = discord.thread(worktreeThread.id);
|
|
499
|
-
// 3. Wait for worktree to become ready (status message shows Branch:)
|
|
500
|
-
await waitForBotMessageContaining({
|
|
501
|
-
discord,
|
|
502
|
-
threadId: worktreeThread.id,
|
|
503
|
-
userId: TEST_USER_ID,
|
|
504
|
-
text: 'Branch:',
|
|
505
|
-
timeout: 10_000,
|
|
506
|
-
});
|
|
507
|
-
// 4. Verify the DB has the worktree info
|
|
508
|
-
const worktreeInfo = await getThreadWorktreeOrWorkspace(worktreeThread.id);
|
|
509
|
-
expect(worktreeInfo?.status).toBe('ready');
|
|
510
|
-
expect(worktreeInfo?.workspace_directory).toContain(CHANNEL_WORKTREE_NAME);
|
|
511
|
-
// 5. Send a message in the worktree thread and verify it responds
|
|
512
|
-
await wt.user(TEST_USER_ID).sendMessage({
|
|
513
|
-
content: 'Reply with exactly: channel-worktree-msg',
|
|
514
|
-
});
|
|
515
|
-
await waitForBotMessageContaining({
|
|
516
|
-
discord,
|
|
517
|
-
threadId: worktreeThread.id,
|
|
518
|
-
userId: TEST_USER_ID,
|
|
519
|
-
text: 'ok',
|
|
520
|
-
afterUserMessageIncludes: 'channel-worktree-msg',
|
|
521
|
-
timeout: 10_000,
|
|
522
|
-
});
|
|
523
|
-
// Wait for footer to confirm session completion
|
|
524
|
-
await waitForBotMessageContaining({
|
|
525
|
-
discord,
|
|
526
|
-
threadId: worktreeThread.id,
|
|
527
|
-
userId: TEST_USER_ID,
|
|
528
|
-
text: 'deterministic-v2',
|
|
529
|
-
afterUserMessageIncludes: 'channel-worktree-msg',
|
|
530
|
-
timeout: 4_000,
|
|
531
|
-
});
|
|
532
|
-
// 6. Verify the runtime is using the worktree directory
|
|
533
|
-
const runtime = getRuntime(worktreeThread.id);
|
|
534
|
-
expect(runtime).toBeDefined();
|
|
535
|
-
expect(runtime.sdkDirectory).toContain(CHANNEL_WORKTREE_NAME);
|
|
536
|
-
expect(runtime.sdkDirectory).toContain(`${path.sep}worktrees${path.sep}`);
|
|
537
|
-
// 7. Snapshot the thread content
|
|
538
|
-
const worktreeText = await wt.text();
|
|
539
|
-
expect(normalizeWorktreeLifecycleText(worktreeText)).toMatchInlineSnapshot(`
|
|
540
|
-
"--- from: assistant (TestBot)
|
|
541
|
-
🌳 **Worktree: opencode/kimaki-CHANNEL_WORKTREE_NAME**
|
|
542
|
-
📁 \`/tmp/worktrees/WORKTREE_NAME\`
|
|
543
|
-
🌿 Branch: \`opencode/kimaki-CHANNEL_WORKTREE_NAME\`
|
|
544
|
-
--- from: user (worktree-tester)
|
|
545
|
-
Reply with exactly: channel-worktree-msg
|
|
546
|
-
--- from: assistant (TestBot)
|
|
547
|
-
-# *using deterministic-provider/deterministic-v2*
|
|
548
|
-
> ok"
|
|
549
|
-
`);
|
|
550
|
-
expect(worktreeText).toContain('Branch:');
|
|
551
|
-
expect(worktreeText).toContain('ok');
|
|
552
|
-
expect(worktreeText).toContain('Reply with exactly: channel-worktree-msg');
|
|
553
|
-
}, 30_000);
|
|
554
|
-
test('auto-worktree from user message creates worktree thread and responds', async () => {
|
|
555
|
-
// Channel AUTO_WORKTREE_CHANNEL_ID has worktrees enabled via toggle.
|
|
556
|
-
// Sending a message should auto-create a worktree thread.
|
|
557
|
-
// Include WORKTREE_SUFFIX in the message so the auto-derived branch name
|
|
558
|
-
// is unique per run and doesn't collide with leftover branches.
|
|
559
|
-
const autoMsg = `Reply with exactly: ${AUTO_WORKTREE_SUFFIX}`;
|
|
560
|
-
await discord.channel(AUTO_WORKTREE_CHANNEL_ID).user(TEST_USER_ID).sendMessage({
|
|
561
|
-
content: autoMsg,
|
|
562
|
-
});
|
|
563
|
-
// The thread should have the ⬦ prefix indicating a worktree thread
|
|
564
|
-
const thread = await discord.channel(AUTO_WORKTREE_CHANNEL_ID).waitForThread({
|
|
565
|
-
timeout: 4_000,
|
|
566
|
-
predicate: (t) => {
|
|
567
|
-
return Boolean(t.name?.startsWith('⬦ '));
|
|
568
|
-
},
|
|
569
|
-
});
|
|
570
|
-
const th = discord.thread(thread.id);
|
|
571
|
-
// Wait for the bot reply to the user message. The auto-worktree
|
|
572
|
-
// creation runs in the background and the first message awaits it.
|
|
573
|
-
// This is the 3rd worktree in the suite, so git can be slow.
|
|
574
|
-
await waitForBotMessageContaining({
|
|
575
|
-
discord,
|
|
576
|
-
threadId: thread.id,
|
|
577
|
-
userId: TEST_USER_ID,
|
|
578
|
-
text: 'ok',
|
|
579
|
-
afterUserMessageIncludes: AUTO_WORKTREE_SUFFIX,
|
|
580
|
-
timeout: 25_000,
|
|
581
|
-
});
|
|
582
|
-
// Verify runtime is in the worktree directory
|
|
583
|
-
const runtime = getRuntime(thread.id);
|
|
584
|
-
expect(runtime).toBeDefined();
|
|
585
|
-
expect(runtime.sdkDirectory).toContain(`${path.sep}worktrees${path.sep}`);
|
|
586
|
-
expect(runtime.sdkDirectory).not.toBe(directories.projectDirectory);
|
|
587
|
-
// Verify DB has worktree info
|
|
588
|
-
const worktreeInfo = await getThreadWorktreeOrWorkspace(thread.id);
|
|
589
|
-
expect(worktreeInfo?.status).toBe('ready');
|
|
590
|
-
expect(worktreeInfo?.workspace_directory).toBeTruthy();
|
|
591
|
-
// Send a follow-up message to verify session works inside worktree
|
|
592
|
-
await th.user(TEST_USER_ID).sendMessage({
|
|
593
|
-
content: 'Reply with exactly: auto-followup',
|
|
594
|
-
});
|
|
595
|
-
await waitForBotMessageContaining({
|
|
596
|
-
discord,
|
|
597
|
-
threadId: thread.id,
|
|
598
|
-
userId: TEST_USER_ID,
|
|
599
|
-
text: 'ok',
|
|
600
|
-
afterUserMessageIncludes: 'auto-followup',
|
|
601
|
-
timeout: 4_000,
|
|
602
|
-
});
|
|
603
|
-
const text = await th.text();
|
|
604
|
-
expect(text).toContain('ok');
|
|
605
|
-
expect(text).toContain(AUTO_WORKTREE_SUFFIX);
|
|
606
|
-
expect(text).toContain('Reply with exactly: auto-followup');
|
|
607
|
-
// Should have at least 2 ok replies
|
|
608
|
-
expect((text.match(/ok/g) || []).length).toBeGreaterThanOrEqual(2);
|
|
609
|
-
}, 35_000);
|
|
610
|
-
test('auto-worktrees fall back to normal sessions outside git repositories', async () => {
|
|
611
|
-
await discord.channel(NON_GIT_CHANNEL_ID).user(TEST_USER_ID).sendMessage({
|
|
612
|
-
content: 'Reply with exactly: non-git-first',
|
|
613
|
-
});
|
|
614
|
-
const thread = await discord.channel(NON_GIT_CHANNEL_ID).waitForThread({
|
|
615
|
-
timeout: 4_000,
|
|
616
|
-
predicate: (t) => {
|
|
617
|
-
return Boolean(t.name?.includes('Reply with exactly: non-git-first'));
|
|
618
|
-
},
|
|
619
|
-
});
|
|
620
|
-
const th = discord.thread(thread.id);
|
|
621
|
-
await waitForBotMessageContaining({
|
|
622
|
-
discord,
|
|
623
|
-
threadId: thread.id,
|
|
624
|
-
userId: TEST_USER_ID,
|
|
625
|
-
text: 'ok',
|
|
626
|
-
afterUserMessageIncludes: 'non-git-first',
|
|
627
|
-
timeout: 4_000,
|
|
628
|
-
});
|
|
629
|
-
await th.user(TEST_USER_ID).sendMessage({
|
|
630
|
-
content: 'Reply with exactly: non-git-second',
|
|
631
|
-
});
|
|
632
|
-
await waitForBotMessageContaining({
|
|
633
|
-
discord,
|
|
634
|
-
threadId: thread.id,
|
|
635
|
-
userId: TEST_USER_ID,
|
|
636
|
-
text: 'ok',
|
|
637
|
-
afterUserMessageIncludes: 'non-git-second',
|
|
638
|
-
timeout: 4_000,
|
|
639
|
-
});
|
|
640
|
-
// Wait for footer after second reply to stabilize the snapshot
|
|
641
|
-
await waitForBotMessageContaining({
|
|
642
|
-
discord,
|
|
643
|
-
threadId: thread.id,
|
|
644
|
-
userId: TEST_USER_ID,
|
|
645
|
-
text: 'deterministic-v2',
|
|
646
|
-
afterUserMessageIncludes: 'non-git-second',
|
|
647
|
-
timeout: 4_000,
|
|
648
|
-
});
|
|
649
|
-
const text = await th.text();
|
|
650
|
-
expect(text).toMatchInlineSnapshot(`
|
|
651
|
-
"--- from: user (worktree-tester)
|
|
652
|
-
Reply with exactly: non-git-first
|
|
653
|
-
--- from: assistant (TestBot)
|
|
654
|
-
-# *using deterministic-provider/deterministic-v2*
|
|
655
|
-
> ok
|
|
656
|
-
--- from: user (worktree-tester)
|
|
657
|
-
Reply with exactly: non-git-second
|
|
658
|
-
--- from: assistant (TestBot)
|
|
659
|
-
-# *non-git-project ⋅ main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
660
|
-
> ok"
|
|
661
|
-
`);
|
|
662
|
-
expect(text).toContain('Reply with exactly: non-git-first');
|
|
663
|
-
expect(text).toContain('Reply with exactly: non-git-second');
|
|
664
|
-
expect(text).not.toContain('Worktree creation failed');
|
|
665
|
-
const okCount = (text.match(/ok/g) || []).length;
|
|
666
|
-
expect(okCount).toBe(2);
|
|
667
|
-
}, 20_000);
|
|
668
|
-
test('kimaki send --channel auto-creates worktree when channel toggle is enabled', async () => {
|
|
669
|
-
// Simulate `kimaki send --channel AUTO_WORKTREE_CHANNEL_ID --prompt '...'`
|
|
670
|
-
// WITHOUT --worktree flag. The bot-side ThreadCreate handler should detect
|
|
671
|
-
// the channel toggle and auto-create a worktree.
|
|
672
|
-
const prompt = `Reply with exactly: send-auto-wt-${WORKTREE_SUFFIX}`;
|
|
673
|
-
const embedMarker = {
|
|
674
|
-
start: true,
|
|
675
|
-
username: 'worktree-tester',
|
|
676
|
-
userId: TEST_USER_ID,
|
|
677
|
-
};
|
|
678
|
-
// Post starter message (what `kimaki send` does)
|
|
679
|
-
const starterMessage = await discord
|
|
680
|
-
.channel(AUTO_WORKTREE_CHANNEL_ID)
|
|
681
|
-
.bot()
|
|
682
|
-
.sendMessage({
|
|
683
|
-
content: `» **kimaki-cli:**\n${prompt}`,
|
|
684
|
-
embeds: [
|
|
685
|
-
{ color: 0x2b2d31, footer: { text: YAML.stringify(embedMarker) } },
|
|
686
|
-
],
|
|
687
|
-
});
|
|
688
|
-
// Create thread on that message (what `kimaki send` does via REST)
|
|
689
|
-
const threadData = (await botClient.rest.post(Routes.threads(AUTO_WORKTREE_CHANNEL_ID, starterMessage.id), {
|
|
690
|
-
body: {
|
|
691
|
-
name: prompt.slice(0, 80),
|
|
692
|
-
auto_archive_duration: 1440,
|
|
693
|
-
},
|
|
694
|
-
}));
|
|
695
|
-
// Wait for worktree creation status message (Branch:)
|
|
696
|
-
await waitForBotMessageContaining({
|
|
697
|
-
discord,
|
|
698
|
-
threadId: threadData.id,
|
|
699
|
-
userId: TEST_USER_ID,
|
|
700
|
-
text: 'Branch:',
|
|
701
|
-
timeout: 25_000,
|
|
702
|
-
});
|
|
703
|
-
// Wait for the bot reply to the prompt. The starter message is from
|
|
704
|
-
// the bot (kimaki-cli), not a user, so just wait for the text to appear.
|
|
705
|
-
await waitForBotMessageContaining({
|
|
706
|
-
discord,
|
|
707
|
-
threadId: threadData.id,
|
|
708
|
-
userId: discord.botUserId,
|
|
709
|
-
text: 'ok',
|
|
710
|
-
timeout: 10_000,
|
|
711
|
-
});
|
|
712
|
-
// Snapshot the thread content
|
|
713
|
-
const th = discord.thread(threadData.id);
|
|
714
|
-
expect(normalizeWorktreeLifecycleText(await th.text())).toMatchInlineSnapshot(`
|
|
715
|
-
"--- from: assistant (TestBot)
|
|
716
|
-
» **kimaki-cli:**
|
|
717
|
-
Reply with exactly: send-auto-wt-SUFFIX
|
|
718
|
-
[embed]
|
|
719
|
-
🌳 **Worktree: AUTO_WORKTREE_BRANCH**
|
|
720
|
-
📁 \`/tmp/worktrees/WORKTREE_NAME\`
|
|
721
|
-
🌿 Branch: \`AUTO_WORKTREE_BRANCH\`
|
|
722
|
-
-# *using deterministic-provider/deterministic-v2*
|
|
723
|
-
> ok"
|
|
724
|
-
`);
|
|
725
|
-
// Verify DB has worktree info
|
|
726
|
-
const worktreeInfo = await getThreadWorktreeOrWorkspace(threadData.id);
|
|
727
|
-
expect(worktreeInfo?.status).toBe('ready');
|
|
728
|
-
expect(worktreeInfo?.workspace_directory).toBeTruthy();
|
|
729
|
-
// Verify runtime is in the worktree directory
|
|
730
|
-
const runtime = getRuntime(threadData.id);
|
|
731
|
-
expect(runtime).toBeDefined();
|
|
732
|
-
expect(runtime.sdkDirectory).toContain(`${path.sep}worktrees${path.sep}`);
|
|
733
|
-
expect(runtime.sdkDirectory).not.toBe(directories.projectDirectory);
|
|
734
|
-
}, 35_000);
|
|
735
|
-
});
|