@atolis-hq/wake 0.3.48 → 0.3.50

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.
@@ -78,7 +78,10 @@ function projectWork(view, event, occurredAt) {
78
78
  event.eventType === WorkEventType.ItemCancelled) {
79
79
  return {
80
80
  ...view,
81
- cards: { ...view.cards, [id]: { ...current, condition: BoardCondition.Finished } },
81
+ cards: {
82
+ ...view.cards,
83
+ [id]: { ...withoutAwaitingApproval(current), condition: BoardCondition.Finished },
84
+ },
82
85
  };
83
86
  }
84
87
  // Deletion is a purge, not a lifecycle outcome — the card must disappear
@@ -265,7 +268,10 @@ function projectRunTerminal(view, event, workId, card) {
265
268
  ...withoutLegacyActiveRun(card),
266
269
  activeRuns: withoutActiveRun(activeRuns, event.stream.id),
267
270
  ...(terminal === undefined ? {} : { lastRunOutcome: terminal.lastRunOutcome }),
268
- ...(terminal === undefined || isChildRun || terminal.condition === undefined
271
+ ...(terminal === undefined ||
272
+ isChildRun ||
273
+ card.condition === BoardCondition.Finished ||
274
+ terminal.condition === undefined
269
275
  ? {}
270
276
  : { condition: terminal.condition }),
271
277
  totalDurationMs: card.totalDurationMs + runDurationMs,
@@ -295,7 +301,7 @@ function projectRunStarted(view, event) {
295
301
  ? withoutLegacyActiveRun(card)
296
302
  : withoutLegacyActiveRun(withoutLastRunOutcome(withoutAwaitingApproval(card)))),
297
303
  runCount: card.runCount + 1,
298
- ...(isChildRun ? {} : { condition: BoardCondition.Active }),
304
+ ...(shouldSetCardActive(card, isChildRun) ? { condition: BoardCondition.Active } : {}),
299
305
  lastRunAt: event.payload.startedAt,
300
306
  activeRuns: {
301
307
  ...activeRuns,
@@ -311,6 +317,9 @@ function projectRunStarted(view, event) {
311
317
  },
312
318
  };
313
319
  }
320
+ function shouldSetCardActive(card, isChildRun) {
321
+ return !isChildRun && card.condition !== BoardCondition.Finished;
322
+ }
314
323
  function projectRunnerResult(view, workId, card, metadata) {
315
324
  const usage = agentTokenUsage(metadata);
316
325
  return {
@@ -108,4 +108,4 @@ export function resolveWakeVersion(options = {}) {
108
108
  return `g${headHash.slice(0, 7)}`;
109
109
  return '0.1.0-dev';
110
110
  }
111
- export const wakeVersion = "g6d47388";
111
+ export const wakeVersion = "g562f222";
@@ -1,3 +1,4 @@
1
+ /* eslint-disable max-lines */
1
2
  import { ActivityOutcomeKind, ReviewActorKind, ReviewDecisionKind, ReviewerAuthorizationSource, createPullRequestService, isReviewAuthorized, } from '../../../activities/index.js';
2
3
  import { ApprovalAuthorityKind } from '../../../orchestration/index.js';
3
4
  import { BuiltInResourceKind, ResourceCorrelationRole, ResourceStreamKind, resourceId, } from '../../../resources/index.js';
@@ -52,6 +53,7 @@ async function applyFormalReviewSignal(input) {
52
53
  await applyPullRequestWorkflowSignal({
53
54
  event,
54
55
  resources,
56
+ work,
55
57
  lookup,
56
58
  orchestration,
57
59
  adapter,
@@ -88,6 +90,7 @@ async function applyIssueReviewSignal(input) {
88
90
  await applyWorkflowSignal({
89
91
  event,
90
92
  resources,
93
+ work,
91
94
  orchestration,
92
95
  resourceId: resourceIdValue,
93
96
  outcome: command === '/approved' ? ActivityOutcomeKind.Done : ActivityOutcomeKind.Rejected,
@@ -102,6 +105,7 @@ async function applyIssueReviewSignal(input) {
102
105
  await applyWorkflowSignal({
103
106
  event,
104
107
  resources,
108
+ work,
105
109
  orchestration,
106
110
  resourceId: resourceIdValue,
107
111
  outcome: ActivityOutcomeKind.Rejected,
@@ -112,7 +116,7 @@ async function applyIssueReviewSignal(input) {
112
116
  }
113
117
  async function applyIssueRetrySignal(input) {
114
118
  const { event, resources, work, orchestration, resourceId: resourceIdValue } = input;
115
- if (work === undefined || orchestration === undefined)
119
+ if (orchestration === undefined)
116
120
  return;
117
121
  if (!isReviewAuthorized({
118
122
  actorId: event.payload.actor.id,
@@ -128,14 +132,13 @@ async function applyIssueRetrySignal(input) {
128
132
  if (!workItemIds.includes(workflow.workItemId) ||
129
133
  workflow.parentWorkflowInstanceId !== undefined)
130
134
  continue;
131
- const item = await work.get(workflow.workItemId);
132
- if (item === null || item.deleted || item.frozen || item.state !== WorkStatus.Open)
135
+ if (!(await isEligibleWorkItem(work, workflow.workItemId)))
133
136
  continue;
134
137
  await ignoreIneligibleOperatorRetry(() => orchestration.retryBlockedFailedStage(workflow.workflowInstanceId, commandContext(event)));
135
138
  }
136
139
  }
137
140
  async function applyIssueApprovalSignal(input) {
138
- const { event, command, resources, lookup, orchestration, adapter } = input;
141
+ const { event, command, resources, work, lookup, orchestration, adapter } = input;
139
142
  if (resources === undefined || lookup === undefined || orchestration === undefined)
140
143
  return;
141
144
  const resourceIdValue = await lookup.resourceIdForExternalKey({
@@ -147,6 +150,7 @@ async function applyIssueApprovalSignal(input) {
147
150
  await applyWorkflowSignal({
148
151
  event,
149
152
  resources,
153
+ work,
150
154
  orchestration,
151
155
  resourceId: resourceIdValue,
152
156
  outcome: command === '/approved' ? ActivityOutcomeKind.Done : ActivityOutcomeKind.Rejected,
@@ -154,7 +158,7 @@ async function applyIssueApprovalSignal(input) {
154
158
  });
155
159
  }
156
160
  async function applyPullRequestWorkflowSignal(input) {
157
- const { event, lookup, resources, orchestration, adapter, outcome } = input;
161
+ const { event, lookup, resources, work, orchestration, adapter, outcome } = input;
158
162
  if (event.payload.actor.kind !== ReviewActorKind.Human ||
159
163
  lookup === undefined ||
160
164
  resources === undefined ||
@@ -169,19 +173,22 @@ async function applyPullRequestWorkflowSignal(input) {
169
173
  await applyWorkflowSignal({
170
174
  event,
171
175
  resources,
176
+ work,
172
177
  orchestration,
173
178
  resourceId: resourceIdValue,
174
179
  outcome,
175
180
  });
176
181
  }
177
182
  async function applyWorkflowSignal(input) {
178
- const { event, resources, orchestration, resourceId: resourceIdValue, outcome, acceptWaitingSignal = true, resumeBlockedOnChanges = false, } = input;
183
+ const { event, resources, work, orchestration, resourceId: resourceIdValue, outcome, acceptWaitingSignal = true, resumeBlockedOnChanges = false, } = input;
179
184
  const workItemIds = (await resources.correlations(resourceIdValue))
180
185
  .filter((correlation) => correlation.role === ResourceCorrelationRole.Primary)
181
186
  .map((correlation) => correlation.workItemId);
182
187
  for (const workflow of await orchestration.listAll()) {
183
188
  if (!workItemIds.includes(workflow.workItemId))
184
189
  continue;
190
+ if (!(await isEligibleWorkItem(work, workflow.workItemId)))
191
+ continue;
185
192
  if (workflow.waitingFor !== undefined && acceptWaitingSignal) {
186
193
  await orchestration.acceptSignal(workflow.workflowInstanceId, {
187
194
  kind: workflow.waitingFor.signalKind,
@@ -202,3 +209,7 @@ async function applyWorkflowSignal(input) {
202
209
  }
203
210
  }
204
211
  }
212
+ async function isEligibleWorkItem(work, workItemId) {
213
+ const item = await work.get(workItemId);
214
+ return item?.state === WorkStatus.Open && !item.deleted && !item.frozen;
215
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atolis-hq/wake",
3
- "version": "0.3.48",
3
+ "version": "0.3.50",
4
4
  "description": "Local autonomous agent control plane for software development",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {