@codeworksh/cli 0.0.1-canary.10.1.g65d5c167

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/acp-P_1Wqd-Z.mjs +494 -0
  4. package/acp-P_1Wqd-Z.mjs.map +1 -0
  5. package/add-DjJjtu0E.mjs +82 -0
  6. package/add-DjJjtu0E.mjs.map +1 -0
  7. package/catalog-BeNHJEEM.mjs +17 -0
  8. package/catalog-BeNHJEEM.mjs.map +1 -0
  9. package/check-CJtU790x.mjs +54 -0
  10. package/check-CJtU790x.mjs.map +1 -0
  11. package/entries-BXBULTVt.mjs +90 -0
  12. package/entries-BXBULTVt.mjs.map +1 -0
  13. package/error-CxoEKg-4.mjs +610 -0
  14. package/error-CxoEKg-4.mjs.map +1 -0
  15. package/harness-6d8TlAVk.mjs +19 -0
  16. package/harness-6d8TlAVk.mjs.map +1 -0
  17. package/index.mjs +39 -0
  18. package/index.mjs.map +1 -0
  19. package/install-CRsM-5h3.mjs +54 -0
  20. package/install-CRsM-5h3.mjs.map +1 -0
  21. package/link-orVe7_W5.mjs +41 -0
  22. package/link-orVe7_W5.mjs.map +1 -0
  23. package/list-B9t_qFIQ.mjs +77 -0
  24. package/list-B9t_qFIQ.mjs.map +1 -0
  25. package/list-C7YdESnc.mjs +30 -0
  26. package/list-C7YdESnc.mjs.map +1 -0
  27. package/login-zuKhmbS5.mjs +45 -0
  28. package/login-zuKhmbS5.mjs.map +1 -0
  29. package/logout-B0lXwmvv.mjs +29 -0
  30. package/logout-B0lXwmvv.mjs.map +1 -0
  31. package/package-KrQWL_Rw.mjs +6 -0
  32. package/package-KrQWL_Rw.mjs.map +1 -0
  33. package/package.json +54 -0
  34. package/providers-PNt4dpfv.mjs +17 -0
  35. package/providers-PNt4dpfv.mjs.map +1 -0
  36. package/refresh-FjH0oHND.mjs +17 -0
  37. package/refresh-FjH0oHND.mjs.map +1 -0
  38. package/refresh-xxKXjcRX.mjs +35 -0
  39. package/refresh-xxKXjcRX.mjs.map +1 -0
  40. package/reload-B2PxpO2s.mjs +26 -0
  41. package/reload-B2PxpO2s.mjs.map +1 -0
  42. package/remove-Deowzmc7.mjs +37 -0
  43. package/remove-Deowzmc7.mjs.map +1 -0
  44. package/run-DNRnGHYa.mjs +146 -0
  45. package/run-DNRnGHYa.mjs.map +1 -0
  46. package/runtime-BuFe9cOc.mjs +358 -0
  47. package/runtime-BuFe9cOc.mjs.map +1 -0
  48. package/serve-DfW0O2tr.mjs +300 -0
  49. package/serve-DfW0O2tr.mjs.map +1 -0
  50. package/settings-aqM_b9UE.mjs +221 -0
  51. package/settings-aqM_b9UE.mjs.map +1 -0
  52. package/shared-DN18qxOE.mjs +116 -0
  53. package/shared-DN18qxOE.mjs.map +1 -0
  54. package/status-Br21KEeh.mjs +31 -0
  55. package/status-Br21KEeh.mjs.map +1 -0
  56. package/update-qrQr-mJT.mjs +51 -0
  57. package/update-qrQr-mJT.mjs.map +1 -0
