create-open-autonomy 2.3.10 → 2.3.12

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.12",
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.12' } 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.
@@ -169,7 +172,9 @@ class Followed {
169
172
  const ready = msgs.slice(0, n);
170
173
  const turns = ready.flatMap(turnsOf);
171
174
  if (turns.length) {
172
- this.item ??= itemIn(turns);
175
+ // Only a board run serves an item; a scheduled session (the PM over the whole board) mentions branches and
176
+ // tasks without being about one.
177
+ if (sourceOf(this.d) === 'board') this.item ??= itemIn(turns);
173
178
  this.sha ??= shaIn(turns);
174
179
  await this.session!.turns(turns, this.item);
175
180
  this.seq = this.session!.seq;
@@ -192,6 +197,9 @@ class Followed {
192
197
  }
193
198
  async end(why: string): Promise<void> {
194
199
  if (this.ended) return;
200
+ // Silence is not the end of a board run while the board still shows its attempt running: a world coming up or a
201
+ // long check is one tool call, minutes without a word. The board's own record says when the attempt is over.
202
+ if (why.startsWith('idle') && kindOf(this.d) === 'run' && this.item && runningItems.has(this.item)) { this.arm(); return; }
195
203
  this.ended = true;
196
204
  clearTimeout(this.timer);
197
205
  await this.sync(true);
@@ -282,6 +290,8 @@ async function board(): Promise<void> {
282
290
  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
291
  // A read that found no board at all (the database mid-write) is not an empty board.
284
292
  if (!tasks.length) return;
293
+ runningItems.clear();
294
+ for (const t of tasks) if (t.lane === 'running') runningItems.add(t.id);
285
295
  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
296
  const digest = JSON.stringify(items);
287
297
  if (digest !== roadmapDigest) {
@@ -34,7 +34,8 @@ is not done.
34
34
  6. Push the branch: `git push -u origin agent/<task id>`. The landing workflow opens the pull request and merges
35
35
  it when the checks pass. Never wait for it; never open a pull request; never push to `main`; never rewrite
36
36
  history. If the branch exists from an earlier attempt, push to `agent/<task id>-<YYYYMMDD-HHMM>`.
37
- 7. Hand off: `kanban_request_review` naming the branch and the commit, and what is verified how.
37
+ 7. Hand off: `kanban_request_review` naming the branch and the commit, and what is verified how. Name no reviewer:
38
+ the review lane takes the task itself, and a profile the home does not have would hold it forever.
38
39
 
39
40
  If a line cannot be made true from here, `kanban_block` with exactly what is missing, and stop. Never file,
40
41
  split or decompose tasks, and never create one: the board is the owner's. Do not loop on a failure you cannot