@opencode/server 2.1.4 → 2.2.0

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 (123) hide show
  1. package/dist/api.d.ts +8 -1
  2. package/dist/api.js +5 -5
  3. package/dist/auth.js +1 -1
  4. package/dist/chunks/{pairing-0dncng21.js → server-info-1gwc8nvb.js} +25 -12
  5. package/dist/chunks/{pairing-ga3m49sz.js → server-info-1v577ncx.js} +4 -2
  6. package/dist/chunks/{pairing-mte34432.js → server-info-1wd9c1m3.js} +6 -6
  7. package/dist/chunks/{pairing-49c878v9.js → server-info-2eaky32g.js} +12 -3
  8. package/dist/chunks/{pairing-x9vr2ttf.js → server-info-2h6qktqa.js} +24 -6
  9. package/dist/chunks/{pairing-2b2wekgg.js → server-info-4fy84009.js} +1 -1
  10. package/dist/chunks/{pairing-xmwystkq.js → server-info-4q6e7fh8.js} +2 -2
  11. package/dist/chunks/{pairing-gymtz25n.js → server-info-50bbk3b2.js} +3 -3
  12. package/dist/chunks/{pairing-f4b2q3tn.js → server-info-5b42hxrf.js} +1 -1
  13. package/dist/chunks/{pairing-3te71694.js → server-info-5pdfedjd.js} +4 -4
  14. package/dist/chunks/{pairing-31acg4hb.js → server-info-5s6gh8sx.js} +7 -3
  15. package/dist/chunks/{pairing-x0608mvx.js → server-info-6z9pvq7p.js} +1 -1
  16. package/dist/chunks/{pairing-7b9xm1qg.js → server-info-7b9xm1qg.js} +1 -1
  17. package/dist/chunks/{pairing-j5aeaa16.js → server-info-a8jcac9a.js} +1 -1
  18. package/dist/chunks/{pairing-swdgbzpj.js → server-info-az0609r6.js} +4 -2
  19. package/dist/chunks/server-info-b0f38s3n.js +105 -0
  20. package/dist/chunks/server-info-b105zy65.js +22 -0
  21. package/dist/chunks/{pairing-x74w7e1f.js → server-info-b3bmdkga.js} +1 -1
  22. package/dist/chunks/{pairing-erzfdgke.js → server-info-bd8755ek.js} +16 -1
  23. package/dist/chunks/{pairing-9me4q8wt.js → server-info-bhbc7551.js} +4 -4
  24. package/dist/chunks/{pairing-6xea6nhh.js → server-info-btahnm2b.js} +3 -3
  25. package/dist/chunks/{pairing-e7pctymn.js → server-info-cezwbsk5.js} +1 -1
  26. package/dist/chunks/{pairing-kaqtndqt.js → server-info-d0edqfxx.js} +4 -11
  27. package/dist/chunks/{pairing-39nnfjx1.js → server-info-e6e4kz0w.js} +4 -4
  28. package/dist/chunks/{pairing-91mt6ewz.js → server-info-f559fakr.js} +2 -2
  29. package/dist/chunks/{pairing-72ygafj3.js → server-info-h29xjj1e.js} +2 -2
  30. package/dist/chunks/{pairing-3154e7fk.js → server-info-htyf2qs7.js} +5 -3
  31. package/dist/chunks/{pairing-x2dckmx1.js → server-info-j2d131x1.js} +21 -16
  32. package/dist/chunks/{pairing-j4at0y5c.js → server-info-j4at0y5c.js} +1 -1
  33. package/dist/chunks/{pairing-t3j5ftv1.js → server-info-j87xz9bt.js} +3 -3
  34. package/dist/chunks/{pairing-kcjd09wg.js → server-info-kkdkqt8j.js} +2 -2
  35. package/dist/chunks/{pairing-kqr36gas.js → server-info-kqr36gas.js} +1 -1
  36. package/dist/chunks/server-info-n321d8vm.js +46 -0
  37. package/dist/chunks/{pairing-qvy2s3nb.js → server-info-nx6f5k7a.js} +4 -4
  38. package/dist/chunks/{pairing-4b0899hb.js → server-info-ny1j968n.js} +2 -2
  39. package/dist/chunks/{pairing-q69f22pd.js → server-info-qcg3sqtb.js} +2 -2
  40. package/dist/chunks/{pairing-2yr2dq97.js → server-info-qd0r787n.js} +2 -2
  41. package/dist/chunks/{pairing-e4x9285j.js → server-info-rha2aq18.js} +4 -4
  42. package/dist/chunks/{pairing-a6kxe6a7.js → server-info-rw1dfckh.js} +8 -4
  43. package/dist/chunks/{pairing-5w10ccet.js → server-info-s282vggx.js} +1 -1
  44. package/dist/chunks/{pairing-k6dz4enc.js → server-info-s802fzg1.js} +21 -20
  45. package/dist/chunks/{pairing-kd6vzpgq.js → server-info-te8jwba1.js} +2 -2
  46. package/dist/chunks/{pairing-nv8hzzrz.js → server-info-tjtyxt9h.js} +32 -12
  47. package/dist/chunks/server-info-xthc02cw.js +6 -0
  48. package/dist/chunks/server-info-yqhefp4s.js +83 -0
  49. package/dist/chunks/{pairing-aj1jc7g7.js → server-info-yxw63vq5.js} +6 -4
  50. package/dist/chunks/{pairing-cfhthk6z.js → server-info-zcvan105.js} +1 -1
  51. package/dist/chunks/{pairing-4qjw9nya.js → server-info-zpr61asr.js} +4 -4
  52. package/dist/cors.js +1 -1
  53. package/dist/event-feed.d.ts +1 -1
  54. package/dist/event-feed.js +3 -3
  55. package/dist/fetch.js +52 -49
  56. package/dist/handlers/agent.js +6 -6
  57. package/dist/handlers/command.js +6 -6
  58. package/dist/handlers/config.js +6 -6
  59. package/dist/handlers/credential.js +6 -6
  60. package/dist/handlers/debug.js +6 -6
  61. package/dist/handlers/event.js +7 -7
  62. package/dist/handlers/form.js +6 -6
  63. package/dist/handlers/fs.d.ts +2 -1
  64. package/dist/handlers/fs.js +6 -6
  65. package/dist/handlers/generate.d.ts +1 -1
  66. package/dist/handlers/generate.js +6 -6
  67. package/dist/handlers/integration.js +6 -6
  68. package/dist/handlers/location.js +6 -6
  69. package/dist/handlers/mcp.js +8 -8
  70. package/dist/handlers/media.d.ts +6 -0
  71. package/dist/handlers/media.js +6 -0
  72. package/dist/handlers/message.js +7 -6
  73. package/dist/handlers/migration.js +6 -6
  74. package/dist/handlers/model.js +6 -6
  75. package/dist/handlers/permission.js +6 -6
  76. package/dist/handlers/persistent-pty.d.ts +1 -1
  77. package/dist/handlers/persistent-pty.js +9 -8
  78. package/dist/handlers/plugin.js +6 -6
  79. package/dist/handlers/project.d.ts +1 -1
  80. package/dist/handlers/project.js +6 -6
  81. package/dist/handlers/provider.js +6 -6
  82. package/dist/handlers/pty-socket.js +1 -1
  83. package/dist/handlers/pty.js +8 -8
  84. package/dist/handlers/reference.js +6 -6
  85. package/dist/handlers/rpc.js +6 -6
  86. package/dist/handlers/server.js +9 -9
  87. package/dist/handlers/session-error.js +1 -1
  88. package/dist/handlers/session.d.ts +3 -1
  89. package/dist/handlers/session.js +7 -6
  90. package/dist/handlers/shell.js +6 -6
  91. package/dist/handlers/skill.js +6 -6
  92. package/dist/handlers/usage.d.ts +1 -0
  93. package/dist/handlers/usage.js +11 -0
  94. package/dist/handlers/vcs.js +6 -6
  95. package/dist/handlers/voice.d.ts +1 -1
  96. package/dist/handlers/voice.js +6 -6
  97. package/dist/handlers/websearch.js +6 -6
  98. package/dist/handlers/worktree.js +6 -6
  99. package/dist/handlers.d.ts +1 -1
  100. package/dist/handlers.js +46 -43
  101. package/dist/location.js +4 -4
  102. package/dist/media-uri.d.ts +6 -0
  103. package/dist/media-uri.js +6 -0
  104. package/dist/middleware/authorization.js +2 -2
  105. package/dist/middleware/form-location.js +3 -3
  106. package/dist/middleware/schema-error.js +1 -1
  107. package/dist/middleware/session-location.js +3 -3
  108. package/dist/pairing.js +1 -1
  109. package/dist/process.js +54 -51
  110. package/dist/request-tracing.js +1 -1
  111. package/dist/routes.d.ts +4 -2
  112. package/dist/routes.js +49 -46
  113. package/dist/server-info.js +3 -3
  114. package/dist/service-status.js +3 -3
  115. package/dist/workerd.js +53 -50
  116. package/package.json +9 -8
  117. package/dist/chunks/pairing-kyxm98pg.js +0 -102
  118. package/dist/chunks/pairing-pmjbkszz.js +0 -30
  119. /package/dist/chunks/{pairing-9rqn6x4v.js → server-info-9rqn6x4v.js} +0 -0
  120. /package/dist/chunks/{pairing-h6rt5k9s.js → server-info-h6rt5k9s.js} +0 -0
  121. /package/dist/chunks/{pairing-q4bn6dy8.js → server-info-q4bn6dy8.js} +0 -0
  122. /package/dist/chunks/{pairing-smaf4a18.js → server-info-smaf4a18.js} +0 -0
  123. /package/dist/chunks/{pairing-yc7nft6q.js → server-info-yc7nft6q.js} +0 -0
