@aicalas/loopy 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/adapters.d.ts +111 -0
  4. package/dist/adapters.d.ts.map +1 -0
  5. package/dist/adapters.js +27 -0
  6. package/dist/adapters.js.map +1 -0
  7. package/dist/attention/github.d.ts +57 -0
  8. package/dist/attention/github.d.ts.map +1 -0
  9. package/dist/attention/github.js +162 -0
  10. package/dist/attention/github.js.map +1 -0
  11. package/dist/authoring/attention-config.d.ts +16 -0
  12. package/dist/authoring/attention-config.d.ts.map +1 -0
  13. package/dist/authoring/attention-config.js +19 -0
  14. package/dist/authoring/attention-config.js.map +1 -0
  15. package/dist/authoring/channel-config.d.ts +16 -0
  16. package/dist/authoring/channel-config.d.ts.map +1 -0
  17. package/dist/authoring/channel-config.js +16 -0
  18. package/dist/authoring/channel-config.js.map +1 -0
  19. package/dist/authoring/define.d.ts +13 -0
  20. package/dist/authoring/define.d.ts.map +1 -0
  21. package/dist/authoring/define.js +13 -0
  22. package/dist/authoring/define.js.map +1 -0
  23. package/dist/authoring/effect-config.d.ts +16 -0
  24. package/dist/authoring/effect-config.d.ts.map +1 -0
  25. package/dist/authoring/effect-config.js +17 -0
  26. package/dist/authoring/effect-config.js.map +1 -0
  27. package/dist/authoring/harness-config.d.ts +30 -0
  28. package/dist/authoring/harness-config.d.ts.map +1 -0
  29. package/dist/authoring/harness-config.js +36 -0
  30. package/dist/authoring/harness-config.js.map +1 -0
  31. package/dist/authoring/index.d.ts +10 -0
  32. package/dist/authoring/index.d.ts.map +1 -0
  33. package/dist/authoring/index.js +9 -0
  34. package/dist/authoring/index.js.map +1 -0
  35. package/dist/authoring/schema.d.ts +9 -0
  36. package/dist/authoring/schema.d.ts.map +1 -0
  37. package/dist/authoring/schema.js +28 -0
  38. package/dist/authoring/schema.js.map +1 -0
  39. package/dist/authoring/types.d.ts +115 -0
  40. package/dist/authoring/types.d.ts.map +1 -0
  41. package/dist/authoring/types.js +2 -0
  42. package/dist/authoring/types.js.map +1 -0
  43. package/dist/authoring/watcher-config.d.ts +33 -0
  44. package/dist/authoring/watcher-config.d.ts.map +1 -0
  45. package/dist/authoring/watcher-config.js +61 -0
  46. package/dist/authoring/watcher-config.js.map +1 -0
  47. package/dist/build/discover.d.ts +34 -0
  48. package/dist/build/discover.d.ts.map +1 -0
  49. package/dist/build/discover.js +165 -0
  50. package/dist/build/discover.js.map +1 -0
  51. package/dist/build/identity.d.ts +9 -0
  52. package/dist/build/identity.d.ts.map +1 -0
  53. package/dist/build/identity.js +0 -0
  54. package/dist/build/identity.js.map +1 -0
  55. package/dist/channels/github.d.ts +14 -0
  56. package/dist/channels/github.d.ts.map +1 -0
  57. package/dist/channels/github.js +118 -0
  58. package/dist/channels/github.js.map +1 -0
  59. package/dist/channels/index.d.ts +2 -0
  60. package/dist/channels/index.d.ts.map +1 -0
  61. package/dist/channels/index.js +2 -0
  62. package/dist/channels/index.js.map +1 -0
  63. package/dist/cli-help.d.ts +23 -0
  64. package/dist/cli-help.d.ts.map +1 -0
  65. package/dist/cli-help.js +186 -0
  66. package/dist/cli-help.js.map +1 -0
  67. package/dist/cli.d.ts +37 -0
  68. package/dist/cli.d.ts.map +1 -0
  69. package/dist/cli.js +385 -0
  70. package/dist/cli.js.map +1 -0
  71. package/dist/config.d.ts +71 -0
  72. package/dist/config.d.ts.map +1 -0
  73. package/dist/config.js +426 -0
  74. package/dist/config.js.map +1 -0
  75. package/dist/core/calls.d.ts +67 -0
  76. package/dist/core/calls.d.ts.map +1 -0
  77. package/dist/core/calls.js +109 -0
  78. package/dist/core/calls.js.map +1 -0
  79. package/dist/core/identifiers.d.ts +24 -0
  80. package/dist/core/identifiers.d.ts.map +1 -0
  81. package/dist/core/identifiers.js +129 -0
  82. package/dist/core/identifiers.js.map +1 -0
  83. package/dist/core/prompt.d.ts +5 -0
  84. package/dist/core/prompt.d.ts.map +1 -0
  85. package/dist/core/prompt.js +47 -0
  86. package/dist/core/prompt.js.map +1 -0
  87. package/dist/core/reconcile.d.ts +27 -0
  88. package/dist/core/reconcile.d.ts.map +1 -0
  89. package/dist/core/reconcile.js +36 -0
  90. package/dist/core/reconcile.js.map +1 -0
  91. package/dist/core/wire.d.ts +332 -0
  92. package/dist/core/wire.d.ts.map +1 -0
  93. package/dist/core/wire.js +543 -0
  94. package/dist/core/wire.js.map +1 -0
  95. package/dist/emitters/github.d.ts +15 -0
  96. package/dist/emitters/github.d.ts.map +1 -0
  97. package/dist/emitters/github.js +43 -0
  98. package/dist/emitters/github.js.map +1 -0
  99. package/dist/emitters/index.d.ts +2 -0
  100. package/dist/emitters/index.d.ts.map +1 -0
  101. package/dist/emitters/index.js +2 -0
  102. package/dist/emitters/index.js.map +1 -0
  103. package/dist/git.d.ts +17 -0
  104. package/dist/git.d.ts.map +1 -0
  105. package/dist/git.js +122 -0
  106. package/dist/git.js.map +1 -0
  107. package/dist/github/client.d.ts +53 -0
  108. package/dist/github/client.d.ts.map +1 -0
  109. package/dist/github/client.js +169 -0
  110. package/dist/github/client.js.map +1 -0
  111. package/dist/github/trigger.d.ts +12 -0
  112. package/dist/github/trigger.d.ts.map +1 -0
  113. package/dist/github/trigger.js +21 -0
  114. package/dist/github/trigger.js.map +1 -0
  115. package/dist/github/writes.d.ts +4 -0
  116. package/dist/github/writes.d.ts.map +1 -0
  117. package/dist/github/writes.js +21 -0
  118. package/dist/github/writes.js.map +1 -0
  119. package/dist/harnesses/base.d.ts +41 -0
  120. package/dist/harnesses/base.d.ts.map +1 -0
  121. package/dist/harnesses/base.js +182 -0
  122. package/dist/harnesses/base.js.map +1 -0
  123. package/dist/harnesses/claude-executable.d.ts +42 -0
  124. package/dist/harnesses/claude-executable.d.ts.map +1 -0
  125. package/dist/harnesses/claude-executable.js +138 -0
  126. package/dist/harnesses/claude-executable.js.map +1 -0
  127. package/dist/harnesses/claude.d.ts +35 -0
  128. package/dist/harnesses/claude.d.ts.map +1 -0
  129. package/dist/harnesses/claude.js +160 -0
  130. package/dist/harnesses/claude.js.map +1 -0
  131. package/dist/harnesses/codex.d.ts +40 -0
  132. package/dist/harnesses/codex.d.ts.map +1 -0
  133. package/dist/harnesses/codex.js +118 -0
  134. package/dist/harnesses/codex.js.map +1 -0
  135. package/dist/harnesses/index.d.ts +2 -0
  136. package/dist/harnesses/index.d.ts.map +1 -0
  137. package/dist/harnesses/index.js +2 -0
  138. package/dist/harnesses/index.js.map +1 -0
  139. package/dist/harnesses/opencode.d.ts +33 -0
  140. package/dist/harnesses/opencode.d.ts.map +1 -0
  141. package/dist/harnesses/opencode.js +203 -0
  142. package/dist/harnesses/opencode.js.map +1 -0
  143. package/dist/identifiers.d.ts +26 -0
  144. package/dist/identifiers.d.ts.map +1 -0
  145. package/dist/identifiers.js +62 -0
  146. package/dist/identifiers.js.map +1 -0
  147. package/dist/index.d.ts +10 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +10 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/log.d.ts +10 -0
  152. package/dist/log.d.ts.map +1 -0
  153. package/dist/log.js +44 -0
  154. package/dist/log.js.map +1 -0
  155. package/dist/settings.d.ts +43 -0
  156. package/dist/settings.d.ts.map +1 -0
  157. package/dist/settings.js +128 -0
  158. package/dist/settings.js.map +1 -0
  159. package/dist/temporal/activities.d.ts +57 -0
  160. package/dist/temporal/activities.d.ts.map +1 -0
  161. package/dist/temporal/activities.js +366 -0
  162. package/dist/temporal/activities.js.map +1 -0
  163. package/dist/temporal/answers.d.ts +48 -0
  164. package/dist/temporal/answers.d.ts.map +1 -0
  165. package/dist/temporal/answers.js +78 -0
  166. package/dist/temporal/answers.js.map +1 -0
  167. package/dist/temporal/client.d.ts +13 -0
  168. package/dist/temporal/client.d.ts.map +1 -0
  169. package/dist/temporal/client.js +20 -0
  170. package/dist/temporal/client.js.map +1 -0
  171. package/dist/temporal/contracts.d.ts +19 -0
  172. package/dist/temporal/contracts.d.ts.map +1 -0
  173. package/dist/temporal/contracts.js +22 -0
  174. package/dist/temporal/contracts.js.map +1 -0
  175. package/dist/temporal/drain.d.ts +19 -0
  176. package/dist/temporal/drain.d.ts.map +1 -0
  177. package/dist/temporal/drain.js +109 -0
  178. package/dist/temporal/drain.js.map +1 -0
  179. package/dist/temporal/executions.d.ts +18 -0
  180. package/dist/temporal/executions.d.ts.map +1 -0
  181. package/dist/temporal/executions.js +15 -0
  182. package/dist/temporal/executions.js.map +1 -0
  183. package/dist/temporal/handle.d.ts +39 -0
  184. package/dist/temporal/handle.d.ts.map +1 -0
  185. package/dist/temporal/handle.js +95 -0
  186. package/dist/temporal/handle.js.map +1 -0
  187. package/dist/temporal/history.d.ts +75 -0
  188. package/dist/temporal/history.d.ts.map +1 -0
  189. package/dist/temporal/history.js +310 -0
  190. package/dist/temporal/history.js.map +1 -0
  191. package/dist/temporal/observe.d.ts +85 -0
  192. package/dist/temporal/observe.d.ts.map +1 -0
  193. package/dist/temporal/observe.js +110 -0
  194. package/dist/temporal/observe.js.map +1 -0
  195. package/dist/temporal/schedules.d.ts +26 -0
  196. package/dist/temporal/schedules.d.ts.map +1 -0
  197. package/dist/temporal/schedules.js +200 -0
  198. package/dist/temporal/schedules.js.map +1 -0
  199. package/dist/temporal/status.d.ts +63 -0
  200. package/dist/temporal/status.d.ts.map +1 -0
  201. package/dist/temporal/status.js +153 -0
  202. package/dist/temporal/status.js.map +1 -0
  203. package/dist/temporal/stuck.d.ts +58 -0
  204. package/dist/temporal/stuck.d.ts.map +1 -0
  205. package/dist/temporal/stuck.js +53 -0
  206. package/dist/temporal/stuck.js.map +1 -0
  207. package/dist/temporal/supervisor.d.ts +11 -0
  208. package/dist/temporal/supervisor.d.ts.map +1 -0
  209. package/dist/temporal/supervisor.js +506 -0
  210. package/dist/temporal/supervisor.js.map +1 -0
  211. package/dist/temporal/worker.d.ts +21 -0
  212. package/dist/temporal/worker.d.ts.map +1 -0
  213. package/dist/temporal/worker.js +82 -0
  214. package/dist/temporal/worker.js.map +1 -0
  215. package/dist/temporal/workflow-bundle.js +12742 -0
  216. package/dist/temporal/workflows.d.ts +9 -0
  217. package/dist/temporal/workflows.d.ts.map +1 -0
  218. package/dist/temporal/workflows.js +144 -0
  219. package/dist/temporal/workflows.js.map +1 -0
  220. package/dist/version.d.ts +2 -0
  221. package/dist/version.d.ts.map +1 -0
  222. package/dist/version.js +2 -0
  223. package/dist/version.js.map +1 -0
  224. package/dist/watchers/base.d.ts +4 -0
  225. package/dist/watchers/base.d.ts.map +1 -0
  226. package/dist/watchers/base.js +7 -0
  227. package/dist/watchers/base.js.map +1 -0
  228. package/dist/watchers/github/client.d.ts +52 -0
  229. package/dist/watchers/github/client.d.ts.map +1 -0
  230. package/dist/watchers/github/client.js +165 -0
  231. package/dist/watchers/github/client.js.map +1 -0
  232. package/dist/watchers/github/index.d.ts +19 -0
  233. package/dist/watchers/github/index.d.ts.map +1 -0
  234. package/dist/watchers/github/index.js +83 -0
  235. package/dist/watchers/github/index.js.map +1 -0
  236. package/dist/watchers/index.d.ts +2 -0
  237. package/dist/watchers/index.d.ts.map +1 -0
  238. package/dist/watchers/index.js +2 -0
  239. package/dist/watchers/index.js.map +1 -0
  240. package/dist/worker-lock.d.ts +11 -0
  241. package/dist/worker-lock.d.ts.map +1 -0
  242. package/dist/worker-lock.js +53 -0
  243. package/dist/worker-lock.js.map +1 -0
  244. package/package.json +92 -0
