create-open-autonomy 2.3.10 → 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.10",
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.10' } 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,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) {