@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,506 @@
1
+ import { ActivityCancellationType, ActivityFailure, ApplicationFailure, CancellationScope, condition, defineQuery, defineUpdate, isCancellation, proxyActivities, setHandler, workflowInfo, } from "@temporalio/workflow";
2
+ import { agentActivityId, askTimeoutReason, askTimeoutSeconds, assertIdentifier, callAddress, callBudgetReason, deliverQuestionActivityId, effectActivityId, effectDisposition, projectDomainStatus, WorkflowHalt, } from "../core/calls.js";
3
+ import { parseAgentCallResult, parseAnswerRequest, parseAttentionEmitResult, parseDeliverQuestionResult, parseEffectResult, parseInstanceWorkflowInput, parseResolveRequest, triggerReference, } from "../core/wire.js";
4
+ import { ANSWER_INSTANCE_UPDATE, DEFINITIVE_AGENT_ACTIVITY_FAILURE_TYPES, INSTANCE_STATE_QUERY, RESOLVE_INSTANCE_UPDATE, } from "./contracts.js";
5
+ import { SupervisedAgentHandle } from "./handle.js";
6
+ const ACTIVITY_TIMEOUT_GRACE_MS = 30_000;
7
+ const HEARTBEAT_TIMEOUT_MS = 30_000;
8
+ const CONTROL_ACTIVITY_TIMEOUT_MS = 30_000;
9
+ const REPEATABLE_RETRY_POLICY = {
10
+ maximumAttempts: 3,
11
+ initialInterval: 1_000,
12
+ backoffCoefficient: 2,
13
+ };
14
+ /**
15
+ * The engine's intake claim retries without bound. Halt-fast exists so an author can catch an
16
+ * expected failure, but nobody can catch the engine's claim: a halted claim closes the Execution
17
+ * while the intake label survives - removing it is what just failed - so every poll starts a fresh
18
+ * instance that fails identically. Waiting open uses the stable Workflow ID's own duplicate
19
+ * suppression, holds no agent slot or worktree, and proceeds into `run` the moment the write
20
+ * succeeds. A non-retryable Activity failure - the emitter's permanent classification - still
21
+ * reaches the disposition and halts.
22
+ */
23
+ const CLAIM_RETRY_POLICY = {
24
+ initialInterval: 1_000,
25
+ backoffCoefficient: 2,
26
+ maximumInterval: 60_000,
27
+ };
28
+ /** A fixed safety bound until a real workflow demonstrates the need for configuration. */
29
+ export const MAX_CALLS_PER_INSTANCE = 200;
30
+ /** Reserved: the engine's own intake claim occupies this effect identifier. */
31
+ export const INTAKE_EFFECT_ID = "intake";
32
+ /** Names the engine owns in every instance, whether or not this workflow's watcher uses them. */
33
+ const RESERVED_EFFECT_IDS = new Set([INTAKE_EFFECT_ID]);
34
+ export const instanceStateQuery = defineQuery(INSTANCE_STATE_QUERY);
35
+ export const resolveInstanceUpdate = defineUpdate(RESOLVE_INSTANCE_UPDATE);
36
+ export const answerInstanceUpdate = defineUpdate(ANSWER_INSTANCE_UPDATE);
37
+ export function runSupervised(definition, input) {
38
+ return new Supervisor(definition, parseInstanceWorkflowInput(input)).execute();
39
+ }
40
+ /** Runs user code directly and converts only explicit operation halts into domain results. */
41
+ class Supervisor {
42
+ trigger;
43
+ repository;
44
+ defaultBranch;
45
+ workflowRunId;
46
+ definition;
47
+ request;
48
+ workflowId;
49
+ chainId;
50
+ baseBranch;
51
+ targetBranch;
52
+ calls = new Map();
53
+ resolutions = new Map();
54
+ answers = new Map();
55
+ effects = {};
56
+ identifiers = new Set();
57
+ terminal;
58
+ callsUsed = 0;
59
+ attentionOrdinal = 0;
60
+ constructor(definition, request) {
61
+ this.definition = definition;
62
+ this.request = request;
63
+ this.trigger = request.trigger;
64
+ this.repository = request.repository;
65
+ this.defaultBranch = request.defaultBranch;
66
+ const info = workflowInfo();
67
+ this.workflowId = info.workflowId;
68
+ this.workflowRunId = info.runId;
69
+ this.chainId = info.firstExecutionRunId;
70
+ this.baseBranch = workspaceBaseBranch(request);
71
+ this.targetBranch = targetBranch(request, this.chainId);
72
+ }
73
+ async execute() {
74
+ setHandler(instanceStateQuery, () => this.state());
75
+ setHandler(resolveInstanceUpdate, (value) => {
76
+ const resolution = parseResolveRequest(value);
77
+ this.resolutions.set(resolution.callId, resolution.action);
78
+ return this.state();
79
+ }, { validator: (value) => this.validateResolution(value) });
80
+ setHandler(answerInstanceUpdate, (value) => this.answerInstance(value), {
81
+ validator: (value) => {
82
+ this.assertAnswerable(parseAnswerRequest(value));
83
+ },
84
+ });
85
+ try {
86
+ await this.claimTrigger();
87
+ const value = await this.definition.run(this);
88
+ const cleanup = await this.cleanupWorkspaces();
89
+ return this.completedResult(value, cleanup);
90
+ }
91
+ catch (error) {
92
+ if (!(error instanceof WorkflowHalt))
93
+ throw error;
94
+ this.terminal = { reason: error.reason };
95
+ const cleanup = await this.cleanupWorkspaces();
96
+ await this.reportHalted(error.reason, cleanup);
97
+ return this.haltedResult(error.reason, cleanup);
98
+ }
99
+ }
100
+ /**
101
+ * Clear the trigger condition before user code runs. The poll starts this child under a stable ID
102
+ * first, so an overlapping poll is blocked by the open Execution rather than by GitHub state -
103
+ * claiming in the poll instead would leave a window where the label is gone and no durable
104
+ * instance exists. A claim that cannot write waits here on `CLAIM_RETRY_POLICY`; only a permanent
105
+ * failure halts. Either way, no agent runs against an unclaimed trigger.
106
+ */
107
+ async claimTrigger() {
108
+ const intake = this.definition.watcher?.intake;
109
+ // Reserve the identifier whether or not this watcher claims anything, so `intake` means the
110
+ // same thing in every workflow. Reserving it only when it is used would let a `mode: "level"`
111
+ // workflow take the name and then break the day someone switched that watcher to consuming.
112
+ if (intake === undefined) {
113
+ this.claimIdentifier("reserved effect", INTAKE_EFFECT_ID);
114
+ return;
115
+ }
116
+ // The declaration owns its claim shape and binds it to the trigger itself, so the engine never
117
+ // names an adapter field; a bind that cannot produce a claim throws the expected halt.
118
+ await this.runEffect(INTAKE_EFFECT_ID, intake(this.trigger), CLAIM_RETRY_POLICY);
119
+ }
120
+ agent(id, harness) {
121
+ this.claimIdentifier("agent handle", id);
122
+ return new SupervisedAgentHandle(this, id, harness);
123
+ }
124
+ effect(id, effect) {
125
+ return this.runEffect(id, effect, REPEATABLE_RETRY_POLICY);
126
+ }
127
+ async ask(id, channel, request) {
128
+ this.claimIdentifier("ask", id);
129
+ if (request.prompt.length === 0)
130
+ throw new Error("ask prompt must have at least one part");
131
+ const timeoutSeconds = askTimeoutSeconds(request.timeoutSeconds);
132
+ const promptParts = request.prompt.map((part) => typeof part === "string" ? part : { file: part.file });
133
+ this.consumeCall();
134
+ const callId = callAddress(id, 1);
135
+ this.setCall({ kind: "running", callId, operation: "ask", handleId: id, invocation: 1 });
136
+ let delivered;
137
+ try {
138
+ delivered = await this.deliverQuestion(id, channel, callId, promptParts);
139
+ }
140
+ catch (error) {
141
+ if (isCancellation(error))
142
+ throw error;
143
+ if (!(error instanceof ActivityFailure))
144
+ throw error;
145
+ const reason = `ask-delivery-failed:${callId}:${failureType(error.cause)}`;
146
+ this.setCall({ kind: "failed", callId, operation: "ask", handleId: id, reason });
147
+ this.halt(reason);
148
+ }
149
+ this.setCall({
150
+ kind: "awaiting_answer",
151
+ callId,
152
+ operation: "ask",
153
+ handleId: id,
154
+ channel: channel.channel,
155
+ correlation: delivered.correlation,
156
+ question: delivered.renderedQuestion,
157
+ });
158
+ await this.reportAwaitingAnswer(callId);
159
+ // A boolean park: true when a reply landed, false at the deadline. On a false, re-check once so
160
+ // an answer racing the timer wins the tie-break; otherwise settle the call failed and halt. The
161
+ // settlement leaves `awaiting_answer` before the throw, so the poller can never answer it later.
162
+ const answered = await condition(() => this.answers.has(callId), timeoutSeconds * 1_000);
163
+ if (!answered && !this.answers.has(callId)) {
164
+ const reason = askTimeoutReason(callId);
165
+ this.setCall({ kind: "failed", callId, operation: "ask", handleId: id, reason });
166
+ this.halt(reason);
167
+ }
168
+ const answer = this.answers.get(callId);
169
+ if (answer === undefined) {
170
+ throw new Error(`ask ${JSON.stringify(callId)} settled without an answer`);
171
+ }
172
+ return answer;
173
+ }
174
+ async deliverQuestion(id, channel, callId, promptParts) {
175
+ const activities = proxyActivities({
176
+ activityId: deliverQuestionActivityId(id),
177
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
178
+ retry: REPEATABLE_RETRY_POLICY,
179
+ });
180
+ return parseDeliverQuestionResult(await activities.deliver_question({
181
+ repository: this.repository,
182
+ channel: channel.channel,
183
+ options: channel.options,
184
+ workflowId: this.workflowId,
185
+ callId,
186
+ promptParts,
187
+ }));
188
+ }
189
+ /**
190
+ * Record the first answer atomically and settle the call in one Workflow Task. Temporal validates
191
+ * several buffered Updates before the workflow advances, so the validator alone cannot guarantee
192
+ * first-write-wins - the `assertAnswerable` check here is the guarantee: a second Update, whether a
193
+ * second polled reply or a manual answer racing the poller, is rejected once the first has settled
194
+ * the call.
195
+ */
196
+ answerInstance(value) {
197
+ const request = parseAnswerRequest(value);
198
+ const call = this.assertAnswerable(request);
199
+ this.answers.set(request.callId, request.answer);
200
+ this.setCall({
201
+ kind: "returned",
202
+ callId: request.callId,
203
+ operation: "ask",
204
+ handleId: call.handleId,
205
+ });
206
+ return this.state();
207
+ }
208
+ /**
209
+ * The one gate both the Update validator and its handler run. It throws an `ApplicationFailure` -
210
+ * not a plain `Error` - because a plain exception raised from an Update *handler* fails the Workflow
211
+ * Task and retries, whereas a `TemporalFailure` cleanly rejects the Update. The validator rejects
212
+ * the common case before the workflow advances; the handler re-checks to reject a duplicate that was
213
+ * buffered and validated before the first settled the call.
214
+ */
215
+ assertAnswerable(request) {
216
+ const call = this.calls.get(request.callId);
217
+ if (call?.kind !== "awaiting_answer") {
218
+ throw ApplicationFailure.nonRetryable(`call ${JSON.stringify(request.callId)} is not awaiting an answer`);
219
+ }
220
+ if (this.answers.has(request.callId)) {
221
+ throw ApplicationFailure.nonRetryable(`call ${JSON.stringify(request.callId)} is already answered`);
222
+ }
223
+ if (request.answer.trim().length === 0) {
224
+ throw ApplicationFailure.nonRetryable("answer must be a non-empty string");
225
+ }
226
+ return call;
227
+ }
228
+ reportAwaitingAnswer(callId) {
229
+ return this.emitAttention({
230
+ kind: "awaiting_answer",
231
+ reason: `awaiting-answer:${callId}`,
232
+ callAddress: callId,
233
+ suggestedCommands: [
234
+ `loopy answer ${this.workflowId} --call ${callId} "<answer>"`,
235
+ `loopy status ${this.workflowId}`,
236
+ ],
237
+ });
238
+ }
239
+ async runEffect(id, effect, retry) {
240
+ this.claimIdentifier("effect", id);
241
+ this.consumeCall();
242
+ const callId = callAddress(id, 1);
243
+ this.setCall({ kind: "running", callId, operation: "effect", handleId: id, invocation: 1 });
244
+ const result = await this.invokeEffect(id, effect, retry);
245
+ this.effects[id] = result;
246
+ const disposition = effectDisposition(result, id);
247
+ if (disposition.kind === "completed") {
248
+ this.setCall({ kind: "returned", callId, operation: "effect", handleId: id });
249
+ return;
250
+ }
251
+ this.setCall({
252
+ kind: "failed",
253
+ callId,
254
+ operation: "effect",
255
+ handleId: id,
256
+ reason: disposition.reason,
257
+ });
258
+ this.halt(disposition.reason);
259
+ }
260
+ halt(reason) {
261
+ throw new WorkflowHalt(reason);
262
+ }
263
+ consumeCall() {
264
+ if (this.callsUsed >= MAX_CALLS_PER_INSTANCE) {
265
+ this.halt(callBudgetReason(MAX_CALLS_PER_INSTANCE));
266
+ }
267
+ this.callsUsed += 1;
268
+ }
269
+ setCall(state) {
270
+ this.calls.set(state.callId, state);
271
+ }
272
+ async awaitResolution(callId) {
273
+ await condition(() => this.resolutions.has(callId));
274
+ }
275
+ takeResolution(callId) {
276
+ const action = this.resolutions.get(callId);
277
+ if (action === undefined)
278
+ throw new Error(`call ${JSON.stringify(callId)} has no resolution`);
279
+ this.resolutions.delete(callId);
280
+ return action;
281
+ }
282
+ reportParked(callId, reason) {
283
+ return this.emitAttention({
284
+ kind: "awaiting_reconciliation",
285
+ reason,
286
+ callAddress: callId,
287
+ suggestedCommands: [
288
+ `loopy resolve ${this.workflowId} --call ${callId} --retry`,
289
+ `loopy resolve ${this.workflowId} --call ${callId} --halt`,
290
+ ],
291
+ });
292
+ }
293
+ reportHalted(reason, cleanup) {
294
+ // Non-cancellable like cleanup: a halt on the way out of a cancelled scope must still surface.
295
+ return CancellationScope.nonCancellable(() => this.emitAttention({
296
+ kind: "halted",
297
+ reason,
298
+ cleanup,
299
+ suggestedCommands: [`loopy status ${this.workflowId}`],
300
+ }));
301
+ }
302
+ /**
303
+ * Best-effort by design: the alert about an outcome must never displace the outcome, so a failed
304
+ * emission is swallowed here and lives on as the failed Activity in Event History.
305
+ */
306
+ async emitAttention(detail) {
307
+ if (this.request.attention === undefined)
308
+ return;
309
+ this.attentionOrdinal += 1;
310
+ const activities = proxyActivities({
311
+ activityId: `attention:${this.attentionOrdinal}`,
312
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
313
+ retry: REPEATABLE_RETRY_POLICY,
314
+ });
315
+ const event = {
316
+ ...detail,
317
+ workflowId: this.workflowId,
318
+ runId: this.workflowRunId,
319
+ workflowName: this.definition.name,
320
+ triggerRef: triggerReference(this.trigger),
321
+ occurredAt: new Date().toISOString(),
322
+ };
323
+ try {
324
+ parseAttentionEmitResult(await activities.emit_attention({
325
+ repository: this.repository,
326
+ trigger: this.trigger,
327
+ attention: this.request.attention,
328
+ event,
329
+ }));
330
+ }
331
+ catch (error) {
332
+ if (isCancellation(error))
333
+ throw error;
334
+ if (!(error instanceof ActivityFailure))
335
+ throw error;
336
+ }
337
+ }
338
+ async invokeAgent(invocation) {
339
+ const activities = proxyActivities({
340
+ activityId: agentActivityId(invocation.handleId, invocation.ordinal, invocation.invocation),
341
+ taskQueue: this.request.agentTaskQueue,
342
+ startToCloseTimeout: invocation.timeoutMs + ACTIVITY_TIMEOUT_GRACE_MS,
343
+ heartbeatTimeout: HEARTBEAT_TIMEOUT_MS,
344
+ retry: { maximumAttempts: 1 },
345
+ cancellationType: ActivityCancellationType.WAIT_CANCELLATION_COMPLETED,
346
+ });
347
+ const request = {
348
+ repository: this.repository,
349
+ baseBranch: this.baseBranch,
350
+ trigger: this.trigger,
351
+ workflowRunId: this.workflowRunId,
352
+ chainId: this.chainId,
353
+ targetBranch: this.targetBranch,
354
+ handleId: invocation.handleId,
355
+ callId: invocation.callId,
356
+ invocation: invocation.invocation,
357
+ harness: invocation.harness.harness,
358
+ options: invocation.harness.options,
359
+ timeoutSeconds: invocation.timeoutMs / 1_000,
360
+ promptParts: invocation.promptParts,
361
+ schema: invocation.schema,
362
+ ...(invocation.resumeSessionId === undefined
363
+ ? {}
364
+ : { resumeSessionId: invocation.resumeSessionId }),
365
+ };
366
+ try {
367
+ return parseAgentCallResult(await activities.run_agent(request));
368
+ }
369
+ catch (error) {
370
+ if (isCancellation(error))
371
+ throw error;
372
+ if (!(error instanceof ActivityFailure))
373
+ throw error;
374
+ return agentActivityFailureResult(error);
375
+ }
376
+ }
377
+ async invokeEffect(id, effect, retry) {
378
+ const activities = proxyActivities({
379
+ activityId: effectActivityId(id),
380
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
381
+ retry,
382
+ });
383
+ try {
384
+ return parseEffectResult(await activities.emit_effect({
385
+ repository: this.repository,
386
+ effectId: id,
387
+ emitter: effect.emitter,
388
+ action: effect.action,
389
+ }));
390
+ }
391
+ catch (error) {
392
+ if (isCancellation(error))
393
+ throw error;
394
+ if (!(error instanceof ActivityFailure))
395
+ throw error;
396
+ return { status: "failed", reason: `effect-activity-failed:${failureType(error.cause)}` };
397
+ }
398
+ }
399
+ claimIdentifier(kind, id) {
400
+ assertIdentifier(kind, id);
401
+ if (this.identifiers.has(id)) {
402
+ // The engine claims its reserved identifiers before user code runs, so a collision on one is
403
+ // always the workflow taking a name that was never available - worth saying, since "duplicate"
404
+ // would send an author looking for their own second use of it.
405
+ throw new Error(RESERVED_EFFECT_IDS.has(id)
406
+ ? `reserved-identifier:${id}`
407
+ : `duplicate-identifier:${kind}:${id}`);
408
+ }
409
+ this.identifiers.add(id);
410
+ }
411
+ validateResolution(value) {
412
+ const resolution = parseResolveRequest(value);
413
+ const call = this.calls.get(resolution.callId);
414
+ if (call?.kind !== "parked") {
415
+ throw new Error(`call ${JSON.stringify(resolution.callId)} is not awaiting reconciliation`);
416
+ }
417
+ if (this.resolutions.has(resolution.callId)) {
418
+ throw new Error(`call ${JSON.stringify(resolution.callId)} is already resolved`);
419
+ }
420
+ }
421
+ async cleanupWorkspaces() {
422
+ const activities = proxyActivities({
423
+ activityId: "cleanup",
424
+ startToCloseTimeout: CONTROL_ACTIVITY_TIMEOUT_MS,
425
+ retry: REPEATABLE_RETRY_POLICY,
426
+ });
427
+ try {
428
+ const result = await CancellationScope.nonCancellable(() => activities.cleanup_workspace({ chainId: this.chainId }));
429
+ return { status: "completed", removed: result.removed };
430
+ }
431
+ catch (error) {
432
+ if (!(error instanceof ActivityFailure))
433
+ throw error;
434
+ return { status: "failed", reason: `cleanup-activity-failed:${failureType(error.cause)}` };
435
+ }
436
+ }
437
+ state() {
438
+ const calls = [...this.calls.values()];
439
+ const state = {
440
+ workflow: this.definition.name,
441
+ trigger: this.trigger,
442
+ domainStatus: projectDomainStatus(calls, this.terminal),
443
+ calls,
444
+ callsUsed: this.callsUsed,
445
+ callLimit: MAX_CALLS_PER_INSTANCE,
446
+ };
447
+ if (this.terminal !== undefined)
448
+ state.terminal = this.terminal;
449
+ return state;
450
+ }
451
+ completedResult(value, cleanup) {
452
+ return {
453
+ domainStatus: "completed",
454
+ value,
455
+ workflow: this.definition.name,
456
+ calls: [...this.calls.values()],
457
+ effects: this.effects,
458
+ cleanup,
459
+ };
460
+ }
461
+ haltedResult(reason, cleanup) {
462
+ return {
463
+ domainStatus: "halted",
464
+ reason,
465
+ workflow: this.definition.name,
466
+ calls: [...this.calls.values()],
467
+ effects: this.effects,
468
+ cleanup,
469
+ };
470
+ }
471
+ }
472
+ function targetBranch(request, chainId) {
473
+ if (request.trigger.repository === request.repository &&
474
+ request.trigger.targetBranch !== undefined) {
475
+ return request.trigger.targetBranch;
476
+ }
477
+ const raw = `${request.trigger.kind}-${request.trigger.id}`;
478
+ const objectSlug = raw.replaceAll(/[^A-Za-z0-9._-]+/g, "-").replaceAll(/^-+|-+$/g, "") || "trigger";
479
+ return `loopy/${request.workflow}/${objectSlug.slice(0, 80)}-${chainId.slice(0, 8)}`;
480
+ }
481
+ function workspaceBaseBranch(request) {
482
+ return request.trigger.repository === request.repository
483
+ ? (request.trigger.baseBranch ?? request.defaultBranch)
484
+ : request.defaultBranch;
485
+ }
486
+ function agentActivityFailureResult(error) {
487
+ const cause = error.cause;
488
+ if (cause instanceof ApplicationFailure &&
489
+ cause.type !== undefined &&
490
+ cause.type !== null &&
491
+ DEFINITIVE_AGENT_ACTIVITY_FAILURE_TYPES.has(cause.type)) {
492
+ return { status: "failed", reason: `agent-activity-failed:${cause.type}:${cause.message}` };
493
+ }
494
+ return {
495
+ status: "indeterminate",
496
+ reason: `agent-activity-indeterminate:${failureType(cause)}`,
497
+ };
498
+ }
499
+ function failureType(cause) {
500
+ return cause instanceof ApplicationFailure
501
+ ? cause.type && cause.type !== "Error"
502
+ ? cause.type
503
+ : "ApplicationFailure"
504
+ : (cause?.constructor.name ?? "Error");
505
+ }
506
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/temporal/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type NativeConnection, Worker, type WorkerOptions, type WorkflowBundleOption } from "@temporalio/worker";
2
+ import type { TemporalSettings } from "../settings.js";
3
+ import type { AgentActivities } from "./activities.js";
4
+ export interface WorkerRuntimeOptions {
5
+ /** The fixed control queue configured for this loopy deployment. */
6
+ controlTaskQueue: string;
7
+ workflowBundle: WorkflowBundleOption;
8
+ maxConcurrentAgentActivities: number;
9
+ shutdownGraceSeconds: number;
10
+ configureControlWorker?: (options: WorkerOptions & {
11
+ workflowBundle: WorkflowBundleOption;
12
+ }) => WorkerOptions;
13
+ }
14
+ export declare class WorkerRuntime {
15
+ readonly controlWorker: Worker;
16
+ readonly agentWorker: Worker;
17
+ constructor(controlWorker: Worker, agentWorker: Worker);
18
+ run(stop?: Promise<void>): Promise<void>;
19
+ }
20
+ export declare function createWorkerRuntime(connection: NativeConnection, settings: TemporalSettings, activities: AgentActivities, options: WorkerRuntimeOptions): Promise<WorkerRuntime>;
21
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/temporal/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,MAAM,EACN,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAWvD,MAAM,WAAW,oBAAoB;IACnC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,oBAAoB,CAAC;IACrC,4BAA4B,EAAE,MAAM,CAAC;IACrC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,CACvB,OAAO,EAAE,aAAa,GAAG;QAAE,cAAc,EAAE,oBAAoB,CAAA;KAAE,KAC9D,aAAa,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,YAAY,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAGrD;IAEK,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B7C;CACF;AASD,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC,CA+BxB"}
@@ -0,0 +1,82 @@
1
+ import { Worker, } from "@temporalio/worker";
2
+ import { CLEANUP_WORKSPACE_ACTIVITY_TYPE, DELIVER_QUESTION_ACTIVITY_TYPE, EMIT_ATTENTION_ACTIVITY_TYPE, EMIT_EFFECT_ACTIVITY_TYPE, OBSERVE_INSTANCES_ACTIVITY_TYPE, RUN_AGENT_ACTIVITY_TYPE, RUN_WATCHER_ACTIVITY_TYPE, } from "./contracts.js";
3
+ export class WorkerRuntime {
4
+ controlWorker;
5
+ agentWorker;
6
+ constructor(controlWorker, agentWorker) {
7
+ this.controlWorker = controlWorker;
8
+ this.agentWorker = agentWorker;
9
+ }
10
+ async run(stop) {
11
+ const controlRun = this.controlWorker.run();
12
+ const agentRun = this.agentWorker.run();
13
+ const running = [controlRun, agentRun];
14
+ let raceFailure;
15
+ if (stop === undefined) {
16
+ try {
17
+ await Promise.race(running);
18
+ }
19
+ catch (error) {
20
+ raceFailure = error;
21
+ }
22
+ }
23
+ else {
24
+ try {
25
+ await Promise.race([...running, stop]);
26
+ }
27
+ catch (error) {
28
+ raceFailure = error;
29
+ }
30
+ }
31
+ stopWorker(this.controlWorker);
32
+ stopWorker(this.agentWorker);
33
+ const settled = await Promise.allSettled(running);
34
+ const failures = settled
35
+ .filter((result) => result.status === "rejected")
36
+ .map((result) => result.reason);
37
+ if (failures.length === 1)
38
+ throw failures[0];
39
+ if (failures.length > 1)
40
+ throw new AggregateError(failures, "loopy Worker Entities failed");
41
+ if (raceFailure !== undefined)
42
+ throw raceFailure;
43
+ }
44
+ }
45
+ function stopWorker(worker) {
46
+ // Worker.shutdown() throws IllegalStateError outside the RUNNING state, and both Workers are
47
+ // stopped together after one of them may already have stopped on its own. Guard the call so
48
+ // run() never throws before it awaits the Workers and the caller closes the connection.
49
+ if (worker.getState() === "RUNNING")
50
+ worker.shutdown();
51
+ }
52
+ export async function createWorkerRuntime(connection, settings, activities, options) {
53
+ const shutdownGraceTime = options.shutdownGraceSeconds * 1_000;
54
+ const baseControlOptions = {
55
+ connection,
56
+ namespace: settings.namespace,
57
+ taskQueue: options.controlTaskQueue,
58
+ workflowBundle: options.workflowBundle,
59
+ activities: {
60
+ [RUN_WATCHER_ACTIVITY_TYPE]: activities.runWatcher.bind(activities),
61
+ [EMIT_EFFECT_ACTIVITY_TYPE]: activities.emitEffect.bind(activities),
62
+ [EMIT_ATTENTION_ACTIVITY_TYPE]: activities.emitAttention.bind(activities),
63
+ [OBSERVE_INSTANCES_ACTIVITY_TYPE]: activities.observeInstances.bind(activities),
64
+ [DELIVER_QUESTION_ACTIVITY_TYPE]: activities.deliverQuestion.bind(activities),
65
+ [CLEANUP_WORKSPACE_ACTIVITY_TYPE]: activities.cleanupWorkspace.bind(activities),
66
+ },
67
+ shutdownGraceTime,
68
+ };
69
+ const controlWorker = await Worker.create(options.configureControlWorker?.(baseControlOptions) ?? baseControlOptions);
70
+ const agentWorker = await Worker.create({
71
+ connection,
72
+ namespace: settings.namespace,
73
+ taskQueue: settings.agentTaskQueue,
74
+ activities: {
75
+ [RUN_AGENT_ACTIVITY_TYPE]: activities.runAgent.bind(activities),
76
+ },
77
+ maxConcurrentActivityTaskExecutions: options.maxConcurrentAgentActivities,
78
+ shutdownGraceTime,
79
+ });
80
+ return new WorkerRuntime(controlWorker, agentWorker);
81
+ }
82
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/temporal/worker.ts"],"names":[],"mappings":"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"}