@sna-sdk/core 0.8.0 → 0.9.4

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.
@@ -28,11 +28,14 @@ import '../core/providers/types.js';
28
28
  * agent.status { session? }
29
29
  * agent.subscribe { session?, since? }
30
30
  * agent.unsubscribe { session? }
31
- * agent.run-once { message, model?, systemPrompt?, permissionMode?, timeout? }
31
+ * agent.run-once { message, model?, systemPrompt?, appendSystemPrompt?, permissionMode?, cwd?, timeout?, provider?, extraArgs? }
32
32
  *
33
33
  * events.subscribe { since? }
34
34
  * events.unsubscribe {}
35
35
  * emit { skill, eventType, message, data?, session? }
36
+ * NOTE: WS uses `eventType` (not `type`) because `type` is reserved
37
+ * as the WS protocol routing field. HTTP POST /emit uses `type` instead.
38
+ * WS uses `session` (not `session_id`) consistent with all other WS ops.
36
39
  *
37
40
  * permission.respond { session?, approved }
38
41
  * permission.pending { session? }
@@ -41,6 +44,7 @@ import '../core/providers/types.js';
41
44
  *
42
45
  * chat.sessions.list {}
43
46
  * chat.sessions.create { id?, label?, chatType?, meta? }
47
+ * NOTE: WS uses `chatType` (not `type`) for the same reason as `eventType` above.
44
48
  * chat.sessions.remove { session }
45
49
  * chat.messages.list { session, since? }
46
50
  * chat.messages.create { session, role, content?, skill_name?, meta? }
package/dist/server/ws.js CHANGED
@@ -6,6 +6,7 @@ import { runOnce } from "./routes/agent.js";
6
6
  import { wsReply } from "./api-types.js";
7
7
  import { buildHistoryFromDb } from "./history-builder.js";
8
8
  import { saveImages } from "./image-store.js";
