@codeworksh/harness 0.0.1-dev.20260917115353 → 0.0.1-dev.20260922135939

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 CHANGED
@@ -17,7 +17,12 @@ The initial public surface is the Effect SDK at `@codeworksh/harness/effect`.
17
17
 
18
18
  ## Plugins
19
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.
20
+ Third-party plugins build against [`@codeworksh/plugin`](../plugin/README.md), the published SDK
21
+ that owns the plugin, tool and sandbox contract this package consumes — a plugin package depends
22
+ on it rather than on the whole harness. The same types are re-exported here as `Plugin` and `Tool`
23
+ for embedders who already hold the harness.
24
+
25
+ Pass a plugin list when constructing the harness. Each plugin declares an ID and the domain it extends — `tool` or `prompt` — and contributes during setup. Setup runs once per exchange, after model resolution; its tools, hooks, and prompt remain pinned through tool continuations.
21
26
 
22
27
  ```ts
23
28
  import { Effect, Schema } from "effect";
@@ -25,6 +30,7 @@ import { Harness, Plugin, Tool } from "@codeworksh/harness/effect";
25
30
 
26
31
  const echo = Plugin.define({
27
32
  id: "acme.tool.echo",
33
+ kind: "tool",
28
34
  setup(ctx) {
29
35
  ctx.plugin.tools.add(
30
36
  Tool.register(
@@ -53,6 +59,7 @@ const echo = Plugin.define({
53
59
  // A prompt plugin renders the system prompt, and indexes every tool registered before it.
54
60
  const prompt = Plugin.define({
55
61
  id: "acme.prompt.main",
62
+ kind: "prompt",
56
63
  setup(ctx) {
57
64
  ctx.plugin.prompt.set(
58
65
  `You have: ${ctx.plugin.tools
@@ -70,7 +77,7 @@ const runtime = Harness.layer({ plugins: [echo, prompt] });
70
77
 
71
78
  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
79
 
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.
80
+ `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 tool it patches is indexed. Declaring `kind: "tool"` puts it ahead of every prompt plugin already; what it still has to get right is its position among the other tool plugins, which is the order their entries are written in.
74
81
 
75
82
  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
83
 
@@ -118,7 +125,7 @@ Source modules must default-export one plugin object.
118
125
  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
126
 
120
127
  ```jsonc
121
- // codework.json, ~/.codework/settings.json, or a --user-config-dir
128
+ // <project>/.codework/settings.jsonc, ~/.codework/settings.jsonc, or a --user-config-dir
122
129
  {
123
130
  "plugins": [
124
131
  "@acme/codework-prompt-life",
@@ -130,9 +137,20 @@ Settings entries take the same two forms, and they extend the built-in selection
130
137
  }
131
138
  ```
132
139
 
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.
140
+ Settings files are JSONC: comments and a trailing comma are part of the format, and a syntax error names what the parser expected and where (`PropertyNameExpected at 2:38`). Entries accumulate across settings layers, lowest priority first: a project's list extends the user's rather than standing in for it, the way every other key in the document merges. A project drops an inherited plugin the same way it drops a built-in, with `{ "plugin": "<id>", "enabled": false }`. A leading `~` expands to the home directory. A `./` or `../` path resolves against the directory of the file that declared it — inside `<project>/.codework/`, or beside `~/.codework/settings.jsonc` — 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.
141
+
142
+ Setup order comes from the **domain a plugin declares**, not from where its entry sits. Every `kind: "tool"` plugin is set up before any `kind: "prompt"` plugin, so a prompt plugin always sees the complete tool set — including tools added from a settings file, which land after the built-ins in the array. Within one domain, entries keep the order they were written in, which is where composition actually happens: a plugin patching another's tool, or appending to the prompt a previous one rendered, is written after it on purpose.
143
+
144
+ That is the reason `kind` is part of the definition rather than something the harness guesses. A user's settings file and a project's are edited by different people at different times, and neither can see the other's ordering; what each plugin _is_ remains knowable in both.
145
+
146
+ A plugin package declares `@codeworksh/harness` and `effect` as **exact peer dependencies**, never as dependencies:
147
+
148
+ ```jsonc
149
+ "peerDependencies": { "@codeworksh/harness": "0.0.1", "effect": "4.0.0-rc.115" },
150
+ "devDependencies": { "effect": "4.0.0-rc.115" }
151
+ ```
134
152
 
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.
153
+ A plugin is installed into its own directory, so its Effect is a separate module instance from the harness's. Two instances of the _same_ version interoperate completely service tags resolve by their string id, and schemas, generators and handlers all cross the boundary. Two different _versions_ do not: a tool's schema then encodes a result the harness cannot commit. Declaring the peer moves that from a runtime failure to a line during `npm install`, and `test/plugin.foreign.test.ts` holds the interop itself in place.
136
154
 
137
155
  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
156
 
@@ -1,4 +1,5 @@
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";
1
+ import { a as io_exports, n as shell_exports, o as instance_exports, r as filesystem_exports, s as posix, t as resource_exports } from "./resource-DFZh0e-s.mjs";
2
+ import { SandboxDriver, SandboxProvider } from "./sandbox.mjs";
2
3
  import { Context, DateTime, Effect, Layer, Option, Schema } from "effect";
3
4
  import { Buffer } from "node:buffer";
4
5
  //#region src/sandboxes/daytona/fs.ts
@@ -41,9 +42,9 @@ const DEFAULT_CWD = "/home/daytona";
41
42
  */
42
43
  const mountCwd = async (cwd, getWorkDir) => {
43
44
  const defaultCwd = posix.isAbsolute(cwd ?? "") ? DEFAULT_CWD : await getWorkDir() ?? "/home/daytona";
44
- return resolveMountCwd(defaultCwd, cwd);
45
+ return io_exports.SandboxIO.resolveMountCwd(defaultCwd, cwd);
45
46
  };
46
- Schema.TaggedError()("DaytonaError", { sanitized: PersistedError });
47
+ Schema.TaggedError()("DaytonaError", { sanitized: instance_exports.SandboxInstance.PersistedError });
47
48
  var Remote = class extends Context.Service()("@codeworksh/harness/sandboxes/daytona/provider/Remote") {};
48
49
  const assertCommandSucceeded = (command, result) => {
49
50
  if (result.exitCode !== 0) throw new Error(result.result || `command failed (${result.exitCode}): ${command}`);
@@ -70,7 +71,7 @@ const providerFrom = (sandbox, options) => {
70
71
  writeFile: (path, content) => sandbox.fs.uploadFile(typeof content === "string" ? Buffer.from(content, "utf8") : Buffer.from(content), path),
71
72
  stat: async (path) => statsFrom(await sandbox.fs.getFileDetails(path)),
72
73
  lstat: async (path) => {
73
- const command = `test -L ${quote(path)}`;
74
+ const command = `test -L ${(0, shell_exports.quote)(path)}`;
74
75
  const result = await sandbox.process.executeCommand(command, options.cwd, void 0, options.execTimeout);
75
76
  if (result.exitCode === 0) return {
76
77
  isFile: false,
@@ -97,7 +98,7 @@ const providerFrom = (sandbox, options) => {
97
98
  await sandbox.fs.createFolder(path, "755");
98
99
  return;
99
100
  }
100
- const command = `mkdir -p ${quote(path)}`;
101
+ const command = `mkdir -p ${(0, shell_exports.quote)(path)}`;
101
102
  const result = await sandbox.process.executeCommand(command, options.cwd, void 0, options.execTimeout);
102
103
  assertCommandSucceeded(command, result);
103
104
  },
@@ -112,7 +113,7 @@ const providerFrom = (sandbox, options) => {
112
113
  },
113
114
  realpath: async (path) => {
114
115
  const run = async (script) => {
115
- const command = quoteArgv([
116
+ const command = (0, shell_exports.quoteArgv)([
116
117
  "sh",
117
118
  "-c",
118
119
  script,
@@ -124,9 +125,9 @@ const providerFrom = (sandbox, options) => {
124
125
  result: await sandbox.process.executeCommand(command, options.cwd, void 0, options.execTimeout)
125
126
  };
126
127
  };
127
- const asDirectory = await run(realpathScripts[0]);
128
+ const asDirectory = await run(filesystem_exports.SandboxFileSystem.realpathScripts[0]);
128
129
  if (asDirectory.result.exitCode === 0) return (asDirectory.result.result ?? "").trimEnd();
129
- const asFile = await run(realpathScripts[1]);
130
+ const asFile = await run(filesystem_exports.SandboxFileSystem.realpathScripts[1]);
130
131
  assertCommandSucceeded(asFile.command, asFile.result);
131
132
  return (asFile.result.result ?? "").trimEnd();
132
133
  }
@@ -134,8 +135,8 @@ const providerFrom = (sandbox, options) => {
134
135
  return filesystem;
135
136
  };
136
137
  const runCommand = (sandbox, options, command, opts) => Effect.tryPromise({
137
- try: () => sandbox.process.executeCommand(command, resolveCwd(options.cwd, opts?.cwd), opts?.env, options.execTimeout),
138
- catch: (cause) => new ShellError({
138
+ try: () => sandbox.process.executeCommand(command, (0, shell_exports.resolveCwd)(options.cwd, opts?.cwd), opts?.env, options.execTimeout),
139
+ catch: (cause) => new shell_exports.ShellError({
139
140
  command,
140
141
  cause
141
142
  })
@@ -145,7 +146,7 @@ const runCommand = (sandbox, options, command, opts) => Effect.tryPromise({
145
146
  exitCode: response.exitCode
146
147
  })));
147
148
  const exec = (sandbox, options) => (command, opts) => runCommand(sandbox, options, command, opts);
148
- const execArgv = (sandbox, options) => (argv, opts) => runCommand(sandbox, options, quoteArgv(argv), opts);
149
+ const execArgv = (sandbox, options) => (argv, opts) => runCommand(sandbox, options, (0, shell_exports.quoteArgv)(argv), opts);
149
150
  /**
150
151
  * Cwd-neutral IO attachment for a lifecycle driver.
151
152
  *
@@ -154,11 +155,11 @@ const execArgv = (sandbox, options) => (argv, opts) => runCommand(sandbox, optio
154
155
  * itself keeps no mutable working-directory state and owns no resource
155
156
  * finalizer.
156
157
  */
157
- const transport = (sandbox, options = {}) => Layer.merge(Layer.succeed(Service, fromProvider(make$1(providerFrom(sandbox, options)))), Layer.succeed(Shell, Shell.of({
158
+ const transport = (sandbox, options = {}) => Layer.merge(Layer.succeed(filesystem_exports.SandboxFileSystem.Service, filesystem_exports.SandboxFileSystem.fromProvider(make$1(providerFrom(sandbox, options)))), Layer.succeed(shell_exports.Shell, shell_exports.Shell.of({
158
159
  exec: exec(sandbox, options),
159
160
  execArgv: execArgv(sandbox, options)
160
161
  })));
161
- Layer.effect(Service$1, Effect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.id })));
162
+ Layer.effect(resource_exports.SandboxResource.Service, Effect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.id })));
162
163
  //#endregion
163
164
  //#region src/sandboxes/daytona/index.ts
164
165
  const Options = Schema.Struct({
@@ -185,11 +186,11 @@ const CreateConfig = Schema.Struct({
185
186
  execTimeout: Schema.optional(Schema.Finite)
186
187
  });
187
188
  const RuntimeConfig = Schema.Struct({
188
- defaultCwd: AbsolutePath,
189
+ defaultCwd: SandboxDriver.AbsolutePath,
189
190
  user: Schema.optional(Schema.String),
190
191
  execTimeout: Schema.optional(Schema.Finite)
191
192
  });
192
- const name = Name.make("daytona");
193
+ const name = SandboxDriver.Name.make("daytona");
193
194
  const statusFrom = (state) => {
194
195
  return {
195
196
  status: state === "stopped" || state === "archived" ? "offline" : state === "stopping" || state === "archiving" || state === "snapshotting" || state === "destroying" ? "suspending" : state === "destroyed" ? "unavail" : state === "error" || state === "build_failed" || state === "unknown" ? "faulted" : "online",
@@ -198,7 +199,7 @@ const statusFrom = (state) => {
198
199
  };
199
200
  const shouldWake = (sandbox) => sandbox.state === "stopped" || sandbox.state === "archived";
200
201
  const make = (client = {}) => {
201
- const redact = makeRedactor([client.apiKey ?? ""]);
202
+ const redact = SandboxProvider.makeRedactor([client.apiKey ?? ""]);
202
203
  const daytona = (sdk) => new sdk.Daytona({
203
204
  ...client.apiKey === void 0 ? {} : { apiKey: client.apiKey },
204
205
  ...client.apiUrl === void 0 ? {} : { apiUrl: client.apiUrl },
@@ -211,7 +212,7 @@ const make = (client = {}) => {
211
212
  sdk = loaded;
212
213
  return run(loaded);
213
214
  }),
214
- catch: (cause) => providerError({
215
+ catch: (cause) => SandboxProvider.providerError({
215
216
  driver: name,
216
217
  operation,
217
218
  cause,
@@ -228,11 +229,11 @@ const make = (client = {}) => {
228
229
  });
229
230
  const wake = (sandbox, operation) => shouldWake(sandbox) ? attempt(operation, () => sandbox.start()).pipe(Effect.map(() => sandbox)) : Effect.succeed(sandbox);
230
231
  const runtime = (defaultCwd, input) => ({
231
- defaultCwd: AbsolutePath.make(defaultCwd),
232
+ defaultCwd: SandboxDriver.AbsolutePath.make(defaultCwd),
232
233
  ...input.user === void 0 ? {} : { user: input.user },
233
234
  ...input.execTimeout === void 0 ? {} : { execTimeout: input.execTimeout }
234
235
  });
235
- return driver({
236
+ return SandboxDriver.driver({
236
237
  name,
237
238
  kind: "remote",
238
239
  capabilities: {
@@ -280,7 +281,7 @@ const make = (client = {}) => {
280
281
  runtimeConfigFor: ({ providerResourceId, overrides }) => Effect.gen(function* () {
281
282
  const sandbox = yield* get(providerResourceId, "runtimeConfigFor");
282
283
  return {
283
- defaultCwd: overrides?.defaultCwd ?? AbsolutePath.make(yield* attempt("runtimeConfigFor.cwd", () => mountCwd(void 0, () => sandbox.getWorkDir()))),
284
+ defaultCwd: overrides?.defaultCwd ?? SandboxDriver.AbsolutePath.make(yield* attempt("runtimeConfigFor.cwd", () => mountCwd(void 0, () => sandbox.getWorkDir()))),
284
285
  ...overrides?.user === void 0 ? { user: sandbox.user } : { user: overrides.user },
285
286
  ...overrides?.execTimeout === void 0 ? {} : { execTimeout: overrides.execTimeout }
286
287
  };
@@ -296,8 +297,8 @@ const make = (client = {}) => {
296
297
  destroy: (input) => Effect.flatMap(get(Option.getOrElse(input.providerResourceId, () => input.id), "destroy"), (sandbox) => attempt("destroy", () => sandbox.delete()))
297
298
  });
298
299
  };
299
- const sandbox = defineModule({
300
- apiVersion: 1,
300
+ const sandbox = SandboxDriver.module({
301
+ apiVersion: SandboxDriver.apiVersion,
301
302
  name,
302
303
  options: Options,
303
304
  make
@@ -309,4 +310,4 @@ const config = (value) => ({
309
310
  //#endregion
310
311
  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 };
311
312
 
312
- //# sourceMappingURL=daytona-jO3_hTRS.mjs.map
313
+ //# sourceMappingURL=daytona-BAurx6Gp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daytona-BAurx6Gp.mjs","names":["make","SandboxIO","SandboxInstance","quote","quoteArgv","SandboxFileSystem","resolveCwd","ShellError","RemoteFileSystem.make","Shell","SandboxResource","EnvDaytona.mountCwd","EnvDaytona.transport"],"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":"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"}