tmux-ide 2.1.0 → 2.1.2

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.
Files changed (34) hide show
  1. package/dashboard/out/404/index.html +1 -1
  2. package/dashboard/out/404.html +1 -1
  3. package/dashboard/out/__next.__PAGE__.txt +1 -1
  4. package/dashboard/out/__next._full.txt +1 -1
  5. package/dashboard/out/__next._head.txt +1 -1
  6. package/dashboard/out/__next._index.txt +1 -1
  7. package/dashboard/out/__next._tree.txt +1 -1
  8. package/dashboard/out/_next/static/chunks/{6cb5c58418022991.js → 422e1bb4d41ce5ba.js} +1 -1
  9. package/dashboard/out/_not-found/__next._full.txt +1 -1
  10. package/dashboard/out/_not-found/__next._head.txt +1 -1
  11. package/dashboard/out/_not-found/__next._index.txt +1 -1
  12. package/dashboard/out/_not-found/__next._not-found.__PAGE__.txt +1 -1
  13. package/dashboard/out/_not-found/__next._not-found.txt +1 -1
  14. package/dashboard/out/_not-found/__next._tree.txt +1 -1
  15. package/dashboard/out/_not-found/index.html +1 -1
  16. package/dashboard/out/_not-found/index.txt +1 -1
  17. package/dashboard/out/index.html +1 -1
  18. package/dashboard/out/index.txt +1 -1
  19. package/dashboard/out/project/__fallback/__next._full.txt +2 -2
  20. package/dashboard/out/project/__fallback/__next._head.txt +1 -1
  21. package/dashboard/out/project/__fallback/__next._index.txt +1 -1
  22. package/dashboard/out/project/__fallback/__next._tree.txt +1 -1
  23. package/dashboard/out/project/__fallback/__next.project.$d$name.__PAGE__.txt +2 -2
  24. package/dashboard/out/project/__fallback/__next.project.$d$name.txt +1 -1
  25. package/dashboard/out/project/__fallback/__next.project.txt +1 -1
  26. package/dashboard/out/project/__fallback/index.html +1 -1
  27. package/dashboard/out/project/__fallback/index.txt +2 -2
  28. package/package.json +1 -1
  29. package/src/command-center/server.ts +8 -2
  30. package/src/lib/daemon.ts +4 -18
  31. package/src/lib/orchestrator.ts +10 -2
  32. /package/dashboard/out/_next/static/{WTHSCKfFb30xXXhXuq66f → hKfaRIxA4e3yTmkv1VUnK}/_buildManifest.js +0 -0
  33. /package/dashboard/out/_next/static/{WTHSCKfFb30xXXhXuq66f → hKfaRIxA4e3yTmkv1VUnK}/_clientMiddlewareManifest.json +0 -0
  34. /package/dashboard/out/_next/static/{WTHSCKfFb30xXXhXuq66f → hKfaRIxA4e3yTmkv1VUnK}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tmux-ide",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "Turn any project into a tmux-powered terminal IDE with a simple ide.yml",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,8 @@
1
1
  import { execFileSync, execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  import { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from "node:fs";
4
- import { join } from "node:path";
4
+ import { join, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
5
6
  import { Hono } from "hono";
6
7
  import { streamSSE } from "hono/streaming";
7
8
  import { cors } from "hono/cors";
@@ -88,6 +89,11 @@ export interface CreateAppOptions {
88
89
  remoteRegistry?: RemoteRegistry;
89
90
  }
90
91
 
92
+ const __dirname = dirname(fileURLToPath(import.meta.url));
93
+ const pkgVersion: string = JSON.parse(
94
+ readFileSync(join(__dirname, "../../package.json"), "utf-8"),
95
+ ).version;
96
+
91
97
  const ALLOWED_MILESTONE_TRANSITIONS = new Map([
92
98
  ["locked", new Set(["active"])],
93
99
  ["active", new Set(["validating"])],
@@ -1410,7 +1416,7 @@ export function createApp(options: CreateAppOptions = {}): Hono {
1410
1416
  return c.json({
1411
1417
  ok: true,
1412
1418
  uptime: Math.round(process.uptime()),
1413
- version: "2.1.0",
1419
+ version: pkgVersion,
1414
1420
  });
1415
1421
  });
1416
1422
 
package/src/lib/daemon.ts CHANGED
@@ -115,8 +115,6 @@ function listPanes(): MonitorPane[] {
115
115
  // ---------------------------------------------------------------------------
116
116
 
117
117
  let lastState = "";
118
- let prevAgentStates = new Map<string, "busy" | "idle" | null>();
119
- let monitorInitialized = false;
120
118
 
121
119
  function tick(): void {
122
120
  if (!sessionExists()) {
@@ -158,22 +156,10 @@ function tick(): void {
158
156
  }
159
157
  }
160
158
 
161
- // Notify master pane when an agent transitions from busy → idle
162
- if (monitorInitialized) {
163
- const masterPane = panes.find((p) => p.role === "lead");
164
- if (masterPane) {
165
- for (const pane of panes) {
166
- const prev = prevAgentStates.get(pane.id);
167
- const curr = agentStates.get(pane.id);
168
- if (prev === "busy" && curr === "idle" && pane.id !== masterPane.id) {
169
- const label = pane.name ?? pane.title ?? pane.id;
170
- tmuxSilent("send-keys", "-t", masterPane.id, `Agent "${label}" is now idle`, "Enter");
171
- }
172
- }
173
- }
174
- }
175
- monitorInitialized = true;
176
- prevAgentStates = agentStates;
159
+ // Agent idle notifications removed — the orchestrator's completion
160
+ // handler already notifies the lead pane with task context when a
161
+ // task finishes. Raw busy→idle transitions from the monitor loop
162
+ // fired on spinner gaps between tool calls, spamming the lead.
177
163
 
178
164
  tmuxSilent("refresh-client", "-S");
179
165
  lastState = stateKey;
@@ -905,8 +905,8 @@ export function dispatch(
905
905
  .filter((t) => {
906
906
  // Skip if already claimed
907
907
  if (state.claimedTasks.has(t.id)) return false;
908
- // Regular todo tasks
909
- if (t.status === "todo" && !t.assignee) {
908
+ // Regular todo tasks (include pre-assigned tasks — assignee is a preference hint)
909
+ if (t.status === "todo") {
910
910
  // Skip if waiting for scheduled retry (nextRetryAt is in the future)
911
911
  if (t.nextRetryAt && new Date(t.nextRetryAt).getTime() > now) return false;
912
912
  // Check dependencies: all depends_on tasks must be done
@@ -1059,6 +1059,14 @@ export function findBestAgent(
1059
1059
  const candidates = idleAgents.filter((p) => !excludeIds.has(p.id));
1060
1060
  if (candidates.length === 0) return null;
1061
1061
 
1062
+ // Pre-assigned agent preference: if the task has an assignee (set at creation time),
1063
+ // prefer that agent if it's idle. This treats assignee as a preference hint.
1064
+ if (task.assignee) {
1065
+ const preferred = candidates.find((p) => agentIdentifier(p) === task.assignee);
1066
+ if (preferred) return preferred;
1067
+ // Preferred agent not idle — fall through to normal matching
1068
+ }
1069
+
1062
1070
  // No specialty required — any idle agent works
1063
1071
  if (!task.specialty) return candidates[0] ?? null;
1064
1072