@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,128 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { parse as parseToml } from "smol-toml";
5
+ import { z } from "zod";
6
+ import { LOG_LEVELS } from "./log.js";
7
+ const temporalSchema = z
8
+ .object({
9
+ address: z.string().min(1).default("localhost:7233"),
10
+ namespace: z.string().min(1).default("default"),
11
+ control_task_queue: z.string().min(1),
12
+ agent_task_queue: z.string().min(1),
13
+ tls: z.boolean().default(false),
14
+ api_key: z.string().min(1).optional(),
15
+ })
16
+ .strict();
17
+ const agentWorkerSchema = z
18
+ .object({
19
+ max_concurrent_activities: z.number().int().positive().default(5),
20
+ })
21
+ .strict()
22
+ .default({ max_concurrent_activities: 5 });
23
+ const settingsSchema = z
24
+ .object({
25
+ log_level: z.enum(LOG_LEVELS).default("info"),
26
+ repository: z.string().regex(/^[^/\s]+\/[^/\s]+$/),
27
+ default_branch: z.string().min(1).default("main"),
28
+ poll_interval_seconds: z.number().positive().default(300),
29
+ workflows: z.string().min(1).default("workflows"),
30
+ project_directory: z.string().min(1).default("."),
31
+ working_directory: z.string().min(1).default(".loopy"),
32
+ // Shutdown pauses polling and keeps serving until open instances close, so an edit never
33
+ // deploys under a half-finished instance. Agent work is minutes, not seconds.
34
+ drain_timeout_seconds: z.number().nonnegative().default(900),
35
+ shutdown_grace_seconds: z.number().nonnegative().default(30),
36
+ temporal: temporalSchema,
37
+ agent_worker: agentWorkerSchema,
38
+ })
39
+ .strict();
40
+ export function defaultConfigPath(environment = process.env) {
41
+ const base = environment.XDG_CONFIG_HOME || join(homedir(), ".config");
42
+ return join(base, "loopy", "config.toml");
43
+ }
44
+ export function loadSettings(path, environment = process.env) {
45
+ const target = path === undefined ? defaultConfigPath(environment) : resolve(path);
46
+ let raw = {};
47
+ if (existsSync(target)) {
48
+ raw = parseToml(readFileSync(target, "utf8"));
49
+ }
50
+ else if (path !== undefined) {
51
+ throw new Error(`config file not found: ${path}`);
52
+ }
53
+ const applied = applyEnvironment(raw, environment);
54
+ const parsed = settingsSchema.parse(applied.data);
55
+ const temporal = {
56
+ address: parsed.temporal.address,
57
+ namespace: parsed.temporal.namespace,
58
+ controlTaskQueue: parsed.temporal.control_task_queue,
59
+ agentTaskQueue: parsed.temporal.agent_task_queue,
60
+ tls: parsed.temporal.tls,
61
+ };
62
+ if (parsed.temporal.api_key !== undefined)
63
+ temporal.apiKey = parsed.temporal.api_key;
64
+ const projectDirectory = resolve(parsed.project_directory);
65
+ return {
66
+ logLevel: parsed.log_level,
67
+ repository: parsed.repository,
68
+ defaultBranch: parsed.default_branch,
69
+ pollIntervalSeconds: parsed.poll_interval_seconds,
70
+ workflows: resolve(projectDirectory, parsed.workflows),
71
+ projectDirectory,
72
+ // Resolve to an absolute path so worktree provisioning (git, rooted at the
73
+ // managed clone `<workingDirectory>/repo`) and the agent `cwd` (resolved by
74
+ // child_process.spawn against the worker's process directory) share one
75
+ // base. A relative value diverges by the clone prefix, handing the agent a
76
+ // non-existent cwd - spawn then fails ENOENT, which the Claude Agent SDK
77
+ // masks as a libc "failed to launch". See issue #28.
78
+ workingDirectory: resolve(parsed.working_directory),
79
+ drainTimeoutSeconds: parsed.drain_timeout_seconds,
80
+ shutdownGraceSeconds: parsed.shutdown_grace_seconds,
81
+ temporal,
82
+ agentWorker: {
83
+ maxConcurrentActivities: parsed.agent_worker.max_concurrent_activities,
84
+ },
85
+ environmentOverrides: applied.overrides,
86
+ };
87
+ }
88
+ function applyEnvironment(value, environment) {
89
+ const data = isRecord(value) ? { ...value } : {};
90
+ const currentTemporal = isRecord(data.temporal) ? data.temporal : {};
91
+ const temporal = { ...currentTemporal };
92
+ const overrides = [];
93
+ const rules = [
94
+ ["TEMPORAL_ADDRESS", "address", String],
95
+ ["TEMPORAL_NAMESPACE", "namespace", String],
96
+ ["TEMPORAL_CONTROL_TASK_QUEUE", "control_task_queue", String],
97
+ ["TEMPORAL_AGENT_TASK_QUEUE", "agent_task_queue", String],
98
+ ["TEMPORAL_API_KEY", "api_key", String],
99
+ ["TEMPORAL_TLS", "tls", parseBoolean],
100
+ ];
101
+ for (const [variable, field, parser] of rules) {
102
+ const raw = environment[variable];
103
+ if (raw === undefined || raw === "")
104
+ continue;
105
+ const applied = parser(raw);
106
+ // Only a value the config actually set and that the environment then changed is worth
107
+ // reporting; agreeing with the file, or filling a field the file left out, is not a surprise.
108
+ const configured = currentTemporal[field];
109
+ if (configured !== undefined && configured !== applied) {
110
+ overrides.push({ variable, field: `temporal.${field}` });
111
+ }
112
+ temporal[field] = applied;
113
+ }
114
+ data.temporal = temporal;
115
+ return { data, overrides };
116
+ }
117
+ function parseBoolean(value) {
118
+ const normalized = value.trim().toLowerCase();
119
+ if (["1", "true", "yes", "on"].includes(normalized))
120
+ return true;
121
+ if (["0", "false", "no", "off"].includes(normalized))
122
+ return false;
123
+ throw new Error(`expected a boolean environment value, got ${JSON.stringify(value)}`);
124
+ }
125
+ function isRecord(value) {
126
+ return typeof value === "object" && value !== null && !Array.isArray(value);
127
+ }
128
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type AttentionEmitterSpec, type ChannelAdapterSpec, type EmitterSpec, type HarnessSpec, type WatcherSpec } from "../adapters.js";
2
+ import { type AgentCallResult, type AttentionEmitResult, type CleanupWorkspaceResult, type DeliverQuestionResult, type EffectResult, type ObserveInstancesResult, type TriggerCandidate } from "../core/wire.js";
3
+ import type { RepoOps } from "../git.js";
4
+ import { type InstanceObserverClient } from "./observe.js";
5
+ export declare const HEARTBEAT_INTERVAL_MS = 10000;
6
+ interface ActivityRuntimeContext {
7
+ readonly cancellationSignal: AbortSignal;
8
+ readonly cancelled: Promise<never>;
9
+ heartbeat(details?: unknown): void;
10
+ }
11
+ type ContextProvider = () => ActivityRuntimeContext;
12
+ export interface AgentActivitiesOptions {
13
+ repository: string;
14
+ workingDirectory: string;
15
+ /** Base for prompt file references; a reference may not escape it. */
16
+ projectDirectory: string;
17
+ repo: RepoOps;
18
+ harnesses: ReadonlyMap<string, HarnessSpec>;
19
+ watchers?: ReadonlyMap<string, WatcherSpec>;
20
+ emitters?: ReadonlyMap<string, EmitterSpec>;
21
+ attentionEmitters?: ReadonlyMap<string, AttentionEmitterSpec>;
22
+ channels?: ReadonlyMap<string, ChannelAdapterSpec>;
23
+ /** Client surface the instance observer reads Executions through; production passes the Workflow Client. */
24
+ observer?: InstanceObserverClient;
25
+ contextProvider?: ContextProvider;
26
+ }
27
+ export declare class AgentActivities {
28
+ readonly repository: string;
29
+ readonly workingDirectory: string;
30
+ readonly projectDirectory: string;
31
+ readonly repo: RepoOps;
32
+ readonly harnesses: ReadonlyMap<string, HarnessSpec>;
33
+ readonly watchers: ReadonlyMap<string, WatcherSpec>;
34
+ readonly emitters: ReadonlyMap<string, EmitterSpec>;
35
+ readonly attentionEmitters: ReadonlyMap<string, AttentionEmitterSpec>;
36
+ readonly channels: ReadonlyMap<string, ChannelAdapterSpec>;
37
+ readonly observer: InstanceObserverClient | undefined;
38
+ private readonly contextProvider;
39
+ constructor(options: AgentActivitiesOptions);
40
+ emitEffect(input: unknown): Promise<EffectResult>;
41
+ emitAttention(input: unknown): Promise<AttentionEmitResult>;
42
+ observeInstances(input: unknown): Promise<ObserveInstancesResult>;
43
+ deliverQuestion(input: unknown): Promise<DeliverQuestionResult>;
44
+ /** Surface each stuck instance through its own declared attention route. */
45
+ private reportStuck;
46
+ private resolveAttentionEmitter;
47
+ cleanupWorkspace(input: unknown): Promise<CleanupWorkspaceResult>;
48
+ runWatcher(input: unknown): Promise<TriggerCandidate[]>;
49
+ runAgent(input: unknown): Promise<AgentCallResult>;
50
+ private runAgentInner;
51
+ private assertRepository;
52
+ private workspace;
53
+ private renderPrompt;
54
+ private readPromptFile;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=activities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.d.ts","sourceRoot":"","sources":["../../src/temporal/activities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,366 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
3
+ import { ApplicationFailure, CancelledFailure, Context } from "@temporalio/activity";
4
+ import { EmitterPermanentError, } from "../adapters.js";
5
+ import { assertIdentifier } from "../core/calls.js";
6
+ import { parseAttentionEmitResult, parseCleanupWorkspaceInput, parseDeliverQuestionInput, parseEffectResult, parseEmitAttentionInput, parseObserveInstancesInput, parseRunAgentInput, parseRunEffectInput, parseRunWatcherInput, triggerReference, } from "../core/wire.js";
7
+ import { HarnessError } from "../harnesses/base.js";
8
+ import { candidateDigest } from "../identifiers.js";
9
+ import { log } from "../log.js";
10
+ import { AGENT_CONFIGURATION_FAILURE_TYPE, EFFECT_PERMANENT_FAILURE_TYPE, UNEXPECTED_AGENT_FAILURE_TYPE, WORKSPACE_PROVISIONING_FAILURE_TYPE, } from "./contracts.js";
11
+ import { observeInstances, pollObservedAnswers, } from "./observe.js";
12
+ export const HEARTBEAT_INTERVAL_MS = 10_000;
13
+ const MAX_REASON_LENGTH = 2_000;
14
+ const HARNESS_DRAIN_TIMEOUT_MS = 10_000;
15
+ export class AgentActivities {
16
+ repository;
17
+ workingDirectory;
18
+ projectDirectory;
19
+ repo;
20
+ harnesses;
21
+ watchers;
22
+ emitters;
23
+ attentionEmitters;
24
+ channels;
25
+ observer;
26
+ contextProvider;
27
+ constructor(options) {
28
+ this.repository = options.repository;
29
+ this.workingDirectory = options.workingDirectory;
30
+ this.projectDirectory = options.projectDirectory;
31
+ this.repo = options.repo;
32
+ this.harnesses = options.harnesses;
33
+ this.watchers = options.watchers ?? new Map();
34
+ this.emitters = options.emitters ?? new Map();
35
+ this.attentionEmitters = options.attentionEmitters ?? new Map();
36
+ this.channels = options.channels ?? new Map();
37
+ this.observer = options.observer;
38
+ this.contextProvider = options.contextProvider ?? (() => Context.current());
39
+ }
40
+ async emitEffect(input) {
41
+ const request = parseRunEffectInput(input);
42
+ this.assertRepository(request.repository);
43
+ const spec = this.emitters.get(request.emitter);
44
+ if (spec === undefined) {
45
+ throw ApplicationFailure.nonRetryable(`unknown emitter: ${request.emitter}`, AGENT_CONFIGURATION_FAILURE_TYPE);
46
+ }
47
+ let action;
48
+ try {
49
+ action = spec.actionSchema.parse(request.action);
50
+ }
51
+ catch (error) {
52
+ throw ApplicationFailure.nonRetryable(`invalid ${request.emitter} action: ${errorMessage(error)}`, AGENT_CONFIGURATION_FAILURE_TYPE);
53
+ }
54
+ try {
55
+ return parseEffectResult(await spec.emit({ action }));
56
+ }
57
+ catch (error) {
58
+ // The adapter says no retry can fix this; carry that verdict to Temporal so the Activity
59
+ // Execution fails now instead of exhausting a policy that cannot help.
60
+ if (error instanceof EmitterPermanentError) {
61
+ throw ApplicationFailure.nonRetryable(error.message, EFFECT_PERMANENT_FAILURE_TYPE);
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ async emitAttention(input) {
67
+ const request = parseEmitAttentionInput(input);
68
+ this.assertRepository(request.repository);
69
+ const { spec, options } = this.resolveAttentionEmitter(request.attention.emitter, request.attention.options);
70
+ try {
71
+ return parseAttentionEmitResult(await spec.emit({
72
+ options,
73
+ trigger: request.trigger,
74
+ event: request.event,
75
+ }));
76
+ }
77
+ catch (error) {
78
+ if (error instanceof EmitterPermanentError) {
79
+ throw ApplicationFailure.nonRetryable(error.message, EFFECT_PERMANENT_FAILURE_TYPE);
80
+ }
81
+ throw error;
82
+ }
83
+ }
84
+ async observeInstances(input) {
85
+ const request = parseObserveInstancesInput(input);
86
+ this.assertRepository(request.repository);
87
+ if (this.observer === undefined) {
88
+ throw ApplicationFailure.nonRetryable("no Execution client configured for the instance observer", AGENT_CONFIGURATION_FAILURE_TYPE);
89
+ }
90
+ const observed = await observeInstances(this.observer, request.repository, request.workflow);
91
+ return {
92
+ stuck: await this.reportStuck(observed.stuck),
93
+ answered: await pollObservedAnswers(this.observer, this.channels, observed.awaiting),
94
+ };
95
+ }
96
+ async deliverQuestion(input) {
97
+ const request = parseDeliverQuestionInput(input);
98
+ this.assertRepository(request.repository);
99
+ const spec = this.channels.get(request.channel);
100
+ if (spec === undefined) {
101
+ throw ApplicationFailure.nonRetryable(`unknown channel: ${request.channel}`, AGENT_CONFIGURATION_FAILURE_TYPE);
102
+ }
103
+ let options;
104
+ try {
105
+ options = spec.optionsSchema.parse(request.options);
106
+ }
107
+ catch (error) {
108
+ throw ApplicationFailure.nonRetryable(`invalid ${request.channel} channel options: ${errorMessage(error)}`, AGENT_CONFIGURATION_FAILURE_TYPE);
109
+ }
110
+ const question = this.renderPrompt(request.promptParts);
111
+ try {
112
+ const result = await spec.deliver({
113
+ options,
114
+ workflowId: request.workflowId,
115
+ callId: request.callId,
116
+ question,
117
+ });
118
+ return { correlation: result.correlation, renderedQuestion: result.renderedQuestion };
119
+ }
120
+ catch (error) {
121
+ // The adapter's verdict that no retry can help - a vanished target, an invalid request -
122
+ // carries to Temporal as a non-retryable failure; anything else retries under the policy.
123
+ if (error instanceof EmitterPermanentError) {
124
+ throw ApplicationFailure.nonRetryable(error.message, EFFECT_PERMANENT_FAILURE_TYPE);
125
+ }
126
+ throw error;
127
+ }
128
+ }
129
+ /** Surface each stuck instance through its own declared attention route. */
130
+ async reportStuck(instances) {
131
+ const reported = [];
132
+ for (const instance of instances) {
133
+ if (instance.input.attention === undefined)
134
+ continue;
135
+ const event = {
136
+ kind: "stuck",
137
+ workflowId: instance.workflowId,
138
+ runId: instance.runId,
139
+ workflowName: instance.input.workflow,
140
+ triggerRef: triggerReference(instance.input.trigger),
141
+ reason: "workflow-task-failing",
142
+ occurredAt: new Date().toISOString(),
143
+ suggestedCommands: [`loopy status ${instance.workflowId}`],
144
+ };
145
+ try {
146
+ const { spec, options } = this.resolveAttentionEmitter(instance.input.attention.emitter, instance.input.attention.options);
147
+ const result = parseAttentionEmitResult(await spec.emit({ options, trigger: instance.input.trigger, event }));
148
+ if (result.status === "emitted")
149
+ reported.push(instance.workflowId);
150
+ }
151
+ catch (error) {
152
+ // One unreportable instance must not silence the rest; the condition is level-triggered,
153
+ // so the next tick retries anything that failed here.
154
+ log.error(`stuck instance ${instance.workflowId}: attention emission failed`, error);
155
+ }
156
+ }
157
+ return reported;
158
+ }
159
+ resolveAttentionEmitter(name, value) {
160
+ const spec = this.attentionEmitters.get(name);
161
+ if (spec === undefined) {
162
+ throw ApplicationFailure.nonRetryable(`unknown attention emitter: ${name}`, AGENT_CONFIGURATION_FAILURE_TYPE);
163
+ }
164
+ try {
165
+ return { spec, options: spec.optionsSchema.parse(value) };
166
+ }
167
+ catch (error) {
168
+ throw ApplicationFailure.nonRetryable(`invalid ${name} attention options: ${error instanceof Error ? error.message : String(error)}`, AGENT_CONFIGURATION_FAILURE_TYPE);
169
+ }
170
+ }
171
+ async cleanupWorkspace(input) {
172
+ const request = parseCleanupWorkspaceInput(input);
173
+ const path = join(this.workingDirectory, "worktrees", request.chainId);
174
+ return { removed: await this.repo.cleanupWorkspaces(path) };
175
+ }
176
+ async runWatcher(input) {
177
+ const request = parseRunWatcherInput(input);
178
+ this.assertRepository(request.repository);
179
+ const spec = this.watchers.get(request.watcher.name);
180
+ if (spec === undefined) {
181
+ throw ApplicationFailure.nonRetryable(`unknown watcher: ${request.watcher.name}`, AGENT_CONFIGURATION_FAILURE_TYPE);
182
+ }
183
+ const candidates = await spec.fetch({
184
+ options: spec.optionsSchema.parse(request.watcher.options),
185
+ });
186
+ return candidates.map((candidate) => {
187
+ const source = spec.source;
188
+ return {
189
+ ...candidate,
190
+ source,
191
+ digest: candidateDigest(source, candidate.repository, candidate.kind, candidate.id),
192
+ };
193
+ });
194
+ }
195
+ async runAgent(input) {
196
+ const runtime = this.contextProvider();
197
+ runtime.heartbeat();
198
+ const heartbeat = setInterval(() => runtime.heartbeat(), HEARTBEAT_INTERVAL_MS);
199
+ heartbeat.unref();
200
+ try {
201
+ return await this.runAgentInner(parseRunAgentInput(input), runtime);
202
+ }
203
+ finally {
204
+ clearInterval(heartbeat);
205
+ }
206
+ }
207
+ async runAgentInner(request, runtime) {
208
+ this.assertRepository(request.repository);
209
+ const spec = this.harnesses.get(request.harness);
210
+ if (spec === undefined) {
211
+ throw ApplicationFailure.nonRetryable(`unknown harness: ${request.harness}`, AGENT_CONFIGURATION_FAILURE_TYPE);
212
+ }
213
+ let workspace;
214
+ try {
215
+ workspace = this.workspace(request);
216
+ }
217
+ catch (error) {
218
+ throw ApplicationFailure.nonRetryable(reason("workspace", error), WORKSPACE_PROVISIONING_FAILURE_TYPE);
219
+ }
220
+ try {
221
+ await this.repo.provisionWorkspace(workspace.path, workspace.localBranch, workspace.targetBranch, request.baseBranch);
222
+ throwIfTemporallyCancelled(runtime);
223
+ }
224
+ catch (error) {
225
+ if (isCancellation(error, runtime))
226
+ throw error;
227
+ log.error(`${request.handleId}: workspace provisioning failed`, error);
228
+ throw ApplicationFailure.nonRetryable(reason("workspace", error), WORKSPACE_PROVISIONING_FAILURE_TYPE);
229
+ }
230
+ let harness;
231
+ let context;
232
+ try {
233
+ harness = spec.create(spec.optionsSchema.parse(request.options));
234
+ context = {
235
+ agentId: request.handleId,
236
+ prompt: this.renderPrompt(request.promptParts),
237
+ workspace: workspace.path,
238
+ schema: request.schema,
239
+ ...(request.resumeSessionId === undefined
240
+ ? {}
241
+ : { resumeSessionId: request.resumeSessionId }),
242
+ };
243
+ }
244
+ catch (error) {
245
+ log.error(`${request.handleId}: invalid agent Activity configuration`, error);
246
+ throw ApplicationFailure.nonRetryable(reason("configuration", error), AGENT_CONFIGURATION_FAILURE_TYPE);
247
+ }
248
+ return invokeHarness(harness, context, request.handleId, request.timeoutSeconds, runtime);
249
+ }
250
+ assertRepository(repository) {
251
+ if (repository === this.repository)
252
+ return;
253
+ throw ApplicationFailure.nonRetryable(`repository mismatch: worker serves ${JSON.stringify(this.repository)}, request targets ${JSON.stringify(repository)}`, AGENT_CONFIGURATION_FAILURE_TYPE);
254
+ }
255
+ workspace(request) {
256
+ assertIdentifier("agent handle", request.handleId);
257
+ const root = join(this.workingDirectory, "worktrees", request.chainId);
258
+ const path = join(root, request.handleId);
259
+ assertContained(root, path, "workspace");
260
+ return {
261
+ path,
262
+ localBranch: `loopy/${request.chainId.slice(0, 12)}/${request.handleId}`,
263
+ targetBranch: request.targetBranch,
264
+ };
265
+ }
266
+ renderPrompt(parts) {
267
+ return parts
268
+ .map((part) => (typeof part === "string" ? part : this.readPromptFile(part.file)))
269
+ .join("\n");
270
+ }
271
+ readPromptFile(file) {
272
+ const path = resolve(this.projectDirectory, file);
273
+ assertContained(this.projectDirectory, path, "prompt file");
274
+ return readFileSync(path, "utf8");
275
+ }
276
+ }
277
+ async function invokeHarness(harness, context, handleId, timeoutSeconds, runtime) {
278
+ const deadline = new AbortController();
279
+ const timeout = setTimeout(() => deadline.abort(new DOMException("agent deadline exceeded", "TimeoutError")), timeoutSeconds * 1_000);
280
+ timeout.unref();
281
+ const combined = AbortSignal.any([runtime.cancellationSignal, deadline.signal]);
282
+ const operation = harness.run(context, combined);
283
+ try {
284
+ const result = await raceWithAbort(operation, combined);
285
+ return {
286
+ status: "returned",
287
+ value: result.value,
288
+ ...(result.sessionId === undefined ? {} : { sessionId: result.sessionId }),
289
+ ...(result.usage === undefined ? {} : { usage: result.usage }),
290
+ };
291
+ }
292
+ catch (error) {
293
+ if (runtime.cancellationSignal.aborted) {
294
+ await drain(operation);
295
+ throwCancellation(runtime);
296
+ }
297
+ if (deadline.signal.aborted) {
298
+ await drain(operation);
299
+ return { status: "deadline_exceeded", reason: "agent-deadline-exceeded" };
300
+ }
301
+ if (error instanceof HarnessError) {
302
+ return {
303
+ status: "failed",
304
+ reason: error.diagnostic.slice(0, MAX_REASON_LENGTH),
305
+ ...(error.sessionId === undefined ? {} : { sessionId: error.sessionId }),
306
+ ...(error.usage === undefined ? {} : { usage: error.usage }),
307
+ };
308
+ }
309
+ log.error(`${handleId}: unexpected harness failure`, error);
310
+ throw ApplicationFailure.nonRetryable(reason("unexpected", error), UNEXPECTED_AGENT_FAILURE_TYPE);
311
+ }
312
+ finally {
313
+ clearTimeout(timeout);
314
+ }
315
+ }
316
+ function assertContained(root, path, label) {
317
+ const offset = relative(resolve(root), resolve(path));
318
+ if (offset === "" || offset.startsWith("..") || isAbsolute(offset)) {
319
+ throw new Error(`${label} ${JSON.stringify(path)} escapes ${JSON.stringify(root)}`);
320
+ }
321
+ }
322
+ function raceWithAbort(operation, signal) {
323
+ if (signal.aborted)
324
+ return Promise.reject(signal.reason);
325
+ return new Promise((resolve, reject) => {
326
+ const onAbort = () => reject(signal.reason);
327
+ signal.addEventListener("abort", onAbort, { once: true });
328
+ operation.then(resolve, reject).finally(() => signal.removeEventListener("abort", onAbort));
329
+ });
330
+ }
331
+ async function drain(operation) {
332
+ let timer;
333
+ try {
334
+ await Promise.race([
335
+ operation.catch(() => undefined),
336
+ new Promise((resolve) => {
337
+ timer = setTimeout(resolve, HARNESS_DRAIN_TIMEOUT_MS);
338
+ timer.unref();
339
+ }),
340
+ ]);
341
+ }
342
+ finally {
343
+ if (timer !== undefined)
344
+ clearTimeout(timer);
345
+ }
346
+ }
347
+ function throwIfTemporallyCancelled(runtime) {
348
+ if (runtime.cancellationSignal.aborted)
349
+ throwCancellation(runtime);
350
+ }
351
+ function throwCancellation(runtime) {
352
+ const reasonValue = runtime.cancellationSignal.reason;
353
+ if (reasonValue instanceof CancelledFailure)
354
+ throw reasonValue;
355
+ throw new CancelledFailure(errorMessage(reasonValue ?? "activity cancelled"));
356
+ }
357
+ function isCancellation(error, runtime) {
358
+ return runtime.cancellationSignal.aborted || error instanceof CancelledFailure;
359
+ }
360
+ function reason(prefix, error) {
361
+ return `${prefix}: ${errorMessage(error)}`.slice(0, MAX_REASON_LENGTH);
362
+ }
363
+ function errorMessage(error) {
364
+ return error instanceof Error ? error.message : String(error);
365
+ }
366
+ //# sourceMappingURL=activities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activities.js","sourceRoot":"","sources":["../../src/temporal/activities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ChannelAdapterSpec } from "../adapters.js";
2
+ import { type JsonValue } from "../core/wire.js";
3
+ /**
4
+ * The client surface the reply-poll needs: list this workflow's open instances, Query each for its
5
+ * state, and deliver an answer as a Workflow Update. A real `WorkflowClient` satisfies it; a test
6
+ * double supplies only what is declared here.
7
+ */
8
+ export interface AnswerScanClient {
9
+ list(options: {
10
+ query: string;
11
+ }): AsyncIterable<{
12
+ workflowId: string;
13
+ }>;
14
+ getHandle(workflowId: string): AnswerScanHandle;
15
+ }
16
+ export interface AnswerScanHandle {
17
+ query(queryName: string): Promise<unknown>;
18
+ executeUpdate(updateName: string, options: {
19
+ args: unknown[];
20
+ updateId?: string;
21
+ }): Promise<unknown>;
22
+ }
23
+ export interface AwaitingCall {
24
+ callId: string;
25
+ channel: string;
26
+ correlation: JsonValue;
27
+ }
28
+ export interface AwaitingInstance {
29
+ workflowId: string;
30
+ calls: AwaitingCall[];
31
+ }
32
+ /**
33
+ * Find this workflow's open instances parked on an ask, and the opaque correlation each awaiting
34
+ * call carries. Discovery is query-each-open-instance — list by built-in attributes, Query each —
35
+ * rather than a custom Search Attribute: cheap at the low-tens scale asks reach, and it reuses the
36
+ * `report_stuck` enumeration. An instance whose Query cannot be read (stuck, or transiently
37
+ * unavailable) is skipped this scan; the level-triggered tick re-observes it next time.
38
+ */
39
+ export declare function findAwaitingInstances(client: AnswerScanClient, repository: string, workflow: string): Promise<AwaitingInstance[]>;
40
+ /**
41
+ * Poll each awaiting call's channel for a reply and deliver any answer as an `answer_instance`
42
+ * Update. Every instance and call is isolated in its own try/catch: a channel error, a rejected
43
+ * Update (the call was already answered), or a closed Execution fails that one item and the scan
44
+ * continues, returning partial results rather than re-driving the whole set. The Update ID is
45
+ * derived from the workflow and call so an Activity retry dedups against the server.
46
+ */
47
+ export declare function pollAnswers(client: AnswerScanClient, channels: ReadonlyMap<string, ChannelAdapterSpec>, repository: string, workflow: string): Promise<string[]>;
48
+ //# sourceMappingURL=answers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../../src/temporal/answers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,iBAAiB,CAAC;AAKzB;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,aAAa,CACX,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9C,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAID,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7B;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACjD,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB"}