kimaki 0.31.0 → 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 -223
- 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 +351 -682
- 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 -175
- 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 +619 -717
- 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 +38 -74
- 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 -258
- 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 +344 -759
- package/src/db.ts +66 -284
- package/src/duration.ts +18 -0
- package/src/effects.ts +303 -0
- package/src/errors.ts +39 -228
- 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 +668 -988
- 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 -1223
- 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 -24
- package/dist/btw-prefix-detection.test.js +0 -130
- 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 -1591
- package/dist/cli-runner.test.js +0 -119
- 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 -275
- package/dist/commands/compact.js +0 -117
- package/dist/commands/context-usage.js +0 -194
- package/dist/commands/context-usage.test.js +0 -49
- 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 -291
- 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 -1012
- package/dist/commands/multioauth.js +0 -425
- package/dist/commands/new-worktree.js +0 -625
- package/dist/commands/paginated-select.js +0 -57
- package/dist/commands/permissions.js +0 -327
- package/dist/commands/queue.js +0 -347
- 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 -248
- 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 -1432
- 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 -788
- package/dist/message-formatting.test.js +0 -1132
- package/dist/message-preprocessing.js +0 -419
- 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 -216
- package/dist/queue-drain-after-interactive-ui.e2e.test.js +0 -120
- package/dist/queue-interrupt-drain.e2e.test.js +0 -256
- 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 -65
- package/dist/session-handler/event-stream-state.js +0 -1225
- package/dist/session-handler/event-stream-state.test.js +0 -3160
- 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 -4320
- 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 -806
- package/dist/system-message.test.js +0 -917
- 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 -385
- package/dist/thinking-utils.js +0 -45
- package/dist/thinking-utils.test.js +0 -35
- package/dist/thread-message-queue.e2e.test.js +0 -1227
- 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 -727
- package/dist/voice-message.e2e.test.js +0 -1254
- package/dist/voice-routing-input.e2e.test.js +0 -195
- package/dist/voice-routing-question.e2e.test.js +0 -182
- package/dist/voice.test.js +0 -500
- 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 -116
- 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 -102
- 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 -1557
- 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 -142
- package/src/btw-prefix-detection.ts +0 -30
- 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 -885
- 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 -166
- package/src/cli-runner.ts +0 -2157
- 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 -356
- package/src/commands/compact.ts +0 -154
- package/src/commands/context-usage.test.ts +0 -57
- package/src/commands/context-usage.ts +0 -267
- 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 -421
- 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 -1377
- package/src/commands/multioauth.ts +0 -508
- package/src/commands/new-worktree.ts +0 -835
- 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 -471
- 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 -319
- 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 -1852
- 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 -999
- package/src/message-preprocessing.ts +0 -557
- 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 -262
- package/src/queue-drain-after-interactive-ui.e2e.test.ts +0 -152
- package/src/queue-interrupt-drain.e2e.test.ts +0 -299
- package/src/queue-question-select-drain.e2e.test.ts +0 -209
- 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 -104
- 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 -3431
- package/src/session-handler/event-stream-state.ts +0 -1792
- 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 -358
- package/src/session-handler/thread-session-runtime-summary.test.ts +0 -169
- package/src/session-handler/thread-session-runtime.ts +0 -5696
- 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 -1013
- package/src/system-message.ts +0 -1043
- 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 -549
- package/src/thinking-utils.test.ts +0 -46
- package/src/thinking-utils.ts +0 -82
- package/src/thread-message-queue.e2e.test.ts +0 -1468
- 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 -1000
- package/src/voice-message.e2e.test.ts +0 -1513
- package/src/voice-routing-input.e2e.test.ts +0 -203
- package/src/voice-routing-question.e2e.test.ts +0 -188
- package/src/voice.test.ts +0 -565
- 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,620 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import { ChannelType, ThreadAutoArchiveDuration, } from 'discord.js';
|
|
3
|
-
import { getChannelVerbosity, getPartMessageIds, getThreadIdBySessionId, getThreadSessionSource, listTrackedTextChannels, setPartMessagesBatch, upsertThreadSession, } from './database.js';
|
|
4
|
-
import { sendSessionPartBatches } from './discord-utils.js';
|
|
5
|
-
import { createLogger, LogPrefix } from './logger.js';
|
|
6
|
-
import { formatPart, collectSessionChunks, batchChunksForDiscord, QUEUE_PREFIX, } from './message-formatting.js';
|
|
7
|
-
import { initializeOpencodeForDirectory, } from './opencode.js';
|
|
8
|
-
import { getRuntime, isEssentialToolPart } from './session-handler/thread-session-runtime.js';
|
|
9
|
-
import { notifyError } from './sentry.js';
|
|
10
|
-
import { store } from './store.js';
|
|
11
|
-
import { extractNonXmlContent } from './xml.js';
|
|
12
|
-
const logger = createLogger(LogPrefix.OPENCODE);
|
|
13
|
-
const EXTERNAL_SYNC_INTERVAL_MS = 5_000;
|
|
14
|
-
// Per-directory timeout: if opencode is slow/hung for one directory,
|
|
15
|
-
// skip it and move on to the next. Prevents one slow directory from
|
|
16
|
-
// blocking the entire sync loop and keeping the polling guard locked.
|
|
17
|
-
const SYNC_PER_DIRECTORY_TIMEOUT_MS = 30_000;
|
|
18
|
-
// Don't sync sessions from before the CLI started. 5 min grace window
|
|
19
|
-
// covers sessions that were just created before the bot connected.
|
|
20
|
-
const CLI_START_MS = Date.now() - 5 * 60 * 1000;
|
|
21
|
-
let externalSyncInterval = null;
|
|
22
|
-
function isSyntheticTextPart(part) {
|
|
23
|
-
return part.synthetic === true;
|
|
24
|
-
}
|
|
25
|
-
function parseDiscordOriginMetadata(text) {
|
|
26
|
-
const match = text.match(/<discord-user\s+([^>]+)\s*\/>/);
|
|
27
|
-
if (!match?.[1]) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
const attrs = [...match[1].matchAll(/([a-z-]+)="([^"]*)"/g)].reduce((acc, current) => {
|
|
31
|
-
const [, key, value] = current;
|
|
32
|
-
if (!key) {
|
|
33
|
-
return acc;
|
|
34
|
-
}
|
|
35
|
-
acc[key] = value || '';
|
|
36
|
-
return acc;
|
|
37
|
-
}, {});
|
|
38
|
-
const username = attrs['name'];
|
|
39
|
-
if (!username) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
messageId: attrs['message-id'] || undefined,
|
|
44
|
-
username,
|
|
45
|
-
threadId: attrs['thread-id'] || undefined,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function getDiscordOriginMetadataFromMessage({ message, }) {
|
|
49
|
-
const textParts = message.parts.filter((p) => {
|
|
50
|
-
return p.type === 'text';
|
|
51
|
-
});
|
|
52
|
-
// Synthetic parts first (normal promptAsync path), then non-synthetic
|
|
53
|
-
// (session.command() path where the tag is embedded in arguments text).
|
|
54
|
-
const sorted = [
|
|
55
|
-
...textParts.filter((p) => { return isSyntheticTextPart(p); }),
|
|
56
|
-
...textParts.filter((p) => { return !isSyntheticTextPart(p); }),
|
|
57
|
-
];
|
|
58
|
-
for (const part of sorted) {
|
|
59
|
-
const metadata = parseDiscordOriginMetadata(part.text || '');
|
|
60
|
-
if (metadata) {
|
|
61
|
-
return metadata;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return null;
|
|
65
|
-
}
|
|
66
|
-
export function getRenderableUserTextParts({ message, }) {
|
|
67
|
-
if (message.info.role !== 'user') {
|
|
68
|
-
return [];
|
|
69
|
-
}
|
|
70
|
-
return message.parts.flatMap((part) => {
|
|
71
|
-
if (part.type !== 'text') {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
if (isSyntheticTextPart(part) || part.ignored === true) {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
const cleanedText = extractNonXmlContent(part.text || '').trim();
|
|
78
|
-
if (!cleanedText) {
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
return [{ id: part.id, text: cleanedText }];
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
function hasCompactionContinueMetadata(part) {
|
|
85
|
-
return part.metadata?.compaction_continue === true;
|
|
86
|
-
}
|
|
87
|
-
export function isInternalOpenCodeUserMessage({ message, }) {
|
|
88
|
-
if (message.info.role !== 'user') {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
return message.parts.some((part) => {
|
|
92
|
-
if (part.type === 'compaction') {
|
|
93
|
-
return true;
|
|
94
|
-
}
|
|
95
|
-
if (part.type !== 'text') {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
return isSyntheticTextPart(part) && hasCompactionContinueMetadata(part);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
export function shouldSkipExternalAssistantMessage({ message, }) {
|
|
102
|
-
if (message.info.role !== 'assistant') {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
return message.info.summary === true;
|
|
106
|
-
}
|
|
107
|
-
export function getIgnoredNoticeTextParts({ message, }) {
|
|
108
|
-
if (message.info.role !== 'user') {
|
|
109
|
-
return [];
|
|
110
|
-
}
|
|
111
|
-
return message.parts.flatMap((part) => {
|
|
112
|
-
if (part.type !== 'text') {
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
|
-
if (part.ignored !== true || isSyntheticTextPart(part)) {
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
const text = part.text?.trim();
|
|
119
|
-
if (!text) {
|
|
120
|
-
return [];
|
|
121
|
-
}
|
|
122
|
-
return [{ id: part.id, text }];
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function getExternalUserMirrorText({ username, prompt, }) {
|
|
126
|
-
return `${QUEUE_PREFIX}**${username}:** ${prompt.slice(0, 1000)}${prompt.length > 1000 ? '...' : ''}`;
|
|
127
|
-
}
|
|
128
|
-
// Pure derivation: is the latest user turn from Discord?
|
|
129
|
-
// Checks the newest user message with renderable text for a <discord-user />
|
|
130
|
-
// synthetic part. If present, the session is currently driven from Discord
|
|
131
|
-
// (kimaki manages it) and external sync should skip it. If absent (CLI/TUI),
|
|
132
|
-
// external sync should mirror it — this naturally handles the "reclaim" case
|
|
133
|
-
// (external → discord → external) without any DB source toggling.
|
|
134
|
-
export function isLatestUserTurnFromDiscord({ messages, }) {
|
|
135
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
136
|
-
const message = messages[i];
|
|
137
|
-
if (message.info.role !== 'user') {
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
if (isInternalOpenCodeUserMessage({ message })) {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
const renderableParts = getRenderableUserTextParts({ message });
|
|
144
|
-
if (renderableParts.length === 0) {
|
|
145
|
-
continue;
|
|
146
|
-
}
|
|
147
|
-
// Found the latest user message with actual text content.
|
|
148
|
-
// If it has <discord-user /> origin metadata, it came from Discord.
|
|
149
|
-
return getDiscordOriginMetadataFromMessage({ message }) !== null;
|
|
150
|
-
}
|
|
151
|
-
// No user messages with text — treat as external (allow sync).
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
function shouldMirrorAssistantPart({ part, verbosity, }) {
|
|
155
|
-
if (verbosity === 'text_only') {
|
|
156
|
-
return part.type === 'text';
|
|
157
|
-
}
|
|
158
|
-
if (verbosity === 'text_and_essential_tools') {
|
|
159
|
-
if (part.type === 'text') {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
return isEssentialToolPart(part);
|
|
163
|
-
}
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
function getSessionThreadName({ sessionTitle, messages, }) {
|
|
167
|
-
const normalizedTitle = sessionTitle?.trim();
|
|
168
|
-
if (normalizedTitle) {
|
|
169
|
-
return normalizedTitle.slice(0, 100);
|
|
170
|
-
}
|
|
171
|
-
const firstUserMessage = messages.find((message) => {
|
|
172
|
-
return message.info.role === 'user';
|
|
173
|
-
});
|
|
174
|
-
const firstUserText = firstUserMessage
|
|
175
|
-
? getRenderableUserTextParts({ message: firstUserMessage })
|
|
176
|
-
.map((part) => {
|
|
177
|
-
return part.text;
|
|
178
|
-
})
|
|
179
|
-
.join(' ')
|
|
180
|
-
.trim()
|
|
181
|
-
: '';
|
|
182
|
-
if (firstUserText) {
|
|
183
|
-
return firstUserText.slice(0, 100);
|
|
184
|
-
}
|
|
185
|
-
return 'opencode session';
|
|
186
|
-
}
|
|
187
|
-
function getSessionRecencyTimestamp(session) {
|
|
188
|
-
return session.time.updated || session.time.created || 0;
|
|
189
|
-
}
|
|
190
|
-
function sortSessionsByRecency(sessions) {
|
|
191
|
-
return [...sessions].sort((left, right) => {
|
|
192
|
-
return getSessionRecencyTimestamp(right) - getSessionRecencyTimestamp(left);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
function groupTrackedChannelsByDirectory(trackedChannels) {
|
|
196
|
-
const grouped = trackedChannels.reduce((acc, channel) => {
|
|
197
|
-
const existing = acc.get(channel.directory);
|
|
198
|
-
const createdAtMs = Math.max(channel.created_at?.getTime() || 0, CLI_START_MS);
|
|
199
|
-
if (!existing) {
|
|
200
|
-
acc.set(channel.directory, {
|
|
201
|
-
directory: channel.directory,
|
|
202
|
-
channelId: channel.channel_id,
|
|
203
|
-
startMs: createdAtMs,
|
|
204
|
-
});
|
|
205
|
-
return acc;
|
|
206
|
-
}
|
|
207
|
-
if (createdAtMs < existing.startMs) {
|
|
208
|
-
acc.set(channel.directory, {
|
|
209
|
-
directory: channel.directory,
|
|
210
|
-
channelId: channel.channel_id,
|
|
211
|
-
startMs: createdAtMs,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
return acc;
|
|
215
|
-
}, new Map());
|
|
216
|
-
return [...grouped.values()];
|
|
217
|
-
}
|
|
218
|
-
async function ensureExternalSessionThread({ discordClient, channelId, sessionId, sessionTitle, messages, }) {
|
|
219
|
-
const existingThreadId = await getThreadIdBySessionId(sessionId);
|
|
220
|
-
if (existingThreadId) {
|
|
221
|
-
// Caller already verified via isLatestUserTurnFromDiscord that this
|
|
222
|
-
// session should be synced. If the thread was kimaki-owned, flip it
|
|
223
|
-
// to external_poll so typing and future polls work naturally.
|
|
224
|
-
const existingSource = await getThreadSessionSource(existingThreadId);
|
|
225
|
-
if (existingSource === 'kimaki') {
|
|
226
|
-
await upsertThreadSession({
|
|
227
|
-
threadId: existingThreadId,
|
|
228
|
-
sessionId,
|
|
229
|
-
source: 'external_poll',
|
|
230
|
-
});
|
|
231
|
-
logger.log(`[EXTERNAL_SYNC] Reclaimed thread ${existingThreadId} for session ${sessionId} (user resumed from OpenCode)`);
|
|
232
|
-
}
|
|
233
|
-
const existingThread = await discordClient.channels.fetch(existingThreadId).catch((error) => {
|
|
234
|
-
return new Error(`Failed to fetch thread ${existingThreadId}`, {
|
|
235
|
-
cause: error,
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
if (!(existingThread instanceof Error) && existingThread?.isThread()) {
|
|
239
|
-
return existingThread;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
const parentChannel = await discordClient.channels.fetch(channelId).catch((error) => {
|
|
243
|
-
return new Error(`Failed to fetch parent channel ${channelId}`, {
|
|
244
|
-
cause: error,
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
if (parentChannel instanceof Error)
|
|
248
|
-
return parentChannel;
|
|
249
|
-
if (!parentChannel || parentChannel.type !== ChannelType.GuildText) {
|
|
250
|
-
return new Error(`Channel ${channelId} is not a text channel`);
|
|
251
|
-
}
|
|
252
|
-
const threadName = 'Sync: ' + getSessionThreadName({ sessionTitle, messages });
|
|
253
|
-
const thread = await (parentChannel).threads.create({
|
|
254
|
-
name: threadName.slice(0, 100),
|
|
255
|
-
autoArchiveDuration: ThreadAutoArchiveDuration.OneDay,
|
|
256
|
-
reason: `Sync external OpenCode session ${sessionId}`,
|
|
257
|
-
}).catch((error) => {
|
|
258
|
-
return new Error(`Failed to create thread for session ${sessionId}`, {
|
|
259
|
-
cause: error,
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
if (thread instanceof Error)
|
|
263
|
-
return thread;
|
|
264
|
-
await upsertThreadSession({
|
|
265
|
-
threadId: thread.id,
|
|
266
|
-
sessionId,
|
|
267
|
-
source: 'external_poll',
|
|
268
|
-
});
|
|
269
|
-
return thread;
|
|
270
|
-
}
|
|
271
|
-
// Collect all unsynced parts from all messages into SessionChunks.
|
|
272
|
-
// User messages that originated from this Discord thread are returned as
|
|
273
|
-
// directMappings (persisted without sending a Discord message). All other
|
|
274
|
-
// user and assistant parts are returned as chunks to send.
|
|
275
|
-
function collectUnsyncedChunks({ messages, syncedPartIds, verbosity, thread, }) {
|
|
276
|
-
const chunks = [];
|
|
277
|
-
const directMappings = [];
|
|
278
|
-
for (const message of messages) {
|
|
279
|
-
if (message.info.role === 'user') {
|
|
280
|
-
if (isInternalOpenCodeUserMessage({ message })) {
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
const ignoredNoticeParts = getIgnoredNoticeTextParts({ message }).filter((part) => {
|
|
284
|
-
return !syncedPartIds.has(part.id);
|
|
285
|
-
});
|
|
286
|
-
if (ignoredNoticeParts.length > 0) {
|
|
287
|
-
chunks.push({
|
|
288
|
-
partIds: ignoredNoticeParts.map((part) => {
|
|
289
|
-
return part.id;
|
|
290
|
-
}),
|
|
291
|
-
content: ignoredNoticeParts.map((part) => {
|
|
292
|
-
return part.text;
|
|
293
|
-
}).join('\n\n'),
|
|
294
|
-
kind: 'text',
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
const renderableParts = getRenderableUserTextParts({ message });
|
|
298
|
-
const unsyncedParts = renderableParts.filter((p) => {
|
|
299
|
-
return !syncedPartIds.has(p.id);
|
|
300
|
-
});
|
|
301
|
-
if (unsyncedParts.length === 0) {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
// If the user message came from this Discord thread, skip mirroring
|
|
305
|
-
// — it's already visible. When message-id is available, record a
|
|
306
|
-
// direct mapping for part dedup. When it's missing (sourceMessageId
|
|
307
|
-
// is optional in IngressInput), just mark parts as synced.
|
|
308
|
-
const discordOrigin = getDiscordOriginMetadataFromMessage({ message });
|
|
309
|
-
if (discordOrigin && (!discordOrigin.threadId || discordOrigin.threadId === thread.id)) {
|
|
310
|
-
unsyncedParts.forEach((part) => {
|
|
311
|
-
directMappings.push({
|
|
312
|
-
partId: part.id,
|
|
313
|
-
messageId: discordOrigin.messageId || '',
|
|
314
|
-
threadId: thread.id,
|
|
315
|
-
});
|
|
316
|
-
syncedPartIds.add(part.id);
|
|
317
|
-
});
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
const promptText = unsyncedParts.map((p) => {
|
|
321
|
-
return p.text;
|
|
322
|
-
}).join('\n\n');
|
|
323
|
-
chunks.push({
|
|
324
|
-
partIds: unsyncedParts.map((p) => {
|
|
325
|
-
return p.id;
|
|
326
|
-
}),
|
|
327
|
-
content: getExternalUserMirrorText({ username: 'user', prompt: promptText }),
|
|
328
|
-
kind: 'text',
|
|
329
|
-
});
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
if (message.info.role !== 'assistant') {
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
if (shouldSkipExternalAssistantMessage({ message })) {
|
|
336
|
-
continue;
|
|
337
|
-
}
|
|
338
|
-
// Filter assistant parts by verbosity before passing to shared collector
|
|
339
|
-
const filteredParts = message.parts.filter((part) => {
|
|
340
|
-
return shouldMirrorAssistantPart({ part, verbosity });
|
|
341
|
-
});
|
|
342
|
-
const { chunks: assistantChunks } = collectSessionChunks({
|
|
343
|
-
messages: [{ info: message.info, parts: filteredParts }],
|
|
344
|
-
skipPartIds: syncedPartIds,
|
|
345
|
-
});
|
|
346
|
-
// Mark empty-content parts as synced (collectSessionChunks skips them)
|
|
347
|
-
for (const part of filteredParts) {
|
|
348
|
-
if (!syncedPartIds.has(part.id)) {
|
|
349
|
-
const content = formatPart(part);
|
|
350
|
-
if (!content.trim()) {
|
|
351
|
-
syncedPartIds.add(part.id);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
chunks.push(...assistantChunks);
|
|
356
|
-
}
|
|
357
|
-
return { chunks, directMappings };
|
|
358
|
-
}
|
|
359
|
-
async function syncSessionToThread({ client, discordClient, directory, channelId, sessionId, sessionTitle, signal, }) {
|
|
360
|
-
const messagesResponse = await client.session.messages({
|
|
361
|
-
sessionID: sessionId,
|
|
362
|
-
directory,
|
|
363
|
-
}).catch((error) => {
|
|
364
|
-
return new Error(`Failed to fetch messages for session ${sessionId}`, {
|
|
365
|
-
cause: error,
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
if (messagesResponse instanceof Error) {
|
|
369
|
-
throw messagesResponse;
|
|
370
|
-
}
|
|
371
|
-
if (signal.aborted)
|
|
372
|
-
return;
|
|
373
|
-
const messages = messagesResponse.data || [];
|
|
374
|
-
// Pure derivation from opencode events: if the latest user turn has
|
|
375
|
-
// <discord-user /> metadata, kimaki's thread runtime owns this session.
|
|
376
|
-
// Skip external sync entirely. When the user resumes from CLI/TUI the
|
|
377
|
-
// latest user turn will lack the tag, so sync picks it up naturally.
|
|
378
|
-
if (isLatestUserTurnFromDiscord({ messages })) {
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
const existingThreadId = await getThreadIdBySessionId(sessionId);
|
|
382
|
-
if (existingThreadId && getRuntime(existingThreadId)) {
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
const thread = await ensureExternalSessionThread({
|
|
386
|
-
discordClient,
|
|
387
|
-
channelId,
|
|
388
|
-
sessionId,
|
|
389
|
-
sessionTitle,
|
|
390
|
-
messages,
|
|
391
|
-
});
|
|
392
|
-
if (thread === null) {
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
if (thread instanceof Error) {
|
|
396
|
-
throw thread;
|
|
397
|
-
}
|
|
398
|
-
if (signal.aborted)
|
|
399
|
-
return;
|
|
400
|
-
const [existingPartIds, verbosity] = await Promise.all([
|
|
401
|
-
getPartMessageIds(thread.id),
|
|
402
|
-
getChannelVerbosity(thread.parentId || thread.id),
|
|
403
|
-
]);
|
|
404
|
-
const syncedPartIds = new Set(existingPartIds);
|
|
405
|
-
const { chunks, directMappings } = collectUnsyncedChunks({ messages, syncedPartIds, verbosity, thread });
|
|
406
|
-
// Persist mappings for user parts that originated from this Discord thread
|
|
407
|
-
if (directMappings.length > 0) {
|
|
408
|
-
await setPartMessagesBatch(directMappings);
|
|
409
|
-
}
|
|
410
|
-
const batched = batchChunksForDiscord(chunks);
|
|
411
|
-
if (signal.aborted)
|
|
412
|
-
return;
|
|
413
|
-
const sent = await sendSessionPartBatches({ thread, batches: batched });
|
|
414
|
-
for (const batch of sent) {
|
|
415
|
-
if (signal.aborted)
|
|
416
|
-
return;
|
|
417
|
-
await setPartMessagesBatch(batch.partIds.map((partId) => ({
|
|
418
|
-
partId,
|
|
419
|
-
messageId: batch.message.id,
|
|
420
|
-
threadId: thread.id,
|
|
421
|
-
})));
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
// Pulse typing indicator for sessions that are currently busy.
|
|
425
|
-
// Takes the global session statuses map (already fetched) and sends
|
|
426
|
-
// typing to threads whose session is busy and still managed by external_poll.
|
|
427
|
-
async function pulseTypingForBusySessions({ discordClient, statuses, }) {
|
|
428
|
-
for (const [sessionId, status] of Object.entries(statuses)) {
|
|
429
|
-
if (status.type !== 'busy') {
|
|
430
|
-
continue;
|
|
431
|
-
}
|
|
432
|
-
const threadId = await getThreadIdBySessionId(sessionId);
|
|
433
|
-
if (!threadId) {
|
|
434
|
-
continue;
|
|
435
|
-
}
|
|
436
|
-
// Skip sessions already managed by the runtime (source='kimaki')
|
|
437
|
-
const source = await getThreadSessionSource(threadId);
|
|
438
|
-
if (source && source !== 'external_poll') {
|
|
439
|
-
continue;
|
|
440
|
-
}
|
|
441
|
-
const thread = await discordClient.channels.fetch(threadId).catch(() => {
|
|
442
|
-
return null;
|
|
443
|
-
});
|
|
444
|
-
if (thread?.isThread()) {
|
|
445
|
-
await thread.sendTyping().catch(() => { });
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
const EXTERNAL_SYNC_MAX_SESSIONS = 50;
|
|
450
|
-
export function isExternalSyncRootSession({ title, parentID, }) {
|
|
451
|
-
if (parentID) {
|
|
452
|
-
return false;
|
|
453
|
-
}
|
|
454
|
-
if (/^new session\s*-/i.test(title || '')) {
|
|
455
|
-
return false;
|
|
456
|
-
}
|
|
457
|
-
return !/subagent\)\s*$/i.test(title || '');
|
|
458
|
-
}
|
|
459
|
-
// Tracks directories with an in-flight sync. When a directory times out,
|
|
460
|
-
// its AbortController is aborted so the inner work stops producing side
|
|
461
|
-
// effects (Discord messages, DB writes). The next poll tick skips the
|
|
462
|
-
// directory if it still has an active controller (prevents overlap).
|
|
463
|
-
const activeDirectorySyncs = new Map();
|
|
464
|
-
// Sync one directory with a timeout and abort. If the opencode server is
|
|
465
|
-
// slow or unresponsive, the AbortController fires so the inner work stops
|
|
466
|
-
// before producing Discord side effects. The timer is always cleaned up.
|
|
467
|
-
async function syncDirectory({ target, discordClient, }) {
|
|
468
|
-
const { directory } = target;
|
|
469
|
-
// Skip if a previous timed-out sync for this directory is still running.
|
|
470
|
-
if (activeDirectorySyncs.has(directory)) {
|
|
471
|
-
logger.warn(`[EXTERNAL_SYNC] Skipping ${directory}: previous sync still in flight`);
|
|
472
|
-
return;
|
|
473
|
-
}
|
|
474
|
-
const controller = new AbortController();
|
|
475
|
-
activeDirectorySyncs.set(directory, controller);
|
|
476
|
-
const timeout = setTimeout(() => {
|
|
477
|
-
controller.abort(new Error(`Sync timed out after ${SYNC_PER_DIRECTORY_TIMEOUT_MS}ms for ${directory}`));
|
|
478
|
-
}, SYNC_PER_DIRECTORY_TIMEOUT_MS);
|
|
479
|
-
try {
|
|
480
|
-
await syncDirectoryInner({
|
|
481
|
-
...target,
|
|
482
|
-
discordClient,
|
|
483
|
-
signal: controller.signal,
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
finally {
|
|
487
|
-
clearTimeout(timeout);
|
|
488
|
-
activeDirectorySyncs.delete(directory);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
async function syncDirectoryInner({ directory, channelId, startMs, discordClient, signal, }) {
|
|
492
|
-
const clientResult = await initializeOpencodeForDirectory(directory, {
|
|
493
|
-
channelId,
|
|
494
|
-
});
|
|
495
|
-
if (clientResult instanceof Error) {
|
|
496
|
-
logger.warn(`[EXTERNAL_SYNC] Failed to initialize OpenCode for ${directory}: ${clientResult.message}`);
|
|
497
|
-
return;
|
|
498
|
-
}
|
|
499
|
-
if (signal.aborted)
|
|
500
|
-
return;
|
|
501
|
-
const client = clientResult();
|
|
502
|
-
const sessionsResponse = await client.session.list({
|
|
503
|
-
directory,
|
|
504
|
-
start: startMs,
|
|
505
|
-
limit: EXTERNAL_SYNC_MAX_SESSIONS,
|
|
506
|
-
}).catch((error) => {
|
|
507
|
-
return new Error(`Failed to list sessions for ${directory}`, {
|
|
508
|
-
cause: error,
|
|
509
|
-
});
|
|
510
|
-
});
|
|
511
|
-
if (sessionsResponse instanceof Error) {
|
|
512
|
-
logger.warn(`[EXTERNAL_SYNC] ${sessionsResponse.message}`);
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
if (signal.aborted)
|
|
516
|
-
return;
|
|
517
|
-
const statusesResponse = await client.session.status({
|
|
518
|
-
directory,
|
|
519
|
-
}).catch(() => {
|
|
520
|
-
return null;
|
|
521
|
-
});
|
|
522
|
-
if (statusesResponse?.data) {
|
|
523
|
-
await pulseTypingForBusySessions({
|
|
524
|
-
discordClient,
|
|
525
|
-
statuses: statusesResponse.data,
|
|
526
|
-
}).catch(() => { });
|
|
527
|
-
}
|
|
528
|
-
if (signal.aborted)
|
|
529
|
-
return;
|
|
530
|
-
const sessions = (sessionsResponse.data || []).filter((session) => {
|
|
531
|
-
return isExternalSyncRootSession(session);
|
|
532
|
-
});
|
|
533
|
-
const sorted = sortSessionsByRecency(sessions);
|
|
534
|
-
for (const session of sorted) {
|
|
535
|
-
if (signal.aborted)
|
|
536
|
-
return;
|
|
537
|
-
await syncSessionToThread({
|
|
538
|
-
client,
|
|
539
|
-
discordClient,
|
|
540
|
-
directory,
|
|
541
|
-
channelId,
|
|
542
|
-
sessionId: session.id,
|
|
543
|
-
sessionTitle: session.title,
|
|
544
|
-
signal,
|
|
545
|
-
}).catch((error) => {
|
|
546
|
-
logger.warn(`[EXTERNAL_SYNC] Failed syncing session ${session.id}: ${error instanceof Error ? error.message : String(error)}`);
|
|
547
|
-
void notifyError(error instanceof Error ? error : new Error(String(error)), `External session sync failed for ${session.id}`);
|
|
548
|
-
});
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
async function pollExternalSessions({ discordClient, }) {
|
|
552
|
-
const trackedChannels = await listTrackedTextChannels();
|
|
553
|
-
const directoryTargets = groupTrackedChannelsByDirectory(trackedChannels)
|
|
554
|
-
.filter((t) => {
|
|
555
|
-
return fs.existsSync(t.directory);
|
|
556
|
-
});
|
|
557
|
-
if (directoryTargets.length === 0) {
|
|
558
|
-
return;
|
|
559
|
-
}
|
|
560
|
-
for (const target of directoryTargets) {
|
|
561
|
-
const syncResult = await syncDirectory({
|
|
562
|
-
target,
|
|
563
|
-
discordClient,
|
|
564
|
-
}).catch((error) => {
|
|
565
|
-
return new Error(`Sync failed for ${target.directory}`, { cause: error });
|
|
566
|
-
});
|
|
567
|
-
if (syncResult instanceof Error) {
|
|
568
|
-
logger.warn(`[EXTERNAL_SYNC] ${syncResult.message}`);
|
|
569
|
-
void notifyError(syncResult, `External session sync directory failure: ${target.directory}`);
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
export function startExternalOpencodeSessionSync({ discordClient, }) {
|
|
574
|
-
if (process.env.KIMAKI_VITEST &&
|
|
575
|
-
process.env.KIMAKI_ENABLE_EXTERNAL_OPENCODE_SYNC !== '1') {
|
|
576
|
-
return;
|
|
577
|
-
}
|
|
578
|
-
if (!store.getState().syncEnabled) {
|
|
579
|
-
logger.log('[EXTERNAL_SYNC] Background sync disabled via --disable-sync');
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
if (externalSyncInterval) {
|
|
583
|
-
return;
|
|
584
|
-
}
|
|
585
|
-
let polling = false;
|
|
586
|
-
const runPoll = async () => {
|
|
587
|
-
if (polling) {
|
|
588
|
-
return;
|
|
589
|
-
}
|
|
590
|
-
polling = true;
|
|
591
|
-
const result = await pollExternalSessions({ discordClient }).catch((e) => new Error('External session poll failed', { cause: e }));
|
|
592
|
-
polling = false;
|
|
593
|
-
if (result instanceof Error) {
|
|
594
|
-
logger.warn(`[EXTERNAL_SYNC] ${result.message}`);
|
|
595
|
-
void notifyError(result, 'External session poll top-level failure');
|
|
596
|
-
}
|
|
597
|
-
};
|
|
598
|
-
void runPoll();
|
|
599
|
-
externalSyncInterval = setInterval(() => {
|
|
600
|
-
void runPoll();
|
|
601
|
-
}, EXTERNAL_SYNC_INTERVAL_MS);
|
|
602
|
-
}
|
|
603
|
-
export function stopExternalOpencodeSessionSync() {
|
|
604
|
-
if (!externalSyncInterval) {
|
|
605
|
-
return;
|
|
606
|
-
}
|
|
607
|
-
clearInterval(externalSyncInterval);
|
|
608
|
-
externalSyncInterval = null;
|
|
609
|
-
}
|
|
610
|
-
export const externalOpencodeSyncInternals = {
|
|
611
|
-
getRenderableUserTextParts,
|
|
612
|
-
getSessionThreadName,
|
|
613
|
-
groupTrackedChannelsByDirectory,
|
|
614
|
-
sortSessionsByRecency,
|
|
615
|
-
parseDiscordOriginMetadata,
|
|
616
|
-
getDiscordOriginMetadataFromMessage,
|
|
617
|
-
isLatestUserTurnFromDiscord,
|
|
618
|
-
isInternalOpenCodeUserMessage,
|
|
619
|
-
shouldSkipExternalAssistantMessage,
|
|
620
|
-
};
|