alchemylab-opencode 1.0.15 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-AAJTTZ2B.js +6549 -0
- package/dist/chunk-AAJTTZ2B.js.map +7 -0
- package/dist/chunk-BKZE6GM3.js +319 -0
- package/dist/chunk-BKZE6GM3.js.map +7 -0
- package/dist/chunk-GNXOGOVC.js +23804 -0
- package/dist/chunk-GNXOGOVC.js.map +7 -0
- package/dist/chunk-S53MTTCM.js +728 -0
- package/dist/chunk-S53MTTCM.js.map +7 -0
- package/dist/chunk-UMPQHK6N.js +5548 -0
- package/dist/chunk-UMPQHK6N.js.map +7 -0
- package/dist/mcp-DABU4PVT.js +22 -0
- package/dist/mcp-DABU4PVT.js.map +7 -0
- package/dist/registry-5W32WJWT.js +23 -0
- package/dist/registry-5W32WJWT.js.map +7 -0
- package/dist/run-TP5VUB6L.js +4794 -0
- package/dist/run-TP5VUB6L.js.map +7 -0
- package/dist/run.js +1 -1
- package/dist/serve.js +5 -1
- package/dist/serve.js.map +2 -2
- package/dist/server-GCGAYYDH.js +29 -0
- package/dist/server-GCGAYYDH.js.map +7 -0
- package/dist/session-7XE2BNL2.js +23 -0
- package/dist/session-7XE2BNL2.js.map +7 -0
- package/dist/share-next-ZFOC4GLX.js +24 -0
- package/dist/share-next-ZFOC4GLX.js.map +7 -0
- package/dist/worktree-BXX2GEIS.js +63 -0
- package/dist/worktree-BXX2GEIS.js.map +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// Built by esbuild from opencode-server source
|
|
2
|
+
if (typeof globalThis.Bun === 'undefined') {
|
|
3
|
+
globalThis.Bun = {
|
|
4
|
+
version: '0.0.0-node-compat',
|
|
5
|
+
stdin: { async text() { const chunks = []; for await (const c of process.stdin) chunks.push(c); return Buffer.concat(chunks).toString(); } },
|
|
6
|
+
which(cmd) { try { return require('child_process').execFileSync('which', [cmd], { encoding: 'utf8' }).trim(); } catch { return null; } },
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
|
|
10
|
+
if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
MessageV2,
|
|
14
|
+
ModelID,
|
|
15
|
+
Provider,
|
|
16
|
+
ProviderID,
|
|
17
|
+
Session
|
|
18
|
+
} from "./chunk-GNXOGOVC.js";
|
|
19
|
+
import {
|
|
20
|
+
Account,
|
|
21
|
+
Bus,
|
|
22
|
+
Config
|
|
23
|
+
} from "./chunk-AAJTTZ2B.js";
|
|
24
|
+
import {
|
|
25
|
+
Database,
|
|
26
|
+
InstanceState,
|
|
27
|
+
Log,
|
|
28
|
+
SessionTable,
|
|
29
|
+
Timestamps,
|
|
30
|
+
db_exports,
|
|
31
|
+
makeRuntime
|
|
32
|
+
} from "./chunk-3PZZ2D23.js";
|
|
33
|
+
|
|
34
|
+
// packages/opencode/src/share/share-next.ts
|
|
35
|
+
import { Effect, Exit, Layer, Option, Schema, Scope, ServiceMap, Stream } from "effect";
|
|
36
|
+
import { FetchHttpClient, HttpClient, HttpClientRequest, HttpClientResponse } from "effect/unstable/http";
|
|
37
|
+
|
|
38
|
+
// packages/opencode/src/share/share.sql.ts
|
|
39
|
+
import { sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
40
|
+
var SessionShareTable = sqliteTable("session_share", {
|
|
41
|
+
session_id: text().primaryKey().references(() => SessionTable.id, { onDelete: "cascade" }),
|
|
42
|
+
id: text().notNull(),
|
|
43
|
+
secret: text().notNull(),
|
|
44
|
+
url: text().notNull(),
|
|
45
|
+
...Timestamps
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// packages/opencode/src/share/share-next.ts
|
|
49
|
+
var ShareNext;
|
|
50
|
+
((ShareNext2) => {
|
|
51
|
+
const log = Log.create({ service: "share-next" });
|
|
52
|
+
const disabled = process.env["OPENCODE_DISABLE_SHARE"] === "true" || process.env["OPENCODE_DISABLE_SHARE"] === "1";
|
|
53
|
+
const ShareSchema = Schema.Struct({
|
|
54
|
+
id: Schema.String,
|
|
55
|
+
url: Schema.String,
|
|
56
|
+
secret: Schema.String
|
|
57
|
+
});
|
|
58
|
+
class Service extends ServiceMap.Service()("@opencode/ShareNext") {
|
|
59
|
+
}
|
|
60
|
+
ShareNext2.Service = Service;
|
|
61
|
+
const db = (fn) => Effect.sync(() => Database.use(fn));
|
|
62
|
+
function api(resource) {
|
|
63
|
+
return {
|
|
64
|
+
create: `/api/${resource}`,
|
|
65
|
+
sync: (shareID) => `/api/${resource}/${shareID}/sync`,
|
|
66
|
+
remove: (shareID) => `/api/${resource}/${shareID}`,
|
|
67
|
+
data: (shareID) => `/api/${resource}/${shareID}/data`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const legacyApi = api("share");
|
|
71
|
+
const consoleApi = api("shares");
|
|
72
|
+
function key(item) {
|
|
73
|
+
switch (item.type) {
|
|
74
|
+
case "session":
|
|
75
|
+
return "session";
|
|
76
|
+
case "message":
|
|
77
|
+
return `message/${item.data.id}`;
|
|
78
|
+
case "part":
|
|
79
|
+
return `part/${item.data.messageID}/${item.data.id}`;
|
|
80
|
+
case "session_diff":
|
|
81
|
+
return "session_diff";
|
|
82
|
+
case "model":
|
|
83
|
+
return "model";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
ShareNext2.layer = Layer.effect(
|
|
87
|
+
Service,
|
|
88
|
+
Effect.gen(function* () {
|
|
89
|
+
const account = yield* Account.Service;
|
|
90
|
+
const bus = yield* Bus.Service;
|
|
91
|
+
const cfg = yield* Config.Service;
|
|
92
|
+
const http = yield* HttpClient.HttpClient;
|
|
93
|
+
const httpOk = HttpClient.filterStatusOk(http);
|
|
94
|
+
const provider = yield* Provider.Service;
|
|
95
|
+
const session = yield* Session.Service;
|
|
96
|
+
function sync(sessionID, data) {
|
|
97
|
+
return Effect.gen(function* () {
|
|
98
|
+
if (disabled) return;
|
|
99
|
+
const s = yield* InstanceState.get(state);
|
|
100
|
+
const existing = s.queue.get(sessionID);
|
|
101
|
+
if (existing) {
|
|
102
|
+
for (const item of data) {
|
|
103
|
+
existing.data.set(key(item), item);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const next = new Map(data.map((item) => [key(item), item]));
|
|
108
|
+
s.queue.set(sessionID, { data: next });
|
|
109
|
+
yield* flush(sessionID).pipe(
|
|
110
|
+
Effect.delay(1e3),
|
|
111
|
+
Effect.catchCause(
|
|
112
|
+
(cause) => Effect.sync(() => {
|
|
113
|
+
log.error("share flush failed", { sessionID, cause });
|
|
114
|
+
})
|
|
115
|
+
),
|
|
116
|
+
Effect.forkIn(s.scope)
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const state = yield* InstanceState.make(
|
|
121
|
+
Effect.fn("ShareNext.state")(function* (_ctx) {
|
|
122
|
+
const cache = { queue: /* @__PURE__ */ new Map(), scope: yield* Scope.make() };
|
|
123
|
+
yield* Effect.addFinalizer(
|
|
124
|
+
() => Scope.close(cache.scope, Exit.void).pipe(
|
|
125
|
+
Effect.andThen(
|
|
126
|
+
Effect.sync(() => {
|
|
127
|
+
cache.queue.clear();
|
|
128
|
+
})
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
);
|
|
132
|
+
if (disabled) return cache;
|
|
133
|
+
const watch = (def, fn) => bus.subscribe(def).pipe(
|
|
134
|
+
Stream.runForEach(
|
|
135
|
+
(evt) => fn(evt).pipe(
|
|
136
|
+
Effect.catchCause(
|
|
137
|
+
(cause) => Effect.sync(() => {
|
|
138
|
+
log.error("share subscriber failed", { type: def.type, cause });
|
|
139
|
+
})
|
|
140
|
+
)
|
|
141
|
+
)
|
|
142
|
+
),
|
|
143
|
+
Effect.forkScoped
|
|
144
|
+
);
|
|
145
|
+
yield* watch(
|
|
146
|
+
Session.Event.Updated,
|
|
147
|
+
(evt) => Effect.gen(function* () {
|
|
148
|
+
const info = yield* session.get(evt.properties.sessionID);
|
|
149
|
+
yield* sync(info.id, [{ type: "session", data: info }]);
|
|
150
|
+
})
|
|
151
|
+
);
|
|
152
|
+
yield* watch(
|
|
153
|
+
MessageV2.Event.Updated,
|
|
154
|
+
(evt) => Effect.gen(function* () {
|
|
155
|
+
const info = evt.properties.info;
|
|
156
|
+
yield* sync(info.sessionID, [{ type: "message", data: info }]);
|
|
157
|
+
if (info.role !== "user") return;
|
|
158
|
+
const model = yield* provider.getModel(info.model.providerID, info.model.modelID);
|
|
159
|
+
yield* sync(info.sessionID, [{ type: "model", data: [model] }]);
|
|
160
|
+
})
|
|
161
|
+
);
|
|
162
|
+
yield* watch(
|
|
163
|
+
MessageV2.Event.PartUpdated,
|
|
164
|
+
(evt) => sync(evt.properties.part.sessionID, [{ type: "part", data: evt.properties.part }])
|
|
165
|
+
);
|
|
166
|
+
yield* watch(
|
|
167
|
+
Session.Event.Diff,
|
|
168
|
+
(evt) => sync(evt.properties.sessionID, [{ type: "session_diff", data: evt.properties.diff }])
|
|
169
|
+
);
|
|
170
|
+
return cache;
|
|
171
|
+
})
|
|
172
|
+
);
|
|
173
|
+
const request2 = Effect.fn("ShareNext.request")(function* () {
|
|
174
|
+
const headers = {};
|
|
175
|
+
const active = yield* account.active();
|
|
176
|
+
if (Option.isNone(active) || !active.value.active_org_id) {
|
|
177
|
+
const baseUrl = (yield* cfg.get()).enterprise?.url ?? "https://opncd.ai";
|
|
178
|
+
return { headers, api: legacyApi, baseUrl };
|
|
179
|
+
}
|
|
180
|
+
const token = yield* account.token(active.value.id);
|
|
181
|
+
if (Option.isNone(token)) {
|
|
182
|
+
throw new Error("No active account token available for sharing");
|
|
183
|
+
}
|
|
184
|
+
headers.authorization = `Bearer ${token.value}`;
|
|
185
|
+
headers["x-org-id"] = active.value.active_org_id;
|
|
186
|
+
return { headers, api: consoleApi, baseUrl: active.value.url };
|
|
187
|
+
});
|
|
188
|
+
const get = Effect.fnUntraced(function* (sessionID) {
|
|
189
|
+
const row = yield* db(
|
|
190
|
+
(db2) => db2.select().from(SessionShareTable).where((0, db_exports.eq)(SessionShareTable.session_id, sessionID)).get()
|
|
191
|
+
);
|
|
192
|
+
if (!row) return;
|
|
193
|
+
return { id: row.id, secret: row.secret, url: row.url };
|
|
194
|
+
});
|
|
195
|
+
const flush = Effect.fn("ShareNext.flush")(function* (sessionID) {
|
|
196
|
+
if (disabled) return;
|
|
197
|
+
const s = yield* InstanceState.get(state);
|
|
198
|
+
const queued = s.queue.get(sessionID);
|
|
199
|
+
if (!queued) return;
|
|
200
|
+
s.queue.delete(sessionID);
|
|
201
|
+
const share = yield* get(sessionID);
|
|
202
|
+
if (!share) return;
|
|
203
|
+
const req = yield* request2();
|
|
204
|
+
const res = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.sync(share.id)}`).pipe(
|
|
205
|
+
HttpClientRequest.setHeaders(req.headers),
|
|
206
|
+
HttpClientRequest.bodyJson({ secret: share.secret, data: Array.from(queued.data.values()) }),
|
|
207
|
+
Effect.flatMap((r) => http.execute(r))
|
|
208
|
+
);
|
|
209
|
+
if (res.status >= 400) {
|
|
210
|
+
log.warn("failed to sync share", { sessionID, shareID: share.id, status: res.status });
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
const full = Effect.fn("ShareNext.full")(function* (sessionID) {
|
|
214
|
+
log.info("full sync", { sessionID });
|
|
215
|
+
const info = yield* session.get(sessionID);
|
|
216
|
+
const diffs = yield* session.diff(sessionID);
|
|
217
|
+
const messages = yield* Effect.sync(() => Array.from(MessageV2.stream(sessionID)));
|
|
218
|
+
const models = yield* Effect.forEach(
|
|
219
|
+
Array.from(
|
|
220
|
+
new Map(
|
|
221
|
+
messages.filter((msg) => msg.info.role === "user").map((msg) => msg.info.model).map((item) => [`${item.providerID}/${item.modelID}`, item])
|
|
222
|
+
).values()
|
|
223
|
+
),
|
|
224
|
+
(item) => provider.getModel(ProviderID.make(item.providerID), ModelID.make(item.modelID)),
|
|
225
|
+
{ concurrency: 8 }
|
|
226
|
+
);
|
|
227
|
+
yield* sync(sessionID, [
|
|
228
|
+
{ type: "session", data: info },
|
|
229
|
+
...messages.map((item) => ({ type: "message", data: item.info })),
|
|
230
|
+
...messages.flatMap((item) => item.parts.map((part) => ({ type: "part", data: part }))),
|
|
231
|
+
{ type: "session_diff", data: diffs },
|
|
232
|
+
{ type: "model", data: models }
|
|
233
|
+
]);
|
|
234
|
+
});
|
|
235
|
+
const init2 = Effect.fn("ShareNext.init")(function* () {
|
|
236
|
+
if (disabled) return;
|
|
237
|
+
yield* InstanceState.get(state);
|
|
238
|
+
});
|
|
239
|
+
const url2 = Effect.fn("ShareNext.url")(function* () {
|
|
240
|
+
return (yield* request2()).baseUrl;
|
|
241
|
+
});
|
|
242
|
+
const create2 = Effect.fn("ShareNext.create")(function* (sessionID) {
|
|
243
|
+
if (disabled) return { id: "", url: "", secret: "" };
|
|
244
|
+
log.info("creating share", { sessionID });
|
|
245
|
+
const req = yield* request2();
|
|
246
|
+
const result = yield* HttpClientRequest.post(`${req.baseUrl}${req.api.create}`).pipe(
|
|
247
|
+
HttpClientRequest.setHeaders(req.headers),
|
|
248
|
+
HttpClientRequest.bodyJson({ sessionID }),
|
|
249
|
+
Effect.flatMap((r) => httpOk.execute(r)),
|
|
250
|
+
Effect.flatMap(HttpClientResponse.schemaBodyJson(ShareSchema))
|
|
251
|
+
);
|
|
252
|
+
yield* db(
|
|
253
|
+
(db2) => db2.insert(SessionShareTable).values({ session_id: sessionID, id: result.id, secret: result.secret, url: result.url }).onConflictDoUpdate({
|
|
254
|
+
target: SessionShareTable.session_id,
|
|
255
|
+
set: { id: result.id, secret: result.secret, url: result.url }
|
|
256
|
+
}).run()
|
|
257
|
+
);
|
|
258
|
+
const s = yield* InstanceState.get(state);
|
|
259
|
+
yield* full(sessionID).pipe(
|
|
260
|
+
Effect.catchCause(
|
|
261
|
+
(cause) => Effect.sync(() => {
|
|
262
|
+
log.error("share full sync failed", { sessionID, cause });
|
|
263
|
+
})
|
|
264
|
+
),
|
|
265
|
+
Effect.forkIn(s.scope)
|
|
266
|
+
);
|
|
267
|
+
return result;
|
|
268
|
+
});
|
|
269
|
+
const remove2 = Effect.fn("ShareNext.remove")(function* (sessionID) {
|
|
270
|
+
if (disabled) return;
|
|
271
|
+
log.info("removing share", { sessionID });
|
|
272
|
+
const share = yield* get(sessionID);
|
|
273
|
+
if (!share) return;
|
|
274
|
+
const req = yield* request2();
|
|
275
|
+
yield* HttpClientRequest.delete(`${req.baseUrl}${req.api.remove(share.id)}`).pipe(
|
|
276
|
+
HttpClientRequest.setHeaders(req.headers),
|
|
277
|
+
HttpClientRequest.bodyJson({ secret: share.secret }),
|
|
278
|
+
Effect.flatMap((r) => httpOk.execute(r))
|
|
279
|
+
);
|
|
280
|
+
yield* db((db2) => db2.delete(SessionShareTable).where((0, db_exports.eq)(SessionShareTable.session_id, sessionID)).run());
|
|
281
|
+
});
|
|
282
|
+
return Service.of({ init: init2, url: url2, request: request2, create: create2, remove: remove2 });
|
|
283
|
+
})
|
|
284
|
+
);
|
|
285
|
+
ShareNext2.defaultLayer = ShareNext2.layer.pipe(
|
|
286
|
+
Layer.provide(Bus.layer),
|
|
287
|
+
Layer.provide(Account.defaultLayer),
|
|
288
|
+
Layer.provide(Config.defaultLayer),
|
|
289
|
+
Layer.provide(FetchHttpClient.layer),
|
|
290
|
+
Layer.provide(Provider.defaultLayer),
|
|
291
|
+
Layer.provide(Session.defaultLayer)
|
|
292
|
+
);
|
|
293
|
+
const { runPromise } = makeRuntime(Service, ShareNext2.defaultLayer);
|
|
294
|
+
async function init() {
|
|
295
|
+
return runPromise((svc) => svc.init());
|
|
296
|
+
}
|
|
297
|
+
ShareNext2.init = init;
|
|
298
|
+
async function url() {
|
|
299
|
+
return runPromise((svc) => svc.url());
|
|
300
|
+
}
|
|
301
|
+
ShareNext2.url = url;
|
|
302
|
+
async function request() {
|
|
303
|
+
return runPromise((svc) => svc.request());
|
|
304
|
+
}
|
|
305
|
+
ShareNext2.request = request;
|
|
306
|
+
async function create(sessionID) {
|
|
307
|
+
return runPromise((svc) => svc.create(sessionID));
|
|
308
|
+
}
|
|
309
|
+
ShareNext2.create = create;
|
|
310
|
+
async function remove(sessionID) {
|
|
311
|
+
return runPromise((svc) => svc.remove(sessionID));
|
|
312
|
+
}
|
|
313
|
+
ShareNext2.remove = remove;
|
|
314
|
+
})(ShareNext || (ShareNext = {}));
|
|
315
|
+
|
|
316
|
+
export {
|
|
317
|
+
ShareNext
|
|
318
|
+
};
|
|
319
|
+
//# sourceMappingURL=chunk-BKZE6GM3.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
|
+
}
|