alchemylab-opencode 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/build.mjs +163 -0
  2. package/dist/chunk-ANDTK76Q.js +319 -0
  3. package/dist/chunk-ANDTK76Q.js.map +7 -0
  4. package/dist/chunk-B3FN2B2N.js +2280 -0
  5. package/dist/chunk-B3FN2B2N.js.map +7 -0
  6. package/dist/chunk-BI5OUHTQ.js +31 -0
  7. package/dist/chunk-BI5OUHTQ.js.map +7 -0
  8. package/dist/chunk-CR6IREZA.js +127 -0
  9. package/dist/chunk-CR6IREZA.js.map +7 -0
  10. package/dist/chunk-CYXMV3J3.js +6535 -0
  11. package/dist/chunk-CYXMV3J3.js.map +7 -0
  12. package/dist/chunk-DSPC5QIG.js +23731 -0
  13. package/dist/chunk-DSPC5QIG.js.map +7 -0
  14. package/dist/chunk-HORZKFCR.js +88 -0
  15. package/dist/chunk-HORZKFCR.js.map +7 -0
  16. package/dist/chunk-MCWTARFP.js +728 -0
  17. package/dist/chunk-MCWTARFP.js.map +7 -0
  18. package/dist/chunk-UWZSRZHA.js +5025 -0
  19. package/dist/chunk-UWZSRZHA.js.map +7 -0
  20. package/dist/mcp-VAU4RMWH.js +22 -0
  21. package/dist/mcp-VAU4RMWH.js.map +7 -0
  22. package/dist/pty.node-RHOAUGH6.js +40 -0
  23. package/dist/pty.node-RHOAUGH6.js.map +7 -0
  24. package/dist/registry-PYMN6L3G.js +23 -0
  25. package/dist/registry-PYMN6L3G.js.map +7 -0
  26. package/dist/run-YFVCQJQM.js +4791 -0
  27. package/dist/run-YFVCQJQM.js.map +7 -0
  28. package/dist/run-service-LHEVFBIU.js +22 -0
  29. package/dist/run-service-LHEVFBIU.js.map +7 -0
  30. package/dist/run.js +22 -0
  31. package/dist/run.js.map +7 -0
  32. package/dist/schema-32EBFLEO.js +24 -0
  33. package/dist/schema-32EBFLEO.js.map +7 -0
  34. package/dist/serve.js +41 -0
  35. package/dist/serve.js.map +7 -0
  36. package/dist/server-K3UGWASP.js +26 -0
  37. package/dist/server-K3UGWASP.js.map +7 -0
  38. package/dist/session-HJFWTM7C.js +23 -0
  39. package/dist/session-HJFWTM7C.js.map +7 -0
  40. package/dist/share-next-55VCIMUH.js +24 -0
  41. package/dist/share-next-55VCIMUH.js.map +7 -0
  42. package/dist/worktree-6GGDLADY.js +63 -0
  43. package/dist/worktree-6GGDLADY.js.map +7 -0
  44. package/package.json +10 -3
