@kendoo.agentdesk/agentdesk 0.28.4 → 0.29.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
@@ -8,28 +8,38 @@ All user-facing changes to AgentDesk. Each entry is tagged:
8
8
 
9
9
  Internal refactors, infrastructure changes, and architectural notes are not listed here.
10
10
 
11
- ## [Unreleased]
11
+ ## [0.29.1] — 2026-09-20
12
+
13
+ ### Fixed
14
+ - `[Both]` Session token totals now update after each completed phase and survive cancellation, reconnects, and server restarts instead of displaying zero.
15
+
16
+ ### Changed
17
+ - `[UI]` The session feed now stays put while you're reading history: auto-scroll only follows new messages when you're already at the bottom. A "New messages" button appears otherwise, and jumps you down on click. Scroll position is preserved across session switches.
18
+ - `[UI]` The compact team bar's avatar hover now shows each agent's role, not just their name.
19
+
20
+ ## [0.29.0] — 2026-09-20
12
21
 
13
22
  ### Fixed
14
23
  - `[Both]` Daemon sessions now have a configurable concurrency limit (default 3), with excess requests queued. Cancellation during confirmation stays stopped; workspace quarantine survives cancellation and restart, including when processes outlive a successful session.
15
24
  - `[Both]` Worktree Git commands ignore inherited Git config overrides, lock cleanup tolerates concurrent removal, runtime config healing is restored, handoff sessions remain open, and outcome branch validation includes the 300-character boundary.
16
25
  - `[Both]` Session restoration checks persisted ownership; outcome capture tolerates diagnostic output and malformed receipts. Live outcomes survive dashboard loading races and appear on the mobile Run screen.
17
- - `[Both]` Phase handoff JSON is captured automatically instead of repeated in chat; a fallback filter suppresses duplicate structured-output objects in agent messages.
18
- - `[UI]` Internal helpers outside a session's declared team no longer appear in its roster or contribute SAY/ACT messages to the conversation feed.
19
- - `[Both]` Cancellation now stops waiting after 30 seconds and quarantines worktrees with surviving processes. Daemon startup and periodic checks recover stale locks without deleting unfinished work.
20
- - `[Both]` Session agents can no longer modify shared Git refs or hooks. Private Git state is published back only to the session branch, with conflict checks.
21
- - `[Both]` Cancellation releases the workspace after child processes stop even if the agent connection stalls. Dashboard sessions retain their tracker links.
22
- - `[CLI]` Conflicting resume and branch options now report an error.
23
- - `[UI]` Daemon status counts sessions within the current account without scanning other accounts.
24
26
 
25
27
  ### Added
26
28
  - `[Both]` Confirmed PR creation and final tracker replies are recorded during the session and shown separately from its status, surviving disconnects and later failures. Background outcome recovery remains deferred.
27
29
  - `[UI]` The sidebar shows the 12 most recent past sessions by default, with a More control and automatic reveal of a selected older session.
28
- - `[UI]` The docked team footer starts as a compact avatar/status row. Drag its handle upward for the full grid, or use arrow keys and Enter to resize it.
29
30
  - `[Both]` New sessions use separate Git worktrees by default, so tasks can run concurrently on different branches in the same repository. Choose the starting branch, create or reuse a branch, or opt out to use the existing directory.
30
31
  - `[Both]` Archived sessions automatically clean up clean, merged worktrees while retaining branches. Unfinished work stays available to resume, with a review reminder after 14 days and explicit confirmation before discarding files.
31
32
  - `[UI]` A Worktrees panel shows session directories, cleanup status, and resume controls.
32
33
 
34
+ ## [0.28.3] — 2026-09-19
35
+
36
+ ### Changed
37
+ - `[UI]` The docked team status bar now defaults to a compact one-line strip (avatars + current status) instead of the full grid, with a drag handle (and keyboard resize) to expand it.
38
+ - `[Both]` Session messages are filtered to the session's declared roster, so nested/ad-hoc subagents (e.g. a generic search delegate) no longer show their internal narration in the feed as if they were a team member.
39
+
40
+ ### Fixed
41
+ - `[CLI]` Every phase (INTAKE, PLAN, EXECUTION, REVIEW, SUMMARY, SOLO) told the model to answer with the raw handoff JSON as its final chat reply, so the model printed that JSON into the session feed on top of the SDK's separate structured-output channel. Phase prompts no longer ask for that, and a code-side guard strips it if a model still echoes it.
42
+
33
43
  ## [0.28.2] — 2026-09-18
34
44
 
35
45
  ### Changed
