Skip to content

Commit f3fc363

Browse files
committed
Add Roo Code types
1 parent 5c4680a commit f3fc363

File tree

11 files changed

+415
-151
lines changed

11 files changed

+415
-151
lines changed

benchmark/apps/cli/src/exercises.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ import * as fs from "fs"
33

44
import { filesystem } from "gluegun"
55

6-
import { type Language, languages } from "@benchmark/types"
6+
import { type ExerciseLanguage, exerciseLanguages } from "@benchmark/types"
77

88
import { exercisesPath } from "./paths.js"
99

10-
let exercisesByLanguage: Record<Language, string[]> | null = null
10+
let exercisesByLanguage: Record<ExerciseLanguage, string[]> | null = null
1111

1212
export const getExercises = () => {
1313
if (exercisesByLanguage !== null) {
1414
return exercisesByLanguage
1515
}
1616

17-
const getLanguageExercises = (language: Language) =>
17+
const getLanguageExercises = (language: ExerciseLanguage) =>
1818
fs.existsSync(path.resolve(exercisesPath, language))
1919
? filesystem
2020
.subdirectories(path.resolve(exercisesPath, language))
2121
.map((exercise) => path.basename(exercise))
2222
.filter((exercise) => !exercise.startsWith("."))
2323
: []
2424

25-
exercisesByLanguage = languages.reduce(
25+
exercisesByLanguage = exerciseLanguages.reduce(
2626
(collect, language) => ({ ...collect, [language]: getLanguageExercises(language) }),
27-
{} as Record<Language, string[]>,
27+
{} as Record<ExerciseLanguage, string[]>,
2828
)
2929

3030
return exercisesByLanguage

benchmark/apps/cli/src/index.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import { build, filesystem, GluegunPrompt, GluegunToolbox } from "gluegun"
77
import { runTests } from "@vscode/test-electron"
88
import { execa, parseCommandString } from "execa"
99

10-
import { type Language, languages, IpcOrigin, IpcMessageType, TaskEventName } from "@benchmark/types"
10+
import { type ExerciseLanguage, exerciseLanguages, IpcOrigin, IpcMessageType, TaskEventName } from "@benchmark/types"
1111
import { type Run, findRun, createRun, finishRun, createTask, Task, getTasks, updateTask } from "@benchmark/db"
1212
import { IpcServer } from "@benchmark/ipc"
1313

1414
import { __dirname, extensionDevelopmentPath, extensionTestsPath, exercisesPath } from "./paths.js"
1515
import { getExercises } from "./exercises.js"
1616

17-
const testCommands: Record<Language, { commands: string[]; timeout?: number; cwd?: string }> = {
17+
const testCommands: Record<ExerciseLanguage, { commands: string[]; timeout?: number; cwd?: string }> = {
1818
cpp: { commands: ["cmake -G 'Unix\\ Makefiles' -DEXERCISM_RUN_ALL_TESTS=1 ..", "make"], cwd: "build" }, // timeout 15s bash -c "cd '$dir' && mkdir -p build && cd build && cmake -G 'Unix Makefiles' -DEXERCISM_RUN_ALL_TESTS=1 .. >/dev/null 2>&1 && make >/dev/null 2>&1"
1919
go: { commands: ["go test"] }, // timeout 15s bash -c "cd '$dir' && go test > /dev/null 2>&1"
2020
java: { commands: ["./gradlew test"] }, // timeout --foreground 15s bash -c "cd '$dir' && ./gradlew test > /dev/null 2>&1"
@@ -28,7 +28,7 @@ const run = async (toolbox: GluegunToolbox) => {
2828

2929
let { language, exercise } = config
3030

31-
if (![undefined, ...languages, "all"].includes(language)) {
31+
if (![undefined, ...exerciseLanguages, "all"].includes(language)) {
3232
throw new Error(`Language is invalid: ${language}`)
3333
}
3434

@@ -49,15 +49,15 @@ const run = async (toolbox: GluegunToolbox) => {
4949
})
5050

5151
if (language === "all") {
52-
for (const language of languages) {
53-
const exercises = getExercises()[language as Language]
52+
for (const language of exerciseLanguages) {
53+
const exercises = getExercises()[language as ExerciseLanguage]
5454

5555
await pMap(exercises, (exercise) => createTask({ runId: run.id, language, exercise }), {
5656
concurrency: 10,
5757
})
5858
}
5959
} else if (exercise === "all") {
60-
const exercises = getExercises()[language as Language]
60+
const exercises = getExercises()[language as ExerciseLanguage]
6161
await pMap(exercises, (exercise) => createTask({ runId: run.id, language, exercise }), { concurrency: 10 })
6262
} else {
6363
language = language || (await askLanguage(prompt))
@@ -166,17 +166,17 @@ const runExercise = async ({ run, task }: { run: Run; task: Task }) => {
166166
}
167167

168168
const askLanguage = async (prompt: GluegunPrompt) => {
169-
const { language } = await prompt.ask<{ language: Language }>({
169+
const { language } = await prompt.ask<{ language: ExerciseLanguage }>({
170170
type: "select",
171171
name: "language",
172172
message: "Which language?",
173-
choices: [...languages],
173+
choices: [...exerciseLanguages],
174174
})
175175

176176
return language
177177
}
178178

179-
const askExercise = async (prompt: GluegunPrompt, language: Language) => {
179+
const askExercise = async (prompt: GluegunPrompt, language: ExerciseLanguage) => {
180180
const exercises = filesystem.subdirectories(path.join(exercisesPath, language))
181181

182182
if (exercises.length === 0) {

benchmark/apps/web/src/lib/server/exercises.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as fs from "fs/promises"
44
import * as path from "path"
55
import { fileURLToPath } from "url"
66

7-
import { Language, languages } from "@benchmark/types"
7+
import { ExerciseLanguage, exerciseLanguages } from "@benchmark/types"
88

99
const __dirname = path.dirname(fileURLToPath(import.meta.url))
1010

@@ -24,7 +24,7 @@ const EXERCISES_BASE_PATH = path.resolve(__dirname, "../../../../../../../exerci
2424

2525
export const getExercises = async () => {
2626
const result = await Promise.all(
27-
languages.map(async (language) => {
27+
exerciseLanguages.map(async (language) => {
2828
const languagePath = path.join(EXERCISES_BASE_PATH, language)
2929
const exercises = await listDirectories(languagePath)
3030
return exercises.map((exercise) => `${language}/${exercise}`)
@@ -34,5 +34,5 @@ export const getExercises = async () => {
3434
return result.flat()
3535
}
3636

37-
export const getExercisesForLanguage = async (language: Language) =>
37+
export const getExercisesForLanguage = async (language: ExerciseLanguage) =>
3838
listDirectories(path.join(EXERCISES_BASE_PATH, language))

benchmark/apps/web/src/lib/server/runs.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import os from "os"
77
import { revalidatePath } from "next/cache"
88
import pMap from "p-map"
99

10-
import { Language, languages } from "@benchmark/types"
10+
import { ExerciseLanguage, exerciseLanguages } from "@benchmark/types"
1111
import * as db from "@benchmark/db"
1212

1313
import { CreateRun } from "@/lib/schemas"
@@ -27,10 +27,10 @@ export async function createRun({ suite, exercises = [], ...values }: CreateRun)
2727
throw new Error("Invalid exercise path: " + path)
2828
}
2929

30-
await db.createTask({ ...values, runId: run.id, language: language as Language, exercise })
30+
await db.createTask({ ...values, runId: run.id, language: language as ExerciseLanguage, exercise })
3131
}
3232
} else {
33-
for (const language of languages) {
33+
for (const language of exerciseLanguages) {
3434
const exercises = await getExercisesForLanguage(language)
3535

3636
await pMap(exercises, (exercise) => db.createTask({ ...values, runId: run.id, language, exercise }), {

benchmark/packages/db/src/queries/tasks.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { and, eq } from "drizzle-orm"
22

3-
import type { Language } from "@benchmark/types"
3+
import type { ExerciseLanguage } from "@benchmark/types"
44

55
import { RecordNotFoundError, RecordNotCreatedError } from "./errors.js"
66
import type { InsertTask, UpdateTask } from "../schema.js"
@@ -49,7 +49,7 @@ export const updateTask = async (id: number, values: UpdateTask) => {
4949
}
5050
type GetTask = {
5151
runId: number
52-
language: Language
52+
language: ExerciseLanguage
5353
exercise: string
5454
}
5555

benchmark/packages/db/src/schema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { relations } from "drizzle-orm"
33
import { createInsertSchema } from "drizzle-zod"
44
import { z } from "zod"
55

6-
import { languages } from "@benchmark/types"
6+
import { exerciseLanguages } from "@benchmark/types"
77

88
/**
99
* runs
@@ -45,7 +45,7 @@ export const tasks = sqliteTable(
4545
.references(() => runs.id)
4646
.notNull(),
4747
taskMetricsId: integer({ mode: "number" }).references(() => taskMetrics.id),
48-
language: text({ enum: languages }).notNull(),
48+
language: text({ enum: exerciseLanguages }).notNull(),
4949
exercise: text().notNull(),
5050
passed: integer({ mode: "boolean" }),
5151
startedAt: integer({ mode: "timestamp" }),
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* ExerciseLanguage
3+
*/
4+
5+
export const exerciseLanguages = ["cpp", "go", "java", "javascript", "python", "rust"] as const
6+
7+
export type ExerciseLanguage = (typeof exerciseLanguages)[number]
8+
9+
export const isExerciseLanguage = (value: string): value is ExerciseLanguage =>
10+
exerciseLanguages.includes(value as ExerciseLanguage)
Lines changed: 3 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,3 @@
1-
import { z } from "zod"
2-
3-
/**
4-
* Language
5-
*/
6-
7-
export const languages = ["cpp", "go", "java", "javascript", "python", "rust"] as const
8-
9-
export type Language = (typeof languages)[number]
10-
11-
export const isLanguage = (value: string): value is Language => languages.includes(value as Language)
12-
13-
/**
14-
* TaskEvent
15-
*/
16-
17-
export enum TaskEventName {
18-
Connect = "Connect",
19-
TaskStarted = "TaskStarted",
20-
Message = "Message",
21-
TaskTokenUsageUpdated = "TaskTokenUsageUpdated",
22-
TaskFinished = "TaskFinished",
23-
}
24-
25-
export const taskEventSchema = z.discriminatedUnion("eventName", [
26-
z.object({
27-
eventName: z.literal(TaskEventName.Connect),
28-
data: z.object({ task: z.object({ id: z.number() }) }),
29-
}),
30-
z.object({
31-
eventName: z.literal(TaskEventName.TaskStarted),
32-
data: z.object({ task: z.object({ id: z.number() }) }),
33-
}),
34-
z.object({
35-
eventName: z.literal(TaskEventName.Message),
36-
data: z.object({
37-
task: z.object({ id: z.number() }),
38-
message: z.object({
39-
taskId: z.string(),
40-
action: z.enum(["created", "updated"]),
41-
message: z.object({
42-
// See ClineMessage.
43-
ts: z.number(),
44-
type: z.enum(["ask", "say"]),
45-
ask: z.string().optional(),
46-
say: z.string().optional(),
47-
partial: z.boolean().optional(),
48-
text: z.string().optional(),
49-
reasoning: z.string().optional(),
50-
}),
51-
}),
52-
}),
53-
}),
54-
z.object({
55-
eventName: z.literal(TaskEventName.TaskTokenUsageUpdated),
56-
data: z.object({
57-
task: z.object({ id: z.number() }),
58-
usage: z.object({}),
59-
}),
60-
}),
61-
z.object({
62-
eventName: z.literal(TaskEventName.TaskFinished),
63-
data: z.object({ task: z.object({ id: z.number() }), taskMetrics: z.unknown() }),
64-
}),
65-
])
66-
67-
export type TaskEvent = z.infer<typeof taskEventSchema>
68-
69-
/**
70-
* TaskCommand
71-
*/
72-
73-
export enum TaskCommandName {
74-
StartNewTask = "StartNewTask",
75-
}
76-
77-
export const taskCommandSchema = z.discriminatedUnion("commandName", [
78-
z.object({
79-
commandName: z.literal(TaskCommandName.StartNewTask),
80-
data: z.object({
81-
text: z.string(),
82-
images: z.array(z.string()).optional(),
83-
}),
84-
}),
85-
])
86-
87-
export type TaskCommand = z.infer<typeof taskCommandSchema>
88-
89-
/**
90-
* IpcMessage
91-
*/
92-
93-
export enum IpcMessageType {
94-
Ack = "Ack",
95-
TaskCommand = "TaskCommand",
96-
TaskEvent = "TaskEvent",
97-
}
98-
99-
export enum IpcOrigin {
100-
Client = "client",
101-
Server = "server",
102-
Relay = "relay",
103-
}
104-
105-
export const ipcMessageSchema = z.discriminatedUnion("type", [
106-
z.object({
107-
type: z.literal(IpcMessageType.Ack),
108-
origin: z.literal(IpcOrigin.Server),
109-
data: z.object({ clientId: z.string() }),
110-
}),
111-
z.object({
112-
type: z.literal(IpcMessageType.TaskCommand),
113-
origin: z.literal(IpcOrigin.Client),
114-
clientId: z.string(),
115-
data: taskCommandSchema,
116-
}),
117-
z.object({
118-
type: z.literal(IpcMessageType.TaskEvent),
119-
origin: z.union([z.literal(IpcOrigin.Server), z.literal(IpcOrigin.Relay)]),
120-
relayClientId: z.string().optional(),
121-
data: taskEventSchema,
122-
}),
123-
])
124-
125-
export type IpcMessage = z.infer<typeof ipcMessageSchema>
1+
export * from "./exercises.js"
2+
export * from "./ipc.js"
3+
export * from "./roo-code.js"

0 commit comments

Comments
 (0)