package/dist/api.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { LocationMiddleware } from "./location";
2
2
  import { FormLocationMiddleware } from "./middleware/form-location";
3
3
  import { SessionLocationMiddleware } from "./middleware/session-location";
4
- export declare const Api: import("@opencode/protocol/api").Api<LocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, FormLocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").InvalidRequestError, typeof import("@opencode/protocol/errors").SessionNotFoundError, typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, SessionLocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").InvalidRequestError, typeof import("@opencode/protocol/errors").SessionNotFoundError, typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, import("effect/http-api/HttpApiGroup").HttpApiGroup<"server.event", import("effect/http-api/HttpApiEndpoint").HttpApiEndpoint<"event.subscribe", "GET", "/api/event", never, never, never, never, import("effect/http-api/HttpApiSchema").StreamSse<import("effect/http-api/HttpApiSchema").SseEventFromData<import("effect/Schema").Union<readonly [import("effect/Schema").Struct<{
4
+ export declare const Api: import("@opencode/protocol/api").Api<LocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, FormLocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").InvalidRequestError, typeof import("@opencode/protocol/errors").SessionNotFoundError, typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, SessionLocationMiddleware, import("effect/http-api/HttpApiMiddleware").HttpApiMiddleware<import("@opencode/core/instance").Services, readonly [typeof import("@opencode/protocol/errors").InvalidRequestError, typeof import("@opencode/protocol/errors").SessionNotFoundError, typeof import("@opencode/protocol/errors").LocationNotFoundError], never>, import("effect/http-api/HttpApiGroup").HttpApiGroup<"server.event", import("effect/http-api/HttpApiEndpoint").HttpApiEndpoint<"event.subscribe", "GET", "/api/event", never, import("effect/Schema").toCodecStringTree<import("effect/Schema").Struct<{
5
+ readonly types: import("effect/Schema").optional<import("effect/Schema").ArrayEnsure<import("effect/Schema").Union<readonly [import("effect/Schema").Literals<readonly ("agent.updated" | "command.updated" | "config.updated" | "credential.switched" | "credential.updated" | "filesystem.changed" | "form.cancelled" | "form.created" | "form.replied" | "installation.update-available" | "installation.updated" | "integration.updated" | "location.shutdown" | "mcp.resources.changed" | "mcp.status.changed" | "model.updated" | "models-dev.refreshed" | "permission.asked" | "permission.replied" | "persistent-pty.added" | "persistent-pty.removed" | "plugin.updated" | "project.updated" | "provider.updated" | "pty.created" | "pty.deleted" | "pty.exited" | "pty.updated" | "reference.updated" | "session.agent.selected" | "session.archived" | "session.compaction.delta" | "session.compaction.ended" | "session.compaction.failed" | "session.compaction.started" | "session.created" | "session.deleted" | "session.execution.failed" | "session.execution.interrupted" | "session.execution.started" | "session.execution.succeeded" | "session.forked" | "session.idle" | "session.inbox.cancelled" | "session.inbox.delivered" | "session.inbox.delivery.changed" | "session.inbox.enqueued" | "session.instructions.updated" | "session.metadata.updated" | "session.model.selected" | "session.moved" | "session.permissions" | "session.reasoning.delta" | "session.reasoning.ended" | "session.reasoning.started" | "session.renamed" | "session.retry.scheduled" | "session.revert.cleared" | "session.revert.committed" | "session.revert.staged" | "session.shell.ended" | "session.shell.started" | "session.skill.activated" | "session.status" | "session.step.ended" | "session.step.failed" | "session.step.started" | "session.step.streamed" | "session.synthetic" | "session.text.delta" | "session.text.ended" | "session.text.started" | "session.tool.called" | "session.tool.failed" | "session.tool.input.delta" | "session.tool.input.ended" | "session.tool.input.started" | "session.tool.progress" | "session.tool.success" | "session.unarchived" | "session.usage.updated" | "session.viewed" | "shell.created" | "shell.deleted" | "shell.exited" | "skill.updated" | "tui.command.execute" | "tui.prompt.append" | "tui.session.select" | "tui.toast.show" | "vcs.branch.updated" | "websearch.updated" | "worktree.resolved" | "worktree.updated")[]>, import("effect/Schema").TemplateLiteral<readonly ["rpc.", import("effect/Schema").String]>]>>>;
6
+ }>>, never, never, import("effect/http-api/HttpApiSchema").StreamSse<import("effect/http-api/HttpApiSchema").SseEventFromData<import("effect/Schema").Union<readonly [import("effect/Schema").Struct<{
5
7
  readonly id: import("effect/Schema").brand<import("effect/Schema").String, "Event.ID"> & {
6
8
  create: () => string & import("effect/Brand").Brand<"Event.ID">;
7
9
  };
@@ -4193,12 +4195,14 @@ export declare const Api: import("@opencode/protocol/api").Api<LocationMiddlewar
4193
4195
  readonly additions: import("effect/Schema").Int;
4194
4196
  readonly deletions: import("effect/Schema").Int;
4195
4197
  readonly status: import("effect/Schema").Literals<readonly ["added", "deleted", "modified"]>;
4198
+ readonly more: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literal<true>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literal<true>>, never, never>;
4196
4199
  }>>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Array<import("effect/Schema").Struct<{
4197
4200
  readonly file: import("effect/Schema").String;
4198
4201
  readonly patch: import("effect/Schema").String;
4199
4202
  readonly additions: import("effect/Schema").Int;
4200
4203
  readonly deletions: import("effect/Schema").Int;
4201
4204
  readonly status: import("effect/Schema").Literals<readonly ["added", "deleted", "modified"]>;
4205
+ readonly more: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literal<true>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literal<true>>, never, never>;
4202
4206
  }>>>, never, never>;
4203
4207
  }>;
4204
4208
  }>;
