alchemylab-opencode 1.0.1 → 1.0.4

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 (45) hide show
  1. package/build.mjs +153 -0
  2. package/dist/chunk-7JG6KCBC.js +78 -0
  3. package/dist/chunk-7JG6KCBC.js.map +7 -0
  4. package/dist/chunk-CMAI7CAJ.js +2270 -0
  5. package/dist/chunk-CMAI7CAJ.js.map +7 -0
  6. package/dist/chunk-FPPWDLO7.js +117 -0
  7. package/dist/chunk-FPPWDLO7.js.map +7 -0
  8. package/dist/chunk-K4ME3WTI.js +6525 -0
  9. package/dist/chunk-K4ME3WTI.js.map +7 -0
  10. package/dist/chunk-KMHCMDYS.js +309 -0
  11. package/dist/chunk-KMHCMDYS.js.map +7 -0
  12. package/dist/chunk-NBI23JB4.js +23721 -0
  13. package/dist/chunk-NBI23JB4.js.map +7 -0
  14. package/dist/chunk-P44FI4UK.js +21 -0
  15. package/dist/chunk-P44FI4UK.js.map +7 -0
  16. package/dist/chunk-SM4I7RU4.js +718 -0
  17. package/dist/chunk-SM4I7RU4.js.map +7 -0
  18. package/dist/chunk-WCK3PNT7.js +5015 -0
  19. package/dist/chunk-WCK3PNT7.js.map +7 -0
  20. package/dist/mcp-6ID7DRNS.js +12 -0
  21. package/dist/mcp-6ID7DRNS.js.map +7 -0
  22. package/dist/pty.node-IR7ZMJYY.js +30 -0
  23. package/dist/pty.node-IR7ZMJYY.js.map +7 -0
  24. package/dist/registry-O4THPVFS.js +13 -0
  25. package/dist/registry-O4THPVFS.js.map +7 -0
  26. package/dist/run-HRWKT4NL.js +4781 -0
  27. package/dist/run-HRWKT4NL.js.map +7 -0
  28. package/dist/run-service-23VXHTA6.js +12 -0
  29. package/dist/run-service-23VXHTA6.js.map +7 -0
  30. package/dist/run.js +12 -0
  31. package/dist/run.js.map +7 -0
  32. package/dist/schema-YARWYUAH.js +14 -0
  33. package/dist/schema-YARWYUAH.js.map +7 -0
  34. package/dist/serve.js +31 -0
  35. package/dist/serve.js.map +7 -0
  36. package/dist/server-MHSLBRNZ.js +16 -0
  37. package/dist/server-MHSLBRNZ.js.map +7 -0
  38. package/dist/session-3UEFY5NC.js +13 -0
  39. package/dist/session-3UEFY5NC.js.map +7 -0
  40. package/dist/share-next-Q5WQ2ELY.js +14 -0
  41. package/dist/share-next-Q5WQ2ELY.js.map +7 -0
  42. package/dist/worktree-E5I74P2A.js +53 -0
  43. package/dist/worktree-E5I74P2A.js.map +7 -0
  44. package/package.json +11 -4
  45. package/packages/opencode/package.json +1 -1
