@@ -74,6 +74,7 @@ import {
7474 downAllProjects ,
7575 downProject ,
7676 getProject ,
77+ getProjectItemByKey ,
7778 listProjects ,
7879 readProjectLogs ,
7980 readProjectPs ,
@@ -106,7 +107,13 @@ import {
106107} from "./services/project-port-forwards.js"
107108import { proxyProjectPortForward } from "./services/project-port-proxy.js"
108109import { parseProjectPortProxyPath } from "./services/project-port-proxy-core.js"
109- import { createTerminalSession , deleteTerminalSession } from "./services/terminal-sessions.js"
110+ import {
111+ createTerminalSession ,
112+ deleteTerminalSession ,
113+ getProjectTerminalSession ,
114+ listProjectTerminalSessions ,
115+ lookupTerminalSessionById
116+ } from "./services/terminal-sessions.js"
110117import {
111118 commitStateFromRequest ,
112119 initStateFromRequest ,
@@ -121,6 +128,10 @@ const ProjectParamsSchema = Schema.Struct({
121128 projectId : Schema . String
122129} )
123130
131+ const ProjectKeyParamsSchema = Schema . Struct ( {
132+ projectKey : Schema . String
133+ } )
134+
124135const ProjectPortForwardParamsSchema = Schema . Struct ( {
125136 projectId : Schema . String ,
126137 targetPort : Schema . String
@@ -141,6 +152,11 @@ const TerminalSessionParamsSchema = Schema.Struct({
141152 sessionId : Schema . String
142153} )
143154
155+ const TerminalSessionByProjectKeyParamsSchema = Schema . Struct ( {
156+ projectKey : Schema . String ,
157+ sessionId : Schema . String
158+ } )
159+
144160const ContainerTaskParamsSchema = Schema . Struct ( {
145161 projectId : Schema . String ,
146162 pid : Schema . String
@@ -311,10 +327,12 @@ const errorResponse = (error: ApiError | unknown) => {
311327}
312328
313329const projectParams = HttpRouter . schemaParams ( ProjectParamsSchema )
330+ const projectKeyParams = HttpRouter . schemaParams ( ProjectKeyParamsSchema )
314331const projectPortForwardParams = HttpRouter . schemaParams ( ProjectPortForwardParamsSchema )
315332const projectDatabaseProfileParams = HttpRouter . schemaParams ( ProjectDatabaseProfileParamsSchema )
316333const agentParams = HttpRouter . schemaParams ( AgentParamsSchema )
317334const terminalSessionParams = HttpRouter . schemaParams ( TerminalSessionParamsSchema )
335+ const terminalSessionByProjectKeyParams = HttpRouter . schemaParams ( TerminalSessionByProjectKeyParamsSchema )
318336const containerTaskParams = HttpRouter . schemaParams ( ContainerTaskParamsSchema )
319337const authTerminalSessionParams = HttpRouter . schemaParams ( AuthTerminalSessionParamsSchema )
320338
@@ -521,6 +539,14 @@ export const makeRouter = () => {
521539 "/auth/terminal-sessions/:sessionId/ws" ,
522540 terminalWebSocketUpgradeResponse . pipe ( Effect . catchAll ( errorResponse ) )
523541 ) ,
542+ HttpRouter . get (
543+ "/terminal-sessions/:sessionId" ,
544+ Effect . gen ( function * ( _ ) {
545+ const params = yield * _ ( authTerminalSessionParams )
546+ const session = yield * _ ( lookupTerminalSessionById ( params . sessionId ) )
547+ return yield * _ ( jsonResponse ( session , 200 ) )
548+ } ) . pipe ( Effect . catchAll ( errorResponse ) )
549+ ) ,
524550 HttpRouter . del (
525551 "/auth/terminal-sessions/:sessionId" ,
526552 Effect . gen ( function * ( _ ) {
@@ -954,6 +980,58 @@ export const makeRouter = () => {
954980 Effect . catchAll ( errorResponse )
955981 )
956982 ) ,
983+ HttpRouter . post (
984+ "/projects/by-key/:projectKey/terminal-sessions" ,
985+ projectKeyParams . pipe (
986+ Effect . flatMap ( ( { projectKey } ) =>
987+ getProjectItemByKey ( projectKey ) . pipe (
988+ Effect . flatMap ( ( project ) => createTerminalSession ( project . projectDir ) )
989+ )
990+ ) ,
991+ Effect . flatMap ( ( { project, session } ) => jsonResponse ( { ok : true , project, session } , 201 ) ) ,
992+ Effect . catchAll ( errorResponse )
993+ )
994+ ) ,
995+ HttpRouter . get (
996+ "/projects/by-key/:projectKey/terminal-sessions" ,
997+ projectKeyParams . pipe (
998+ Effect . flatMap ( ( { projectKey } ) =>
999+ getProjectItemByKey ( projectKey ) . pipe (
1000+ Effect . map ( ( project ) => ( { sessions : listProjectTerminalSessions ( project . projectDir ) } ) )
1001+ )
1002+ ) ,
1003+ Effect . flatMap ( ( body ) => jsonResponse ( body , 200 ) ) ,
1004+ Effect . catchAll ( errorResponse )
1005+ )
1006+ ) ,
1007+ HttpRouter . get (
1008+ "/projects/by-key/:projectKey/terminal-sessions/:sessionId" ,
1009+ terminalSessionByProjectKeyParams . pipe (
1010+ Effect . flatMap ( ( { projectKey, sessionId } ) =>
1011+ getProjectItemByKey ( projectKey ) . pipe (
1012+ Effect . flatMap ( ( project ) => getProjectTerminalSession ( project . projectDir , sessionId ) )
1013+ )
1014+ ) ,
1015+ Effect . flatMap ( ( session ) => jsonResponse ( { session } , 200 ) ) ,
1016+ Effect . catchAll ( errorResponse )
1017+ )
1018+ ) ,
1019+ HttpRouter . get (
1020+ "/projects/by-key/:projectKey/terminal-sessions/:sessionId/ws" ,
1021+ terminalWebSocketUpgradeResponse . pipe ( Effect . catchAll ( errorResponse ) )
1022+ ) ,
1023+ HttpRouter . del (
1024+ "/projects/by-key/:projectKey/terminal-sessions/:sessionId" ,
1025+ terminalSessionByProjectKeyParams . pipe (
1026+ Effect . flatMap ( ( { projectKey, sessionId } ) =>
1027+ getProjectItemByKey ( projectKey ) . pipe (
1028+ Effect . flatMap ( ( project ) => deleteTerminalSession ( project . projectDir , sessionId ) )
1029+ )
1030+ ) ,
1031+ Effect . flatMap ( ( ) => jsonResponse ( { ok : true } , 200 ) ) ,
1032+ Effect . catchAll ( errorResponse )
1033+ )
1034+ ) ,
9571035 HttpRouter . post (
9581036 "/projects/:projectId/terminal-sessions" ,
9591037 projectParams . pipe (
@@ -962,6 +1040,22 @@ export const makeRouter = () => {
9621040 Effect . catchAll ( errorResponse )
9631041 )
9641042 ) ,
1043+ HttpRouter . get (
1044+ "/projects/:projectId/terminal-sessions" ,
1045+ projectParams . pipe (
1046+ Effect . flatMap ( ( { projectId } ) => Effect . succeed ( { sessions : listProjectTerminalSessions ( projectId ) } ) ) ,
1047+ Effect . flatMap ( ( body ) => jsonResponse ( body , 200 ) ) ,
1048+ Effect . catchAll ( errorResponse )
1049+ )
1050+ ) ,
1051+ HttpRouter . get (
1052+ "/projects/:projectId/terminal-sessions/:sessionId" ,
1053+ terminalSessionParams . pipe (
1054+ Effect . flatMap ( ( { projectId, sessionId } ) => getProjectTerminalSession ( projectId , sessionId ) ) ,
1055+ Effect . flatMap ( ( session ) => jsonResponse ( { session } , 200 ) ) ,
1056+ Effect . catchAll ( errorResponse )
1057+ )
1058+ ) ,
9651059 HttpRouter . get (
9661060 "/projects/:projectId/terminal-sessions/:sessionId/ws" ,
9671061 terminalWebSocketUpgradeResponse . pipe ( Effect . catchAll ( errorResponse ) )
0 commit comments