@@ -4226,12 +4230,14 @@ export declare const Api: import("@opencode/protocol/api").Api<LocationMiddlewar
4226
4230
  readonly additions: import("effect/Schema").Int;
4227
4231
  readonly deletions: import("effect/Schema").Int;
4228
4232
  readonly status: import("effect/Schema").Literals<readonly ["added", "deleted", "modified"]>;
4233
+ readonly more: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literal<true>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literal<true>>, never, never>;
4229
4234
  }>>>>, import("effect/Schema").optionalKey<import("effect/Schema").$Array<import("effect/Schema").Struct<{
4230
4235
  readonly file: import("effect/Schema").String;
4231
4236
  readonly patch: import("effect/Schema").String;
4232
4237
  readonly additions: import("effect/Schema").Int;
4233
4238
  readonly deletions: import("effect/Schema").Int;
4234
4239
  readonly status: import("effect/Schema").Literals<readonly ["added", "deleted", "modified"]>;
4240
+ readonly more: import("effect/Schema").decodeTo<import("effect/Schema").optional<import("effect/Schema").toType<import("effect/Schema").Literal<true>>>, import("effect/Schema").optionalKey<import("effect/Schema").Literal<true>>, never, never>;
4235
4241
  }>>>, never, never>;
4236
4242
  }>;
4237
4243
  }>;