@@ -0,0 +1,118 @@
1
+ import { Codex, } from "@openai/codex-sdk";
2
+ import { z } from "zod";
3
+ import { errorMessage, isAbortError, jsonObject, ProviderError, ValidatingHarness, } from "./base.js";
4
+ export const codexOptionsSchema = z
5
+ .object({
6
+ isolated: z.boolean().default(false),
7
+ sandbox: z.enum(["read-only", "workspace-write", "full-access"]).optional(),
8
+ approval_mode: z.enum(["deny_all", "auto_review"]).optional(),
9
+ model: z.string().min(1),
10
+ model_effort: z.enum(["none", "minimal", "low", "medium", "high", "xhigh"]),
11
+ })
12
+ .strict();
13
+ export class CodexHarness extends ValidatingHarness {
14
+ options;
15
+ clientFactory;
16
+ constructor(options,
17
+ /* istanbul ignore next -- production SDK wiring; tests inject a deterministic client */
18
+ clientFactory = () => new Codex()) {
19
+ super();
20
+ this.options = options;
21
+ this.clientFactory = clientFactory;
22
+ }
23
+ createAdapter(context) {
24
+ return new CodexAdapter(context, this.options, this.clientFactory);
25
+ }
26
+ }
27
+ class CodexAdapter {
28
+ sessionId;
29
+ thread;
30
+ activeController;
31
+ context;
32
+ options;
33
+ clientFactory;
34
+ constructor(context, options, clientFactory) {
35
+ this.context = context;
36
+ this.options = options;
37
+ this.clientFactory = clientFactory;
38
+ this.sessionId = context.resumeSessionId;
39
+ }
40
+ start(prompt, schema, signal) {
41
+ const threadOptions = { workingDirectory: this.context.workspace };
42
+ threadOptions.model = this.options.model;
43
+ if (this.options.model_effort !== "none") {
44
+ threadOptions.modelReasoningEffort = this.options.model_effort;
45
+ }
46
+ // Inherit ~/.codex/config.toml unless isolated; explicit options always win.
47
+ const sandbox = this.options.sandbox ?? (this.options.isolated ? "full-access" : undefined);
48
+ if (sandbox !== undefined) {
49
+ threadOptions.sandboxMode = sandbox === "full-access" ? "danger-full-access" : sandbox;
50
+ }
51
+ const approval = this.options.approval_mode ?? (this.options.isolated ? "deny_all" : undefined);
52
+ if (approval !== undefined) {
53
+ threadOptions.approvalPolicy = approval === "deny_all" ? "never" : "on-request";
54
+ }
55
+ const client = this.clientFactory();
56
+ const resume = this.context.resumeSessionId;
57
+ this.thread =
58
+ resume === undefined
59
+ ? client.startThread(threadOptions)
60
+ : client.resumeThread(resume, threadOptions);
61
+ return this.runTurn(prompt, schema, signal);
62
+ }
63
+ continue(prompt, schema, signal) {
64
+ /* istanbul ignore next -- correction is only requested after a turn on this thread */
65
+ if (this.thread === undefined)
66
+ throw new ProviderError("Codex thread was not started");
67
+ return this.runTurn(prompt, schema, signal);
68
+ }
69
+ async interrupt() {
70
+ this.activeController?.abort();
71
+ }
72
+ async close() {
73
+ this.activeController?.abort();
74
+ this.activeController = undefined;
75
+ this.thread = undefined;
76
+ }
77
+ async runTurn(prompt, schema, signal) {
78
+ /* istanbul ignore next -- start and continue establish the thread before dispatch */
79
+ if (this.thread === undefined)
80
+ throw new ProviderError("Codex thread was not started");
81
+ const controller = new AbortController();
82
+ this.activeController = controller;
83
+ const onAbort = () => controller.abort(signal?.reason);
84
+ signal?.addEventListener("abort", onAbort, { once: true });
85
+ let result;
86
+ try {
87
+ result = await this.thread.run(prompt, { outputSchema: schema, signal: controller.signal });
88
+ }
89
+ catch (error) {
90
+ if (controller.signal.aborted || signal?.aborted || isAbortError(error))
91
+ throw error;
92
+ throw new ProviderError(`Codex failed: ${errorMessage(error)}`.slice(0, 2_000), {
93
+ cause: error,
94
+ });
95
+ }
96
+ finally {
97
+ signal?.removeEventListener("abort", onAbort);
98
+ this.activeController = undefined;
99
+ }
100
+ const turn = { text: result.finalResponse };
101
+ if (this.thread.id !== null) {
102
+ this.sessionId = this.thread.id;
103
+ turn.sessionId = this.thread.id;
104
+ }
105
+ const usage = jsonObject(result.usage, "Codex usage");
106
+ if (usage !== undefined)
107
+ turn.usage = usage;
108
+ return turn;
109
+ }
110
+ }
111
+ export const codexHarnessSpec = {
112
+ name: "codex",
113
+ optionsSchema: codexOptionsSchema,
114
+ create(options) {
115
+ return new CodexHarness(codexOptionsSchema.parse(options));
116
+ },
117
+ };
118
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/harnesses/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./base.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./base.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import type { OpencodeClient } from "@opencode-ai/sdk/v2/client";
3
+ import { z } from "zod";
4
+ import type { HarnessContext, HarnessSpec } from "../adapters.js";
5
+ import { type Adapter, ValidatingHarness } from "./base.js";
6
+ export declare const MIN_OPENCODE_VERSION: readonly [1, 18, 3];
7
+ export declare const MIN_OPENCODE_VERSION_TEXT: string;
8
+ export declare const openCodeOptionsSchema: z.ZodObject<{
9
+ model: z.ZodString;
10
+ model_effort: z.ZodString;
11
+ }, z.core.$strict>;
12
+ export type OpenCodeOptions = z.infer<typeof openCodeOptionsSchema>;
13
+ interface OpenCodeRuntime {
14
+ client: OpencodeClient;
15
+ server: {
16
+ close(): void;
17
+ };
18
+ }
19
+ export type OpenCodeFactory = (options: {
20
+ hostname: string;
21
+ port: number;
22
+ signal: AbortSignal;
23
+ }) => Promise<OpenCodeRuntime>;
24
+ export declare class OpenCodeHarness extends ValidatingHarness {
25
+ readonly options: OpenCodeOptions;
26
+ private readonly factory;
27
+ constructor(options: OpenCodeOptions, factory?: OpenCodeFactory);
28
+ protected createAdapter(context: HarnessContext): Adapter;
29
+ }
30
+ export declare function checkOpenCodeVersion(run?: typeof spawnSync): string | undefined;
31
+ export declare const openCodeHarnessSpec: HarnessSpec;
32
+ export {};
33
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harnesses/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,KAAK,OAAO,EAMZ,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,oBAAoB,YAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAU,CAAC;AACxD,eAAO,MAAM,yBAAyB,QAAiC,CAAC;AAGxE,eAAO,MAAM,qBAAqB;;;kBAKvB,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,UAAU,eAAe;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE;QAAE,KAAK,IAAI,IAAI,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;CACrB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAE/B,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C,YACE,OAAO,EAAE,eAAe,EAExB,OAAO,GAAE,eAAmC,EAK7C;IAED,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAExD;CACF;AA4HD,wBAAgB,oBAAoB,CAElC,GAAG,GAAE,OAAO,SAAqB,GAChC,MAAM,GAAG,SAAS,CAuBpB;AA6BD,eAAO,MAAM,mBAAmB,EAAE,WAOjC,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createOpencode as createOpenCodeSdk } from "@opencode-ai/sdk/v2";
3
+ import { z } from "zod";
4
+ import { errorMessage, isAbortError, jsonObject, ProviderError, ValidatingHarness, } from "./base.js";
5
+ export const MIN_OPENCODE_VERSION = [1, 18, 3];
6
+ export const MIN_OPENCODE_VERSION_TEXT = MIN_OPENCODE_VERSION.join(".");
7
+ const VERSION_PATTERN = /(?<!\d)(\d+)\.(\d+)\.(\d+)(?!\d)/;
8
+ export const openCodeOptionsSchema = z
9
+ .object({
10
+ model: z.string().min(1),
11
+ model_effort: z.string().min(1),
12
+ })
13
+ .strict();
14
+ export class OpenCodeHarness extends ValidatingHarness {
15
+ options;
16
+ factory;
17
+ constructor(options,
18
+ /* istanbul ignore next -- production SDK wiring; tests inject an isolated fake server */
19
+ factory = createOpenCodeSdk) {
20
+ super();
21
+ this.options = options;
22
+ this.factory = factory;
23
+ }
24
+ createAdapter(context) {
25
+ return new OpenCodeAdapter(context, this.options, this.factory);
26
+ }
27
+ }
28
+ class OpenCodeAdapter {
29
+ sessionId;
30
+ runtime;
31
+ serverController;
32
+ activeController;
33
+ context;
34
+ options;
35
+ factory;
36
+ constructor(context, options, factory) {
37
+ this.context = context;
38
+ this.options = options;
39
+ this.factory = factory;
40
+ this.sessionId = context.resumeSessionId;
41
+ }
42
+ async start(prompt, schema, signal) {
43
+ this.serverController = new AbortController();
44
+ try {
45
+ this.runtime = await this.factory({
46
+ hostname: "127.0.0.1",
47
+ port: 0,
48
+ signal: this.serverController.signal,
49
+ });
50
+ // A session is a server-side record keyed by directory, so a resumed session survives the
51
+ // per-Activity server this adapter starts and stops.
52
+ if (this.sessionId === undefined) {
53
+ const created = await this.runtime.client.session.create({ directory: this.context.workspace, title: `loopy:${this.context.agentId}` }, { throwOnError: true });
54
+ this.sessionId = created.data.id;
55
+ }
56
+ return await this.prompt(prompt, schema, signal);
57
+ }
58
+ catch (error) {
59
+ if (signal?.aborted || isAbortError(error))
60
+ throw error;
61
+ if (error instanceof ProviderError)
62
+ throw error;
63
+ throw providerError("OpenCode startup failed", error);
64
+ }
65
+ }
66
+ continue(prompt, schema, signal) {
67
+ /* istanbul ignore next -- correction follows successful session creation */
68
+ if (this.sessionId === undefined) {
69
+ throw new ProviderError("OpenCode returned no session id for correction");
70
+ }
71
+ return this.prompt(prompt, schema, signal);
72
+ }
73
+ async interrupt() {
74
+ this.activeController?.abort();
75
+ if (this.runtime !== undefined && this.sessionId !== undefined) {
76
+ try {
77
+ await this.runtime.client.session.abort({ sessionID: this.sessionId, directory: this.context.workspace }, { throwOnError: true });
78
+ }
79
+ catch (error) {
80
+ if (!isAbortError(error))
81
+ throw providerError("OpenCode session abort failed", error);
82
+ }
83
+ }
84
+ }
85
+ async close() {
86
+ this.activeController?.abort();
87
+ this.activeController = undefined;
88
+ this.serverController?.abort();
89
+ this.runtime?.server.close();
90
+ this.runtime = undefined;
91
+ this.serverController = undefined;
92
+ }
93
+ async prompt(prompt, schema, signal) {
94
+ /* istanbul ignore next -- start establishes both values before prompting */
95
+ if (this.runtime === undefined || this.sessionId === undefined) {
96
+ throw new ProviderError("OpenCode session was not started");
97
+ }
98
+ const sessionId = this.sessionId;
99
+ const controller = new AbortController();
100
+ this.activeController = controller;
101
+ const onAbort = () => controller.abort(signal?.reason);
102
+ signal?.addEventListener("abort", onAbort, { once: true });
103
+ const request = {
104
+ sessionID: sessionId,
105
+ directory: this.context.workspace,
106
+ format: { type: "json_schema", schema },
107
+ parts: [{ type: "text", text: prompt }],
108
+ };
109
+ request.model = parseModel(this.options.model);
110
+ request.variant = this.options.model_effort;
111
+ try {
112
+ const response = await this.runtime.client.session.prompt(request, {
113
+ signal: controller.signal,
114
+ throwOnError: true,
115
+ });
116
+ const { info, parts } = response.data;
117
+ if (info.error !== undefined) {
118
+ throw new ProviderError(`OpenCode failed: ${JSON.stringify(info.error)}`.slice(0, 2_000));
119
+ }
120
+ const turn = {
121
+ text: textFromParts(parts),
122
+ sessionId,
123
+ };
124
+ if (info.structured !== undefined)
125
+ turn.payload = info.structured;
126
+ const usage = jsonObject({ tokens: info.tokens, cost: info.cost }, "OpenCode usage");
127
+ if (usage !== undefined)
128
+ turn.usage = usage;
129
+ return turn;
130
+ }
131
+ catch (error) {
132
+ if (controller.signal.aborted || signal?.aborted || isAbortError(error))
133
+ throw error;
134
+ if (error instanceof ProviderError)
135
+ throw error;
136
+ throw providerError("OpenCode failed", error);
137
+ }
138
+ finally {
139
+ signal?.removeEventListener("abort", onAbort);
140
+ this.activeController = undefined;
141
+ }
142
+ }
143
+ }
144
+ export function checkOpenCodeVersion(
145
+ /* istanbul ignore next -- production process boundary; tests inject spawn results */
146
+ run = spawnSync) {
147
+ const result = run("opencode", ["--version"], {
148
+ encoding: "utf8",
149
+ timeout: 5_000,
150
+ windowsHide: true,
151
+ });
152
+ if (result.error !== undefined) {
153
+ const code = result.error.code;
154
+ return code === "ENOENT"
155
+ ? "OpenCode executable not found"
156
+ : `could not inspect OpenCode version: ${result.error.message}`;
157
+ }
158
+ const output = `${result.stdout || result.stderr}`.trim();
159
+ if (result.status !== 0) {
160
+ return `OpenCode version check exited ${String(result.status)}: ${output.slice(-500)}`.trim();
161
+ }
162
+ const match = VERSION_PATTERN.exec(output);
163
+ if (match === null)
164
+ return `could not parse OpenCode version from ${JSON.stringify(output)}`;
165
+ const installed = match.slice(1).map(Number);
166
+ if (compareVersions(installed, MIN_OPENCODE_VERSION) < 0) {
167
+ return `OpenCode ${installed.join(".")} is unsupported; install ${MIN_OPENCODE_VERSION_TEXT} or newer`;
168
+ }
169
+ return undefined;
170
+ }
171
+ function parseModel(model) {
172
+ const separator = model.indexOf("/");
173
+ if (separator <= 0 || separator === model.length - 1) {
174
+ throw new ProviderError("OpenCode model must use provider/model format");
175
+ }
176
+ return { providerID: model.slice(0, separator), modelID: model.slice(separator + 1) };
177
+ }
178
+ function textFromParts(parts) {
179
+ return parts
180
+ .filter((part) => part.type === "text")
181
+ .map((part) => part.text)
182
+ .join("\n");
183
+ }
184
+ function providerError(prefix, error) {
185
+ return new ProviderError(`${prefix}: ${errorMessage(error)}`.slice(0, 2_000), { cause: error });
186
+ }
187
+ function compareVersions(left, right) {
188
+ for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
189
+ const difference = (left[index] ?? 0) - (right[index] ?? 0);
190
+ if (difference !== 0)
191
+ return difference;
192
+ }
193
+ return 0;
194
+ }
195
+ export const openCodeHarnessSpec = {
196
+ name: "opencode",
197
+ optionsSchema: openCodeOptionsSchema,
198
+ create(options) {
199
+ return new OpenCodeHarness(openCodeOptionsSchema.parse(options));
200
+ },
201
+ checkStartup: checkOpenCodeVersion,
202
+ };
203
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harnesses/opencode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare function sha256(value: string): string;
2
+ export declare function candidateDigest(source: string, repository: string, kind: string, id: string): string;
3
+ export declare function slug(value: string): string;
4
+ /** Selects one workspace repository's instances; two deployments can share a Namespace. */
5
+ export declare function instanceIdPrefix(repository: string): string;
6
+ export declare function pollScheduleId(repository: string, workflow: string): string;
7
+ /** The Workflow ID a poll Schedule starts each tick under; empty workflow gives the repository's prefix. */
8
+ export declare function pollRunWorkflowId(repository: string, workflow: string): string;
9
+ export declare function scheduledScheduleId(repository: string, workflow: string): string;
10
+ /** The stable ID a Temporal Schedule reuses after each scheduled instance closes. */
11
+ export declare function scheduledRunWorkflowId(repository: string, workflow: string): string;
12
+ /** Every Workflow ID prefix this deployment is responsible for. */
13
+ export declare function ownedWorkflowIdPrefixes(repository: string): readonly string[];
14
+ /**
15
+ * Whether a Schedule ID belongs to this deployment's repository. loopy owns every `loopy:` Schedule
16
+ * scoped to the repository's slug: the poll Schedules it creates today, and any a removed feature
17
+ * left behind - a `loopy:sweep:<slug>` from the reverted workspace sweep - that reconciliation must
18
+ * reap rather than leave firing a Workflow Type no longer in the bundle. Matching the slug as a
19
+ * whole segment keeps a shared Namespace safe: another repository's Schedules never match.
20
+ */
21
+ export declare function ownsScheduleId(repository: string, scheduleId: string): boolean;
22
+ /** A run-scoped reply token, stable across delivery retries. */
23
+ export declare function askToken(workflowId: string, callId: string): string;
24
+ /** The invisible marker loopy stamps on a question, keyed timestamp-free for retry-safe deduplication. */
25
+ export declare function askMarker(workflowId: string, callId: string): string;
26
+ //# sourceMappingURL=identifiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../src/identifiers.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,MAAM,CAER;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1C;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAO9E;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,0GAA0G;AAC1G,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,62 @@
1
+ import { createHash } from "node:crypto";
2
+ export function sha256(value) {
3
+ return createHash("sha256").update(value).digest("hex");
4
+ }
5
+ export function candidateDigest(source, repository, kind, id) {
6
+ return sha256(`${source}\0${repository}\0${kind}\0${id}`);
7
+ }
8
+ export function slug(value) {
9
+ const normalized = value
10
+ .toLowerCase()
11
+ .replaceAll(/[^a-z0-9]+/g, "-")
12
+ .replaceAll(/^-+|-+$/g, "") || "value";
13
+ return `${normalized.slice(0, 48)}-${sha256(value).slice(0, 12)}`;
14
+ }
15
+ /** Selects one workspace repository's instances; two deployments can share a Namespace. */
16
+ export function instanceIdPrefix(repository) {
17
+ return `loopy:instance:${slug(repository)}:`;
18
+ }
19
+ export function pollScheduleId(repository, workflow) {
20
+ return `loopy:poll:${slug(repository)}:${workflow}`;
21
+ }
22
+ /** The Workflow ID a poll Schedule starts each tick under; empty workflow gives the repository's prefix. */
23
+ export function pollRunWorkflowId(repository, workflow) {
24
+ return `loopy:poll-run:${pollScheduleId(repository, workflow)}`;
25
+ }
26
+ export function scheduledScheduleId(repository, workflow) {
27
+ return `loopy:schedule:${slug(repository)}:${workflow}`;
28
+ }
29
+ /** The stable ID a Temporal Schedule reuses after each scheduled instance closes. */
30
+ export function scheduledRunWorkflowId(repository, workflow) {
31
+ return `${instanceIdPrefix(repository)}${workflow}:schedule`;
32
+ }
33
+ /** Every Workflow ID prefix this deployment is responsible for. */
34
+ export function ownedWorkflowIdPrefixes(repository) {
35
+ return [instanceIdPrefix(repository), pollRunWorkflowId(repository, "")];
36
+ }
37
+ /**
38
+ * Whether a Schedule ID belongs to this deployment's repository. loopy owns every `loopy:` Schedule
39
+ * scoped to the repository's slug: the poll Schedules it creates today, and any a removed feature
40
+ * left behind - a `loopy:sweep:<slug>` from the reverted workspace sweep - that reconciliation must
41
+ * reap rather than leave firing a Workflow Type no longer in the bundle. Matching the slug as a
42
+ * whole segment keeps a shared Namespace safe: another repository's Schedules never match.
43
+ */
44
+ export function ownsScheduleId(repository, scheduleId) {
45
+ if (!scheduleId.startsWith("loopy:"))
46
+ return false;
47
+ const marker = `:${slug(repository)}`;
48
+ const index = scheduleId.indexOf(marker);
49
+ if (index < 0)
50
+ return false;
51
+ const rest = scheduleId.slice(index + marker.length);
52
+ return rest === "" || rest.startsWith(":");
53
+ }
54
+ /** A run-scoped reply token, stable across delivery retries. */
55
+ export function askToken(workflowId, callId) {
56
+ return sha256(`${workflowId}\0${callId}`).slice(0, 12);
57
+ }
58
+ /** The invisible marker loopy stamps on a question, keyed timestamp-free for retry-safe deduplication. */
59
+ export function askMarker(workflowId, callId) {
60
+ return `<!-- loopy:ask:${sha256(`${workflowId}\0${callId}`)} -->`;
61
+ }
62
+ //# sourceMappingURL=identifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../src/identifiers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from "./authoring/index.js";
2
+ export * from "./build/discover.js";
3
+ export * from "./core/calls.js";
4
+ export * from "./core/wire.js";
5
+ export * from "./git.js";
6
+ export * from "./identifiers.js";
7
+ export * from "./settings.js";
8
+ export * from "./version.js";
9
+ export * from "./worker-lock.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from "./authoring/index.js";
2
+ export * from "./build/discover.js";
3
+ export * from "./core/calls.js";
4
+ export * from "./core/wire.js";
5
+ export * from "./git.js";
6
+ export * from "./identifiers.js";
7
+ export * from "./settings.js";
8
+ export * from "./version.js";
9
+ export * from "./worker-lock.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
package/dist/log.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare const LOG_LEVELS: readonly ["debug", "info", "warning", "error"];
2
+ export type LogLevel = (typeof LOG_LEVELS)[number];
3
+ export declare function setupLogging(level: LogLevel): void;
4
+ export declare const log: {
5
+ debug(message: string, ...values: readonly unknown[]): void;
6
+ info(message: string, ...values: readonly unknown[]): void;
7
+ warning(message: string, ...values: readonly unknown[]): void;
8
+ error(message: string, ...values: readonly unknown[]): void;
9
+ };
10
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,YAAI,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AACzE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAWnD,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAElD;AAED,eAAO,MAAM,GAAG;IACd,KAAK,UAAU,MAAM,aAAa,SAAS,OAAO,EAAE,GAAG,IAAI;IAG3D,IAAI,UAAU,MAAM,aAAa,SAAS,OAAO,EAAE,GAAG,IAAI;IAG1D,OAAO,UAAU,MAAM,aAAa,SAAS,OAAO,EAAE,GAAG,IAAI;IAG7D,KAAK,UAAU,MAAM,aAAa,SAAS,OAAO,EAAE,GAAG,IAAI;CAG5D,CAAC"}
package/dist/log.js ADDED
@@ -0,0 +1,44 @@
1
+ export const LOG_LEVELS = ["debug", "info", "warning", "error"];
2
+ const PRIORITY = {
3
+ debug: 10,
4
+ info: 20,
5
+ warning: 30,
6
+ error: 40,
7
+ };
8
+ let threshold = "info";
9
+ export function setupLogging(level) {
10
+ threshold = level;
11
+ }
12
+ export const log = {
13
+ debug(message, ...values) {
14
+ write("debug", message, values);
15
+ },
16
+ info(message, ...values) {
17
+ write("info", message, values);
18
+ },
19
+ warning(message, ...values) {
20
+ write("warning", message, values);
21
+ },
22
+ error(message, ...values) {
23
+ write("error", message, values);
24
+ },
25
+ };
26
+ function write(level, message, values) {
27
+ if (PRIORITY[level] < PRIORITY[threshold])
28
+ return;
29
+ const suffix = values.length === 0 ? "" : ` ${values.map(formatValue).join(" ")}`;
30
+ process.stderr.write(`${new Date().toISOString()} ${level.toUpperCase()} loopy ${message}${suffix}\n`);
31
+ }
32
+ function formatValue(value) {
33
+ if (value instanceof Error)
34
+ return value.stack ?? value.message;
35
+ if (typeof value === "string")
36
+ return value;
37
+ try {
38
+ return JSON.stringify(value);
39
+ }
40
+ catch {
41
+ return String(value);
42
+ }
43
+ }
44
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAU,CAAC;AAGzE,MAAM,QAAQ,GAA6B;IACzC,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,IAAI,SAAS,GAAa,MAAM,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,KAAe;IAC1C,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,CAAC,OAAe,EAAE,GAAG,MAA0B;QAClD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,OAAe,EAAE,GAAG,MAA0B;QACjD,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,OAAe,EAAE,GAAG,MAA0B;QACpD,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,OAAe,EAAE,GAAG,MAA0B;QAClD,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;CACF,CAAC;AAEF,SAAS,KAAK,CAAC,KAAe,EAAE,OAAe,EAAE,MAA0B;IACzE,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,UAAU,OAAO,GAAG,MAAM,IAAI,CACjF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type LogLevel } from "./log.js";
2
+ export interface TemporalSettings {
3
+ address: string;
4
+ namespace: string;
5
+ controlTaskQueue: string;
6
+ agentTaskQueue: string;
7
+ tls: boolean;
8
+ apiKey?: string;
9
+ }
10
+ export interface AgentWorkerSettings {
11
+ maxConcurrentActivities: number;
12
+ }
13
+ /**
14
+ * A connection value the environment took over from an explicit config entry. Environment
15
+ * precedence is deliberate - `TEMPORAL_API_KEY` is the recommended way to supply a secret - but an
16
+ * ambient variable silently discarding a value the operator wrote down is worth saying out loud.
17
+ * The configured value is not carried, so reporting one can never disclose a secret.
18
+ */
19
+ export interface EnvironmentOverride {
20
+ variable: string;
21
+ field: string;
22
+ }
23
+ export interface Settings {
24
+ logLevel: LogLevel;
25
+ repository: string;
26
+ defaultBranch: string;
27
+ pollIntervalSeconds: number;
28
+ /** Directory of workflow modules; one module defines one workflow. */
29
+ workflows: string;
30
+ /** Base for prompt file references. */
31
+ projectDirectory: string;
32
+ workingDirectory: string;
33
+ /** How long shutdown keeps serving open instances after pausing polling. Zero disables draining. */
34
+ drainTimeoutSeconds: number;
35
+ shutdownGraceSeconds: number;
36
+ temporal: TemporalSettings;
37
+ agentWorker: AgentWorkerSettings;
38
+ /** Reported once logging is configured, rather than logged from here where the level is unknown. */
39
+ environmentOverrides: EnvironmentOverride[];
40
+ }
41
+ export declare function defaultConfigPath(environment?: NodeJS.ProcessEnv): string;
42
+ export declare function loadSettings(path?: string, environment?: NodeJS.ProcessEnv): Settings;
43
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oGAAoG;IACpG,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,mBAAmB,CAAC;IACjC,oGAAoG;IACpG,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;CAC7C;AAsCD,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGtF;AAED,wBAAgB,YAAY,CAC1B,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,QAAQ,CAyCV"}