@amends-dev/harness-opencode 0.0.0-stage → 0.1.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/Opencode2Agent.d.ts +105 -0
  3. package/Opencode2Agent.d.ts.map +1 -0
  4. package/Opencode2Agent.js +72 -0
  5. package/Opencode2Agent.js.map +1 -0
  6. package/OpencodeAgent.d.ts +110 -0
  7. package/OpencodeAgent.d.ts.map +1 -0
  8. package/OpencodeAgent.js +83 -0
  9. package/OpencodeAgent.js.map +1 -0
  10. package/README.md +221 -2
  11. package/index.d.ts +18 -0
  12. package/index.d.ts.map +1 -0
  13. package/index.js +19 -0
  14. package/index.js.map +1 -0
  15. package/internal/agent.d.ts +29 -0
  16. package/internal/agent.d.ts.map +1 -0
  17. package/internal/agent.js +34 -0
  18. package/internal/agent.js.map +1 -0
  19. package/internal/bridge/bunBridge.d.ts +33 -0
  20. package/internal/bridge/bunBridge.d.ts.map +1 -0
  21. package/internal/bridge/bunBridge.js +62 -0
  22. package/internal/bridge/bunBridge.js.map +1 -0
  23. package/internal/bridge/driver.d.ts +81 -0
  24. package/internal/bridge/driver.d.ts.map +1 -0
  25. package/internal/bridge/driver.js +82 -0
  26. package/internal/bridge/driver.js.map +1 -0
  27. package/internal/bridge/hostTools.d.ts +28 -0
  28. package/internal/bridge/hostTools.d.ts.map +1 -0
  29. package/internal/bridge/hostTools.js +41 -0
  30. package/internal/bridge/hostTools.js.map +1 -0
  31. package/internal/bridge/server.d.ts +64 -0
  32. package/internal/bridge/server.d.ts.map +1 -0
  33. package/internal/bridge/server.js +129 -0
  34. package/internal/bridge/server.js.map +1 -0
  35. package/internal/bridge/steps.d.ts +29 -0
  36. package/internal/bridge/steps.d.ts.map +1 -0
  37. package/internal/bridge/steps.js +42 -0
  38. package/internal/bridge/steps.js.map +1 -0
  39. package/internal/bridge/v1/api.d.ts +181 -0
  40. package/internal/bridge/v1/api.d.ts.map +1 -0
  41. package/internal/bridge/v1/api.js +83 -0
  42. package/internal/bridge/v1/api.js.map +1 -0
  43. package/internal/bridge/v1/event.d.ts +597 -0
  44. package/internal/bridge/v1/event.d.ts.map +1 -0
  45. package/internal/bridge/v1/event.js +186 -0
  46. package/internal/bridge/v1/event.js.map +1 -0
  47. package/internal/bridge/v1/main.d.ts +6 -0
  48. package/internal/bridge/v1/main.d.ts.map +1 -0
  49. package/internal/bridge/v1/main.js +8 -0
  50. package/internal/bridge/v1/main.js.map +1 -0
  51. package/internal/bridge/v1/prompt.d.ts +18 -0
  52. package/internal/bridge/v1/prompt.d.ts.map +1 -0
  53. package/internal/bridge/v1/prompt.js +92 -0
  54. package/internal/bridge/v1/prompt.js.map +1 -0
  55. package/internal/bridge/v1/session.d.ts +28 -0
  56. package/internal/bridge/v1/session.d.ts.map +1 -0
  57. package/internal/bridge/v1/session.js +188 -0
  58. package/internal/bridge/v1/session.js.map +1 -0
  59. package/internal/bridge/v1/turn.d.ts +82 -0
  60. package/internal/bridge/v1/turn.d.ts.map +1 -0
  61. package/internal/bridge/v1/turn.js +304 -0
  62. package/internal/bridge/v1/turn.js.map +1 -0
  63. package/internal/bridge/v2/api.d.ts +86 -0
  64. package/internal/bridge/v2/api.d.ts.map +1 -0
  65. package/internal/bridge/v2/api.js +105 -0
  66. package/internal/bridge/v2/api.js.map +1 -0
  67. package/internal/bridge/v2/event.d.ts +539 -0
  68. package/internal/bridge/v2/event.d.ts.map +1 -0
  69. package/internal/bridge/v2/event.js +164 -0
  70. package/internal/bridge/v2/event.js.map +1 -0
  71. package/internal/bridge/v2/main.d.ts +6 -0
  72. package/internal/bridge/v2/main.d.ts.map +1 -0
  73. package/internal/bridge/v2/main.js +8 -0
  74. package/internal/bridge/v2/main.js.map +1 -0
  75. package/internal/bridge/v2/prompt.d.ts +109 -0
  76. package/internal/bridge/v2/prompt.d.ts.map +1 -0
  77. package/internal/bridge/v2/prompt.js +209 -0
  78. package/internal/bridge/v2/prompt.js.map +1 -0
  79. package/internal/bridge/v2/session.d.ts +21 -0
  80. package/internal/bridge/v2/session.d.ts.map +1 -0
  81. package/internal/bridge/v2/session.js +198 -0
  82. package/internal/bridge/v2/session.js.map +1 -0
  83. package/internal/bridge/v2/turn.d.ts +62 -0
  84. package/internal/bridge/v2/turn.d.ts.map +1 -0
  85. package/internal/bridge/v2/turn.js +277 -0
  86. package/internal/bridge/v2/turn.js.map +1 -0
  87. package/internal/models.d.ts +47 -0
  88. package/internal/models.d.ts.map +1 -0
  89. package/internal/models.js +170 -0
  90. package/internal/models.js.map +1 -0
  91. package/internal/template.d.ts +46 -0
  92. package/internal/template.d.ts.map +1 -0
  93. package/internal/template.js +267 -0
  94. package/internal/template.js.map +1 -0
  95. package/package.json +39 -4
