@opencode/client 0.0.0-dev-20573 → 0.0.0-dev-20577

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 (55) hide show
  1. package/dist/chunks/{pty-handoff-1y4a697q.js → service-1y4a697q.js} +1 -1
  2. package/dist/chunks/{pty-handoff-5myj1ht6.js → service-962mwvry.js} +5 -5
  3. package/dist/chunks/{pty-handoff-ank0d71z.js → service-ank0d71z.js} +1 -1
  4. package/dist/chunks/{pty-handoff-e5ea35j7.js → service-e5ea35j7.js} +1 -1
  5. package/dist/chunks/{pty-handoff-frbwqjmf.js → service-frbwqjmf.js} +1 -1
  6. package/dist/chunks/{pty-handoff-9n602qx4.js → service-mdvk8mfx.js} +4 -4
  7. package/dist/chunks/{pty-handoff-mnyft54j.js → service-mnyft54j.js} +2 -2
  8. package/dist/chunks/{pty-handoff-qzsnm4q8.js → service-qzsnm4q8.js} +2 -2
  9. package/dist/chunks/{pty-handoff-raw99g3w.js → service-raw99g3w.js} +3 -3
  10. package/dist/chunks/{pty-handoff-t1xa31vm.js → service-t1xa31vm.js} +1 -1
  11. package/dist/chunks/{pty-handoff-1cypz8nb.js → service-ve21qz3j.js} +1 -1
  12. package/dist/chunks/{pty-handoff-6f43cgzz.js → service-ve4aws36.js} +47 -2
  13. package/dist/contract.js +1 -1
  14. package/dist/effect/client.js +8 -8
  15. package/dist/effect/generated/client-error.js +1 -1
  16. package/dist/effect/generated/client.js +3 -3
  17. package/dist/effect/generated/index.js +4 -4
  18. package/dist/effect/index.js +8 -8
  19. package/dist/effect/rpc.js +2 -2
  20. package/dist/effect/service.js +19 -43
  21. package/dist/promise/client.js +7 -7
  22. package/dist/promise/generated/client-error.js +1 -1
  23. package/dist/promise/generated/client.js +2 -2
  24. package/dist/promise/generated/index.js +6 -6
  25. package/dist/promise/generated/types.js +1 -1
  26. package/dist/promise/index.js +8 -8
  27. package/dist/promise/rpc.js +2 -2
  28. package/dist/promise/service.js +19 -44
  29. package/dist/pty-handoff.js +1 -1
  30. package/dist/rpc-runtime.js +1 -1
  31. package/dist/service-contender.d.ts +27 -1
  32. package/dist/service-contender.js +3 -3
  33. package/dist/service-probe.js +2 -2
  34. package/dist/service-timing.js +1 -1
  35. package/dist/service-version.js +1 -1
  36. package/dist/service.js +1 -1
  37. package/dist/shared-events.js +1 -1
  38. package/dist/solid/connection.js +1 -1
  39. package/dist/solid/data.js +9 -9
  40. package/dist/solid/index.js +11 -11
  41. package/dist/solid/pty.js +1 -1
  42. package/package.json +4 -4
  43. /package/dist/chunks/{pty-handoff-6mptkzbc.js → service-6mptkzbc.js} +0 -0
  44. /package/dist/chunks/{pty-handoff-7f0py9js.js → service-7f0py9js.js} +0 -0
  45. /package/dist/chunks/{pty-handoff-9rqn6x4v.js → service-9rqn6x4v.js} +0 -0
  46. /package/dist/chunks/{pty-handoff-gne7h7mq.js → service-gne7h7mq.js} +0 -0
  47. /package/dist/chunks/{pty-handoff-js54wxgp.js → service-js54wxgp.js} +0 -0
  48. /package/dist/chunks/{pty-handoff-m2eywc8w.js → service-m2eywc8w.js} +0 -0
  49. /package/dist/chunks/{pty-handoff-qav6mfdz.js → service-qav6mfdz.js} +0 -0
  50. /package/dist/chunks/{pty-handoff-sxt88q69.js → service-sxt88q69.js} +0 -0
  51. /package/dist/chunks/{pty-handoff-vmytr4q8.js → service-vmytr4q8.js} +0 -0
  52. /package/dist/chunks/{pty-handoff-vt9jbch8.js → service-vt9jbch8.js} +0 -0
  53. /package/dist/chunks/{pty-handoff-vyas3vgt.js → service-vyas3vgt.js} +0 -0
  54. /package/dist/chunks/{pty-handoff-xgnj2w4v.js → service-xgnj2w4v.js} +0 -0
  55. /package/dist/chunks/{pty-handoff-ydhz1zrh.js → service-ydhz1zrh.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isRpcError2,
3
3
  isRpcInternalError2
4
- } from "./pty-handoff-vt9jbch8.js";
4
+ } from "./service-vt9jbch8.js";
5
5
 
6
6
  // src/promise/rpc.ts
7
7
  function makeRpc2(raw, events) {
@@ -1,19 +1,19 @@
1
1
  import {
2
2
  make7
3
- } from "./pty-handoff-frbwqjmf.js";
3
+ } from "./service-frbwqjmf.js";
4
4
  import {
5
5
  ClientError3
6
- } from "./pty-handoff-7f0py9js.js";
6
+ } from "./service-7f0py9js.js";
7
7
  import {
8
8
  make6
9
- } from "./pty-handoff-raw99g3w.js";
9
+ } from "./service-raw99g3w.js";
10
10
  import {
11
11
  make5,
12
12
  aborted2
13
- } from "./pty-handoff-mnyft54j.js";
13
+ } from "./service-mnyft54j.js";
14
14
  import {
15
15
  __export
16
- } from "./pty-handoff-9rqn6x4v.js";
16
+ } from "./service-9rqn6x4v.js";
17
17
 
