index.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import "zod-openapi/extend";
  2. import { App } from "./app/app";
  3. import { Server } from "./server/server";
  4. import fs from "fs/promises";
  5. import path from "path";
  6. import { Bus } from "./bus";
  7. import { Session } from "./session/session";
  8. import cac from "cac";
  9. import { Share } from "./share/share";
  10. import { Storage } from "./storage/storage";
  11. import { LLM } from "./llm/llm";
  12. import { Message } from "./session/message";
  13. const cli = cac("opencode");
  14. cli.command("", "Start the opencode in interactive mode").action(async () => {
  15. await App.provide({ directory: process.cwd() }, async () => {
  16. await Share.init();
  17. Server.listen();
  18. });
  19. });
  20. cli.command("generate", "Generate OpenAPI and event specs").action(async () => {
  21. const specs = await Server.openapi();
  22. const dir = "gen";
  23. await fs.rmdir(dir, { recursive: true }).catch(() => {});
  24. await fs.mkdir(dir, { recursive: true });
  25. await Bun.write(
  26. path.join(dir, "openapi.json"),
  27. JSON.stringify(specs, null, 2),
  28. );
  29. });
  30. cli
  31. .command("run [...message]", "Run a chat message")
  32. .option("--session <id>", "Session ID")
  33. .action(async (message: string[], options) => {
  34. await App.provide({ directory: process.cwd() }, async () => {
  35. await Share.init();
  36. const session = options.session
  37. ? await Session.get(options.session)
  38. : await Session.create();
  39. console.log("Session:", session.id);
  40. Bus.subscribe(Message.Event.Updated, async (message) => {
  41. console.log("Thinking...");
  42. });
  43. const unsub = Bus.subscribe(Session.Event.Updated, async (message) => {
  44. if (message.properties.info.share?.url)
  45. console.log("Share:", message.properties.info.share.url);
  46. unsub();
  47. });
  48. const providers = await LLM.providers();
  49. const providerID = Object.keys(providers)[0];
  50. const modelID = Object.keys(providers[providerID].info.models!)[0];
  51. console.log("using", providerID, modelID);
  52. const result = await Session.chat({
  53. sessionID: session.id,
  54. providerID,
  55. modelID,
  56. parts: [
  57. {
  58. type: "text",
  59. text: message.join(" "),
  60. },
  61. ],
  62. });
  63. for (const part of result.parts) {
  64. if (part.type === "text") {
  65. console.log("opencode:", part.text);
  66. }
  67. }
  68. console.log({
  69. cost: result.metadata.assistant?.cost,
  70. tokens: result.metadata.assistant?.tokens,
  71. });
  72. });
  73. });
  74. cli.help();
  75. cli.version("1.0.0");
  76. cli.parse();