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,177 +0,0 @@
|
|
|
1
|
-
// Tests AskUserQuestion request deduplication and cleanup helpers.
|
|
2
|
-
|
|
3
|
-
import { afterEach, describe, expect, test, vi } from 'vitest'
|
|
4
|
-
import type { ThreadChannel } from 'discord.js'
|
|
5
|
-
import {
|
|
6
|
-
areAllQuestionsAnswered,
|
|
7
|
-
deletePendingQuestionContextsForRequest,
|
|
8
|
-
pendingQuestionContexts,
|
|
9
|
-
showAskUserQuestionDropdowns,
|
|
10
|
-
} from './ask-question.js'
|
|
11
|
-
|
|
12
|
-
function createFakeThread({ failSend }: { failSend?: boolean } = {}): ThreadChannel {
|
|
13
|
-
const send = vi.fn(async () => {
|
|
14
|
-
if (failSend) {
|
|
15
|
-
throw new Error('Missing Permissions')
|
|
16
|
-
}
|
|
17
|
-
return { id: 'msg-1' }
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
id: 'thread-1',
|
|
22
|
-
send,
|
|
23
|
-
} as unknown as ThreadChannel
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
afterEach(() => {
|
|
27
|
-
pendingQuestionContexts.clear()
|
|
28
|
-
vi.restoreAllMocks()
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
describe('ask-question', () => {
|
|
32
|
-
test('dedupes duplicate question requests for the same thread', async () => {
|
|
33
|
-
const thread = createFakeThread()
|
|
34
|
-
|
|
35
|
-
await showAskUserQuestionDropdowns({
|
|
36
|
-
thread,
|
|
37
|
-
sessionId: 'ses-1',
|
|
38
|
-
directory: '/project',
|
|
39
|
-
requestId: 'req-1',
|
|
40
|
-
input: {
|
|
41
|
-
questions: [{
|
|
42
|
-
question: 'Choose one',
|
|
43
|
-
header: 'Pick',
|
|
44
|
-
options: [
|
|
45
|
-
{ label: 'Alpha', description: 'A' },
|
|
46
|
-
{ label: 'Beta', description: 'B' },
|
|
47
|
-
],
|
|
48
|
-
}],
|
|
49
|
-
},
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
await showAskUserQuestionDropdowns({
|
|
53
|
-
thread,
|
|
54
|
-
sessionId: 'ses-1',
|
|
55
|
-
directory: '/project',
|
|
56
|
-
requestId: 'req-1',
|
|
57
|
-
input: {
|
|
58
|
-
questions: [{
|
|
59
|
-
question: 'Choose one',
|
|
60
|
-
header: 'Pick',
|
|
61
|
-
options: [
|
|
62
|
-
{ label: 'Alpha', description: 'A' },
|
|
63
|
-
{ label: 'Beta', description: 'B' },
|
|
64
|
-
],
|
|
65
|
-
}],
|
|
66
|
-
},
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
expect(thread.send).toHaveBeenCalledTimes(1)
|
|
70
|
-
expect(pendingQuestionContexts.size).toBe(1)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
test('removes all duplicate contexts for one request', () => {
|
|
74
|
-
const thread = createFakeThread()
|
|
75
|
-
const baseContext: typeof pendingQuestionContexts extends Map<string, infer T>
|
|
76
|
-
? T
|
|
77
|
-
: never = {
|
|
78
|
-
sessionId: 'ses-1',
|
|
79
|
-
directory: '/project',
|
|
80
|
-
thread,
|
|
81
|
-
requestId: 'req-1',
|
|
82
|
-
questions: [{
|
|
83
|
-
question: 'Choose one',
|
|
84
|
-
header: 'Pick',
|
|
85
|
-
options: [
|
|
86
|
-
{ label: 'Alpha', description: 'A' },
|
|
87
|
-
{ label: 'Beta', description: 'B' },
|
|
88
|
-
],
|
|
89
|
-
}],
|
|
90
|
-
answers: {},
|
|
91
|
-
totalQuestions: 1,
|
|
92
|
-
contextHash: 'ctx-1',
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
pendingQuestionContexts.set('ctx-1', baseContext)
|
|
96
|
-
pendingQuestionContexts.set('ctx-2', {
|
|
97
|
-
...baseContext,
|
|
98
|
-
contextHash: 'ctx-2',
|
|
99
|
-
})
|
|
100
|
-
pendingQuestionContexts.set('ctx-3', {
|
|
101
|
-
...baseContext,
|
|
102
|
-
requestId: 'req-2',
|
|
103
|
-
contextHash: 'ctx-3',
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
const removed = deletePendingQuestionContextsForRequest({
|
|
107
|
-
threadId: thread.id,
|
|
108
|
-
requestId: 'req-1',
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
expect(removed).toBe(2)
|
|
112
|
-
expect([...pendingQuestionContexts.keys()]).toEqual(['ctx-3'])
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
test('does not schedule a question expiry timer', async () => {
|
|
116
|
-
const timeoutSpy = vi.spyOn(globalThis, 'setTimeout')
|
|
117
|
-
|
|
118
|
-
await showAskUserQuestionDropdowns({
|
|
119
|
-
thread: createFakeThread(),
|
|
120
|
-
sessionId: 'ses-1',
|
|
121
|
-
directory: '/project',
|
|
122
|
-
requestId: 'req-no-ttl',
|
|
123
|
-
input: {
|
|
124
|
-
questions: [{
|
|
125
|
-
question: 'Choose one',
|
|
126
|
-
header: 'Pick',
|
|
127
|
-
options: [
|
|
128
|
-
{ label: 'Alpha', description: 'A' },
|
|
129
|
-
{ label: 'Beta', description: 'B' },
|
|
130
|
-
],
|
|
131
|
-
}],
|
|
132
|
-
},
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
expect(timeoutSpy).not.toHaveBeenCalled()
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
test('drops the context when the dropdown message fails to send', async () => {
|
|
139
|
-
await showAskUserQuestionDropdowns({
|
|
140
|
-
thread: createFakeThread({ failSend: true }),
|
|
141
|
-
sessionId: 'ses-1',
|
|
142
|
-
directory: '/project',
|
|
143
|
-
requestId: 'req-send-fails',
|
|
144
|
-
input: {
|
|
145
|
-
questions: [{
|
|
146
|
-
question: 'Choose one',
|
|
147
|
-
header: 'Pick',
|
|
148
|
-
options: [
|
|
149
|
-
{ label: 'Alpha', description: 'A' },
|
|
150
|
-
{ label: 'Beta', description: 'B' },
|
|
151
|
-
],
|
|
152
|
-
}],
|
|
153
|
-
},
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
expect(pendingQuestionContexts.size).toBe(0)
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
test('requires every question to have an answer', () => {
|
|
160
|
-
expect(areAllQuestionsAnswered({
|
|
161
|
-
totalQuestions: 3,
|
|
162
|
-
answers: {
|
|
163
|
-
0: ['Alpha'],
|
|
164
|
-
2: ['Gamma'],
|
|
165
|
-
},
|
|
166
|
-
})).toBe(false)
|
|
167
|
-
|
|
168
|
-
expect(areAllQuestionsAnswered({
|
|
169
|
-
totalQuestions: 3,
|
|
170
|
-
answers: {
|
|
171
|
-
0: ['Alpha'],
|
|
172
|
-
1: ['Beta'],
|
|
173
|
-
2: ['Gamma'],
|
|
174
|
-
},
|
|
175
|
-
})).toBe(true)
|
|
176
|
-
})
|
|
177
|
-
})
|
|
@@ -1,532 +0,0 @@
|
|
|
1
|
-
// AskUserQuestion tool handler - Shows Discord dropdowns for AI questions.
|
|
2
|
-
// When the AI uses the AskUserQuestion tool, this module renders dropdowns
|
|
3
|
-
// for each question and collects user responses.
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
StringSelectMenuBuilder,
|
|
7
|
-
StringSelectMenuInteraction,
|
|
8
|
-
ActionRowBuilder,
|
|
9
|
-
type ThreadChannel,
|
|
10
|
-
MessageFlags,
|
|
11
|
-
} from 'discord.js'
|
|
12
|
-
import crypto from 'node:crypto'
|
|
13
|
-
import { sendThreadMessage, NOTIFY_MESSAGE_FLAGS, SILENT_MESSAGE_FLAGS } from '../discord-utils.js'
|
|
14
|
-
import { getOpencodeClient } from '../opencode.js'
|
|
15
|
-
import { DiscordOperationError } from '../errors.js'
|
|
16
|
-
import { createLogger, LogPrefix } from '../logger.js'
|
|
17
|
-
import { QUEUE_PREFIX } from '../message-formatting.js'
|
|
18
|
-
import { getRuntime } from '../session-handler/thread-session-runtime.js'
|
|
19
|
-
|
|
20
|
-
const logger = createLogger(LogPrefix.ASK_QUESTION)
|
|
21
|
-
|
|
22
|
-
// Schema matching the question tool input
|
|
23
|
-
export type AskUserQuestionInput = {
|
|
24
|
-
questions: Array<{
|
|
25
|
-
question: string
|
|
26
|
-
header: string // max 12 chars
|
|
27
|
-
options: Array<{
|
|
28
|
-
label: string
|
|
29
|
-
description: string
|
|
30
|
-
}>
|
|
31
|
-
multiple?: boolean // optional, defaults to false
|
|
32
|
-
}>
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export type CancelQuestionResult = 'no-pending' | 'replied' | 'reply-failed'
|
|
36
|
-
|
|
37
|
-
type PendingQuestionContext = {
|
|
38
|
-
sessionId: string
|
|
39
|
-
directory: string
|
|
40
|
-
thread: ThreadChannel
|
|
41
|
-
requestId: string // OpenCode question request ID for replying
|
|
42
|
-
questions: AskUserQuestionInput['questions']
|
|
43
|
-
answers: Record<number, string[]> // questionIndex -> selected labels
|
|
44
|
-
totalQuestions: number
|
|
45
|
-
contextHash: string
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Store pending question contexts by hash.
|
|
50
|
-
// No TTL on purpose: a question can only be answered by the user, so expiring it
|
|
51
|
-
// could only abort the run. Cleanup happens on answer, on a new user message, on
|
|
52
|
-
// abort (abortActiveRunInternal), and on thread dispose.
|
|
53
|
-
export const pendingQuestionContexts = new Map<string, PendingQuestionContext>()
|
|
54
|
-
|
|
55
|
-
export function areAllQuestionsAnswered({
|
|
56
|
-
totalQuestions,
|
|
57
|
-
answers,
|
|
58
|
-
}: {
|
|
59
|
-
totalQuestions: number
|
|
60
|
-
answers: Record<number, string[]>
|
|
61
|
-
}): boolean {
|
|
62
|
-
for (let i = 0; i < totalQuestions; i++) {
|
|
63
|
-
if (!answers[i]) {
|
|
64
|
-
return false
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return true
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function findPendingQuestionContextForRequest({
|
|
71
|
-
threadId,
|
|
72
|
-
requestId,
|
|
73
|
-
}: {
|
|
74
|
-
threadId: string
|
|
75
|
-
requestId: string
|
|
76
|
-
}): { contextHash: string; context: PendingQuestionContext } | null {
|
|
77
|
-
for (const [contextHash, context] of pendingQuestionContexts) {
|
|
78
|
-
if (context.thread.id !== threadId) {
|
|
79
|
-
continue
|
|
80
|
-
}
|
|
81
|
-
if (context.requestId !== requestId) {
|
|
82
|
-
continue
|
|
83
|
-
}
|
|
84
|
-
return { contextHash, context }
|
|
85
|
-
}
|
|
86
|
-
return null
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function deletePendingQuestionContextsForRequest({
|
|
90
|
-
threadId,
|
|
91
|
-
requestId,
|
|
92
|
-
}: {
|
|
93
|
-
threadId: string
|
|
94
|
-
requestId: string
|
|
95
|
-
}): number {
|
|
96
|
-
const matchingContextHashes = [...pendingQuestionContexts.entries()]
|
|
97
|
-
.filter(([, context]) => {
|
|
98
|
-
return context.thread.id === threadId && context.requestId === requestId
|
|
99
|
-
})
|
|
100
|
-
.map(([contextHash]) => {
|
|
101
|
-
return contextHash
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
matchingContextHashes.map((contextHash) => {
|
|
105
|
-
pendingQuestionContexts.delete(contextHash)
|
|
106
|
-
return contextHash
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
return matchingContextHashes.length
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function hasPendingQuestionForThread(threadId: string): boolean {
|
|
113
|
-
return [...pendingQuestionContexts.values()].some((ctx) => {
|
|
114
|
-
return ctx.thread.id === threadId
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Show dropdown menus for question tool input.
|
|
120
|
-
* Sends one message per question with the dropdown directly under the question text.
|
|
121
|
-
*/
|
|
122
|
-
export async function showAskUserQuestionDropdowns({
|
|
123
|
-
thread,
|
|
124
|
-
sessionId,
|
|
125
|
-
directory,
|
|
126
|
-
requestId,
|
|
127
|
-
input,
|
|
128
|
-
silent,
|
|
129
|
-
}: {
|
|
130
|
-
thread: ThreadChannel
|
|
131
|
-
sessionId: string
|
|
132
|
-
directory: string
|
|
133
|
-
requestId: string // OpenCode question request ID
|
|
134
|
-
input: AskUserQuestionInput
|
|
135
|
-
/** Suppress notification when queue has pending items */
|
|
136
|
-
silent?: boolean
|
|
137
|
-
}): Promise<void> {
|
|
138
|
-
const existingPending = findPendingQuestionContextForRequest({
|
|
139
|
-
threadId: thread.id,
|
|
140
|
-
requestId,
|
|
141
|
-
})
|
|
142
|
-
if (existingPending) {
|
|
143
|
-
logger.log(
|
|
144
|
-
`Deduped question ${requestId} for thread ${thread.id} (existing context ${existingPending.contextHash})`,
|
|
145
|
-
)
|
|
146
|
-
return
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const contextHash = crypto.randomBytes(8).toString('hex')
|
|
150
|
-
|
|
151
|
-
const context: PendingQuestionContext = {
|
|
152
|
-
sessionId,
|
|
153
|
-
directory,
|
|
154
|
-
thread,
|
|
155
|
-
requestId,
|
|
156
|
-
questions: input.questions,
|
|
157
|
-
answers: {},
|
|
158
|
-
totalQuestions: input.questions.length,
|
|
159
|
-
contextHash,
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
pendingQuestionContexts.set(contextHash, context)
|
|
164
|
-
|
|
165
|
-
// Send one message per question with its dropdown directly underneath
|
|
166
|
-
for (let i = 0; i < input.questions.length; i++) {
|
|
167
|
-
const q = input.questions[i]!
|
|
168
|
-
|
|
169
|
-
// Map options to Discord select menu options
|
|
170
|
-
// Discord max: 25 options per select menu
|
|
171
|
-
const options = [
|
|
172
|
-
...q.options.slice(0, 24).map((opt, optIdx) => ({
|
|
173
|
-
label: opt.label.slice(0, 100),
|
|
174
|
-
value: `${optIdx}`,
|
|
175
|
-
description: opt.description.slice(0, 100),
|
|
176
|
-
})),
|
|
177
|
-
{
|
|
178
|
-
label: 'Other',
|
|
179
|
-
value: 'other',
|
|
180
|
-
description: 'Provide a custom answer in chat',
|
|
181
|
-
},
|
|
182
|
-
]
|
|
183
|
-
|
|
184
|
-
const placeholder =
|
|
185
|
-
options.find((x) => x.label)?.label || 'Select an option'
|
|
186
|
-
const selectMenu = new StringSelectMenuBuilder()
|
|
187
|
-
.setCustomId(`ask_question:${contextHash}:${i}`)
|
|
188
|
-
.setPlaceholder(placeholder)
|
|
189
|
-
.addOptions(options)
|
|
190
|
-
|
|
191
|
-
// Enable multi-select if the question supports it
|
|
192
|
-
if (q.multiple) {
|
|
193
|
-
selectMenu.setMinValues(1)
|
|
194
|
-
selectMenu.setMaxValues(options.length)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const actionRow =
|
|
198
|
-
new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(selectMenu)
|
|
199
|
-
|
|
200
|
-
const sendResult = await thread.send({
|
|
201
|
-
content: `**${(q.header || '').slice(0, 200)}**\n${q.question.slice(0, 1700)}`,
|
|
202
|
-
components: [actionRow],
|
|
203
|
-
flags: silent ? SILENT_MESSAGE_FLAGS : NOTIFY_MESSAGE_FLAGS,
|
|
204
|
-
}).catch((e) => new DiscordOperationError({ operation: 'sendQuestionDropdown', cause: e }))
|
|
205
|
-
// Without a visible dropdown the user can never answer, and there is no TTL
|
|
206
|
-
// to rescue the run, so drop the context and abort so OpenCode unblocks.
|
|
207
|
-
if (sendResult instanceof Error) {
|
|
208
|
-
logger.error('Failed to send question dropdown:', sendResult)
|
|
209
|
-
deletePendingQuestionContextsForRequest({ threadId: thread.id, requestId })
|
|
210
|
-
const client = getOpencodeClient(directory)
|
|
211
|
-
if (client) {
|
|
212
|
-
await client.session.abort({ sessionID: sessionId }).catch((error) => {
|
|
213
|
-
logger.error('Failed to abort session after question send failure:', error)
|
|
214
|
-
})
|
|
215
|
-
}
|
|
216
|
-
return
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
logger.log(
|
|
221
|
-
`Showed ${input.questions.length} question dropdown(s) for session ${sessionId}`,
|
|
222
|
-
)
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Handle dropdown selection for AskUserQuestion.
|
|
227
|
-
*/
|
|
228
|
-
export async function handleAskQuestionSelectMenu(
|
|
229
|
-
interaction: StringSelectMenuInteraction,
|
|
230
|
-
): Promise<void> {
|
|
231
|
-
const customId = interaction.customId
|
|
232
|
-
|
|
233
|
-
if (!customId.startsWith('ask_question:')) {
|
|
234
|
-
return
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const parts = customId.split(':')
|
|
238
|
-
const contextHash = parts[1]
|
|
239
|
-
const questionIndex = parseInt(parts[2]!, 10)
|
|
240
|
-
|
|
241
|
-
if (!contextHash) {
|
|
242
|
-
await interaction.reply({
|
|
243
|
-
content: 'Invalid selection.',
|
|
244
|
-
flags: MessageFlags.Ephemeral,
|
|
245
|
-
})
|
|
246
|
-
return
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
const context = pendingQuestionContexts.get(contextHash)
|
|
250
|
-
|
|
251
|
-
if (!context) {
|
|
252
|
-
await interaction.reply({
|
|
253
|
-
content: 'This question has expired. Please ask the AI again.',
|
|
254
|
-
flags: MessageFlags.Ephemeral,
|
|
255
|
-
})
|
|
256
|
-
return
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
await interaction.deferUpdate()
|
|
260
|
-
|
|
261
|
-
const selectedValues = interaction.values
|
|
262
|
-
const question = context.questions[questionIndex]
|
|
263
|
-
|
|
264
|
-
if (!question) {
|
|
265
|
-
logger.error(`Question index ${questionIndex} not found in context`)
|
|
266
|
-
return
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (context.answers[questionIndex]) {
|
|
270
|
-
logger.log(
|
|
271
|
-
`Ignored duplicate answer for question ${context.requestId} index ${questionIndex}`,
|
|
272
|
-
)
|
|
273
|
-
return
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
// Check if "other" was selected
|
|
277
|
-
if (selectedValues.includes('other')) {
|
|
278
|
-
// User wants to provide custom answer
|
|
279
|
-
// For now, mark as "Other" - they can type in chat
|
|
280
|
-
context.answers[questionIndex] = ['Other (please type your answer in chat)']
|
|
281
|
-
} else {
|
|
282
|
-
// Map value indices back to option labels
|
|
283
|
-
context.answers[questionIndex] = selectedValues.map((v) => {
|
|
284
|
-
const optIdx = parseInt(v, 10)
|
|
285
|
-
return question.options[optIdx]?.label || `Option ${optIdx + 1}`
|
|
286
|
-
})
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Update this question's message: show answer and remove dropdown
|
|
290
|
-
const answeredText = context.answers[questionIndex]!.join(', ')
|
|
291
|
-
await interaction.editReply({
|
|
292
|
-
content: `**${question.header}**\n${question.question}\n✓ _${answeredText}_`,
|
|
293
|
-
components: [], // Remove the dropdown
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
const username = interaction.user.globalName || interaction.user.username
|
|
297
|
-
await sendThreadMessage(
|
|
298
|
-
context.thread,
|
|
299
|
-
`${QUEUE_PREFIX}**${username}:** ${answeredText}`,
|
|
300
|
-
)
|
|
301
|
-
|
|
302
|
-
// Check if all questions are answered. Claim the context synchronously
|
|
303
|
-
// (delete before awaiting submit) so two concurrent final selections for a
|
|
304
|
-
// multi-question tool cannot both submit and double-resume the session.
|
|
305
|
-
if (
|
|
306
|
-
areAllQuestionsAnswered(context)
|
|
307
|
-
&& pendingQuestionContexts.get(contextHash) === context
|
|
308
|
-
) {
|
|
309
|
-
deletePendingQuestionContextsForRequest({
|
|
310
|
-
threadId: context.thread.id,
|
|
311
|
-
requestId: context.requestId,
|
|
312
|
-
})
|
|
313
|
-
await submitQuestionAnswers(context)
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
/**
|
|
318
|
-
* Format collected answers as a plain-text summary the model can read when
|
|
319
|
-
* the run is resumed after an abort (e.g. `"Which option?"="Alpha"`).
|
|
320
|
-
*
|
|
321
|
-
* Known limitation: if the user had queued items via /queue during the pending
|
|
322
|
-
* question AND aborted the run from another opencode client, the first queued
|
|
323
|
-
* item may have already been handed off to opencode and can lose its ordering
|
|
324
|
-
* on resume. That rare combination needs a queue-handoff redesign; the common
|
|
325
|
-
* (no-queue) abort case is handled correctly.
|
|
326
|
-
*/
|
|
327
|
-
function formatQuestionAnswersText(context: PendingQuestionContext): string {
|
|
328
|
-
const parts = context.questions.map((q, i) => {
|
|
329
|
-
const answer = (context.answers[i] || []).join(', ') || 'Unanswered'
|
|
330
|
-
return `"${q.question}"="${answer}"`
|
|
331
|
-
})
|
|
332
|
-
return `Answers to your previous questions: ${parts.join(', ')}`
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/** Resume the session by feeding the answers back as a new user prompt. */
|
|
336
|
-
async function resumeSessionWithAnswers(
|
|
337
|
-
context: PendingQuestionContext,
|
|
338
|
-
): Promise<void> {
|
|
339
|
-
const runtime = getRuntime(context.thread.id)
|
|
340
|
-
const resumed = await runtime?.resumeWithText({
|
|
341
|
-
text: formatQuestionAnswersText(context),
|
|
342
|
-
})
|
|
343
|
-
if (!resumed) {
|
|
344
|
-
await sendThreadMessage(
|
|
345
|
-
context.thread,
|
|
346
|
-
'✗ Failed to submit answers: session is no longer active',
|
|
347
|
-
)
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Submit all collected answers back to the OpenCode session.
|
|
353
|
-
*
|
|
354
|
-
* The decision is based on whether the session still has a live run:
|
|
355
|
-
*
|
|
356
|
-
* - Busy: a live run is parked on the question. Reply so it continues.
|
|
357
|
-
* - Idle: the run was aborted (from this or another opencode client). Replying
|
|
358
|
-
* would resolve a dead run and the session would never continue, so resume it
|
|
359
|
-
* with the answers as a fresh prompt instead.
|
|
360
|
-
*
|
|
361
|
-
* Note: `question.list` is not a reliable signal here. After an abort the
|
|
362
|
-
* question request can stay in the pending list but orphaned (no run awaiting
|
|
363
|
-
* it), so a reply would succeed yet the session would still not continue. The
|
|
364
|
-
* session busy state, derived from the event stream, is the accurate signal.
|
|
365
|
-
* The reply `.error` check is a safety net for the case where the request was
|
|
366
|
-
* actually removed while the session still looked busy.
|
|
367
|
-
*/
|
|
368
|
-
async function submitQuestionAnswers(
|
|
369
|
-
context: PendingQuestionContext,
|
|
370
|
-
): Promise<void> {
|
|
371
|
-
const client = getOpencodeClient(context.directory)
|
|
372
|
-
if (!client) {
|
|
373
|
-
logger.error('OpenCode server not found for directory')
|
|
374
|
-
return
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const runtime = getRuntime(context.thread.id)
|
|
378
|
-
|
|
379
|
-
if (runtime && !runtime.isBusy()) {
|
|
380
|
-
logger.log(
|
|
381
|
-
`Session ${context.sessionId} idle; resuming with answers for question ${context.requestId}`,
|
|
382
|
-
)
|
|
383
|
-
await resumeSessionWithAnswers(context)
|
|
384
|
-
return
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
const answers = context.questions.map((_, i) => {
|
|
388
|
-
return context.answers[i] || []
|
|
389
|
-
})
|
|
390
|
-
|
|
391
|
-
// throwOnError is off on this client, so failures come back in `.error`.
|
|
392
|
-
const replyResult = await client.question
|
|
393
|
-
.reply({ requestID: context.requestId, directory: context.directory, answers })
|
|
394
|
-
.catch((error) => ({ error }))
|
|
395
|
-
|
|
396
|
-
if (!replyResult.error) {
|
|
397
|
-
logger.log(
|
|
398
|
-
`Submitted answers for question ${context.requestId} in session ${context.sessionId}`,
|
|
399
|
-
)
|
|
400
|
-
return
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Reply failed (the request was removed while the session still looked busy).
|
|
404
|
-
// Resume so the answer still reaches the model.
|
|
405
|
-
logger.log(
|
|
406
|
-
`Reply failed for question ${context.requestId}; resuming session ${context.sessionId} with answers`,
|
|
407
|
-
)
|
|
408
|
-
await resumeSessionWithAnswers(context)
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/**
|
|
412
|
-
* Check if a tool part is an AskUserQuestion tool.
|
|
413
|
-
* Returns the parsed input if valid, null otherwise.
|
|
414
|
-
*/
|
|
415
|
-
export function parseAskUserQuestionTool(part: {
|
|
416
|
-
type: string
|
|
417
|
-
tool?: string
|
|
418
|
-
state?: { input?: AskUserQuestionInput }
|
|
419
|
-
}): AskUserQuestionInput | null {
|
|
420
|
-
if (part.type !== 'tool') {
|
|
421
|
-
return null
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// Check for the tool name (case-insensitive)
|
|
425
|
-
const toolName = part.tool?.toLowerCase()
|
|
426
|
-
if (toolName !== 'question') {
|
|
427
|
-
return null
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
const input = part.state?.input
|
|
431
|
-
|
|
432
|
-
if (
|
|
433
|
-
!input?.questions ||
|
|
434
|
-
!Array.isArray(input.questions) ||
|
|
435
|
-
input.questions.length === 0
|
|
436
|
-
) {
|
|
437
|
-
return null
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Validate structure
|
|
441
|
-
for (const q of input.questions) {
|
|
442
|
-
if (
|
|
443
|
-
typeof q.question !== 'string' ||
|
|
444
|
-
typeof q.header !== 'string' ||
|
|
445
|
-
!Array.isArray(q.options) ||
|
|
446
|
-
q.options.length < 2
|
|
447
|
-
) {
|
|
448
|
-
return null
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
return input
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* Cancel a pending question for a thread.
|
|
457
|
-
*
|
|
458
|
-
* Two modes depending on whether `userMessage` is provided:
|
|
459
|
-
*
|
|
460
|
-
* - `cancelPendingQuestion(threadId)` — cleanup only. Removes the context
|
|
461
|
-
* without replying to OpenCode. Use when aborting the blocked session
|
|
462
|
-
* separately (e.g. voice/attachment messages whose content needs
|
|
463
|
-
* transcription first). Returns 'no-pending' in both "found+cleaned" and
|
|
464
|
-
* "nothing found" cases.
|
|
465
|
-
*
|
|
466
|
-
* - `cancelPendingQuestion(threadId, text)` — reply path. Sends the text as
|
|
467
|
-
* the tool answer so the model sees the user's response. The caller should
|
|
468
|
-
* NOT also enqueue the message as a new prompt.
|
|
469
|
-
* Returns 'replied' on success, 'reply-failed' if the reply call fails
|
|
470
|
-
* (context kept pending so the user can retry).
|
|
471
|
-
*/
|
|
472
|
-
export async function cancelPendingQuestion(
|
|
473
|
-
threadId: string,
|
|
474
|
-
userMessage?: string,
|
|
475
|
-
): Promise<CancelQuestionResult> {
|
|
476
|
-
// Find pending question for this thread
|
|
477
|
-
let contextHash: string | undefined
|
|
478
|
-
let context: PendingQuestionContext | undefined
|
|
479
|
-
for (const [hash, ctx] of pendingQuestionContexts) {
|
|
480
|
-
if (ctx.thread.id === threadId) {
|
|
481
|
-
contextHash = hash
|
|
482
|
-
context = ctx
|
|
483
|
-
break
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
if (!contextHash || !context) {
|
|
488
|
-
return 'no-pending'
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
// undefined means teardown/cleanup — just remove context, don't reply.
|
|
492
|
-
// The session is already being torn down or the caller wants to dismiss
|
|
493
|
-
// the question without providing an answer (e.g. voice/attachment-only
|
|
494
|
-
// messages where content needs transcription before it can be an answer).
|
|
495
|
-
if (userMessage === undefined) {
|
|
496
|
-
deletePendingQuestionContextsForRequest({
|
|
497
|
-
threadId: context.thread.id,
|
|
498
|
-
requestId: context.requestId,
|
|
499
|
-
})
|
|
500
|
-
return 'no-pending'
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
try {
|
|
504
|
-
const client = getOpencodeClient(context.directory)
|
|
505
|
-
if (!client) {
|
|
506
|
-
throw new Error('OpenCode server not found for directory')
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
const answers = context.questions.map((_, i) => {
|
|
510
|
-
return context.answers[i] || [userMessage]
|
|
511
|
-
})
|
|
512
|
-
|
|
513
|
-
await client.question.reply({
|
|
514
|
-
requestID: context.requestId,
|
|
515
|
-
directory: context.directory,
|
|
516
|
-
answers,
|
|
517
|
-
})
|
|
518
|
-
|
|
519
|
-
logger.log(`Answered question ${context.requestId} with user message`)
|
|
520
|
-
} catch (error) {
|
|
521
|
-
logger.error('Failed to answer question:', error)
|
|
522
|
-
// Keep context pending so the user can retry.
|
|
523
|
-
// Caller should not consume the user message since reply failed.
|
|
524
|
-
return 'reply-failed'
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
deletePendingQuestionContextsForRequest({
|
|
528
|
-
threadId: context.thread.id,
|
|
529
|
-
requestId: context.requestId,
|
|
530
|
-
})
|
|
531
|
-
return 'replied'
|
|
532
|
-
}
|