@@ -7008,6 +7014,7 @@ export declare const Api: import("@opencode/protocol/api").Api<LocationMiddlewar
7008
7014
  readonly additions: number;
7009
7015
  readonly deletions: number;
7010
7016
  readonly status: "added" | "deleted" | "modified";
7017
+ readonly more?: true | undefined;
7011
7018
  }[] | undefined;
7012
7019
  };
7013
7020
  };
package/dist/api.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Api2
3
- } from "./chunks/pairing-t3j5ftv1.js";
4
- import"./chunks/pairing-3154e7fk.js";
5
- import"./chunks/pairing-x74w7e1f.js";
6
- import"./chunks/pairing-gymtz25n.js";
7
- import"./chunks/pairing-smaf4a18.js";
3
+ } from "./chunks/server-info-j87xz9bt.js";
4
+ import"./chunks/server-info-htyf2qs7.js";
5
+ import"./chunks/server-info-b3bmdkga.js";
6
+ import"./chunks/server-info-50bbk3b2.js";
7
+ import"./chunks/server-info-smaf4a18.js";
8
8
  export {
9
9
  Api2 as Api
10
10
  };
package/dist/auth.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  verifySession2,
8
8
  sessionCookieName2,
9
9
  exports_auth
10
- } from "./chunks/pairing-j4at0y5c.js";
10
+ } from "./chunks/server-info-j4at0y5c.js";
11
11
  export {
12
12
  Config2 as Config,
13
13
  SESSION_TTL_SECONDS2 as SESSION_TTL_SECONDS,
@@ -1,17 +1,22 @@
1
1
  import {
2
2
  missingSession2,
3
3
  failedMessageDecode2
4
- } from "./pairing-smaf4a18.js";
4
+ } from "./server-info-smaf4a18.js";
5
5
  import {
6
6
  Api2
7
- } from "./pairing-t3j5ftv1.js";
7
+ } from "./server-info-j87xz9bt.js";
8
+ import {
9
+ wantsMediaRefs2
10
+ } from "./server-info-xthc02cw.js";
8
11
 
9
12
  // src/handlers/message.ts
10
13
  import { SessionMessage } from "@opencode/core/session/message";
11
14
  import { Session } from "@opencode/core/session";
12
15
  import { Effect, Option, Schema } from "effect";
16
+ import { HttpServerResponse } from "effect/http";
13
17
  import { HttpApiBuilder } from "effect/http-api";
14
18
  import { InvalidCursorError } from "@opencode/protocol/errors";
19
+ import { SessionMediaMessagesResponse } from "@opencode/protocol/groups/message";
15
20
  var DefaultMessagesLimit = 50;
16
21
  var Cursor = Schema.Struct({
17
22
  id: SessionMessage.ID,
@@ -34,22 +39,30 @@ var MessageHandler2 = HttpApiBuilder.group(Api2, "server.message", (handlers) =>
34
39
  return yield* new InvalidCursorError({ message: "Cursor cannot be combined with order" });
35
40
  const decoded = ctx.query.cursor ? Option.getOrUndefined(cursor.decode(ctx.query.cursor)) ?? (yield* new InvalidCursorError({ message: "Invalid cursor" })) : undefined;
36
41
  const order = decoded?.order ?? ctx.query.order ?? "desc";
37
- const messages = yield* session.messages({
42
+ const input = {
38
43
  sessionID: ctx.params.sessionID,
39
44
  limit: ctx.query.limit ?? DefaultMessagesLimit,
40
45
  order,
41
46
  type: ctx.query.type,
42
47
  cursor: decoded ? { id: decoded.id, direction: decoded.direction } : undefined
43
- }).pipe(Effect.catchTag("Session.NotFoundError", missingSession2), Effect.catchTag("Session.MessageDecodeError", failedMessageDecode2));
44
- const first = messages[0];
45
- const last = messages.at(-1);
46
- return {
47
- data: messages,
48
- cursor: {
49
- previous: first ? cursor.encode(first, order, "previous") : undefined,
50
- next: last ? cursor.encode(last, order, "next") : undefined
51
- }
52
48
  };
49
+ const page = (messages) => {
50
+ const first = messages[0];
51
+ const last = messages.at(-1);
52
+ return {
53
+ data: messages,
54
+ cursor: {
55
+ previous: first ? cursor.encode(first, order, "previous") : undefined,
56
+ next: last ? cursor.encode(last, order, "next") : undefined
57
+ }
58
+ };
59
+ };
60
+ if (wantsMediaRefs2(ctx.request)) {
61
+ const messages = yield* session.messagesWithRefs(input).pipe(Effect.catchTag("Session.NotFoundError", missingSession2), Effect.catchTag("Session.MessageDecodeError", failedMessageDecode2));
62
+ return yield* HttpServerResponse.schemaJson(SessionMediaMessagesResponse)(page(messages)).pipe(Effect.orDie);
63
+ }
64
+ const messages = yield* session.messages(input).pipe(Effect.catchTag("Session.NotFoundError", missingSession2), Effect.catchTag("Session.MessageDecodeError", failedMessageDecode2));
65
+ return page(messages);
53
66
  }));
54
67
  }));
55
68
 
@@ -1,9 +1,10 @@
1
1
  import {
2
+ awaitPlugins2,
2
3
  response2
3
- } from "./pairing-gymtz25n.js";
4
+ } from "./server-info-50bbk3b2.js";
4
5
  import {
5
6
  Api2
6
- } from "./pairing-t3j5ftv1.js";
7
+ } from "./server-info-j87xz9bt.js";
7
8
 
8
9
  // src/handlers/agent.ts
9
10
  import { Agent } from "@opencode/core/agent";
@@ -11,6 +12,7 @@ import { Effect } from "effect";
11
12
  import { HttpApiBuilder } from "effect/http-api";
