kimaki 1.4.0 → 1.6.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/assets/fonts/Geist-Bold.ttf +0 -0
- package/assets/fonts/Geist-Regular.ttf +0 -0
- package/assets/fonts/GeistMono-Regular.ttf +0 -0
- package/assets/fonts/OFL.txt +92 -0
- package/dist/agent-ui.e2e.test.js +27 -13
- package/dist/agent-ui.e2e.test.js.map +1 -1
- package/dist/agent-ui.js +2 -1
- package/dist/agent-ui.js.map +1 -1
- package/dist/analytics.e2e.test.js +1 -1
- package/dist/analytics.e2e.test.js.map +1 -1
- package/dist/autostart.d.ts +4 -0
- package/dist/autostart.js +55 -10
- package/dist/autostart.js.map +1 -1
- package/dist/bot.d.ts +10 -1
- package/dist/bot.js +14 -6
- package/dist/bot.js.map +1 -1
- package/dist/btw.e2e.test.js +3 -3
- package/dist/builtin-skills.d.ts +1 -1
- package/dist/builtin-skills.js +1 -1
- package/dist/builtin-skills.js.map +1 -1
- package/dist/builtin-skills.test.js +3 -4
- package/dist/builtin-skills.test.js.map +1 -1
- package/dist/catalog-refresh.e2e.test.js +2 -2
- package/dist/cli/bot.js +25 -14
- package/dist/cli/bot.js.map +1 -1
- package/dist/cli/discord.js +32 -6
- package/dist/cli/discord.js.map +1 -1
- package/dist/cli/schedule.js +23 -9
- package/dist/cli/schedule.js.map +1 -1
- package/dist/cli/session.js +37 -12
- package/dist/cli/session.js.map +1 -1
- package/dist/cli/shared.d.ts +5 -3
- package/dist/cli/shared.js +45 -10
- package/dist/cli/shared.js.map +1 -1
- package/dist/cli-discord.e2e.test.js +13 -8
- package/dist/cli-discord.e2e.test.js.map +1 -1
- package/dist/cli-lock.e2e.test.js +87 -20
- package/dist/cli-lock.e2e.test.js.map +1 -1
- package/dist/cli-read.e2e.test.js +18 -9
- package/dist/cli-read.e2e.test.js.map +1 -1
- package/dist/cli-sessions.e2e.test.js +4 -3
- package/dist/cli-sessions.e2e.test.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/preference-commands.d.ts +4 -0
- package/dist/commands/preference-commands.js +38 -4
- package/dist/commands/preference-commands.js.map +1 -1
- package/dist/commands/session-commands.js +11 -8
- package/dist/commands/session-commands.js.map +1 -1
- package/dist/commands/thread-commands.js +94 -24
- package/dist/commands/thread-commands.js.map +1 -1
- package/dist/commands/worktree-commands.d.ts +4 -5
- package/dist/commands/worktree-commands.js +8 -7
- package/dist/commands/worktree-commands.js.map +1 -1
- package/dist/commands.e2e.test.js +25 -21
- package/dist/commands.e2e.test.js.map +1 -1
- package/dist/coordinator-agents.e2e.test.js +135 -0
- package/dist/coordinator-agents.e2e.test.js.map +1 -0
- package/dist/coordinator-idle.e2e.test.js +100 -0
- package/dist/coordinator-idle.e2e.test.js.map +1 -0
- package/dist/coordinator-queue.e2e.test.js +244 -0
- package/dist/coordinator-queue.e2e.test.js.map +1 -0
- package/dist/coordinator-warmup.e2e.test.d.ts +1 -0
- package/dist/coordinator-warmup.e2e.test.js +131 -0
- package/dist/coordinator-warmup.e2e.test.js.map +1 -0
- package/dist/coordinator.d.ts +6 -0
- package/dist/coordinator.e2e.test.d.ts +1 -0
- package/dist/coordinator.e2e.test.js +505 -0
- package/dist/coordinator.e2e.test.js.map +1 -0
- package/dist/coordinator.js +164 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/db.d.ts +75 -0
- package/dist/db.test.js +1 -0
- package/dist/db.test.js.map +1 -1
- package/dist/diagram.d.ts +11 -0
- package/dist/diagram.js +232 -0
- package/dist/diagram.js.map +1 -0
- package/dist/diagram.test.d.ts +1 -0
- package/dist/diagram.test.js +52 -0
- package/dist/diagram.test.js.map +1 -0
- package/dist/duration.js +13 -5
- package/dist/duration.js.map +1 -1
- package/dist/effects.d.ts +6 -1
- package/dist/effects.js +97 -26
- package/dist/effects.js.map +1 -1
- package/dist/event-loop.d.ts +1 -1
- package/dist/event-loop.js +73 -43
- package/dist/event-loop.js.map +1 -1
- package/dist/format-parts.d.ts +21 -4
- package/dist/format-parts.js +40 -23
- package/dist/format-parts.js.map +1 -1
- package/dist/gateway-replay.e2e.test.js +4 -4
- package/dist/harness.e2e.test.js +2 -2
- package/dist/harness.e2e.test.js.map +1 -1
- package/dist/hello-thread.e2e.test.js +56 -5
- package/dist/hello-thread.e2e.test.js.map +1 -1
- package/dist/ingress.js +68 -13
- package/dist/ingress.js.map +1 -1
- package/dist/interaction-context.d.ts +4 -4
- package/dist/interaction-context.js +9 -7
- package/dist/interaction-context.js.map +1 -1
- package/dist/interrupt.e2e.test.js +8 -5
- package/dist/interrupt.e2e.test.js.map +1 -1
- package/dist/legacy.e2e.test.js +1 -1
- package/dist/lock-routes.d.ts +68 -16
- package/dist/lock-routes.js +68 -8
- package/dist/lock-routes.js.map +1 -1
- package/dist/lock-server.d.ts +3 -2
- package/dist/lock-server.js +23 -7
- package/dist/lock-server.js.map +1 -1
- package/dist/main.d.ts +4 -2
- package/dist/main.js +13 -3
- package/dist/main.js.map +1 -1
- package/dist/markdown/markdown.test.js +4 -4
- package/dist/markdown/render-markdown.js +6 -5
- package/dist/markdown/render-markdown.js.map +1 -1
- package/dist/onboarding-cli.e2e.test.js +7 -6
- package/dist/onboarding-cli.e2e.test.js.map +1 -1
- package/dist/onboarding.d.ts +3 -10
- package/dist/onboarding.e2e.test.js +8 -10
- package/dist/onboarding.e2e.test.js.map +1 -1
- package/dist/onboarding.js +14 -24
- package/dist/onboarding.js.map +1 -1
- package/dist/permissions.e2e.test.js +3 -3
- package/dist/plugin/coordinator.d.ts +4 -0
- package/dist/plugin/coordinator.js +389 -0
- package/dist/plugin/coordinator.js.map +1 -0
- package/dist/plugin/index.js +76 -17
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin.e2e.test.js +1 -1
- package/dist/preference-commands.e2e.test.js +103 -24
- package/dist/preference-commands.e2e.test.js.map +1 -1
- package/dist/prompt.d.ts +21 -8
- package/dist/prompt.js +64 -48
- package/dist/prompt.js.map +1 -1
- package/dist/questions.e2e.test.js +13 -13
- package/dist/queue-sources.e2e.test.d.ts +1 -0
- package/dist/queue-sources.e2e.test.js +168 -0
- package/dist/queue-sources.e2e.test.js.map +1 -0
- package/dist/queue.d.ts +9 -1
- package/dist/queue.e2e.test.js +48 -30
- package/dist/queue.e2e.test.js.map +1 -1
- package/dist/queue.js +97 -24
- package/dist/queue.js.map +1 -1
- package/dist/queue.test.d.ts +1 -0
- package/dist/queue.test.js +57 -0
- package/dist/queue.test.js.map +1 -0
- package/dist/remote-send.e2e.test.js +6 -6
- package/dist/remote-send.js +2 -1
- package/dist/remote-send.js.map +1 -1
- package/dist/renderer.e2e.test.js +7 -7
- package/dist/restart.e2e.test.js +2 -2
- package/dist/routines.e2e.test.js +2 -2
- package/dist/scheduler.d.ts +1 -1
- package/dist/scheduler.e2e.test.js +43 -20
- package/dist/scheduler.e2e.test.js.map +1 -1
- package/dist/scheduler.js +4 -2
- package/dist/scheduler.js.map +1 -1
- package/dist/schema-sql.d.ts +1 -1
- package/dist/schema-sql.js +1 -1
- package/dist/schema-sql.js.map +1 -1
- package/dist/schema.d.ts +146 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -1
- package/dist/session-commands.e2e.test.js +36 -11
- package/dist/session-commands.e2e.test.js.map +1 -1
- package/dist/session-events.d.ts +19 -7
- package/dist/session-events.js +166 -22
- package/dist/session-events.js.map +1 -1
- package/dist/session-ops.e2e.test.js +88 -11
- package/dist/session-ops.e2e.test.js.map +1 -1
- package/dist/sessions.d.ts +41 -18
- package/dist/sessions.js +174 -63
- package/dist/sessions.js.map +1 -1
- package/dist/shell.e2e.test.js +4 -4
- package/dist/slash-commands.js +12 -6
- package/dist/slash-commands.js.map +1 -1
- package/dist/slash-commands.test.js +2 -0
- package/dist/slash-commands.test.js.map +1 -1
- package/dist/sleep.e2e.test.js +29 -14
- package/dist/sleep.e2e.test.js.map +1 -1
- package/dist/sleeps.d.ts +1 -0
- package/dist/sleeps.js +21 -3
- package/dist/sleeps.js.map +1 -1
- package/dist/store.d.ts +1 -0
- package/dist/store.js +3 -2
- package/dist/store.js.map +1 -1
- package/dist/system-prompt.d.ts +3 -1
- package/dist/system-prompt.js +138 -64
- package/dist/system-prompt.js.map +1 -1
- package/dist/test/generate-log-plugin/index.js +15 -0
- package/dist/test/generate-log-plugin/index.js.map +1 -0
- package/dist/test/harness.d.ts +20 -1
- package/dist/test/harness.js +51 -10
- package/dist/test/harness.js.map +1 -1
- package/dist/test/replay.js +11 -7
- package/dist/test/replay.js.map +1 -1
- package/dist/thread-reducer.d.ts +29 -3
- package/dist/thread-reducer.fixtures.test.js +58 -51
- package/dist/thread-reducer.fixtures.test.js.map +1 -1
- package/dist/thread-reducer.js +112 -25
- package/dist/thread-reducer.js.map +1 -1
- package/dist/thread-reducer.test.js +197 -24
- package/dist/thread-reducer.test.js.map +1 -1
- package/dist/voice-attachments.e2e.test.js +108 -18
- package/dist/voice-attachments.e2e.test.js.map +1 -1
- package/dist/voice-call.e2e.test.js +9 -9
- package/dist/voice-call.js +6 -6
- package/dist/voice-call.js.map +1 -1
- package/dist/voice-openai.e2e.test.js +59 -23
- package/dist/voice-openai.e2e.test.js.map +1 -1
- package/dist/voice.js +80 -24
- package/dist/voice.js.map +1 -1
- package/dist/working-directory.e2e.test.js +11 -11
- package/dist/working-directory.e2e.test.js.map +1 -1
- package/package.json +12 -6
- package/src/agent-ui.e2e.test.ts +27 -13
- package/src/agent-ui.ts +2 -1
- package/src/analytics.e2e.test.ts +1 -1
- package/src/autostart.ts +55 -10
- package/src/bot.ts +29 -5
- package/src/btw.e2e.test.ts +3 -3
- package/src/builtin-skills.test.ts +3 -4
- package/src/builtin-skills.ts +1 -1
- package/src/catalog-refresh.e2e.test.ts +2 -2
- package/src/cli/bot.ts +23 -14
- package/src/cli/discord.ts +30 -6
- package/src/cli/schedule.ts +23 -9
- package/src/cli/session.ts +35 -12
- package/src/cli/shared.ts +43 -8
- package/src/cli-discord.e2e.test.ts +13 -8
- package/src/cli-lock.e2e.test.ts +88 -20
- package/src/cli-read.e2e.test.ts +17 -8
- package/src/cli-sessions.e2e.test.ts +4 -3
- package/src/cli.ts +2 -0
- package/src/commands/preference-commands.ts +38 -4
- package/src/commands/session-commands.ts +12 -7
- package/src/commands/thread-commands.ts +92 -24
- package/src/commands/worktree-commands.ts +10 -9
- package/src/commands.e2e.test.ts +25 -21
- package/src/coordinator-agents.e2e.test.ts +168 -0
- package/src/coordinator-idle.e2e.test.ts +122 -0
- package/src/coordinator-queue.e2e.test.ts +279 -0
- package/src/coordinator-warmup.e2e.test.ts +158 -0
- package/src/coordinator.e2e.test.ts +545 -0
- package/src/coordinator.ts +168 -0
- package/src/db.test.ts +1 -0
- package/src/diagram.test.ts +56 -0
- package/src/diagram.ts +243 -0
- package/src/duration.ts +13 -5
- package/src/effects.ts +99 -27
- package/src/event-loop.ts +71 -42
- package/src/format-parts.ts +53 -22
- package/src/gateway-replay.e2e.test.ts +4 -4
- package/src/harness.e2e.test.ts +2 -2
- package/src/hello-thread.e2e.test.ts +59 -5
- package/src/ingress.ts +62 -12
- package/src/interaction-context.ts +12 -11
- package/src/interrupt.e2e.test.ts +8 -5
- package/src/legacy.e2e.test.ts +1 -1
- package/src/lock-routes.ts +62 -8
- package/src/lock-server.ts +23 -7
- package/src/main.ts +22 -7
- package/src/markdown/markdown.test.ts +4 -4
- package/src/markdown/render-markdown.ts +6 -5
- package/src/onboarding-cli.e2e.test.ts +7 -6
- package/src/onboarding.e2e.test.ts +8 -10
- package/src/onboarding.ts +13 -29
- package/src/permissions.e2e.test.ts +3 -3
- package/src/plugin/coordinator.ts +401 -0
- package/src/plugin/index.ts +68 -15
- package/src/plugin.e2e.test.ts +1 -1
- package/src/preference-commands.e2e.test.ts +103 -23
- package/src/prompt.ts +87 -43
- package/src/questions.e2e.test.ts +13 -13
- package/src/queue-sources.e2e.test.ts +197 -0
- package/src/queue.e2e.test.ts +48 -30
- package/src/queue.test.ts +59 -0
- package/src/queue.ts +104 -24
- package/src/remote-send.e2e.test.ts +6 -6
- package/src/remote-send.ts +2 -1
- package/src/renderer.e2e.test.ts +7 -7
- package/src/restart.e2e.test.ts +2 -2
- package/src/routines.e2e.test.ts +2 -2
- package/src/scheduler.e2e.test.ts +45 -19
- package/src/scheduler.ts +4 -2
- package/src/schema-sql.ts +1 -1
- package/src/schema.ts +13 -0
- package/src/session-commands.e2e.test.ts +38 -11
- package/src/session-events.ts +160 -21
- package/src/session-ops.e2e.test.ts +90 -10
- package/src/sessions.ts +214 -64
- package/src/shell.e2e.test.ts +4 -4
- package/src/slash-commands.test.ts +2 -0
- package/src/slash-commands.ts +12 -6
- package/src/sleep.e2e.test.ts +30 -13
- package/src/sleeps.ts +20 -3
- package/src/store.ts +5 -2
- package/src/system-prompt.ts +143 -63
- package/src/test/generate-log-plugin/index.ts +16 -0
- package/src/test/harness.ts +77 -14
- package/src/test/replay.ts +12 -6
- package/src/thread-reducer.fixtures.test.ts +58 -51
- package/src/thread-reducer.test.ts +207 -26
- package/src/thread-reducer.ts +138 -37
- package/src/voice-attachments.e2e.test.ts +110 -18
- package/src/voice-call.e2e.test.ts +9 -9
- package/src/voice-call.ts +6 -6
- package/src/voice-openai.e2e.test.ts +64 -24
- package/src/voice.ts +101 -26
- package/src/working-directory.e2e.test.ts +11 -11
- package/dist/message-tool.e2e.test.js +0 -39
- package/dist/message-tool.e2e.test.js.map +0 -1
- package/dist/plugin/read-media.d.ts +0 -23
- package/dist/plugin/read-media.js +0 -72
- package/dist/plugin/read-media.js.map +0 -1
- package/dist/plugin/session-id/index.js +0 -18
- package/dist/plugin/session-id/index.js.map +0 -1
- package/dist/probe-live.tmp.js +0 -82
- package/dist/probe-live.tmp.js.map +0 -1
- package/dist/tasks.e2e.test.js +0 -173
- package/dist/tasks.e2e.test.js.map +0 -1
- /package/dist/{message-tool.e2e.test.d.ts → coordinator-agents.e2e.test.d.ts} +0 -0
- /package/dist/{probe-live.tmp.d.ts → coordinator-idle.e2e.test.d.ts} +0 -0
- /package/dist/{tasks.e2e.test.d.ts → coordinator-queue.e2e.test.d.ts} +0 -0
- /package/dist/{plugin/session-id → test/generate-log-plugin}/index.d.ts +0 -0
|
@@ -55,7 +55,7 @@ test('the bot registers exactly the static and catalog commands in the guild', a
|
|
|
55
55
|
"/clear-queue: Remove queued messages",
|
|
56
56
|
"/command: Run any OpenCode command in this project",
|
|
57
57
|
"/compact: Compact the session context by summarizing the history",
|
|
58
|
-
"/context-usage: Show token usage
|
|
58
|
+
"/context-usage: Show token usage, context window percentage and whether the session is working",
|
|
59
59
|
"/cwd: Show or change this session working directory",
|
|
60
60
|
"/diff: Show the git diff as a shareable URL",
|
|
61
61
|
"/fork: Fork the session from a past user message",
|
|
@@ -74,11 +74,13 @@ test('the bot registers exactly the static and catalog commands in the guild', a
|
|
|
74
74
|
"/queue-command: Queue an OpenCode command to run after the current run finishes",
|
|
75
75
|
"/redo: Redo the previously undone turn",
|
|
76
76
|
"/report-skill: Use when the user wants to report an opencode issue or bug. Collect standard diagnostics, add user-s",
|
|
77
|
+
"/reset-coordinator: Reset the context of this channel: the next message starts a fresh coordinator session",
|
|
77
78
|
"/resume: Resume an existing OpenCode session in a new thread",
|
|
78
79
|
"/review-cmd: review changes [commit|branch|pr], defaults to uncommitted",
|
|
79
80
|
"/routines: List routines, run one now, or delete it",
|
|
80
81
|
"/session-id: Show the OpenCode session ID of this thread and how to open it in OpenCode",
|
|
81
82
|
"/skill: Run any OpenCode skill in this project",
|
|
83
|
+
"/toggle-coordinator: Turn coordinator mode on or off: one long session in this channel that starts threads",
|
|
82
84
|
"/transcription-key: Set the OpenAI or Gemini API key for voice transcription and speech",
|
|
83
85
|
"/undo: Undo the last turn (file changes are kept)",
|
|
84
86
|
"/verbosity: Set what the bot shows in this channel",
|
|
@@ -106,13 +108,13 @@ test('/skill and /command run catalog entries through project autocomplete', asy
|
|
|
106
108
|
--- from: assistant (TestBot)
|
|
107
109
|
-# *using deterministic-provider/deterministic-v2 ⋅ build*
|
|
108
110
|
ok
|
|
109
|
-
-# *
|
|
110
|
-
» **tommy:** /opencode explain skill-marker
|
|
111
|
+
-# *main ⋅ Ns ⋅ deterministic-v2*
|
|
112
|
+
-# » **tommy:** /opencode explain skill-marker
|
|
111
113
|
skill reply
|
|
112
|
-
-# *
|
|
113
|
-
» **tommy:** /hello world
|
|
114
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
115
|
+
-# » **tommy:** /hello world
|
|
114
116
|
command reply
|
|
115
|
-
-# *
|
|
117
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
116
118
|
`);
|
|
117
119
|
});
|
|
118
120
|
function hideIds(text) {
|
|
@@ -150,14 +152,14 @@ test('/<agent>-agent sets the channel agent, or starts a session with a prompt',
|
|
|
150
152
|
--- from: assistant (TestBot)
|
|
151
153
|
-# *using deterministic-provider/deterministic-v2 ⋅ plan*
|
|
152
154
|
plan reply
|
|
153
|
-
-# *
|
|
155
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
154
156
|
`);
|
|
155
157
|
expect(await discord.thread(built.id).text()).toMatchInlineSnapshot(`
|
|
156
158
|
"--- from: assistant (TestBot)
|
|
157
|
-
» **tommy:** Build it build-marker
|
|
159
|
+
-# » **tommy:** Build it build-marker
|
|
158
160
|
-# *using deterministic-provider/deterministic-v2 ⋅ build*
|
|
159
161
|
build reply
|
|
160
|
-
-# *
|
|
162
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2 ⋅ build*"
|
|
161
163
|
`);
|
|
162
164
|
});
|
|
163
165
|
test('/<cmd>-cmd, /<skill>-skill and a `/server:prompt` message run in the thread session', async () => {
|
|
@@ -177,18 +179,18 @@ test('/<cmd>-cmd, /<skill>-skill and a `/server:prompt` message run in the threa
|
|
|
177
179
|
--- from: assistant (TestBot)
|
|
178
180
|
-# *using deterministic-provider/deterministic-v2 ⋅ plan*
|
|
179
181
|
ok
|
|
180
|
-
-# *
|
|
181
|
-
» **tommy:** /hello world
|
|
182
|
+
-# *main ⋅ Ns ⋅ deterministic-v2*
|
|
183
|
+
-# » **tommy:** /hello world
|
|
182
184
|
command reply
|
|
183
|
-
-# *
|
|
184
|
-
» **tommy:** /opencode explain skill-marker
|
|
185
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
186
|
+
-# » **tommy:** /opencode explain skill-marker
|
|
185
187
|
skill reply
|
|
186
|
-
-# *
|
|
188
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
187
189
|
--- from: user (tommy)
|
|
188
190
|
/fake:greet World
|
|
189
191
|
--- from: assistant (TestBot)
|
|
190
192
|
mcp reply
|
|
191
|
-
-# *
|
|
193
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
192
194
|
`);
|
|
193
195
|
const sessionId = bot.store.getState().roots[thread.id];
|
|
194
196
|
const messages = await (await server.client()).message.list({ sessionID: sessionId, type: 'user', order: 'asc' });
|
|
@@ -238,18 +240,20 @@ test('/queue-command queues an OpenCode command after the current run', async ()
|
|
|
238
240
|
});
|
|
239
241
|
await waitForBotMessageContaining({ discord, threadId: thread.id, text: 'queued command reply' });
|
|
240
242
|
await waitForFooter({ discord, threadId: thread.id, count: 2 });
|
|
241
|
-
expect(await discord.thread(thread.id).text()).toMatchInlineSnapshot(`
|
|
243
|
+
expect(await discord.thread(thread.id).text({ showReplies: true })).toMatchInlineSnapshot(`
|
|
242
244
|
"--- from: user (tommy)
|
|
243
245
|
Long run slow-marker
|
|
244
246
|
--- from: assistant (TestBot)
|
|
245
247
|
-# *using deterministic-provider/deterministic-v2 ⋅ plan*
|
|
246
|
-
» **tommy:** /later please
|
|
247
|
-
-#
|
|
248
|
+
-# » **tommy:** /later please
|
|
249
|
+
[reply to TestBot: -# » **tommy:** /later please]
|
|
250
|
+
-# Queued
|
|
248
251
|
slow-done
|
|
249
|
-
-# *
|
|
250
|
-
» **tommy:** /later please
|
|
252
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*
|
|
253
|
+
[reply to TestBot: -# » **tommy:** /later please]
|
|
254
|
+
-# Queued message sent
|
|
251
255
|
queued command reply
|
|
252
|
-
-# *
|
|
256
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
253
257
|
`);
|
|
254
258
|
});
|
|
255
259
|
//# sourceMappingURL=commands.e2e.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.e2e.test.js","sourceRoot":"","sources":["../src/commands.e2e.test.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,oEAAoE;AACpE,0EAA0E;AAE1E,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAG1D,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,2BAA2B,EAC3B,aAAa,EACb,MAAM,GAGP,MAAM,mBAAmB,CAAA;AAE1B,SAAS,KAAK,CAAC,MAAc,EAAE,IAAY;IACzC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;AAClH,CAAC;AAED,MAAM,QAAQ,GAA2B;IACvC,eAAe,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7E,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC;IAClC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC;IACpC,KAAK,CAAC,gBAAgB,EAAE,eAAe,CAAC;IACxC,KAAK,CAAC,cAAc,EAAE,aAAa,CAAC;IACpC,KAAK,CAAC,YAAY,EAAE,WAAW,CAAC;IAChC,KAAK,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;CACjD,CAAA;AAED,IAAI,MAA0B,CAAA;AAC9B,IAAI,IAAc,CAAA;AAClB,IAAI,GAAc,CAAA;AAClB,IAAI,OAAe,CAAA;AAEnB,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,GAAG,WAAW,EAAE,CACtB;IAAA,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClC,uBAAuB,CAAC;YACtB,QAAQ;YACR,QAAQ,EAAE;gBACR,KAAK,EAAE,EAAE,QAAQ,EAAE,2BAA2B,EAAE,WAAW,EAAE,WAAW,EAAE;gBAC1E,KAAK,EAAE,EAAE,QAAQ,EAAE,4BAA4B,EAAE,WAAW,EAAE,YAAY,EAAE;aAC7E;YACD,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE;SACzI,CAAC;QACF,SAAS,EAAE;KACZ,CAAC,CAAA;IACF,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACnI,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IACxB,GAAG,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AACrD,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,GAAG,EAAE,IAAI,EAAE,CAAA;IACjB,MAAM,IAAI,EAAE,IAAI,EAAE,CAAA;IAClB,MAAM,MAAM,EAAE,IAAI,EAAE,CAAA;IACpB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA;IAC3D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC
|
|
1
|
+
{"version":3,"file":"commands.e2e.test.js","sourceRoot":"","sources":["../src/commands.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Agent picks in a coordinator channel: `/<agent>-agent` (with or without a prompt)
|
|
2
|
+
// and a spoken agent start a new thread with that agent, and `kimaki send --agent --model`
|
|
3
|
+
// to the coordinator (workers pass --agent <current_agent>) keeps its agent and model.
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import { afterAll, beforeAll, expect, test } from 'vitest';
|
|
6
|
+
import { send } from "./prompt.js";
|
|
7
|
+
import { TRANSCRIPTION_KEY_MODAL } from "./voice.js";
|
|
8
|
+
import { TEST_USER_ID, isFooter, seedProjectChannel, startFakeGemini, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, textParts, voiceUrl, waitForBotMessageContaining, waitForFooter, warmUp, } from "./test/harness.js";
|
|
9
|
+
function reply(marker, text) {
|
|
10
|
+
return { id: marker, priority: 50, when: { latestUserTextIncludes: marker }, then: { parts: textParts(text) } };
|
|
11
|
+
}
|
|
12
|
+
const matchers = [
|
|
13
|
+
reply('hello-marker', 'hello'),
|
|
14
|
+
reply('slash-agent-marker', 'slash agent ok'),
|
|
15
|
+
reply('voice-agent-marker', 'voice agent ok'),
|
|
16
|
+
reply('empty-agent-marker', 'empty agent ok'),
|
|
17
|
+
reply('worker-note-marker', 'IDLE'),
|
|
18
|
+
];
|
|
19
|
+
let server;
|
|
20
|
+
let twin;
|
|
21
|
+
let bot;
|
|
22
|
+
let gemini;
|
|
23
|
+
const dataDir = tempDataDir();
|
|
24
|
+
// Agent and model of the coordinator session after its first turn.
|
|
25
|
+
let initial;
|
|
26
|
+
beforeAll(async () => {
|
|
27
|
+
;
|
|
28
|
+
[server, twin, gemini] = await Promise.all([
|
|
29
|
+
startOpencodeTestServer({
|
|
30
|
+
matchers,
|
|
31
|
+
models: { 'deterministic-thinker': { name: 'Thinker' } },
|
|
32
|
+
agents: { thinker: { mode: 'primary', model: 'deterministic-provider/deterministic-thinker' } },
|
|
33
|
+
}),
|
|
34
|
+
startTwin(),
|
|
35
|
+
startFakeGemini(),
|
|
36
|
+
]);
|
|
37
|
+
await seedProjectChannel({ dataDir, channelId: twin.channelId, guildId: twin.discord.guildId, directory: server.projectDirectory });
|
|
38
|
+
await warmUp({ server });
|
|
39
|
+
bot = await startTestBot({ dataDir, twin, server, coordinator: true, geminiBaseUrl: gemini.baseUrl });
|
|
40
|
+
const user = twin.discord.channel(twin.channelId).user(TEST_USER_ID);
|
|
41
|
+
const { id } = await user.runSlashCommand({ name: 'transcription-key' });
|
|
42
|
+
await twin.discord.channel(twin.channelId).waitForInteractionAck({ interactionId: id });
|
|
43
|
+
await user.submitModal({ customId: TRANSCRIPTION_KEY_MODAL, fields: [{ customId: 'apikey', value: 'AIza-test-gemini-key' }] });
|
|
44
|
+
await waitForBotMessageContaining({ discord: twin.discord, threadId: twin.channelId, text: 'Gemini API key saved' });
|
|
45
|
+
// The coordinator session exists before any test.
|
|
46
|
+
await user.sendMessage({ content: 'Start hello-marker' });
|
|
47
|
+
await waitForFooter({ discord: twin.discord, threadId: twin.channelId });
|
|
48
|
+
initial = await coordinator();
|
|
49
|
+
}, 60_000);
|
|
50
|
+
afterAll(async () => {
|
|
51
|
+
await bot?.stop();
|
|
52
|
+
await twin?.stop();
|
|
53
|
+
await server?.stop();
|
|
54
|
+
await gemini?.stop();
|
|
55
|
+
fs.rmSync(dataDir, { recursive: true, force: true });
|
|
56
|
+
});
|
|
57
|
+
async function coordinator() {
|
|
58
|
+
const info = await (await server.client()).session.get({ sessionID: bot.store.getState().roots[twin.channelId] });
|
|
59
|
+
return { agent: info.agent, model: info.model?.id };
|
|
60
|
+
}
|
|
61
|
+
async function newThread(start) {
|
|
62
|
+
const { discord, channelId } = twin;
|
|
63
|
+
const before = new Set((await discord.channel(channelId).getThreads()).map((thread) => thread.id));
|
|
64
|
+
await start();
|
|
65
|
+
const thread = await discord.channel(channelId).waitForThread({ timeout: 8_000, predicate: (candidate) => !before.has(candidate.id) });
|
|
66
|
+
await waitForFooter({ discord, threadId: thread.id });
|
|
67
|
+
return thread;
|
|
68
|
+
}
|
|
69
|
+
test('/<agent>-agent with a prompt starts a thread with that agent; the coordinator keeps its agent and model', async () => {
|
|
70
|
+
const thread = await newThread(() => twin.discord.channel(twin.channelId).user(TEST_USER_ID).runSlashCommand({ name: 'thinker-agent', options: [{ name: 'prompt', type: 3, value: 'Think slash-agent-marker' }] }));
|
|
71
|
+
expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
|
|
72
|
+
"--- from: assistant (TestBot)
|
|
73
|
+
-# » **tommy:** Think slash-agent-marker
|
|
74
|
+
-# *using deterministic-provider/deterministic-thinker ⋅ thinker*
|
|
75
|
+
slash agent ok
|
|
76
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-thinker ⋅ thinker*"
|
|
77
|
+
`);
|
|
78
|
+
expect(await coordinator()).toEqual(initial);
|
|
79
|
+
});
|
|
80
|
+
test('/<agent>-agent without a prompt starts an idle thread with that agent; the coordinator keeps its agent and model', async () => {
|
|
81
|
+
const { discord, channelId } = twin;
|
|
82
|
+
const before = new Set((await discord.channel(channelId).getThreads()).map((thread) => thread.id));
|
|
83
|
+
await discord.channel(channelId).user(TEST_USER_ID).runSlashCommand({ name: 'thinker-agent' });
|
|
84
|
+
const thread = await discord.channel(channelId).waitForThread({ timeout: 8_000, predicate: (candidate) => !before.has(candidate.id) });
|
|
85
|
+
await waitForBotMessageContaining({ discord, threadId: thread.id, text: 'Send a message to start working.' });
|
|
86
|
+
expect(await coordinator()).toEqual(initial);
|
|
87
|
+
await discord.thread(thread.id).user(TEST_USER_ID).sendMessage({ content: 'Think empty-agent-marker' });
|
|
88
|
+
await waitForFooter({ discord, threadId: thread.id });
|
|
89
|
+
expect(await discord.thread(thread.id).text()).toMatchInlineSnapshot(`
|
|
90
|
+
"--- from: assistant (TestBot)
|
|
91
|
+
Send a message to start working.
|
|
92
|
+
--- from: user (tommy)
|
|
93
|
+
Think empty-agent-marker
|
|
94
|
+
--- from: assistant (TestBot)
|
|
95
|
+
-# *using deterministic-provider/deterministic-thinker ⋅ thinker*
|
|
96
|
+
empty agent ok
|
|
97
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-thinker ⋅ thinker*"
|
|
98
|
+
`);
|
|
99
|
+
expect(await coordinator()).toEqual(initial);
|
|
100
|
+
});
|
|
101
|
+
test('a spoken agent starts a thread with that agent; the coordinator keeps its agent and model', async () => {
|
|
102
|
+
const thread = await newThread(() => twin.discord.channel(twin.channelId).user(TEST_USER_ID).sendVoiceMessage({ url: voiceUrl({ transcription: 'Think voice-agent-marker', route: 'steer', agent: 'thinker' }) }));
|
|
103
|
+
expect(await twin.discord.thread(thread.id).text()).toMatchInlineSnapshot(`
|
|
104
|
+
"--- from: assistant (TestBot)
|
|
105
|
+
-# » **tommy:** Think voice-agent-marker
|
|
106
|
+
-# *using deterministic-provider/deterministic-thinker ⋅ thinker*
|
|
107
|
+
voice agent ok
|
|
108
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-thinker ⋅ thinker*"
|
|
109
|
+
`);
|
|
110
|
+
expect(await coordinator()).toEqual(initial);
|
|
111
|
+
});
|
|
112
|
+
test('kimaki send --agent --model to the coordinator keeps its agent and model', async () => {
|
|
113
|
+
const { discord, channelId } = twin;
|
|
114
|
+
const footers = (await discord.channel(channelId).getMessages()).filter(isFooter).length;
|
|
115
|
+
const root = bot.store.getState().roots[channelId];
|
|
116
|
+
const sent = await send(bot, { sessionId: root, prompt: 'Done worker-note-marker', agent: 'thinker', model: 'deterministic-provider/deterministic-thinker' });
|
|
117
|
+
if (sent instanceof Error)
|
|
118
|
+
throw sent;
|
|
119
|
+
await waitForBotMessageContaining({ discord, threadId: channelId, text: 'Done worker-note-marker' });
|
|
120
|
+
// IDLE posts nothing; the next coordinator turn still runs on the default agent and model.
|
|
121
|
+
await (await server.client()).session.wait({ sessionID: root });
|
|
122
|
+
await discord.channel(channelId).user(TEST_USER_ID).sendMessage({ content: 'Again hello-marker' });
|
|
123
|
+
await waitForFooter({ discord, threadId: channelId, count: footers + 1 });
|
|
124
|
+
const text = await discord.channel(channelId).text();
|
|
125
|
+
expect(text.slice(text.lastIndexOf('Done worker-note-marker'))).toMatchInlineSnapshot(`
|
|
126
|
+
"Done worker-note-marker
|
|
127
|
+
--- from: user (tommy)
|
|
128
|
+
Again hello-marker
|
|
129
|
+
--- from: assistant (TestBot)
|
|
130
|
+
hello
|
|
131
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
132
|
+
`);
|
|
133
|
+
expect(await coordinator()).toEqual(initial);
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=coordinator-agents.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator-agents.e2e.test.js","sourceRoot":"","sources":["../src/coordinator-agents.e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// The coordinator plugin warmup (plugin/coordinator.ts) with a short window: an idle
|
|
2
|
+
// coordinator with no running threads ends its warmup at the first check and is compacted.
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { afterAll, beforeAll, expect, test } from 'vitest';
|
|
6
|
+
import { TEST_MODEL, TEST_USER_ID, seedProjectChannel, startOpencodeTestServer, startTestBot, startTwin, tempDataDir, textParts, waitFor, waitForFooter, warmUp, } from "./test/harness.js";
|
|
7
|
+
let server;
|
|
8
|
+
let twin;
|
|
9
|
+
let bot;
|
|
10
|
+
const dataDir = tempDataDir();
|
|
11
|
+
// A large context, so the compaction is worth it (plugin/coordinator.ts MIN_COMPACT_TOKENS),
|
|
12
|
+
// in a 1M window like Claude Opus: only 12% of it, far below automatic compaction.
|
|
13
|
+
const bigUsage = { inputTokens: 120_000, outputTokens: 1, totalTokens: 120_001 };
|
|
14
|
+
beforeAll(async () => {
|
|
15
|
+
;
|
|
16
|
+
[server, twin] = await Promise.all([
|
|
17
|
+
startOpencodeTestServer({
|
|
18
|
+
models: { [TEST_MODEL]: { name: TEST_MODEL, limit: { context: 1_000_000, output: 32_000 } } },
|
|
19
|
+
matchers: [
|
|
20
|
+
// OpenCode rejects a summary without the template headings.
|
|
21
|
+
{ id: 'compaction-summary', priority: 900, when: { latestUserTextIncludes: 'You MUST use this format for your response' }, then: { parts: textParts('## Objective\n- Keep coordinating') } },
|
|
22
|
+
{
|
|
23
|
+
id: 'hello',
|
|
24
|
+
priority: 100,
|
|
25
|
+
when: { latestUserTextIncludes: 'idle-marker' },
|
|
26
|
+
then: { parts: [{ type: 'text-start', id: 't' }, { type: 'text-delta', id: 't', delta: 'Hi there.' }, { type: 'text-end', id: 't' }, { type: 'finish', finishReason: 'stop', usage: bigUsage }] },
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
}),
|
|
30
|
+
startTwin(),
|
|
31
|
+
]);
|
|
32
|
+
await seedProjectChannel({ dataDir, channelId: twin.channelId, guildId: twin.discord.guildId, directory: server.projectDirectory });
|
|
33
|
+
await warmUp({ server });
|
|
34
|
+
bot = await startTestBot({ dataDir, twin, server, coordinator: true, warmupTimers: { intervalMs: 1_200, maxMs: 60_000 } });
|
|
35
|
+
}, 60_000);
|
|
36
|
+
afterAll(async () => {
|
|
37
|
+
await bot?.stop();
|
|
38
|
+
await twin?.stop();
|
|
39
|
+
await server?.stop();
|
|
40
|
+
fs.rmSync(dataDir, { recursive: true, force: true });
|
|
41
|
+
});
|
|
42
|
+
test('an idle coordinator gets compacted when its warmup ends', async () => {
|
|
43
|
+
const { discord, channelId } = twin;
|
|
44
|
+
await discord.channel(channelId).user(TEST_USER_ID).sendMessage({ content: 'Hello idle-marker' });
|
|
45
|
+
await waitForFooter({ discord, threadId: channelId });
|
|
46
|
+
const client = await server.client();
|
|
47
|
+
const root = bot.store.getState().roots[channelId];
|
|
48
|
+
await waitFor({
|
|
49
|
+
label: 'compaction of the idle coordinator',
|
|
50
|
+
check: async () => (await client.message.list({ sessionID: root, order: 'desc', limit: 10 })).data.some((message) => message.type === 'compaction') || null,
|
|
51
|
+
});
|
|
52
|
+
expect(await discord.channel(channelId).text()).toMatchInlineSnapshot(`
|
|
53
|
+
"--- from: user (tommy)
|
|
54
|
+
Hello idle-marker
|
|
55
|
+
--- from: assistant (TestBot)
|
|
56
|
+
-# *using deterministic-provider/deterministic-v2 ⋅ build*
|
|
57
|
+
-# Coordinator mode is on: this channel is one session that starts and manages project threads for you. Use /new-session for a thread without it. Turn it off with /toggle-coordinator or start kimaki with \`--coordinator false\`.
|
|
58
|
+
Hi there.
|
|
59
|
+
-# *main ⋅ Ns ⋅ N% ⋅ deterministic-v2*"
|
|
60
|
+
`);
|
|
61
|
+
const messages = await client.message.list({ sessionID: root, order: 'asc', limit: 20 });
|
|
62
|
+
expect(messages.data.map((message) => message.type)).toMatchInlineSnapshot(`
|
|
63
|
+
[
|
|
64
|
+
"synthetic",
|
|
65
|
+
"synthetic",
|
|
66
|
+
"user",
|
|
67
|
+
"assistant",
|
|
68
|
+
"idle",
|
|
69
|
+
"compaction",
|
|
70
|
+
"idle",
|
|
71
|
+
]
|
|
72
|
+
`);
|
|
73
|
+
});
|
|
74
|
+
// OpenCode reloads the plugin when its files change (every Kimaki build or upgrade).
|
|
75
|
+
test('a plugin reload keeps the pending compaction', async () => {
|
|
76
|
+
const { discord, channelId } = twin;
|
|
77
|
+
const client = await server.client();
|
|
78
|
+
const root = bot.store.getState().roots[channelId];
|
|
79
|
+
const compactions = async () => (await client.message.list({ sessionID: root, order: 'desc', limit: 20 })).data.filter((message) => message.type === 'compaction').length;
|
|
80
|
+
expect(await compactions()).toBe(1);
|
|
81
|
+
await discord.channel(channelId).user(TEST_USER_ID).sendMessage({ content: 'Again idle-marker' });
|
|
82
|
+
await waitForFooter({ discord, threadId: channelId, count: 2 });
|
|
83
|
+
fs.appendFileSync(path.join(server.configDir, 'plugins', 'kimaki', 'index.js'), '// reload\n');
|
|
84
|
+
await waitFor({ label: 'compaction after the plugin reload', check: async () => (await compactions()) === 2 || null });
|
|
85
|
+
const messages = await client.message.list({ sessionID: root, order: 'asc', limit: 30 });
|
|
86
|
+
const firstCompaction = messages.data.findIndex((message) => message.type === 'compaction');
|
|
87
|
+
expect(messages.data.slice(firstCompaction + 1).map((message) => message.type)).toMatchInlineSnapshot(`
|
|
88
|
+
[
|
|
89
|
+
"idle",
|
|
90
|
+
"synthetic",
|
|
91
|
+
"synthetic",
|
|
92
|
+
"user",
|
|
93
|
+
"assistant",
|
|
94
|
+
"idle",
|
|
95
|
+
"compaction",
|
|
96
|
+
"idle",
|
|
97
|
+
]
|
|
98
|
+
`);
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=coordinator-idle.e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator-idle.e2e.test.js","sourceRoot":"","sources":["../src/coordinator-idle.e2e.test.ts"],"names":[],"mappings":"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"}
|