offsite 0.0.95 → 0.0.96

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.
@@ -22,7 +22,7 @@ import { sumBy } from "es-toolkit";
22
22
  import { DatabaseSync } from "node:sqlite";
23
23
  import { drizzle } from "drizzle-orm/node-sqlite";
24
24
  import { migrate } from "drizzle-orm/node-sqlite/migrator";
25
- import { integer, real, snakeCase, text } from "drizzle-orm/sqlite-core";
25
+ import { integer, primaryKey, real, snakeCase, text } from "drizzle-orm/sqlite-core";
26
26
  import sharp from "sharp";
27
27
  import webPush from "web-push";
28
28
  import dns from "node:dns";
@@ -1165,10 +1165,7 @@ function record$1(value) {
1165
1165
  return isRecord(value) ? value : { value };
1166
1166
  }
1167
1167
  // src/storage/config.ts
1168
- const modelSetting = z.strictObject({
1169
- hidden: z.boolean(),
1170
- effort: z.string().nullable()
1171
- });
1168
+ const modelSetting = z.strictObject({ hidden: z.boolean() });
1172
1169
  const generationModel = z.strictObject({
1173
1170
  provider: z.enum([
1174
1171
  "claude",
@@ -1274,7 +1271,7 @@ function configInfo() {
1274
1271
  defaultClaudeBaseDir: path.join(os.homedir(), ".claude"),
1275
1272
  homeDir: os.homedir(),
1276
1273
  scratchAvailable,
1277
- version: "v0.0.95"
1274
+ version: "v0.0.96"
1278
1275
  };
1279
1276
  }
1280
1277
  function readConfig() {
@@ -3160,6 +3157,15 @@ const lastUsedModels = snakeCase.table("last_used_models", {
3160
3157
  model: text().notNull(),
3161
3158
  usedAt: integer().notNull()
3162
3159
  });
3160
+ const lastEfforts = snakeCase.table("last_efforts", {
3161
+ provider: text({ enum: [
3162
+ "claude",
3163
+ "codex",
3164
+ "opencode"
3165
+ ] }).notNull(),
3166
+ model: text().notNull(),
3167
+ effort: text()
3168
+ }, (table) => [primaryKey({ columns: [table.provider, table.model] })]);
3163
3169
  // src/storage/auth.ts
3164
3170
  const CODE_LIFETIME = 3e5;
3165
3171
  const DEVICE_LIFETIME = 2592e6;
@@ -4897,17 +4903,14 @@ async function capabilities(provider, accountId, cwd) {
4897
4903
  defaultModel: defaultModels[provider],
4898
4904
  models: result.models.map((model) => {
4899
4905
  const deprecated = deprecatedModels[provider].includes(model.value);
4900
- const setting = settings[model.value] ?? {
4901
- hidden: deprecated,
4902
- effort: null
4903
- };
4906
+ const setting = settings[model.value] ?? { hidden: deprecated };
4904
4907
  const preferred = defaultEfforts[provider];
4905
4908
  const effort = preferred === null ? null : model.efforts.includes(preferred) ? preferred : model.efforts.at(-1) ?? null;
4906
4909
  return {
4907
4910
  ...model,
4908
4911
  deprecated,
4909
4912
  hidden: setting.hidden,
4910
- effort: setting.effort ?? effort
4913
+ effort
4911
4914
  };
4912
4915
  })
4913
4916
  };
@@ -6764,6 +6767,13 @@ function sessionHistory(sessionId, cwd) {
6764
6767
  case "opencode": return openCodeHistory(sessionId, cwd);
6765
6768
  }
6766
6769
  }
6770
+ function agentHistory(sessionId, cwd, agentId, parent) {
6771
+ switch (providerOf(sessionId)) {
6772
+ case "claude": return agentMessages(sessionId, cwd, agentId, parent);
6773
+ case "codex": return codexAgent(agentId, parent);
6774
+ case "opencode": return openCodeAgent(agentId, parent);
6775
+ }
6776
+ }
6767
6777
  function rewind(request) {
6768
6778
  return locked(request.sessionId, () => rewindNow(request));
6769
6779
  }
@@ -6822,6 +6832,24 @@ async function rewindNow(request) {
6822
6832
  publish$2(sessionId, await history$1(sessionId, cwd));
6823
6833
  return result;
6824
6834
  }
6835
+ function restart(sessionId) {
6836
+ return locked(sessionId, async () => {
6837
+ const run = runs.get(sessionId);
6838
+ if (run === void 0) return;
6839
+ if (run.provider !== "claude") throw new Error("Only Claude Code threads can be restarted");
6840
+ if (run.running) await run.interrupt();
6841
+ run.stop();
6842
+ await run.closed;
6843
+ new Run({
6844
+ sessionId,
6845
+ cwd: run.cwd,
6846
+ resume: true,
6847
+ resumeAt: null,
6848
+ settings: run.settings
6849
+ });
6850
+ publish$2(sessionId, await history$1(sessionId, run.cwd));
6851
+ });
6852
+ }
6825
6853
  async function open$1(client, sessionId, projectId) {
6826
6854
  client.opening = sessionId;
6827
6855
  const event = await sessionHistory(sessionId, projectPath(projectId));
@@ -8453,6 +8481,15 @@ const lastUsedSchema = z.discriminatedUnion("provider", [z.strictObject({
8453
8481
  accountId: z.null(),
8454
8482
  model: z.string()
8455
8483
  })]);
8484
+ const lastEffortSchema = z.strictObject({
8485
+ provider: z.enum([
8486
+ "claude",
8487
+ "codex",
8488
+ "opencode"
8489
+ ]),
8490
+ model: z.string(),
8491
+ effort: z.string().nullable()
8492
+ });
8456
8493
  function readLastUsed() {
8457
8494
  return db.select().from(lastUsedModels).all();
8458
8495
  }
@@ -8473,6 +8510,22 @@ function saveLastUsed(value) {
8473
8510
  });
8474
8511
  return null;
8475
8512
  }
8513
+ function readLastEfforts() {
8514
+ return db.select().from(lastEfforts).all();
8515
+ }
8516
+ function saveLastEffort(value) {
8517
+ const result = lastEffortSchema.safeParse(value);
8518
+ if (!result.success) throw new Error(z.prettifyError(result.error));
8519
+ db.insert(lastEfforts).values(result.data).onConflictDoUpdate({
8520
+ target: [lastEfforts.provider, lastEfforts.model],
8521
+ set: { effort: result.data.effort }
8522
+ }).run();
8523
+ broadcast({
8524
+ type: "lastEfforts",
8525
+ lastEfforts: readLastEfforts()
8526
+ });
8527
+ return null;
8528
+ }
8476
8529
  // ../core/src/app-icons.ts
8477
8530
  const appIcons = [
8478
8531
  {
@@ -8573,6 +8626,7 @@ const handlers = {
8573
8626
  return {
8574
8627
  ...configInfo(),
8575
8628
  lastUsed: readLastUsed(),
8629
+ lastEfforts: readLastEfforts(),
8576
8630
  hostname: os.hostname(),
8577
8631
  projects: projects(),
8578
8632
  sessions: sessions(),
@@ -8584,6 +8638,7 @@ const handlers = {
8584
8638
  },
8585
8639
  "config.get": () => configInfo(),
8586
8640
  "lastUsed.save": (params) => saveLastUsed(params),
8641
+ "lastEffort.save": (params) => saveLastEffort(params),
8587
8642
  "appIcon.save": (params) => saveAppIcon(params),
8588
8643
  "config.save": async (params) => {
8589
8644
  const before = readConfig();
@@ -8645,13 +8700,7 @@ const handlers = {
8645
8700
  "sessions.earlier": (params) => earlier(params.sessionId, params.before),
8646
8701
  "sessions.export": (params) => exportSession(params.sessionId, params.projectId),
8647
8702
  "sessions.image": (params) => image(params.sessionId, params.itemId, params.index),
8648
- "sessions.agent": (params) => {
8649
- switch (providerOf(params.sessionId)) {
8650
- case "claude": return agentMessages(params.sessionId, projectPath(params.projectId), params.agentId, params.parent);
8651
- case "codex": return codexAgent(params.agentId, params.parent);
8652
- case "opencode": return openCodeAgent(params.agentId, params.parent);
8653
- }
8654
- },
8703
+ "sessions.agent": (params) => agentHistory(params.sessionId, projectPath(params.projectId), params.agentId, params.parent),
8655
8704
  "sessions.send": async (params, client) => {
8656
8705
  await send$1(client, params);
8657
8706
  return null;
@@ -8668,6 +8717,10 @@ const handlers = {
8668
8717
  await runs.get(params.sessionId)?.interrupt();
8669
8718
  return null;
8670
8719
  },
8720
+ "sessions.restart": async (params) => {
8721
+ await restart(params.sessionId);
8722
+ return null;
8723
+ },
8671
8724
  "sessions.stopTask": async (params) => {
8672
8725
  await runs.get(params.sessionId)?.stopTask(params.taskId);
8673
8726
  return null;