9
+ import { getConfig } from "../config.js";
9
10
  function send(ws, data) {
10
11
  if (ws.readyState === ws.OPEN) {
11
12
  ws.send(JSON.stringify(data));
@@ -161,6 +162,7 @@ function handleMessage(ws, msg, sm, state) {
161
162
  function handleSessionsCreate(ws, msg, sm) {
162
163
  try {
163
164
  const session = sm.createSession({
165
+ id: msg.id,
164
166
  label: msg.label,
165
167
  cwd: msg.cwd,
166
168
  meta: msg.meta
@@ -198,11 +200,11 @@ function handleAgentStart(ws, msg, sm) {
198
200
  cwd: msg.cwd
199
201
  });
200
202
  if (session.process?.alive && !msg.force) {
201
- wsReply(ws, msg, { status: "already_running", provider: "claude-code", sessionId: session.id });
203
+ wsReply(ws, msg, { status: "already_running", provider: getConfig().defaultProvider, sessionId: session.id });
202
204
  return;
203
205
  }
204
206
  if (session.process?.alive) session.process.kill();
205
- const provider = getProvider(msg.provider ?? "claude-code");
207
+ const provider = getProvider(msg.provider ?? getConfig().defaultProvider);
206
208
  try {
207
209
  const db = getDb();
208
210
  db.prepare(`INSERT OR IGNORE INTO chat_sessions (id, label, type) VALUES (?, ?, 'main')`).run(sessionId, session.label ?? sessionId);
@@ -215,9 +217,11 @@ function handleAgentStart(ws, msg, sm) {
215
217
  }
216
218
  } catch {
217
219
  }
218
- const providerName = msg.provider ?? "claude-code";
219
- const model = msg.model ?? "claude-sonnet-4-6";
220
+ const cfg = getConfig();
221
+ const providerName = msg.provider ?? cfg.defaultProvider;
222
+ const model = msg.model ?? cfg.model;
220
223
  const permissionMode = msg.permissionMode;
224
+ const configDir = msg.configDir;
221
225
  const extraArgs = msg.extraArgs;
222
226
  try {
223
227
  const proc = provider.spawn({
@@ -225,12 +229,13 @@ function handleAgentStart(ws, msg, sm) {
225
229
  prompt: msg.prompt,
226
230
  model,
227
231
  permissionMode,
232
+ configDir,
228
233
  env: { SNA_SESSION_ID: sessionId },
229
234
  history: msg.history,
230
235
  extraArgs
231
236
  });
232
237
  sm.setProcess(sessionId, proc);
233
- sm.saveStartConfig(sessionId, { provider: providerName, model, permissionMode, extraArgs });
238
+ sm.saveStartConfig(sessionId, { provider: providerName, model, permissionMode, configDir, extraArgs });
234
239
  wsReply(ws, msg, { status: "started", provider: provider.name, sessionId: session.id });
235
240
  } catch (e) {
236
241
  replyError(ws, msg, e.message);
@@ -290,9 +295,10 @@ function handleAgentResume(ws, msg, sm) {
290
295
  if (history.length === 0 && !msg.prompt) {
291
296
  return replyError(ws, msg, "No history in DB \u2014 nothing to resume.");
292
297
  }
293
- const providerName = msg.provider ?? session.lastStartConfig?.provider ?? "claude-code";
294
- const model = msg.model ?? session.lastStartConfig?.model ?? "claude-sonnet-4-6";
298
+ const providerName = msg.provider ?? session.lastStartConfig?.provider ?? getConfig().defaultProvider;
299
+ const model = msg.model ?? session.lastStartConfig?.model ?? getConfig().model;
295
300
  const permissionMode = msg.permissionMode ?? session.lastStartConfig?.permissionMode;
301
+ const configDir = msg.configDir ?? session.lastStartConfig?.configDir;
296
302
  const extraArgs = msg.extraArgs ?? session.lastStartConfig?.extraArgs;
297
303
  const provider = getProvider(providerName);
298
304
  try {
@@ -301,12 +307,13 @@ function handleAgentResume(ws, msg, sm) {
301
307
  prompt: msg.prompt,
302
308
  model,
303
309
  permissionMode,
310
+ configDir,
304
311
  env: { SNA_SESSION_ID: sessionId },
305
312
  history: history.length > 0 ? history : void 0,
306
313
  extraArgs
307
314
  });
308
315
  sm.setProcess(sessionId, proc, "resumed");
309
- sm.saveStartConfig(sessionId, { provider: providerName, model, permissionMode, extraArgs });
316
+ sm.saveStartConfig(sessionId, { provider: providerName, model, permissionMode, configDir, extraArgs });
310
317
  wsReply(ws, msg, {
311
318
  status: "resumed",
312
319
  provider: providerName,
@@ -327,6 +334,7 @@ function handleAgentRestart(ws, msg, sm) {
327
334
  provider: msg.provider,
328
335
  model: msg.model,
329
336
  permissionMode: msg.permissionMode,
337
+ configDir: msg.configDir,
330
338
  extraArgs: msg.extraArgs
331
339
  },
332
340
  (cfg) => {
@@ -336,6 +344,7 @@ function handleAgentRestart(ws, msg, sm) {
336
344
  cwd: sm.getSession(sessionId).cwd,
337
345
  model: cfg.model,
338
346
  permissionMode: cfg.permissionMode,
347
+ configDir: cfg.configDir,
339
348
  env: { SNA_SESSION_ID: sessionId },
340
349
  extraArgs: [...cfg.extraArgs ?? [], ...resumeArgs]
341
350
  });
@@ -474,7 +483,6 @@ function handleAgentUnsubscribe(ws, msg, state) {
474
483
  state.agentUnsubs.delete(sessionId);
475
484
  reply(ws, msg, {});
476
485
  }
477
- const SKILL_POLL_MS = 2e3;
478
486
  function handleEventsSubscribe(ws, msg, sm, state) {
479
487
  state.skillEventUnsub?.();
480
488
  state.skillEventUnsub = null;
@@ -514,7 +522,7 @@ function handleEventsSubscribe(ws, msg, sm, state) {
514
522
  }
515
523
  } catch {
516
524
  }
517
- }, SKILL_POLL_MS);
525
+ }, getConfig().skillPollMs);
518
526
  reply(ws, msg, { lastId });
519
527
  }
520
528
  function handleEventsUnsubscribe(ws, msg, state) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sna-sdk/core",
3
- "version": "0.8.0",
3
+ "version": "0.9.4",
4
4
  "description": "Skills-Native Application runtime — server, providers, session management, database, and CLI",
5
5
  "type": "module",
6
6
  "bin": {