@@ -0,0 +1,170 @@
1
+ /**
2
+ * The models opencode runs on, made from model endpoints: what opencode's server takes to serve
3
+ * them, its providers and the variables it runs with, and each endpoint's model as opencode names
4
+ * it. opencode serves a model through the endpoint's protocol, at its URL, within its limits, and
5
+ * with the key and headers of its provider. An endpoint's effort is a variant of the model, which
6
+ * the endpoint's model names.
7
+ *
8
+ * opencode 1 and opencode 2 configure providers apart: opencode 1 names them `provider`, and
9
+ * opencode 2 `providers`, each in a shape of its own. Both give a model its AI SDK package and URL,
10
+ * and a variant the AI SDK options that ask for its effort, and both find the providers and models
11
+ * that models.dev lists by their ids, as endpoints name them, knowing the rest of a model from
12
+ * there, such as whether it calls tools.
13
+ */
14
+ import { HarnessError } from "@amends-dev/harness";
15
+ import * as Array from "effect/Array";
16
+ import * as Record from "effect/Record";
17
+ import * as Redacted from "effect/Redacted";
18
+ import * as Result from "effect/Result";
19
+ /**
20
+ * The models opencode `version` runs on for the endpoint `model`, and `models` by name. opencode
21
+ * presents one key, with one set of headers, for each provider, and serves a model through one
22
+ * protocol, at one URL, within one output limit and context window, so endpoints that differ in
23
+ * them fail with `UnsupportedError`.
24
+ */
25
+ export const modelsOf = (version, endpoints) => {
26
+ const all = [endpoints.model, ...Object.values(endpoints.models ?? {})];
27
+ const byProvider = Object.entries(Array.groupBy(all, (endpoint) => endpoint.provider));
28
+ for (const [providerId, ofProvider] of byProvider) {
29
+ const conflict = conflictIn(providerId, ofProvider);
30
+ if (conflict !== undefined) {
31
+ return Result.fail(new HarnessError.UnsupportedError({ description: conflict }));
32
+ }
33
+ }
34
+ const providers = Object.fromEntries(byProvider.map(([providerId, ofProvider]) => [providerId, providerOf[version](ofProvider)]));
35
+ const config = version === 1 ? { provider: providers } : { providers };
36
+ return Result.succeed({
37
+ config,
38
+ env: version === 1 ? outputCeilingOf(all) : {},
39
+ model: modelRefOf(endpoints.model),
40
+ models: Object.fromEntries(Object.entries(endpoints.models ?? {}).map(([name, endpoint]) => [name, modelRefOf(endpoint)]))
41
+ });
42
+ };
43
+ /** Why opencode cannot serve the endpoints of the provider `providerId`, or nothing when it can. */
44
+ const conflictIn = (providerId, endpoints) => {
45
+ if (new Set(endpoints.map((endpoint) => JSON.stringify(secretsOf(endpoint)))).size > 1) {
46
+ return ("opencode presents one key, with one set of headers, for each provider, and the " +
47
+ `endpoints for ${providerId} differ in them`);
48
+ }
49
+ for (const [modelId, ofModel] of Object.entries(Array.groupBy(endpoints, (endpoint) => endpoint.model))) {
50
+ const served = new Set(ofModel.map((endpoint) => JSON.stringify([endpoint.protocol, urlOf(endpoint), endpoint.maxOutputTokens, endpoint.contextWindow])));
51
+ if (served.size > 1) {
52
+ return ("opencode serves a model through one protocol, at one URL, within one output limit and " +
53
+ `context window, and the endpoints for ${providerId}/${modelId} differ in them`);
54
+ }
55
+ }
56
+ return undefined;
57
+ };
58
+ /** The configuration of the provider that serves `endpoints`, which share their provider. */
59
+ const providerOf = {
60
+ 1: (endpoints) => {
61
+ const options = secretsOf(endpoints[0]);
62
+ return {
63
+ ...(Record.isEmptyRecord(options) ? {} : { options }),
64
+ models: modelsByIdOf(endpoints, opencode1ModelOf)
65
+ };
66
+ },
67
+ 2: (endpoints) => {
68
+ const { apiKey, headers } = secretsOf(endpoints[0]);
69
+ return {
70
+ ...(apiKey === undefined ? {} : { settings: { apiKey } }),
71
+ ...(headers === undefined ? {} : { headers }),
72
+ models: modelsByIdOf(endpoints, opencode2ModelOf)
73
+ };
74
+ }
75
+ };
76
+ /** The configuration of each model that `endpoints` name, by its id, as `modelOf` writes it. */
77
+ const modelsByIdOf = (endpoints, modelOf) => Object.fromEntries(Object.entries(Array.groupBy(endpoints, (endpoint) => endpoint.model)).map(([modelId, ofModel]) => [
78
+ modelId,
79
+ modelOf(ofModel)
80
+ ]));
81
+ /**
82
+ * A model in opencode 1's configuration. opencode 1 takes a model's limits together, so an
83
+ * endpoint with an output limit gives its context window too, or 0, which opencode takes as
84
+ * unknown; an endpoint without one leaves both to what opencode knows of the model from models.dev.
85
+ * A variant gives the AI SDK options that ask for its effort.
86
+ */
87
+ const opencode1ModelOf = (endpoints) => {
88
+ const [endpoint] = endpoints;
89
+ const variants = efforts(endpoints).map((effort) => [variantOf(effort), effortOptions[endpoint.protocol](effort)]);
90
+ return {
91
+ provider: { npm: packages[endpoint.protocol], api: urlOf(endpoint) },
92
+ ...(endpoint.maxOutputTokens === undefined
93
+ ? {}
94
+ : { limit: { context: endpoint.contextWindow ?? 0, output: endpoint.maxOutputTokens } }),
95
+ ...(variants.length === 0 ? {} : { variants: Object.fromEntries(variants) })
96
+ };
97
+ };
98
+ /**
99
+ * A model in opencode 2's configuration, whose URL is an AI SDK setting, and whose limits opencode
100
+ * takes apart, each over what models.dev says.
101
+ */
102
+ const opencode2ModelOf = (endpoints) => {
103
+ const [endpoint] = endpoints;
104
+ const limit = {
105
+ ...(endpoint.maxOutputTokens === undefined ? {} : { output: endpoint.maxOutputTokens }),
106
+ ...(endpoint.contextWindow === undefined ? {} : { context: endpoint.contextWindow })
107
+ };
108
+ const variants = efforts(endpoints).map((effort) => ({
109
+ id: variantOf(effort),
110
+ settings: effortOptions[endpoint.protocol](effort)
111
+ }));
112
+ return {
113
+ package: packages[endpoint.protocol],
114
+ settings: { baseURL: urlOf(endpoint) },
115
+ ...(Record.isEmptyRecord(limit) ? {} : { limit }),
116
+ ...(variants.length === 0 ? {} : { variants })
117
+ };
118
+ };
119
+ /** The efforts that `endpoints` ask for, each once. */
120
+ const efforts = (endpoints) => [
121
+ ...new Set(endpoints.flatMap(({ effort }) => (effort === undefined ? [] : [effort])))
122
+ ];
123
+ const modelRefOf = (endpoint) => ({
124
+ providerID: endpoint.provider,
125
+ id: endpoint.model,
126
+ ...(endpoint.effort === undefined ? {} : { variant: variantOf(endpoint.effort) })
127
+ });
128
+ /**
129
+ * The AI SDK package opencode serves a protocol with: opencode's runner sends a model's requests as
130
+ * the API that the package its model names reaches.
131
+ */
132
+ const packages = {
133
+ "anthropic-messages": "@ai-sdk/anthropic",
134
+ "openai-responses": "@ai-sdk/openai",
135
+ "openai-chat": "@ai-sdk/openai-compatible"
136
+ };
137
+ /**
138
+ * The AI SDK options that ask for an effort, as each protocol's package takes them, which opencode
139
+ * gives the requests of a model that runs in a variant of them.
140
+ */
141
+ const effortOptions = {
142
+ "anthropic-messages": (effort) => ({ effort }),
143
+ "openai-responses": (effort) => ({ reasoningEffort: effort }),
144
+ "openai-chat": (effort) => ({ reasoningEffort: effort })
145
+ };
146
+ /**
147
+ * The variant of a model that asks for `effort`, named apart from the variants that opencode gives
148
+ * models itself, whose fields one of the same name would join.
149
+ */
150
+ const variantOf = (effort) => `amends-${effort}`;
151
+ /** The endpoint's URL without a slash at its end, which the protocol's paths follow. */
152
+ const urlOf = (endpoint) => endpoint.url.replace(/\/+$/, "");
153
+ /** The key and headers the endpoint's requests carry, each absent when it gives none. */
154
+ const secretsOf = (endpoint) => {
155
+ const headers = Record.map(endpoint.headers ?? {}, Redacted.value);
156
+ return {
157
+ ...(endpoint.apiKey === undefined ? {} : { apiKey: Redacted.value(endpoint.apiKey) }),
158
+ ...(Record.isEmptyRecord(headers) ? {} : { headers })
159
+ };
160
+ };
161
+ /**
162
+ * The most tokens opencode 1 lets a model write in a response is 32,000, whatever its output
163
+ * limit, unless its server is given a higher ceiling. It is given the highest output limit of the
164
+ * endpoints when one is higher, which leaves the models without one as they were.
165
+ */
166
+ const outputCeilingOf = (endpoints) => {
167
+ const highest = Math.max(...endpoints.map((endpoint) => endpoint.maxOutputTokens ?? 0));
168
+ return highest > 32_000 ? { OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: String(highest) } : {};
169
+ };
170
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/internal/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Installs an opencode agent's bridge in a sandbox, and launches it there. The template gives the
3
+ * sandbox a pinned Bun and a pinned opencode in `~/.amends/opencode/<programs>`, a directory named
4
+ * for their versions, and beside them the agent's bridge program bundled into one file, named for
5
+ * its contents. It keeps what it installs in the sandbox's home, out of the directory sessions work
6
+ * in. Bun and opencode come from their npm packages for the sandbox's platform, which the sandbox
7
+ * downloads and checks against the integrity npm published for them, as a lockfile pins them. Each
8
+ * version of opencode has its programs and its directory: opencode 1 from `opencode-ai`, and
9
+ * opencode 2 from `@opencode/cli`.
10
+ *
11
+ * What a sandbox has already is kept: one created from a snapshot of a prepared one, or a local
12
+ * sandbox sharing this machine's home with one prepared before, is ready at once, and a new bridge
13
+ * program installs without downloading the programs again.
14
+ */
15
+ import { Template } from "@amends-dev/sandbox";
16
+ import * as Crypto from "effect/Crypto";
17
+ import * as Effect from "effect/Effect";
18
+ import * as PlatformError from "effect/PlatformError";
19
+ /** The platforms the bridge installs on, as `platformOf` names them. */
20
+ export type Platform = `${"darwin" | "linux"}-${"arm64" | "x64"}`;
21
+ /**
22
+ * The version of opencode an agent runs: 1, whose session API opencode 1 speaks, or 2, whose
23
+ * session API opencode 2 speaks. Each has a bridge program of its own, `bridge/v<version>/main`.
24
+ */
25
+ export type Version = 1 | 2;
26
+ export interface Installation {
27
+ /** Installs the bridge in a new sandbox. */
28
+ readonly template: Template.Template;
29
+ /** The command that launches the installed bridge, and its arguments. */
30
+ readonly command: string;
31
+ readonly args: ReadonlyArray<string>;
32
+ }
33
+ /**
34
+ * Bundles the bridge program of the agent that runs opencode `version`, giving the template that
35
+ * installs it with the command that launches it. The template's identity changes with anything it
36
+ * installs.
37
+ */
38
+ export declare const makeInstallation: (version: Version) => Effect.Effect<Installation, PlatformError.PlatformError, Crypto.Crypto>;
39
+ /** The platform that `uname -sm` printed, or nothing for one the bridge does not install on. */
40
+ export declare const platformOf: (uname: string) => Platform | undefined;
41
+ /**
42
+ * The version a program printed for `--version`: alone, as Bun and opencode 1 print it, or after
43
+ * the program's name, as opencode 2 prints `opencode v2.0.26`.
44
+ */
45
+ export declare const versionIn: (printed: string) => string | undefined;
46
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/internal/template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAKvC,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAMrD,wEAAwE;AACxE,MAAM,MAAM,QAAQ,GAAG,GAAG,QAAQ,GAAG,OAAO,IAAI,OAAO,GAAG,KAAK,EAAE,CAAA;AAkGjE;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAA;IAEpC,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAExB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACrC;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,+FAoB3B,CAAA;AAEF,gGAAgG;AAChG,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,QAAQ,GAAG,SAUrD,CAAA;AAuHD;;;GAGG;AACH,eAAO,MAAM,SAAS,YAAa,MAAM,uBAA0D,CAAA"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Installs an opencode agent's bridge in a sandbox, and launches it there. The template gives the
3
+ * sandbox a pinned Bun and a pinned opencode in `~/.amends/opencode/<programs>`, a directory named
4
+ * for their versions, and beside them the agent's bridge program bundled into one file, named for
5
+ * its contents. It keeps what it installs in the sandbox's home, out of the directory sessions work
6
+ * in. Bun and opencode come from their npm packages for the sandbox's platform, which the sandbox
7
+ * downloads and checks against the integrity npm published for them, as a lockfile pins them. Each
8
+ * version of opencode has its programs and its directory: opencode 1 from `opencode-ai`, and
9
+ * opencode 2 from `@opencode/cli`.
10
+ *
11
+ * What a sandbox has already is kept: one created from a snapshot of a prepared one, or a local
12
+ * sandbox sharing this machine's home with one prepared before, is ready at once, and a new bridge
13
+ * program installs without downloading the programs again.
14
+ */
15
+ import { Template } from "@amends-dev/sandbox";
16
+ import * as Crypto from "effect/Crypto";
17
+ import * as Effect from "effect/Effect";
18
+ import * as Base64 from "effect/encoding/Base64";
19
+ import * as Hex from "effect/encoding/Hex";
20
+ import * as FileSystem from "effect/FileSystem";
21
+ import * as Path from "effect/Path";
22
+ import * as PlatformError from "effect/PlatformError";
23
+ import * as ChildProcess from "effect/process/ChildProcess";
24
+ import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
25
+ import * as Result from "effect/Result";
26
+ import * as Stream from "effect/Stream";
27
+ /** Bun, which runs the bridge program. */
28
+ const bun = {
29
+ version: "1.3.14",
30
+ packages: {
31
+ "darwin-arm64": {
32
+ name: "@oven/bun-darwin-aarch64",
33
+ integrity: "sha512-Omj20SuiHBOUjUBIyqtkNjSUIjOtEOJwmbix/ZyFH4BaQ6OZTaaRWIR4TjHVz0yadHgli6lLTiAh1uarnvD49A=="
34
+ },
35
+ "darwin-x64": {
36
+ name: "@oven/bun-darwin-x64",
37
+ integrity: "sha512-FFj3QdU/OhlDyZOJ8CWfN5eWLpRlT4qjZg7lMQi7jA6GuoY5ajlO1zWLP/MuHYRSbXQUvV52RejNi8DVnAp13w=="
38
+ },
39
+ "linux-arm64": {
40
+ name: "@oven/bun-linux-aarch64",
41
+ integrity: "sha512-X5SsPZHs+iYO8R/efIcRtc7gT2Q2DgPfliCxEkx4cXBumwkw0c/EsHMNwH3EgGpCDaZ7IYVPhpCG/xBOQHEwZw=="
42
+ },
43
+ "linux-x64": {
44
+ name: "@oven/bun-linux-x64",
45
+ integrity: "sha512-7OVTAKvwfPmSbIV1HpdOoVVx5VRc427GuPPne93N6vk4eQBPId9nXmZDh9/zGaKPdbVjVtQSZafWQoUjx38Utw=="
46
+ }
47
+ }
48
+ };
49
+ /**
50
+ * The programs each version's bridge needs: Bun, which runs the bridge, and opencode, each named
51
+ * as the bridge runs it.
52
+ */
53
+ const programsOf = {
54
+ 1: {
55
+ bun,
56
+ opencode: {
57
+ version: "1.18.23",
58
+ packages: {
59
+ "darwin-arm64": {
60
+ name: "opencode-darwin-arm64",
61
+ integrity: "sha512-QP9PjwpHtZoLVXw2WvUmPZecz7mWbQkT4t3K36B//fCaDG+zWa+SsztIeaW5azujNwwtUemLA5icE/zINng48Q=="
62
+ },
63
+ "darwin-x64": {
64
+ name: "opencode-darwin-x64",
65
+ integrity: "sha512-R9nWP3edz/0FnEfwmuxtiWBB7bS4NtZCyCffJyiMlrbwdDC+bIXYrWxWXVrzaP1mJujs6g2MAwTCUSx/qpBhDw=="
66
+ },
67
+ "linux-arm64": {
68
+ name: "opencode-linux-arm64",
69
+ integrity: "sha512-g1zDFhuE9FOYwjSGderlu69wfd4GQzS0xsDiIY11QUciuBmM6DrHqLvmhlLFsUVHYVnCPY1YeN1pq5ewE3x72Q=="
70
+ },
71
+ "linux-x64": {
72
+ name: "opencode-linux-x64",
73
+ integrity: "sha512-5x9d1Cm/YtqzR6lAlNbgVprTQ3R3hx7qGTWCzm5l5u6lBNkhYTrhy2s8k25dxKKuxqZ9Kngqz9JYWvSVHy2Lmw=="
74
+ }
75
+ }
76
+ }
77
+ },
78
+ 2: {
79
+ bun,
80
+ opencode: {
81
+ version: "2.0.26",
82
+ packages: {
83
+ "darwin-arm64": {
84
+ name: "@opencode/cli-darwin-arm64",
85
+ integrity: "sha512-XklldeO6eWgG8vkPNLcdlBPEm1Y+/tyhEXGZvXbk8uytpPP7SEVV2R9oZ98NMSSPH9kBAO/+Xo4sKfvD6CHAsw=="
86
+ },
87
+ "darwin-x64": {
88
+ name: "@opencode/cli-darwin-x64",
89
+ integrity: "sha512-051fIryTH4FK4Ml63TH+IP3s7Mi+jYfVyEXSBh9aGDJUS2VZfD+AwNJ9Ew9nBPTBKYvhMGhqHcudHagRL8SBbQ=="
90
+ },
91
+ "linux-arm64": {
92
+ name: "@opencode/cli-linux-arm64",
93
+ integrity: "sha512-IG316I8wVqndohzFAoWNeH83eMA8sKQFRtMeuk2Wfg4DU1haCSgzAJz3/gbytjwh6bXdWR7V3FCSrfjoraKDgw=="
94
+ },
95
+ "linux-x64": {
96
+ name: "@opencode/cli-linux-x64",
97
+ integrity: "sha512-UIA2/1Ik8HaN54C4xp7H+OHgRfq995XUixrX+kLmFs8EPn1fAcmn3OoiN+3c3Vc3jEV/LHmj0Cy1SL6nW4wdGw=="
98
+ }
99
+ }
100
+ }
101
+ }
102
+ };
103
+ /** Bump to install the programs anew, as when the files they install move. */
104
+ const layoutVersion = 1;
105
+ /**
106
+ * Bundles the bridge program of the agent that runs opencode `version`, giving the template that
107
+ * installs it with the command that launches it. The template's identity changes with anything it
108
+ * installs.
109
+ */
110
+ export const makeInstallation = Effect.fnUntraced(function* (version) {
111
+ const crypto = yield* Crypto.Crypto;
112
+ const hashOf = (text) => Effect.map(crypto.digest("SHA-256", new TextEncoder().encode(text)), (digest) => Hex.encode(digest).slice(0, 16));
113
+ const bundle = yield* bundleBridge(version);
114
+ const programs = programsOf[version];
115
+ const programsHash = yield* hashOf(JSON.stringify([layoutVersion, programs]));
116
+ const bundleHash = yield* hashOf(bundle);
117
+ const directory = `.amends/opencode/${programsHash}`;
118
+ const bridge = `bridge-${bundleHash}.js`;
119
+ const installation = {
120
+ template: {
121
+ name: Template.TemplateName.make(version === 1 ? "opencode" : "opencode2"),
122
+ identity: `${programsHash}-${bundleHash}`,
123
+ prepare: install(programs, directory, bridge, bundle)
124
+ },
125
+ command: "sh",
126
+ args: ["-c", `exec "$HOME/${directory}/bun" "$HOME/${directory}/${bridge}"`]
127
+ };
128
+ return installation;
129
+ });
130
+ /** The platform that `uname -sm` printed, or nothing for one the bridge does not install on. */
131
+ export const platformOf = (uname) => {
132
+ const [system, machine] = uname.trim().split(/\s+/);
133
+ const architecture = machine === "arm64" || machine === "aarch64"
134
+ ? "arm64"
135
+ : machine === "x86_64" || machine === "amd64"
136
+ ? "x64"
137
+ : undefined;
138
+ if (architecture === undefined)
139
+ return undefined;
140
+ return system === "Darwin" ? `darwin-${architecture}` : system === "Linux" ? `linux-${architecture}` : undefined;
141
+ };
142
+ /**
143
+ * The bridge program of opencode `version`, `bridge/v<version>/main.ts`, bundled with everything
144
+ * it imports into one file for Bun. The program is beside this module, in this module's own form:
145
+ * a source among the sources, a compiled file among the compiled ones of the distribution.
146
+ */
147
+ const bundleBridge = (version) => Effect.promise(async () => {
148
+ const extension = import.meta.url.slice(import.meta.url.lastIndexOf("."));
149
+ const { outputs } = await Bun.build({
150
+ entrypoints: [`${import.meta.dirname}/bridge/v${version}/main${extension}`],
151
+ target: "bun",
152
+ minify: true
153
+ });
154
+ const [bundle] = outputs;
155
+ if (bundle === undefined)
156
+ throw new Error("Bun built the bridge program into no file");
157
+ return bundle.text();
158
+ });
159
+ /**
160
+ * Installs `programs` in `directory` of the sandbox's home, and `bundle` beside them as `bridge`,
161
+ * each unless the sandbox has it already. Each goes in under another name first, renamed into
162
+ * place once whole, so that no bridge launches from half an installation.
163
+ */
164
+ const install = (programs, directory, bridge, bundle) => Effect.gen(function* () {
165
+ const fs = yield* FileSystem.FileSystem;
166
+ const path = yield* Path.Path;
167
+ const installed = path.join(yield* homeDirectory, directory);
168
+ if (!(yield* fs.exists(installed)))
169
+ yield* installPrograms(programs, installed);
170
+ const bridgeFile = path.join(installed, bridge);
171
+ if (yield* fs.exists(bridgeFile))
172
+ return;
173
+ const staging = yield* fs.makeTempDirectory({ directory: installed, prefix: ".bridge-" });
174
+ yield* fs
175
+ .writeFileString(path.join(staging, bridge), bundle)
176
+ .pipe(Effect.andThen(fs.rename(path.join(staging, bridge), bridgeFile)), Effect.ensuring(Effect.ignore(fs.remove(staging, { recursive: true, force: true }))));
177
+ });
178
+ /** Installs `programs` in `installed`, checking that each runs as its pinned version. */
179
+ const installPrograms = (programs, installed) => Effect.gen(function* () {
180
+ const fs = yield* FileSystem.FileSystem;
181
+ const path = yield* Path.Path;
182
+ const uname = yield* run("uname", ["-sm"]);
183
+ const platform = platformOf(uname);
184
+ if (platform === undefined) {
185
+ return yield* failure("Unknown", "opencode's bridge installs on macOS and on Linux with glibc, on arm64 and x64, not on " + uname.trim());
186
+ }
187
+ yield* fs.makeDirectory(path.dirname(installed), { recursive: true });
188
+ const staging = yield* fs.makeTempDirectory({
189
+ directory: path.dirname(installed),
190
+ prefix: `.${path.basename(installed)}-`
191
+ });
192
+ yield* Effect.gen(function* () {
193
+ for (const [program, { version, packages }] of Object.entries(programs)) {
194
+ yield* installProgram(staging, program, version, packages[platform]);
195
+ }
196
+ // A sandbox sharing this home may have installed the same meanwhile, which serves as well.
197
+ yield* fs
198
+ .rename(staging, installed)
199
+ .pipe(Effect.catch((error) => Effect.flatMap(fs.exists(installed), (exists) => (exists ? Effect.void : Effect.fail(error)))));
200
+ }).pipe(Effect.ensuring(Effect.ignore(fs.remove(staging, { recursive: true, force: true }))));
201
+ });
202
+ /**
203
+ * Installs `program` from `pkg` in `directory`: downloads the package, checks it against the
204
+ * integrity npm published for it, extracts the program, and checks that it runs as `version`.
205
+ */
206
+ const installProgram = (directory, program, version, pkg) => Effect.gen(function* () {
207
+ const fs = yield* FileSystem.FileSystem;
208
+ const path = yield* Path.Path;
209
+ const tarball = path.join(directory, `${program}.tgz`);
210
+ yield* run("curl", [
211
+ "--fail",
212
+ "--silent",
213
+ "--show-error",
214
+ "--location",
215
+ "--retry",
216
+ "3",
217
+ "--output",
218
+ tarball,
219
+ `https://registry.npmjs.org/${pkg.name}/-/${pkg.name.split("/").at(-1)}-${version}.tgz`
220
+ ]);
221
+ // macOS has no `sha512sum`, and slim Linux images have no `shasum`.
222
+ const [sha512] = (yield* run("sh", [
223
+ "-c",
224
+ 'sha512sum "$1" 2>/dev/null || shasum -a 512 "$1"',
225
+ "sh",
226
+ tarball
227
+ ])).split(/\s/);
228
+ if (sha512 !== hexOf(pkg.integrity)) {
229
+ return yield* failure("InvalidData", `${pkg.name}@${version} does not match the integrity npm published for it`);
230
+ }
231
+ yield* run("tar", ["-xzf", tarball, "-C", directory, "--strip-components=2", `package/bin/${program}`]);
232
+ yield* fs.remove(tarball);
233
+ const printed = (yield* run(path.join(directory, program), ["--version"])).trim();
234
+ if (versionIn(printed) !== version) {
235
+ return yield* failure("InvalidData", `${program} ${version} printed ${printed} as its version`);
236
+ }
237
+ });
238
+ /**
239
+ * The version a program printed for `--version`: alone, as Bun and opencode 1 print it, or after
240
+ * the program's name, as opencode 2 prints `opencode v2.0.26`.
241
+ */
242
+ export const versionIn = (printed) => printed.trim().split(/\s+/).at(-1)?.replace(/^v/, "");
243
+ /** Runs `command` in the sandbox for its output, failing with its error output when it fails. */
244
+ const run = (command, args) => Effect.gen(function* () {
245
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
246
+ const process = yield* spawner.spawn(ChildProcess.make(command, args, { stdin: "ignore" }));
247
+ const [output, errorOutput, code] = yield* Effect.all([
248
+ Stream.mkString(Stream.decodeText(process.stdout)),
249
+ Stream.mkString(Stream.decodeText(process.stderr)),
250
+ process.exitCode
251
+ ], { concurrency: "unbounded" });
252
+ if (code !== 0) {
253
+ return yield* failure("Unknown", `\`${[command, ...args].join(" ")}\` exited with code ${code}: ${errorOutput.trim()}`);
254
+ }
255
+ return output;
256
+ }).pipe(Effect.scoped);
257
+ /** The sandbox's home directory. */
258
+ const homeDirectory = run("sh", ["-c", 'printf %s "$HOME"']).pipe(Effect.filterOrFail((home) => home.startsWith("/"), () => failure("NotFound", "The sandbox has no home directory")));
259
+ /** The SHA-512 digest in hex that an npm `integrity` names. */
260
+ const hexOf = (integrity) => Hex.encode(Result.getOrThrow(Base64.decode(integrity.slice("sha512-".length))));
261
+ const failure = (tag, description) => PlatformError.systemError({
262
+ _tag: tag,
263
+ module: "OpencodeAgent",
264
+ method: "prepare",
265
+ description
266
+ });
267
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/internal/template.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,41 @@
1
1
  {
2
2
  "name": "@amends-dev/harness-opencode",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "opencode as an agent for the @amends-dev/harness contract: opencode works in a sandbox behind its bridge, which the agent's template installs there.",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/amends-dev/amends/tree/main/adapters/harness-opencode#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/amends-dev/amends.git",
10
+ "directory": "adapters/harness-opencode"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/amends-dev/amends/issues"
14
+ },
15
+ "keywords": [
16
+ "agent",
17
+ "ai",
18
+ "effect",
19
+ "harness",
20
+ "opencode",
21
+ "sandbox"
22
+ ],
23
+ "type": "module",
24
+ "sideEffects": false,
25
+ "exports": {
26
+ ".": "./index.js",
27
+ "./*": "./*.js",
28
+ "./internal/*": null
29
+ },
30
+ "dependencies": {
31
+ "@amends-dev/harness": "^0.1.0",
32
+ "@amends-dev/sandbox": "^0.1.0",
33
+ "@effect/platform-bun": "^4.0.0"
34
+ },
35
+ "peerDependencies": {
36
+ "effect": "^4.0.0"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ }
41
+ }