chore: generate

This commit is contained in:
opencode-agent[bot]
2026-06-12 18:46:51 +00:00
parent c2e6b18076
commit 6c36b585c3
12 changed files with 453 additions and 444 deletions
+46 -141
View File
@@ -2,9 +2,7 @@
"version": "7", "version": "7",
"dialect": "sqlite", "dialect": "sqlite",
"id": "169a0f0f-d58f-479f-b024-fa1c7b9a09db", "id": "169a0f0f-d58f-479f-b024-fa1c7b9a09db",
"prevIds": [ "prevIds": ["abd2f920-b822-49af-b8a7-2e48367d424f"],
"abd2f920-b822-49af-b8a7-2e48367d424f"
],
"ddl": [ "ddl": [
{ {
"name": "workspace", "name": "workspace",
@@ -1513,13 +1511,9 @@
"table": "session_share" "table": "session_share"
}, },
{ {
"columns": [ "columns": ["project_id"],
"project_id"
],
"tableTo": "project", "tableTo": "project",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1528,13 +1522,9 @@
"table": "workspace" "table": "workspace"
}, },
{ {
"columns": [ "columns": ["active_account_id"],
"active_account_id"
],
"tableTo": "account", "tableTo": "account",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "SET NULL", "onDelete": "SET NULL",
"nameExplicit": false, "nameExplicit": false,
@@ -1543,13 +1533,9 @@
"table": "account_state" "table": "account_state"
}, },
{ {
"columns": [ "columns": ["aggregate_id"],
"aggregate_id"
],
"tableTo": "event_sequence", "tableTo": "event_sequence",
"columnsTo": [ "columnsTo": ["aggregate_id"],
"aggregate_id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1558,13 +1544,9 @@
"table": "event" "table": "event"
}, },
{ {
"columns": [ "columns": ["project_id"],
"project_id"
],
"tableTo": "project", "tableTo": "project",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1573,13 +1555,9 @@
"table": "permission" "table": "permission"
}, },
{ {
"columns": [ "columns": ["project_id"],
"project_id"
],
"tableTo": "project", "tableTo": "project",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1588,13 +1566,9 @@
"table": "project_directory" "table": "project_directory"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1603,13 +1577,9 @@
"table": "message" "table": "message"
}, },
{ {
"columns": [ "columns": ["message_id"],
"message_id"
],
"tableTo": "message", "tableTo": "message",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1618,13 +1588,9 @@
"table": "part" "table": "part"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1633,13 +1599,9 @@
"table": "session_context_epoch" "table": "session_context_epoch"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1648,13 +1610,9 @@
"table": "session_input" "table": "session_input"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1663,13 +1621,9 @@
"table": "session_message" "table": "session_message"
}, },
{ {
"columns": [ "columns": ["project_id"],
"project_id"
],
"tableTo": "project", "tableTo": "project",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1678,13 +1632,9 @@
"table": "session" "table": "session"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1693,13 +1643,9 @@
"table": "todo" "table": "todo"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"tableTo": "session", "tableTo": "session",
"columnsTo": [ "columnsTo": ["id"],
"id"
],
"onUpdate": "NO ACTION", "onUpdate": "NO ACTION",
"onDelete": "CASCADE", "onDelete": "CASCADE",
"nameExplicit": false, "nameExplicit": false,
@@ -1708,174 +1654,133 @@
"table": "session_share" "table": "session_share"
}, },
{ {
"columns": [ "columns": ["email", "url"],
"email",
"url"
],
"nameExplicit": false, "nameExplicit": false,
"name": "control_account_pk", "name": "control_account_pk",
"entityType": "pks", "entityType": "pks",
"table": "control_account" "table": "control_account"
}, },
{ {
"columns": [ "columns": ["project_id", "directory"],
"project_id",
"directory"
],
"nameExplicit": false, "nameExplicit": false,
"name": "project_directory_pk", "name": "project_directory_pk",
"entityType": "pks", "entityType": "pks",
"table": "project_directory" "table": "project_directory"
}, },
{ {
"columns": [ "columns": ["session_id", "position"],
"session_id",
"position"
],
"nameExplicit": false, "nameExplicit": false,
"name": "todo_pk", "name": "todo_pk",
"entityType": "pks", "entityType": "pks",
"table": "todo" "table": "todo"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "workspace_pk", "name": "workspace_pk",
"table": "workspace", "table": "workspace",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["name"],
"name"
],
"nameExplicit": false, "nameExplicit": false,
"name": "data_migration_pk", "name": "data_migration_pk",
"table": "data_migration", "table": "data_migration",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "account_state_pk", "name": "account_state_pk",
"table": "account_state", "table": "account_state",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "account_pk", "name": "account_pk",
"table": "account", "table": "account",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "credential_pk", "name": "credential_pk",
"table": "credential", "table": "credential",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["aggregate_id"],
"aggregate_id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "event_sequence_pk", "name": "event_sequence_pk",
"table": "event_sequence", "table": "event_sequence",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "event_pk", "name": "event_pk",
"table": "event", "table": "event",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "permission_pk", "name": "permission_pk",
"table": "permission", "table": "permission",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "project_pk", "name": "project_pk",
"table": "project", "table": "project",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "message_pk", "name": "message_pk",
"table": "message", "table": "message",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "part_pk", "name": "part_pk",
"table": "part", "table": "part",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "session_context_epoch_pk", "name": "session_context_epoch_pk",
"table": "session_context_epoch", "table": "session_context_epoch",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "session_input_pk", "name": "session_input_pk",
"table": "session_input", "table": "session_input",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "session_message_pk", "name": "session_message_pk",
"table": "session_message", "table": "session_message",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["id"],
"id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "session_pk", "name": "session_pk",
"table": "session", "table": "session",
"entityType": "pks" "entityType": "pks"
}, },
{ {
"columns": [ "columns": ["session_id"],
"session_id"
],
"nameExplicit": false, "nameExplicit": false,
"name": "session_share_pk", "name": "session_share_pk",
"table": "session_share", "table": "session_share",
@@ -18,7 +18,9 @@ export default {
CONSTRAINT \`fk_project_directory_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE CONSTRAINT \`fk_project_directory_project_id_project_id_fk\` FOREIGN KEY (\`project_id\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE
); );
`) `)
yield* tx.run(`INSERT INTO \`__new_project_directory\`(\`project_id\`, \`directory\`, \`type\`, \`time_created\`) SELECT \`project_id\`, \`directory\`, \`type\`, \`time_created\` FROM \`project_directory\`;`) yield* tx.run(
`INSERT INTO \`__new_project_directory\`(\`project_id\`, \`directory\`, \`type\`, \`time_created\`) SELECT \`project_id\`, \`directory\`, \`type\`, \`time_created\` FROM \`project_directory\`;`,
)
yield* tx.run(`DROP TABLE \`project_directory\`;`) yield* tx.run(`DROP TABLE \`project_directory\`;`)
yield* tx.run(`ALTER TABLE \`__new_project_directory\` RENAME TO \`project_directory\`;`) yield* tx.run(`ALTER TABLE \`__new_project_directory\` RENAME TO \`project_directory\`;`)
yield* tx.run(`PRAGMA foreign_keys=ON;`) yield* tx.run(`PRAGMA foreign_keys=ON;`)
+24 -8
View File
@@ -241,16 +241,32 @@ export default {
`) `)
yield* tx.run(`CREATE UNIQUE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`) yield* tx.run(`CREATE UNIQUE INDEX \`event_aggregate_seq_idx\` ON \`event\` (\`aggregate_id\`,\`seq\`);`)
yield* tx.run(`CREATE INDEX \`event_aggregate_type_seq_idx\` ON \`event\` (\`aggregate_id\`,\`type\`,\`seq\`);`) yield* tx.run(`CREATE INDEX \`event_aggregate_type_seq_idx\` ON \`event\` (\`aggregate_id\`,\`type\`,\`seq\`);`)
yield* tx.run(`CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`) yield* tx.run(
yield* tx.run(`CREATE INDEX \`message_session_time_created_id_idx\` ON \`message\` (\`session_id\`,\`time_created\`,\`id\`);`) `CREATE UNIQUE INDEX \`permission_project_action_resource_idx\` ON \`permission\` (\`project_id\`,\`action\`,\`resource\`);`,
)
yield* tx.run(
`CREATE INDEX \`message_session_time_created_id_idx\` ON \`message\` (\`session_id\`,\`time_created\`,\`id\`);`,
)
yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`) yield* tx.run(`CREATE INDEX \`part_message_id_id_idx\` ON \`part\` (\`message_id\`,\`id\`);`)
yield* tx.run(`CREATE INDEX \`part_session_idx\` ON \`part\` (\`session_id\`);`) yield* tx.run(`CREATE INDEX \`part_session_idx\` ON \`part\` (\`session_id\`);`)
yield* tx.run(`CREATE INDEX \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`admitted_seq\`);`) yield* tx.run(
yield* tx.run(`CREATE UNIQUE INDEX \`session_input_session_admitted_seq_idx\` ON \`session_input\` (\`session_id\`,\`admitted_seq\`);`) `CREATE INDEX \`session_input_session_pending_delivery_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`,\`delivery\`,\`admitted_seq\`);`,
yield* tx.run(`CREATE UNIQUE INDEX \`session_input_session_promoted_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`);`) )
yield* tx.run(`CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`) yield* tx.run(
yield* tx.run(`CREATE INDEX \`session_message_session_type_seq_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`seq\`);`) `CREATE UNIQUE INDEX \`session_input_session_admitted_seq_idx\` ON \`session_input\` (\`session_id\`,\`admitted_seq\`);`,
yield* tx.run(`CREATE INDEX \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`) )
yield* tx.run(
`CREATE UNIQUE INDEX \`session_input_session_promoted_seq_idx\` ON \`session_input\` (\`session_id\`,\`promoted_seq\`);`,
)
yield* tx.run(
`CREATE UNIQUE INDEX \`session_message_session_seq_idx\` ON \`session_message\` (\`session_id\`,\`seq\`);`,
)
yield* tx.run(
`CREATE INDEX \`session_message_session_type_seq_idx\` ON \`session_message\` (\`session_id\`,\`type\`,\`seq\`);`,
)
yield* tx.run(
`CREATE INDEX \`session_message_session_time_created_id_idx\` ON \`session_message\` (\`session_id\`,\`time_created\`,\`id\`);`,
)
yield* tx.run(`CREATE INDEX \`session_message_time_created_idx\` ON \`session_message\` (\`time_created\`);`) yield* tx.run(`CREATE INDEX \`session_message_time_created_idx\` ON \`session_message\` (\`time_created\`);`)
yield* tx.run(`CREATE INDEX \`session_project_idx\` ON \`session\` (\`project_id\`);`) yield* tx.run(`CREATE INDEX \`session_project_idx\` ON \`session\` (\`project_id\`);`)
yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`) yield* tx.run(`CREATE INDEX \`session_workspace_idx\` ON \`session\` (\`workspace_id\`);`)
@@ -33,7 +33,6 @@ export function makeGitWorktreeStrategy(input: {
Effect.catchTag("ProjectCopy.DirectoryUnavailableError", () => Effect.succeed(undefined)), Effect.catchTag("ProjectCopy.DirectoryUnavailableError", () => Effect.succeed(undefined)),
), ),
).pipe(Effect.map((items) => items.filter((item): item is ListEntry => item !== undefined))) ).pipe(Effect.map((items) => items.filter((item): item is ListEntry => item !== undefined)))
}), }),
} satisfies Strategy } satisfies Strategy
} }
+1 -4
View File
@@ -77,10 +77,7 @@ export const layer = Layer.effect(
}) })
: insert.onConflictDoNothing() : insert.onConflictDoNothing()
return ( return (
(yield* query (yield* query.returning({ directory: ProjectDirectoryTable.directory }).get().pipe(Effect.orDie)) !== undefined
.returning({ directory: ProjectDirectoryTable.directory })
.get()
.pipe(Effect.orDie)) !== undefined
) )
}) })
@@ -135,5 +135,4 @@ describe("LocationServiceMap", () => {
), ),
), ),
) )
}) })
@@ -52,17 +52,11 @@ describe("ProjectDirectories", () => {
const service = yield* ProjectDirectories.Service const service = yield* ProjectDirectories.Service
yield* service.create({ projectID, directory, strategy: "old/strategy" }) yield* service.create({ projectID, directory, strategy: "old/strategy" })
expect( expect(yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" })).toBe(true)
yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" }), expect(yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" })).toBe(false)
).toBe(true)
expect(
yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" }),
).toBe(false)
expect(yield* service.create({ projectID, directory, behavior: "replace" })).toBe(true) expect(yield* service.create({ projectID, directory, behavior: "replace" })).toBe(true)
expect(yield* service.create({ projectID, directory, behavior: "replace" })).toBe(false) expect(yield* service.create({ projectID, directory, behavior: "replace" })).toBe(false)
expect( expect(yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" })).toBe(true)
yield* service.create({ projectID, directory, strategy: "new/strategy", behavior: "replace" }),
).toBe(true)
expect(yield* service.list(projectID)).toEqual([{ directory, strategy: "new/strategy" }]) expect(yield* service.list(projectID)).toEqual([{ directory, strategy: "new/strategy" }])
}), }),
) )
@@ -171,9 +171,7 @@ describe("Project directory persistence", () => {
yield* project.fromDirectory(tmp) yield* project.fromDirectory(tmp)
expect(yield* directories(remoteID)).toEqual([ expect(yield* directories(remoteID)).toEqual([{ directory: AbsolutePath.make(tmp), strategy: undefined }])
{ directory: AbsolutePath.make(tmp), strategy: undefined },
])
}), }),
) )
@@ -197,9 +195,7 @@ describe("Project directory persistence", () => {
yield* project.fromDirectory(tmp) yield* project.fromDirectory(tmp)
expect(yield* directories(original.project.id)).toEqual([]) expect(yield* directories(original.project.id)).toEqual([])
expect(yield* directories(remoteID)).toEqual([ expect(yield* directories(remoteID)).toEqual([{ directory: AbsolutePath.make(tmp), strategy: undefined }])
{ directory: AbsolutePath.make(tmp), strategy: undefined },
])
}), }),
) )
}) })
@@ -106,7 +106,7 @@ describe("project directories and copies endpoints", () => {
test.directory, test.directory,
`/experimental/project/${projectID}/copy/refresh?location%5Bdirectory%5D=${encodeURIComponent(test.directory)}`, `/experimental/project/${projectID}/copy/refresh?location%5Bdirectory%5D=${encodeURIComponent(test.directory)}`,
{ {
method: "POST", method: "POST",
}, },
) )
expect(refresh.status).toBe(204) expect(refresh.status).toBe(204)
+369 -267
View File
@@ -3892,168 +3892,10 @@
] ]
} }
}, },
"/experimental/project/{projectID}/copy": { "/experimental/project/{projectID}/copy/generate-name": {
"post": { "post": {
"tags": ["projectCopy"], "tags": ["projectCopy"],
"operationId": "experimental.projectCopy.create", "operationId": "experimental.projectCopy.generateName",
"parameters": [
{
"name": "projectID",
"in": "path",
"schema": {
"type": "string"
},
"required": true
},
{
"name": "workspace",
"in": "query",
"schema": {
"type": "string"
},
"required": false
}
],
"responses": {
"200": {
"description": "Project copy created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProjectCopyCopy"
}
}
}
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/ProjectCopyError"
},
{
"$ref": "#/components/schemas/InvalidRequestError"
}
]
}
}
}
}
},
"description": "Create a local physical copy of a project using the selected strategy.",
"summary": "Create project copy",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"strategy": {
"type": "string",
"enum": ["git_worktree"]
},
"directory": {
"type": "string"
},
"name": {
"type": "string"
},
"context": {
"type": "string"
}
},
"required": ["strategy", "directory"],
"additionalProperties": false
}
}
}
},
"x-codeSamples": [
{
"lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.projectCopy.create({\n ...\n})"
}
]
},
"delete": {
"tags": ["projectCopy"],
"operationId": "experimental.projectCopy.remove",
"parameters": [
{
"name": "projectID",
"in": "path",
"schema": {
"type": "string"
},
"required": true
},
{
"name": "workspace",
"in": "query",
"schema": {
"type": "string"
},
"required": false
}
],
"responses": {
"204": {
"description": "Project copy removed"
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/ProjectCopyError"
},
{
"$ref": "#/components/schemas/InvalidRequestError"
}
]
}
}
}
}
},
"description": "Remove a local physical copy of a project using the selected strategy.",
"summary": "Remove project copy",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"directory": {
"type": "string"
},
"force": {
"type": "boolean"
}
},
"required": ["directory", "force"],
"additionalProperties": false
}
}
}
},
"x-codeSamples": [
{
"lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.projectCopy.remove({\n ...\n})"
}
]
}
},
"/experimental/project/{projectID}/copy/refresh": {
"post": {
"tags": ["projectCopy"],
"operationId": "experimental.projectCopy.refresh",
"parameters": [ "parameters": [
{ {
"name": "projectID", "name": "projectID",
@@ -4081,33 +3923,55 @@
} }
], ],
"responses": { "responses": {
"204": { "200": {
"description": "Project copies refreshed" "description": "Success",
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"anyOf": [ "type": "object",
{ "properties": {
"$ref": "#/components/schemas/ProjectCopyError" "name": {
}, "type": "string"
{
"$ref": "#/components/schemas/InvalidRequestError"
} }
] },
"required": ["name"],
"additionalProperties": false
}
}
}
},
"400": {
"description": "Bad request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/BadRequestError"
} }
} }
} }
} }
}, },
"description": "Discover local project copies using one or all configured strategies.", "description": "Generate a short name for a project copy from task context.",
"summary": "Refresh project copies", "summary": "Generate project copy name",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"context": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"x-codeSamples": [ "x-codeSamples": [
{ {
"lang": "js", "lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.projectCopy.refresh({\n ...\n})" "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.projectCopy.generateName({\n ...\n})"
} }
] ]
} }
@@ -13480,6 +13344,241 @@
] ]
} }
}, },
"/experimental/project/{projectID}/copy": {
"post": {
"tags": ["projectCopy"],
"operationId": "v2.projectCopy.create",
"parameters": [
{
"name": "projectID",
"in": "path",
"schema": {
"type": "string"
},
"required": true
},
{
"name": "location",
"in": "query",
"schema": {
"type": "object",
"properties": {
"directory": {
"type": "string"
},
"workspace": {
"type": "string"
}
},
"additionalProperties": false
},
"required": false,
"style": "deepObject",
"explode": true
}
],
"responses": {
"200": {
"description": "ProjectCopy.Copy",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ProjectCopyCopy"
}
}
}
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/ProjectCopyError"
},
{
"$ref": "#/components/schemas/InvalidRequestError"
}
]
}
}
}
}
},
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"strategy": {
"type": "string"
},
"directory": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": ["strategy", "directory"],
"additionalProperties": false
}
}
}
},
"x-codeSamples": [
{
"lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.v2.projectCopy.create({\n ...\n})"
}
]
},
"delete": {
"tags": ["projectCopy"],
"operationId": "v2.projectCopy.remove",
"parameters": [
{
"name": "projectID",
"in": "path",
"schema": {
"type": "string"
},
"required": true
},
{
"name": "location",
"in": "query",
"schema": {
"type": "object",
"properties": {
"directory": {
"type": "string"
},
"workspace": {
"type": "string"
}
},
"additionalProperties": false
},
"required": false,
"style": "deepObject",
"explode": true
}
],
"responses": {
"204": {
"description": "<No Content>"
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/ProjectCopyError"
},
{
"$ref": "#/components/schemas/InvalidRequestError"
}
]
}
}
}
}
},
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"directory": {
"type": "string"
},
"force": {
"type": "boolean"
}
},
"required": ["directory", "force"],
"additionalProperties": false
}
}
}
},
"x-codeSamples": [
{
"lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.v2.projectCopy.remove({\n ...\n})"
}
]
}
},
"/experimental/project/{projectID}/copy/refresh": {
"post": {
"tags": ["projectCopy"],
"operationId": "v2.projectCopy.refresh",
"parameters": [
{
"name": "projectID",
"in": "path",
"schema": {
"type": "string"
},
"required": true
},
{
"name": "location",
"in": "query",
"schema": {
"type": "object",
"properties": {
"directory": {
"type": "string"
},
"workspace": {
"type": "string"
}
},
"additionalProperties": false
},
"required": false,
"style": "deepObject",
"explode": true
}
],
"responses": {
"204": {
"description": "<No Content>"
},
"400": {
"description": "ProjectCopyError | InvalidRequestError",
"content": {
"application/json": {
"schema": {
"anyOf": [
{
"$ref": "#/components/schemas/ProjectCopyError"
},
{
"$ref": "#/components/schemas/InvalidRequestError"
}
]
}
}
}
}
},
"x-codeSamples": [
{
"lang": "js",
"source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.v2.projectCopy.refresh({\n ...\n})"
}
]
}
},
"/pty/{ptyID}/connect": { "/pty/{ptyID}/connect": {
"get": { "get": {
"tags": ["pty"], "tags": ["pty"],
@@ -13724,6 +13823,9 @@
{ {
"$ref": "#/components/schemas/EventReferenceUpdated" "$ref": "#/components/schemas/EventReferenceUpdated"
}, },
{
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
},
{ {
"$ref": "#/components/schemas/EventFileWatcherUpdated" "$ref": "#/components/schemas/EventFileWatcherUpdated"
}, },
@@ -13781,9 +13883,6 @@
{ {
"$ref": "#/components/schemas/EventCommandExecuted" "$ref": "#/components/schemas/EventCommandExecuted"
}, },
{
"$ref": "#/components/schemas/EventProjectDirectoriesUpdated"
},
{ {
"$ref": "#/components/schemas/EventProjectUpdated" "$ref": "#/components/schemas/EventProjectUpdated"
}, },
@@ -17651,6 +17750,31 @@
"required": ["id", "type", "properties"], "required": ["id", "type", "properties"],
"additionalProperties": false "additionalProperties": false
}, },
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^evt_"
},
"type": {
"type": "string",
"enum": ["project.directories.updated"]
},
"properties": {
"type": "object",
"properties": {
"projectID": {
"type": "string"
}
},
"required": ["projectID"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
{ {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -18265,31 +18389,6 @@
"required": ["id", "type", "properties"], "required": ["id", "type", "properties"],
"additionalProperties": false "additionalProperties": false
}, },
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^evt_"
},
"type": {
"type": "string",
"enum": ["project.directories.updated"]
},
"properties": {
"type": "object",
"properties": {
"projectID": {
"type": "string"
}
},
"required": ["projectID"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
{ {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -21105,30 +21204,6 @@
"required": ["_tag", "projectID", "message"], "required": ["_tag", "projectID", "message"],
"additionalProperties": false "additionalProperties": false
}, },
"ProjectCopyError": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": ["ProjectCopyError"]
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"forceRequired": {
"type": "boolean"
}
},
"required": ["message"],
"additionalProperties": false
}
},
"required": ["name", "data"],
"additionalProperties": false
},
"PtyNotFoundError": { "PtyNotFoundError": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -22007,6 +22082,30 @@
"required": ["_tag", "providerID", "message"], "required": ["_tag", "providerID", "message"],
"additionalProperties": false "additionalProperties": false
}, },
"ProjectCopyError": {
"type": "object",
"properties": {
"name": {
"type": "string",
"enum": ["ProjectCopyError"]
},
"data": {
"type": "object",
"properties": {
"message": {
"type": "string"
},
"forceRequired": {
"type": "boolean"
}
},
"required": ["message"],
"additionalProperties": false
}
},
"required": ["name", "data"],
"additionalProperties": false
},
"effect_HttpApiError_Forbidden": { "effect_HttpApiError_Forbidden": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -25177,25 +25276,14 @@
"directory": { "directory": {
"type": "string" "type": "string"
}, },
"type": { "strategy": {
"type": "string", "type": "string"
"enum": ["main", "root", "git_worktree"]
} }
}, },
"required": ["directory", "type"], "required": ["directory"],
"additionalProperties": false "additionalProperties": false
} }
}, },
"ProjectCopyCopy": {
"type": "object",
"properties": {
"directory": {
"type": "string"
}
},
"required": ["directory"],
"additionalProperties": false
},
"LocationInfo": { "LocationInfo": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -26749,6 +26837,16 @@
"required": ["name", "path", "source"], "required": ["name", "path", "source"],
"additionalProperties": false "additionalProperties": false
}, },
"ProjectCopyCopy": {
"type": "object",
"properties": {
"directory": {
"type": "string"
}
},
"required": ["directory"],
"additionalProperties": false
},
"EventModels-devRefreshed": { "EventModels-devRefreshed": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -29207,6 +29305,31 @@
"required": ["id", "type", "properties"], "required": ["id", "type", "properties"],
"additionalProperties": false "additionalProperties": false
}, },
"EventProjectDirectoriesUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^evt_"
},
"type": {
"type": "string",
"enum": ["project.directories.updated"]
},
"properties": {
"type": "object",
"properties": {
"projectID": {
"type": "string"
}
},
"required": ["projectID"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventFileWatcherUpdated": { "EventFileWatcherUpdated": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -29683,31 +29806,6 @@
"required": ["id", "type", "properties"], "required": ["id", "type", "properties"],
"additionalProperties": false "additionalProperties": false
}, },
"EventProjectDirectoriesUpdated": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^evt_"
},
"type": {
"type": "string",
"enum": ["project.directories.updated"]
},
"properties": {
"type": "object",
"properties": {
"projectID": {
"type": "string"
}
},
"required": ["projectID"],
"additionalProperties": false
}
},
"required": ["id", "type", "properties"],
"additionalProperties": false
},
"EventProjectUpdated": { "EventProjectUpdated": {
"type": "object", "type": "object",
"properties": { "properties": {
@@ -30244,7 +30342,7 @@
}, },
{ {
"name": "projectCopy", "name": "projectCopy",
"description": "Project copy management routes." "description": "Project copy naming routes."
}, },
{ {
"name": "pty", "name": "pty",
@@ -30342,6 +30440,10 @@
"name": "reference", "name": "reference",
"description": "Location-scoped project references." "description": "Location-scoped project references."
}, },
{
"name": "projectCopy",
"description": "Project copy management routes."
},
{ {
"name": "pty", "name": "pty",
"description": "PTY websocket route." "description": "PTY websocket route."
+1 -2
View File
@@ -61,8 +61,7 @@ function message(error: ProjectCopy.Error) {
return `Project copy destination already exists: ${error.directory}` return `Project copy destination already exists: ${error.directory}`
if (error instanceof ProjectCopy.DirectoryUnavailableError) if (error instanceof ProjectCopy.DirectoryUnavailableError)
return `Project copy directory unavailable: ${error.directory}` return `Project copy directory unavailable: ${error.directory}`
if (error instanceof ProjectCopy.InvalidDirectoryError) if (error instanceof ProjectCopy.InvalidDirectoryError) return `Invalid project copy directory: ${error.directory}`
return `Invalid project copy directory: ${error.directory}`
if (error instanceof ProjectCopy.StrategyUnavailableError) if (error instanceof ProjectCopy.StrategyUnavailableError)
return `Project copy strategy unavailable: ${error.strategy}` return `Project copy strategy unavailable: ${error.strategy}`
return error.message return error.message
@@ -80,8 +80,8 @@ export function DialogMoveSession(props: {
{ initialValue: props.initialDirectories }, { initialValue: props.initialDirectories },
) )
const currentDirectory = createMemo(() => const currentDirectory = createMemo(
replacementCurrent() ?? (props.current?.type === "directory" ? props.current.directory : currentCheckout()), () => replacementCurrent() ?? (props.current?.type === "directory" ? props.current.directory : currentCheckout()),
) )
const currentRoot = createMemo<ProjectDirectory | undefined>(() => { const currentRoot = createMemo<ProjectDirectory | undefined>(() => {
const directory = currentDirectory() const directory = currentDirectory()