18
18
  // src/effect/client.ts
19
19
  var exports_client3 = {};
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defaultEnsureTiming2
3
- } from "./pty-handoff-xgnj2w4v.js";
3
+ } from "./service-xgnj2w4v.js";
4
4
 
5
5
  // src/service-probe.ts
6
6
  import { homedir } from "node:os";
@@ -2,7 +2,7 @@ import {
2
2
  isFormNotFoundError2,
3
3
  isFormAlreadySettledError2,
4
4
  isPermissionNotFoundError2
5
- } from "./pty-handoff-vt9jbch8.js";
5
+ } from "./service-vt9jbch8.js";
6
6
 
7
7
  // src/solid/data.ts
8
8
  import { Worktree } from "@opencode/schema/worktree";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./pty-handoff-9rqn6x4v.js";
3
+ } from "./service-9rqn6x4v.js";
4
4
 
5
5
  // src/shared-events.ts
6
6
  var exports_shared_events = {};
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  make7
3
- } from "./pty-handoff-frbwqjmf.js";
3
+ } from "./service-frbwqjmf.js";
4
4
  import {
5
5
  make3
6
- } from "./pty-handoff-qzsnm4q8.js";
6
+ } from "./service-qzsnm4q8.js";
7
7
  import {
8
8
  makeRpc2
9
- } from "./pty-handoff-1y4a697q.js";
9
+ } from "./service-1y4a697q.js";
10
10
  import {
11
11
  __export
12
- } from "./pty-handoff-9rqn6x4v.js";
12
+ } from "./service-9rqn6x4v.js";
13
13
 
14
14
  // src/promise/client.ts
15
15
  var exports_client = {};
@@ -3,10 +3,10 @@ import {
3
3
  readError2,
4
4
  event2,
5
5
  eventType2
6
- } from "./pty-handoff-t1xa31vm.js";
6
+ } from "./service-t1xa31vm.js";
7
7
  import {
8
8
  __export
9
- } from "./pty-handoff-9rqn6x4v.js";
9
+ } from "./service-9rqn6x4v.js";
10
10
 
11
11
  // src/effect/rpc.ts
12
12
  var exports_rpc = {};
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  ClientError2
3
- } from "./pty-handoff-js54wxgp.js";
3
+ } from "./service-js54wxgp.js";
4
4
  import {
5
5
  __export
6
- } from "./pty-handoff-9rqn6x4v.js";
6
+ } from "./service-9rqn6x4v.js";
7
7
 
8
8
  // src/promise/generated/client.ts
9
9
  var exports_client2 = {};
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  ClientApi2
3
- } from "./pty-handoff-vmytr4q8.js";
3
+ } from "./service-vmytr4q8.js";
4
4
  import {
5
5
  ClientError3
6
- } from "./pty-handoff-7f0py9js.js";
6
+ } from "./service-7f0py9js.js";
7
7
  import {
8
8
  __export
9
- } from "./pty-handoff-9rqn6x4v.js";
9
+ } from "./service-9rqn6x4v.js";
10
10
 
11
11
  // src/effect/generated/client.ts
12
12
  var exports_client4 = {};
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./pty-handoff-9rqn6x4v.js";
3
+ } from "./service-9rqn6x4v.js";
4
4
 
5
5
  // src/rpc-runtime.ts
6
6
  var exports_rpc_runtime = {};
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __export
3
- } from "./pty-handoff-9rqn6x4v.js";
3
+ } from "./service-9rqn6x4v.js";
4
4
 
5
5
  // src/pty-handoff.ts
6
6
  var exports_pty_handoff = {};
@@ -37,7 +37,52 @@ function spawnServiceContender2(command, args, env) {
37
37
  }
38
38
  };
39
39
  }