package/build.mjs ADDED
@@ -0,0 +1,163 @@
1
+ import * as esbuild from 'esbuild'
2
+ import { readFileSync, existsSync } from 'fs'
3
+ import { join, resolve, extname } from 'path'
4
+
5
+ const ROOT = resolve(import.meta.dirname)
6
+ const SRC = join(ROOT, 'packages/opencode/src')
7
+ const PACKAGES = join(ROOT, 'packages')
8
+
9
+ const tsExtensions = ['.ts', '.tsx', '/index.ts', '/index.tsx']
10
+
11
+ function resolveWithExtensions(path) {
12
+ if (extname(path) && existsSync(path)) return path
13
+ for (const ext of tsExtensions) {
14
+ const candidate = path + ext
15
+ if (existsSync(candidate)) return candidate
16
+ }
17
+ return null
18
+ }
19
+
20
+ // .txt → string export
21
+ const txtPlugin = {
22
+ name: 'txt-loader',
23
+ setup(build) {
24
+ build.onLoad({ filter: /\.txt$/ }, async (args) => {
25
+ const text = readFileSync(args.path, 'utf8')
26
+ return { contents: `export default ${JSON.stringify(text)}`, loader: 'js' }
27
+ })
28
+ }
29
+ }
30
+
31
+ // #db / #pty → node implementations
32
+ const conditionalImportsPlugin = {
33
+ name: 'conditional-imports',
34
+ setup(build) {
35
+ build.onResolve({ filter: /^#db$/ }, () => ({ path: join(SRC, 'storage/db.node.ts') }))
36
+ build.onResolve({ filter: /^#pty$/ }, () => ({ path: join(SRC, 'pty/pty.node.ts') }))
37
+ }
38
+ }
39
+
40
+ // @/ and @tui/ path aliases
41
+ const aliasPlugin = {
42
+ name: 'path-aliases',
43
+ setup(build) {
44
+ build.onResolve({ filter: /^@\// }, (args) => {
45
+ const resolved = resolveWithExtensions(join(SRC, args.path.slice(2)))
46
+ return resolved ? { path: resolved } : undefined
47
+ })
48
+ build.onResolve({ filter: /^@tui\// }, (args) => {
49
+ const resolved = resolveWithExtensions(join(SRC, 'cli/cmd/tui', args.path.slice(5)))
50
+ return resolved ? { path: resolved } : undefined
51
+ })
52
+ }
53
+ }
54
+
55
+ // @opencode-ai/* → resolve to local packages source (bundle them)
56
+ const opencodePackagesPlugin = {
57
+ name: 'opencode-packages',
58
+ setup(build) {
59
+ build.onResolve({ filter: /^@opencode-ai\// }, (args) => {
60
+ // @opencode-ai/plugin → packages/plugin/src/index.ts
61
+ // @opencode-ai/sdk → packages/sdk/src/index.ts
62
+ // @opencode-ai/sdk/v2 → packages/sdk/src/v2/index.ts
63
+ // @opencode-ai/util/error → packages/util/src/error.ts
64
+ const parts = args.path.replace('@opencode-ai/', '').split('/')
65
+ const pkg = parts[0] // plugin, sdk, util, script
66
+ const subpath = parts.slice(1).join('/')
67
+
68
+ let target
69
+ if (subpath) {
70
+ target = join(PACKAGES, pkg, 'src', subpath)
71
+ } else {
72
+ target = join(PACKAGES, pkg, 'src', 'index')
73
+ }
74
+
75
+ const resolved = resolveWithExtensions(target)
76
+ return resolved ? { path: resolved } : undefined
77
+ })
78
+ }
79
+ }
80
+
81
+ // Stub bun:* and bun imports
82
+ const bunStubPlugin = {
83
+ name: 'bun-stub',
84
+ setup(build) {
85
+ build.onResolve({ filter: /^bun(:|$)/ }, (args) => ({
86
+ path: args.path, namespace: 'bun-stub',
87
+ }))
88
+ build.onLoad({ filter: /.*/, namespace: 'bun-stub' }, () => ({
89
+ contents: 'export default {}', loader: 'js',
90
+ }))
91
+ }
92
+ }
93
+
94
+
95
+ // Fix external imports that don't work in Node ESM without extensions
96
+ const fixExternalImportsPlugin = {
97
+ name: 'fix-external-imports',
98
+ setup(build) {
99
+ const fixes = {
100
+ 'vscode-jsonrpc/node': 'vscode-jsonrpc/node.js',
101
+ '@parcel/watcher/wrapper': '@parcel/watcher/wrapper.js',
102
+ }
103
+ for (const [from, to] of Object.entries(fixes)) {
104
+ build.onResolve({ filter: new RegExp('^' + from.replace(/[/\\]/g, '[\\/]') + '$') }, () => ({
105
+ path: to,
106
+ external: true,
107
+ }))
108
+ }
109
+ }
110
+ }
111
+
112
+
113
+ // Rewrite migration dir path for built output
114
+ const migrationPathPlugin = {
115
+ name: 'migration-path',
116
+ setup(build) {
117
+ build.onLoad({ filter: /storage\/db\./ }, async (args) => {
118
+ const { readFileSync } = await import('fs')
119
+ let contents = readFileSync(args.path, 'utf8')
120
+ // Replace the hardcoded ../../migration with a path relative to the package root
121
+ // At runtime, import.meta.dirname in dist/ is the dist dir
122
+ // We want packages/opencode/migration relative to the package root
123
+ contents = contents.replace(
124
+ 'path.join(import.meta.dirname, "../../migration")',
125
+ 'path.join(import.meta.dirname, "../packages/opencode/migration")'
126
+ )
127
+ // Also handle the alternate form
128
+ contents = contents.replace(
129
+ "path.join(import.meta.dirname, '../../migration')",
130
+ "path.join(import.meta.dirname, '../packages/opencode/migration')"
131
+ )
132
+ return { contents, loader: 'ts' }
133
+ })
134
+ }
135
+ }
136
+
137
+ const result = await esbuild.build({
138
+ entryPoints: [join(SRC, 'serve.ts'), join(SRC, 'run.ts')],
139
+ bundle: true,
140
+ platform: 'node',
141
+ target: 'node22',
142
+ format: 'esm',
143
+ outdir: join(ROOT, 'dist'),
144
+ splitting: true,
145
+ sourcemap: true,
146
+ plugins: [txtPlugin, conditionalImportsPlugin, aliasPlugin, opencodePackagesPlugin, bunStubPlugin, fixExternalImportsPlugin, migrationPathPlugin],
147
+ packages: 'external',
148
+
149
+ banner: { js: `// Built by esbuild from opencode-server source
150
+ if (typeof globalThis.Bun === 'undefined') {
151
+ globalThis.Bun = {
152
+ version: '0.0.0-node-compat',
153
+ stdin: { async text() { const chunks = []; for await (const c of process.stdin) chunks.push(c); return Buffer.concat(chunks).toString(); } },
154
+ which(cmd) { try { return require('child_process').execFileSync('which', [cmd], { encoding: 'utf8' }).trim(); } catch { return null; } },
155
+ };
156
+ }
157
+ if (typeof globalThis.__name === 'undefined') { globalThis.__name = (t, n) => { Object.defineProperty(t, 'name', { value: n, configurable: true }); return t; }; }
158
+ if (typeof globalThis.__export === 'undefined') { globalThis.__export = (t, a) => { for (const k in a) Object.defineProperty(t, k, { get: a[k], enumerable: true }); }; }
159
+ ` },
160
+ logLevel: 'info',
161
+ })
162
+
163
+ if (result.errors.length > 0) process.exit(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-DSPC5QIG.js";
19
+ import {
20
+ Account,
21
+ Bus,
22
+ Config
23
+ } from "./chunk-CYXMV3J3.js";
24
+ import {
25
+ Database,
26
+ InstanceState,
27
+ Log,
28
+ SessionTable,
29
+ Timestamps,
30
+ db_exports,
31
+ makeRuntime
32
+ } from "./chunk-B3FN2B2N.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-ANDTK76Q.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
+ }