@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.
Files changed (143) hide show
  1. package/dist/api.d.ts +2 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +8 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/auth.d.ts +26 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +36 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/cors.d.ts +8 -0
  10. package/dist/cors.d.ts.map +1 -0
  11. package/dist/cors.js +36 -0
  12. package/dist/cors.js.map +1 -0
  13. package/dist/handlers/agent.d.ts +2 -0
  14. package/dist/handlers/agent.d.ts.map +1 -0
  15. package/dist/handlers/agent.js +9 -0
  16. package/dist/handlers/agent.js.map +1 -0
  17. package/dist/handlers/command.d.ts +2 -0
  18. package/dist/handlers/command.d.ts.map +1 -0
  19. package/dist/handlers/command.js +6 -0
  20. package/dist/handlers/command.js.map +1 -0
  21. package/dist/handlers/credential.d.ts +2 -0
  22. package/dist/handlers/credential.d.ts.map +1 -0
  23. package/dist/handlers/credential.js +14 -0
  24. package/dist/handlers/credential.js.map +1 -0
  25. package/dist/handlers/event.d.ts +2 -0
  26. package/dist/handlers/event.d.ts.map +1 -0
  27. package/dist/handlers/event.js +41 -0
  28. package/dist/handlers/event.js.map +1 -0
  29. package/dist/handlers/fs.d.ts +2 -0
  30. package/dist/handlers/fs.d.ts.map +1 -0
  31. package/dist/handlers/fs.js +25 -0
  32. package/dist/handlers/fs.js.map +1 -0
  33. package/dist/handlers/health.d.ts +2 -0
  34. package/dist/handlers/health.d.ts.map +1 -0
  35. package/dist/handlers/health.js +5 -0
  36. package/dist/handlers/health.js.map +1 -0
  37. package/dist/handlers/integration.d.ts +2 -0
  38. package/dist/handlers/integration.d.ts.map +1 -0
  39. package/dist/handlers/integration.js +61 -0
  40. package/dist/handlers/integration.js.map +1 -0
  41. package/dist/handlers/location.d.ts +2 -0
  42. package/dist/handlers/location.d.ts.map +1 -0
  43. package/dist/handlers/location.js +13 -0
  44. package/dist/handlers/location.js.map +1 -0
  45. package/dist/handlers/message.d.ts +2 -0
  46. package/dist/handlers/message.d.ts.map +1 -0
  47. package/dist/handlers/message.js +57 -0
  48. package/dist/handlers/message.js.map +1 -0
  49. package/dist/handlers/model.d.ts +2 -0
  50. package/dist/handlers/model.d.ts.map +1 -0
  51. package/dist/handlers/model.js +12 -0
  52. package/dist/handlers/model.js.map +1 -0
  53. package/dist/handlers/permission.d.ts +2 -0
  54. package/dist/handlers/permission.d.ts.map +1 -0
  55. package/dist/handlers/permission.js +70 -0
  56. package/dist/handlers/permission.js.map +1 -0
  57. package/dist/handlers/project-copy.d.ts +2 -0
  58. package/dist/handlers/project-copy.d.ts.map +1 -0
  59. package/dist/handlers/project-copy.js +42 -0
  60. package/dist/handlers/project-copy.js.map +1 -0
  61. package/dist/handlers/provider.d.ts +2 -0
  62. package/dist/handlers/provider.d.ts.map +1 -0
  63. package/dist/handlers/provider.js +24 -0
  64. package/dist/handlers/provider.js.map +1 -0
  65. package/dist/handlers/pty.d.ts +2 -0
  66. package/dist/handlers/pty.d.ts.map +1 -0
  67. package/dist/handlers/pty.js +142 -0
  68. package/dist/handlers/pty.js.map +1 -0
  69. package/dist/handlers/question.d.ts +2 -0
  70. package/dist/handlers/question.d.ts.map +1 -0
  71. package/dist/handlers/question.js +39 -0
  72. package/dist/handlers/question.js.map +1 -0
  73. package/dist/handlers/reference.d.ts +2 -0
  74. package/dist/handlers/reference.d.ts.map +1 -0
  75. package/dist/handlers/reference.js +6 -0
  76. package/dist/handlers/reference.js.map +1 -0
  77. package/dist/handlers/session.d.ts +2 -0
  78. package/dist/handlers/session.d.ts.map +1 -0
  79. package/dist/handlers/session.js +206 -0
  80. package/dist/handlers/session.js.map +1 -0
  81. package/dist/handlers/skill.d.ts +2 -0
  82. package/dist/handlers/skill.d.ts.map +1 -0
  83. package/dist/handlers/skill.js +6 -0
  84. package/dist/handlers/skill.js.map +1 -0
  85. package/dist/handlers.d.ts +3 -0
  86. package/dist/handlers.d.ts.map +1 -0
  87. package/dist/handlers.js +21 -0
  88. package/dist/handlers.js.map +1 -0
  89. package/dist/location.d.ts +21 -0
  90. package/dist/location.d.ts.map +1 -0
  91. package/dist/location.js +48 -0
  92. package/dist/location.js.map +1 -0
  93. package/dist/middleware/authorization.d.ts +6 -0
  94. package/dist/middleware/authorization.d.ts.map +1 -0
  95. package/dist/middleware/authorization.js +51 -0
  96. package/dist/middleware/authorization.js.map +1 -0
  97. package/dist/middleware/schema-error.d.ts +4 -0
  98. package/dist/middleware/schema-error.d.ts.map +1 -0
  99. package/dist/middleware/schema-error.js +16 -0
  100. package/dist/middleware/schema-error.js.map +1 -0
  101. package/dist/middleware/session-location.d.ts +16 -0
  102. package/dist/middleware/session-location.d.ts.map +1 -0
  103. package/dist/middleware/session-location.js +44 -0
  104. package/dist/middleware/session-location.js.map +1 -0
  105. package/dist/pty-environment.d.ts +14 -0
  106. package/dist/pty-environment.d.ts.map +1 -0
  107. package/dist/pty-environment.js +10 -0
  108. package/dist/pty-environment.js.map +1 -0
  109. package/dist/routes.d.ts +9 -0
  110. package/dist/routes.d.ts.map +1 -0
  111. package/dist/routes.js +51 -0
  112. package/dist/routes.js.map +1 -0
  113. package/package.json +10 -6
  114. package/src/api.ts +0 -8
  115. package/src/auth.ts +0 -63
  116. package/src/cors.ts +0 -34
  117. package/src/handlers/agent.ts +0 -13
  118. package/src/handlers/command.ts +0 -8
  119. package/src/handlers/credential.ts +0 -22
  120. package/src/handlers/event.ts +0 -52
  121. package/src/handlers/fs.ts +0 -39
  122. package/src/handlers/health.ts +0 -7
  123. package/src/handlers/integration.ts +0 -104
  124. package/src/handlers/location.ts +0 -18
  125. package/src/handlers/message.ts +0 -81
  126. package/src/handlers/model.ts +0 -17
  127. package/src/handlers/permission.ts +0 -98
  128. package/src/handlers/project-copy.ts +0 -68
  129. package/src/handlers/provider.ts +0 -32
  130. package/src/handlers/pty.ts +0 -223
  131. package/src/handlers/question.ts +0 -62
  132. package/src/handlers/reference.ts +0 -8
  133. package/src/handlers/session.ts +0 -385
  134. package/src/handlers/skill.ts +0 -8
  135. package/src/handlers.ts +0 -40
  136. package/src/location.ts +0 -60
  137. package/src/middleware/authorization.ts +0 -58
  138. package/src/middleware/schema-error.ts +0 -20
  139. package/src/middleware/session-location.ts +0 -67
  140. package/src/pty-environment.ts +0 -19
  141. package/src/routes.ts +0 -68
  142. package/sst-env.d.ts +0 -10
  143. 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":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const ProjectCopyHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=project-copy.d.ts.map
