@codeworksh/harness 0.0.1-dev.20260907151726 → 0.0.1-dev.20260917115353
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/README.md +129 -6
- package/{daytona-C6wWlJ4z.mjs → daytona-jO3_hTRS.mjs} +24 -3
- package/daytona-jO3_hTRS.mjs.map +1 -0
- package/effect.d.mts +14594 -2447
- package/effect.mjs +3251 -1734
- package/effect.mjs.map +1 -1
- package/{index-CTm6Qzer.d.mts → index-5Ur9C_De.d.mts} +2 -2
- package/{index-D5gDWEaM.d.mts → index-B72Qlv0L.d.mts} +2 -2
- package/package.json +9 -7
- package/{rolldown-runtime-D7D4PA-g.mjs → rolldown-runtime-8H4AJuhK.mjs} +1 -0
- package/{sandbox-DnL9UPzZ.d.mts → sandbox-DX9mliQs.d.mts} +226 -136
- package/{sandbox-QCmZ3UhD.mjs → sandbox-Dlz9cGeD.mjs} +64 -7
- package/sandbox-Dlz9cGeD.mjs.map +1 -0
- package/sandbox.d.mts +1 -1
- package/sandbox.mjs +1 -1
- package/sandboxes/daytona/index.d.mts +1 -1
- package/sandboxes/daytona/index.mjs +1 -1
- package/sandboxes/vercel/index.d.mts +1 -1
- package/sandboxes/vercel/index.mjs +1 -1
- package/{vercel-DW62mvsC.mjs → vercel-QPuO0iit.mjs} +20 -6
- package/vercel-QPuO0iit.mjs.map +1 -0
- package/daytona-C6wWlJ4z.mjs.map +0 -1
- package/sandbox-QCmZ3UhD.mjs.map +0 -1
- package/vercel-DW62mvsC.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -15,6 +15,129 @@ The initial public surface is the Effect SDK at `@codeworksh/harness/effect`.
|
|
|
15
15
|
- **Model Flexibility:** select any provider and model available in Aikit's generated catalog, including its supported thinking levels.
|
|
16
16
|
- **Pluggable Sandboxes:** run the same workflow against the host machine, a virtual filesystem, or a remote sandbox.
|
|
17
17
|
|
|
18
|
+
## Plugins
|
|
19
|
+
|
|
20
|
+
Pass an ordered plugin list when constructing the harness. Each plugin has a required ID and contributes tools or a prompt during setup. Setup runs once per exchange, after model resolution; its tools, hooks, and prompt remain pinned through tool continuations.
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { Effect, Schema } from "effect";
|
|
24
|
+
import { Harness, Plugin, Tool } from "@codeworksh/harness/effect";
|
|
25
|
+
|
|
26
|
+
const echo = Plugin.define({
|
|
27
|
+
id: "acme.tool.echo",
|
|
28
|
+
setup(ctx) {
|
|
29
|
+
ctx.plugin.tools.add(
|
|
30
|
+
Tool.register(
|
|
31
|
+
Tool.make({
|
|
32
|
+
name: "echo",
|
|
33
|
+
description: "Echo a message",
|
|
34
|
+
parameters: Schema.Struct({ text: Schema.String }),
|
|
35
|
+
success: Schema.String,
|
|
36
|
+
handler: ({ text }) => Effect.succeed(text),
|
|
37
|
+
}),
|
|
38
|
+
),
|
|
39
|
+
{
|
|
40
|
+
beforeToolCall(call) {
|
|
41
|
+
// Arguments have already been decoded. Return { block: true, reason: "..." }
|
|
42
|
+
// to skip this handler and its after hook.
|
|
43
|
+
},
|
|
44
|
+
afterToolCall({ terminal }) {
|
|
45
|
+
// Completed/error results can be patched through content, details, isError.
|
|
46
|
+
// Aborted results are observation-only; keep cancellation cleanup short.
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// A prompt plugin renders the system prompt, and indexes every tool registered before it.
|
|
54
|
+
const prompt = Plugin.define({
|
|
55
|
+
id: "acme.prompt.main",
|
|
56
|
+
setup(ctx) {
|
|
57
|
+
ctx.plugin.prompt.set(
|
|
58
|
+
`You have: ${ctx.plugin.tools
|
|
59
|
+
.list()
|
|
60
|
+
.map((tool) => tool.name)
|
|
61
|
+
.join(", ")}`,
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Omit `plugins` for the built-ins plus whatever settings add; passing it owns the whole
|
|
67
|
+
// selection, which is why this one supplies its own prompt plugin.
|
|
68
|
+
const runtime = Harness.layer({ plugins: [echo, prompt] });
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Hooks belong to the tool registration. Sequential or parallel scheduling, selected with `Session.create({ tools: { execution: "parallel" } })`, covers the entire hook/handler pipeline. After runs for a started, interrupted tool if it has not already started, with a one-second cooperative cleanup grace period. The kernel owns result settlement.
|
|
72
|
+
|
|
73
|
+
`ctx.plugin.tools.update(name, patch)` rewrites a registration's model-facing prose without replacing the tool or its hooks. A read sees only earlier contributions, so a plugin patching `promptSnippet` or `promptGuidelines` must run _before_ the prompt plugin that indexes them — after it, the patch still reaches the wire description but no longer the system prompt.
|
|
74
|
+
|
|
75
|
+
Prompt plugins use `ctx.plugin.prompt.get()` and `set(string)`. Each `set` replaces the entire prompt, including with an empty string. Place a prompt plugin after the tools or prompt contributors it needs. Contributions close after setup; plugins receive event publication but no subscription or background lifecycle.
|
|
76
|
+
|
|
77
|
+
Omitting `plugins` selects Bash then the default prompt, followed by the host settings' `plugins` block. An explicit array replaces all of that, and an empty one runs nothing — which is not a usable harness: `freeze` requires a system prompt, so a selection without a prompt plugin fails every exchange with `SnapshotError("no prompt plugin set a system prompt")`. Every working selection ends with a prompt plugin, whether `codework.prompt.default` or your own.
|
|
78
|
+
|
|
79
|
+
An entry is a **module** or a **configuration object**.
|
|
80
|
+
|
|
81
|
+
A module is a definition object, a local path, a `file:` URL, or a package spec. It is loaded if it is not already, and it takes the position it is written at — naming a module again moves it:
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
plugins: [echo, "./plugins/local.ts", "file:///opt/plugin.mjs", "@acme/codework-tool-proc@1.2.0"];
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
A configuration object addresses a plugin **something else already selected**, and names it one of two ways:
|
|
88
|
+
|
|
89
|
+
```jsonc
|
|
90
|
+
{ "plugin": "acme.tool.proc", "options": { "limit": 40 } } // by ID, when you know it
|
|
91
|
+
{ "package": "@acme/codework-tool-proc", "options": { "limit": 40 } } // by the package it came from
|
|
92
|
+
{ "plugin": "codework.tool.bash", "enabled": false } // drop a built-in
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Exactly one of `plugin` and `package` per entry. `plugin` is a plugin's ID; `package` is any name the module answers to — the package name, the exact spec, the path it was loaded from, or the name a local package's own manifest declares.
|
|
96
|
+
|
|
97
|
+
An **ID is a key**. The last module to claim one owns it, and the configuration written against it stays with the key rather than with whichever module is currently behind it. Two modules exporting one ID is the author's conflict to resolve — the replacement is logged at debug, not arbitrated here.
|
|
98
|
+
|
|
99
|
+
A configuration object **never loads, installs or reorders anything**. If its name matches nothing in the selection — a typo, a package you have not added, a plugin this build does not ship — the entry is **ignored**: one debug line, no failure, and nothing fetched. So adding a package and configuring it is two entries, in that order:
|
|
100
|
+
|
|
101
|
+
```jsonc
|
|
102
|
+
{ "plugins": ["@acme/codework-tool-proc@1.2.0", { "package": "@acme/codework-tool-proc", "options": { "limit": 40 } }] }
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Repeated configuration replaces rather than merges — the block is opaque, so the last entry owns it whole. `options` reaches that plugin as the second argument to `setup`, `{}` when nothing configured it. The harness never looks inside it, including the `null`s it strips everywhere else in a settings file, since inside an opaque block a `null` is a value its plugin may need:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
Plugin.define({
|
|
109
|
+
id: "acme.tool.proc",
|
|
110
|
+
setup(ctx, options) {
|
|
111
|
+
const limit = typeof options.limit === "number" ? options.limit : 10;
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Source modules must default-export one plugin object.
|
|
117
|
+
|
|
118
|
+
Settings entries take the same two forms, and they extend the built-in selection instead of standing in for it, so naming one plugin cannot silently drop Bash or the prompt:
|
|
119
|
+
|
|
120
|
+
```jsonc
|
|
121
|
+
// codework.json, ~/.codework/settings.json, or a --user-config-dir
|
|
122
|
+
{
|
|
123
|
+
"plugins": [
|
|
124
|
+
"@acme/codework-prompt-life",
|
|
125
|
+
"@acme/codework-tool-proc@1.2.0",
|
|
126
|
+
"./plugins/local.ts",
|
|
127
|
+
{ "package": "@acme/codework-tool-proc", "options": { "limit": 20 } },
|
|
128
|
+
{ "plugin": "codework.tool.bash", "enabled": false },
|
|
129
|
+
],
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The array replaces across settings layers rather than concatenating, so the highest-priority file that names `plugins` owns the whole list. A leading `~` expands to the home directory. A `./` or `../` path resolves against the directory of the file that declared it — next to `codework.json`, inside `.codework/`, or beside `~/.codework/settings.json` — so one entry means one file in every project; a `package` naming a relative path is anchored the same way. `file:` URLs, absolute paths and package specs are taken as written.
|
|
134
|
+
|
|
135
|
+
Settings entries append after the built-ins, and a prompt plugin sees only what registered before it, so a tool plugin added from settings reaches the provider with its own description but is **absent from the system prompt's tool list**. A settings file names modules and configures plugins; it cannot reorder the built-in selection, and the built-in definitions are not exported — an embedder that needs a different order passes its own complete selection to `Harness.layer({ plugins })`, prompt plugin included.
|
|
136
|
+
|
|
137
|
+
Package sources install with pnpm, with lifecycle scripts disabled, under the harness home cache. The installer inherits stderr, so a first install prints pnpm's own progress and errors to the terminal — and a `plugins` entry in a settings file means that can happen during `Harness.layer` construction, before any session exists. An omitted version means `latest` on the first installation; subsequent constructions reuse that completed installation. The selection is read once per `Harness.layer`, so an edited `plugins` block applies at the next construction; hot reload and daemon lifecycles are not implemented.
|
|
138
|
+
|
|
139
|
+
Failures are attributed: a bad reference, unreadable module, or malformed plugin fails `Harness.layer` construction with `PluginPreparationError`, which carries the failing phase (`source`, `install`, `import`, or `definition`) and the index of the offending reference. A failing package install reports `PluginInstallError`; a plugin's `setup` failure becomes `Plugin.SetupError` with the plugin id, surfacing as a `SnapshotError` for that exchange. Plugins are trusted in-process code — local paths and `file:` references import whatever they point at, so only load sources you trust.
|
|
140
|
+
|
|
18
141
|
## Pluggable Sandboxes
|
|
19
142
|
|
|
20
143
|
Harness uses a driver-based sandbox architecture. Drivers share a common lifecycle and I/O surface, keeping provider details out of session and agent-loop code.
|
|
@@ -70,7 +193,7 @@ Vercel and Daytona are the first remote drivers. More providers can be added beh
|
|
|
70
193
|
|
|
71
194
|
- Node.js 24.14.1 or newer
|
|
72
195
|
- An API key for the model provider you select
|
|
73
|
-
- A generated Aikit model catalog; run `codework
|
|
196
|
+
- A generated Aikit model catalog; run `codework models generate` from the project you want to use
|
|
74
197
|
|
|
75
198
|
## CLI
|
|
76
199
|
|
|
@@ -79,7 +202,7 @@ Run the current development release without installing it globally:
|
|
|
79
202
|
```sh
|
|
80
203
|
export OPENAI_API_KEY="..."
|
|
81
204
|
|
|
82
|
-
pnpm dlx @codeworksh/harness@dev
|
|
205
|
+
pnpm dlx @codeworksh/harness@dev models generate
|
|
83
206
|
|
|
84
207
|
pnpm dlx @codeworksh/harness@dev \
|
|
85
208
|
--home .codework-beta \
|
|
@@ -102,7 +225,7 @@ cache 9,600 read · 0 write
|
|
|
102
225
|
cost $0.014200 · 1 turn
|
|
103
226
|
```
|
|
104
227
|
|
|
105
|
-
`
|
|
228
|
+
`codework models generate [path]` uses Aikit's model generator and writes `./models.gen.json` by default. Set `CODEWORK_MODELS_FILE` or pass a path when you keep the catalog elsewhere.
|
|
106
229
|
|
|
107
230
|
The CLI prints the session ID to stderr. Provider, model, and thinking settings are stored with the session, so use the same home directory and session ID to continue it:
|
|
108
231
|
|
|
@@ -130,7 +253,7 @@ export DAYTONA_API_KEY="..."
|
|
|
130
253
|
|
|
131
254
|
pnpm dlx @codeworksh/harness@dev \
|
|
132
255
|
--home .codework-beta \
|
|
133
|
-
run --sandbox daytona --provider openai --model gpt-5.5 \
|
|
256
|
+
run --sandbox-driver daytona --provider openai --model gpt-5.5 \
|
|
134
257
|
"Inspect this repository"
|
|
135
258
|
```
|
|
136
259
|
|
|
@@ -139,13 +262,13 @@ Pass the provider's sandbox ID to connect a new Harness session to an existing D
|
|
|
139
262
|
```sh
|
|
140
263
|
pnpm dlx @codeworksh/harness@dev \
|
|
141
264
|
--home .codework-beta \
|
|
142
|
-
run --sandbox daytona --sandbox-provider-id <daytona-sandbox-id> \
|
|
265
|
+
run --sandbox-driver daytona --sandbox-provider-id <daytona-sandbox-id> \
|
|
143
266
|
"Continue work in this sandbox"
|
|
144
267
|
```
|
|
145
268
|
|
|
146
269
|
`--cwd` overrides the selected sandbox's default working directory. When continuing with `--session`, omit the sandbox flags: the durable session already references its sandbox.
|
|
147
270
|
|
|
148
|
-
The same flags work with Vercel Sandbox by using `--sandbox vercel`; `--sandbox-provider-id` then accepts the existing Vercel sandbox name.
|
|
271
|
+
The same flags work with Vercel Sandbox by using `--sandbox-driver vercel`; `--sandbox-provider-id` then accepts the existing Vercel sandbox name.
|
|
149
272
|
|
|
150
273
|
Use `codework --help` or `pnpm dlx @codeworksh/harness@dev --help` for all options.
|
|
151
274
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as
|
|
1
|
+
import { $ as PersistedError, B as quote, C as AbsolutePath, D as driver, E as defineModule, F as resolveMountCwd, H as resolveCwd, I as Shell, J as realpathScripts, K as fromProvider, L as ShellError, V as quoteArgv, W as Service, b as providerError, n as Service$1, ot as posix, w as Name, y as makeRedactor } from "./sandbox-Dlz9cGeD.mjs";
|
|
2
2
|
import { Context, DateTime, Effect, Layer, Option, Schema } from "effect";
|
|
3
3
|
import { Buffer } from "node:buffer";
|
|
4
4
|
//#region src/sandboxes/daytona/fs.ts
|
|
@@ -19,7 +19,8 @@ const make$1 = (provider, options) => {
|
|
|
19
19
|
readdir: (path) => provider.readdir(resolve(path)),
|
|
20
20
|
exists: (path) => provider.exists(resolve(path)),
|
|
21
21
|
mkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),
|
|
22
|
-
rm: (path, rmOptions) => provider.rm(resolve(path), rmOptions)
|
|
22
|
+
rm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),
|
|
23
|
+
realpath: (path) => provider.realpath(resolve(path))
|
|
23
24
|
};
|
|
24
25
|
};
|
|
25
26
|
//#endregion
|
|
@@ -108,6 +109,26 @@ const providerFrom = (sandbox, options) => {
|
|
|
108
109
|
if (rmOptions?.force && !await filesystem.exists(path)) return;
|
|
109
110
|
throw cause;
|
|
110
111
|
}
|
|
112
|
+
},
|
|
113
|
+
realpath: async (path) => {
|
|
114
|
+
const run = async (script) => {
|
|
115
|
+
const command = quoteArgv([
|
|
116
|
+
"sh",
|
|
117
|
+
"-c",
|
|
118
|
+
script,
|
|
119
|
+
"_",
|
|
120
|
+
path
|
|
121
|
+
]);
|
|
122
|
+
return {
|
|
123
|
+
command,
|
|
124
|
+
result: await sandbox.process.executeCommand(command, options.cwd, void 0, options.execTimeout)
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
const asDirectory = await run(realpathScripts[0]);
|
|
128
|
+
if (asDirectory.result.exitCode === 0) return (asDirectory.result.result ?? "").trimEnd();
|
|
129
|
+
const asFile = await run(realpathScripts[1]);
|
|
130
|
+
assertCommandSucceeded(asFile.command, asFile.result);
|
|
131
|
+
return (asFile.result.result ?? "").trimEnd();
|
|
111
132
|
}
|
|
112
133
|
};
|
|
113
134
|
return filesystem;
|
|
@@ -288,4 +309,4 @@ const config = (value) => ({
|
|
|
288
309
|
//#endregion
|
|
289
310
|
export { RuntimeConfig as a, sandbox as c, ResourcesConfig as i, CreateConfig as n, config as o, Options as r, make as s, ClientOptions as t };
|
|
290
311
|
|
|
291
|
-
//# sourceMappingURL=daytona-
|
|
312
|
+
//# sourceMappingURL=daytona-jO3_hTRS.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daytona-jO3_hTRS.mjs","names":["make","SandboxIO.resolveMountCwd","SandboxInstance.PersistedError","SandboxFileSystem.realpathScripts","SandboxFileSystem.Service","SandboxFileSystem.fromProvider","RemoteFileSystem.make","SandboxResource.Service","SandboxDriver.AbsolutePath","SandboxProvider.makeRedactor","SandboxProvider.providerError","SandboxDriver.driver","EnvDaytona.mountCwd","EnvDaytona.transport","SandboxDriver.module"],"sources":["../../src/sandboxes/daytona/fs.ts","../../src/sandboxes/daytona/provider.ts","../../src/sandboxes/daytona/index.ts"],"sourcesContent":["import { posix } from \"../../util/posix.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\n\nexport type FileStat = SandboxFileSystem.FileStat;\n\nexport interface Interface extends SandboxFileSystem.Provider {\n\treadonly lstat?: (path: string) => Promise<FileStat>;\n}\n\nexport interface Options {\n\treadonly cwd?: string;\n}\n\nconst resolvePath = (path: string, options?: Options) => {\n\tconst normalized = posix.normalize(path);\n\tif (options?.cwd === undefined || posix.isAbsolute(normalized)) return normalized;\n\treturn posix.normalize(posix.join(options.cwd, normalized));\n};\n\n/** Resolve provider paths without adding policy or mutable working-directory state. */\nexport const make = (provider: Interface, options?: Options): SandboxFileSystem.Provider => {\n\tconst resolve = (path: string) => resolvePath(path, options);\n\n\treturn {\n\t\treadFile: (path) => provider.readFile(resolve(path)),\n\t\treadFileBuffer: (path) => provider.readFileBuffer(resolve(path)),\n\t\twriteFile: (path, content) => provider.writeFile(resolve(path), content),\n\t\tstat: (path) => provider.stat(resolve(path)),\n\t\t...(provider.lstat === undefined ? {} : { lstat: (path: string) => provider.lstat!(resolve(path)) }),\n\t\treaddir: (path) => provider.readdir(resolve(path)),\n\t\texists: (path) => provider.exists(resolve(path)),\n\t\tmkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),\n\t\trm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),\n\t\trealpath: (path) => provider.realpath(resolve(path)),\n\t};\n};\n\nexport const withProvider = make;\n","/* oxlint-disable effecttsgo/async-function -- Daytona's SDK boundary is Promise-based. */\nimport { Context, DateTime, Effect, Layer, Option, Schema } from \"effect\";\nimport { Buffer } from \"node:buffer\";\nimport { posix } from \"../../util/posix.ts\";\nimport { sanitizeError } from \"../../sandbox/errors.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\nimport { SandboxInstance } from \"../../sandbox/instance.ts\";\nimport { SandboxIO } from \"../../sandbox/io.ts\";\nimport { SandboxResource } from \"../../sandbox/resource.ts\";\nimport { type ISandboxExe, quote, quoteArgv, resolveCwd, Shell, ShellError } from \"../../sandbox/shell/shell.ts\";\nimport * as RemoteFileSystem from \"./fs.ts\";\n\ntype CodeLanguage = import(\"@daytona/sdk\").CodeLanguage;\ntype Daytona = import(\"@daytona/sdk\").Daytona;\ntype FileInfo = import(\"@daytona/sdk\").FileInfo;\ntype Image = import(\"@daytona/sdk\").Image;\ntype RemoteSandbox = import(\"@daytona/sdk\").Sandbox;\ntype Resources = import(\"@daytona/sdk\").Resources;\n\n/** Fallback when Daytona cannot report a snapshot/image-specific work directory. */\nexport const DEFAULT_CWD = \"/home/daytona\";\n\n/**\n * The mount cwd for a Daytona namespace.\n *\n * An absolute override replaces the namespace default outright, so the\n * `getWorkDir()` round-trip is skipped: it would discover a value we then throw\n * away. Otherwise the sandbox's own work directory is the default, and\n * {@link DEFAULT_CWD} covers a snapshot or image that reports none.\n *\n * Taken as a thunk rather than read off the sandbox so all three branches are\n * testable without provisioning one — this decides where every Daytona mount\n * roots, and §8.1 makes a wrong answer here resolve silently rather than fail.\n */\nexport const mountCwd = async (\n\tcwd: string | undefined,\n\tgetWorkDir: () => Promise<string | undefined>,\n): Promise<string> => {\n\tconst defaultCwd = posix.isAbsolute(cwd ?? \"\") ? DEFAULT_CWD : ((await getWorkDir()) ?? DEFAULT_CWD);\n\treturn SandboxIO.resolveMountCwd(defaultCwd, cwd);\n};\n\nexport class DaytonaError extends Schema.TaggedError<DaytonaError>()(\"DaytonaError\", {\n\tsanitized: SandboxInstance.PersistedError,\n}) {}\n\nexport interface Options {\n\t/** API key. Falls back to the `DAYTONA_API_KEY` env var when omitted. */\n\treadonly apiKey?: string | undefined;\n\t/** API URL. Falls back to `DAYTONA_API_URL` / the SDK default. */\n\treadonly apiUrl?: string | undefined;\n\t/** Target region. Falls back to `DAYTONA_TARGET` / the SDK default. */\n\treadonly target?: string | undefined;\n\t/** Reuse an existing sandbox by id or name instead of creating one. */\n\treadonly sandboxId?: string | undefined;\n\t/** Durable instance identity for this namespace. Supplied by the Controller. */\n\treadonly instanceId?: SandboxInstance.ID | undefined;\n\t/** Snapshot to create the sandbox from. */\n\treadonly snapshot?: string | undefined;\n\t/** Image (registry reference or declarative `Image`) to create the sandbox from. */\n\treadonly image?: string | Image | undefined;\n\t/** Runtime used for code execution. Defaults to `\"typescript\"`. */\n\treadonly language?: CodeLanguage | string | undefined;\n\t/** Environment variables baked into the sandbox. */\n\treadonly envVars?: Record<string, string> | undefined;\n\t/** Resource allocation (cpu / memory / disk). */\n\treadonly resources?: Resources | undefined;\n\t/** OS user to run as inside the sandbox. */\n\treadonly user?: string | undefined;\n\t/**\n\t * Mount working directory. Relative values resolve against `getWorkDir()`;\n\t * omitted values use it, with `/home/daytona` as the provider fallback.\n\t */\n\treadonly cwd?: string | undefined;\n\t/** Idle minutes before the sandbox auto-stops. */\n\treadonly autoStopInterval?: number | undefined;\n\t/** Per-command timeout in seconds. 0 means no timeout. */\n\treadonly execTimeout?: number | undefined;\n}\n\ninterface RemoteState {\n\treadonly sandbox: RemoteSandbox;\n\treadonly cwd: string;\n}\n\nclass Remote extends Context.Service<Remote, RemoteState>()(\"@codeworksh/harness/sandboxes/daytona/provider/Remote\") {}\n\nconst assertCommandSucceeded = (command: string, result: { exitCode: number; result?: string }) => {\n\tif (result.exitCode !== 0) throw new Error(result.result || `command failed (${result.exitCode}): ${command}`);\n};\n\nconst dateFrom = (value: string | undefined) => {\n\tif (value === undefined) return undefined;\n\treturn Option.getOrUndefined(DateTime.make(value).pipe(Option.map(DateTime.toDateUtc)));\n};\n\nexport const createSandbox = (daytona: Daytona, options: Options) => {\n\tconst base = {\n\t\tlanguage: options.language ?? \"typescript\",\n\t\t...(options.envVars === undefined ? {} : { envVars: options.envVars }),\n\t\t...(options.user === undefined ? {} : { user: options.user }),\n\t\t...(options.autoStopInterval === undefined ? {} : { autoStopInterval: options.autoStopInterval }),\n\t\tautoDeleteInterval: -1,\n\t};\n\treturn options.image !== undefined\n\t\t? daytona.create({\n\t\t\t\t...base,\n\t\t\t\timage: options.image,\n\t\t\t\t...(options.resources === undefined ? {} : { resources: options.resources }),\n\t\t\t})\n\t\t: daytona.create({ ...base, ...(options.snapshot === undefined ? {} : { snapshot: options.snapshot }) });\n};\n\nconst remote = (options: Options) =>\n\tLayer.effect(\n\t\tRemote,\n\t\tEffect.tryPromise({\n\t\t\ttry: async (): Promise<RemoteState> => {\n\t\t\t\tconst { Daytona } = await import(\"@daytona/sdk\");\n\t\t\t\tconst daytona = new Daytona({\n\t\t\t\t\t...(options.apiKey === undefined ? {} : { apiKey: options.apiKey }),\n\t\t\t\t\t...(options.apiUrl === undefined ? {} : { apiUrl: options.apiUrl }),\n\t\t\t\t\t...(options.target === undefined ? {} : { target: options.target }),\n\t\t\t\t});\n\t\t\t\tconst sandbox = options.sandboxId\n\t\t\t\t\t? await daytona.get(options.sandboxId)\n\t\t\t\t\t: await createSandbox(daytona, options);\n\t\t\t\treturn {\n\t\t\t\t\tsandbox,\n\t\t\t\t\tcwd: await mountCwd(options.cwd, () => sandbox.getWorkDir()),\n\t\t\t\t};\n\t\t\t},\n\t\t\tcatch: (cause) => new DaytonaError({ sanitized: sanitizeError(cause) }),\n\t\t}),\n\t);\n\nexport const statsFrom = (info: FileInfo): RemoteFileSystem.FileStat => {\n\tconst symlink = info.mode === undefined ? undefined : info.mode.startsWith(\"l\");\n\tconst mtime = dateFrom(info.modifiedAt ?? info.modTime);\n\n\t// omit size/mtime/isSymbolicLink the toolbox did not report — never fabricate\n\treturn {\n\t\tisFile: !info.isDir && symlink !== true,\n\t\tisDirectory: info.isDir,\n\t\t...(symlink === undefined ? {} : { isSymbolicLink: symlink }),\n\t\t...(info.size === undefined ? {} : { size: info.size }),\n\t\t...(mtime === undefined ? {} : { mtime }),\n\t};\n};\n\ntype RemoteFilesystemProvider = Pick<\n\tRemoteFileSystem.Interface,\n\t\"readFile\" | \"readFileBuffer\" | \"writeFile\" | \"stat\" | \"lstat\" | \"readdir\" | \"exists\" | \"mkdir\" | \"rm\" | \"realpath\"\n>;\n\nconst providerFrom = (sandbox: RemoteSandbox, options: Options) => {\n\tconst filesystem: RemoteFilesystemProvider = {\n\t\treadFile: async (path: string) => (await sandbox.fs.downloadFile(path)).toString(\"utf8\"),\n\t\treadFileBuffer: async (path: string) => new Uint8Array(await sandbox.fs.downloadFile(path)),\n\t\twriteFile: (path: string, content: string | Uint8Array) =>\n\t\t\tsandbox.fs.uploadFile(typeof content === \"string\" ? Buffer.from(content, \"utf8\") : Buffer.from(content), path),\n\t\tstat: async (path: string) => statsFrom(await sandbox.fs.getFileDetails(path)),\n\t\t// The toolbox file-details endpoint follows symlinks. Detect the entry\n\t\t// with the sandbox shell first so lstat never reports target metadata as\n\t\t// if it described the link itself.\n\t\tlstat: async (path: string) => {\n\t\t\tconst command = `test -L ${quote(path)}`;\n\t\t\tconst result = await sandbox.process.executeCommand(command, options.cwd, undefined, options.execTimeout);\n\t\t\tif (result.exitCode === 0) {\n\t\t\t\treturn { isFile: false, isDirectory: false, isSymbolicLink: true };\n\t\t\t}\n\t\t\tif (result.exitCode === 1) return statsFrom(await sandbox.fs.getFileDetails(path));\n\t\t\tassertCommandSucceeded(command, result);\n\t\t\tthrow new Error(`unreachable lstat result for ${path}`);\n\t\t},\n\t\treaddir: async (path: string) => (await sandbox.fs.listFiles(path)).map((entry) => entry.name),\n\t\t// Only a genuine 404 means \"absent\". Auth, rate-limit, and transport\n\t\t// failures propagate: a caller that deletes records on absence must not\n\t\t// be told a path is gone because the API was briefly unreachable.\n\t\texists: async (path: string) => {\n\t\t\ttry {\n\t\t\t\tawait sandbox.fs.getFileDetails(path);\n\t\t\t\treturn true;\n\t\t\t} catch (cause) {\n\t\t\t\tconst { DaytonaNotFoundError } = await import(\"@daytona/sdk\");\n\t\t\t\tif (cause instanceof DaytonaNotFoundError) return false;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t},\n\t\tmkdir: async (path: string, mkdirOptions?: { recursive?: boolean }) => {\n\t\t\tif (!mkdirOptions?.recursive) {\n\t\t\t\tawait sandbox.fs.createFolder(path, \"755\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst command = `mkdir -p ${quote(path)}`;\n\t\t\tconst result = await sandbox.process.executeCommand(command, options.cwd, undefined, options.execTimeout);\n\t\t\tassertCommandSucceeded(command, result);\n\t\t},\n\t\trm: async (path: string, rmOptions?: { recursive?: boolean; force?: boolean }) => {\n\t\t\tif (rmOptions?.force && !(await filesystem.exists(path))) return;\n\t\t\ttry {\n\t\t\t\tawait sandbox.fs.deleteFile(path, rmOptions?.recursive);\n\t\t\t} catch (cause) {\n\t\t\t\tif (rmOptions?.force && !(await filesystem.exists(path))) return;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t},\n\t\trealpath: async (path: string) => {\n\t\t\tconst run = async (script: string) => {\n\t\t\t\tconst command = quoteArgv([\"sh\", \"-c\", script, \"_\", path]);\n\t\t\t\tconst result = await sandbox.process.executeCommand(command, options.cwd, undefined, options.execTimeout);\n\t\t\t\treturn { command, result };\n\t\t\t};\n\t\t\tconst asDirectory = await run(SandboxFileSystem.realpathScripts[0]);\n\t\t\tif (asDirectory.result.exitCode === 0) return (asDirectory.result.result ?? \"\").trimEnd();\n\t\t\tconst asFile = await run(SandboxFileSystem.realpathScripts[1]);\n\t\t\tassertCommandSucceeded(asFile.command, asFile.result);\n\t\t\treturn (asFile.result.result ?? \"\").trimEnd();\n\t\t},\n\t};\n\n\treturn filesystem;\n};\n\n// Daytona's execute API folds stderr into `result` and reports a single exit\n// code, so the shell surfaces the combined output as stdout and leaves stderr\n// empty rather than inventing a split.\nconst runCommand = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\tcommand: string,\n\topts?: { env?: Record<string, string>; cwd?: string },\n) =>\n\tEffect.tryPromise({\n\t\ttry: () =>\n\t\t\tsandbox.process.executeCommand(command, resolveCwd(options.cwd, opts?.cwd), opts?.env, options.execTimeout),\n\t\tcatch: (cause) => new ShellError({ command, cause }),\n\t}).pipe(Effect.map((response) => ({ stdout: response.result ?? \"\", stderr: \"\", exitCode: response.exitCode })));\n\nconst exec =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"exec\"] =>\n\t(command, opts) =>\n\t\trunCommand(sandbox, options, command, opts);\n\n// `executeCommand` takes a single string, so the vector is quoted here rather\n// than spawned; the per-call cwd rides the toolbox's own cwd argument instead\n// of a `cd` prefix.\nconst execArgv =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"execArgv\"] =>\n\t(argv, opts) =>\n\t\trunCommand(sandbox, options, quoteArgv(argv), opts);\n\nconst filesystemLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxFileSystem.Service,\n\t\tEffect.map(Remote, ({ sandbox, cwd }) => {\n\t\t\tconst mounted = { ...options, cwd };\n\t\t\treturn SandboxFileSystem.fromProvider(RemoteFileSystem.make(providerFrom(sandbox, mounted), { cwd }));\n\t\t}),\n\t);\n\nconst shellLayer = (options: Options) =>\n\tLayer.effect(\n\t\tShell,\n\t\tEffect.map(Remote, ({ sandbox, cwd }) => {\n\t\t\tconst mounted = { ...options, cwd };\n\t\t\treturn Shell.of({ exec: exec(sandbox, mounted), execArgv: execArgv(sandbox, mounted) });\n\t\t}),\n\t);\n\n/**\n * Cwd-neutral IO attachment for a lifecycle driver.\n *\n * Mount wrappers supply an absolute cwd to every public operation. Internal\n * filesystem helper commands already receive absolute paths, so the transport\n * itself keeps no mutable working-directory state and owns no resource\n * finalizer.\n */\nexport const transport = (\n\tsandbox: RemoteSandbox,\n\toptions: Pick<Options, \"execTimeout\"> = {},\n): Layer.Layer<SandboxFileSystem.Service | Shell> =>\n\tLayer.merge(\n\t\tLayer.succeed(\n\t\t\tSandboxFileSystem.Service,\n\t\t\tSandboxFileSystem.fromProvider(RemoteFileSystem.make(providerFrom(sandbox, options))),\n\t\t),\n\t\tLayer.succeed(\n\t\t\tShell,\n\t\t\tShell.of({\n\t\t\t\texec: exec(sandbox, options),\n\t\t\t\texecArgv: execArgv(sandbox, options),\n\t\t\t}),\n\t\t),\n\t);\n\n// Daytona's locator is the sandbox id. See `SandboxResource` for why this is a\n// shared tag rather than a Daytona-specific one.\nconst resourceLayer = Layer.effect(\n\tSandboxResource.Service,\n\tEffect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.id })),\n);\n\n// Identity is per remote sandbox, not per provider: two sandboxes both rooted at\n// the same directory must not share persisted directory records.\n//\n// The id is minted here only when the caller names none. A durable id is the\n// control plane's to mint and record — deriving one from the provider's own\n// locator is what §6.1 forbids — so a caller that needs the namespace to survive\n// a restart passes `instanceId` rather than relying on this.\nconst identityLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxIO.Current,\n\t\tEffect.map(Remote, ({ cwd }) =>\n\t\t\tSandboxIO.remote({\n\t\t\t\tdriver: \"daytona\",\n\t\t\t\tid: options.instanceId ?? SandboxInstance.ID.create(),\n\t\t\t\tdefaultCwd: cwd,\n\t\t\t}),\n\t\t),\n\t);\n\n/**\n * A Daytona sandbox provides the runtime filesystem service directly plus\n * the sandbox's native remote shell. It intentionally does not provide VFS:\n * remote filesystems have no synchronous filesystem surface.\n */\nexport const layer = (options: Options = {}): Layer.Layer<SandboxIO.Provides | SandboxResource.Service, DaytonaError> =>\n\tLayer.mergeAll(filesystemLayer(options), shellLayer(options), identityLayer(options), resourceLayer).pipe(\n\t\tLayer.provide(remote(options)),\n\t);\n\nexport const services = layer;\n","import { Effect, Layer, Option, Schema } from \"effect\";\nimport { SandboxDriver, SandboxInstance, SandboxProvider } from \"../../sandbox.ts\";\nimport * as EnvDaytona from \"./provider.ts\";\n\nexport const Options = Schema.Struct({\n\tapiKey: Schema.optional(Schema.String),\n\tapiUrl: Schema.optional(Schema.String),\n\ttarget: Schema.optional(Schema.String),\n});\nexport type Options = typeof Options.Type;\nexport const ClientOptions = Options;\nexport type ClientOptions = Options;\n\nexport const ResourcesConfig = Schema.Struct({\n\tcpu: Schema.optional(Schema.Finite),\n\tgpu: Schema.optional(Schema.Finite),\n\tmemory: Schema.optional(Schema.Finite),\n\tdisk: Schema.optional(Schema.Finite),\n});\nexport type ResourcesConfig = typeof ResourcesConfig.Type;\n\nexport const CreateConfig = Schema.Struct({\n\tsnapshot: Schema.optional(Schema.String),\n\timage: Schema.optional(Schema.String),\n\tlanguage: Schema.optional(Schema.String),\n\tenvVars: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n\tresources: Schema.optional(ResourcesConfig),\n\tuser: Schema.optional(Schema.String),\n\tcwd: Schema.optional(Schema.String),\n\tautoStopInterval: Schema.optional(Schema.Finite),\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type CreateConfig = typeof CreateConfig.Type;\n\nexport const RuntimeConfig = Schema.Struct({\n\tdefaultCwd: SandboxDriver.AbsolutePath,\n\tuser: Schema.optional(Schema.String),\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type RuntimeConfig = typeof RuntimeConfig.Type;\n\nconst name = SandboxDriver.Name.make(\"daytona\");\ntype DaytonaSdk = typeof import(\"@daytona/sdk\");\ntype RemoteSandbox = import(\"@daytona/sdk\").Sandbox;\ntype Resources = import(\"@daytona/sdk\").Resources;\n\nconst statusFrom = (\n\tstate: RemoteSandbox[\"state\"],\n): {\n\treadonly status: SandboxInstance.Status;\n\treadonly providerStatus: string;\n} => {\n\tconst providerStatus = state ?? \"unknown\";\n\treturn {\n\t\tstatus:\n\t\t\tstate === \"stopped\" || state === \"archived\"\n\t\t\t\t? \"offline\"\n\t\t\t\t: state === \"stopping\" || state === \"archiving\" || state === \"snapshotting\" || state === \"destroying\"\n\t\t\t\t\t? \"suspending\"\n\t\t\t\t\t: state === \"destroyed\"\n\t\t\t\t\t\t? \"unavail\"\n\t\t\t\t\t\t: state === \"error\" || state === \"build_failed\" || state === \"unknown\"\n\t\t\t\t\t\t\t? \"faulted\"\n\t\t\t\t\t\t\t: \"online\",\n\t\tproviderStatus,\n\t};\n};\n\nconst shouldWake = (sandbox: RemoteSandbox): boolean => sandbox.state === \"stopped\" || sandbox.state === \"archived\";\n\nexport const make = (\n\tclient: ClientOptions = {},\n): SandboxDriver.Driver<CreateConfig, RuntimeConfig> & SandboxDriver.Registration => {\n\tconst redact = SandboxProvider.makeRedactor([client.apiKey ?? \"\"]);\n\tconst daytona = (sdk: DaytonaSdk) =>\n\t\tnew sdk.Daytona({\n\t\t\t...(client.apiKey === undefined ? {} : { apiKey: client.apiKey }),\n\t\t\t...(client.apiUrl === undefined ? {} : { apiUrl: client.apiUrl }),\n\t\t\t...(client.target === undefined ? {} : { target: client.target }),\n\t\t});\n\n\tconst attempt = <A>(\n\t\toperation: string,\n\t\trun: (sdk: DaytonaSdk) => Promise<A>,\n\t): Effect.Effect<A, SandboxProvider.SandboxProviderError> =>\n\t\tEffect.suspend(() => {\n\t\t\tlet sdk: DaytonaSdk | undefined;\n\t\t\treturn Effect.tryPromise({\n\t\t\t\ttry: () =>\n\t\t\t\t\timport(\"@daytona/sdk\").then((loaded) => {\n\t\t\t\t\t\tsdk = loaded;\n\t\t\t\t\t\treturn run(loaded);\n\t\t\t\t\t}),\n\t\t\t\tcatch: (cause) =>\n\t\t\t\t\tSandboxProvider.providerError({\n\t\t\t\t\t\tdriver: name,\n\t\t\t\t\t\toperation,\n\t\t\t\t\t\tcause,\n\t\t\t\t\t\tredact,\n\t\t\t\t\t\tnotFound: sdk !== undefined && cause instanceof sdk.DaytonaNotFoundError,\n\t\t\t\t\t}),\n\t\t\t});\n\t\t});\n\n\tconst get = (providerResourceId: string, operation: string) =>\n\t\tattempt(operation, (sdk) => daytona(sdk).get(providerResourceId));\n\n\tconst refresh = (sandbox: RemoteSandbox, operation: string) =>\n\t\tattempt(operation, () => sandbox.refreshData()).pipe(Effect.as(sandbox));\n\n\tconst observed = (sandbox: RemoteSandbox): SandboxDriver.Observed => ({\n\t\t...statusFrom(sandbox.state),\n\t\tmetadata: {\n\t\t\ttarget: sandbox.target,\n\t\t},\n\t});\n\n\tconst wake = (sandbox: RemoteSandbox, operation: string) =>\n\t\tshouldWake(sandbox)\n\t\t\t? attempt(operation, () => sandbox.start()).pipe(Effect.map(() => sandbox))\n\t\t\t: Effect.succeed(sandbox);\n\n\tconst runtime = (\n\t\tdefaultCwd: string,\n\t\tinput: { readonly user?: string | undefined; readonly execTimeout?: number | undefined },\n\t) => ({\n\t\tdefaultCwd: SandboxDriver.AbsolutePath.make(defaultCwd),\n\t\t...(input.user === undefined ? {} : { user: input.user }),\n\t\t...(input.execTimeout === undefined ? {} : { execTimeout: input.execTimeout }),\n\t});\n\n\treturn SandboxDriver.driver({\n\t\tname,\n\t\tkind: \"remote\",\n\t\tcapabilities: {\n\t\t\tinspect: true,\n\t\t\treattach: true,\n\t\t\twake: true,\n\t\t\tstop: true,\n\t\t\tdestroy: true,\n\t\t\t// Installed SDK 0.187.0 has no cancellation signal on\n\t\t\t// executeCommand; session execution cannot carry cwd/env safely.\n\t\t\tcancels: false,\n\t\t},\n\t\tcreateConfigCodec: CreateConfig,\n\t\truntimeConfigCodec: RuntimeConfig,\n\t\tcreate: ({ instanceId, config }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst base = {\n\t\t\t\t\tlanguage: config.language ?? \"typescript\",\n\t\t\t\t\t...(config.envVars === undefined ? {} : { envVars: config.envVars }),\n\t\t\t\t\t...(config.user === undefined ? {} : { user: config.user }),\n\t\t\t\t\t...(config.autoStopInterval === undefined ? {} : { autoStopInterval: config.autoStopInterval }),\n\t\t\t\t\tautoDeleteInterval: -1,\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\t\"codework-instance\": instanceId,\n\t\t\t\t\t\t\"codework-managed\": \"true\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst sandbox = yield* attempt(\"create\", (loaded) => {\n\t\t\t\t\tconst sdk = daytona(loaded);\n\t\t\t\t\treturn config.image === undefined\n\t\t\t\t\t\t? sdk.create({ ...base, ...(config.snapshot === undefined ? {} : { snapshot: config.snapshot }) })\n\t\t\t\t\t\t: sdk.create({\n\t\t\t\t\t\t\t\t...base,\n\t\t\t\t\t\t\t\timage: config.image,\n\t\t\t\t\t\t\t\t...(config.resources === undefined ? {} : { resources: config.resources as Resources }),\n\t\t\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tconst defaultCwd = yield* attempt(\"create.cwd\", () =>\n\t\t\t\t\tEnvDaytona.mountCwd(config.cwd, () => sandbox.getWorkDir()),\n\t\t\t\t);\n\t\t\t\tconst state = statusFrom(sandbox.state);\n\t\t\t\treturn {\n\t\t\t\t\tproviderResourceId: sandbox.id,\n\t\t\t\t\tproviderStatus: state.providerStatus,\n\t\t\t\t\truntimeConfig: runtime(defaultCwd, config),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\ttarget: sandbox.target,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\truntimeConfigFor: ({ providerResourceId, overrides }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst sandbox = yield* get(providerResourceId, \"runtimeConfigFor\");\n\t\t\t\tconst defaultCwd =\n\t\t\t\t\toverrides?.defaultCwd ??\n\t\t\t\t\tSandboxDriver.AbsolutePath.make(\n\t\t\t\t\t\tyield* attempt(\"runtimeConfigFor.cwd\", () =>\n\t\t\t\t\t\t\tEnvDaytona.mountCwd(undefined, () => sandbox.getWorkDir()),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tdefaultCwd,\n\t\t\t\t\t...(overrides?.user === undefined ? { user: sandbox.user } : { user: overrides.user }),\n\t\t\t\t\t...(overrides?.execTimeout === undefined ? {} : { execTimeout: overrides.execTimeout }),\n\t\t\t\t};\n\t\t\t}),\n\t\tattach: (input) =>\n\t\t\tLayer.unwrap(\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst sandbox = yield* get(\n\t\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\t\"attach\",\n\t\t\t\t\t);\n\t\t\t\t\tyield* wake(sandbox, \"attach.wake\");\n\t\t\t\t\treturn EnvDaytona.transport(\n\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\tinput.runtimeConfig.execTimeout === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: { execTimeout: input.runtimeConfig.execTimeout },\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t),\n\t\tinspect: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\"inspect\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => Effect.map(refresh(sandbox, \"inspect.refresh\"), observed),\n\t\t\t),\n\t\twake: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\"wake\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => Effect.map(wake(sandbox, \"wake.start\"), observed),\n\t\t\t),\n\t\tstop: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\"stop\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"stop\", () => sandbox.stop()).pipe(Effect.map(() => observed(sandbox))),\n\t\t\t),\n\t\tdestroy: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\"destroy\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"destroy\", () => sandbox.delete()),\n\t\t\t),\n\t});\n};\n\nconst sandbox = SandboxDriver.module({\n\tapiVersion: SandboxDriver.apiVersion,\n\tname,\n\toptions: Options,\n\tmake,\n});\n\nexport const config = (value: CreateConfig) => ({ driver: \"daytona\" as const, config: value });\n\nexport default sandbox;\n"],"mappings":";;;;AAaA,MAAM,eAAe,MAAc,YAAsB;CACxD,MAAM,aAAa,MAAM,UAAU,IAAI;CACvC,IAAI,SAAS,QAAQ,KAAA,KAAa,MAAM,WAAW,UAAU,GAAG,OAAO;CACvE,OAAO,MAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,UAAU,CAAC;AAC3D;;AAGA,MAAaA,UAAQ,UAAqB,YAAkD;CAC3F,MAAM,WAAW,SAAiB,YAAY,MAAM,OAAO;CAE3D,OAAO;EACN,WAAW,SAAS,SAAS,SAAS,QAAQ,IAAI,CAAC;EACnD,iBAAiB,SAAS,SAAS,eAAe,QAAQ,IAAI,CAAC;EAC/D,YAAY,MAAM,YAAY,SAAS,UAAU,QAAQ,IAAI,GAAG,OAAO;EACvE,OAAO,SAAS,SAAS,KAAK,QAAQ,IAAI,CAAC;EAC3C,GAAI,SAAS,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,SAAiB,SAAS,MAAO,QAAQ,IAAI,CAAC,EAAE;EAClG,UAAU,SAAS,SAAS,QAAQ,QAAQ,IAAI,CAAC;EACjD,SAAS,SAAS,SAAS,OAAO,QAAQ,IAAI,CAAC;EAC/C,QAAQ,MAAM,iBAAiB,SAAS,MAAM,QAAQ,IAAI,GAAG,YAAY;EACzE,KAAK,MAAM,cAAc,SAAS,GAAG,QAAQ,IAAI,GAAG,SAAS;EAC7D,WAAW,SAAS,SAAS,SAAS,QAAQ,IAAI,CAAC;CACpD;AACD;;;;ACfA,MAAa,cAAc;;;;;;;;;;;;;AAc3B,MAAa,WAAW,OACvB,KACA,eACqB;CACrB,MAAM,aAAa,MAAM,WAAW,OAAO,EAAE,IAAI,cAAgB,MAAM,WAAW,KAAA;CAClF,OAAOC,gBAA0B,YAAY,GAAG;AACjD;AAEkC,OAAO,YAA0B,CAAC,CAAC,gBAAgB,EACpF,WAAWC,eACZ,CAAC;AAyCD,IAAM,SAAN,cAAqB,QAAQ,QAA6B,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC;AAEtH,MAAM,0BAA0B,SAAiB,WAAkD;CAClG,IAAI,OAAO,aAAa,GAAG,MAAM,IAAI,MAAM,OAAO,UAAU,mBAAmB,OAAO,SAAS,KAAK,SAAS;AAC9G;AAEA,MAAM,YAAY,UAA8B;CAC/C,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,OAAO,OAAO,eAAe,SAAS,KAAK,KAAK,CAAC,CAAC,KAAK,OAAO,IAAI,SAAS,SAAS,CAAC,CAAC;AACvF;AA0CA,MAAa,aAAa,SAA8C;CACvE,MAAM,UAAU,KAAK,SAAS,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK,WAAW,GAAG;CAC9E,MAAM,QAAQ,SAAS,KAAK,cAAc,KAAK,OAAO;CAGtD,OAAO;EACN,QAAQ,CAAC,KAAK,SAAS,YAAY;EACnC,aAAa,KAAK;EAClB,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,QAAQ;EAC3D,GAAI,KAAK,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK;EACrD,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;CACxC;AACD;AAOA,MAAM,gBAAgB,SAAwB,YAAqB;CAClE,MAAM,aAAuC;EAC5C,UAAU,OAAO,UAAkB,MAAM,QAAQ,GAAG,aAAa,IAAI,EAAA,CAAG,SAAS,MAAM;EACvF,gBAAgB,OAAO,SAAiB,IAAI,WAAW,MAAM,QAAQ,GAAG,aAAa,IAAI,CAAC;EAC1F,YAAY,MAAc,YACzB,QAAQ,GAAG,WAAW,OAAO,YAAY,WAAW,OAAO,KAAK,SAAS,MAAM,IAAI,OAAO,KAAK,OAAO,GAAG,IAAI;EAC9G,MAAM,OAAO,SAAiB,UAAU,MAAM,QAAQ,GAAG,eAAe,IAAI,CAAC;EAI7E,OAAO,OAAO,SAAiB;GAC9B,MAAM,UAAU,WAAW,MAAM,IAAI;GACrC,MAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe,SAAS,QAAQ,KAAK,KAAA,GAAW,QAAQ,WAAW;GACxG,IAAI,OAAO,aAAa,GACvB,OAAO;IAAE,QAAQ;IAAO,aAAa;IAAO,gBAAgB;GAAK;GAElE,IAAI,OAAO,aAAa,GAAG,OAAO,UAAU,MAAM,QAAQ,GAAG,eAAe,IAAI,CAAC;GACjF,uBAAuB,SAAS,MAAM;GACtC,MAAM,IAAI,MAAM,gCAAgC,MAAM;EACvD;EACA,SAAS,OAAO,UAAkB,MAAM,QAAQ,GAAG,UAAU,IAAI,EAAA,CAAG,KAAK,UAAU,MAAM,IAAI;EAI7F,QAAQ,OAAO,SAAiB;GAC/B,IAAI;IACH,MAAM,QAAQ,GAAG,eAAe,IAAI;IACpC,OAAO;GACR,SAAS,OAAO;IACf,MAAM,EAAE,yBAAyB,MAAM,OAAO;IAC9C,IAAI,iBAAiB,sBAAsB,OAAO;IAClD,MAAM;GACP;EACD;EACA,OAAO,OAAO,MAAc,iBAA2C;GACtE,IAAI,CAAC,cAAc,WAAW;IAC7B,MAAM,QAAQ,GAAG,aAAa,MAAM,KAAK;IACzC;GACD;GAEA,MAAM,UAAU,YAAY,MAAM,IAAI;GACtC,MAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe,SAAS,QAAQ,KAAK,KAAA,GAAW,QAAQ,WAAW;GACxG,uBAAuB,SAAS,MAAM;EACvC;EACA,IAAI,OAAO,MAAc,cAAyD;GACjF,IAAI,WAAW,SAAS,CAAE,MAAM,WAAW,OAAO,IAAI,GAAI;GAC1D,IAAI;IACH,MAAM,QAAQ,GAAG,WAAW,MAAM,WAAW,SAAS;GACvD,SAAS,OAAO;IACf,IAAI,WAAW,SAAS,CAAE,MAAM,WAAW,OAAO,IAAI,GAAI;IAC1D,MAAM;GACP;EACD;EACA,UAAU,OAAO,SAAiB;GACjC,MAAM,MAAM,OAAO,WAAmB;IACrC,MAAM,UAAU,UAAU;KAAC;KAAM;KAAM;KAAQ;KAAK;IAAI,CAAC;IAEzD,OAAO;KAAE;KAAS,QAAA,MADG,QAAQ,QAAQ,eAAe,SAAS,QAAQ,KAAK,KAAA,GAAW,QAAQ,WAAW;IAC/E;GAC1B;GACA,MAAM,cAAc,MAAM,IAAIC,gBAAkC,EAAE;GAClE,IAAI,YAAY,OAAO,aAAa,GAAG,QAAQ,YAAY,OAAO,UAAU,GAAA,CAAI,QAAQ;GACxF,MAAM,SAAS,MAAM,IAAIA,gBAAkC,EAAE;GAC7D,uBAAuB,OAAO,SAAS,OAAO,MAAM;GACpD,QAAQ,OAAO,OAAO,UAAU,GAAA,CAAI,QAAQ;EAC7C;CACD;CAEA,OAAO;AACR;AAKA,MAAM,cACL,SACA,SACA,SACA,SAEA,OAAO,WAAW;CACjB,WACC,QAAQ,QAAQ,eAAe,SAAS,WAAW,QAAQ,KAAK,MAAM,GAAG,GAAG,MAAM,KAAK,QAAQ,WAAW;CAC3G,QAAQ,UAAU,IAAI,WAAW;EAAE;EAAS;CAAM,CAAC;AACpD,CAAC,CAAC,CAAC,KAAK,OAAO,KAAK,cAAc;CAAE,QAAQ,SAAS,UAAU;CAAI,QAAQ;CAAI,UAAU,SAAS;AAAS,EAAE,CAAC;AAE/G,MAAM,QACJ,SAAwB,aACxB,SAAS,SACT,WAAW,SAAS,SAAS,SAAS,IAAI;AAK5C,MAAM,YACJ,SAAwB,aACxB,MAAM,SACN,WAAW,SAAS,SAAS,UAAU,IAAI,GAAG,IAAI;;;;;;;;;AA4BpD,MAAa,aACZ,SACA,UAAwC,CAAC,MAEzC,MAAM,MACL,MAAM,QACLC,SACAC,aAA+BC,OAAsB,aAAa,SAAS,OAAO,CAAC,CAAC,CACrF,GACA,MAAM,QACL,OACA,MAAM,GAAG;CACR,MAAM,KAAK,SAAS,OAAO;CAC3B,UAAU,SAAS,SAAS,OAAO;AACpC,CAAC,CACF,CACD;AAIqB,MAAM,OAC3BC,WACA,OAAO,IAAI,SAAS,EAAE,eAAe,EAAE,oBAAoB,QAAQ,GAAG,EAAE,CACzE;;;AC1SA,MAAa,UAAU,OAAO,OAAO;CACpC,QAAQ,OAAO,SAAS,OAAO,MAAM;CACrC,QAAQ,OAAO,SAAS,OAAO,MAAM;CACrC,QAAQ,OAAO,SAAS,OAAO,MAAM;AACtC,CAAC;AAED,MAAa,gBAAgB;AAG7B,MAAa,kBAAkB,OAAO,OAAO;CAC5C,KAAK,OAAO,SAAS,OAAO,MAAM;CAClC,KAAK,OAAO,SAAS,OAAO,MAAM;CAClC,QAAQ,OAAO,SAAS,OAAO,MAAM;CACrC,MAAM,OAAO,SAAS,OAAO,MAAM;AACpC,CAAC;AAGD,MAAa,eAAe,OAAO,OAAO;CACzC,UAAU,OAAO,SAAS,OAAO,MAAM;CACvC,OAAO,OAAO,SAAS,OAAO,MAAM;CACpC,UAAU,OAAO,SAAS,OAAO,MAAM;CACvC,SAAS,OAAO,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,MAAM,CAAC;CACpE,WAAW,OAAO,SAAS,eAAe;CAC1C,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,KAAK,OAAO,SAAS,OAAO,MAAM;CAClC,kBAAkB,OAAO,SAAS,OAAO,MAAM;CAC/C,aAAa,OAAO,SAAS,OAAO,MAAM;AAC3C,CAAC;AAGD,MAAa,gBAAgB,OAAO,OAAO;CAC1C,YAAYC;CACZ,MAAM,OAAO,SAAS,OAAO,MAAM;CACnC,aAAa,OAAO,SAAS,OAAO,MAAM;AAC3C,CAAC;AAGD,MAAM,OAAA,KAA0B,KAAK,SAAS;AAK9C,MAAM,cACL,UAII;CAEJ,OAAO;EACN,QACC,UAAU,aAAa,UAAU,aAC9B,YACA,UAAU,cAAc,UAAU,eAAe,UAAU,kBAAkB,UAAU,eACtF,eACA,UAAU,cACT,YACA,UAAU,WAAW,UAAU,kBAAkB,UAAU,YAC1D,YACA;EACP,gBAZsB,SAAS;CAahC;AACD;AAEA,MAAM,cAAc,YAAoC,QAAQ,UAAU,aAAa,QAAQ,UAAU;AAEzG,MAAa,QACZ,SAAwB,CAAC,MAC2D;CACpF,MAAM,SAASC,aAA6B,CAAC,OAAO,UAAU,EAAE,CAAC;CACjE,MAAM,WAAW,QAChB,IAAI,IAAI,QAAQ;EACf,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;EAC/D,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;EAC/D,GAAI,OAAO,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;CAChE,CAAC;CAEF,MAAM,WACL,WACA,QAEA,OAAO,cAAc;EACpB,IAAI;EACJ,OAAO,OAAO,WAAW;GACxB,WACC,OAAO,eAAe,CAAC,MAAM,WAAW;IACvC,MAAM;IACN,OAAO,IAAI,MAAM;GAClB,CAAC;GACF,QAAQ,UACPC,cAA8B;IAC7B,QAAQ;IACR;IACA;IACA;IACA,UAAU,QAAQ,KAAA,KAAa,iBAAiB,IAAI;GACrD,CAAC;EACH,CAAC;CACF,CAAC;CAEF,MAAM,OAAO,oBAA4B,cACxC,QAAQ,YAAY,QAAQ,QAAQ,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC;CAEjE,MAAM,WAAW,SAAwB,cACxC,QAAQ,iBAAiB,QAAQ,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC;CAExE,MAAM,YAAY,aAAoD;EACrE,GAAG,WAAW,QAAQ,KAAK;EAC3B,UAAU,EACT,QAAQ,QAAQ,OACjB;CACD;CAEA,MAAM,QAAQ,SAAwB,cACrC,WAAW,OAAO,IACf,QAAQ,iBAAiB,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,UAAU,OAAO,CAAC,IACxE,OAAO,QAAQ,OAAO;CAE1B,MAAM,WACL,YACA,WACK;EACL,YAAA,aAAuC,KAAK,UAAU;EACtD,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;EACvD,GAAI,MAAM,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,MAAM,YAAY;CAC7E;CAEA,OAAOC,OAAqB;EAC3B;EACA,MAAM;EACN,cAAc;GACb,SAAS;GACT,UAAU;GACV,MAAM;GACN,MAAM;GACN,SAAS;GAGT,SAAS;EACV;EACA,mBAAmB;EACnB,oBAAoB;EACpB,SAAS,EAAE,YAAY,aACtB,OAAO,IAAI,aAAa;GACvB,MAAM,OAAO;IACZ,UAAU,OAAO,YAAY;IAC7B,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;IAClE,GAAI,OAAO,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK;IACzD,GAAI,OAAO,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,OAAO,iBAAiB;IAC7F,oBAAoB;IACpB,QAAQ;KACP,qBAAqB;KACrB,oBAAoB;IACrB;GACD;GACA,MAAM,UAAU,OAAO,QAAQ,WAAW,WAAW;IACpD,MAAM,MAAM,QAAQ,MAAM;IAC1B,OAAO,OAAO,UAAU,KAAA,IACrB,IAAI,OAAO;KAAE,GAAG;KAAM,GAAI,OAAO,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;IAAG,CAAC,IAC/F,IAAI,OAAO;KACX,GAAG;KACH,OAAO,OAAO;KACd,GAAI,OAAO,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAuB;IACtF,CAAC;GACJ,CAAC;GACD,MAAM,aAAa,OAAO,QAAQ,oBACjCC,SAAoB,OAAO,WAAW,QAAQ,WAAW,CAAC,CAC3D;GACA,MAAM,QAAQ,WAAW,QAAQ,KAAK;GACtC,OAAO;IACN,oBAAoB,QAAQ;IAC5B,gBAAgB,MAAM;IACtB,eAAe,QAAQ,YAAY,MAAM;IACzC,UAAU,EACT,QAAQ,QAAQ,OACjB;GACD;EACD,CAAC;EACF,mBAAmB,EAAE,oBAAoB,gBACxC,OAAO,IAAI,aAAa;GACvB,MAAM,UAAU,OAAO,IAAI,oBAAoB,kBAAkB;GAQjE,OAAO;IACN,YAPA,WAAW,cAAA,aACgB,KAC1B,OAAO,QAAQ,8BACdA,SAAoB,KAAA,SAAiB,QAAQ,WAAW,CAAC,CAC1D,CACD;IAGA,GAAI,WAAW,SAAS,KAAA,IAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,EAAE,MAAM,UAAU,KAAK;IACpF,GAAI,WAAW,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,UAAU,YAAY;GACtF;EACD,CAAC;EACF,SAAS,UACR,MAAM,OACL,OAAO,IAAI,aAAa;GACvB,MAAM,UAAU,OAAO,IACtB,OAAO,UAAU,MAAM,0BAA0B,MAAM,EAAE,GACzD,QACD;GACA,OAAO,KAAK,SAAS,aAAa;GAClC,OAAOC,UACN,SACA,MAAM,cAAc,gBAAgB,KAAA,IACjC,KAAA,IACA,EAAE,aAAa,MAAM,cAAc,YAAY,CACnD;EACD,CAAC,CACF;EACD,UAAU,UACT,OAAO,QACN,IACC,OAAO,UAAU,MAAM,0BAA0B,MAAM,EAAE,GACzD,SACD,IACC,YAAY,OAAO,IAAI,QAAQ,SAAS,iBAAiB,GAAG,QAAQ,CACtE;EACD,OAAO,UACN,OAAO,QACN,IACC,OAAO,UAAU,MAAM,0BAA0B,MAAM,EAAE,GACzD,MACD,IACC,YAAY,OAAO,IAAI,KAAK,SAAS,YAAY,GAAG,QAAQ,CAC9D;EACD,OAAO,UACN,OAAO,QACN,IACC,OAAO,UAAU,MAAM,0BAA0B,MAAM,EAAE,GACzD,MACD,IACC,YAAY,QAAQ,cAAc,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,UAAU,SAAS,OAAO,CAAC,CAAC,CAC5F;EACD,UAAU,UACT,OAAO,QACN,IACC,OAAO,UAAU,MAAM,0BAA0B,MAAM,EAAE,GACzD,SACD,IACC,YAAY,QAAQ,iBAAiB,QAAQ,OAAO,CAAC,CACvD;CACF,CAAC;AACF;AAEA,MAAM,UAAUC,aAAqB;CACpC,YAAY;CACZ;CACA,SAAS;CACT;AACD,CAAC;AAED,MAAa,UAAU,WAAyB;CAAE,QAAQ;CAAoB,QAAQ;AAAM"}
|