@@ -0,0 +1,309 @@
1
+ // Built by esbuild from opencode-server source
2
+ import {
3
+ MessageV2,
4
+ ModelID,
5
+ Provider,
6
+ ProviderID,
7
+ Session
8
+ } from "./chunk-NBI23JB4.js";
9
+ import {
10
+ Account,
11
+ Bus,
12
+ Config
13
+ } from "./chunk-K4ME3WTI.js";
14
+ import {
15
+ Database,
16
+ InstanceState,
17
+ Log,
18
+ SessionTable,
19
+ Timestamps,
20
+ db_exports,
21
+ makeRuntime
22
+ } from "./chunk-CMAI7CAJ.js";
23
+
24
+ // packages/opencode/src/share/share-next.ts
25
+ import { Effect, Exit, Layer, Option, Schema, Scope, ServiceMap, Stream } from "effect";
26
+ import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
27
+
28
+ // packages/opencode/src/share/share.sql.ts
29
+ import { sqliteTable, text } from "drizzle-orm/sqlite-core";
30
+ var SessionShareTable = sqliteTable("session_share", {
31
+ session_id: text().primaryKey().references(() => SessionTable.id, { onDelete: "cascade" }),
32
+ id: text().notNull(),
33
+ secret: text().notNull(),
34
+ url: text().notNull(),
35
+ ...Timestamps
36
+ });
37
+
38
+ // packages/opencode/src/share/share-next.ts
39
+ var ShareNext;
40
+ ((ShareNext2) => {
41
+ const log = Log.create({ service: "share-next" });
42
+ const disabled = process.env["OPENCODE_DISABLE_SHARE"] === "true" || process.env["OPENCODE_DISABLE_SHARE"] === "1";
43
+ const ShareSchema = Schema.Struct({
44
+ id: Schema.String,
45
+ url: Schema.String,
46
+ secret: Schema.String
47
+ });
48
+ class Service extends ServiceMap.Service()("@opencode/ShareNext") {
49
+ }
50
+ ShareNext2.Service = Service;
51
+ const db = (fn) => Effect.sync(() => Database.use(fn));
52
+ function api(resource) {
53
+ return {
54
+ create: `/api/${resource}`,
55
+ sync: (shareID) => `/api/${resource}/${shareID}/sync`,
56
+ remove: (shareID) => `/api/${resource}/${shareID}`,
57
+ data: (shareID) => `/api/${resource}/${shareID}/data`
58
+ };
59
+ }
60
+ const legacyApi = api("share");
61
+ const consoleApi = api("shares");
62
+ function key(item) {
63
+ switch (item.type) {
64
+ case "session":
65
+ return "session";
66
+ case "message":
67
+ return `message/${item.data.id}`;
68
+ case "part":
69
+ return `part/${item.data.messageID}/${item.data.id}`;
70
+ case "session_diff":
71
+ return "session_diff";
72
+ case "model":
73
+ return "model";
74
+ }
75
+ }
76
+ ShareNext2.layer = Layer.effect(
77
+ Service,
78
+ Effect.gen(function* () {
79
+ const account = yield* Account.Service;
80
+ const bus = yield* Bus.Service;
81
+ const cfg = yield* Config.Service;
82
+ const http = yield* HttpClient.HttpClient;
83
+ const httpOk = HttpClient.filterStatusOk(http);
84
+ const provider = yield* Provider.Service;
85
+ const session = yield* Session.Service;
86
+ function sync(sessionID, data) {
87
+ return Effect.gen(function* () {
88
+ if (disabled) return;
89
+ const s = yield* InstanceState.get(state);
90
+ const existing = s.queue.get(sessionID);
91
+ if (existing) {
92
+ for (const item of data) {
93
+ existing.data.set(key(item), item);
94
+ }
95
+ return;
96
+ }
97
+ const next = new Map(data.map((item) => [key(item), item]));
98
+ s.queue.set(sessionID, { data: next });
99
+ yield* flush(sessionID).pipe(
100
+ Effect.delay(1e3),
101
+ Effect.catchCause(
102
+ (cause) => Effect.sync(() => {
103
+ log.error("share flush failed", { sessionID, cause });
104
+ })
105
+ ),
106
+ Effect.forkIn(s.scope)
107
+ );
108
+ });
109
+ }
110
+ const state = yield* InstanceState.make(
111
+ Effect.fn("ShareNext.state")(function* (_ctx) {
112
+ const cache = { queue: /* @__PURE__ */ new Map(), scope: yield* Scope.make() };
113
+ yield* Effect.addFinalizer(
114
+ () => Scope.close(cache.scope, Exit.void).pipe(
115
+ Effect.andThen(
116
+ Effect.sync(() => {
117
+ cache.queue.clear();
118
+ })
119
+ )
120
+ )
121
+ );
122
+ if (disabled) return cache;
123
+ const watch = (def, fn) => bus.subscribe(def).pipe(
124
+ Stream.runForEach(
125
+ (evt) => fn(evt).pipe(
126
+ Effect.catchCause(
127
+ (cause) => Effect.sync(() => {
128
+ log.error("share subscriber failed", { type: def.type, cause });
129
+ })
130
+ )
131
+ )
132
+ ),
133
+ Effect.forkScoped
134
+ );
135
+ yield* watch(
136
+ Session.Event.Updated,
137
+ (evt) => Effect.gen(function* () {
138
+ const info = yield* session.get(evt.properties.sessionID);
139
+ yield* sync(info.id, [{ type: "session", data: info }]);
140
+ })
141
+ );
142
+ yield* watch(
143
+ MessageV2.Event.Updated,
144
+ (evt) => Effect.gen(function* () {
145
+ const info = evt.properties.info;
146
+ yield* sync(info.sessionID, [{ type: "message", data: info }]);
147
+ if (info.role !== "user") return;
148
+ const model = yield* provider.getModel(info.model.providerID, info.model.modelID);
149
+ yield* sync(info.sessionID, [{ type: "model", data: [model] }]);
150
+ })
151
+ );
152
+ yield* watch(
153
+ MessageV2.Event.PartUpdated,
154
+ (evt) => sync(evt.properties.part.sessionID, [{ type: "part", data: evt.properties.part }])
155
+ );
156
+ yield* watch(
157
+ Session.Event.Diff,
158
+ (evt) => sync(evt.properties.sessionID, [{ type: "session_diff", data: evt.properties.diff }])
159
+ );
160
+ return cache;
161
+ })
162
+ );
163
+ const request2 = Effect.fn("ShareNext.request")(function* () {
164
+ const headers = {};
165
+ const active = yield* account.active();
166
+ if (Option.isNone(active) || !active.value.active_org_id) {
167
+ const baseUrl = (yield* cfg.get()).enterprise?.url ?? "https://opncd.ai";
168
+ return { headers, api: legacyApi, baseUrl };
169
+ }
170
+ const token = yield* account.token(active.value.id);
171
+ if (Option.isNone(token)) {
172
+ throw new Error("No active account token available for sharing");
173
+ }
174
+ headers.authorization = `Bearer ${token.value}`;
175
+ headers["x-org-id"] = active.value.active_org_id;
176
+ return { headers, api: consoleApi, baseUrl: active.value.url };
177
+ });
178
+ const get = Effect.fnUntraced(function* (sessionID) {
179
+ const row = yield* db(
180
+ (db2) => db2.select().from(SessionShareTable).where((0, db_exports.eq)(SessionShareTable.session_id, sessionID)).get()
181
+ );
182
+ if (!row) return;
183
+ return { id: row.id, secret: row.secret, url: row.url };
184
+ });
185
+ const flush = Effect.fn("ShareNext.flush")(function* (sessionID) {
186
+ if (disabled) return;
187
+ const s = yield* InstanceState.get(state);
188
+ const queued = s.queue.get(sessionID);
189
+ if (!queued) return;
190
+ s.queue.delete(sessionID);
191
+ const share = yield* get(sessionID);
192
+ if (!share) return;
193
+ const req = yield* request2();
194
+ const res = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.sync(share.id)}`).pipe(
195
+ HttpClientRequest.setHeaders(req.headers),
196
+ HttpClientRequest.bodyJson({ secret: share.secret, data: Array.from(queued.data.values()) }),
197
+ Effect.flatMap((r) => http.execute(r))
198
+ );
199
+ if (res.status >= 400) {
200
+ log.warn("failed to sync share", { sessionID, shareID: share.id, status: res.status });
201
+ }
202
+ });
203
+ const full = Effect.fn("ShareNext.full")(function* (sessionID) {
204
+ log.info("full sync", { sessionID });
205
+ const info = yield* session.get(sessionID);
206
+ const diffs = yield* session.diff(sessionID);
207
+ const messages = yield* Effect.sync(() => Array.from(MessageV2.stream(sessionID)));
208
+ const models = yield* Effect.forEach(
209
+ Array.from(
210
+ new Map(
211
+ messages.filter((msg) => msg.info.role === "user").map((msg) => msg.info.model).map((item) => [`${item.providerID}/${item.modelID}`, item])
212
+ ).values()
213
+ ),
214
+ (item) => provider.getModel(ProviderID.make(item.providerID), ModelID.make(item.modelID)),
215
+ { concurrency: 8 }
216
+ );
217
+ yield* sync(sessionID, [
218
+ { type: "session", data: info },
219
+ ...messages.map((item) => ({ type: "message", data: item.info })),
220
+ ...messages.flatMap((item) => item.parts.map((part) => ({ type: "part", data: part }))),
221
+ { type: "session_diff", data: diffs },
222
+ { type: "model", data: models }
223
+ ]);
224
+ });
225
+ const init2 = Effect.fn("ShareNext.init")(function* () {
226
+ if (disabled) return;
227
+ yield* InstanceState.get(state);
228
+ });
229
+ const url2 = Effect.fn("ShareNext.url")(function* () {
230
+ return (yield* request2()).baseUrl;
231
+ });
232
+ const create2 = Effect.fn("ShareNext.create")(function* (sessionID) {
233
+ if (disabled) return { id: "", url: "", secret: "" };
234
+ log.info("creating share", { sessionID });
235
+ const req = yield* request2();
236
+ const result = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.create}`).pipe(
237
+ HttpClientRequest.setHeaders(req.headers),
238
+ HttpClientRequest.bodyJson({ sessionID }),
239
+ Effect.flatMap((r) => httpOk.execute(r)),
240
+ Effect.flatMap(HttpClientResponse.schemaBodyJson(ShareSchema))
241
+ );
242
+ yield* db(
243
+ (db2) => db2.insert(SessionShareTable).values({ session_id: sessionID, id: result.id, secret: result.secret, url: result.url }).onConflictDoUpdate({
244
+ target: SessionShareTable.session_id,
245
+ set: { id: result.id, secret: result.secret, url: result.url }
246
+ }).run()
247
+ );
248
+ const s = yield* InstanceState.get(state);
249
+ yield* full(sessionID).pipe(
250
+ Effect.catchCause(
251
+ (cause) => Effect.sync(() => {
252
+ log.error("share full sync failed", { sessionID, cause });
253
+ })
254
+ ),
255
+ Effect.forkIn(s.scope)
256
+ );
257
+ return result;
258
+ });
259
+ const remove2 = Effect.fn("ShareNext.remove")(function* (sessionID) {
260
+ if (disabled) return;
261
+ log.info("removing share", { sessionID });
262
+ const share = yield* get(sessionID);
263
+ if (!share) return;
264
+ const req = yield* request2();
265
+ yield* HttpClientRequest.delete(`${req.baseUrl}${req.api.remove(share.id)}`).pipe(
266
+ HttpClientRequest.setHeaders(req.headers),
267
+ HttpClientRequest.bodyJson({ secret: share.secret }),
268
+ Effect.flatMap((r) => httpOk.execute(r))
269
+ );
270
+ yield* db((db2) => db2.delete(SessionShareTable).where((0, db_exports.eq)(SessionShareTable.session_id, sessionID)).run());
271
+ });
272
+ return Service.of({ init: init2, url: url2, request: request2, create: create2, remove: remove2 });
273
+ })
274
+ );
275
+ ShareNext2.defaultLayer = ShareNext2.layer.pipe(
276
+ Layer.provide(Bus.layer),
277
+ Layer.provide(Account.defaultLayer),
278
+ Layer.provide(Config.defaultLayer),
279
+ Layer.provide(FetchHttpClient.layer),
280
+ Layer.provide(Provider.defaultLayer),
281
+ Layer.provide(Session.defaultLayer)
282
+ );
283
+ const { runPromise } = makeRuntime(Service, ShareNext2.defaultLayer);
284
+ async function init() {
285
+ return runPromise((svc) => svc.init());
286
+ }
287
+ ShareNext2.init = init;
288
+ async function url() {
289
+ return runPromise((svc) => svc.url());
290
+ }
291
+ ShareNext2.url = url;
292
+ async function request() {
293
+ return runPromise((svc) => svc.request());
294
+ }
295
+ ShareNext2.request = request;
296
+ async function create(sessionID) {
297
+ return runPromise((svc) => svc.create(sessionID));
298
+ }
299
+ ShareNext2.create = create;
300
+ async function remove(sessionID) {
301
+ return runPromise((svc) => svc.remove(sessionID));
302
+ }
303
+ ShareNext2.remove = remove;
304
+ })(ShareNext || (ShareNext = {}));
305
+
306
+ export {
307
+ ShareNext
308
+ };
309
+ //# sourceMappingURL=chunk-KMHCMDYS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../packages/opencode/src/share/share-next.ts", "../packages/opencode/src/share/share.sql.ts"],
4
+ "sourcesContent": ["import type * as SDK from \"@opencode-ai/sdk/v2\"\nimport { Effect, Exit, Layer, Option, Schema, Scope, ServiceMap, Stream } from \"effect\"\nimport { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/unstable/http\"\nimport { Account } from \"@/account\"\nimport { Bus } from \"@/bus\"\nimport { InstanceState } from \"@/effect/instance-state\"\nimport { makeRuntime } from \"@/effect/run-service\"\nimport { Provider } from \"@/provider/provider\"\nimport { ModelID, ProviderID } from \"@/provider/schema\"\nimport { Session } from \"@/session\"\nimport { MessageV2 } from \"@/session/message-v2\"\nimport type { SessionID } from \"@/session/schema\"\nimport { Database, eq } from \"@/storage/db\"\nimport { Config } from \"@/config/config\"\nimport { Log } from \"@/util/log\"\nimport { SessionShareTable } from \"./share.sql\"\n\nexport namespace ShareNext {\n const log = Log.create({ service: \"share-next\" })\n const disabled = process.env[\"OPENCODE_DISABLE_SHARE\"] === \"true\" || process.env[\"OPENCODE_DISABLE_SHARE\"] === \"1\"\n\n export type Api = {\n create: string\n sync: (shareID: string) => string\n remove: (shareID: string) => string\n data: (shareID: string) => string\n }\n\n export type Req = {\n headers: Record<string, string>\n api: Api\n baseUrl: string\n }\n\n const ShareSchema = Schema.Struct({\n id: Schema.String,\n url: Schema.String,\n secret: Schema.String,\n })\n export type Share = typeof ShareSchema.Type\n\n type State = {\n queue: Map<string, { data: Map<string, Data> }>\n scope: Scope.Closeable\n }\n\n type Data =\n | {\n type: \"session\"\n data: SDK.Session\n }\n | {\n type: \"message\"\n data: SDK.Message\n }\n | {\n type: \"part\"\n data: SDK.Part\n }\n | {\n type: \"session_diff\"\n data: SDK.FileDiff[]\n }\n | {\n type: \"model\"\n data: SDK.Model[]\n }\n\n export interface Interface {\n readonly init: () => Effect.Effect<void, unknown>\n readonly url: () => Effect.Effect<string, unknown>\n readonly request: () => Effect.Effect<Req, unknown>\n readonly create: (sessionID: SessionID) => Effect.Effect<Share, unknown>\n readonly remove: (sessionID: SessionID) => Effect.Effect<void, unknown>\n }\n\n export class Service extends ServiceMap.Service<Service, Interface>()(\"@opencode/ShareNext\") {}\n\n const db = <T>(fn: (d: Parameters<typeof Database.use>[0] extends (trx: infer D) => any ? D : never) => T) =>\n Effect.sync(() => Database.use(fn))\n\n function api(resource: string): Api {\n return {\n create: `/api/${resource}`,\n sync: (shareID) => `/api/${resource}/${shareID}/sync`,\n remove: (shareID) => `/api/${resource}/${shareID}`,\n data: (shareID) => `/api/${resource}/${shareID}/data`,\n }\n }\n\n const legacyApi = api(\"share\")\n const consoleApi = api(\"shares\")\n\n function key(item: Data) {\n switch (item.type) {\n case \"session\":\n return \"session\"\n case \"message\":\n return `message/${item.data.id}`\n case \"part\":\n return `part/${item.data.messageID}/${item.data.id}`\n case \"session_diff\":\n return \"session_diff\"\n case \"model\":\n return \"model\"\n }\n }\n\n export const layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const account = yield* Account.Service\n const bus = yield* Bus.Service\n const cfg = yield* Config.Service\n const http = yield* HttpClient.HttpClient\n const httpOk = HttpClient.filterStatusOk(http)\n const provider = yield* Provider.Service\n const session = yield* Session.Service\n\n function sync(sessionID: SessionID, data: Data[]): Effect.Effect<void> {\n return Effect.gen(function* () {\n if (disabled) return\n const s = yield* InstanceState.get(state)\n const existing = s.queue.get(sessionID)\n if (existing) {\n for (const item of data) {\n existing.data.set(key(item), item)\n }\n return\n }\n\n const next = new Map(data.map((item) => [key(item), item]))\n s.queue.set(sessionID, { data: next })\n yield* flush(sessionID).pipe(\n Effect.delay(1000),\n Effect.catchCause((cause) =>\n Effect.sync(() => {\n log.error(\"share flush failed\", { sessionID, cause })\n }),\n ),\n Effect.forkIn(s.scope),\n )\n })\n }\n\n const state: InstanceState<State> = yield* InstanceState.make<State>(\n Effect.fn(\"ShareNext.state\")(function* (_ctx) {\n const cache: State = { queue: new Map(), scope: yield* Scope.make() }\n\n yield* Effect.addFinalizer(() =>\n Scope.close(cache.scope, Exit.void).pipe(\n Effect.andThen(\n Effect.sync(() => {\n cache.queue.clear()\n }),\n ),\n ),\n )\n\n if (disabled) return cache\n\n const watch = <D extends { type: string }>(def: D, fn: (evt: { properties: any }) => Effect.Effect<void>) =>\n bus.subscribe(def as never).pipe(\n Stream.runForEach((evt) =>\n fn(evt).pipe(\n Effect.catchCause((cause) =>\n Effect.sync(() => {\n log.error(\"share subscriber failed\", { type: def.type, cause })\n }),\n ),\n ),\n ),\n Effect.forkScoped,\n )\n\n yield* watch(Session.Event.Updated, (evt) =>\n Effect.gen(function* () {\n const info = yield* session.get(evt.properties.sessionID)\n yield* sync(info.id, [{ type: \"session\", data: info }])\n }),\n )\n yield* watch(MessageV2.Event.Updated, (evt) =>\n Effect.gen(function* () {\n const info = evt.properties.info\n yield* sync(info.sessionID, [{ type: \"message\", data: info }])\n if (info.role !== \"user\") return\n const model = yield* provider.getModel(info.model.providerID, info.model.modelID)\n yield* sync(info.sessionID, [{ type: \"model\", data: [model] }])\n }),\n )\n yield* watch(MessageV2.Event.PartUpdated, (evt) =>\n sync(evt.properties.part.sessionID, [{ type: \"part\", data: evt.properties.part }]),\n )\n yield* watch(Session.Event.Diff, (evt) =>\n sync(evt.properties.sessionID, [{ type: \"session_diff\", data: evt.properties.diff }]),\n )\n\n return cache\n }),\n )\n\n const request = Effect.fn(\"ShareNext.request\")(function* () {\n const headers: Record<string, string> = {}\n const active = yield* account.active()\n if (Option.isNone(active) || !active.value.active_org_id) {\n const baseUrl = (yield* cfg.get()).enterprise?.url ?? \"https://opncd.ai\"\n return { headers, api: legacyApi, baseUrl } satisfies Req\n }\n\n const token = yield* account.token(active.value.id)\n if (Option.isNone(token)) {\n throw new Error(\"No active account token available for sharing\")\n }\n\n headers.authorization = `Bearer ${token.value}`\n headers[\"x-org-id\"] = active.value.active_org_id\n return { headers, api: consoleApi, baseUrl: active.value.url } satisfies Req\n })\n\n const get = Effect.fnUntraced(function* (sessionID: SessionID) {\n const row = yield* db((db) =>\n db.select().from(SessionShareTable).where(eq(SessionShareTable.session_id, sessionID)).get(),\n )\n if (!row) return\n return { id: row.id, secret: row.secret, url: row.url } satisfies Share\n })\n\n const flush = Effect.fn(\"ShareNext.flush\")(function* (sessionID: SessionID) {\n if (disabled) return\n const s = yield* InstanceState.get(state)\n const queued = s.queue.get(sessionID)\n if (!queued) return\n\n s.queue.delete(sessionID)\n\n const share = yield* get(sessionID)\n if (!share) return\n\n const req = yield* request()\n const res = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.sync(share.id)}`).pipe(\n HttpClientRequest.setHeaders(req.headers),\n HttpClientRequest.bodyJson({ secret: share.secret, data: Array.from(queued.data.values()) }),\n Effect.flatMap((r) => http.execute(r)),\n )\n\n if (res.status >= 400) {\n log.warn(\"failed to sync share\", { sessionID, shareID: share.id, status: res.status })\n }\n })\n\n const full = Effect.fn(\"ShareNext.full\")(function* (sessionID: SessionID) {\n log.info(\"full sync\", { sessionID })\n const info = yield* session.get(sessionID)\n const diffs = yield* session.diff(sessionID)\n const messages = yield* Effect.sync(() => Array.from(MessageV2.stream(sessionID)))\n const models = yield* Effect.forEach(\n Array.from(\n new Map(\n messages\n .filter((msg) => msg.info.role === \"user\")\n .map((msg) => (msg.info as SDK.UserMessage).model)\n .map((item) => [`${item.providerID}/${item.modelID}`, item] as const),\n ).values(),\n ),\n (item) => provider.getModel(ProviderID.make(item.providerID), ModelID.make(item.modelID)),\n { concurrency: 8 },\n )\n\n yield* sync(sessionID, [\n { type: \"session\", data: info },\n ...messages.map((item) => ({ type: \"message\" as const, data: item.info })),\n ...messages.flatMap((item) => item.parts.map((part) => ({ type: \"part\" as const, data: part }))),\n { type: \"session_diff\", data: diffs },\n { type: \"model\", data: models },\n ])\n })\n\n const init = Effect.fn(\"ShareNext.init\")(function* () {\n if (disabled) return\n yield* InstanceState.get(state)\n })\n\n const url = Effect.fn(\"ShareNext.url\")(function* () {\n return (yield* request()).baseUrl\n })\n\n const create = Effect.fn(\"ShareNext.create\")(function* (sessionID: SessionID) {\n if (disabled) return { id: \"\", url: \"\", secret: \"\" }\n log.info(\"creating share\", { sessionID })\n const req = yield* request()\n const result = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.create}`).pipe(\n HttpClientRequest.setHeaders(req.headers),\n HttpClientRequest.bodyJson({ sessionID }),\n Effect.flatMap((r) => httpOk.execute(r)),\n Effect.flatMap(HttpClientResponse.schemaBodyJson(ShareSchema)),\n )\n yield* db((db) =>\n db\n .insert(SessionShareTable)\n .values({ session_id: sessionID, id: result.id, secret: result.secret, url: result.url })\n .onConflictDoUpdate({\n target: SessionShareTable.session_id,\n set: { id: result.id, secret: result.secret, url: result.url },\n })\n .run(),\n )\n const s = yield* InstanceState.get(state)\n yield* full(sessionID).pipe(\n Effect.catchCause((cause) =>\n Effect.sync(() => {\n log.error(\"share full sync failed\", { sessionID, cause })\n }),\n ),\n Effect.forkIn(s.scope),\n )\n return result\n })\n\n const remove = Effect.fn(\"ShareNext.remove\")(function* (sessionID: SessionID) {\n if (disabled) return\n log.info(\"removing share\", { sessionID })\n const share = yield* get(sessionID)\n if (!share) return\n\n const req = yield* request()\n yield* HttpClientRequest.delete(`${req.baseUrl}${req.api.remove(share.id)}`).pipe(\n HttpClientRequest.setHeaders(req.headers),\n HttpClientRequest.bodyJson({ secret: share.secret }),\n Effect.flatMap((r) => httpOk.execute(r)),\n )\n\n yield* db((db) => db.delete(SessionShareTable).where(eq(SessionShareTable.session_id, sessionID)).run())\n })\n\n return Service.of({ init, url, request, create, remove })\n }),\n )\n\n export const defaultLayer = layer.pipe(\n Layer.provide(Bus.layer),\n Layer.provide(Account.defaultLayer),\n Layer.provide(Config.defaultLayer),\n Layer.provide(FetchHttpClient.layer),\n Layer.provide(Provider.defaultLayer),\n Layer.provide(Session.defaultLayer),\n )\n\n const { runPromise } = makeRuntime(Service, defaultLayer)\n\n export async function init() {\n return runPromise((svc) => svc.init())\n }\n\n export async function url() {\n return runPromise((svc) => svc.url())\n }\n\n export async function request(): Promise<Req> {\n return runPromise((svc) => svc.request())\n }\n\n export async function create(sessionID: SessionID) {\n return runPromise((svc) => svc.create(sessionID))\n }\n\n export async function remove(sessionID: SessionID) {\n return runPromise((svc) => svc.remove(sessionID))\n }\n}\n", "import { sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport { SessionTable } from \"../session/session.sql\"\nimport { Timestamps } from \"../storage/schema.sql\"\n\nexport const SessionShareTable = sqliteTable(\"session_share\", {\n session_id: text()\n .primaryKey()\n .references(() => SessionTable.id, { onDelete: \"cascade\" }),\n id: text().notNull(),\n secret: text().notNull(),\n url: text().notNull(),\n ...Timestamps,\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["ShareNext", "request", "db", "init", "url", "create", "remove"]
7
+ }