factory-ai 1.5.0 → 1.5.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes follow semantic versioning and the Keep a Changelog structur
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.5.1] - 2026-07-13
8
+
9
+ ### Fixed
10
+
11
+ - Exclude unfinished tasks from stale-agent health after their objective reaches a terminal state.
12
+
7
13
  ## [1.5.0] - 2026-07-13
8
14
 
9
15
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "factory-ai",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Deploy a private autonomous coding-agent factory on Azure: isolated builders, testers, security reviewers, durable orchestration, multi-model routing, memory, cost controls, and gated GitHub pull requests.",
5
5
  "private": false,
6
6
  "license": "MIT",
package/src/dashboard.js CHANGED
@@ -102,6 +102,7 @@ function taskState(task, results) {
102
102
  export function aggregateDashboard({ states = [], queue = {}, cost = null, runtime = {}, hostUptimeSeconds = 0, warnings = [], now = new Date() }) {
103
103
  const objectives = states.map((state) => {
104
104
  const results = state.results ?? {};
105
+ const objectiveTerminal = ["complete", "failed", "blocked", "cancelled", "denied", "expired"].includes(state.status);
105
106
  const plannedTasks = state.tasks?.length ? state.tasks : state.status === "planning" ? [{ id: "planner0", role: "planner", title: "Create delivery graph", dependsOn: [], complexity: "complex" }] : [];
106
107
  const tasks = plannedTasks.map((task) => {
107
108
  const resultState = taskState(task, results);
@@ -120,7 +121,7 @@ export function aggregateDashboard({ states = [], queue = {}, cost = null, runti
120
121
  ? (new Date(results[task.id]?.completedAt ?? now).getTime() - new Date(results[task.id].startedAt).getTime()) / 1000
121
122
  : 0,
122
123
  activity,
123
- stale: isStaleActivity(activity, stateValue, now, liveActivity ? 120 : 600),
124
+ stale: !objectiveTerminal && isStaleActivity(activity, stateValue, now, liveActivity ? 120 : 600),
124
125
  activityAgeSeconds: activity?.occurredAt ? Math.max(0, (now.getTime() - new Date(activity.occurredAt).getTime()) / 1000) : null,
125
126
  retries: activity?.retryCount ?? 0,
126
127
  lastError: activity?.lastError,