package/cli/daemon.mjs CHANGED
@@ -557,7 +557,7 @@ async function confirmIncomingSession({ project, taskId, prompt, signal }) {
557
557
  return (event) => {
558
558
  // Confirmed accomplishments may arrive during cancellation teardown.
559
559
  // They do not revive the session or emit a second terminal event.
560
- if (["session:outcome", "session:workspace"].includes(event.type)) { sendBuffered(sessionId, event); return; }
560
+ if (["session:outcome", "session:workspace", "session:usage"].includes(event.type)) { sendBuffered(sessionId, event); return; }
561
561
  if (activeSessions.get(sessionId) !== activeSession) return;
562
562
  // A cancelled session already sent its terminal event; the
563
563
  // orchestrator's own unwind must not send a second one.
@@ -305,6 +305,7 @@ async function executeSession({
305
305
  totals.inputTokens += summary.inputTokens;
306
306
  totals.outputTokens += summary.outputTokens;
307
307
  totals.costUsd += summary.costUsd;
308
+ emit({ type: "session:usage", inputTokens: totals.inputTokens, outputTokens: totals.outputTokens });
308
309
 
309
310
  if (abortController.signal.aborted) { aborted = true; break; }
310
311
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kendoo.agentdesk/agentdesk",
3
- "version": "0.28.4",
3
+ "version": "0.29.1",
4
4
  "description": "AI team orchestrator for Claude Code — run collaborative agent sessions from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,7 +22,7 @@
22
22
  "server": "node server/index.mjs",
23
23
  "build": "vite build",
24
24
  "preview": "vite preview",
25
- "test": "node --test tests/server.test.mjs tests/agents.test.mjs tests/homepage.test.mjs tests/sessionUtils.test.mjs tests/tracker-url.test.mjs tests/session-preflight.test.mjs tests/access.test.mjs tests/project-ownership.test.mjs tests/random-hex.test.mjs tests/projects-registry.test.mjs tests/phase-loop.test.mjs tests/proc.test.mjs tests/crypto.test.mjs tests/dotenv.test.mjs tests/update-check.test.mjs tests/setup-helpers.test.mjs tests/project-key.test.mjs tests/tracker-project.test.mjs tests/tracker-check.test.mjs tests/config.test.mjs tests/engine-env.test.mjs tests/engine-events.test.mjs tests/engine-verdict.test.mjs tests/engine-hooks.test.mjs tests/engine-agents.test.mjs tests/session-isolation.test.mjs tests/engine-session.test.mjs tests/engine-prompts.test.mjs tests/engine-schemas.test.mjs tests/engine-claude-auth.test.mjs tests/worktrees.test.mjs tests/workspaces-api.test.mjs tests/engine-outcome.test.mjs tests/session-outcomes.test.mjs tests/outcome-hydration.test.mjs tests/mobile-outcomes.test.mjs tests/session-queue.test.mjs",
25
+ "test": "node --test tests/server.test.mjs tests/agents.test.mjs tests/homepage.test.mjs tests/sessionUtils.test.mjs tests/tracker-url.test.mjs tests/session-preflight.test.mjs tests/access.test.mjs tests/project-ownership.test.mjs tests/random-hex.test.mjs tests/projects-registry.test.mjs tests/phase-loop.test.mjs tests/proc.test.mjs tests/crypto.test.mjs tests/dotenv.test.mjs tests/update-check.test.mjs tests/setup-helpers.test.mjs tests/project-key.test.mjs tests/tracker-project.test.mjs tests/tracker-check.test.mjs tests/config.test.mjs tests/engine-env.test.mjs tests/engine-events.test.mjs tests/engine-verdict.test.mjs tests/engine-hooks.test.mjs tests/engine-agents.test.mjs tests/session-isolation.test.mjs tests/engine-session.test.mjs tests/engine-prompts.test.mjs tests/engine-schemas.test.mjs tests/engine-claude-auth.test.mjs tests/worktrees.test.mjs tests/workspaces-api.test.mjs tests/engine-outcome.test.mjs tests/session-outcomes.test.mjs tests/outcome-hydration.test.mjs tests/mobile-outcomes.test.mjs tests/session-queue.test.mjs tests/useFollowScroll.test.mjs tests/session-usage.test.mjs",
26
26
  "test:coverage": "node --test --experimental-test-coverage --test-coverage-include='cli/**' --test-coverage-include='server/**' --test-coverage-lines=60 --test-coverage-branches=62 tests/*.test.mjs",
27
27
  "lint": "eslint .",
28
28
  "lint:fix": "eslint . --fix",