@@ -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,2 @@
1
+ export declare const ProviderHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=provider.d.ts.map
@@ -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,2 @@
1
+ export declare const PtyHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=pty.d.ts.map
@@ -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,2 @@
1
+ export declare const QuestionHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=question.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,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,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,SAAS,cAAc,CAAC,EAAiB;IACvC,OAAO,IAAI,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,EAAE,EAAE,CAAC,CAAA;AACnG,CAAC;AAED,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,MAAM,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EACnD,SAA0C,EAC1C,SAAwB,EACxB,GAA4D;QAE5D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAA;QAC1C,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QACxF,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ;SACZ,MAAM,CACL,uBAAuB,EACvB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;QACjB,OAAO,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC,CAAC,CACH;SACA,MAAM,CACL,uBAAuB,EACvB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1D,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;IAC3F,CAAC,CAAC,CACH;SACA,MAAM,CACL,wBAAwB,EACxB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,KAAK,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CAChF,QAAQ;aACL,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACxE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACjG,CAAA;QACD,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACvC,CAAC,CAAC,CACH;SACA,MAAM,CACL,yBAAyB,EACzB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG;QACtB,KAAK,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CAChF,QAAQ;aACL,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;aAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CACjG,CAAA;QACD,OAAO,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACvC,CAAC,CAAC,CACH,CAAA;AACL,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const ReferenceHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=reference.d.ts.map
@@ -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,2 @@
1
+ export declare const SessionHandler: import("effect/Layer").Layer<import("effect/unstable/httpapi/HttpApiGroup").ApiGroup<string, never>, never, never>;
2
+ //# sourceMappingURL=session.d.ts.map
@@ -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