kimaki 1.3.0 → 1.5.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 +13 -6
- package/dist/bot.js +17 -15
- package/dist/bot.js.map +1 -1
- package/dist/btw.e2e.test.js +3 -3
- package/dist/builtin-skills.d.ts +3 -0
- package/dist/builtin-skills.js +29 -0
- package/dist/builtin-skills.js.map +1 -1
- package/dist/builtin-skills.test.js +72 -1
- package/dist/builtin-skills.test.js.map +1 -1
- package/dist/catalog-refresh.e2e.test.js +2 -2
- package/dist/cli/bot.d.ts +1 -1
- package/dist/cli/bot.js +33 -18
- 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 +5 -6
- 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.d.ts +1 -0
- package/dist/coordinator-agents.e2e.test.js +113 -0
- package/dist/coordinator-agents.e2e.test.js.map +1 -0
- package/dist/coordinator-idle.e2e.test.d.ts +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.d.ts +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 +78 -3
- 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 +2 -3
- package/dist/event-loop.js +74 -44
- 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 +47 -12
- 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 +83 -31
- 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 +6 -3
- package/dist/main.js +14 -4
- package/dist/main.js.map +1 -1
- package/dist/mainmast-idle.e2e.test.d.ts +1 -0
- package/dist/mainmast-idle.e2e.test.js +99 -0
- package/dist/mainmast-idle.e2e.test.js.map +1 -0
- package/dist/mainmast-queue.e2e.test.d.ts +1 -0
- package/dist/mainmast-queue.e2e.test.js +244 -0
- package/dist/mainmast-queue.e2e.test.js.map +1 -0
- package/dist/mainmast-warmup.e2e.test.d.ts +1 -0
- package/dist/mainmast-warmup.e2e.test.js +130 -0
- package/dist/mainmast-warmup.e2e.test.js.map +1 -0
- package/dist/mainmast.d.ts +6 -0
- package/dist/mainmast.e2e.test.d.ts +1 -0
- package/dist/mainmast.e2e.test.js +428 -0
- package/dist/mainmast.e2e.test.js.map +1 -0
- package/dist/mainmast.js +156 -0
- package/dist/mainmast.js.map +1 -0
- package/dist/markdown/markdown.test.js +14 -4
- package/dist/markdown/markdown.test.js.map +1 -1
- package/dist/markdown/render-markdown.js +9 -6
- 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 +93 -61
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/mainmast.d.ts +4 -0
- package/dist/plugin/mainmast.js +379 -0
- package/dist/plugin/mainmast.js.map +1 -0
- 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/project.d.ts +1 -1
- package/dist/prompt.d.ts +22 -9
- 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 +3 -3
- 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 +152 -6
- 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 +18 -6
- package/dist/session-events.js +175 -27
- package/dist/session-events.js.map +1 -1
- package/dist/session-ops.e2e.test.js +63 -12
- package/dist/session-ops.e2e.test.js.map +1 -1
- package/dist/sessions.d.ts +44 -21
- package/dist/sessions.js +177 -65
- package/dist/sessions.js.map +1 -1
- package/dist/shell.e2e.test.js +4 -4
- package/dist/slash-commands.js +6 -4
- 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 +2 -1
- 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 +5 -15
- package/dist/system-prompt.js +180 -131
- package/dist/system-prompt.js.map +1 -1
- package/dist/test/generate-log-plugin/index.d.ts +3 -0
- 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 -2
- package/dist/test/harness.js +51 -11
- package/dist/test/harness.js.map +1 -1
- package/dist/test/replay.js +11 -8
- package/dist/test/replay.js.map +1 -1
- package/dist/thread-reducer.d.ts +29 -6
- package/dist/thread-reducer.fixtures.test.js +58 -51
- package/dist/thread-reducer.fixtures.test.js.map +1 -1
- package/dist/thread-reducer.js +109 -50
- package/dist/thread-reducer.js.map +1 -1
- package/dist/thread-reducer.test.js +190 -48
- package/dist/thread-reducer.test.js.map +1 -1
- package/dist/tunnel.d.ts +9 -0
- package/dist/tunnel.js +117 -28
- package/dist/tunnel.js.map +1 -1
- package/dist/tunnel.test.js +81 -5
- package/dist/tunnel.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.d.ts +1 -1
- package/dist/voice.js +72 -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 +11 -5
- package/skills/kimaki-tunnel/SKILL.md +3 -2
- 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 +36 -19
- package/src/btw.e2e.test.ts +3 -3
- package/src/builtin-skills.test.ts +73 -1
- package/src/builtin-skills.ts +33 -0
- package/src/catalog-refresh.e2e.test.ts +2 -2
- package/src/cli/bot.ts +30 -19
- 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 +145 -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 -45
- 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 +44 -11
- 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 +26 -10
- package/src/markdown/markdown.test.ts +15 -4
- package/src/markdown/render-markdown.ts +9 -6
- 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 +86 -59
- 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 +168 -25
- package/src/session-ops.e2e.test.ts +64 -11
- package/src/sessions.ts +217 -67
- package/src/shell.e2e.test.ts +4 -4
- package/src/slash-commands.test.ts +2 -0
- package/src/slash-commands.ts +6 -4
- 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 +190 -134
- package/src/test/generate-log-plugin/index.ts +16 -0
- package/src/test/harness.ts +77 -17
- package/src/test/replay.ts +12 -7
- package/src/thread-reducer.fixtures.test.ts +58 -51
- package/src/thread-reducer.test.ts +199 -49
- package/src/thread-reducer.ts +135 -66
- package/src/tunnel.test.ts +81 -5
- package/src/tunnel.ts +124 -25
- 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 +93 -26
- package/src/working-directory.e2e.test.ts +11 -11
- package/src/message-tool.e2e.test.ts +0 -45
package/dist/plugin/index.js
CHANGED
|
@@ -6,10 +6,27 @@ import path from 'node:path';
|
|
|
6
6
|
import { autostartBot } from "../autostart.js";
|
|
7
7
|
import { readBuiltinSkills } from "../builtin-skills.js";
|
|
8
8
|
import { fileEditTool, recordToolEdits } from "../file-edit-log.js";
|
|
9
|
-
import {
|
|
9
|
+
import { registerCoordinatorRoles, registerWarmup } from "./coordinator.js";
|
|
10
|
+
import { turnContext } from "../system-prompt.js";
|
|
10
11
|
const exec = promisify(execFile);
|
|
11
12
|
const decodeSkill = Schema.decodeUnknownSync(Skill.Info);
|
|
12
13
|
const BRANCH_PREFIX = '[current git branch is ';
|
|
14
|
+
// Prompt metadata key: ms between the latest assistant message and the prompt.
|
|
15
|
+
const GAP_KEY = 'sinceAssistantMs';
|
|
16
|
+
// `3d 4h`, `2h 5m`, `12m 5s`, `40s`: enough to tell a quick follow-up from a return after a break.
|
|
17
|
+
function formatGap(ms) {
|
|
18
|
+
const seconds = Math.floor(ms / 1_000);
|
|
19
|
+
const minutes = Math.floor(seconds / 60);
|
|
20
|
+
const hours = Math.floor(minutes / 60);
|
|
21
|
+
const days = Math.floor(hours / 24);
|
|
22
|
+
if (days > 0)
|
|
23
|
+
return `${days}d ${hours % 24}h`;
|
|
24
|
+
if (hours > 0)
|
|
25
|
+
return `${hours}h ${minutes % 60}m`;
|
|
26
|
+
if (minutes > 0)
|
|
27
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
28
|
+
return `${seconds}s`;
|
|
29
|
+
}
|
|
13
30
|
export default Plugin.define({
|
|
14
31
|
id: 'kimaki',
|
|
15
32
|
async setup(ctx) {
|
|
@@ -26,7 +43,6 @@ export default Plugin.define({
|
|
|
26
43
|
}
|
|
27
44
|
});
|
|
28
45
|
}
|
|
29
|
-
// metadata.kimaki of the session, or of the thread's root for a subagent (`root: false`).
|
|
30
46
|
async function marker(sessionID) {
|
|
31
47
|
const session = await ctx.session.get({ sessionID }).catch(() => null);
|
|
32
48
|
const value = session?.metadata?.['kimaki'];
|
|
@@ -34,80 +50,63 @@ export default Plugin.define({
|
|
|
34
50
|
return null;
|
|
35
51
|
const current = new Map(Object.entries(value));
|
|
36
52
|
if (!session?.parentID)
|
|
37
|
-
return
|
|
53
|
+
return current;
|
|
38
54
|
const parent = await ctx.session.get({ sessionID: session.parentID }).catch(() => null);
|
|
39
55
|
const parentMarker = parent?.metadata?.['kimaki'];
|
|
40
|
-
if (parentMarker && typeof parentMarker === 'object' && !Array.isArray(parentMarker) && parentMarker['threadId'] === current.get('threadId'))
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
return { fields: current, root: true };
|
|
56
|
+
if (parentMarker && typeof parentMarker === 'object' && !Array.isArray(parentMarker) && parentMarker['threadId'] === current.get('threadId'))
|
|
57
|
+
return marker(session.parentID);
|
|
58
|
+
return current;
|
|
45
59
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
editor.add({
|
|
49
|
-
name: MESSAGE_TOOL,
|
|
50
|
-
description: MESSAGE_TOOL_DESCRIPTION,
|
|
51
|
-
input: MESSAGE_TOOL_INPUT,
|
|
52
|
-
options: { codemode: false },
|
|
53
|
-
// Discord renders the call input (thread-reducer.ts); the tool itself does nothing.
|
|
54
|
-
execute: async () => ({ content: 'Message sent to the user.' }),
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
// The git branch reaches the model as a synthetic message saved right before
|
|
58
|
-
// the user prompt, only when it changed. Text in event.system would change the
|
|
59
|
-
// cached prompt prefix on every branch switch. The prompt hook runs before
|
|
60
|
-
// OpenCode admits the prompt, so the synthetic message is admitted first.
|
|
60
|
+
// The prompt hook runs before OpenCode admits the prompt, so changes to its
|
|
61
|
+
// metadata are stored with it and a synthetic message saved here comes first.
|
|
61
62
|
await ctx.session.hook('prompt', async (event) => {
|
|
62
63
|
if (!(await marker(event.sessionID)))
|
|
63
64
|
return;
|
|
64
|
-
const
|
|
65
|
+
const [history, branch] = await Promise.all([
|
|
66
|
+
ctx.session.context({ sessionID: event.sessionID }).catch(() => null),
|
|
67
|
+
exec('git', ['branch', '--show-current'], { cwd: ctx.location.directory, timeout: 5000 }).catch(() => null),
|
|
68
|
+
]);
|
|
69
|
+
if (!history)
|
|
70
|
+
return;
|
|
71
|
+
// The time since the latest reply is stored on the prompt and rendered by
|
|
72
|
+
// shapeRequest: a value computed per request would change the cached prefix.
|
|
73
|
+
const reply = history.findLast((message) => message.type === 'assistant');
|
|
74
|
+
if (reply?.type === 'assistant')
|
|
75
|
+
event.metadata = { ...event.metadata, [GAP_KEY]: Math.max(0, Date.now() - (reply.time.completed ?? reply.time.created)) };
|
|
76
|
+
// The git branch is a synthetic message, only when it changed. Text in
|
|
77
|
+
// event.system would change the cached prompt prefix on every branch switch.
|
|
65
78
|
const name = branch?.stdout.trim();
|
|
66
79
|
if (!name)
|
|
67
80
|
return;
|
|
68
81
|
const text = `${BRANCH_PREFIX}${name}]`;
|
|
69
|
-
const history = await ctx.session.context({ sessionID: event.sessionID }).catch(() => null);
|
|
70
|
-
if (!history)
|
|
71
|
-
return;
|
|
72
82
|
const last = history.findLast((message) => message.type === 'synthetic' && message.text.startsWith(BRANCH_PREFIX));
|
|
73
83
|
if (last?.type === 'synthetic' && last.text === text)
|
|
74
84
|
return;
|
|
75
85
|
await ctx.session.synthetic({ sessionID: event.sessionID, text, delivery: event.delivery, resume: false }).catch(() => undefined);
|
|
76
86
|
});
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
async
|
|
81
|
-
const info = await marker(event.sessionID);
|
|
82
|
-
const messageMode = info?.root === true && info.fields.get('messageTool') === true;
|
|
83
|
-
if (!messageMode)
|
|
84
|
-
delete event.tools[MESSAGE_TOOL];
|
|
85
|
-
else
|
|
86
|
-
event.system.push({ type: 'text', text: MESSAGE_MODE_INSTRUCTIONS });
|
|
87
|
-
return info;
|
|
88
|
-
}
|
|
89
|
-
await ctx.session.hook('compaction', async (event) => {
|
|
90
|
-
await applyMessageMode(event);
|
|
91
|
-
});
|
|
92
|
-
await ctx.session.hook('generate', async (event) => {
|
|
93
|
-
await applyMessageMode(event);
|
|
94
|
-
});
|
|
95
|
-
await ctx.session.hook('context', async (event) => {
|
|
87
|
+
// Runs for every request kind: turns (context), compaction and generate (OpenCode
|
|
88
|
+
// `warming` keep-alive requests). All kinds must get the same system text, tools
|
|
89
|
+
// and messages, or the provider prompt cache misses.
|
|
90
|
+
const shapeRequest = async (event) => {
|
|
96
91
|
// The only prompt change for every session, TUI included. The ID never
|
|
97
92
|
// changes in a session, so the cached prompt prefix stays stable.
|
|
98
93
|
event.system.push({ type: 'text', text: `OpenCode session ID: ${event.sessionID}` });
|
|
99
|
-
|
|
100
|
-
if (!info)
|
|
94
|
+
if (!(await marker(event.sessionID)))
|
|
101
95
|
return;
|
|
102
|
-
// The <discord-user> context of each
|
|
103
|
-
// stored text stays clean for the TUI
|
|
104
|
-
// text on every request: the cached
|
|
96
|
+
// The time since the previous reply and the <discord-user> context of each
|
|
97
|
+
// prompt, built from its metadata, so the stored text stays clean for the TUI
|
|
98
|
+
// and other clients. Same metadata, same text on every request: the cached
|
|
99
|
+
// prompt prefix stays stable.
|
|
105
100
|
for (const message of event.messages) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
101
|
+
if (message.role !== 'user')
|
|
102
|
+
continue;
|
|
103
|
+
const gap = message.metadata?.[GAP_KEY];
|
|
104
|
+
for (const text of [typeof gap === 'number' ? `[${formatGap(gap)} since your last message]` : null, turnContext(message.metadata)]) {
|
|
105
|
+
// TODO: build a new Message once plugins can import OpenCode's Message class;
|
|
106
|
+
// a copy from another module instance may fail its instanceof checks.
|
|
107
|
+
if (text)
|
|
108
|
+
Array.prototype.push.call(message.content, { type: 'text', text });
|
|
109
|
+
}
|
|
111
110
|
}
|
|
112
111
|
// Extra inputs only for the Discord tool line. OpenCode decodes the real
|
|
113
112
|
// inputs with Schema.Struct, which ignores unknown keys.
|
|
@@ -126,25 +125,57 @@ export default Plugin.define({
|
|
|
126
125
|
...properties,
|
|
127
126
|
} };
|
|
128
127
|
}
|
|
129
|
-
}
|
|
128
|
+
};
|
|
129
|
+
await ctx.session.hook('context', shapeRequest);
|
|
130
|
+
await ctx.session.hook('compaction', shapeRequest);
|
|
131
|
+
await ctx.session.hook('generate', shapeRequest);
|
|
132
|
+
// On Windows the shell is often PowerShell or cmd.exe, which cannot run the POSIX
|
|
133
|
+
// prefix, and Git Bash splits a `C:\...` PATH entry on `:`. There shell create.before
|
|
134
|
+
// swaps the prefix for env vars, which every shell inherits (MSYS converts the
|
|
135
|
+
// Windows PATH itself). That hook has no session or tool call, so the prefixed
|
|
136
|
+
// command, unique per tool call, is the key.
|
|
137
|
+
const windowsShells = new Map();
|
|
130
138
|
await ctx.tool.hook('execute.before', async (event) => {
|
|
131
139
|
if (event.tool !== 'shell' || !event.input || typeof event.input !== 'object' || Array.isArray(event.input))
|
|
132
140
|
return;
|
|
133
141
|
const info = await marker(event.sessionID);
|
|
134
|
-
const dataDir = info?.
|
|
135
|
-
const lockPort = info?.
|
|
142
|
+
const dataDir = info?.get('dataDir');
|
|
143
|
+
const lockPort = info?.get('lockPort');
|
|
136
144
|
if (typeof dataDir !== 'string' || typeof lockPort !== 'number')
|
|
137
145
|
return;
|
|
138
146
|
if (!('command' in event.input) || typeof event.input.command !== 'string')
|
|
139
147
|
return;
|
|
140
148
|
const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
141
|
-
|
|
149
|
+
const bin = path.join(dataDir, 'bin');
|
|
150
|
+
const env = { KIMAKI_DATA_DIR: dataDir, KIMAKI_LOCK_PORT: String(lockPort), KIMAKI_TOOL_CALL: `${event.messageID}:${event.id}` };
|
|
151
|
+
const command = event.input.command;
|
|
152
|
+
const prefixed = `export PATH=${quote(bin)}:"$PATH" ${Object.entries(env).map(([key, value]) => `${key}=${quote(value)}`).join(' ')}; ${command}`;
|
|
153
|
+
event.input.command = prefixed;
|
|
154
|
+
if (process.platform === 'win32')
|
|
155
|
+
windowsShells.set(prefixed, { command, bin, env });
|
|
142
156
|
});
|
|
157
|
+
if (process.platform === 'win32') {
|
|
158
|
+
await ctx.shell.hook('create.before', (event) => {
|
|
159
|
+
const pending = windowsShells.get(event.command);
|
|
160
|
+
if (!pending)
|
|
161
|
+
return;
|
|
162
|
+
windowsShells.delete(event.command);
|
|
163
|
+
event.command = pending.command;
|
|
164
|
+
// Spread from process.env, so the key keeps its Windows case (usually `Path`).
|
|
165
|
+
const keys = Object.keys(event.env).filter((key) => key.toUpperCase() === 'PATH');
|
|
166
|
+
for (const key of keys.length > 0 ? keys : ['Path']) {
|
|
167
|
+
event.env[key] = [pending.bin, event.env[key]].filter(Boolean).join(path.delimiter);
|
|
168
|
+
}
|
|
169
|
+
Object.assign(event.env, pending.env);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
await registerCoordinatorRoles(ctx);
|
|
173
|
+
const stopWarmup = await registerWarmup(ctx);
|
|
143
174
|
// File edits feed `kimaki session editors` (v1-compatible JSONL index).
|
|
144
175
|
await ctx.tool.hook('execute.after', async (event) => {
|
|
145
176
|
if (event.status !== 'completed' || !fileEditTool(event.tool))
|
|
146
177
|
return;
|
|
147
|
-
const dataDir = (await marker(event.sessionID))?.
|
|
178
|
+
const dataDir = (await marker(event.sessionID))?.get('dataDir');
|
|
148
179
|
if (typeof dataDir !== 'string')
|
|
149
180
|
return;
|
|
150
181
|
// Plugins stay silent: a failed append only loses one index entry.
|
|
@@ -152,6 +183,7 @@ export default Plugin.define({
|
|
|
152
183
|
if (recorded instanceof Error)
|
|
153
184
|
return;
|
|
154
185
|
});
|
|
186
|
+
return stopWarmup;
|
|
155
187
|
},
|
|
156
188
|
});
|
|
157
189
|
//# sourceMappingURL=index.js.map
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
|