@@ -0,0 +1,17 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure } from "./error-CxoEKg-4.mjs";
3
+ import { n as synced } from "./catalog-BeNHJEEM.mjs";
4
+ import { Effect } from "effect";
5
+ import { ModelCatalog } from "@codeworksh/harness/effect";
6
+ //#region src/cli/cmd/handlers/models/providers.ts
7
+ var providers_default = handler(Cmd.commands.models.commands.providers, Effect.fn("CLI.models.providers")(function* () {
8
+ return yield* Effect.gen(function* () {
9
+ yield* synced;
10
+ const sorted = [...yield* ModelCatalog.providers].sort((a, b) => a.localeCompare(b));
11
+ yield* writeOut(sorted.map((providerId) => `${providerId}\n`).join(""));
12
+ }).pipe(Effect.catch(reportFailure));
13
+ }));
14
+ //#endregion
15
+ export { providers_default as default };
16
+
17
+ //# sourceMappingURL=providers-PNt4dpfv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers-PNt4dpfv.mjs","names":["Runtime.handler"],"sources":["../../src/cli/cmd/handlers/models/providers.ts"],"sourcesContent":["import { ModelCatalog } from \"@codeworksh/harness/effect\";\nimport { Effect } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport { synced } from \"./catalog.ts\";\n\nexport default Runtime.handler(\n\tCmd.commands.models.commands.providers,\n\tEffect.fn(\"CLI.models.providers\")(function* () {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tyield* synced;\n\t\t\tconst providers = yield* ModelCatalog.providers;\n\t\t\tconst sorted = [...providers].sort((a, b) => a.localeCompare(b));\n\t\t\tyield* writeOut(sorted.map((providerId) => `${providerId}\\n`).join(\"\"));\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAQA,IAAA,oBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,WAC7B,OAAO,GAAG,sBAAsB,CAAC,CAAC,aAAa;CAQ9C,OAAO,OAPS,OAAO,IAAI,aAAa;EACvC,OAAO;EAEP,MAAM,SAAS,CAAC,GAAG,OADM,aAAa,SACV,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;EAC/D,OAAO,SAAS,OAAO,KAAK,eAAe,GAAG,WAAW,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;CACvE,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
@@ -0,0 +1,17 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure, u as writeError } from "./error-CxoEKg-4.mjs";
3
+ import { t as home } from "./catalog-BeNHJEEM.mjs";
4
+ import { Effect } from "effect";
5
+ import { ModelCatalog } from "@codeworksh/harness/effect";
6
+ //#region src/cli/cmd/handlers/models/refresh.ts
7
+ var refresh_default = handler(Cmd.commands.models.commands.refresh, Effect.fn("CLI.models.refresh")(function* ({ force }) {
8
+ return yield* Effect.gen(function* () {
9
+ const status = yield* ModelCatalog.refresh(yield* home, { force });
10
+ yield* writeError(status.refreshed ? `Refreshed model catalog at ${status.path}\n` : `Model catalog at ${status.path} is fresh; pass --force to download it anyway\n`);
11
+ yield* writeOut(`${status.path}\n`);
12
+ }).pipe(Effect.catch(reportFailure));
13
+ }));
14
+ //#endregion
15
+ export { refresh_default as default };
16
+
17
+ //# sourceMappingURL=refresh-FjH0oHND.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-FjH0oHND.mjs","names":["Runtime.handler"],"sources":["../../src/cli/cmd/handlers/models/refresh.ts"],"sourcesContent":["import { ModelCatalog } from \"@codeworksh/harness/effect\";\nimport { Effect } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeError, writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport { home } from \"./catalog.ts\";\n\nexport default Runtime.handler(\n\tCmd.commands.models.commands.refresh,\n\tEffect.fn(\"CLI.models.refresh\")(function* ({ force }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst status = yield* ModelCatalog.refresh(yield* home, { force });\n\t\t\tyield* writeError(\n\t\t\t\tstatus.refreshed\n\t\t\t\t\t? `Refreshed model catalog at ${status.path}\\n`\n\t\t\t\t\t: `Model catalog at ${status.path} is fresh; pass --force to download it anyway\\n`,\n\t\t\t);\n\t\t\tyield* writeOut(`${status.path}\\n`);\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAQA,IAAA,kBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,SAC7B,OAAO,GAAG,oBAAoB,CAAC,CAAC,WAAW,EAAE,SAAS;CAWrD,OAAO,OAVS,OAAO,IAAI,aAAa;EACvC,MAAM,SAAS,OAAO,aAAa,QAAQ,OAAO,MAAM,EAAE,MAAM,CAAC;EACjE,OAAO,WACN,OAAO,YACJ,8BAA8B,OAAO,KAAK,MAC1C,oBAAoB,OAAO,KAAK,gDACpC;EACA,OAAO,SAAS,GAAG,OAAO,KAAK,GAAG;CACnC,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
@@ -0,0 +1,35 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure, n as OAuthError, p as make, t as InvalidInputError, u as writeError } from "./error-CxoEKg-4.mjs";
3
+ import { a as oauthProviderLabel, n as attempt, o as selectProvider, r as localOps, s as withServer, t as assertServerScope } from "./shared-DN18qxOE.mjs";
4
+ import { Effect, Option } from "effect";
5
+ import { formatOAuthSummary, oauthNotice, oauthRefreshIssue } from "@codeworksh/aikit/oauth/summary";
6
+ //#region src/cli/cmd/handlers/auth/refresh.ts
7
+ var refresh_default = handler(Cmd.commands.auth.commands.refresh, Effect.fn("CLI.auth.refresh")(function* ({ server, openaiCodex, githubCopilot, authFile, json }) {
8
+ return yield* Effect.gen(function* () {
9
+ const provider = yield* selectProvider({
10
+ openaiCodex,
11
+ githubCopilot
12
+ });
13
+ const blocked = oauthRefreshIssue(provider);
14
+ if (blocked !== void 0) return yield* new InvalidInputError({ message: blocked });
15
+ const name = oauthProviderLabel(provider);
16
+ if (Option.isSome(server)) {
17
+ yield* assertServerScope(authFile);
18
+ return yield* withServer(server.value, Effect.gen(function* () {
19
+ const info = yield* (yield* make)["auth.refresh"]({ provider });
20
+ if (info === null) return yield* new OAuthError({ message: oauthNotice("missing", provider, "the server") });
21
+ yield* writeError(`${oauthNotice("refreshed", provider, "the server")}\n`);
22
+ yield* writeOut(formatOAuthSummary(info, { json }));
23
+ }));
24
+ }
25
+ const ops = yield* localOps(provider, authFile);
26
+ const summary = yield* attempt(`failed to read ${name} credentials`, () => ops.refreshed());
27
+ if (summary === void 0) return yield* new OAuthError({ message: oauthNotice("missing", provider, ops.path) });
28
+ yield* writeError(`${oauthNotice("refreshed", provider, ops.path)}\n`);
29
+ yield* writeOut(formatOAuthSummary(summary, { json }));
30
+ }).pipe(Effect.catch(reportFailure));
31
+ }));
32
+ //#endregion
33
+ export { refresh_default as default };
34
+
35
+ //# sourceMappingURL=refresh-xxKXjcRX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh-xxKXjcRX.mjs","names":["Runtime.handler","Client.make"],"sources":["../../src/cli/cmd/handlers/auth/refresh.ts"],"sourcesContent":["import { formatOAuthSummary, oauthNotice, oauthRefreshIssue } from \"@codeworksh/aikit/oauth/summary\";\nimport { Effect, Option } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { InvalidInputError, OAuthError, reportFailure } from \"../../../error.ts\";\nimport { writeError, writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport {\n\tassertServerScope,\n\tattempt,\n\tClient,\n\tlocalOps,\n\toauthProviderLabel,\n\tselectProvider,\n\twithServer,\n} from \"./shared.ts\";\n\nexport default Runtime.handler(\n\tCmd.commands.auth.commands.refresh,\n\tEffect.fn(\"CLI.auth.refresh\")(function* ({ server, openaiCodex, githubCopilot, authFile, json }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst provider = yield* selectProvider({ openaiCodex, githubCopilot });\n\t\t\tconst blocked = oauthRefreshIssue(provider);\n\t\t\tif (blocked !== undefined) return yield* new InvalidInputError({ message: blocked });\n\n\t\t\tconst name = oauthProviderLabel(provider);\n\n\t\t\tif (Option.isSome(server)) {\n\t\t\t\tyield* assertServerScope(authFile);\n\t\t\t\treturn yield* withServer(\n\t\t\t\t\tserver.value,\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst rpc = yield* Client.make;\n\t\t\t\t\t\tconst info = yield* rpc[\"auth.refresh\"]({ provider });\n\t\t\t\t\t\tif (info === null) {\n\t\t\t\t\t\t\treturn yield* new OAuthError({ message: oauthNotice(\"missing\", provider, \"the server\") });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tyield* writeError(`${oauthNotice(\"refreshed\", provider, \"the server\")}\\n`);\n\t\t\t\t\t\tyield* writeOut(formatOAuthSummary(info, { json }));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ops = yield* localOps(provider, authFile);\n\t\t\tconst summary = yield* attempt(`failed to read ${name} credentials`, () => ops.refreshed());\n\t\t\tif (summary === undefined) {\n\t\t\t\treturn yield* new OAuthError({ message: oauthNotice(\"missing\", provider, ops.path) });\n\t\t\t}\n\t\t\tyield* writeError(`${oauthNotice(\"refreshed\", provider, ops.path)}\\n`);\n\t\t\tyield* writeOut(formatOAuthSummary(summary, { json }));\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAgBA,IAAA,kBAAeA,QACd,IAAI,SAAS,KAAK,SAAS,SAC3B,OAAO,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,QAAQ,aAAa,eAAe,UAAU,QAAQ;CAiChG,OAAO,OAhCS,OAAO,IAAI,aAAa;EACvC,MAAM,WAAW,OAAO,eAAe;GAAE;GAAa;EAAc,CAAC;EACrE,MAAM,UAAU,kBAAkB,QAAQ;EAC1C,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO,IAAI,kBAAkB,EAAE,SAAS,QAAQ,CAAC;EAEnF,MAAM,OAAO,mBAAmB,QAAQ;EAExC,IAAI,OAAO,OAAO,MAAM,GAAG;GAC1B,OAAO,kBAAkB,QAAQ;GACjC,OAAO,OAAO,WACb,OAAO,OACP,OAAO,IAAI,aAAa;IAEvB,MAAM,OAAO,QAAO,OADDC,KAAAA,CACK,eAAe,CAAC,EAAE,SAAS,CAAC;IACpD,IAAI,SAAS,MACZ,OAAO,OAAO,IAAI,WAAW,EAAE,SAAS,YAAY,WAAW,UAAU,YAAY,EAAE,CAAC;IAEzF,OAAO,WAAW,GAAG,YAAY,aAAa,UAAU,YAAY,EAAE,GAAG;IACzE,OAAO,SAAS,mBAAmB,MAAM,EAAE,KAAK,CAAC,CAAC;GACnD,CAAC,CACF;EACD;EAEA,MAAM,MAAM,OAAO,SAAS,UAAU,QAAQ;EAC9C,MAAM,UAAU,OAAO,QAAQ,kBAAkB,KAAK,qBAAqB,IAAI,UAAU,CAAC;EAC1F,IAAI,YAAY,KAAA,GACf,OAAO,OAAO,IAAI,WAAW,EAAE,SAAS,YAAY,WAAW,UAAU,IAAI,IAAI,EAAE,CAAC;EAErF,OAAO,WAAW,GAAG,YAAY,aAAa,UAAU,IAAI,IAAI,EAAE,GAAG;EACrE,OAAO,SAAS,mBAAmB,SAAS,EAAE,KAAK,CAAC,CAAC;CACtD,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
@@ -0,0 +1,26 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, f as layer, i as reportFailure, p as make } from "./error-CxoEKg-4.mjs";
3
+ import { Effect } from "effect";
4
+ //#region src/cli/cmd/handlers/plugin/reload.ts
5
+ /**
6
+ * Re-import every configured plugin in a running server.
7
+ *
8
+ * It exists for exactly one case: a **local** plugin edited in place. Nothing in settings changed
9
+ * and no generation moved -- a local source is never copied into the store, so it has none -- and
10
+ * the module registry holds the old module against an unchanged URL. Everything else the runtime
11
+ * notices for itself at the next exchange.
12
+ *
13
+ * There is no local form, and that is not an omission. In a CLI every run is a fresh process, so
14
+ * the load pass happens at startup and a reload would have nothing to do.
15
+ */
16
+ var reload_default = handler(Cmd.commands.plugin.commands.reload, Effect.fn("CLI.plugin.reload")(function* ({ server }) {
17
+ return yield* Effect.gen(function* () {
18
+ const result = yield* (yield* make)["plugin.reload"]({});
19
+ yield* writeOut(result.failure === void 0 ? `Reloaded ${result.plugins} plugin${result.plugins === 1 ? "" : "s"}.\n` : `Reload failed, keeping ${result.plugins} loaded: ${result.failure}\n`);
20
+ if (result.failure !== void 0) process.exitCode = 1;
21
+ }).pipe(Effect.provide(layer(server)), Effect.scoped, Effect.catch(reportFailure));
22
+ }));
23
+ //#endregion
24
+ export { reload_default as default };
25
+
26
+ //# sourceMappingURL=reload-B2PxpO2s.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reload-B2PxpO2s.mjs","names":["Runtime.handler","Client.make","Client.layer"],"sources":["../../src/cli/cmd/handlers/plugin/reload.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Client } from \"../../../../server/client.ts\";\nimport { Cmd } from \"../../cmd.ts\";\n\n/**\n * Re-import every configured plugin in a running server.\n *\n * It exists for exactly one case: a **local** plugin edited in place. Nothing in settings changed\n * and no generation moved -- a local source is never copied into the store, so it has none -- and\n * the module registry holds the old module against an unchanged URL. Everything else the runtime\n * notices for itself at the next exchange.\n *\n * There is no local form, and that is not an omission. In a CLI every run is a fresh process, so\n * the load pass happens at startup and a reload would have nothing to do.\n */\nexport default Runtime.handler(\n\tCmd.commands.plugin.commands.reload,\n\tEffect.fn(\"CLI.plugin.reload\")(function* ({ server }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst rpc = yield* Client.make;\n\t\t\tconst result = yield* rpc[\"plugin.reload\"]({});\n\t\t\t// A reload that failed still reports the set that stayed loaded: the server kept\n\t\t\t// working, which is the whole point of not failing it.\n\t\t\tyield* writeOut(\n\t\t\t\tresult.failure === undefined\n\t\t\t\t\t? `Reloaded ${result.plugins} plugin${result.plugins === 1 ? \"\" : \"s\"}.\\n`\n\t\t\t\t\t: `Reload failed, keeping ${result.plugins} loaded: ${result.failure}\\n`,\n\t\t\t);\n\t\t\tif (result.failure !== undefined) process.exitCode = 1;\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.provide(Client.layer(server)), Effect.scoped, Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAA,iBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,QAC7B,OAAO,GAAG,mBAAmB,CAAC,CAAC,WAAW,EAAE,UAAU;CAcrD,OAAO,OAbS,OAAO,IAAI,aAAa;EAEvC,MAAM,SAAS,QAAO,OADHC,KAAAA,CACO,gBAAgB,CAAC,CAAC,CAAC;EAG7C,OAAO,SACN,OAAO,YAAY,KAAA,IAChB,YAAY,OAAO,QAAQ,SAAS,OAAO,YAAY,IAAI,KAAK,IAAI,OACpE,0BAA0B,OAAO,QAAQ,WAAW,OAAO,QAAQ,GACvE;EACA,IAAI,OAAO,YAAY,KAAA,GAAW,QAAQ,WAAW;CACtD,CAEoB,CAAC,CAAC,KAAK,OAAO,QAAQC,MAAa,MAAM,CAAC,GAAG,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;AAC5G,CAAC,CACF"}
@@ -0,0 +1,37 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure } from "./error-CxoEKg-4.mjs";
3
+ import { a as resolveTarget, c as withPluginsLock, i as readPlugins, l as writePlugins, o as spellings, r as matching, t as identify } from "./settings-aqM_b9UE.mjs";
4
+ import { Effect, FileSystem, Option, Path } from "effect";
5
+ import { Global } from "@codeworksh/harness/effect";
6
+ //#region src/cli/cmd/handlers/plugin/remove.ts
7
+ var remove_default = handler(Cmd.commands.plugin.commands.remove, Effect.fn("CLI.plugin.remove")(function* ({ package: reference, global: userWide }) {
8
+ return yield* Effect.gen(function* () {
9
+ const shared = yield* Cmd.spec;
10
+ const path = yield* Path.Path;
11
+ const fs = yield* FileSystem.FileSystem;
12
+ const paths = yield* Global.resolve(Option.isNone(shared.home) ? {} : { home: shared.home.value });
13
+ const target = yield* resolveTarget(shared, userWide, void 0, false);
14
+ if (!(yield* fs.exists(path.dirname(target.path)))) {
15
+ yield* writeOut(`Plugin "${reference}" is not configured in ${target.path}\n`);
16
+ return;
17
+ }
18
+ const spelled = yield* spellings(reference, path.resolve("."));
19
+ yield* withPluginsLock(target.path, Effect.gen(function* () {
20
+ const { source, plugins } = yield* readPlugins(target.path);
21
+ const entries = yield* identify(plugins, target.path, paths.cache);
22
+ const selected = matching(entries, spelled);
23
+ const kept = entries.filter((entry) => !selected.has(entry)).map((entry) => entry.value);
24
+ if (kept.length === plugins.length) {
25
+ yield* writeOut(`Plugin "${reference}" is not configured in ${target.path}\n`);
26
+ return;
27
+ }
28
+ yield* writePlugins(target.path, source, kept);
29
+ const dropped = plugins.length - kept.length;
30
+ yield* writeOut(`Removed ${dropped} ${dropped === 1 ? "entry" : "entries"} for "${reference}" from ${target.path}\n`);
31
+ }));
32
+ }).pipe(Effect.catch(reportFailure));
33
+ }));
34
+ //#endregion
35
+ export { remove_default as default };
36
+
37
+ //# sourceMappingURL=remove-Deowzmc7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-Deowzmc7.mjs","names":["Runtime.handler"],"sources":["../../src/cli/cmd/handlers/plugin/remove.ts"],"sourcesContent":["import { Global } from \"@codeworksh/harness/effect\";\nimport { Effect, FileSystem, Option, Path } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport {\n\tidentify,\n\tmatching,\n\treadPlugins,\n\tresolveTarget,\n\tspellings,\n\twithPluginsLock,\n\twritePlugins,\n} from \"./settings.ts\";\n\nexport default Runtime.handler(\n\tCmd.commands.plugin.commands.remove,\n\tEffect.fn(\"CLI.plugin.remove\")(function* ({ package: reference, global: userWide }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst shared = yield* Cmd.spec;\n\t\t\tconst path = yield* Path.Path;\n\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\tconst paths = yield* Global.resolve(Option.isNone(shared.home) ? {} : { home: shared.home.value });\n\t\t\tconst target = yield* resolveTarget(shared, userWide, undefined, false);\n\t\t\t// Removing from a directory that is not a project is a read-only no-op. In particular, it\n\t\t\t// must not create the marker that would make this directory shadow a real project later.\n\t\t\tif (!(yield* fs.exists(path.dirname(target.path)))) {\n\t\t\t\tyield* writeOut(`Plugin \"${reference}\" is not configured in ${target.path}\\n`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst spelled = yield* spellings(reference, path.resolve(\".\"));\n\t\t\tyield* withPluginsLock(\n\t\t\t\ttarget.path,\n\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\tconst { source, plugins } = yield* readPlugins(target.path);\n\t\t\t\t\t// Both the module entry and any configuration written against it: the package it was\n\t\t\t\t\t// added as, the path or version it was written with, and the ID it declares all name\n\t\t\t\t\t// the one plugin being removed.\n\t\t\t\t\tconst entries = yield* identify(plugins, target.path, paths.cache);\n\t\t\t\t\tconst selected = matching(entries, spelled);\n\t\t\t\t\tconst kept = entries.filter((entry) => !selected.has(entry)).map((entry) => entry.value);\n\t\t\t\t\tif (kept.length === plugins.length) {\n\t\t\t\t\t\tyield* writeOut(`Plugin \"${reference}\" is not configured in ${target.path}\\n`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tyield* writePlugins(target.path, source, kept);\n\t\t\t\t\tconst dropped = plugins.length - kept.length;\n\t\t\t\t\tyield* writeOut(\n\t\t\t\t\t\t`Removed ${dropped} ${dropped === 1 ? \"entry\" : \"entries\"} for \"${reference}\" from ${target.path}\\n`,\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAgBA,IAAA,iBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,QAC7B,OAAO,GAAG,mBAAmB,CAAC,CAAC,WAAW,EAAE,SAAS,WAAW,QAAQ,YAAY;CAqCnF,OAAO,OApCS,OAAO,IAAI,aAAa;EACvC,MAAM,SAAS,OAAO,IAAI;EAC1B,MAAM,OAAO,OAAO,KAAK;EACzB,MAAM,KAAK,OAAO,WAAW;EAC7B,MAAM,QAAQ,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK,MAAM,CAAC;EACjG,MAAM,SAAS,OAAO,cAAc,QAAQ,UAAU,KAAA,GAAW,KAAK;EAGtE,IAAI,EAAE,OAAO,GAAG,OAAO,KAAK,QAAQ,OAAO,IAAI,CAAC,IAAI;GACnD,OAAO,SAAS,WAAW,UAAU,yBAAyB,OAAO,KAAK,GAAG;GAC7E;EACD;EACA,MAAM,UAAU,OAAO,UAAU,WAAW,KAAK,QAAQ,GAAG,CAAC;EAC7D,OAAO,gBACN,OAAO,MACP,OAAO,IAAI,aAAa;GACvB,MAAM,EAAE,QAAQ,YAAY,OAAO,YAAY,OAAO,IAAI;GAI1D,MAAM,UAAU,OAAO,SAAS,SAAS,OAAO,MAAM,MAAM,KAAK;GACjE,MAAM,WAAW,SAAS,SAAS,OAAO;GAC1C,MAAM,OAAO,QAAQ,QAAQ,UAAU,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,MAAM,KAAK;GACvF,IAAI,KAAK,WAAW,QAAQ,QAAQ;IACnC,OAAO,SAAS,WAAW,UAAU,yBAAyB,OAAO,KAAK,GAAG;IAC7E;GACD;GACA,OAAO,aAAa,OAAO,MAAM,QAAQ,IAAI;GAC7C,MAAM,UAAU,QAAQ,SAAS,KAAK;GACtC,OAAO,SACN,WAAW,QAAQ,GAAG,YAAY,IAAI,UAAU,UAAU,QAAQ,UAAU,SAAS,OAAO,KAAK,GAClG;EACD,CAAC,CACF;CACD,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
@@ -0,0 +1,146 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { a as addUsage, c as terminalColumns, d as writeOut, f as layer, l as usage, m as run, o as emptyUsage, p as make, r as renderError, s as header, t as InvalidInputError, u as writeError } from "./error-CxoEKg-4.mjs";
3
+ import { t as harnessOptions } from "./harness-6d8TlAVk.mjs";
4
+ import { Effect, Exit, Fiber, Option, Queue, Ref, Schema, Stream } from "effect";
5
+ import { EventList, Harness, Sandbox, Session } from "@codeworksh/harness/effect";
6
+ //#region src/cli/cmd/handlers/run.ts
7
+ const initialRenderState = {
8
+ usage: emptyUsage,
9
+ textSeen: false,
10
+ textEndsWithNewline: false
11
+ };
12
+ const isTextDelta = Schema.is(EventList.LLMTextDelta);
13
+ const isLLMEnded = Schema.is(EventList.LLMEnded);
14
+ const isTurnEnded = Schema.is(EventList.TurnEnded);
15
+ const render = (state, ended) => Effect.fn("CLI.render")(function* (event) {
16
+ if (isTextDelta(event)) {
17
+ yield* writeOut(event.data.delta);
18
+ if (event.data.delta.length > 0) yield* Ref.update(state, (current) => ({
19
+ ...current,
20
+ textSeen: true,
21
+ textEndsWithNewline: event.data.delta.endsWith("\n")
22
+ }));
23
+ return;
24
+ }
25
+ if (isLLMEnded(event)) {
26
+ yield* Ref.update(state, (current) => ({
27
+ ...current,
28
+ usage: addUsage(current.usage, event.data.message)
29
+ }));
30
+ return;
31
+ }
32
+ if (ended !== void 0 && isTurnEnded(event)) yield* Queue.offer(ended, event.data.messageId);
33
+ });
34
+ const finish = Effect.fn("CLI.finish")(function* (state, columns) {
35
+ const rendered = yield* Ref.get(state);
36
+ if (rendered.textSeen && !rendered.textEndsWithNewline) yield* writeOut("\n");
37
+ yield* writeError(usage(rendered.usage, columns));
38
+ });
39
+ const awaitMessage = Effect.fn("CLI.awaitMessage")(function* (ended, messageId) {
40
+ while ((yield* Queue.take(ended)) !== messageId);
41
+ });
42
+ const selectSandbox = Effect.fn("CLI.selectSandbox")(function* (input) {
43
+ const selection = yield* Sandbox.resolve(input);
44
+ if (selection.created && selection.info !== void 0) {
45
+ const id = selection.info.id;
46
+ yield* Effect.addFinalizer(() => Effect.ignore(Sandbox.stop(id)));
47
+ }
48
+ return selection.info;
49
+ });
50
+ var run_default = handler(Cmd.commands.run, Effect.fn("CLI.run")(function* ({ prompt, session, cwd, sandboxDriver, sandboxProviderId, sandboxId, provider, model, thinking, server }) {
51
+ const shared = yield* Cmd.spec;
52
+ if (Option.isSome(session) && (Option.isSome(cwd) || Option.isSome(sandboxDriver) || Option.isSome(sandboxProviderId) || Option.isSome(sandboxId))) return yield* new InvalidInputError({ message: "--cwd, --sandbox-driver, --sandbox-id, and --sandbox-provider-id can only be used when creating a new session" });
53
+ if (Option.isSome(provider) !== Option.isSome(model)) return yield* new InvalidInputError({ message: "--provider and --model must be provided together" });
54
+ if (Option.isSome(sandboxProviderId) && Option.isNone(sandboxDriver)) return yield* new InvalidInputError({ message: "--sandbox-provider-id requires a remote --sandbox-driver" });
55
+ if (Option.isSome(server) && [
56
+ shared.home,
57
+ shared.database,
58
+ shared.userConfigDir
59
+ ].some(Option.isSome)) return yield* new InvalidInputError({ message: "--home, --database, and --user-config-dir belong on codework serve when using --server" });
60
+ if (Option.isSome(sandboxId) && (Option.isSome(sandboxDriver) || Option.isSome(sandboxProviderId))) return yield* new InvalidInputError({ message: "--sandbox-id cannot be combined with --sandbox-driver or --sandbox-provider-id" });
61
+ const selection = Option.isSome(sandboxId) ? { id: Sandbox.SandboxInstance.ID.make(sandboxId.value) } : {
62
+ driver: Option.getOrElse(sandboxDriver, () => "local"),
63
+ ...Option.isNone(sandboxProviderId) ? {} : { providerResourceId: sandboxProviderId.value }
64
+ };
65
+ const hostDir = Session.AbsolutePath.make(process.cwd());
66
+ const runtime = {
67
+ ...Option.isNone(provider) || Option.isNone(model) ? {} : { model: {
68
+ provider: provider.value,
69
+ id: model.value
70
+ } },
71
+ ...Option.isNone(thinking) ? {} : { thinkingLevel: thinking.value }
72
+ };
73
+ const remote = Effect.gen(function* () {
74
+ const rpc = yield* make;
75
+ const info = Option.isSome(session) ? yield* rpc["session.configure"]({
76
+ sessionId: Session.SessionSchema.ID.make(session.value),
77
+ runtime
78
+ }) : yield* rpc["session.create"]({
79
+ runtime,
80
+ ...Option.isNone(cwd) ? {} : { directory: cwd.value },
81
+ hostDir,
82
+ sandbox: selection
83
+ });
84
+ const state = yield* Ref.make(initialRenderState);
85
+ const columns = terminalColumns();
86
+ yield* writeError(header({
87
+ sessionId: info.id,
88
+ sandbox: info.sandbox?.driver ?? "local",
89
+ directory: info.directory,
90
+ columns
91
+ }));
92
+ if (info.sandbox !== void 0) yield* writeError(`sandbox-id: ${info.sandbox.id}\n`);
93
+ yield* run(rpc, {
94
+ sessionId: info.id,
95
+ text: prompt
96
+ }, render(state)).pipe(Effect.onInterrupt(() => rpc["session.interrupt"]({ sessionId: info.id }).pipe(Effect.timeout("5 seconds"), Effect.ignore)));
97
+ yield* finish(state, columns);
98
+ });
99
+ const program = Effect.gen(function* () {
100
+ let handle;
101
+ if (Option.isSome(session)) handle = yield* Session.attach({
102
+ sessionId: Session.SessionSchema.ID.make(session.value),
103
+ ...runtime
104
+ });
105
+ else {
106
+ const selected = yield* selectSandbox(selection);
107
+ handle = yield* Session.create({
108
+ ...runtime,
109
+ ...selected === void 0 ? {} : { sandbox: selected },
110
+ ...Option.isNone(cwd) ? {} : { directory: cwd.value },
111
+ hostDir
112
+ });
113
+ }
114
+ const ended = yield* Queue.unbounded();
115
+ const renderState = yield* Ref.make(initialRenderState);
116
+ const printer = yield* handle.events().pipe(Stream.runForEach(render(renderState, ended)), Effect.forkScoped({ startImmediately: true }));
117
+ const info = yield* handle.info;
118
+ const columns = terminalColumns();
119
+ yield* writeError(header({
120
+ sessionId: handle.id,
121
+ sandbox: info.sandbox?.driver ?? "local",
122
+ directory: info.directory,
123
+ columns
124
+ }));
125
+ const execution = yield* handle.prompt({
126
+ text: prompt,
127
+ delivery: "followUp"
128
+ }).pipe(Effect.andThen(handle.resume()), Effect.exit);
129
+ yield* handle.wait();
130
+ if (Exit.isFailure(execution)) return yield* Effect.failCause(execution.cause);
131
+ const leaf = (yield* handle.path()).at(-1);
132
+ if (leaf !== void 0) yield* awaitMessage(ended, leaf.entry.id);
133
+ yield* Fiber.interrupt(printer);
134
+ yield* finish(renderState, columns);
135
+ });
136
+ return yield* Effect.gen(function* () {
137
+ if (Option.isSome(server)) return yield* remote.pipe(Effect.provide(layer(server.value)));
138
+ return yield* program.pipe(Effect.provide(Harness.layer(harnessOptions(shared))));
139
+ }).pipe(Effect.scoped, Effect.catch((error) => writeError(renderError(error)).pipe(Effect.andThen(Effect.sync(() => {
140
+ process.exitCode = 1;
141
+ })))));
142
+ }));
143
+ //#endregion
144
+ export { run_default as default };
145
+
146
+ //# sourceMappingURL=run-DNRnGHYa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-DNRnGHYa.mjs","names":["Runtime.handler","Client.make","Client.run","Client.layer"],"sources":["../../src/cli/cmd/handlers/run.ts"],"sourcesContent":["import { EventList, type EventSchema, Harness, Sandbox, Session } from \"@codeworksh/harness/effect\";\nimport { Effect, Exit, Fiber, Option, Queue, Ref, Schema, Stream } from \"effect\";\nimport { Runtime } from \"../../../framework/runtime.ts\";\nimport { Client } from \"../../../server/client.ts\";\nimport { InvalidInputError, renderError } from \"../../error.ts\";\nimport { harnessOptions } from \"../../harness.ts\";\nimport {\n\taddUsage,\n\temptyUsage,\n\theader,\n\tterminalColumns,\n\tusage,\n\ttype UsageSummary,\n\twriteError,\n\twriteOut,\n} from \"../../output.ts\";\nimport { Cmd } from \"../cmd.ts\";\n\ninterface RenderState {\n\treadonly usage: UsageSummary;\n\treadonly textSeen: boolean;\n\treadonly textEndsWithNewline: boolean;\n}\n\nconst initialRenderState: RenderState = {\n\tusage: emptyUsage,\n\ttextSeen: false,\n\ttextEndsWithNewline: false,\n};\n\nconst isTextDelta = Schema.is(EventList.LLMTextDelta);\nconst isLLMEnded = Schema.is(EventList.LLMEnded);\nconst isTurnEnded = Schema.is(EventList.TurnEnded);\n\nconst render = (state: Ref.Ref<RenderState>, ended?: Queue.Queue<string>) =>\n\tEffect.fn(\"CLI.render\")(function* (event: EventSchema.Payload) {\n\t\tif (isTextDelta(event)) {\n\t\t\tyield* writeOut(event.data.delta);\n\t\t\tif (event.data.delta.length > 0) {\n\t\t\t\tyield* Ref.update(state, (current) => ({\n\t\t\t\t\t...current,\n\t\t\t\t\ttextSeen: true,\n\t\t\t\t\ttextEndsWithNewline: event.data.delta.endsWith(\"\\n\"),\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (isLLMEnded(event)) {\n\t\t\tyield* Ref.update(state, (current) => ({ ...current, usage: addUsage(current.usage, event.data.message) }));\n\t\t\treturn;\n\t\t}\n\t\tif (ended !== undefined && isTurnEnded(event)) {\n\t\t\tyield* Queue.offer(ended, event.data.messageId);\n\t\t}\n\t});\n\nconst finish = Effect.fn(\"CLI.finish\")(function* (state: Ref.Ref<RenderState>, columns: number) {\n\tconst rendered = yield* Ref.get(state);\n\tif (rendered.textSeen && !rendered.textEndsWithNewline) yield* writeOut(\"\\n\");\n\tyield* writeError(usage(rendered.usage, columns));\n});\n\nconst awaitMessage = Effect.fn(\"CLI.awaitMessage\")(function* (ended: Queue.Queue<string>, messageId: string) {\n\twhile ((yield* Queue.take(ended)) !== messageId) {\n\t\t// Earlier turns in the same drain are expected when a tool call continues.\n\t}\n});\n\nconst selectSandbox = Effect.fn(\"CLI.selectSandbox\")(function* (input: Sandbox.Selection) {\n\tconst selection = yield* Sandbox.resolve(input);\n\tif (selection.created && selection.info !== undefined) {\n\t\tconst id = selection.info.id;\n\t\tyield* Effect.addFinalizer(() => Effect.ignore(Sandbox.stop(id)));\n\t}\n\treturn selection.info;\n});\n\nexport default Runtime.handler(\n\tCmd.commands.run,\n\tEffect.fn(\"CLI.run\")(function* ({\n\t\tprompt,\n\t\tsession,\n\t\tcwd,\n\t\tsandboxDriver,\n\t\tsandboxProviderId,\n\t\tsandboxId,\n\t\tprovider,\n\t\tmodel,\n\t\tthinking,\n\t\tserver,\n\t}) {\n\t\tconst shared = yield* Cmd.spec;\n\t\tif (\n\t\t\tOption.isSome(session) &&\n\t\t\t(Option.isSome(cwd) ||\n\t\t\t\tOption.isSome(sandboxDriver) ||\n\t\t\t\tOption.isSome(sandboxProviderId) ||\n\t\t\t\tOption.isSome(sandboxId))\n\t\t) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage:\n\t\t\t\t\t\"--cwd, --sandbox-driver, --sandbox-id, and --sandbox-provider-id can only be used when creating a new session\",\n\t\t\t});\n\t\t}\n\t\tif (Option.isSome(provider) !== Option.isSome(model)) {\n\t\t\treturn yield* new InvalidInputError({ message: \"--provider and --model must be provided together\" });\n\t\t}\n\t\tif (Option.isSome(sandboxProviderId) && Option.isNone(sandboxDriver)) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage: \"--sandbox-provider-id requires a remote --sandbox-driver\",\n\t\t\t});\n\t\t}\n\t\tif (Option.isSome(server) && [shared.home, shared.database, shared.userConfigDir].some(Option.isSome)) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage: \"--home, --database, and --user-config-dir belong on codework serve when using --server\",\n\t\t\t});\n\t\t}\n\n\t\tif (Option.isSome(sandboxId) && (Option.isSome(sandboxDriver) || Option.isSome(sandboxProviderId))) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage: \"--sandbox-id cannot be combined with --sandbox-driver or --sandbox-provider-id\",\n\t\t\t});\n\t\t}\n\t\tconst selection: Sandbox.Selection = Option.isSome(sandboxId)\n\t\t\t? { id: Sandbox.SandboxInstance.ID.make(sandboxId.value) }\n\t\t\t: {\n\t\t\t\t\tdriver: Option.getOrElse(sandboxDriver, () => \"local\"),\n\t\t\t\t\t...(Option.isNone(sandboxProviderId) ? {} : { providerResourceId: sandboxProviderId.value }),\n\t\t\t\t};\n\n\t\t// The session's host directory, with no flag to set it: a person running a command is always\n\t\t// somewhere, and that somewhere is what they mean by \"this project\". `--cwd` is a different\n\t\t// thing entirely -- where the work runs inside the session's space, which may be a sandbox\n\t\t// on another machine.\n\t\tconst hostDir = Session.AbsolutePath.make(process.cwd());\n\n\t\tconst runtime = {\n\t\t\t...(Option.isNone(provider) || Option.isNone(model)\n\t\t\t\t? {}\n\t\t\t\t: { model: { provider: provider.value, id: model.value } }),\n\t\t\t...(Option.isNone(thinking) ? {} : { thinkingLevel: thinking.value }),\n\t\t};\n\t\tconst remote = Effect.gen(function* () {\n\t\t\tconst rpc = yield* Client.make;\n\t\t\tconst info = Option.isSome(session)\n\t\t\t\t? yield* rpc[\"session.configure\"]({ sessionId: Session.SessionSchema.ID.make(session.value), runtime })\n\t\t\t\t: yield* rpc[\"session.create\"]({\n\t\t\t\t\t\truntime,\n\t\t\t\t\t\t...(Option.isNone(cwd) ? {} : { directory: cwd.value }),\n\t\t\t\t\t\thostDir,\n\t\t\t\t\t\tsandbox: selection,\n\t\t\t\t\t});\n\t\t\tconst state = yield* Ref.make(initialRenderState);\n\t\t\tconst columns = terminalColumns();\n\t\t\tyield* writeError(\n\t\t\t\theader({\n\t\t\t\t\tsessionId: info.id,\n\t\t\t\t\tsandbox: info.sandbox?.driver ?? \"local\",\n\t\t\t\t\tdirectory: info.directory,\n\t\t\t\t\tcolumns,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (info.sandbox !== undefined) yield* writeError(`sandbox-id: ${info.sandbox.id}\\n`);\n\t\t\tyield* Client.run(rpc, { sessionId: info.id, text: prompt }, render(state)).pipe(\n\t\t\t\tEffect.onInterrupt(() =>\n\t\t\t\t\trpc[\"session.interrupt\"]({ sessionId: info.id }).pipe(Effect.timeout(\"5 seconds\"), Effect.ignore),\n\t\t\t\t),\n\t\t\t);\n\t\t\tyield* finish(state, columns);\n\t\t});\n\t\tconst program = Effect.gen(function* () {\n\t\t\tlet handle: Session.Handle;\n\t\t\tif (Option.isSome(session)) {\n\t\t\t\thandle = yield* Session.attach({ sessionId: Session.SessionSchema.ID.make(session.value), ...runtime });\n\t\t\t} else {\n\t\t\t\tconst selected = yield* selectSandbox(selection);\n\t\t\t\thandle = yield* Session.create({\n\t\t\t\t\t...runtime,\n\t\t\t\t\t...(selected === undefined ? {} : { sandbox: selected }),\n\t\t\t\t\t...(Option.isNone(cwd) ? {} : { directory: cwd.value }),\n\t\t\t\t\thostDir,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst ended = yield* Queue.unbounded<string>();\n\t\t\tconst renderState = yield* Ref.make(initialRenderState);\n\t\t\tconst printer = yield* handle\n\t\t\t\t.events()\n\t\t\t\t.pipe(Stream.runForEach(render(renderState, ended)), Effect.forkScoped({ startImmediately: true }));\n\n\t\t\tconst info = yield* handle.info;\n\t\t\tconst columns = terminalColumns();\n\t\t\tyield* writeError(\n\t\t\t\theader({\n\t\t\t\t\tsessionId: handle.id,\n\t\t\t\t\tsandbox: info.sandbox?.driver ?? \"local\",\n\t\t\t\t\tdirectory: info.directory,\n\t\t\t\t\tcolumns,\n\t\t\t\t}),\n\t\t\t);\n\t\t\t// The local command joins execution to retain typed error details.\n\t\t\tconst execution = yield* handle\n\t\t\t\t.prompt({ text: prompt, delivery: \"followUp\" })\n\t\t\t\t.pipe(Effect.andThen(handle.resume()), Effect.exit);\n\t\t\tyield* handle.wait();\n\t\t\tif (Exit.isFailure(execution)) return yield* Effect.failCause(execution.cause);\n\t\t\tconst path = yield* handle.path();\n\t\t\tconst leaf = path.at(-1);\n\t\t\tif (leaf !== undefined) yield* awaitMessage(ended, leaf.entry.id);\n\t\t\tyield* Fiber.interrupt(printer);\n\t\t\tyield* finish(renderState, columns);\n\t\t});\n\n\t\tconst execute = Effect.gen(function* () {\n\t\t\tif (Option.isSome(server)) return yield* remote.pipe(Effect.provide(Client.layer(server.value)));\n\t\t\treturn yield* program.pipe(Effect.provide(Harness.layer(harnessOptions(shared))));\n\t\t});\n\t\treturn yield* execute.pipe(\n\t\t\tEffect.scoped,\n\t\t\tEffect.catch((error) =>\n\t\t\t\twriteError(renderError(error)).pipe(\n\t\t\t\t\tEffect.andThen(\n\t\t\t\t\t\tEffect.sync(() => {\n\t\t\t\t\t\t\tprocess.exitCode = 1;\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t}),\n);\n"],"mappings":";;;;;;AAwBA,MAAM,qBAAkC;CACvC,OAAO;CACP,UAAU;CACV,qBAAqB;AACtB;AAEA,MAAM,cAAc,OAAO,GAAG,UAAU,YAAY;AACpD,MAAM,aAAa,OAAO,GAAG,UAAU,QAAQ;AAC/C,MAAM,cAAc,OAAO,GAAG,UAAU,SAAS;AAEjD,MAAM,UAAU,OAA6B,UAC5C,OAAO,GAAG,YAAY,CAAC,CAAC,WAAW,OAA4B;CAC9D,IAAI,YAAY,KAAK,GAAG;EACvB,OAAO,SAAS,MAAM,KAAK,KAAK;EAChC,IAAI,MAAM,KAAK,MAAM,SAAS,GAC7B,OAAO,IAAI,OAAO,QAAQ,aAAa;GACtC,GAAG;GACH,UAAU;GACV,qBAAqB,MAAM,KAAK,MAAM,SAAS,IAAI;EACpD,EAAE;EAEH;CACD;CACA,IAAI,WAAW,KAAK,GAAG;EACtB,OAAO,IAAI,OAAO,QAAQ,aAAa;GAAE,GAAG;GAAS,OAAO,SAAS,QAAQ,OAAO,MAAM,KAAK,OAAO;EAAE,EAAE;EAC1G;CACD;CACA,IAAI,UAAU,KAAA,KAAa,YAAY,KAAK,GAC3C,OAAO,MAAM,MAAM,OAAO,MAAM,KAAK,SAAS;AAEhD,CAAC;AAEF,MAAM,SAAS,OAAO,GAAG,YAAY,CAAC,CAAC,WAAW,OAA6B,SAAiB;CAC/F,MAAM,WAAW,OAAO,IAAI,IAAI,KAAK;CACrC,IAAI,SAAS,YAAY,CAAC,SAAS,qBAAqB,OAAO,SAAS,IAAI;CAC5E,OAAO,WAAW,MAAM,SAAS,OAAO,OAAO,CAAC;AACjD,CAAC;AAED,MAAM,eAAe,OAAO,GAAG,kBAAkB,CAAC,CAAC,WAAW,OAA4B,WAAmB;CAC5G,QAAQ,OAAO,MAAM,KAAK,KAAK,OAAO;AAGvC,CAAC;AAED,MAAM,gBAAgB,OAAO,GAAG,mBAAmB,CAAC,CAAC,WAAW,OAA0B;CACzF,MAAM,YAAY,OAAO,QAAQ,QAAQ,KAAK;CAC9C,IAAI,UAAU,WAAW,UAAU,SAAS,KAAA,GAAW;EACtD,MAAM,KAAK,UAAU,KAAK;EAC1B,OAAO,OAAO,mBAAmB,OAAO,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAC;CACjE;CACA,OAAO,UAAU;AAClB,CAAC;AAED,IAAA,cAAeA,QACd,IAAI,SAAS,KACb,OAAO,GAAG,SAAS,CAAC,CAAC,WAAW,EAC/B,QACA,SACA,KACA,eACA,mBACA,WACA,UACA,OACA,UACA,UACE;CACF,MAAM,SAAS,OAAO,IAAI;CAC1B,IACC,OAAO,OAAO,OAAO,MACpB,OAAO,OAAO,GAAG,KACjB,OAAO,OAAO,aAAa,KAC3B,OAAO,OAAO,iBAAiB,KAC/B,OAAO,OAAO,SAAS,IAExB,OAAO,OAAO,IAAI,kBAAkB,EACnC,SACC,gHACF,CAAC;CAEF,IAAI,OAAO,OAAO,QAAQ,MAAM,OAAO,OAAO,KAAK,GAClD,OAAO,OAAO,IAAI,kBAAkB,EAAE,SAAS,mDAAmD,CAAC;CAEpG,IAAI,OAAO,OAAO,iBAAiB,KAAK,OAAO,OAAO,aAAa,GAClE,OAAO,OAAO,IAAI,kBAAkB,EACnC,SAAS,2DACV,CAAC;CAEF,IAAI,OAAO,OAAO,MAAM,KAAK;EAAC,OAAO;EAAM,OAAO;EAAU,OAAO;CAAa,CAAC,CAAC,KAAK,OAAO,MAAM,GACnG,OAAO,OAAO,IAAI,kBAAkB,EACnC,SAAS,yFACV,CAAC;CAGF,IAAI,OAAO,OAAO,SAAS,MAAM,OAAO,OAAO,aAAa,KAAK,OAAO,OAAO,iBAAiB,IAC/F,OAAO,OAAO,IAAI,kBAAkB,EACnC,SAAS,iFACV,CAAC;CAEF,MAAM,YAA+B,OAAO,OAAO,SAAS,IACzD,EAAE,IAAI,QAAQ,gBAAgB,GAAG,KAAK,UAAU,KAAK,EAAE,IACvD;EACA,QAAQ,OAAO,UAAU,qBAAqB,OAAO;EACrD,GAAI,OAAO,OAAO,iBAAiB,IAAI,CAAC,IAAI,EAAE,oBAAoB,kBAAkB,MAAM;CAC3F;CAMF,MAAM,UAAU,QAAQ,aAAa,KAAK,QAAQ,IAAI,CAAC;CAEvD,MAAM,UAAU;EACf,GAAI,OAAO,OAAO,QAAQ,KAAK,OAAO,OAAO,KAAK,IAC/C,CAAC,IACD,EAAE,OAAO;GAAE,UAAU,SAAS;GAAO,IAAI,MAAM;EAAM,EAAE;EAC1D,GAAI,OAAO,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,eAAe,SAAS,MAAM;CACpE;CACA,MAAM,SAAS,OAAO,IAAI,aAAa;EACtC,MAAM,MAAM,OAAOC;EACnB,MAAM,OAAO,OAAO,OAAO,OAAO,IAC/B,OAAO,IAAI,oBAAoB,CAAC;GAAE,WAAW,QAAQ,cAAc,GAAG,KAAK,QAAQ,KAAK;GAAG;EAAQ,CAAC,IACpG,OAAO,IAAI,iBAAiB,CAAC;GAC7B;GACA,GAAI,OAAO,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,MAAM;GACrD;GACA,SAAS;EACV,CAAC;EACH,MAAM,QAAQ,OAAO,IAAI,KAAK,kBAAkB;EAChD,MAAM,UAAU,gBAAgB;EAChC,OAAO,WACN,OAAO;GACN,WAAW,KAAK;GAChB,SAAS,KAAK,SAAS,UAAU;GACjC,WAAW,KAAK;GAChB;EACD,CAAC,CACF;EACA,IAAI,KAAK,YAAY,KAAA,GAAW,OAAO,WAAW,eAAe,KAAK,QAAQ,GAAG,GAAG;EACpF,OAAOC,IAAW,KAAK;GAAE,WAAW,KAAK;GAAI,MAAM;EAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,KAC3E,OAAO,kBACN,IAAI,oBAAoB,CAAC,EAAE,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,WAAW,GAAG,OAAO,MAAM,CACjG,CACD;EACA,OAAO,OAAO,OAAO,OAAO;CAC7B,CAAC;CACD,MAAM,UAAU,OAAO,IAAI,aAAa;EACvC,IAAI;EACJ,IAAI,OAAO,OAAO,OAAO,GACxB,SAAS,OAAO,QAAQ,OAAO;GAAE,WAAW,QAAQ,cAAc,GAAG,KAAK,QAAQ,KAAK;GAAG,GAAG;EAAQ,CAAC;OAChG;GACN,MAAM,WAAW,OAAO,cAAc,SAAS;GAC/C,SAAS,OAAO,QAAQ,OAAO;IAC9B,GAAG;IACH,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,SAAS;IACtD,GAAI,OAAO,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,MAAM;IACrD;GACD,CAAC;EACF;EACA,MAAM,QAAQ,OAAO,MAAM,UAAkB;EAC7C,MAAM,cAAc,OAAO,IAAI,KAAK,kBAAkB;EACtD,MAAM,UAAU,OAAO,OACrB,OAAO,CAAC,CACR,KAAK,OAAO,WAAW,OAAO,aAAa,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,kBAAkB,KAAK,CAAC,CAAC;EAEnG,MAAM,OAAO,OAAO,OAAO;EAC3B,MAAM,UAAU,gBAAgB;EAChC,OAAO,WACN,OAAO;GACN,WAAW,OAAO;GAClB,SAAS,KAAK,SAAS,UAAU;GACjC,WAAW,KAAK;GAChB;EACD,CAAC,CACF;EAEA,MAAM,YAAY,OAAO,OACvB,OAAO;GAAE,MAAM;GAAQ,UAAU;EAAW,CAAC,CAAC,CAC9C,KAAK,OAAO,QAAQ,OAAO,OAAO,CAAC,GAAG,OAAO,IAAI;EACnD,OAAO,OAAO,KAAK;EACnB,IAAI,KAAK,UAAU,SAAS,GAAG,OAAO,OAAO,OAAO,UAAU,UAAU,KAAK;EAE7E,MAAM,QAAO,OADO,OAAO,KAAK,EAAA,CACd,GAAG,EAAE;EACvB,IAAI,SAAS,KAAA,GAAW,OAAO,aAAa,OAAO,KAAK,MAAM,EAAE;EAChE,OAAO,MAAM,UAAU,OAAO;EAC9B,OAAO,OAAO,aAAa,OAAO;CACnC,CAAC;CAMD,OAAO,OAJS,OAAO,IAAI,aAAa;EACvC,IAAI,OAAO,OAAO,MAAM,GAAG,OAAO,OAAO,OAAO,KAAK,OAAO,QAAQC,MAAa,OAAO,KAAK,CAAC,CAAC;EAC/F,OAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,QAAQ,MAAM,eAAe,MAAM,CAAC,CAAC,CAAC;CACjF,CACoB,CAAC,CAAC,KACrB,OAAO,QACP,OAAO,OAAO,UACb,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,KAC9B,OAAO,QACN,OAAO,WAAW;EACjB,QAAQ,WAAW;CACpB,CAAC,CACF,CACD,CACD,CACD;AACD,CAAC,CACF"}