Просмотр исходного кода

add opencode import command to restore sessions from JSON exports

Dax Raad 3 месяцев назад
Родитель
Сommit
306f45f04a
2 измененных файлов с 53 добавлено и 0 удалено
  1. 51 0
      packages/opencode/src/cli/cmd/import.ts
  2. 2 0
      packages/opencode/src/index.ts

+ 51 - 0
packages/opencode/src/cli/cmd/import.ts

@@ -0,0 +1,51 @@
+import type { Argv } from "yargs"
+import { Session } from "../../session"
+import { cmd } from "./cmd"
+import { bootstrap } from "../bootstrap"
+import { UI } from "../ui"
+import { Storage } from "../../storage/storage"
+import { Instance } from "../../project/instance"
+import { EOL } from "os"
+
+export const ImportCommand = cmd({
+  command: "import <file>",
+  describe: "import session data from JSON file",
+  builder: (yargs: Argv) => {
+    return yargs.positional("file", {
+      describe: "path to JSON file to import",
+      type: "string",
+      demandOption: true,
+    })
+  },
+  handler: async (args) => {
+    await bootstrap(process.cwd(), async () => {
+      const file = Bun.file(args.file as string)
+      const exists = await file.exists()
+      if (!exists) {
+        UI.error(`File not found: ${args.file}`)
+        process.exit(1)
+      }
+
+      const exportData = (await file.json()) as {
+        info: Session.Info
+        messages: Array<{
+          info: any
+          parts: any[]
+        }>
+      }
+
+      await Storage.write(["session", Instance.project.id, exportData.info.id], exportData.info)
+
+      for (const msg of exportData.messages) {
+        await Storage.write(["message", exportData.info.id, msg.info.id], msg.info)
+
+        for (const part of msg.parts) {
+          await Storage.write(["part", msg.info.id, part.id], part)
+        }
+      }
+
+      process.stdout.write(`Imported session: ${exportData.info.id}`)
+      process.stdout.write(EOL)
+    })
+  },
+})

+ 2 - 0
packages/opencode/src/index.ts

@@ -17,6 +17,7 @@ import { StatsCommand } from "./cli/cmd/stats"
 import { McpCommand } from "./cli/cmd/mcp"
 import { GithubCommand } from "./cli/cmd/github"
 import { ExportCommand } from "./cli/cmd/export"
+import { ImportCommand } from "./cli/cmd/import"
 import { AttachCommand } from "./cli/cmd/tui/attach"
 import { TuiThreadCommand } from "./cli/cmd/tui/thread"
 import { TuiSpawnCommand } from "./cli/cmd/tui/spawn"
@@ -87,6 +88,7 @@ const cli = yargs(hideBin(process.argv))
   .command(ModelsCommand)
   .command(StatsCommand)
   .command(ExportCommand)
+  .command(ImportCommand)
   .command(GithubCommand)
   .fail((msg) => {
     if (