40
- function contenderFailure2(contender) {
40
+ function contenderPool2(timing) {
41
+ const contenders = new Set;
42
+ let failure;
43
+ let spawnDelay = timing.spawnDelay;
44
+ let lastSpawn = 0;
45
+ return {
46
+ failure: () => failure,
47
+ serviceAnswered() {
48
+ spawnDelay = timing.spawnDelay;
49
+ },
50
+ evict(pid) {
51
+ for (const item of contenders) {
52
+ if (item.child.pid === pid || contenderFinished2(item)) {
53
+ item.release();
54
+ contenders.delete(item);
55
+ }
56
+ }
57
+ failure = undefined;
58
+ lastSpawn = 0;
59
+ },
60
+ recruitNow() {
61
+ lastSpawn = Date.now() - spawnDelay;
62
+ },
63
+ reap() {
64
+ const finished = [...contenders].filter(contenderFinished2);
65
+ failure ??= finished.map(contenderFailure).find((error) => error !== undefined);
66
+ if (finished.some((item) => item.child.exitCode === 0))
67
+ spawnDelay = Math.min(spawnDelay * 2, timing.maxSpawnDelay);
68
+ finished.forEach((item) => contenders.delete(item));
69
+ return contenders.size === 0 ? failure : undefined;
70
+ },
71
+ shouldRecruit(registered) {
72
+ if (lastSpawn === 0 && registered)
73
+ lastSpawn = Date.now();
74
+ return failure === undefined && contenders.size < 2 && Date.now() - lastSpawn >= spawnDelay;
75
+ },
76
+ add(contender) {
77
+ contenders.add(contender);
78
+ lastSpawn = Date.now();
79
+ },
80
+ releaseAll() {
81
+ contenders.forEach((contender) => contender.release());
82
+ }
83
+ };
84
+ }
85
+ function contenderFailure(contender) {
41
86
  const error = contender.error();
42
87
  if (error !== undefined)
43
88
  return error;
@@ -55,4 +100,4 @@ function startupError(message, stderr) {
55
100
  ${stderr}` : message);
56
101
  }
57
102
 
58
- export { spawnServiceContender2, contenderFailure2, contenderFinished2 };
103
+ export { spawnServiceContender2, contenderPool2, contenderFinished2 };
package/dist/contract.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  effectOmitEndpoints2,
4
4
  groupNames2,
5
5
  promiseOmitEndpoints2
6
- } from "./chunks/pty-handoff-vmytr4q8.js";
6
+ } from "./chunks/service-vmytr4q8.js";
7
7
  export {
8
8
  ClientApi2 as ClientApi,
9
9
  effectOmitEndpoints2 as effectOmitEndpoints,
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  make4,
3
3
  exports_client3
4
- } from "../chunks/pty-handoff-5myj1ht6.js";
5
- import"../chunks/pty-handoff-mnyft54j.js";
6
- import"../chunks/pty-handoff-6mptkzbc.js";
7
- import"../chunks/pty-handoff-raw99g3w.js";
8
- import"../chunks/pty-handoff-7f0py9js.js";
9
- import"../chunks/pty-handoff-frbwqjmf.js";
10
- import"../chunks/pty-handoff-vmytr4q8.js";
11
- import"../chunks/pty-handoff-t1xa31vm.js";
4
+ } from "../chunks/service-962mwvry.js";
5
+ import"../chunks/service-mnyft54j.js";
6
+ import"../chunks/service-6mptkzbc.js";
7
+ import"../chunks/service-raw99g3w.js";
8
+ import"../chunks/service-7f0py9js.js";
9
+ import"../chunks/service-vmytr4q8.js";
10
+ import"../chunks/service-t1xa31vm.js";
11
+ import"../chunks/service-frbwqjmf.js";
12
12
  export {
13
13
  exports_client3 as OpenCode,
14
14
  make4 as make
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ClientError3
3
- } from "../../chunks/pty-handoff-7f0py9js.js";
3
+ } from "../../chunks/service-7f0py9js.js";
4
4
  export {
5
5
  ClientError3 as ClientError
6
6
  };
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  make6
3
- } from "../../chunks/pty-handoff-raw99g3w.js";
4
- import"../../chunks/pty-handoff-7f0py9js.js";
5
- import"../../chunks/pty-handoff-vmytr4q8.js";
3
+ } from "../../chunks/service-raw99g3w.js";
4
+ import"../../chunks/service-7f0py9js.js";
5
+ import"../../chunks/service-vmytr4q8.js";
6
6
  export {
7
7
  make6 as make
8
8
  };
@@ -1,11 +1,11 @@
1
- import"../../chunks/pty-handoff-6mptkzbc.js";
1
+ import"../../chunks/service-6mptkzbc.js";
2
2
  import {
3
3
  exports_client4
4
- } from "../../chunks/pty-handoff-raw99g3w.js";
4
+ } from "../../chunks/service-raw99g3w.js";
5
5
  import {
6
6
  ClientError3
7
- } from "../../chunks/pty-handoff-7f0py9js.js";
8
- import"../../chunks/pty-handoff-vmytr4q8.js";
7
+ } from "../../chunks/service-7f0py9js.js";
8
+ import"../../chunks/service-vmytr4q8.js";
9
9
  export {
10
10
  ClientError3 as ClientError,
11
11
  exports_client4 as OpenCode
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ClientError3
3
- } from "../chunks/pty-handoff-7f0py9js.js";
4
- import"../chunks/pty-handoff-vmytr4q8.js";
5
- import"../chunks/pty-handoff-raw99g3w.js";
6
- import"../chunks/pty-handoff-6mptkzbc.js";
7
- import"../chunks/pty-handoff-frbwqjmf.js";
8
- import"../chunks/pty-handoff-t1xa31vm.js";
9
- import"../chunks/pty-handoff-mnyft54j.js";
3
+ } from "../chunks/service-7f0py9js.js";
4
+ import"../chunks/service-vmytr4q8.js";
5
+ import"../chunks/service-raw99g3w.js";
6
+ import"../chunks/service-6mptkzbc.js";
7
+ import"../chunks/service-frbwqjmf.js";
8
+ import"../chunks/service-t1xa31vm.js";
9
+ import"../chunks/service-mnyft54j.js";
10
10
  import {
11
11
  exports_client3
12
- } from "../chunks/pty-handoff-5myj1ht6.js";
12
+ } from "../chunks/service-962mwvry.js";
13
13
 
14
14
  // src/effect/index.ts
15
15
  import { Agent } from "@opencode/schema/agent";
@@ -2,8 +2,8 @@ import {
2
2
  make5,
3
3
  aborted2,
4
4
  exports_rpc
5
- } from "../chunks/pty-handoff-mnyft54j.js";
6
- import"../chunks/pty-handoff-t1xa31vm.js";
5
+ } from "../chunks/service-mnyft54j.js";
6
+ import"../chunks/service-t1xa31vm.js";
7
7
  export {
8
8
  exports_rpc as RpcClientRuntime,
9
9
  aborted2 as aborted,
@@ -1,28 +1,27 @@
1
1
  import {
2
2
  spawnServiceContender2,
3
- contenderFailure2,
4
- contenderFinished2
5
- } from "../chunks/pty-handoff-6f43cgzz.js";
3
+ contenderPool2
4
+ } from "../chunks/service-ve4aws36.js";
6
5
  import {
7
6
  defaultEnsureTiming2,
8
7
  ensureTiming2
9
- } from "../chunks/pty-handoff-xgnj2w4v.js";
8
+ } from "../chunks/service-xgnj2w4v.js";
10
9
  import {
11
10
  matchesVersion2
12
- } from "../chunks/pty-handoff-sxt88q69.js";
11
+ } from "../chunks/service-sxt88q69.js";
13
12
  import {
14
13
  prepare2,
15
14
  environment2,
16
15
  complete2,
17
16
  clear2
18
- } from "../chunks/pty-handoff-1cypz8nb.js";
17
+ } from "../chunks/service-ve21qz3j.js";
19
18
  import {
20
19
  fallback2,
21
20
  same2,
22
21
  probeResult2,
23
22
  headers2
24
- } from "../chunks/pty-handoff-ank0d71z.js";
25
- import"../chunks/pty-handoff-qav6mfdz.js";
23
+ } from "../chunks/service-ank0d71z.js";
24
+ import"../chunks/service-qav6mfdz.js";
26
25
 
27
26
  // src/effect/service.ts
28
27
  import { Effect, FileSystem, Option, Schedule, Schema } from "effect";
@@ -49,12 +48,9 @@ var incumbent = Effect.fn("service.incumbent")(function* (options) {
49
48
  });
50
49
  var ensure = Effect.fn("service.ensure")(function* (options = {}) {
51
50
  const timing = ensureTiming2(options);
52
- const contenders = new Set;
51
+ const pool = contenderPool2(timing);
53
52
  let timeouts;
54
53
  let announced = false;
55
- let lastSpawn = 0;
56
- let spawnDelay = timing.spawnDelay;
57
- let failure;
58
54
  const announce = (reason, previousVersion) => Effect.sync(() => {
59
55
  if (announced)
60
56
  return;
@@ -87,20 +83,14 @@ var ensure = Effect.fn("service.ensure")(function* (options = {}) {
87
83
  yield* Effect.logWarning("Background service is unresponsive; recovery cannot preserve persistent terminals");
88
84
  yield* Effect.tryPromise(() => clear2(options.file ?? fallback2()));
89
85
  yield* terminate(info, options, timing);
90
- for (const item of contenders) {
91
- if (item.child.pid === info.pid || contenderFinished2(item)) {
92
- item.release();
93
- contenders.delete(item);
94
- }
95
- }
96
- failure = undefined;
86
+ pool.evict(info.pid);
87
+ pool.recruitNow();
97
88
  timeouts = undefined;
98
- lastSpawn = Date.now() - spawnDelay;
99
89
  }
100
90
  } else
101
91
  timeouts = undefined;
102
92
  if (service2 !== undefined) {
103
- spawnDelay = timing.spawnDelay;
93
+ pool.serviceAnswered();
104
94
  const versionMatches = matchesVersion2(service2.version, options);
105
95
  const compatible = service2.compatible && versionMatches;
106
96
  if (!service2.compatible && versionMatches)
@@ -120,37 +110,23 @@ var ensure = Effect.fn("service.ensure")(function* (options = {}) {
120
110
  file: options.file,
121
111
  pty: service2.state === "ready" ? "handoff" : "clear"
122
112
  }).pipe(Effect.ignore);
123
- for (const item of contenders) {
124
- if (item.child.pid === service2.info.pid || contenderFinished2(item)) {
125
- item.release();
126
- contenders.delete(item);
127
- }
128
- }
129
- failure = undefined;
130
- lastSpawn = 0;
113
+ pool.evict(service2.info.pid);
131
114
  return Option.none();
132
- } else if (lastSpawn === 0 && info !== undefined)
133
- lastSpawn = Date.now();
134
- const finished = [...contenders].filter(contenderFinished2);
135
- failure ??= finished.map(contenderFailure2).find((error) => error !== undefined);
136
- if (finished.some((item) => item.child.exitCode === 0)) {
137
- spawnDelay = Math.min(spawnDelay * 2, timing.maxSpawnDelay);
138
115
  }
139
- finished.forEach((item) => contenders.delete(item));
140
- if (failure !== undefined && contenders.size === 0)
141
- return yield* Effect.fail(failure);
142
- if (failure === undefined && contenders.size < 2 && Date.now() - lastSpawn >= spawnDelay) {
116
+ const failed = pool.reap();
117
+ if (failed !== undefined)
118
+ return yield* Effect.fail(failed);
119
+ if (pool.shouldRecruit(info !== undefined)) {
143
120
  yield* announce("missing");
144
- contenders.add(yield* spawnContender);
145
- lastSpawn = Date.now();
121
+ pool.add(yield* spawnContender);
146
122
  }
147
123
  return Option.none();
148
124
  }).pipe(Effect.repeat({
149
125
  until: Option.isSome,
150
126
  schedule: Schedule.spaced(timing.pollInterval).pipe(Schedule.upTo({ duration: timing.promiseTimeout }))
151
- }), Effect.ensuring(Effect.sync(() => contenders.forEach((contender) => contender.release()))));
127
+ }), Effect.ensuring(Effect.sync(() => pool.releaseAll())));
152
128
  if (Option.isNone(found))
153
- return yield* Effect.fail(failure ?? new Error("Timed out waiting for the background service to start"));
129
+ return yield* Effect.fail(pool.failure() ?? new Error("Timed out waiting for the background service to start"));
154
130
  return found.value.endpoint;
155
131
  });
156
132
  var stop = Effect.fn("service.stop")(function* (options = {}) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  make2,
3
3
  exports_client
4
- } from "../chunks/pty-handoff-9n602qx4.js";
5
- import"../chunks/pty-handoff-1y4a697q.js";
6
- import"../chunks/pty-handoff-vyas3vgt.js";
7
- import"../chunks/pty-handoff-qzsnm4q8.js";
8
- import"../chunks/pty-handoff-vt9jbch8.js";
9
- import"../chunks/pty-handoff-js54wxgp.js";
10
- import"../chunks/pty-handoff-frbwqjmf.js";
4
+ } from "../chunks/service-mdvk8mfx.js";
5
+ import"../chunks/service-1y4a697q.js";
6
+ import"../chunks/service-vyas3vgt.js";
7
+ import"../chunks/service-vt9jbch8.js";
8
+ import"../chunks/service-qzsnm4q8.js";
9
+ import"../chunks/service-js54wxgp.js";
10
+ import"../chunks/service-frbwqjmf.js";
11
11
  export {
12
12
  exports_client as OpenCode,
13
13
  make2 as make
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ClientError2
3
- } from "../../chunks/pty-handoff-js54wxgp.js";
3
+ } from "../../chunks/service-js54wxgp.js";
4
4
  export {
5
5
  ClientError2 as ClientError
6
6
  };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  make3
3
- } from "../../chunks/pty-handoff-qzsnm4q8.js";
4
- import"../../chunks/pty-handoff-js54wxgp.js";
3
+ } from "../../chunks/service-qzsnm4q8.js";
4
+ import"../../chunks/service-js54wxgp.js";
5
5
  export {
6
6
  make3 as make
7
7
  };
@@ -1,7 +1,4 @@
1
- import"../../chunks/pty-handoff-vyas3vgt.js";
2
- import {
3
- exports_client2
4
- } from "../../chunks/pty-handoff-qzsnm4q8.js";
1
+ import"../../chunks/service-vyas3vgt.js";
5
2
  import {
6
3
  isInvalidRequestError2,
7
4
  isUnauthorizedError2,
@@ -36,10 +33,13 @@ import {
36
33
  isShellNotFoundError2,
37
34
  isWorktreeError2,
38
35
  isVcsInitNotSupportedError2
39
- } from "../../chunks/pty-handoff-vt9jbch8.js";
36
+ } from "../../chunks/service-vt9jbch8.js";
37
+ import {
38
+ exports_client2
39
+ } from "../../chunks/service-qzsnm4q8.js";
40
40
  import {
41
41
  ClientError2
42
- } from "../../chunks/pty-handoff-js54wxgp.js";
42
+ } from "../../chunks/service-js54wxgp.js";
43
43
  export {
44
44
  ClientError2 as ClientError,
45
45
  exports_client2 as OpenCode,
@@ -32,7 +32,7 @@ import {
32
32
  isShellNotFoundError2,
33
33
  isWorktreeError2,
34
34
  isVcsInitNotSupportedError2
35
- } from "../../chunks/pty-handoff-vt9jbch8.js";
35
+ } from "../../chunks/service-vt9jbch8.js";
36
36
  export {
37
37
  isAgentNotFoundError2 as isAgentNotFoundError,
38
38
  isCommandExecutionError2 as isCommandExecutionError,
@@ -1,10 +1,9 @@
1
- import"../chunks/pty-handoff-m2eywc8w.js";
1
+ import"../chunks/service-m2eywc8w.js";
2
2
  import {
3
3
  exports_client
4
- } from "../chunks/pty-handoff-9n602qx4.js";
5
- import"../chunks/pty-handoff-1y4a697q.js";
6
- import"../chunks/pty-handoff-vyas3vgt.js";
7
- import"../chunks/pty-handoff-qzsnm4q8.js";
4
+ } from "../chunks/service-mdvk8mfx.js";
5
+ import"../chunks/service-1y4a697q.js";
6
+ import"../chunks/service-vyas3vgt.js";
8
7
  import {
9
8
  isInvalidRequestError2,
10
9
  isUnauthorizedError2,
@@ -39,11 +38,12 @@ import {
39
38
  isShellNotFoundError2,
40
39
  isWorktreeError2,
41
40
  isVcsInitNotSupportedError2
42
- } from "../chunks/pty-handoff-vt9jbch8.js";
41
+ } from "../chunks/service-vt9jbch8.js";
42
+ import"../chunks/service-qzsnm4q8.js";
43
43
  import {
44
44
  ClientError2
45
- } from "../chunks/pty-handoff-js54wxgp.js";
46
- import"../chunks/pty-handoff-frbwqjmf.js";
45
+ } from "../chunks/service-js54wxgp.js";
46
+ import"../chunks/service-frbwqjmf.js";
47
47
  export {
48
48
  ClientError2 as ClientError,
49
49
  exports_client as OpenCode,
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  makeRpc2
3
- } from "../chunks/pty-handoff-1y4a697q.js";
4
- import"../chunks/pty-handoff-vt9jbch8.js";
3
+ } from "../chunks/service-1y4a697q.js";
4
+ import"../chunks/service-vt9jbch8.js";
5
5
  export {
6
6
  makeRpc2 as makeRpc
7
7
  };
@@ -1,28 +1,27 @@
1
1
  import {
2
2
  spawnServiceContender2,
3
- contenderFailure2,
4
- contenderFinished2
5
- } from "../chunks/pty-handoff-6f43cgzz.js";
3
+ contenderPool2
4
+ } from "../chunks/service-ve4aws36.js";
6
5
  import {
7
6
  defaultEnsureTiming2,
8
7
  ensureTiming2
9
- } from "../chunks/pty-handoff-xgnj2w4v.js";
8
+ } from "../chunks/service-xgnj2w4v.js";
10
9
  import {
11
10
  matchesVersion2
12
- } from "../chunks/pty-handoff-sxt88q69.js";
11
+ } from "../chunks/service-sxt88q69.js";
13
12
  import {
14
13
  prepare2,
15
14
  environment2,
16
15
  complete2,
17
16
  clear2
18
- } from "../chunks/pty-handoff-1cypz8nb.js";
17
+ } from "../chunks/service-ve21qz3j.js";
19
18
  import {
20
19
  fallback2,
21
20
  same2,
22
21
  probeResult2,
23
22
  headers2
24
- } from "../chunks/pty-handoff-ank0d71z.js";
25
- import"../chunks/pty-handoff-qav6mfdz.js";
23
+ } from "../chunks/service-ank0d71z.js";
24
+ import"../chunks/service-qav6mfdz.js";
26
25
 
27
26
  // src/promise/service.ts
28
27
  import { readFile, rm } from "node:fs/promises";
@@ -39,12 +38,9 @@ async function discover(options = {}) {
39
38
  async function ensure(options = {}) {
40
39
  const timing = ensureTiming2(options);
41
40
  const deadline = Date.now() + timing.promiseTimeout;
42
- const contenders = new Set;
41
+ const pool = contenderPool2(timing);
43
42
  let timeouts;
44
43
  let announced = false;
45
- let lastSpawn = 0;
46
- let spawnDelay = timing.spawnDelay;
47
- let failure;
48
44
  const announce = (reason, previousVersion) => {
49
45
  if (announced)
50
46
  return;
@@ -64,7 +60,7 @@ async function ensure(options = {}) {
64
60
  try {
65
61
  while (true) {
66
62
  if (Date.now() >= deadline)
67
- throw failure ?? new Error("Timed out waiting for the background service to start");
63
+ throw pool.failure() ?? new Error("Timed out waiting for the background service to start");
68
64
  const registration = await registered(options.file, timing.requestTimeout);
69
65
  if (registration.timedOut && registration.info !== undefined) {
70
66
  timeouts = {
@@ -76,20 +72,14 @@ async function ensure(options = {}) {
76
72
  console.warn("Background service is unresponsive; recovery cannot preserve persistent terminals");
77
73
  await clear2(options.file ?? fallback2());
78
74
  await terminate(registration.info, options, timing);
79
- for (const item of contenders) {
80
- if (item.child.pid === registration.info.pid || contenderFinished2(item)) {
81
- item.release();
82
- contenders.delete(item);
83
- }
84
- }
85
- failure = undefined;
75
+ pool.evict(registration.info.pid);
76
+ pool.recruitNow();
86
77
  timeouts = undefined;
87
- lastSpawn = Date.now() - spawnDelay;
88
78
  }
89
79
  } else
90
80
  timeouts = undefined;
91
81
  if (registration.service !== undefined) {
92
- spawnDelay = timing.spawnDelay;
82
+ pool.serviceAnswered();
93
83
  const service2 = registration.service;
94
84
  const versionMatches = matchesVersion2(service2.version, options);
95
85
  const compatible = service2.compatible && versionMatches;
@@ -111,36 +101,21 @@ async function ensure(options = {}) {
111
101
  }).catch(() => {
112
102
  return;
113
103
  });
114
- for (const item of contenders) {
115
- if (item.child.pid === service2.info.pid || contenderFinished2(item)) {
116
- item.release();
117
- contenders.delete(item);
118
- }
119
- }
120
- failure = undefined;
121
- lastSpawn = 0;
104
+ pool.evict(service2.info.pid);
122
105
  }
123
106
  } else {
124
- if (lastSpawn === 0 && registration.info !== undefined)
125
- lastSpawn = Date.now();
126
- const finished = [...contenders].filter(contenderFinished2);
127
- failure ??= finished.map(contenderFailure2).find((error) => error !== undefined);
128
- if (finished.some((item) => item.child.exitCode === 0)) {
129
- spawnDelay = Math.min(spawnDelay * 2, timing.maxSpawnDelay);
130
- }
131
- finished.forEach((item) => contenders.delete(item));
132
- if (failure !== undefined && contenders.size === 0)
133
- throw failure;
134
- if (failure === undefined && contenders.size < 2 && Date.now() - lastSpawn >= spawnDelay) {
107
+ const failed = pool.reap();
108
+ if (failed !== undefined)
109
+ throw failed;
110
+ if (pool.shouldRecruit(registration.info !== undefined)) {
135
111
  announce("missing");
136
- contenders.add(await spawnContender());
137
- lastSpawn = Date.now();
112
+ pool.add(await spawnContender());
138
113
  }
139
114
  }
140
115
  await delay(timing.pollInterval);
141
116
  }
142
117
  } finally {
143
- contenders.forEach((contender) => contender.release());
118
+ pool.releaseAll();
144
119
  }
145
120
  }
146
121
  async function stop(options = {}) {
@@ -4,7 +4,7 @@ import {
4
4
  complete2,
5
5
  clear2,
6
6
  exports_pty_handoff
7
- } from "./chunks/pty-handoff-1cypz8nb.js";
7
+ } from "./chunks/service-ve21qz3j.js";
8
8
  export {
9
9
  exports_pty_handoff as PtyHandoff,
10
10
  clear2 as clear,
@@ -4,7 +4,7 @@ import {
4
4
  event2,
5
5
  eventType2,
6
6
  exports_rpc_runtime
7
- } from "./chunks/pty-handoff-t1xa31vm.js";
7
+ } from "./chunks/service-t1xa31vm.js";
8
8
  export {
9
9
  exports_rpc_runtime as RpcRuntime,
10
10
  event2 as event,
@@ -1,4 +1,5 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
+ import type { EnsureTiming } from "./service-timing.js";
2
3
  export type ServiceContender = {
3
4
  readonly child: ChildProcess;
4
5
  readonly error: () => Error | undefined;
@@ -7,5 +8,30 @@ export type ServiceContender = {
7
8
  readonly release: () => void;
8
9
  };
9
10
  export declare function spawnServiceContender(command: string, args: ReadonlyArray<string>, env?: Readonly<Record<string, string | undefined>>): ServiceContender;
10
- export declare function contenderFailure(contender: ServiceContender): Error | undefined;
11
+ /**
12
+ * The startup attempts of one `ensure()` call. It keeps at most two attempts alive, remembers
13
+ * the first startup failure, and backs off when attempts exit cleanly because another one won.
14
+ */
15
+ export declare function contenderPool(timing: EnsureTiming): {
16
+ /** The first startup failure seen since the last eviction. */
17
+ failure: () => Error | undefined;
18
+ /** A registered service answered, so the next attempt waits the base delay again. */
19
+ serviceAnswered(): void;
20
+ /**
21
+ * The owner `pid` was replaced. Drop its attempt and any finished ones, forget their
22
+ * failure, and restart the spawn clock.
23
+ */
24
+ evict(pid: number): void;
25
+ /** Let the next attempt start without waiting a spawn delay. */
26
+ recruitNow(): void;
27
+ /** Collect finished attempts. Returns the startup failure once no attempt is left alive. */
28
+ reap(): Error | undefined;
29
+ /**
30
+ * Whether to start another attempt now. A registration that has not answered yet gets one
31
+ * spawn delay before an attempt competes with it.
32
+ */
33
+ shouldRecruit(registered: boolean): boolean;
34
+ add(contender: ServiceContender): void;
35
+ releaseAll(): void;
36
+ };
11
37
  export declare function contenderFinished(contender: ServiceContender): boolean;
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  spawnServiceContender2,
3
- contenderFailure2,
3
+ contenderPool2,
4
4
  contenderFinished2
5
- } from "./chunks/pty-handoff-6f43cgzz.js";
5
+ } from "./chunks/service-ve4aws36.js";
6
6
  export {
7
- contenderFailure2 as contenderFailure,
8
7
  contenderFinished2 as contenderFinished,
8
+ contenderPool2 as contenderPool,
9
9
  spawnServiceContender2 as spawnServiceContender
10
10
  };
@@ -3,8 +3,8 @@ import {
3
3
  same2,
4
4
  probeResult2,
5
5
  headers2
6
- } from "./chunks/pty-handoff-ank0d71z.js";
7
- import"./chunks/pty-handoff-xgnj2w4v.js";
6
+ } from "./chunks/service-ank0d71z.js";
7
+ import"./chunks/service-xgnj2w4v.js";
8
8
  export {
9
9
  fallback2 as fallback,
10
10
  headers2 as headers,
@@ -2,7 +2,7 @@ import {
2
2
  defaultEnsureTiming2,
3
3
  ensureTiming2,
4
4
  withEnsureTiming2
5
- } from "./chunks/pty-handoff-xgnj2w4v.js";
5
+ } from "./chunks/service-xgnj2w4v.js";
6
6
  export {
7
7
  defaultEnsureTiming2 as defaultEnsureTiming,
8
8
  ensureTiming2 as ensureTiming,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  matchesVersion2
3
- } from "./chunks/pty-handoff-sxt88q69.js";
3
+ } from "./chunks/service-sxt88q69.js";
4
4
  export {
5
5
  matchesVersion2 as matchesVersion
6
6
  };
package/dist/service.js CHANGED
@@ -1 +1 @@
1
- import"./chunks/pty-handoff-qav6mfdz.js";
1
+ import"./chunks/service-qav6mfdz.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  make7,
3
3
  exports_shared_events
4
- } from "./chunks/pty-handoff-frbwqjmf.js";
4
+ } from "./chunks/service-frbwqjmf.js";
5
5
  export {
6
6
  exports_shared_events as SharedEvents,
7
7
  make7 as make
@@ -2,7 +2,7 @@ import {
2
2
  defaultIdleTimeout2,
3
3
  foregroundIdleThreshold2,
4
4
  createClientConnection2
5
- } from "../chunks/pty-handoff-ydhz1zrh.js";
5
+ } from "../chunks/service-ydhz1zrh.js";
6
6
  export {
7
7
  createClientConnection2 as createClientConnection,
8
8
  defaultIdleTimeout2 as defaultIdleTimeout,
@@ -2,15 +2,15 @@ import {
2
2
  settleMs2,
3
3
  locationKey2,
4
4
  createData2
5
- } from "../chunks/pty-handoff-e5ea35j7.js";
6
- import"../chunks/pty-handoff-m2eywc8w.js";
7
- import"../chunks/pty-handoff-9n602qx4.js";
8
- import"../chunks/pty-handoff-1y4a697q.js";
9
- import"../chunks/pty-handoff-vyas3vgt.js";
10
- import"../chunks/pty-handoff-qzsnm4q8.js";
11
- import"../chunks/pty-handoff-vt9jbch8.js";
12
- import"../chunks/pty-handoff-js54wxgp.js";
13
- import"../chunks/pty-handoff-frbwqjmf.js";
5
+ } from "../chunks/service-e5ea35j7.js";
6
+ import"../chunks/service-m2eywc8w.js";
7
+ import"../chunks/service-mdvk8mfx.js";
8
+ import"../chunks/service-1y4a697q.js";
9
+ import"../chunks/service-vyas3vgt.js";
10
+ import"../chunks/service-vt9jbch8.js";
11
+ import"../chunks/service-qzsnm4q8.js";
12
+ import"../chunks/service-js54wxgp.js";
13
+ import"../chunks/service-frbwqjmf.js";
14
14
  export {
15
15
  createData2 as createData,
16
16
  locationKey2 as locationKey,
@@ -1,25 +1,25 @@
1
- import"../chunks/pty-handoff-js54wxgp.js";
2
- import"../chunks/pty-handoff-qzsnm4q8.js";
3
- import"../chunks/pty-handoff-vt9jbch8.js";
4
- import"../chunks/pty-handoff-vyas3vgt.js";
5
- import"../chunks/pty-handoff-frbwqjmf.js";
6
- import"../chunks/pty-handoff-1y4a697q.js";
7
- import"../chunks/pty-handoff-9n602qx4.js";
8
- import"../chunks/pty-handoff-m2eywc8w.js";
1
+ import"../chunks/service-js54wxgp.js";
2
+ import"../chunks/service-qzsnm4q8.js";
3
+ import"../chunks/service-vt9jbch8.js";
4
+ import"../chunks/service-vyas3vgt.js";
5
+ import"../chunks/service-frbwqjmf.js";
6
+ import"../chunks/service-1y4a697q.js";
7
+ import"../chunks/service-mdvk8mfx.js";
8
+ import"../chunks/service-m2eywc8w.js";
9
9
  import {
10
10
  settleMs2,
11
11
  locationKey2,
12
12
  createData2
13
- } from "../chunks/pty-handoff-e5ea35j7.js";
13
+ } from "../chunks/service-e5ea35j7.js";
14
14
  import {
15
15
  defaultIdleTimeout2,
16
16
  foregroundIdleThreshold2,
17
17
  createClientConnection2
18
- } from "../chunks/pty-handoff-ydhz1zrh.js";
18
+ } from "../chunks/service-ydhz1zrh.js";
19
19
  import {
20
20
  createPtyClient2,
21
21
  createPersistentPtyClient2
22
- } from "../chunks/pty-handoff-gne7h7mq.js";
22
+ } from "../chunks/service-gne7h7mq.js";
23
23
  export {
24
24
  createClientConnection2 as createClientConnection,
25
25
  createData2 as createData,
package/dist/solid/pty.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createPtyClient2,
3
3
  createPersistentPtyClient2
4
- } from "../chunks/pty-handoff-gne7h7mq.js";
4
+ } from "../chunks/service-gne7h7mq.js";
5
5
  export {
6
6
  createPersistentPtyClient2 as createPersistentPtyClient,
7
7
  createPtyClient2 as createPtyClient
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@opencode/client",
4
- "version": "0.0.0-dev-20573",
4
+ "version": "0.0.0-dev-20577",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -57,8 +57,8 @@
57
57
  "typecheck": "tsgo --noEmit"
58
58
  },
59
59
  "dependencies": {
60
- "@opencode/schema": "0.0.0-dev-20573",
61
- "@opencode/protocol": "0.0.0-dev-20573"
60
+ "@opencode/schema": "0.0.0-dev-20577",
61
+ "@opencode/protocol": "0.0.0-dev-20577"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "effect": "4.0.0-rc.112",
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "devDependencies": {
76
76
  "@effect/platform-node": "4.0.0-rc.112",
77
- "@opencode/httpapi-codegen": "0.0.0-dev-20573",
77
+ "@opencode/httpapi-codegen": "0.0.0-dev-20577",
78
78
  "@tsconfig/bun": "1.0.9",
79
79
  "@types/bun": "1.4.0",
80
80
  "@typescript/native-preview": "7.0.0-dev.20251207.1",