12
13
  import { AgentNotFoundError } from "@opencode/protocol/errors";
13
14
  var AgentHandler2 = HttpApiBuilder.group(Api2, "server.agent", (handlers) => handlers.handle("agent.list", () => Effect.gen(function* () {
15
+ yield* awaitPlugins2;
14
16
  return yield* response2(Agent.Service.use((agent) => agent.list()));
15
17
  })).handle("agent.get", Effect.fn(function* (ctx) {
16
18
  const agent = yield* Agent.Service.use((service) => service.get(ctx.params.agentID));
@@ -1,26 +1,26 @@
1
1
  import {
2
2
  isAllowedCorsOrigin2
3
- } from "./pairing-q4bn6dy8.js";
3
+ } from "./server-info-q4bn6dy8.js";
4
4
  import {
5
5
  createRoutes2
6
- } from "./pairing-x2dckmx1.js";
6
+ } from "./server-info-j2d131x1.js";
7
7
  import {
8
8
  __export
9
- } from "./pairing-9rqn6x4v.js";
9
+ } from "./server-info-9rqn6x4v.js";
10
10
 
11
11
  // src/fetch.ts
12
12
  var exports_fetch = {};
13
13
  __export(exports_fetch, {
14
14
  ServerFetch: () => exports_fetch,
15
- make: () => make3
15
+ make: () => make2
16
16
  });
17
17
  import { Context, Effect, Layer } from "effect";
18
18
  import { HttpEffect, HttpMiddleware, HttpRouter, HttpServer } from "effect/http";
19
19
  import { SessionRestart } from "@opencode/core/session/execution/restart";
20
- var make3 = Effect.fn("ServerFetch.make")(function* (options = {}, boot = {}) {
20
+ var make2 = Effect.fn("ServerFetch.make")(function* (options = {}, boot = {}) {
21
21
  const context = yield* Layer.build(createRoutes2(options, () => [], boot.overrides ?? []).pipe(Layer.provide(HttpServer.layerServices)));
22
22
  yield* Effect.forkDetach(Context.get(context, SessionRestart.Service).resumeSuspendedSessions);
23
23
  return Context.get(context, HttpRouter.HttpRouter).asHttpEffect().pipe(HttpMiddleware.cors({ allowedOrigins: (origin) => isAllowedCorsOrigin2(origin, options), maxAge: 86400 }), HttpEffect.toWebHandlerWith(context));
24
24
  });
25
25
 
26
- export { make3, exports_fetch };
26
+ export { make2, exports_fetch };
@@ -1,18 +1,27 @@
1
1
  import {
2
2
  response2
3
- } from "./pairing-gymtz25n.js";
3
+ } from "./server-info-50bbk3b2.js";
4
4
  import {
5
5
  Api2
6
- } from "./pairing-t3j5ftv1.js";
6
+ } from "./server-info-j87xz9bt.js";
7
7
 
8
8
  // src/handlers/plugin.ts
9
9
  import { Plugin } from "@opencode/core/plugin";
10
10
  import { PluginUpdate } from "@opencode/core/plugin/update";
11
- import { InvalidRequestError, ServiceUnavailableError } from "@opencode/protocol/errors";
11
+ import { InvalidRequestError, PluginNotFoundError, ServiceUnavailableError } from "@opencode/protocol/errors";
12
12
  import { Cause, Effect, Exit } from "effect";
13
13
  import { HttpApiBuilder } from "effect/http-api";
14
14
  var PluginHandler2 = HttpApiBuilder.group(Api2, "server.plugin", (handlers) => handlers.handle("plugin.list", () => Effect.gen(function* () {
15
15
  return yield* response2(Plugin.Service.use((plugin) => plugin.list()));
16
+ })).handle("plugin.gui", (ctx) => Effect.gen(function* () {
17
+ const plugins = yield* Plugin.Service;
18
+ const bundle = yield* plugins.gui(ctx.query.id);
19
+ if (!bundle)
20
+ return yield* new PluginNotFoundError({
21
+ pluginID: ctx.query.id,
22
+ message: `No active plugin with a ./gui-experimental bundle: ${ctx.query.id}`
23
+ });
24
+ return yield* response2(Effect.succeed(bundle));
16
25
  })).handle("plugin.check", (ctx) => Effect.gen(function* () {
17
26
  const plugins = yield* Plugin.Service;
18
27
  const inventory = yield* plugins.list();
@@ -1,22 +1,26 @@
1
1
  import {
2
2
  response2
3
- } from "./pairing-gymtz25n.js";
3
+ } from "./server-info-50bbk3b2.js";
4
4
  import {
5
5
  Api2
6
- } from "./pairing-t3j5ftv1.js";
6
+ } from "./server-info-j87xz9bt.js";
7
7
 
8
8
  // src/handlers/fs.ts
9
9
  import { FileSystem } from "@opencode/core/filesystem";
10
+ import { FileWatch } from "@opencode/core/filesystem/file-watch";
11
+ import { Location } from "@opencode/core/location";
10
12
  import { RelativePath } from "@opencode/core/schema";
11
- import { FileNotFoundError } from "@opencode/protocol/errors";
13
+ import { FileNotFoundError, ServiceUnavailableError } from "@opencode/protocol/errors";
12
14
  import { Effect, Option, Stream } from "effect";
13
15
  import { HttpServerResponse } from "effect/http";
14
16
  import { HttpApiBuilder } from "effect/http-api";
17
+ import path from "path";
15
18
  var FileSystemHandler2 = HttpApiBuilder.group(Api2, "server.fs", (handlers) => Effect.gen(function* () {
19
+ const fileWatch = yield* FileWatch.Service;
16
20
  return handlers.handleRaw("fs.read", (ctx) => Effect.gen(function* () {
17
- const path = yield* decodeRequestPath(ctx.request.url);
21
+ const path2 = yield* decodeRequestPath(ctx.request.url);
18
22
  const fs = yield* FileSystem.Service;
19
- const file = yield* fs.read({ path }).pipe(Effect.mapError((error) => new FileNotFoundError({ path: error.path, message: `File not found: ${error.path}` })));
23
+ const file = yield* fs.read({ path: path2 }).pipe(Effect.mapError((error) => new FileNotFoundError({ path: error.path, message: `File not found: ${error.path}` })));
20
24
  return serveFile(ctx.request, file);
21
25
  })).handle("fs.list", (ctx) => response2(Effect.gen(function* () {
22
26
  const fs = yield* FileSystem.Service;
@@ -27,7 +31,21 @@ var FileSystemHandler2 = HttpApiBuilder.group(Api2, "server.fs", (handlers) => E
27
31
  }))).handle("fs.write", (ctx) => response2(Effect.gen(function* () {
28
32
  const fs = yield* FileSystem.Service;
29
33
  return yield* fs.write({ path: ctx.query.path, data: ctx.payload });
30
- })));
34
+ }))).handle("fs.watch", (ctx) => Effect.gen(function* () {
35
+ const fs = yield* FileSystem.Service;
36
+ const location = yield* Location.Service;
37
+ yield* fs.read({ path: RelativePath.make(ctx.payload.path) }).pipe(Effect.mapError((error) => new FileNotFoundError({ path: error.path, message: `File not found: ${error.path}` })));
38
+ yield* fileWatch.watch({
39
+ location: { directory: location.directory, workspaceID: location.workspaceID },
40
+ file: path.resolve(location.directory, ctx.payload.path)
41
+ }).pipe(Effect.mapError((error) => new ServiceUnavailableError({ message: error.message, service: "filewatcher" })));
42
+ })).handle("fs.unwatch", (ctx) => Effect.gen(function* () {
43
+ const location = yield* Location.Service;
44
+ yield* fileWatch.unwatch({
45
+ location: { directory: location.directory, workspaceID: location.workspaceID },
46
+ file: path.resolve(location.directory, ctx.payload.path)
47
+ });
48
+ }));
31
49
  }));
