kern-ai 0.6.3 → 0.8.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/README.md +24 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +75 -58
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/import.d.ts +2 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +193 -0
- package/dist/import.js.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +2 -40
- package/dist/init.js.map +1 -1
- package/dist/interfaces/slack.d.ts.map +1 -1
- package/dist/interfaces/slack.js +6 -3
- package/dist/interfaces/slack.js.map +1 -1
- package/dist/interfaces/telegram.d.ts.map +1 -1
- package/dist/interfaces/telegram.js +45 -6
- package/dist/interfaces/telegram.js.map +1 -1
- package/dist/kernel.d.ts +2 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +36 -0
- package/dist/kernel.js.map +1 -0
- package/dist/log.d.ts +2 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +16 -0
- package/dist/log.js.map +1 -0
- package/dist/queue.d.ts +25 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +72 -0
- package/dist/queue.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +69 -18
- package/dist/runtime.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +8 -0
- package/dist/tui.js.map +1 -1
- package/package.json +4 -2
- package/templates/AGENTS.md +45 -0
- package/{KERN.md → templates/KERN.md} +11 -1
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# kern
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
AI agents built for coworking.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
One brain across every channel. Your agent sits in Slack channels, Telegram DMs, and the terminal. It knows who's talking, reads the room, and remembers everything. Humans and agents, same channels, same conversation.
|
|
6
6
|
|
|
7
7
|
## Why kern
|
|
8
8
|
|
|
@@ -65,10 +65,12 @@ kern start [name|path] # start agents in background
|
|
|
65
65
|
kern stop [name] # stop agents
|
|
66
66
|
kern restart [name] # restart agents
|
|
67
67
|
kern tui [name] # interactive chat
|
|
68
|
+
kern logs [name] # tail agent logs
|
|
68
69
|
kern list # show all agents
|
|
69
70
|
kern remove <name> # unregister an agent
|
|
70
71
|
kern backup <name> # backup agent to .tar.gz
|
|
71
72
|
kern restore <file> # restore agent from backup
|
|
73
|
+
kern import opencode <name> # import session from OpenCode
|
|
72
74
|
```
|
|
73
75
|
|
|
74
76
|
Agents auto-register when you init, start, or run them. `kern list` shows every agent with its running state.
|
|
@@ -98,6 +100,26 @@ Set `SLACK_BOT_TOKEN` and `SLACK_APP_TOKEN` in `.kern/.env`. Uses Socket Mode
|
|
|
98
100
|
|
|
99
101
|
Invite the bot to channels where it should listen.
|
|
100
102
|
|
|
103
|
+
## Heartbeat
|
|
104
|
+
|
|
105
|
+
Kern sends a periodic `[heartbeat]` to the agent. The agent reviews notes, updates knowledge files, and messages the operator if something needs attention. Visible in the TUI only — Telegram and Slack never see it.
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"heartbeatInterval": 60
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Interval in minutes. Default 60 (1 hour). Set to 0 to disable.
|
|
114
|
+
|
|
115
|
+
## Logging
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
kern logs [name] # tail agent logs
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Structured, colored logs for queue, runtime, interfaces, and server. Logs stored in `.kern/logs/kern.log`.
|
|
122
|
+
|
|
101
123
|
## Configuration
|
|
102
124
|
|
|
103
125
|
`.kern/config.json`:
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAgBA,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAmLhF"}
|
package/dist/app.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Runtime } from "./runtime.js";
|
|
2
|
+
import { updateKernel } from "./kernel.js";
|
|
2
3
|
import { TelegramInterface } from "./interfaces/telegram.js";
|
|
3
4
|
import { SlackInterface } from "./interfaces/slack.js";
|
|
4
|
-
import { CliInterface
|
|
5
|
+
import { CliInterface } from "./interfaces/cli.js";
|
|
5
6
|
import { loadConfig } from "./config.js";
|
|
6
7
|
import { readFile } from "fs/promises";
|
|
7
8
|
import { join, basename } from "path";
|
|
@@ -9,7 +10,11 @@ import { registerAgent, setPort } from "./registry.js";
|
|
|
9
10
|
import { AgentServer } from "./server.js";
|
|
10
11
|
import { PairingManager } from "./pairing.js";
|
|
11
12
|
import { setMessageSender } from "./tools/message.js";
|
|
13
|
+
import { MessageQueue } from "./queue.js";
|
|
14
|
+
import { log } from "./log.js";
|
|
12
15
|
export async function startApp(agentDir, forceCli = false) {
|
|
16
|
+
// Update kernel if newer version available
|
|
17
|
+
await updateKernel(agentDir);
|
|
13
18
|
const config = await loadConfig(agentDir);
|
|
14
19
|
const runtime = new Runtime(agentDir);
|
|
15
20
|
await runtime.init();
|
|
@@ -21,23 +26,52 @@ export async function startApp(agentDir, forceCli = false) {
|
|
|
21
26
|
await pairing.load();
|
|
22
27
|
// Pass pairing manager to runtime so kern tool can use it
|
|
23
28
|
runtime.setPairingManager(pairing);
|
|
29
|
+
// Log + start
|
|
30
|
+
let version = "unknown";
|
|
31
|
+
try {
|
|
32
|
+
const pkg = JSON.parse(await readFile(join(import.meta.dirname, "..", "package.json"), "utf-8"));
|
|
33
|
+
version = pkg.version;
|
|
34
|
+
}
|
|
35
|
+
catch { }
|
|
36
|
+
const hb = config.heartbeatInterval > 0 ? `, heartbeat:${config.heartbeatInterval}min` : "";
|
|
37
|
+
log("kern", `starting ${agentName} — v${version}, ${config.model}, tools:${config.toolScope}${hb}`);
|
|
24
38
|
// Start HTTP server
|
|
25
39
|
const server = new AgentServer();
|
|
26
|
-
//
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
// Message queue — serializes messages, same-channel injection
|
|
41
|
+
const queue = new MessageQueue();
|
|
42
|
+
queue.setHandler(async (msg, getPendingMessages) => {
|
|
43
|
+
const time = new Date().toISOString();
|
|
44
|
+
const context = `[via ${msg.interface}${msg.channel ? `, ${msg.channel}` : ""}, user: ${msg.userId}, time: ${time}]\n${msg.text}`;
|
|
45
|
+
// Broadcast incoming to TUI
|
|
46
|
+
if (!msg.isHeartbeat) {
|
|
47
|
+
server.broadcast({
|
|
48
|
+
type: "incoming",
|
|
49
|
+
text: msg.text,
|
|
50
|
+
fromInterface: msg.interface,
|
|
51
|
+
fromUserId: msg.userId,
|
|
52
|
+
fromChannel: msg.channel,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
// Set up prepareStep injection for same-channel messages
|
|
56
|
+
runtime.setPendingInjections(() => {
|
|
57
|
+
const pending = getPendingMessages();
|
|
58
|
+
return pending.map((p) => ({
|
|
59
|
+
role: "user",
|
|
60
|
+
content: `[via ${p.interface}${p.channel ? `, ${p.channel}` : ""}, user: ${p.userId}, time: ${new Date().toISOString()}]\n${p.text}`,
|
|
61
|
+
}));
|
|
35
62
|
});
|
|
36
|
-
|
|
63
|
+
return runtime.handleMessage(context, (event) => {
|
|
37
64
|
server.broadcast(event);
|
|
65
|
+
msg.onEvent?.(event);
|
|
38
66
|
});
|
|
67
|
+
});
|
|
68
|
+
// Helper to enqueue from any interface
|
|
69
|
+
const enqueueMessage = (text, userId, iface, channel, onEvent) => {
|
|
70
|
+
return queue.enqueue({ text, userId, interface: iface, channel }, onEvent);
|
|
39
71
|
};
|
|
40
|
-
server.setMessageHandler(
|
|
72
|
+
server.setMessageHandler(async (text, userId, iface, channel) => {
|
|
73
|
+
await enqueueMessage(text, userId, iface, channel);
|
|
74
|
+
});
|
|
41
75
|
const port = await server.start();
|
|
42
76
|
await setPort(agentName, port);
|
|
43
77
|
// Start Telegram if configured
|
|
@@ -47,18 +81,7 @@ export async function startApp(agentDir, forceCli = false) {
|
|
|
47
81
|
telegramBot = new TelegramInterface(telegramToken, pairing);
|
|
48
82
|
await telegramBot.start({
|
|
49
83
|
onMessage: async (msg, onEvent) => {
|
|
50
|
-
|
|
51
|
-
server.broadcast({
|
|
52
|
-
type: "incoming",
|
|
53
|
-
text: msg.text,
|
|
54
|
-
fromInterface: msg.interface,
|
|
55
|
-
fromUserId: msg.userId,
|
|
56
|
-
fromChannel: msg.channel,
|
|
57
|
-
});
|
|
58
|
-
return runtime.handleMessage(context, (event) => {
|
|
59
|
-
onEvent(event);
|
|
60
|
-
server.broadcast(event);
|
|
61
|
-
});
|
|
84
|
+
return enqueueMessage(msg.text, msg.userId, msg.interface, msg.channel || "", onEvent);
|
|
62
85
|
},
|
|
63
86
|
});
|
|
64
87
|
}
|
|
@@ -70,18 +93,7 @@ export async function startApp(agentDir, forceCli = false) {
|
|
|
70
93
|
slackBot = new SlackInterface(slackBotToken, slackAppToken, pairing);
|
|
71
94
|
await slackBot.start({
|
|
72
95
|
onMessage: async (msg, onEvent) => {
|
|
73
|
-
|
|
74
|
-
server.broadcast({
|
|
75
|
-
type: "incoming",
|
|
76
|
-
text: msg.text,
|
|
77
|
-
fromInterface: msg.interface,
|
|
78
|
-
fromUserId: msg.userId,
|
|
79
|
-
fromChannel: msg.channel,
|
|
80
|
-
});
|
|
81
|
-
return runtime.handleMessage(context, (event) => {
|
|
82
|
-
onEvent(event);
|
|
83
|
-
server.broadcast(event);
|
|
84
|
-
});
|
|
96
|
+
return enqueueMessage(msg.text, msg.userId, msg.interface, msg.channel || "");
|
|
85
97
|
},
|
|
86
98
|
});
|
|
87
99
|
}
|
|
@@ -115,42 +127,47 @@ export async function startApp(agentDir, forceCli = false) {
|
|
|
115
127
|
}
|
|
116
128
|
return false;
|
|
117
129
|
});
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
let version = "unknown";
|
|
121
|
-
try {
|
|
122
|
-
const pkg = JSON.parse(await readFile(join(import.meta.dirname, "..", "package.json"), "utf-8"));
|
|
123
|
-
version = pkg.version;
|
|
124
|
-
}
|
|
125
|
-
catch { }
|
|
126
|
-
w("");
|
|
127
|
-
w(` ${bold("kern")} ${dim("v" + version)} ${cyan(agentDir)}`);
|
|
128
|
-
w(` ${"model"} ${dim(config.provider + "/" + config.model)}`);
|
|
129
|
-
w(` ${"session"} ${dim(runtime.getSessionId() || "new")}`);
|
|
130
|
-
w(` ${"tools"} ${dim(config.toolScope)}`);
|
|
131
|
-
w(` ${"port"} ${dim(String(port))}`);
|
|
132
|
-
w(` ${dim("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}`);
|
|
133
|
-
w("");
|
|
134
|
-
// If forceCli, start CLI interface connected to same runtime
|
|
130
|
+
log("kern", `started ${agentName}`);
|
|
131
|
+
// If forceCli, start CLI interface connected to same runtime (also goes through queue)
|
|
135
132
|
if (forceCli) {
|
|
136
133
|
const cli = new CliInterface();
|
|
137
134
|
await cli.start({
|
|
138
135
|
onMessage: async (msg, onEvent) => {
|
|
139
|
-
|
|
140
|
-
return runtime.handleMessage(context, (event) => {
|
|
141
|
-
onEvent(event);
|
|
142
|
-
server.broadcast(event);
|
|
143
|
-
});
|
|
136
|
+
return enqueueMessage(msg.text, msg.userId, msg.interface, msg.channel || "");
|
|
144
137
|
},
|
|
145
138
|
history: runtime.getMessages(),
|
|
146
139
|
});
|
|
147
140
|
}
|
|
141
|
+
// Heartbeat — goes through queue as low priority
|
|
142
|
+
if (config.heartbeatInterval > 0) {
|
|
143
|
+
const intervalMs = config.heartbeatInterval * 60 * 1000;
|
|
144
|
+
setInterval(async () => {
|
|
145
|
+
try {
|
|
146
|
+
server.broadcast({
|
|
147
|
+
type: "heartbeat",
|
|
148
|
+
text: "[heartbeat]",
|
|
149
|
+
});
|
|
150
|
+
await queue.enqueue({
|
|
151
|
+
text: "[heartbeat]",
|
|
152
|
+
userId: "system",
|
|
153
|
+
interface: "system",
|
|
154
|
+
channel: "heartbeat",
|
|
155
|
+
isHeartbeat: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
process.stderr.write(`[kern] heartbeat error: ${e.message}\n`);
|
|
160
|
+
}
|
|
161
|
+
}, intervalMs);
|
|
162
|
+
}
|
|
148
163
|
// Graceful shutdown
|
|
149
164
|
process.on("SIGTERM", () => {
|
|
165
|
+
log("kern", `stopped ${agentName}`);
|
|
150
166
|
server.stop();
|
|
151
167
|
process.exit(0);
|
|
152
168
|
});
|
|
153
169
|
process.on("SIGINT", () => {
|
|
170
|
+
log("kern", `stopped ${agentName}`);
|
|
154
171
|
server.stop();
|
|
155
172
|
process.exit(0);
|
|
156
173
|
});
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -5,8 +5,10 @@ export interface KernConfig {
|
|
|
5
5
|
toolScope: ToolScope;
|
|
6
6
|
maxSteps: number;
|
|
7
7
|
maxContextTokens: number;
|
|
8
|
+
heartbeatInterval: number;
|
|
8
9
|
telegram?: {
|
|
9
10
|
allowedUsers?: number[];
|
|
11
|
+
showTools?: boolean;
|
|
10
12
|
};
|
|
11
13
|
}
|
|
12
14
|
export declare function getToolsForScope(scope: ToolScope): string[];
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAiBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAE3D;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsBtE;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA6C5F"}
|
package/dist/config.js
CHANGED
|
@@ -13,6 +13,7 @@ const defaults = {
|
|
|
13
13
|
toolScope: "full",
|
|
14
14
|
maxSteps: 30,
|
|
15
15
|
maxContextTokens: 40000,
|
|
16
|
+
heartbeatInterval: 60,
|
|
16
17
|
};
|
|
17
18
|
export function getToolsForScope(scope) {
|
|
18
19
|
return TOOL_SCOPES[scope] || TOOL_SCOPES.full;
|
|
@@ -53,7 +54,7 @@ export async function loadSystemPrompt(agentDir, config) {
|
|
|
53
54
|
}
|
|
54
55
|
// Load KERN.md (runtime context) — from agent dir first, fall back to kern package
|
|
55
56
|
const kernMdAgent = join(agentDir, "KERN.md");
|
|
56
|
-
const kernMdPackage = join(import.meta.dirname, "..", "KERN.md");
|
|
57
|
+
const kernMdPackage = join(import.meta.dirname, "..", "templates", "KERN.md");
|
|
57
58
|
if (existsSync(kernMdAgent)) {
|
|
58
59
|
parts.push(await readFile(kernMdAgent, "utf-8"));
|
|
59
60
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/import.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"AAsBA,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsNtE"}
|
package/dist/import.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
5
|
+
import { homedir } from "os";
|
|
6
|
+
import { findAgent } from "./registry.js";
|
|
7
|
+
export async function importOpenCode(agentName) {
|
|
8
|
+
if (!agentName) {
|
|
9
|
+
console.error("Usage: kern import opencode <agent>");
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
let agent = await findAgent(agentName);
|
|
13
|
+
if (!agent) {
|
|
14
|
+
// Try as a path
|
|
15
|
+
const { resolve } = await import("path");
|
|
16
|
+
const dir = resolve(agentName);
|
|
17
|
+
if (existsSync(dir) && (existsSync(join(dir, ".kern")) || existsSync(join(dir, "AGENTS.md")))) {
|
|
18
|
+
const { basename } = await import("path");
|
|
19
|
+
agent = { name: basename(dir), path: dir, addedAt: new Date().toISOString() };
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(`Agent not found: ${agentName}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Find OpenCode db
|
|
27
|
+
const dbPath = join(homedir(), ".local", "share", "opencode", "opencode.db");
|
|
28
|
+
if (!existsSync(dbPath)) {
|
|
29
|
+
console.error(`OpenCode database not found at ${dbPath}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const db = new Database(dbPath, { readonly: true });
|
|
33
|
+
// Find project by worktree path
|
|
34
|
+
const project = db.prepare("SELECT id FROM project WHERE worktree = ?").get(agent.path);
|
|
35
|
+
if (!project) {
|
|
36
|
+
console.error(`No OpenCode project found for ${agent.path}`);
|
|
37
|
+
db.close();
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
// Get sessions
|
|
41
|
+
const sessions = db.prepare("SELECT id, title, time_created, time_updated FROM session WHERE project_id = ? ORDER BY time_updated DESC").all(project.id);
|
|
42
|
+
if (sessions.length === 0) {
|
|
43
|
+
console.error("No sessions found.");
|
|
44
|
+
db.close();
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
// Pick most recent or let user choose
|
|
48
|
+
let sessionId;
|
|
49
|
+
if (sessions.length === 1) {
|
|
50
|
+
sessionId = sessions[0].id;
|
|
51
|
+
console.log(` Session: ${sessions[0].title}`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(`\n Found ${sessions.length} sessions:\n`);
|
|
55
|
+
// Show top 5
|
|
56
|
+
for (let i = 0; i < Math.min(5, sessions.length); i++) {
|
|
57
|
+
const s = sessions[i];
|
|
58
|
+
const date = new Date(s.time_updated).toISOString().slice(0, 10);
|
|
59
|
+
console.log(` ${i + 1}. ${s.title} (${date})`);
|
|
60
|
+
}
|
|
61
|
+
// Pick most recent by default
|
|
62
|
+
sessionId = sessions[0].id;
|
|
63
|
+
console.log(`\n Importing most recent: ${sessions[0].title}`);
|
|
64
|
+
}
|
|
65
|
+
// Count messages
|
|
66
|
+
const msgCount = db.prepare("SELECT COUNT(*) as count FROM message WHERE session_id = ?").get(sessionId);
|
|
67
|
+
console.log(` Messages: ${msgCount.count}`);
|
|
68
|
+
// Read all messages with their parts
|
|
69
|
+
const messages = db.prepare("SELECT id, time_created, data FROM message WHERE session_id = ? ORDER BY time_created").all(sessionId);
|
|
70
|
+
const getPartsStmt = db.prepare("SELECT id, time_created, data FROM part WHERE message_id = ? ORDER BY time_created");
|
|
71
|
+
// Convert to kern ModelMessage format
|
|
72
|
+
// Group parts per OpenCode message into proper ModelMessage structure
|
|
73
|
+
const kernMessages = [];
|
|
74
|
+
let converted = 0;
|
|
75
|
+
let skipped = 0;
|
|
76
|
+
for (const msg of messages) {
|
|
77
|
+
const msgData = JSON.parse(msg.data);
|
|
78
|
+
const parts = getPartsStmt.all(msg.id);
|
|
79
|
+
const role = msgData.role;
|
|
80
|
+
// Collect text and tool parts for this message
|
|
81
|
+
const textParts = [];
|
|
82
|
+
const toolCalls = [];
|
|
83
|
+
const toolResults = [];
|
|
84
|
+
for (const part of parts) {
|
|
85
|
+
const partData = JSON.parse(part.data);
|
|
86
|
+
if (partData.type === "text" && partData.text) {
|
|
87
|
+
textParts.push(partData.text);
|
|
88
|
+
converted++;
|
|
89
|
+
}
|
|
90
|
+
else if (partData.type === "tool" && partData.state) {
|
|
91
|
+
if (partData.state.input) {
|
|
92
|
+
toolCalls.push({
|
|
93
|
+
type: "tool-call",
|
|
94
|
+
toolCallId: partData.callID || `call_${converted}`,
|
|
95
|
+
toolName: partData.tool,
|
|
96
|
+
input: partData.state.input,
|
|
97
|
+
});
|
|
98
|
+
converted++;
|
|
99
|
+
}
|
|
100
|
+
if (partData.state.status === "completed" && partData.state.output !== undefined) {
|
|
101
|
+
toolResults.push({
|
|
102
|
+
type: "tool-result",
|
|
103
|
+
toolCallId: partData.callID || `call_${converted}`,
|
|
104
|
+
toolName: partData.tool,
|
|
105
|
+
output: { type: "text", value: String(partData.state.output) },
|
|
106
|
+
});
|
|
107
|
+
converted++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
skipped++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Build kern messages for this OpenCode message
|
|
115
|
+
if (role === "user") {
|
|
116
|
+
// User messages: just text
|
|
117
|
+
const text = textParts.join("\n");
|
|
118
|
+
if (text) {
|
|
119
|
+
kernMessages.push({ role: "user", content: text });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else if (role === "assistant") {
|
|
123
|
+
// Assistant: combine text + tool calls into one message
|
|
124
|
+
if (textParts.length > 0 && toolCalls.length > 0) {
|
|
125
|
+
// Mixed: text + tool calls in one content array
|
|
126
|
+
const content = [];
|
|
127
|
+
for (const t of textParts) {
|
|
128
|
+
content.push({ type: "text", text: t });
|
|
129
|
+
}
|
|
130
|
+
content.push(...toolCalls);
|
|
131
|
+
kernMessages.push({ role: "assistant", content });
|
|
132
|
+
}
|
|
133
|
+
else if (toolCalls.length > 0) {
|
|
134
|
+
// Tool calls only
|
|
135
|
+
kernMessages.push({ role: "assistant", content: toolCalls });
|
|
136
|
+
}
|
|
137
|
+
else if (textParts.length > 0) {
|
|
138
|
+
// Text only
|
|
139
|
+
kernMessages.push({ role: "assistant", content: textParts.join("\n") });
|
|
140
|
+
}
|
|
141
|
+
// ALL tool results in one tool message (AI SDK requires this)
|
|
142
|
+
if (toolResults.length > 0) {
|
|
143
|
+
kernMessages.push({ role: "tool", content: toolResults });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Post-process: fix broken patterns
|
|
148
|
+
const cleaned = [];
|
|
149
|
+
for (let i = 0; i < kernMessages.length; i++) {
|
|
150
|
+
const m = kernMessages[i];
|
|
151
|
+
const next = kernMessages[i + 1];
|
|
152
|
+
// Skip assistant tool-calls that have no matching tool result
|
|
153
|
+
if (m.role === "assistant" && Array.isArray(m.content)) {
|
|
154
|
+
const hasToolCall = m.content.some((p) => p.type === "tool-call");
|
|
155
|
+
if (hasToolCall && (!next || next.role !== "tool")) {
|
|
156
|
+
skipped++;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Skip consecutive user messages (keep last)
|
|
161
|
+
if (m.role === "user" && next?.role === "user") {
|
|
162
|
+
skipped++;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
cleaned.push(m);
|
|
166
|
+
}
|
|
167
|
+
const kernMessagesFinal = cleaned;
|
|
168
|
+
db.close();
|
|
169
|
+
console.log(` Converted: ${converted} parts`);
|
|
170
|
+
console.log(` Skipped: ${skipped} parts`);
|
|
171
|
+
console.log(` Cleaned: ${kernMessages.length} → ${kernMessagesFinal.length} messages`);
|
|
172
|
+
// Write to kern session JSONL
|
|
173
|
+
const sessionsDir = join(agent.path, ".kern", "sessions");
|
|
174
|
+
await mkdir(sessionsDir, { recursive: true });
|
|
175
|
+
const sessionUuid = crypto.randomUUID();
|
|
176
|
+
const now = new Date().toISOString();
|
|
177
|
+
const jsonlPath = join(sessionsDir, `${sessionUuid}.jsonl`);
|
|
178
|
+
const meta = JSON.stringify({
|
|
179
|
+
id: sessionUuid,
|
|
180
|
+
createdAt: now,
|
|
181
|
+
updatedAt: now,
|
|
182
|
+
importedFrom: "opencode",
|
|
183
|
+
originalSessionId: sessionId,
|
|
184
|
+
});
|
|
185
|
+
const lines = [meta, ...kernMessagesFinal.map((m) => JSON.stringify(m))];
|
|
186
|
+
await writeFile(jsonlPath, lines.join("\n") + "\n");
|
|
187
|
+
console.log(`\n Imported to ${jsonlPath}`);
|
|
188
|
+
console.log(` Session ID: ${sessionUuid}`);
|
|
189
|
+
console.log(` ${kernMessagesFinal.length} messages`);
|
|
190
|
+
console.log("");
|
|
191
|
+
process.exit(0);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../src/import.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,9 @@ async function showHelp() {
|
|
|
35
35
|
w(` ${cyan("kern remove")} ${dim("<name>")} unregister an agent`);
|
|
36
36
|
w(` ${cyan("kern pair")} ${dim("<agent> <code>")} approve a pairing code`);
|
|
37
37
|
w(` ${cyan("kern backup")} ${dim("<name>")} backup agent to .tar.gz`);
|
|
38
|
+
w(` ${cyan("kern import")} ${dim("opencode <name>")} import session from OpenCode`);
|
|
38
39
|
w(` ${cyan("kern restore")} ${dim("<file>")} restore agent from backup`);
|
|
40
|
+
w(` ${cyan("kern logs")} ${dim("[name]")} tail agent logs`);
|
|
39
41
|
w(` ${cyan("kern tui")} ${dim("[name]")} interactive chat`);
|
|
40
42
|
w("");
|
|
41
43
|
}
|
|
@@ -128,6 +130,32 @@ async function main() {
|
|
|
128
130
|
console.log(` Removed ${name}`);
|
|
129
131
|
process.exit(0);
|
|
130
132
|
}
|
|
133
|
+
if (cmd === "logs") {
|
|
134
|
+
const agentDir = await resolveAgentDir(args[1]);
|
|
135
|
+
const logFile = join(agentDir, ".kern", "logs", "kern.log");
|
|
136
|
+
const { existsSync } = await import("fs");
|
|
137
|
+
if (!existsSync(logFile)) {
|
|
138
|
+
console.error("No logs yet. Start the agent first.");
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const { spawn } = await import("child_process");
|
|
142
|
+
const tail = spawn("tail", ["-f", logFile], { stdio: "inherit" });
|
|
143
|
+
process.on("SIGINT", () => { tail.kill(); process.exit(0); });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (cmd === "import") {
|
|
147
|
+
const source = args[1]; // "opencode"
|
|
148
|
+
const agentName = args[2];
|
|
149
|
+
if (source === "opencode") {
|
|
150
|
+
const { importOpenCode } = await import("./import.js");
|
|
151
|
+
await importOpenCode(agentName);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.error("Usage: kern import opencode <agent>");
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
131
159
|
if (cmd === "pair") {
|
|
132
160
|
const agentName = args[1];
|
|
133
161
|
const code = args[2];
|