create-open-autonomy 2.3.9 → 2.3.11

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-open-autonomy",
3
- "version": "2.3.9",
3
+ "version": "2.3.11",
4
4
  "description": "The default Open Autonomy starter kit: a complete repository that runs its own Hermes agent against the platform, with the SDK wired in. `bun create open-autonomy <dir>` scaffolds one.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/src/kit.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
10
10
  import { dirname, join, relative, resolve } from 'node:path';
11
11
 
12
- export const KIT = { name: 'hermes', version: '2.3.9' } as const;
12
+ export const KIT = { name: 'hermes', version: '2.3.11' } as const;
13
13
  export const KIT_FILE = '.open-autonomy/kit.json';
14
14
  const TEMPLATE = resolve(import.meta.dir, '..', 'template');
15
15
 
@@ -25,5 +25,10 @@ jobs:
25
25
  --body "Opened by the landing workflow for \`$BRANCH\`. It merges on its own when the required checks pass."
26
26
  existing=$(gh pr list -R "$REPO" --head "$BRANCH" --state open --json number -q '.[0].number')
27
27
  fi
28
- gh pr merge -R "$REPO" "$existing" --merge
29
- echo "pull request #$existing: merged"
28
+ # The merge races other landings ("base branch was modified") and GitHub's own mergeability check; try again a
29
+ # few times before giving up, so two branches landing in the same minute both land.
30
+ for attempt in 1 2 3 4 5 6; do
31
+ if gh pr merge -R "$REPO" "$existing" --merge; then echo "pull request #$existing: merged"; exit 0; fi
32
+ echo "merge attempt $attempt did not go through; retrying in 20s"; sleep 20
33
+ done
34
+ echo "pull request #$existing: could not be merged after six attempts"; exit 1
@@ -25,6 +25,9 @@ const oa = new OpenAutonomy({ baseUrl, key: process.env.OPEN_AUTONOMY_KEY ?? 'va
25
25
  const stateFile = resolve(cfg.state_file);
26
26
  const IDLE_END_MS = Number(process.env.OPEN_AUTONOMY_IDLE_END_MS ?? 5 * 60_000);
27
27
  const TURN_END_MS = Number(process.env.OPEN_AUTONOMY_TURN_END_MS ?? 15_000);
28
+ // The board's tasks with an attempt still running, as of its last read: a run session serving one of them is not over,
29
+ // however long its transcript is silent.
30
+ const runningItems = new Set<string>();
28
31
  const log = (m: string) => console.log(`reporter: ${m}`);
29
32
  // The valve holds the key; its health line says when the key expires. Logged once at start so a reader of
30
33
  // either log sees the expiry.
@@ -192,6 +195,9 @@ class Followed {
192
195
  }
193
196
  async end(why: string): Promise<void> {
194
197
  if (this.ended) return;
198
+ // Silence is not the end of a board run while the board still shows its attempt running: a world coming up or a
199
+ // long check is one tool call, minutes without a word. The board's own record says when the attempt is over.
200
+ if (why.startsWith('idle') && kindOf(this.d) === 'run' && this.item && runningItems.has(this.item)) { this.arm(); return; }
195
201
  this.ended = true;
196
202
  clearTimeout(this.timer);
197
203
  await this.sync(true);
@@ -282,6 +288,8 @@ async function board(): Promise<void> {
282
288
  const tasks = Object.values(read.workflow?.boards ?? {}).flatMap((b) => Object.values(b.tasks ?? {})).filter((t) => t.lane !== 'archived' && (t.assignee ?? 'default') === 'default').sort((a, b) => (a.created_at ?? '').localeCompare(b.created_at ?? '') || a.id.localeCompare(b.id));
283
289
  // A read that found no board at all (the database mid-write) is not an empty board.
284
290
  if (!tasks.length) return;
291
+ runningItems.clear();
292
+ for (const t of tasks) if (t.lane === 'running') runningItems.add(t.id);
285
293
  const items: RoadmapItem[] = tasks.map((t) => ({ id: t.id, title: t.title ?? t.id, status: statusOf(t.lane), acceptance: (t.body ?? '').split('\n').filter((l) => /^- /.test(l)).map((l) => l.slice(2).trim()) }));
286
294
  const digest = JSON.stringify(items);
287
295
  if (digest !== roadmapDigest) {