32
50
  function decodeRequestPath(url) {
33
51
  const raw = new URL(url, "http://localhost").pathname.slice(13);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Api2
3
- } from "./pairing-t3j5ftv1.js";
3
+ } from "./server-info-j87xz9bt.js";
4
4
 
5
5
  // src/handlers/worktree.ts
6
6
  import { Git } from "@opencode/core/git";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  response2
3
- } from "./pairing-gymtz25n.js";
3
+ } from "./server-info-50bbk3b2.js";
4
4
  import {
5
5
  Api2
6
- } from "./pairing-t3j5ftv1.js";
6
+ } from "./server-info-j87xz9bt.js";
7
7
 
8
8
  // src/handlers/command.ts
9
9
  import { Command } from "@opencode/core/command";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  missingSession2
3
- } from "./pairing-smaf4a18.js";
3
+ } from "./server-info-smaf4a18.js";
4
4
 
5
5
  // src/location.ts
6
6
  import { FileSystem } from "@opencode/core/filesystem";
@@ -59,7 +59,7 @@ function decode(input) {
59
59
  return input;
60
60
  }
61
61
  }
62
- var layer2 = Layer.effect(LocationMiddleware2, Effect.gen(function* () {
62
+ var layer4 = Layer.effect(LocationMiddleware2, Effect.gen(function* () {
63
63
  const locations = yield* LocationServiceMap.Service;
64
64
  return LocationMiddleware2.of((effect) => Effect.gen(function* () {
65
65
  const request = yield* HttpServerRequest.HttpServerRequest;
@@ -67,4 +67,4 @@ var layer2 = Layer.effect(LocationMiddleware2, Effect.gen(function* () {
67
67
  }));
68
68
  }));
69
69
 
70
- export { LocationMiddleware2, locationErrors2, awaitPlugins2, response2, sessionInfo2, requestRef2, layer2 };
70
+ export { LocationMiddleware2, locationErrors2, awaitPlugins2, response2, sessionInfo2, requestRef2, layer4 };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Api2
3
- } from "./pairing-t3j5ftv1.js";
3
+ } from "./server-info-j87xz9bt.js";
4
4
 
5
5
  // src/handlers/credential.ts
6
6
  import { Credential } from "@opencode/core/credential";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./pairing-9rqn6x4v.js";
3
+ } from "./server-info-9rqn6x4v.js";
4
4
 
5
5
  // src/server-info.ts
6
6
  var exports_server_info = {};
@@ -8,14 +8,14 @@ __export(exports_server_info, {
8
8
  ServerInfo: () => exports_server_info,
9
9
  Service: () => Service3,
10
10
  connectionURLs: () => connectionURLs2,
11
- layer: () => layer3
11
+ layer: () => layer2
12
12
  });
13
13
  import { Context, Layer } from "effect";
14
14
  import { networkInterfaces } from "node:os";
15
15
 
16
16
  class Service3 extends Context.Service()("@opencode/server/ServerInfo") {
17
17
  }
18
- function layer3(urls, tmp, app = {}) {
18
+ function layer2(urls, tmp, app = {}) {
19
19
  return Layer.succeed(Service3, Service3.of({ urls, app, paths: { tmp } }));
20
20
  }
21
21
  function connectionURLs2(value, requestedHostname) {
@@ -38,4 +38,4 @@ function connectionURLs2(value, requestedHostname) {
38
38
  ];
39
39
  }
40
40
 
41
- export { Service3, layer3, connectionURLs2, exports_server_info };
41
+ export { Service3, layer2, connectionURLs2, exports_server_info };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  response2
3
- } from "./pairing-gymtz25n.js";
3
+ } from "./server-info-50bbk3b2.js";
4
4
  import {
5
5
  Api2
6
- } from "./pairing-t3j5ftv1.js";
6
+ } from "./server-info-j87xz9bt.js";
7
7
 
8
8
  // src/handlers/vcs.ts
9
9
  import { Vcs } from "@opencode/core/vcs";
@@ -64,7 +64,11 @@ var VcsHandler2 = HttpApiBuilder.group(Api2, "server.vcs", (handlers) => Effect.
64
64
  return yield* vcs.branches({ search: ctx.query.search, limit: Math.min(ctx.query.limit ?? 50, 100) });
65
65
  }))).handle("vcs.diff", (ctx) => response2(Effect.gen(function* () {
66
66
  const vcs = yield* Vcs.Service;
67
- return yield* vcs.diff(ctx.query.mode, { context: ctx.query.context, base: ctx.query.base }).pipe(Effect.mapError((error) => new ServiceUnavailableError({ service: "vcs", message: error.message })));
67
+ return yield* vcs.diff(ctx.query.mode, {
68
+ context: ctx.query.context,
69
+ base: ctx.query.base,
70
+ untracked: ctx.query.untracked
71
+ }).pipe(Effect.mapError((error) => new ServiceUnavailableError({ service: "vcs", message: error.message })));
68
72
  })));
