@zyraxon-ai/server 19.0.4 → 19.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +8 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +26 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +36 -0
- package/dist/auth.js.map +1 -0
- package/dist/cors.d.ts +8 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +36 -0
- package/dist/cors.js.map +1 -0
- package/dist/handlers/agent.d.ts +2 -0
- package/dist/handlers/agent.d.ts.map +1 -0
- package/dist/handlers/agent.js +9 -0
- package/dist/handlers/agent.js.map +1 -0
- package/dist/handlers/command.d.ts +2 -0
- package/dist/handlers/command.d.ts.map +1 -0
- package/dist/handlers/command.js +6 -0
- package/dist/handlers/command.js.map +1 -0
- package/dist/handlers/credential.d.ts +2 -0
- package/dist/handlers/credential.d.ts.map +1 -0
- package/dist/handlers/credential.js +14 -0
- package/dist/handlers/credential.js.map +1 -0
- package/dist/handlers/event.d.ts +2 -0
- package/dist/handlers/event.d.ts.map +1 -0
- package/dist/handlers/event.js +41 -0
- package/dist/handlers/event.js.map +1 -0
- package/dist/handlers/fs.d.ts +2 -0
- package/dist/handlers/fs.d.ts.map +1 -0
- package/dist/handlers/fs.js +25 -0
- package/dist/handlers/fs.js.map +1 -0
- package/dist/handlers/health.d.ts +2 -0
- package/dist/handlers/health.d.ts.map +1 -0
- package/dist/handlers/health.js +5 -0
- package/dist/handlers/health.js.map +1 -0
- package/dist/handlers/integration.d.ts +2 -0
- package/dist/handlers/integration.d.ts.map +1 -0
- package/dist/handlers/integration.js +61 -0
- package/dist/handlers/integration.js.map +1 -0
- package/dist/handlers/location.d.ts +2 -0
- package/dist/handlers/location.d.ts.map +1 -0
- package/dist/handlers/location.js +13 -0
- package/dist/handlers/location.js.map +1 -0
- package/dist/handlers/message.d.ts +2 -0
- package/dist/handlers/message.d.ts.map +1 -0
- package/dist/handlers/message.js +57 -0
- package/dist/handlers/message.js.map +1 -0
- package/dist/handlers/model.d.ts +2 -0
- package/dist/handlers/model.d.ts.map +1 -0
- package/dist/handlers/model.js +12 -0
- package/dist/handlers/model.js.map +1 -0
- package/dist/handlers/permission.d.ts +2 -0
- package/dist/handlers/permission.d.ts.map +1 -0
- package/dist/handlers/permission.js +70 -0
- package/dist/handlers/permission.js.map +1 -0
- package/dist/handlers/project-copy.d.ts +2 -0
- package/dist/handlers/project-copy.d.ts.map +1 -0
- package/dist/handlers/project-copy.js +42 -0
- package/dist/handlers/project-copy.js.map +1 -0
- package/dist/handlers/provider.d.ts +2 -0
- package/dist/handlers/provider.d.ts.map +1 -0
- package/dist/handlers/provider.js +24 -0
- package/dist/handlers/provider.js.map +1 -0
- package/dist/handlers/pty.d.ts +2 -0
- package/dist/handlers/pty.d.ts.map +1 -0
- package/dist/handlers/pty.js +142 -0
- package/dist/handlers/pty.js.map +1 -0
- package/dist/handlers/question.d.ts +2 -0
- package/dist/handlers/question.d.ts.map +1 -0
- package/dist/handlers/question.js +39 -0
- package/dist/handlers/question.js.map +1 -0
- package/dist/handlers/reference.d.ts +2 -0
- package/dist/handlers/reference.d.ts.map +1 -0
- package/dist/handlers/reference.js +6 -0
- package/dist/handlers/reference.js.map +1 -0
- package/dist/handlers/session.d.ts +2 -0
- package/dist/handlers/session.d.ts.map +1 -0
- package/dist/handlers/session.js +206 -0
- package/dist/handlers/session.js.map +1 -0
- package/dist/handlers/skill.d.ts +2 -0
- package/dist/handlers/skill.d.ts.map +1 -0
- package/dist/handlers/skill.js +6 -0
- package/dist/handlers/skill.js.map +1 -0
- package/dist/handlers.d.ts +3 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +21 -0
- package/dist/handlers.js.map +1 -0
- package/dist/location.d.ts +21 -0
- package/dist/location.d.ts.map +1 -0
- package/dist/location.js +48 -0
- package/dist/location.js.map +1 -0
- package/dist/middleware/authorization.d.ts +6 -0
- package/dist/middleware/authorization.d.ts.map +1 -0
- package/dist/middleware/authorization.js +51 -0
- package/dist/middleware/authorization.js.map +1 -0
- package/dist/middleware/schema-error.d.ts +4 -0
- package/dist/middleware/schema-error.d.ts.map +1 -0
- package/dist/middleware/schema-error.js +16 -0
- package/dist/middleware/schema-error.js.map +1 -0
- package/dist/middleware/session-location.d.ts +16 -0
- package/dist/middleware/session-location.d.ts.map +1 -0
- package/dist/middleware/session-location.js +44 -0
- package/dist/middleware/session-location.js.map +1 -0
- package/dist/pty-environment.d.ts +14 -0
- package/dist/pty-environment.d.ts.map +1 -0
- package/dist/pty-environment.js +10 -0
- package/dist/pty-environment.js.map +1 -0
- package/dist/routes.d.ts +9 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +51 -0
- package/dist/routes.js.map +1 -0
- package/package.json +10 -6
- package/src/api.ts +0 -8
- package/src/auth.ts +0 -63
- package/src/cors.ts +0 -34
- package/src/handlers/agent.ts +0 -13
- package/src/handlers/command.ts +0 -8
- package/src/handlers/credential.ts +0 -22
- package/src/handlers/event.ts +0 -52
- package/src/handlers/fs.ts +0 -39
- package/src/handlers/health.ts +0 -7
- package/src/handlers/integration.ts +0 -104
- package/src/handlers/location.ts +0 -18
- package/src/handlers/message.ts +0 -81
- package/src/handlers/model.ts +0 -17
- package/src/handlers/permission.ts +0 -98
- package/src/handlers/project-copy.ts +0 -68
- package/src/handlers/provider.ts +0 -32
- package/src/handlers/pty.ts +0 -223
- package/src/handlers/question.ts +0 -62
- package/src/handlers/reference.ts +0 -8
- package/src/handlers/session.ts +0 -385
- package/src/handlers/skill.ts +0 -8
- package/src/handlers.ts +0 -40
- package/src/location.ts +0 -60
- package/src/middleware/authorization.ts +0 -58
- package/src/middleware/schema-error.ts +0 -20
- package/src/middleware/session-location.ts +0 -67
- package/src/pty-environment.ts +0 -19
- package/src/routes.ts +0 -68
- package/sst-env.d.ts +0 -10
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Location } from "@zyraxon-ai/core/location";
|
|
2
|
+
import { PermissionV2 } from "@zyraxon-ai/core/permission";
|
|
3
|
+
import { PermissionSaved } from "@zyraxon-ai/core/permission/saved";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
6
|
+
import { Api } from "../api";
|
|
7
|
+
import { PermissionNotFoundError, SessionNotFoundError } from "@zyraxon-ai/protocol/errors";
|
|
8
|
+
import { response } from "../location";
|
|
9
|
+
function missingRequest(id) {
|
|
10
|
+
return new PermissionNotFoundError({ requestID: id, message: `Permission request not found: ${id}` });
|
|
11
|
+
}
|
|
12
|
+
export const PermissionHandler = HttpApiBuilder.group(Api, "server.permission", (handlers) => Effect.gen(function* () {
|
|
13
|
+
return handlers
|
|
14
|
+
.handle("permission.request.list", Effect.fn(function* () {
|
|
15
|
+
return yield* response((yield* PermissionV2.Service).list());
|
|
16
|
+
}))
|
|
17
|
+
.handle("session.permission.create", Effect.fn(function* (ctx) {
|
|
18
|
+
const permission = yield* PermissionV2.Service;
|
|
19
|
+
return {
|
|
20
|
+
data: yield* permission
|
|
21
|
+
.ask({
|
|
22
|
+
id: ctx.payload.id,
|
|
23
|
+
sessionID: ctx.params.sessionID,
|
|
24
|
+
action: ctx.payload.action,
|
|
25
|
+
resources: ctx.payload.resources,
|
|
26
|
+
save: ctx.payload.save,
|
|
27
|
+
metadata: ctx.payload.metadata,
|
|
28
|
+
source: ctx.payload.source,
|
|
29
|
+
agent: ctx.payload.agent,
|
|
30
|
+
})
|
|
31
|
+
.pipe(Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
32
|
+
sessionID: error.sessionID,
|
|
33
|
+
message: `Session not found: ${error.sessionID}`,
|
|
34
|
+
}))),
|
|
35
|
+
};
|
|
36
|
+
}))
|
|
37
|
+
.handle("session.permission.list", Effect.fn(function* (ctx) {
|
|
38
|
+
const permission = yield* PermissionV2.Service;
|
|
39
|
+
return { data: yield* permission.forSession(ctx.params.sessionID) };
|
|
40
|
+
}))
|
|
41
|
+
.handle("session.permission.get", Effect.fn(function* (ctx) {
|
|
42
|
+
const request = yield* (yield* PermissionV2.Service).get(ctx.params.requestID);
|
|
43
|
+
if (!request || request.sessionID !== ctx.params.sessionID)
|
|
44
|
+
return yield* missingRequest(ctx.params.requestID);
|
|
45
|
+
return { data: request };
|
|
46
|
+
}))
|
|
47
|
+
.handle("session.permission.reply", Effect.fn(function* (ctx) {
|
|
48
|
+
const permission = yield* PermissionV2.Service;
|
|
49
|
+
const request = yield* permission.get(ctx.params.requestID);
|
|
50
|
+
if (!request || request.sessionID !== ctx.params.sessionID)
|
|
51
|
+
return yield* missingRequest(ctx.params.requestID);
|
|
52
|
+
yield* permission
|
|
53
|
+
.reply({ requestID: ctx.params.requestID, reply: ctx.payload.reply, message: ctx.payload.message })
|
|
54
|
+
.pipe(Effect.catchTag("PermissionV2.NotFoundError", () => missingRequest(ctx.params.requestID)));
|
|
55
|
+
return HttpApiSchema.NoContent.make();
|
|
56
|
+
}))
|
|
57
|
+
.handle("permission.saved.list", Effect.fn(function* (ctx) {
|
|
58
|
+
const location = yield* Location.Service;
|
|
59
|
+
return {
|
|
60
|
+
data: yield* (yield* PermissionSaved.Service).list({
|
|
61
|
+
projectID: ctx.query.projectID ?? location.project.id,
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}))
|
|
65
|
+
.handle("permission.saved.remove", Effect.fn(function* (ctx) {
|
|
66
|
+
yield* (yield* PermissionSaved.Service).remove(ctx.params.id);
|
|
67
|
+
return HttpApiSchema.NoContent.make();
|
|
68
|
+
}));
|
|
69
|
+
}));
|
|
70
|
+
//# sourceMappingURL=permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../src/handlers/permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC5B,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAC3F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,SAAS,cAAc,CAAC,EAAmB;IACzC,OAAO,IAAI,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,EAAE,CAAC,CAAA;AACvG,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC3F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,OAAO,QAAQ;SACZ,MAAM,CACL,yBAAyB,EACzB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACjB,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC9D,CAAC,CAAC,CACH;SACA,MAAM,CACL,2BAA2B,EAC3B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAA;QAC9C,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU;iBACpB,GAAG,CAAC;gBACH,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;gBAClB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;gBAC/B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC1B,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS;gBAChC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;gBACtB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ;gBAC9B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC1B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;aACzB,CAAC;iBACD,IAAI,CACH,MAAM,CAAC,QAAQ,CACb,uBAAuB,EACvB,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,oBAAoB,CAAC;gBACvB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,sBAAsB,KAAK,CAAC,SAAS,EAAE;aACjD,CAAC,CACL,CACF;SACJ,CAAA;IACH,CAAC,CAAC,CACH;SACA,MAAM,CACL,yBAAyB,EACzB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAA;QAC9C,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IACrE,CAAC,CAAC,CACH;SACA,MAAM,CACL,wBAAwB,EACxB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC9E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC9G,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC,CAAC,CACH;SACA,MAAM,CACL,0BAA0B,EAC1B,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAA;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC9G,KAAK,CAAC,CAAC,UAAU;aACd,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aAClG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAClG,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACvC,CAAC,CAAC,CACH;SACA,MAAM,CACL,uBAAuB,EACvB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAA;QACxC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;gBACjD,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE;aACtD,CAAC;SACH,CAAA;IACH,CAAC,CAAC,CACH;SACA,MAAM,CACL,yBAAyB,EACzB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC7D,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACvC,CAAC,CAAC,CACH,CAAA;AACL,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-copy.d.ts","sourceRoot":"","sources":["../../src/handlers/project-copy.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB,oHA+B9B,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Location } from "@zyraxon-ai/core/location";
|
|
2
|
+
import { ProjectCopy } from "@zyraxon-ai/core/project/copy";
|
|
3
|
+
import { Git } from "@zyraxon-ai/core/git";
|
|
4
|
+
import { Effect } from "effect";
|
|
5
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
6
|
+
import { Api } from "../api";
|
|
7
|
+
import { ProjectCopyError } from "@zyraxon-ai/protocol/groups/project-copy";
|
|
8
|
+
export const ProjectCopyHandler = HttpApiBuilder.group(Api, "server.projectCopy", (handlers) => Effect.succeed(handlers
|
|
9
|
+
.handle("projectCopy.create", (ctx) => Effect.gen(function* () {
|
|
10
|
+
const copies = yield* ProjectCopy.Service;
|
|
11
|
+
const location = yield* Location.Service;
|
|
12
|
+
return yield* badRequest(copies.create({
|
|
13
|
+
...ctx.payload,
|
|
14
|
+
projectID: ctx.params.projectID,
|
|
15
|
+
sourceDirectory: location.project.directory,
|
|
16
|
+
}));
|
|
17
|
+
}))
|
|
18
|
+
.handle("projectCopy.remove", (ctx) => ProjectCopy.Service.use((copies) => badRequest(copies.remove({ ...ctx.payload, projectID: ctx.params.projectID })).pipe(Effect.as(HttpApiSchema.NoContent.make()))))
|
|
19
|
+
.handle("projectCopy.refresh", (ctx) => ProjectCopy.Service.use((copies) => badRequest(copies.refresh({ projectID: ctx.params.projectID })).pipe(Effect.as(HttpApiSchema.NoContent.make()))))));
|
|
20
|
+
function badRequest(effect) {
|
|
21
|
+
return effect.pipe(Effect.mapError((error) => new ProjectCopyError({
|
|
22
|
+
name: "ProjectCopyError",
|
|
23
|
+
data: {
|
|
24
|
+
message: message(error),
|
|
25
|
+
forceRequired: error instanceof Git.WorktreeError ? error.forceRequired : undefined,
|
|
26
|
+
},
|
|
27
|
+
})));
|
|
28
|
+
}
|
|
29
|
+
function message(error) {
|
|
30
|
+
if (error instanceof ProjectCopy.SourceDirectoryNotFoundError)
|
|
31
|
+
return `Project copy source not found: ${error.directory}`;
|
|
32
|
+
if (error instanceof ProjectCopy.DestinationExistsError)
|
|
33
|
+
return `Project copy destination already exists: ${error.directory}`;
|
|
34
|
+
if (error instanceof ProjectCopy.DirectoryUnavailableError)
|
|
35
|
+
return `Project copy directory unavailable: ${error.directory}`;
|
|
36
|
+
if (error instanceof ProjectCopy.InvalidDirectoryError)
|
|
37
|
+
return `Invalid project copy directory: ${error.directory}`;
|
|
38
|
+
if (error instanceof ProjectCopy.StrategyUnavailableError)
|
|
39
|
+
return `Project copy strategy unavailable: ${error.strategy}`;
|
|
40
|
+
return error.message;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=project-copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-copy.js","sourceRoot":"","sources":["../../src/handlers/project-copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/handlers/provider.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,eAAe,oHAwB3B,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Catalog } from "@zyraxon-ai/core/catalog";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { HttpApiBuilder } from "effect/unstable/httpapi";
|
|
4
|
+
import { Api } from "../api";
|
|
5
|
+
import { ProviderNotFoundError } from "@zyraxon-ai/protocol/errors";
|
|
6
|
+
import { response } from "../location";
|
|
7
|
+
export const ProviderHandler = HttpApiBuilder.group(Api, "server.provider", (handlers) => Effect.gen(function* () {
|
|
8
|
+
return handlers
|
|
9
|
+
.handle("provider.list", Effect.fn(function* () {
|
|
10
|
+
const catalog = yield* Catalog.Service;
|
|
11
|
+
return yield* response(catalog.provider.all());
|
|
12
|
+
}))
|
|
13
|
+
.handle("provider.get", Effect.fn(function* (ctx) {
|
|
14
|
+
const catalog = yield* Catalog.Service;
|
|
15
|
+
const provider = yield* catalog.provider.get(ctx.params.providerID);
|
|
16
|
+
if (!provider)
|
|
17
|
+
return yield* new ProviderNotFoundError({
|
|
18
|
+
providerID: ctx.params.providerID,
|
|
19
|
+
message: `Provider not found: ${ctx.params.providerID}`,
|
|
20
|
+
});
|
|
21
|
+
return yield* response(Effect.succeed(provider));
|
|
22
|
+
}));
|
|
23
|
+
}));
|
|
24
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/handlers/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,CACvF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,OAAO,QAAQ;SACZ,MAAM,CACL,eAAe,EACf,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACjB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QACtC,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;IAChD,CAAC,CAAC,CACH;SACA,MAAM,CACL,cAAc,EACd,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QACnE,IAAI,CAAC,QAAQ;YACX,OAAO,KAAK,CAAC,CAAC,IAAI,qBAAqB,CAAC;gBACtC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU;gBACjC,OAAO,EAAE,uBAAuB,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE;aACxD,CAAC,CAAA;QACJ,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CACH,CAAA;AACL,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../../src/handlers/pty.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,UAAU,oHAsMtB,CAAA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Pty } from "@zyraxon-ai/core/pty";
|
|
2
|
+
import { PtyProtocol } from "@zyraxon-ai/core/pty/protocol";
|
|
3
|
+
import { PtyTicket } from "@zyraxon-ai/core/pty/ticket";
|
|
4
|
+
import { Location } from "@zyraxon-ai/core/location";
|
|
5
|
+
import { Effect, Queue } from "effect";
|
|
6
|
+
import { HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
|
|
7
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
8
|
+
import * as Socket from "effect/unstable/socket/Socket";
|
|
9
|
+
import { Api } from "../api";
|
|
10
|
+
import { CorsConfig, isAllowedRequestOrigin } from "../cors";
|
|
11
|
+
import { ForbiddenError, PtyNotFoundError } from "@zyraxon-ai/protocol/errors";
|
|
12
|
+
import { PTY_CONNECT_TICKET_QUERY, PTY_CONNECT_TOKEN_HEADER, PTY_CONNECT_TOKEN_HEADER_VALUE, } from "@zyraxon-ai/protocol/groups/pty";
|
|
13
|
+
import { response } from "../location";
|
|
14
|
+
import { PtyEnvironment } from "../pty-environment";
|
|
15
|
+
const ticketScope = Effect.gen(function* () {
|
|
16
|
+
const location = yield* Location.Service;
|
|
17
|
+
return { directory: location.directory, workspaceID: location.workspaceID };
|
|
18
|
+
});
|
|
19
|
+
export const PtyHandler = HttpApiBuilder.group(Api, "server.pty", (handlers) => Effect.gen(function* () {
|
|
20
|
+
const tickets = yield* PtyTicket.Service;
|
|
21
|
+
const cors = yield* CorsConfig;
|
|
22
|
+
const environment = yield* PtyEnvironment.Service;
|
|
23
|
+
return handlers
|
|
24
|
+
.handle("pty.list", Effect.fn(function* () {
|
|
25
|
+
return yield* response((yield* Pty.Service).list());
|
|
26
|
+
}))
|
|
27
|
+
.handle("pty.create", Effect.fn(function* (ctx) {
|
|
28
|
+
const pty = yield* Pty.Service;
|
|
29
|
+
const location = yield* Location.Service;
|
|
30
|
+
const cwd = ctx.payload.cwd || location.directory;
|
|
31
|
+
return yield* response(pty.create({
|
|
32
|
+
...ctx.payload,
|
|
33
|
+
args: ctx.payload.args ? [...ctx.payload.args] : undefined,
|
|
34
|
+
cwd,
|
|
35
|
+
env: {
|
|
36
|
+
...ctx.payload.env,
|
|
37
|
+
...(yield* environment.get({ directory: location.directory, cwd })),
|
|
38
|
+
},
|
|
39
|
+
}));
|
|
40
|
+
}))
|
|
41
|
+
.handle("pty.get", Effect.fn(function* (ctx) {
|
|
42
|
+
const pty = yield* Pty.Service;
|
|
43
|
+
return yield* response(pty.get(ctx.params.ptyID).pipe(Effect.catchTag("Pty.NotFoundError", () => new PtyNotFoundError({
|
|
44
|
+
ptyID: ctx.params.ptyID,
|
|
45
|
+
message: `PTY session not found: ${ctx.params.ptyID}`,
|
|
46
|
+
}))));
|
|
47
|
+
}))
|
|
48
|
+
.handle("pty.update", Effect.fn(function* (ctx) {
|
|
49
|
+
const pty = yield* Pty.Service;
|
|
50
|
+
return yield* response(pty
|
|
51
|
+
.update(ctx.params.ptyID, {
|
|
52
|
+
...ctx.payload,
|
|
53
|
+
size: ctx.payload.size ? { ...ctx.payload.size } : undefined,
|
|
54
|
+
})
|
|
55
|
+
.pipe(Effect.catchTag("Pty.NotFoundError", () => new PtyNotFoundError({
|
|
56
|
+
ptyID: ctx.params.ptyID,
|
|
57
|
+
message: `PTY session not found: ${ctx.params.ptyID}`,
|
|
58
|
+
}))));
|
|
59
|
+
}))
|
|
60
|
+
.handle("pty.remove", Effect.fn(function* (ctx) {
|
|
61
|
+
const pty = yield* Pty.Service;
|
|
62
|
+
yield* pty.remove(ctx.params.ptyID).pipe(Effect.catchTag("Pty.NotFoundError", () => new PtyNotFoundError({
|
|
63
|
+
ptyID: ctx.params.ptyID,
|
|
64
|
+
message: `PTY session not found: ${ctx.params.ptyID}`,
|
|
65
|
+
})));
|
|
66
|
+
return HttpApiSchema.NoContent.make();
|
|
67
|
+
}))
|
|
68
|
+
.handle("pty.connectToken", Effect.fn(function* (ctx) {
|
|
69
|
+
const request = yield* HttpServerRequest.HttpServerRequest;
|
|
70
|
+
// The custom header forces a CORS preflight, so cross-origin browser pages cannot
|
|
71
|
+
// mint tickets without passing the server's origin policy.
|
|
72
|
+
if (request.headers[PTY_CONNECT_TOKEN_HEADER] !== PTY_CONNECT_TOKEN_HEADER_VALUE ||
|
|
73
|
+
!isAllowedRequestOrigin(request.headers.origin, request.headers.host, cors))
|
|
74
|
+
return yield* new ForbiddenError({ message: "Invalid PTY connect token request" });
|
|
75
|
+
const pty = yield* Pty.Service;
|
|
76
|
+
yield* pty.get(ctx.params.ptyID).pipe(Effect.catchTag("Pty.NotFoundError", () => new PtyNotFoundError({
|
|
77
|
+
ptyID: ctx.params.ptyID,
|
|
78
|
+
message: `PTY session not found: ${ctx.params.ptyID}`,
|
|
79
|
+
})));
|
|
80
|
+
return yield* response(tickets.issue({ ptyID: ctx.params.ptyID, ...(yield* ticketScope) }));
|
|
81
|
+
}))
|
|
82
|
+
.handleRaw("pty.connect", Effect.fn("PtyHandler.connect")(function* (ctx) {
|
|
83
|
+
const pty = yield* Pty.Service;
|
|
84
|
+
const exists = yield* pty.get(ctx.params.ptyID).pipe(Effect.as(true), Effect.catchTag("Pty.NotFoundError", () => Effect.succeed(false)));
|
|
85
|
+
if (!exists)
|
|
86
|
+
return HttpServerResponse.empty({ status: 404 });
|
|
87
|
+
const url = new URL(ctx.request.url, "http://localhost");
|
|
88
|
+
const ticket = url.searchParams.get(PTY_CONNECT_TICKET_QUERY);
|
|
89
|
+
if (ticket) {
|
|
90
|
+
const valid = isAllowedRequestOrigin(ctx.request.headers.origin, ctx.request.headers.host, cors)
|
|
91
|
+
? yield* tickets.consume({ ticket, ptyID: ctx.params.ptyID, ...(yield* ticketScope) })
|
|
92
|
+
: false;
|
|
93
|
+
if (!valid)
|
|
94
|
+
return HttpServerResponse.empty({ status: 403 });
|
|
95
|
+
}
|
|
96
|
+
const parsedCursor = url.searchParams.get("cursor");
|
|
97
|
+
const cursorNumber = parsedCursor === null ? undefined : Number(parsedCursor);
|
|
98
|
+
const cursor = cursorNumber !== undefined && Number.isSafeInteger(cursorNumber) && cursorNumber >= -1
|
|
99
|
+
? cursorNumber
|
|
100
|
+
: undefined;
|
|
101
|
+
const socket = yield* Effect.orDie(ctx.request.upgrade);
|
|
102
|
+
const write = yield* socket.writer;
|
|
103
|
+
const closeAccepted = (event) => socket
|
|
104
|
+
.runRaw(() => Effect.void, { onOpen: write(event).pipe(Effect.catch(() => Effect.void)) })
|
|
105
|
+
.pipe(Effect.timeout("1 second"), Effect.catchReason("SocketError", "SocketCloseError", () => Effect.void), Effect.catch(() => Effect.void));
|
|
106
|
+
// Outbound frames flow through one queue drained by a single writer so replay, live
|
|
107
|
+
// output, and the close frame keep their order.
|
|
108
|
+
// TODO: Integrate graceful-shutdown socket tracking before clients migrate to this route.
|
|
109
|
+
const outbox = yield* Queue.unbounded();
|
|
110
|
+
const attachment = yield* pty
|
|
111
|
+
.attach(ctx.params.ptyID, {
|
|
112
|
+
cursor,
|
|
113
|
+
onData: (chunk) => Queue.offerUnsafe(outbox, chunk),
|
|
114
|
+
onEnd: () => Queue.offerUnsafe(outbox, new Socket.CloseEvent(1000)),
|
|
115
|
+
})
|
|
116
|
+
.pipe(Effect.catchTags({
|
|
117
|
+
"Pty.NotFoundError": () => closeAccepted(new Socket.CloseEvent(4404, "session not found")).pipe(Effect.as(undefined)),
|
|
118
|
+
"Pty.ExitedError": () => closeAccepted(new Socket.CloseEvent(4404, "session exited")).pipe(Effect.as(undefined)),
|
|
119
|
+
}));
|
|
120
|
+
if (!attachment)
|
|
121
|
+
return HttpServerResponse.empty();
|
|
122
|
+
for (const chunk of PtyProtocol.chunks(attachment.replay))
|
|
123
|
+
Queue.offerUnsafe(outbox, chunk);
|
|
124
|
+
Queue.offerUnsafe(outbox, PtyProtocol.metaFrame(attachment.cursor));
|
|
125
|
+
attachment.activate();
|
|
126
|
+
const drain = Effect.gen(function* () {
|
|
127
|
+
while (true) {
|
|
128
|
+
const item = yield* Queue.take(outbox);
|
|
129
|
+
yield* write(item);
|
|
130
|
+
if (item instanceof Socket.CloseEvent)
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
yield* Effect.race(drain, socket.runRaw((message) => {
|
|
135
|
+
const decoded = PtyProtocol.decodeInput(message);
|
|
136
|
+
if (decoded !== undefined)
|
|
137
|
+
attachment.write(decoded);
|
|
138
|
+
})).pipe(Effect.catchReason("SocketError", "SocketCloseError", () => Effect.void), Effect.ensuring(Effect.sync(() => attachment.detach())), Effect.orDie);
|
|
139
|
+
return HttpServerResponse.empty();
|
|
140
|
+
}));
|
|
141
|
+
}));
|
|
142
|
+
//# sourceMappingURL=pty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/handlers/pty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/handlers/question.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe,oHAkD3B,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { QuestionV2 } from "@zyraxon-ai/core/question";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
4
|
+
import { Api } from "../api";
|
|
5
|
+
import { QuestionNotFoundError } from "@zyraxon-ai/protocol/errors";
|
|
6
|
+
import { response } from "../location";
|
|
7
|
+
function missingRequest(id) {
|
|
8
|
+
return new QuestionNotFoundError({ requestID: id, message: `Question request not found: ${id}` });
|
|
9
|
+
}
|
|
10
|
+
export const QuestionHandler = HttpApiBuilder.group(Api, "server.question", (handlers) => Effect.gen(function* () {
|
|
11
|
+
const withOwnedQuestion = Effect.fnUntraced(function* (sessionID, requestID, use) {
|
|
12
|
+
const question = yield* QuestionV2.Service;
|
|
13
|
+
const request = (yield* question.list()).find((request) => request.id === requestID);
|
|
14
|
+
if (!request || request.sessionID !== sessionID)
|
|
15
|
+
return yield* missingRequest(requestID);
|
|
16
|
+
return yield* use(question);
|
|
17
|
+
});
|
|
18
|
+
return handlers
|
|
19
|
+
.handle("question.request.list", Effect.fn(function* () {
|
|
20
|
+
return yield* response((yield* QuestionV2.Service).list());
|
|
21
|
+
}))
|
|
22
|
+
.handle("session.question.list", Effect.fn(function* (ctx) {
|
|
23
|
+
const requests = yield* (yield* QuestionV2.Service).list();
|
|
24
|
+
return { data: requests.filter((request) => request.sessionID === ctx.params.sessionID) };
|
|
25
|
+
}))
|
|
26
|
+
.handle("session.question.reply", Effect.fn(function* (ctx) {
|
|
27
|
+
yield* withOwnedQuestion(ctx.params.sessionID, ctx.params.requestID, (question) => question
|
|
28
|
+
.reply({ requestID: ctx.params.requestID, answers: ctx.payload.answers })
|
|
29
|
+
.pipe(Effect.catchTag("QuestionV2.NotFoundError", () => missingRequest(ctx.params.requestID))));
|
|
30
|
+
return HttpApiSchema.NoContent.make();
|
|
31
|
+
}))
|
|
32
|
+
.handle("session.question.reject", Effect.fn(function* (ctx) {
|
|
33
|
+
yield* withOwnedQuestion(ctx.params.sessionID, ctx.params.requestID, (question) => question
|
|
34
|
+
.reject(ctx.params.requestID)
|
|
35
|
+
.pipe(Effect.catchTag("QuestionV2.NotFoundError", () => missingRequest(ctx.params.requestID))));
|
|
36
|
+
return HttpApiSchema.NoContent.make();
|
|
37
|
+
}));
|
|
38
|
+
}));
|
|
39
|
+
//# sourceMappingURL=question.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"question.js","sourceRoot":"","sources":["../../src/handlers/question.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/handlers/reference.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,oHAE5B,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Reference } from "@zyraxon-ai/core/reference";
|
|
2
|
+
import { HttpApiBuilder } from "effect/unstable/httpapi";
|
|
3
|
+
import { Api } from "../api";
|
|
4
|
+
import { response } from "../location";
|
|
5
|
+
export const ReferenceHandler = HttpApiBuilder.group(Api, "server.reference", (handlers) => handlers.handle("reference.list", () => response(Reference.Service.use((reference) => reference.list()))));
|
|
6
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/handlers/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CACzF,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAC1G,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,cAAc,oHA8W1B,CAAA"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { SessionV2 } from "@zyraxon-ai/core/session";
|
|
2
|
+
import { DateTime, Effect, Stream } from "effect";
|
|
3
|
+
import { HttpApiBuilder, HttpApiSchema } from "effect/unstable/httpapi";
|
|
4
|
+
import { Api } from "../api";
|
|
5
|
+
import { SessionsCursor } from "@zyraxon-ai/protocol/groups/session";
|
|
6
|
+
import { ConflictError, InvalidCursorError, MessageNotFoundError, ServiceUnavailableError, SessionNotFoundError, UnknownError, } from "@zyraxon-ai/protocol/errors";
|
|
7
|
+
import { AbsolutePath } from "@zyraxon-ai/core/schema";
|
|
8
|
+
const DefaultSessionsLimit = 50;
|
|
9
|
+
const DefaultSessionHistoryLimit = 50;
|
|
10
|
+
export const SessionHandler = HttpApiBuilder.group(Api, "server.session", (handlers) => Effect.gen(function* () {
|
|
11
|
+
const session = yield* SessionV2.Service;
|
|
12
|
+
return handlers
|
|
13
|
+
.handle("session.list", Effect.fn(function* (ctx) {
|
|
14
|
+
const query = ctx.query.cursor !== undefined
|
|
15
|
+
? yield* SessionsCursor.parse(ctx.query.cursor).pipe(Effect.mapError(() => new InvalidCursorError({ message: "Invalid cursor" })))
|
|
16
|
+
: ctx.query;
|
|
17
|
+
const sessions = yield* session.list({
|
|
18
|
+
...query,
|
|
19
|
+
workspaceID: query.workspace,
|
|
20
|
+
limit: ctx.query.limit ?? DefaultSessionsLimit,
|
|
21
|
+
});
|
|
22
|
+
const first = sessions[0];
|
|
23
|
+
const last = sessions.at(-1);
|
|
24
|
+
return {
|
|
25
|
+
data: sessions,
|
|
26
|
+
cursor: {
|
|
27
|
+
previous: first
|
|
28
|
+
? SessionsCursor.make({
|
|
29
|
+
...query,
|
|
30
|
+
anchor: {
|
|
31
|
+
id: first.id,
|
|
32
|
+
time: DateTime.toEpochMillis(first.time.created),
|
|
33
|
+
direction: "previous",
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
: undefined,
|
|
37
|
+
next: last
|
|
38
|
+
? SessionsCursor.make({
|
|
39
|
+
...query,
|
|
40
|
+
anchor: {
|
|
41
|
+
id: last.id,
|
|
42
|
+
time: DateTime.toEpochMillis(last.time.created),
|
|
43
|
+
direction: "next",
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
: undefined,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}))
|
|
50
|
+
.handle("session.create", Effect.fn(function* (ctx) {
|
|
51
|
+
return {
|
|
52
|
+
data: yield* session.create({
|
|
53
|
+
id: ctx.payload.id,
|
|
54
|
+
agent: ctx.payload.agent,
|
|
55
|
+
model: ctx.payload.model,
|
|
56
|
+
location: ctx.payload.location ?? { directory: AbsolutePath.make(process.cwd()) },
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
}))
|
|
60
|
+
.handle("session.active", Effect.fn(function* () {
|
|
61
|
+
return {
|
|
62
|
+
data: Object.fromEntries(Array.from(yield* session.active, (sessionID) => [sessionID, { type: "running" }])),
|
|
63
|
+
};
|
|
64
|
+
}))
|
|
65
|
+
.handle("session.get", Effect.fn(function* (ctx) {
|
|
66
|
+
return {
|
|
67
|
+
data: yield* session.get(ctx.params.sessionID).pipe(Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
68
|
+
sessionID: error.sessionID,
|
|
69
|
+
message: `Session not found: ${error.sessionID}`,
|
|
70
|
+
}))),
|
|
71
|
+
};
|
|
72
|
+
}))
|
|
73
|
+
.handle("session.switchAgent", Effect.fn(function* (ctx) {
|
|
74
|
+
yield* session.switchAgent({ sessionID: ctx.params.sessionID, agent: ctx.payload.agent }).pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
75
|
+
sessionID: error.sessionID,
|
|
76
|
+
message: `Session not found: ${error.sessionID}`,
|
|
77
|
+
}))));
|
|
78
|
+
return HttpApiSchema.NoContent.make();
|
|
79
|
+
}))
|
|
80
|
+
.handle("session.switchModel", Effect.fn(function* (ctx) {
|
|
81
|
+
yield* session.switchModel({ sessionID: ctx.params.sessionID, model: ctx.payload.model }).pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
82
|
+
sessionID: error.sessionID,
|
|
83
|
+
message: `Session not found: ${error.sessionID}`,
|
|
84
|
+
}))));
|
|
85
|
+
return HttpApiSchema.NoContent.make();
|
|
86
|
+
}))
|
|
87
|
+
.handle("session.prompt", Effect.fn(function* (ctx) {
|
|
88
|
+
return {
|
|
89
|
+
data: yield* session
|
|
90
|
+
.prompt({
|
|
91
|
+
sessionID: ctx.params.sessionID,
|
|
92
|
+
id: ctx.payload.id,
|
|
93
|
+
prompt: ctx.payload.prompt,
|
|
94
|
+
delivery: ctx.payload.delivery,
|
|
95
|
+
resume: ctx.payload.resume,
|
|
96
|
+
})
|
|
97
|
+
.pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
98
|
+
sessionID: error.sessionID,
|
|
99
|
+
message: `Session not found: ${error.sessionID}`,
|
|
100
|
+
}))), Effect.catchTag("Session.PromptConflictError", (error) => Effect.fail(new ConflictError({
|
|
101
|
+
message: `Prompt message ID conflicts with an existing durable record: ${error.messageID}`,
|
|
102
|
+
resource: error.messageID,
|
|
103
|
+
})))),
|
|
104
|
+
};
|
|
105
|
+
}))
|
|
106
|
+
.handle("session.compact", Effect.fn(function* (ctx) {
|
|
107
|
+
yield* session.compact({ sessionID: ctx.params.sessionID }).pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
108
|
+
sessionID: error.sessionID,
|
|
109
|
+
message: `Session not found: ${error.sessionID}`,
|
|
110
|
+
}))), Effect.catchTag("Session.OperationUnavailableError", (error) => Effect.fail(new ServiceUnavailableError({
|
|
111
|
+
message: `Session ${error.operation} is not available yet`,
|
|
112
|
+
service: `session.${error.operation}`,
|
|
113
|
+
}))));
|
|
114
|
+
return HttpApiSchema.NoContent.make();
|
|
115
|
+
}))
|
|
116
|
+
.handle("session.wait", Effect.fn(function* (ctx) {
|
|
117
|
+
yield* session.wait(ctx.params.sessionID).pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
118
|
+
sessionID: error.sessionID,
|
|
119
|
+
message: `Session not found: ${error.sessionID}`,
|
|
120
|
+
}))), Effect.catchTag("Session.OperationUnavailableError", (error) => Effect.fail(new ServiceUnavailableError({
|
|
121
|
+
message: `Session ${error.operation} is not available yet`,
|
|
122
|
+
service: `session.${error.operation}`,
|
|
123
|
+
}))));
|
|
124
|
+
return HttpApiSchema.NoContent.make();
|
|
125
|
+
}))
|
|
126
|
+
.handle("session.revert.stage", Effect.fn(function* (ctx) {
|
|
127
|
+
return {
|
|
128
|
+
data: yield* session.revert.stage({ ...ctx.params, ...ctx.payload }).pipe(Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
129
|
+
sessionID: error.sessionID,
|
|
130
|
+
message: `Session not found: ${error.sessionID}`,
|
|
131
|
+
})), Effect.catchTag("Session.MessageNotFoundError", (error) => new MessageNotFoundError({
|
|
132
|
+
sessionID: error.sessionID,
|
|
133
|
+
messageID: error.messageID,
|
|
134
|
+
message: `Message not found: ${error.messageID}`,
|
|
135
|
+
})), Effect.catchTag("Snapshot.Error", (error) => {
|
|
136
|
+
const ref = `err_${crypto.randomUUID().slice(0, 8)}`;
|
|
137
|
+
return Effect.logError("failed to stage session revert", { cause: error }).pipe(Effect.andThen(Effect.fail(new UnknownError({
|
|
138
|
+
message: "Unexpected server error. Check server logs for details.",
|
|
139
|
+
ref,
|
|
140
|
+
}))));
|
|
141
|
+
})),
|
|
142
|
+
};
|
|
143
|
+
}))
|
|
144
|
+
.handle("session.revert.clear", Effect.fn(function* (ctx) {
|
|
145
|
+
yield* session.revert.clear(ctx.params.sessionID).pipe(Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
146
|
+
sessionID: error.sessionID,
|
|
147
|
+
message: `Session not found: ${error.sessionID}`,
|
|
148
|
+
})), Effect.catchTag("Snapshot.Error", (error) => {
|
|
149
|
+
const ref = `err_${crypto.randomUUID().slice(0, 8)}`;
|
|
150
|
+
return Effect.logError("failed to clear session revert", { cause: error }).pipe(Effect.andThen(Effect.fail(new UnknownError({
|
|
151
|
+
message: "Unexpected server error. Check server logs for details.",
|
|
152
|
+
ref,
|
|
153
|
+
}))));
|
|
154
|
+
}));
|
|
155
|
+
return HttpApiSchema.NoContent.make();
|
|
156
|
+
}))
|
|
157
|
+
.handle("session.revert.commit", Effect.fn(function* (ctx) {
|
|
158
|
+
yield* session.revert.commit(ctx.params.sessionID).pipe(Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
159
|
+
sessionID: error.sessionID,
|
|
160
|
+
message: `Session not found: ${error.sessionID}`,
|
|
161
|
+
})));
|
|
162
|
+
return HttpApiSchema.NoContent.make();
|
|
163
|
+
}))
|
|
164
|
+
.handle("session.context", Effect.fn(function* (ctx) {
|
|
165
|
+
return {
|
|
166
|
+
data: yield* session.context(ctx.params.sessionID).pipe(Effect.catchTag("Session.NotFoundError", (error) => Effect.fail(new SessionNotFoundError({
|
|
167
|
+
sessionID: error.sessionID,
|
|
168
|
+
message: `Session not found: ${error.sessionID}`,
|
|
169
|
+
}))), Effect.catchTag("Session.MessageDecodeError", (error) => {
|
|
170
|
+
const ref = `err_${crypto.randomUUID().slice(0, 8)}`;
|
|
171
|
+
return Effect.logError("failed to decode session message").pipe(Effect.annotateLogs({ ref, sessionID: error.sessionID, messageID: error.messageID }), Effect.andThen(Effect.fail(new UnknownError({ message: "Unexpected server error. Check server logs for details.", ref }))));
|
|
172
|
+
})),
|
|
173
|
+
};
|
|
174
|
+
}))
|
|
175
|
+
.handle("session.history", Effect.fn(function* (ctx) {
|
|
176
|
+
return yield* session
|
|
177
|
+
.history({
|
|
178
|
+
sessionID: ctx.params.sessionID,
|
|
179
|
+
after: ctx.query.after,
|
|
180
|
+
limit: ctx.query.limit ?? DefaultSessionHistoryLimit,
|
|
181
|
+
})
|
|
182
|
+
.pipe(Effect.map((page) => ({
|
|
183
|
+
data: page.events,
|
|
184
|
+
hasMore: page.hasMore,
|
|
185
|
+
})), Effect.catchTag("Session.NotFoundError", (error) => new SessionNotFoundError({
|
|
186
|
+
sessionID: error.sessionID,
|
|
187
|
+
message: `Session not found: ${error.sessionID}`,
|
|
188
|
+
})));
|
|
189
|
+
}))
|
|
190
|
+
.handle("session.events", Effect.fn((ctx) => Effect.succeed(session.events({ sessionID: ctx.params.sessionID, after: ctx.query.after }).pipe(Stream.orDie))))
|
|
191
|
+
.handle("session.interrupt", Effect.fn(function* (ctx) {
|
|
192
|
+
yield* session.interrupt(ctx.params.sessionID);
|
|
193
|
+
return HttpApiSchema.NoContent.make();
|
|
194
|
+
}))
|
|
195
|
+
.handle("session.message", Effect.fn(function* (ctx) {
|
|
196
|
+
const message = yield* session.message(ctx.params);
|
|
197
|
+
if (message)
|
|
198
|
+
return { data: message };
|
|
199
|
+
return yield* new MessageNotFoundError({
|
|
200
|
+
sessionID: ctx.params.sessionID,
|
|
201
|
+
messageID: ctx.params.messageID,
|
|
202
|
+
message: `Message not found: ${ctx.params.messageID}`,
|
|
203
|
+
});
|
|
204
|
+
}));
|
|
205
|
+
}));
|
|
206
|
+
//# sourceMappingURL=session.js.map
|