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
package/dist/cache-rewrite.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { createTwoFilesPatch, diffLines } from 'diff';
|
|
4
|
-
export const CACHE_REWRITES_DIR = 'cache-rewrites';
|
|
5
|
-
export function countSystemPromptDiffLines({ beforeText, afterText, }) {
|
|
6
|
-
const changes = diffLines(beforeText, afterText);
|
|
7
|
-
let additions = 0;
|
|
8
|
-
let deletions = 0;
|
|
9
|
-
for (const change of changes) {
|
|
10
|
-
if (change.added)
|
|
11
|
-
additions += change.count ?? 0;
|
|
12
|
-
if (change.removed)
|
|
13
|
-
deletions += change.count ?? 0;
|
|
14
|
-
}
|
|
15
|
-
return { additions, deletions };
|
|
16
|
-
}
|
|
17
|
-
export function formatSystemPromptPatch({ beforeText, afterText, sessionId, model, agent, }) {
|
|
18
|
-
const { additions, deletions } = countSystemPromptDiffLines({ beforeText, afterText });
|
|
19
|
-
const patch = createTwoFilesPatch('system-before.txt', 'system-after.txt', beforeText, afterText, undefined, undefined, { context: 3 });
|
|
20
|
-
return [
|
|
21
|
-
`session: ${sessionId}`,
|
|
22
|
-
`model: ${model ?? 'unknown'}`,
|
|
23
|
-
`agent: ${agent ?? 'unknown'}`,
|
|
24
|
-
`system +${additions} -${deletions}`,
|
|
25
|
-
'',
|
|
26
|
-
patch,
|
|
27
|
-
].join('\n');
|
|
28
|
-
}
|
|
29
|
-
export function cacheRewritePatchPath({ dataDir, sessionId, now = Date.now(), }) {
|
|
30
|
-
const safeSessionId = sessionId.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
31
|
-
return path.join(dataDir, CACHE_REWRITES_DIR, `${now}-${safeSessionId}.patch`);
|
|
32
|
-
}
|
|
33
|
-
export async function writeSystemPromptPatch({ dataDir, sessionId, beforeText, afterText, model, agent, now, }) {
|
|
34
|
-
const filePath = cacheRewritePatchPath({ dataDir, sessionId, now });
|
|
35
|
-
const dirPath = path.dirname(filePath);
|
|
36
|
-
await fs.promises.mkdir(dirPath, { recursive: true, mode: 0o700 });
|
|
37
|
-
await fs.promises.writeFile(filePath, formatSystemPromptPatch({ beforeText, afterText, sessionId, model, agent }), { encoding: 'utf8', mode: 0o600 });
|
|
38
|
-
return filePath;
|
|
39
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { afterEach, expect, test } from 'vitest';
|
|
5
|
-
import { countSystemPromptDiffLines, formatSystemPromptPatch, writeSystemPromptPatch, } from './cache-rewrite.js';
|
|
6
|
-
const tempDirs = [];
|
|
7
|
-
afterEach(() => {
|
|
8
|
-
for (const dir of tempDirs.splice(0)) {
|
|
9
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
test('counts added and removed system prompt lines', () => {
|
|
13
|
-
expect(countSystemPromptDiffLines({
|
|
14
|
-
beforeText: 'keep\nold line\n',
|
|
15
|
-
afterText: 'keep\nnew line\nextra\n',
|
|
16
|
-
})).toEqual({ additions: 2, deletions: 1 });
|
|
17
|
-
});
|
|
18
|
-
test('writes a unified patch only for the caller', async () => {
|
|
19
|
-
const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kimaki-cache-rewrite-'));
|
|
20
|
-
tempDirs.push(dataDir);
|
|
21
|
-
const filePath = await writeSystemPromptPatch({
|
|
22
|
-
dataDir,
|
|
23
|
-
sessionId: 'ses_test',
|
|
24
|
-
beforeText: 'alpha\n',
|
|
25
|
-
afterText: 'beta\n',
|
|
26
|
-
model: 'openai/gpt-5',
|
|
27
|
-
agent: 'build',
|
|
28
|
-
now: 1_700_000_000_000,
|
|
29
|
-
});
|
|
30
|
-
expect(path.basename(filePath)).toBe('1700000000000-ses_test.patch');
|
|
31
|
-
const text = fs.readFileSync(filePath, 'utf8');
|
|
32
|
-
expect(text).toContain('session: ses_test');
|
|
33
|
-
expect(text).toContain('system +1 -1');
|
|
34
|
-
expect(text).toContain('-alpha');
|
|
35
|
-
expect(text).toContain('+beta');
|
|
36
|
-
expect(formatSystemPromptPatch({
|
|
37
|
-
beforeText: 'alpha\n',
|
|
38
|
-
afterText: 'beta\n',
|
|
39
|
-
sessionId: 'ses_test',
|
|
40
|
-
})).toContain('--- system-before.txt');
|
|
41
|
-
});
|
|
@@ -1,347 +0,0 @@
|
|
|
1
|
-
// Discord channel and category management.
|
|
2
|
-
// Creates and manages Kimaki project channels (text + voice pairs),
|
|
3
|
-
// extracts channel metadata from topic tags, and ensures category structure.
|
|
4
|
-
import { ChannelType, } from 'discord.js';
|
|
5
|
-
import fs from 'node:fs';
|
|
6
|
-
import path from 'node:path';
|
|
7
|
-
import { getChannelDirectory, setChannelDirectory, findChannelsByDirectory, listTrackedTextChannels, getGuildCategories, setGuildCategoryId, } from './database.js';
|
|
8
|
-
import { getProjectsDir } from './config.js';
|
|
9
|
-
import { execAsync } from './worktrees.js';
|
|
10
|
-
import { createLogger, LogPrefix } from './logger.js';
|
|
11
|
-
import { trackEvent, } from './analytics.js';
|
|
12
|
-
/**
|
|
13
|
-
* Distinct non-default project directories mapped as text channels.
|
|
14
|
-
* Returns null on query failure so callers omit the field instead of
|
|
15
|
-
* emitting a fabricated zero.
|
|
16
|
-
*/
|
|
17
|
-
export async function getUserProjectCount() {
|
|
18
|
-
try {
|
|
19
|
-
const channels = await listTrackedTextChannels();
|
|
20
|
-
const defaultDir = path.resolve(getDefaultKimakiDirectory());
|
|
21
|
-
const dirs = new Set(channels
|
|
22
|
-
.map((row) => path.resolve(row.directory))
|
|
23
|
-
.filter((directory) => directory !== defaultDir));
|
|
24
|
-
return dirs.size;
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
async function trackProjectRegistered({ projectKind, source, }) {
|
|
31
|
-
const userProjectCount = await getUserProjectCount();
|
|
32
|
-
const props = {
|
|
33
|
-
project_kind: projectKind,
|
|
34
|
-
source,
|
|
35
|
-
};
|
|
36
|
-
if (userProjectCount !== null) {
|
|
37
|
-
props.user_project_count = userProjectCount;
|
|
38
|
-
}
|
|
39
|
-
trackEvent('project_registered', props);
|
|
40
|
-
}
|
|
41
|
-
const logger = createLogger(LogPrefix.CHANNEL);
|
|
42
|
-
function defaultCategoryName(kind, botName) {
|
|
43
|
-
const isKimakiBot = botName?.toLowerCase() === 'kimaki';
|
|
44
|
-
if (kind === 'audio') {
|
|
45
|
-
return botName && !isKimakiBot ? `Kimaki Audio ${botName}` : 'Kimaki Audio';
|
|
46
|
-
}
|
|
47
|
-
return botName && !isKimakiBot ? `Kimaki ${botName}` : 'Kimaki';
|
|
48
|
-
}
|
|
49
|
-
function defaultKimakiChannelName({ botName, isGatewayMode, }) {
|
|
50
|
-
if (isGatewayMode || !botName)
|
|
51
|
-
return 'kimaki';
|
|
52
|
-
const sanitized = botName
|
|
53
|
-
.toLowerCase()
|
|
54
|
-
.replace(/[^a-z0-9-]/g, '-')
|
|
55
|
-
.replace(/-+/g, '-')
|
|
56
|
-
.replace(/^-|-$/g, '');
|
|
57
|
-
if (!sanitized || sanitized === 'kimaki')
|
|
58
|
-
return 'kimaki';
|
|
59
|
-
return `kimaki-${sanitized}`.slice(0, 100);
|
|
60
|
-
}
|
|
61
|
-
const categoryEnsures = new Map();
|
|
62
|
-
function ensureCategorySerialized({ key, run, }) {
|
|
63
|
-
const existing = categoryEnsures.get(key);
|
|
64
|
-
if (existing)
|
|
65
|
-
return existing;
|
|
66
|
-
const promise = run().finally(() => {
|
|
67
|
-
if (categoryEnsures.get(key) === promise) {
|
|
68
|
-
categoryEnsures.delete(key);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
categoryEnsures.set(key, promise);
|
|
72
|
-
return promise;
|
|
73
|
-
}
|
|
74
|
-
function isUnknownDiscordChannel(error) {
|
|
75
|
-
const code = error instanceof Error ? Reflect.get(error, 'code') : undefined;
|
|
76
|
-
const status = error instanceof Error ? Reflect.get(error, 'status') : undefined;
|
|
77
|
-
return code === 10003 || status === 404;
|
|
78
|
-
}
|
|
79
|
-
function isCategoryChannel(channel) {
|
|
80
|
-
return channel?.type === ChannelType.GuildCategory;
|
|
81
|
-
}
|
|
82
|
-
async function fetchCategoryById(guild, categoryId) {
|
|
83
|
-
const cached = guild.channels.cache.get(categoryId);
|
|
84
|
-
if (isCategoryChannel(cached))
|
|
85
|
-
return cached;
|
|
86
|
-
try {
|
|
87
|
-
const fetched = await guild.channels.fetch(categoryId);
|
|
88
|
-
return isCategoryChannel(fetched) ? fetched : null;
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
if (isUnknownDiscordChannel(error))
|
|
92
|
-
return null;
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async function adoptParentFromTrackedChannels({ guild, channelType, }) {
|
|
97
|
-
const mappings = await findChannelsByDirectory({ channelType });
|
|
98
|
-
const channels = await guild.channels.fetch();
|
|
99
|
-
for (const row of mappings) {
|
|
100
|
-
if (row.guild_id && row.guild_id !== guild.id)
|
|
101
|
-
continue;
|
|
102
|
-
const channel = channels.get(row.channel_id);
|
|
103
|
-
if (!channel?.parentId)
|
|
104
|
-
continue;
|
|
105
|
-
const parent = await fetchCategoryById(guild, channel.parentId);
|
|
106
|
-
if (parent)
|
|
107
|
-
return parent;
|
|
108
|
-
}
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
async function resolveKimakiCategory({ guild, kind, botName, }) {
|
|
112
|
-
const stored = await getGuildCategories(guild.id);
|
|
113
|
-
const storedId = kind === 'audio' ? stored?.audio_category_id : stored?.category_id;
|
|
114
|
-
if (storedId) {
|
|
115
|
-
const existing = await fetchCategoryById(guild, storedId);
|
|
116
|
-
if (existing)
|
|
117
|
-
return existing;
|
|
118
|
-
}
|
|
119
|
-
const adopted = await adoptParentFromTrackedChannels({
|
|
120
|
-
guild,
|
|
121
|
-
channelType: kind === 'audio' ? 'voice' : 'text',
|
|
122
|
-
});
|
|
123
|
-
if (adopted) {
|
|
124
|
-
await setGuildCategoryId({
|
|
125
|
-
guildId: guild.id,
|
|
126
|
-
kind,
|
|
127
|
-
categoryId: adopted.id,
|
|
128
|
-
});
|
|
129
|
-
return adopted;
|
|
130
|
-
}
|
|
131
|
-
const created = await guild.channels.create({
|
|
132
|
-
name: defaultCategoryName(kind, botName),
|
|
133
|
-
type: ChannelType.GuildCategory,
|
|
134
|
-
});
|
|
135
|
-
await setGuildCategoryId({
|
|
136
|
-
guildId: guild.id,
|
|
137
|
-
kind,
|
|
138
|
-
categoryId: created.id,
|
|
139
|
-
});
|
|
140
|
-
return created;
|
|
141
|
-
}
|
|
142
|
-
export function ensureKimakiCategory(guild, botName) {
|
|
143
|
-
return ensureCategorySerialized({
|
|
144
|
-
key: `${guild.id}:text`,
|
|
145
|
-
run: () => resolveKimakiCategory({ guild, kind: 'text', botName }),
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
export function ensureKimakiAudioCategory(guild, botName) {
|
|
149
|
-
return ensureCategorySerialized({
|
|
150
|
-
key: `${guild.id}:audio`,
|
|
151
|
-
run: () => resolveKimakiCategory({ guild, kind: 'audio', botName }),
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
export async function createProjectChannels({ guild, projectDirectory, botName, enableVoiceChannels = false, analyticsSource = 'cli', }) {
|
|
155
|
-
const baseName = path.basename(projectDirectory);
|
|
156
|
-
const channelName = `${baseName}`
|
|
157
|
-
.toLowerCase()
|
|
158
|
-
.replace(/[^a-z0-9-]/g, '-')
|
|
159
|
-
.slice(0, 100);
|
|
160
|
-
const kimakiCategory = await ensureKimakiCategory(guild, botName);
|
|
161
|
-
const textChannel = await guild.channels.create({
|
|
162
|
-
name: channelName,
|
|
163
|
-
type: ChannelType.GuildText,
|
|
164
|
-
parent: kimakiCategory,
|
|
165
|
-
// Channel configuration is stored in SQLite, not in the topic
|
|
166
|
-
});
|
|
167
|
-
await setChannelDirectory({
|
|
168
|
-
channelId: textChannel.id,
|
|
169
|
-
directory: projectDirectory,
|
|
170
|
-
channelType: 'text',
|
|
171
|
-
guildId: guild.id,
|
|
172
|
-
});
|
|
173
|
-
await trackProjectRegistered({
|
|
174
|
-
projectKind: 'user',
|
|
175
|
-
source: analyticsSource,
|
|
176
|
-
});
|
|
177
|
-
let voiceChannelId = null;
|
|
178
|
-
if (enableVoiceChannels) {
|
|
179
|
-
const kimakiAudioCategory = await ensureKimakiAudioCategory(guild, botName);
|
|
180
|
-
const voiceChannel = await guild.channels.create({
|
|
181
|
-
name: channelName,
|
|
182
|
-
type: ChannelType.GuildVoice,
|
|
183
|
-
parent: kimakiAudioCategory,
|
|
184
|
-
});
|
|
185
|
-
await setChannelDirectory({
|
|
186
|
-
channelId: voiceChannel.id,
|
|
187
|
-
directory: projectDirectory,
|
|
188
|
-
channelType: 'voice',
|
|
189
|
-
guildId: guild.id,
|
|
190
|
-
});
|
|
191
|
-
voiceChannelId = voiceChannel.id;
|
|
192
|
-
}
|
|
193
|
-
return {
|
|
194
|
-
textChannelId: textChannel.id,
|
|
195
|
-
voiceChannelId,
|
|
196
|
-
channelName,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
export async function getChannelsWithDescriptions(guild) {
|
|
200
|
-
const channels = [];
|
|
201
|
-
const textChannels = guild.channels.cache.filter((channel) => channel.type === ChannelType.GuildText);
|
|
202
|
-
for (const channel of textChannels.values()) {
|
|
203
|
-
const description = channel.topic || null;
|
|
204
|
-
// Get channel config from database instead of parsing XML from topic
|
|
205
|
-
const channelConfig = await getChannelDirectory(channel.id);
|
|
206
|
-
channels.push({
|
|
207
|
-
id: channel.id,
|
|
208
|
-
name: channel.name,
|
|
209
|
-
description,
|
|
210
|
-
kimakiDirectory: channelConfig?.directory,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
return channels;
|
|
214
|
-
}
|
|
215
|
-
const DEFAULT_GITIGNORE = `node_modules/
|
|
216
|
-
dist/
|
|
217
|
-
.env
|
|
218
|
-
.env.*
|
|
219
|
-
!.env.example
|
|
220
|
-
.DS_Store
|
|
221
|
-
tmp/
|
|
222
|
-
*.log
|
|
223
|
-
__pycache__/
|
|
224
|
-
*.pyc
|
|
225
|
-
.venv/
|
|
226
|
-
*.egg-info/
|
|
227
|
-
`;
|
|
228
|
-
/** Returns the absolute path to the default kimaki project directory. */
|
|
229
|
-
export function getDefaultKimakiDirectory() {
|
|
230
|
-
return path.join(getProjectsDir(), 'kimaki');
|
|
231
|
-
}
|
|
232
|
-
const DEFAULT_CHANNEL_TOPIC = 'General channel for misc tasks with Kimaki. Not connected to a specific OpenCode project or repository.';
|
|
233
|
-
/**
|
|
234
|
-
* Create (or find) the default "kimaki" channel for general-purpose tasks.
|
|
235
|
-
* Channel name is "kimaki-{botName}" for self-hosted bots, "kimaki" for gateway.
|
|
236
|
-
* Directory is ~/.kimaki/projects/kimaki, git-initialized with a .gitignore.
|
|
237
|
-
*
|
|
238
|
-
* Idempotency: checks the database for an existing channel mapped to the
|
|
239
|
-
* kimaki projects directory. Also scans this machine's category for the
|
|
240
|
-
* exact default channel name as a fallback for channels created before
|
|
241
|
-
* DB mapping existed.
|
|
242
|
-
*/
|
|
243
|
-
export async function createDefaultKimakiChannel({ guild, botName, appId, isGatewayMode, }) {
|
|
244
|
-
const projectDirectory = getDefaultKimakiDirectory();
|
|
245
|
-
// Ensure the default kimaki project directory exists before any DB mapping
|
|
246
|
-
// restoration or git setup. Custom data dirs may not have <dataDir>/projects
|
|
247
|
-
// created yet, and later writes assume the full path is present.
|
|
248
|
-
if (!fs.existsSync(projectDirectory)) {
|
|
249
|
-
fs.mkdirSync(projectDirectory, { recursive: true });
|
|
250
|
-
logger.log(`Created default kimaki directory: ${projectDirectory}`);
|
|
251
|
-
}
|
|
252
|
-
// Hydrate guild channels from API so the cache scan is complete
|
|
253
|
-
try {
|
|
254
|
-
await guild.channels.fetch();
|
|
255
|
-
}
|
|
256
|
-
catch (error) {
|
|
257
|
-
logger.warn(`Could not fetch guild channels for ${guild.name}: ${error instanceof Error ? error.stack : String(error)}`);
|
|
258
|
-
}
|
|
259
|
-
// 1. Check database for existing channel mapped to this directory.
|
|
260
|
-
// Check ALL mappings (not just the first) since the same directory could
|
|
261
|
-
// have stale rows from deleted channels or other guilds.
|
|
262
|
-
const existingMappings = await findChannelsByDirectory({
|
|
263
|
-
directory: projectDirectory,
|
|
264
|
-
channelType: 'text',
|
|
265
|
-
});
|
|
266
|
-
const mappedRow = existingMappings.find((row) => {
|
|
267
|
-
const ch = guild.channels.cache.get(row.channel_id);
|
|
268
|
-
return ch?.type === ChannelType.GuildText;
|
|
269
|
-
});
|
|
270
|
-
if (mappedRow) {
|
|
271
|
-
// Backfill guild_id for rows created before this column existed,
|
|
272
|
-
// so the tombstone check works if the channel is deleted later.
|
|
273
|
-
if (mappedRow.guild_id !== guild.id) {
|
|
274
|
-
await setChannelDirectory({
|
|
275
|
-
channelId: mappedRow.channel_id,
|
|
276
|
-
directory: projectDirectory,
|
|
277
|
-
channelType: 'text',
|
|
278
|
-
guildId: guild.id,
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
logger.log(`Default kimaki channel already exists: ${mappedRow.channel_id}`);
|
|
282
|
-
return null;
|
|
283
|
-
}
|
|
284
|
-
// 1b. If a mapping exists for this guild but the channel is gone from Discord,
|
|
285
|
-
// it was previously created and then deleted. Don't recreate it.
|
|
286
|
-
const staleForThisGuild = existingMappings.find((row) => row.guild_id === guild.id);
|
|
287
|
-
if (staleForThisGuild) {
|
|
288
|
-
logger.log(`Default kimaki channel was previously provisioned for guild ${guild.name} (${guild.id}) as ${staleForThisGuild.channel_id}, but no longer exists. Skipping recreation.`);
|
|
289
|
-
return null;
|
|
290
|
-
}
|
|
291
|
-
// 2. Fallback: detect an existing default channel in THIS machine's group.
|
|
292
|
-
// A #kimaki channel in another machine's group is ignored.
|
|
293
|
-
const channelName = defaultKimakiChannelName({ botName, isGatewayMode });
|
|
294
|
-
const kimakiCategory = await ensureKimakiCategory(guild, botName);
|
|
295
|
-
const existingByName = guild.channels.cache.find((ch) => {
|
|
296
|
-
if (ch.type !== ChannelType.GuildText) {
|
|
297
|
-
return false;
|
|
298
|
-
}
|
|
299
|
-
if (ch.parentId !== kimakiCategory.id) {
|
|
300
|
-
return false;
|
|
301
|
-
}
|
|
302
|
-
return ch.name === channelName;
|
|
303
|
-
});
|
|
304
|
-
if (existingByName) {
|
|
305
|
-
logger.log(`Found existing default kimaki channel by name: ${existingByName.id}. Skipping recreation.`);
|
|
306
|
-
return null;
|
|
307
|
-
}
|
|
308
|
-
// Git init — gracefully skip if git is not installed
|
|
309
|
-
const gitDir = path.join(projectDirectory, '.git');
|
|
310
|
-
if (!fs.existsSync(gitDir)) {
|
|
311
|
-
try {
|
|
312
|
-
await execAsync('git init', { cwd: projectDirectory, timeout: 10_000 });
|
|
313
|
-
logger.log(`Initialized git in: ${projectDirectory}`);
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
logger.warn(`Could not initialize git in ${projectDirectory}: ${error instanceof Error ? error.stack : String(error)}`);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
// Write .gitignore if it doesn't exist
|
|
320
|
-
const gitignorePath = path.join(projectDirectory, '.gitignore');
|
|
321
|
-
if (!fs.existsSync(gitignorePath)) {
|
|
322
|
-
fs.writeFileSync(gitignorePath, DEFAULT_GITIGNORE);
|
|
323
|
-
}
|
|
324
|
-
const textChannel = await guild.channels.create({
|
|
325
|
-
name: channelName,
|
|
326
|
-
type: ChannelType.GuildText,
|
|
327
|
-
parent: kimakiCategory,
|
|
328
|
-
topic: DEFAULT_CHANNEL_TOPIC,
|
|
329
|
-
});
|
|
330
|
-
await setChannelDirectory({
|
|
331
|
-
channelId: textChannel.id,
|
|
332
|
-
directory: projectDirectory,
|
|
333
|
-
channelType: 'text',
|
|
334
|
-
guildId: guild.id,
|
|
335
|
-
});
|
|
336
|
-
await trackProjectRegistered({
|
|
337
|
-
projectKind: 'default',
|
|
338
|
-
source: 'onboarding',
|
|
339
|
-
});
|
|
340
|
-
logger.log(`Created default kimaki channel: #${channelName} (${textChannel.id})`);
|
|
341
|
-
return {
|
|
342
|
-
textChannel,
|
|
343
|
-
textChannelId: textChannel.id,
|
|
344
|
-
channelName,
|
|
345
|
-
projectDirectory,
|
|
346
|
-
};
|
|
347
|
-
}
|
package/dist/cli-commands/bot.js
DELETED
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
// Bot configuration terminal commands for install URLs and Discord presence.
|
|
2
|
-
import { goke } from 'goke';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { note } from '@clack/prompts';
|
|
5
|
-
import YAML from 'yaml';
|
|
6
|
-
import * as errore from 'errore';
|
|
7
|
-
import { Events, ActivityType, Routes } from 'discord.js';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import fs from 'node:fs';
|
|
10
|
-
import { fileURLToPath } from 'node:url';
|
|
11
|
-
import { spawn, execSync } from 'node:child_process';
|
|
12
|
-
import { createLogger, LogPrefix, initLogFile } from '../logger.js';
|
|
13
|
-
import { createDiscordClient, initDatabase, getChannelDirectory, initializeOpencodeForDirectory, createProjectChannels } from '../discord-bot.js';
|
|
14
|
-
import { getBotTokenWithMode, getThreadSession, getThreadIdBySessionId, getSessionEventSnapshot, createScheduledTask, listScheduledTasks, cancelScheduledTask, getScheduledTask, updateScheduledTask, getSessionStartSourcesBySessionIds, deleteChannelDirectoryById, findChannelsByDirectory } from '../database.js';
|
|
15
|
-
import { ShareMarkdown } from '../markdown.js';
|
|
16
|
-
import { parseSessionSearchPattern, findFirstSessionSearchHit, buildSessionSearchSnippet, getPartSearchTexts } from '../session-search.js';
|
|
17
|
-
import { formatWorktreeName, formatAutoWorktreeName } from '../commands/new-worktree.js';
|
|
18
|
-
import { WORKTREE_PREFIX } from '../commands/merge-worktree.js';
|
|
19
|
-
import { buildOpencodeEventLogLine } from '../session-handler/opencode-session-event-log.js';
|
|
20
|
-
import { createDiscordRest } from '../discord-urls.js';
|
|
21
|
-
import { archiveThread, uploadFilesToDiscord, stripMentions } from '../discord-utils.js';
|
|
22
|
-
import { setDataDir, setProjectsDir, getDataDir, getProjectsDir } from '../config.js';
|
|
23
|
-
import { execAsync, validateWorktreeDirectory } from '../worktrees.js';
|
|
24
|
-
import { upgrade, getCurrentVersion } from '../upgrade.js';
|
|
25
|
-
import { getPromptPreview, parseSendAtValue, parseScheduledTaskPayload, serializeScheduledTaskPayload } from '../task-schedule.js';
|
|
26
|
-
import { EXIT_NO_RESTART, formatMemberLookupUnavailableMessage, formatRelativeTime, formatTaskScheduleLine, isDiscordMemberLookupUnavailable, isGuildMemberSearchResult, isThreadChannelType, printDiscordInstallUrlAndExit, resolveBotCredentials, resolveDiscordUserOption, sendDiscordMessageWithOptionalAttachment, } from '../cli-runner.js';
|
|
27
|
-
const cliLogger = createLogger(LogPrefix.CLI);
|
|
28
|
-
const cli = goke();
|
|
29
|
-
cli
|
|
30
|
-
.command('discord-install-url', 'Print the bot install URL and exit')
|
|
31
|
-
.option('--data-dir <path>', 'Data directory for config and database (default: ~/.kimaki)')
|
|
32
|
-
.option('--gateway', 'Print the gateway install URL and create local gateway credentials if missing')
|
|
33
|
-
.option('--gateway-callback-url <url>', 'After gateway OAuth install, redirect to this URL instead of the default success page (appends ?guild_id=<id>)')
|
|
34
|
-
.action(async (options) => {
|
|
35
|
-
try {
|
|
36
|
-
if (options.dataDir) {
|
|
37
|
-
setDataDir(options.dataDir);
|
|
38
|
-
cliLogger.log(`Using data directory: ${getDataDir()}`);
|
|
39
|
-
}
|
|
40
|
-
initLogFile(getDataDir());
|
|
41
|
-
await printDiscordInstallUrlAndExit({
|
|
42
|
-
gateway: options.gateway,
|
|
43
|
-
gatewayCallbackUrl: options.gatewayCallbackUrl,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
cliLogger.error('Error:', error instanceof Error ? error.stack : String(error));
|
|
48
|
-
process.exit(EXIT_NO_RESTART);
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
// ── bot command group ────────────────────────────────────────────────────
|
|
52
|
-
const ACTIVITY_TYPE_MAP = {
|
|
53
|
-
playing: ActivityType.Playing,
|
|
54
|
-
watching: ActivityType.Watching,
|
|
55
|
-
listening: ActivityType.Listening,
|
|
56
|
-
competing: ActivityType.Competing,
|
|
57
|
-
custom: ActivityType.Custom,
|
|
58
|
-
};
|
|
59
|
-
const STATUS_MAP = {
|
|
60
|
-
online: 'online',
|
|
61
|
-
idle: 'idle',
|
|
62
|
-
dnd: 'dnd',
|
|
63
|
-
invisible: 'invisible',
|
|
64
|
-
};
|
|
65
|
-
cli
|
|
66
|
-
.command('bot install-url', 'Print the bot install URL')
|
|
67
|
-
.option('--data-dir <path>', 'Data directory for config and database (default: ~/.kimaki)')
|
|
68
|
-
.option('--gateway', 'Print the gateway install URL and create local gateway credentials if missing')
|
|
69
|
-
.option('--gateway-callback-url <url>', 'After gateway OAuth install, redirect to this URL instead of the default success page (appends ?guild_id=<id>)')
|
|
70
|
-
.action(async (options) => {
|
|
71
|
-
try {
|
|
72
|
-
if (options.dataDir) {
|
|
73
|
-
setDataDir(options.dataDir);
|
|
74
|
-
cliLogger.log(`Using data directory: ${getDataDir()}`);
|
|
75
|
-
}
|
|
76
|
-
initLogFile(getDataDir());
|
|
77
|
-
await printDiscordInstallUrlAndExit({
|
|
78
|
-
gateway: options.gateway,
|
|
79
|
-
gatewayCallbackUrl: options.gatewayCallbackUrl,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
cliLogger.error('Error:', error instanceof Error ? error.stack : String(error));
|
|
84
|
-
process.exit(EXIT_NO_RESTART);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
// Max length for activity name/state — Discord silently truncates beyond 128 chars.
|
|
88
|
-
const MAX_STATUS_TEXT_LENGTH = 128;
|
|
89
|
-
// Login timeout for temporary discord.js clients (10s).
|
|
90
|
-
const BOT_LOGIN_TIMEOUT_MS = 10_000;
|
|
91
|
-
// Wait for gateway opcode 3 websocket frame to flush before destroying the client.
|
|
92
|
-
const PRESENCE_FLUSH_DELAY_MS = 1200;
|
|
93
|
-
/**
|
|
94
|
-
* Create a temporary discord.js client, connect to gateway, run a callback,
|
|
95
|
-
* then tear down. Includes a login timeout so the command doesn't hang forever.
|
|
96
|
-
*/
|
|
97
|
-
async function withTempDiscordClient({ token, onReady, }) {
|
|
98
|
-
const client = await createDiscordClient();
|
|
99
|
-
try {
|
|
100
|
-
await Promise.race([
|
|
101
|
-
new Promise((resolve, reject) => {
|
|
102
|
-
client.once(Events.ClientReady, () => {
|
|
103
|
-
resolve();
|
|
104
|
-
});
|
|
105
|
-
client.once(Events.Error, reject);
|
|
106
|
-
client.login(token).catch(reject);
|
|
107
|
-
}),
|
|
108
|
-
new Promise((_, reject) => {
|
|
109
|
-
setTimeout(() => {
|
|
110
|
-
reject(new Error('Discord login timed out (10s)'));
|
|
111
|
-
}, BOT_LOGIN_TIMEOUT_MS);
|
|
112
|
-
}),
|
|
113
|
-
]);
|
|
114
|
-
if (!client.isReady() || !client.user) {
|
|
115
|
-
throw new Error('Discord client ready but user is missing');
|
|
116
|
-
}
|
|
117
|
-
await onReady(client);
|
|
118
|
-
}
|
|
119
|
-
finally {
|
|
120
|
-
void client.destroy();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
cli
|
|
124
|
-
.command('bot status set <text>', 'Set the bot presence/status in Discord')
|
|
125
|
-
.option('--data-dir <path>', 'Data directory for config and database (default: ~/.kimaki)')
|
|
126
|
-
.option('--type <activityType>', 'Activity type: playing, watching, listening, competing, custom (default: custom)')
|
|
127
|
-
.option('--status <onlineStatus>', 'Online status: online, idle, dnd, invisible (default: online)')
|
|
128
|
-
.action(async (text, options) => {
|
|
129
|
-
try {
|
|
130
|
-
if (options.dataDir) {
|
|
131
|
-
setDataDir(options.dataDir);
|
|
132
|
-
}
|
|
133
|
-
initLogFile(getDataDir());
|
|
134
|
-
await initDatabase();
|
|
135
|
-
const botRow = await getBotTokenWithMode();
|
|
136
|
-
if (!botRow) {
|
|
137
|
-
cliLogger.error('No bot configured. Run `kimaki` first.');
|
|
138
|
-
process.exit(EXIT_NO_RESTART);
|
|
139
|
-
}
|
|
140
|
-
if (botRow.mode === 'gateway') {
|
|
141
|
-
cliLogger.error('Cannot set status in gateway mode — it would change the shared bot status for all users.');
|
|
142
|
-
process.exit(EXIT_NO_RESTART);
|
|
143
|
-
}
|
|
144
|
-
if (text.length > MAX_STATUS_TEXT_LENGTH) {
|
|
145
|
-
cliLogger.error(`Status text too long (${text.length} chars, max ${MAX_STATUS_TEXT_LENGTH}).`);
|
|
146
|
-
process.exit(EXIT_NO_RESTART);
|
|
147
|
-
}
|
|
148
|
-
const activityTypeKey = (options.type || 'custom').toLowerCase();
|
|
149
|
-
const activityType = ACTIVITY_TYPE_MAP[activityTypeKey];
|
|
150
|
-
if (activityType === undefined) {
|
|
151
|
-
cliLogger.error(`Unknown activity type: ${options.type}. Use: playing, watching, listening, competing, custom`);
|
|
152
|
-
process.exit(EXIT_NO_RESTART);
|
|
153
|
-
}
|
|
154
|
-
const statusKey = (options.status || 'online').toLowerCase();
|
|
155
|
-
const onlineStatus = STATUS_MAP[statusKey];
|
|
156
|
-
if (!onlineStatus) {
|
|
157
|
-
cliLogger.error(`Unknown status: ${options.status}. Use: online, idle, dnd, invisible`);
|
|
158
|
-
process.exit(EXIT_NO_RESTART);
|
|
159
|
-
}
|
|
160
|
-
cliLogger.log('Connecting to Discord...');
|
|
161
|
-
await withTempDiscordClient({
|
|
162
|
-
token: botRow.token,
|
|
163
|
-
onReady: async (client) => {
|
|
164
|
-
// For custom activity type, use state field (shows as the status text).
|
|
165
|
-
// For other types, use name field (shows as "Playing X", "Watching X", etc).
|
|
166
|
-
const activity = activityType === ActivityType.Custom
|
|
167
|
-
? { name: 'Custom Status', type: activityType, state: text }
|
|
168
|
-
: { name: text, type: activityType };
|
|
169
|
-
client.user.setPresence({
|
|
170
|
-
activities: [activity],
|
|
171
|
-
status: onlineStatus,
|
|
172
|
-
});
|
|
173
|
-
// setPresence queues a gateway opcode 3 over websocket.
|
|
174
|
-
// Wait so the frame flushes before we tear down the connection.
|
|
175
|
-
await new Promise((resolve) => {
|
|
176
|
-
setTimeout(resolve, PRESENCE_FLUSH_DELAY_MS);
|
|
177
|
-
});
|
|
178
|
-
cliLogger.log(`Status set: ${activityTypeKey === 'custom' ? text : `${activityTypeKey} ${text}`} (${statusKey})`);
|
|
179
|
-
},
|
|
180
|
-
});
|
|
181
|
-
process.exit(0);
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
cliLogger.error('Error:', error instanceof Error ? error.stack : String(error));
|
|
185
|
-
process.exit(EXIT_NO_RESTART);
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
cli
|
|
189
|
-
.command('bot token', 'Print the bot token for use in CI and automation (KIMAKI_BOT_TOKEN)')
|
|
190
|
-
.option('--data-dir <path>', 'Data directory for config and database (default: ~/.kimaki)')
|
|
191
|
-
.action(async (options) => {
|
|
192
|
-
try {
|
|
193
|
-
if (options.dataDir) {
|
|
194
|
-
setDataDir(options.dataDir);
|
|
195
|
-
}
|
|
196
|
-
initLogFile(getDataDir());
|
|
197
|
-
await initDatabase();
|
|
198
|
-
const botRow = await getBotTokenWithMode();
|
|
199
|
-
if (!botRow) {
|
|
200
|
-
cliLogger.error('No bot configured. Run `kimaki` first.');
|
|
201
|
-
process.exit(EXIT_NO_RESTART);
|
|
202
|
-
}
|
|
203
|
-
// Print the token to stdout so it can be captured by scripts.
|
|
204
|
-
// Use process.stdout.write to avoid extra newline from console.log
|
|
205
|
-
// when piping to other commands.
|
|
206
|
-
process.stdout.write(botRow.token + '\n');
|
|
207
|
-
process.exit(0);
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
cliLogger.error('Error:', error instanceof Error ? error.stack : String(error));
|
|
211
|
-
process.exit(EXIT_NO_RESTART);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
cli
|
|
215
|
-
.command('bot status clear', 'Clear the bot presence/status')
|
|
216
|
-
.option('--data-dir <path>', 'Data directory for config and database (default: ~/.kimaki)')
|
|
217
|
-
.action(async (options) => {
|
|
218
|
-
try {
|
|
219
|
-
if (options.dataDir) {
|
|
220
|
-
setDataDir(options.dataDir);
|
|
221
|
-
}
|
|
222
|
-
initLogFile(getDataDir());
|
|
223
|
-
await initDatabase();
|
|
224
|
-
const botRow = await getBotTokenWithMode();
|
|
225
|
-
if (!botRow) {
|
|
226
|
-
cliLogger.error('No bot configured. Run `kimaki` first.');
|
|
227
|
-
process.exit(EXIT_NO_RESTART);
|
|
228
|
-
}
|
|
229
|
-
if (botRow.mode === 'gateway') {
|
|
230
|
-
cliLogger.error('Cannot clear status in gateway mode — it would change the shared bot status for all users.');
|
|
231
|
-
process.exit(EXIT_NO_RESTART);
|
|
232
|
-
}
|
|
233
|
-
cliLogger.log('Connecting to Discord...');
|
|
234
|
-
await withTempDiscordClient({
|
|
235
|
-
token: botRow.token,
|
|
236
|
-
onReady: async (client) => {
|
|
237
|
-
client.user.setPresence({
|
|
238
|
-
activities: [],
|
|
239
|
-
status: 'online',
|
|
240
|
-
});
|
|
241
|
-
await new Promise((resolve) => {
|
|
242
|
-
setTimeout(resolve, PRESENCE_FLUSH_DELAY_MS);
|
|
243
|
-
});
|
|
244
|
-
cliLogger.log('Status cleared');
|
|
245
|
-
},
|
|
246
|
-
});
|
|
247
|
-
process.exit(0);
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
cliLogger.error('Error:', error instanceof Error ? error.stack : String(error));
|
|
251
|
-
process.exit(EXIT_NO_RESTART);
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
export default cli;
|