69
73
  }));
70
74
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Api2
3
- } from "./pairing-t3j5ftv1.js";
3
+ } from "./server-info-j87xz9bt.js";
4
4
 
5
5
  // src/handlers/migration.ts
6
6
  import { V1Migration } from "@opencode/core/database/v1-migration";
@@ -4,7 +4,7 @@ import {
4
4
  authorized2,
5
5
  verifySession2,
6
6
  sessionCookieName2
7
- } from "./pairing-j4at0y5c.js";
7
+ } from "./server-info-j4at0y5c.js";
8
8
 
9
9
  // src/middleware/authorization.ts
10
10
  import { UnauthorizedError } from "@opencode/protocol/errors";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Api2
3
- } from "./pairing-t3j5ftv1.js";
3
+ } from "./server-info-j87xz9bt.js";
4
4
 
5
5
  // src/handlers/project.ts
6
6
  import { Project } from "@opencode/core/project";
@@ -1,9 +1,10 @@
1
1
  import {
2
+ awaitPlugins2,
2
3
  response2
3
- } from "./pairing-gymtz25n.js";
4
+ } from "./server-info-50bbk3b2.js";
4
5
  import {
5
6
  Api2
6
- } from "./pairing-t3j5ftv1.js";
7
+ } from "./server-info-j87xz9bt.js";
7
8
 
8
9
  // src/handlers/provider.ts
9
10
  import { Provider } from "@opencode/core/provider";
@@ -12,6 +13,7 @@ import { Effect } from "effect";
12
13
  import { HttpApiBuilder } from "effect/http-api";
13
14
  var ProviderHandler2 = HttpApiBuilder.group(Api2, "server.provider", (handlers) => Effect.gen(function* () {
14
15
  return handlers.handle("provider.list", Effect.fn(function* () {
16
+ yield* awaitPlugins2;
15
17
  const providers = yield* Provider.Service;
16
18
  return yield* response2(providers.available());
17
19
  })).handle("provider.get", Effect.fn(function* (ctx) {
@@ -0,0 +1,105 @@
1
+ import {
2
+ GenerateHandler2
3
+ } from "./server-info-yqhefp4s.js";
4
+ import {
5
+ VoiceHandler2
6
+ } from "./server-info-d0edqfxx.js";
7
+ import {
8
+ MessageHandler2
9
+ } from "./server-info-1gwc8nvb.js";
10
+ import {
11
+ ModelHandler2
12
+ } from "./server-info-rha2aq18.js";
13
+ import {
14
+ ProviderHandler2
15
+ } from "./server-info-az0609r6.js";
16
+ import {
17
+ SessionHandler2
18
+ } from "./server-info-tjtyxt9h.js";
19
+ import {
20
+ PermissionHandler2
21
+ } from "./server-info-btahnm2b.js";
22
+ import {
23
+ FileSystemHandler2
24
+ } from "./server-info-2h6qktqa.js";
25
+ import {
26
+ FormHandler2
27
+ } from "./server-info-f559fakr.js";
28
+ import {
29
+ CommandHandler2
30
+ } from "./server-info-4q6e7fh8.js";
31
+ import {
32
+ SkillHandler2
33
+ } from "./server-info-ny1j968n.js";
34
+ import {
35
+ RpcHandler2
36
+ } from "./server-info-s282vggx.js";
37
+ import {
38
+ layer3
39
+ } from "./server-info-s802fzg1.js";
40
+ import {
41
+ EventHandler2
42
+ } from "./server-info-nx6f5k7a.js";
43
+ import {
44
+ AgentHandler2
45
+ } from "./server-info-1v577ncx.js";
46
+ import {
47
+ PluginHandler2
48
+ } from "./server-info-2eaky32g.js";
49
+ import {
50
+ ServerHandler2
51
+ } from "./server-info-yxw63vq5.js";
52
+ import {
53
+ DebugHandler2
54
+ } from "./server-info-qcg3sqtb.js";
55
+ import {
56
+ PtyHandler2
57
+ } from "./server-info-zpr61asr.js";
58
+ import {
59
+ PersistentPtyHandler2
60
+ } from "./server-info-rw1dfckh.js";
61
+ import {
62
+ ShellHandler2
63
+ } from "./server-info-qd0r787n.js";
64
+ import {
65
+ ReferenceHandler2
66
+ } from "./server-info-te8jwba1.js";
67
+ import {
68
+ LocationHandler2
69
+ } from "./server-info-zcvan105.js";
70
+ import {
71
+ IntegrationHandler2
72
+ } from "./server-info-h29xjj1e.js";
73
+ import {
74
+ WebSearchHandler2
75
+ } from "./server-info-kkdkqt8j.js";
76
+ import {
77
+ UsageHandler2
78
+ } from "./server-info-b105zy65.js";
79
+ import {
80
+ McpHandler2
81
+ } from "./server-info-bhbc7551.js";
82
+ import {
83
+ CredentialHandler2
84
+ } from "./server-info-5b42hxrf.js";
85
+ import {
86
+ ProjectHandler2
87
+ } from "./server-info-a8jcac9a.js";
88
+ import {
89
+ WorktreeHandler2
90
+ } from "./server-info-4fy84009.js";
91
+ import {
92
+ VcsHandler2
93
+ } from "./server-info-5s6gh8sx.js";
94
+ import {
95
+ MigrationHandler2
96
+ } from "./server-info-6z9pvq7p.js";
97
+ import {
98
+ ConfigHandler2
99
+ } from "./server-info-cezwbsk5.js";
100
+
101
+ // src/handlers.ts
102
+ import { Layer } from "effect";
103
+ var handlers2 = Layer.mergeAll(ServerHandler2, DebugHandler2, MigrationHandler2, LocationHandler2, AgentHandler2, PluginHandler2, SessionHandler2, MessageHandler2, ModelHandler2, GenerateHandler2, VoiceHandler2, ProviderHandler2, IntegrationHandler2, WebSearchHandler2, UsageHandler2, McpHandler2, CredentialHandler2, ProjectHandler2, FormHandler2, PermissionHandler2, FileSystemHandler2, CommandHandler2, SkillHandler2, RpcHandler2, EventHandler2.pipe(Layer.provide(layer3)), PtyHandler2, PersistentPtyHandler2, ShellHandler2, ReferenceHandler2, WorktreeHandler2, VcsHandler2, ConfigHandler2);
104
+
105
+ export { handlers2 };
@@ -0,0 +1,22 @@
1
+ import {
2
+ awaitPlugins2,
3
+ response2
4
+ } from "./server-info-50bbk3b2.js";
5
+ import {
6
+ Api2
7
+ } from "./server-info-j87xz9bt.js";
8
+
9
+ // src/handlers/usage.ts
10
+ import { UsageLimits } from "@opencode/core/usage-limits";
11
+ import { ServiceUnavailableError } from "@opencode/protocol/errors";
12
+ import { Effect } from "effect";
13
+ import { HttpApiBuilder } from "effect/http-api";
14
+ var UsageHandler2 = HttpApiBuilder.group(Api2, "server.usage", (handlers) => Effect.gen(function* () {
15
+ return handlers.handle("usage.limits", Effect.fn("server.usage.limits")(function* () {
16
+ yield* awaitPlugins2;
17
+ const limits = yield* UsageLimits.Service;
18
+ return yield* response2(limits.get().pipe(Effect.map((info) => info ?? null), Effect.mapError((error) => new ServiceUnavailableError({ message: error.message, service: "opencode" }))));
19
+ }));
20
+ }));
21
+
22
+ export { UsageHandler2 };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  locationErrors2,
3
3
  sessionInfo2
4
- } from "./pairing-gymtz25n.js";
4
+ } from "./server-info-50bbk3b2.js";
5
5
 
6
6
  // src/middleware/session-location.ts
7
7
  import { Instance } from "@opencode/core/instance/service";
@@ -1,5 +1,6 @@
1
1
  // src/middleware/schema-error.ts
2
2
  import { Effect } from "effect";
3
+ import { HttpServerResponse } from "effect/http";
3
4
  import { HttpApiMiddleware } from "effect/http-api";
4
5
  import { InvalidRequestError } from "@opencode/protocol/errors";
5
6
  import { SchemaErrorMiddleware } from "@opencode/protocol/middleware/schema-error";
@@ -10,8 +11,22 @@ function truncateReason(reason) {
10
11
  return reason;
11
12
  return reason.slice(0, REASON_LIMIT) + `... (${reason.length - REASON_LIMIT} more chars)`;
12
13
  }
13
- var schemaErrorLayer2 = HttpApiMiddleware.layerSchemaErrorTransform(SchemaErrorMiddleware, (error) => {
14
+ var schemaErrorLayer2 = HttpApiMiddleware.layerSchemaErrorTransform(SchemaErrorMiddleware, (error, context) => {
14
15
  const reason = truncateReason(error.cause.message);
16
+ if (error.kind === "Body" || error.kind === "ResponseHeaders") {
17
+ const ref = `err_${crypto.randomUUID().slice(0, 8)}`;
18
+ return Effect.logError("failed to encode response").pipe(Effect.annotateLogs({
19
+ ref,
20
+ kind: error.kind,
21
+ endpoint: `${context.group.identifier}.${context.endpoint.name}`,
22
+ route: `${context.endpoint.method} ${context.endpoint.path}`,
23
+ reason
24
+ }), Effect.as(HttpServerResponse.jsonUnsafe({
25
+ _tag: "UnknownError",
26
+ message: "Server failed to encode its response. Check server logs for details.",
27
+ ref
28
+ }, { status: 500 })));
29
+ }
15
30
  return Effect.logWarning("schema rejection").pipe(Effect.annotateLogs({ kind: error.kind, reason }), Effect.andThen(Effect.fail(new InvalidRequestError({ message: reason, kind: error.kind }))));
16
31
  });
17
32