@adaptic/maestro 1.10.4 → 1.10.5

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": "@adaptic/maestro",
3
- "version": "1.10.4",
3
+ "version": "1.10.5",
4
4
  "description": "Maestro — Autonomous AI agent operating system. Deploy AI employees on dedicated Mac minis.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -507,9 +507,16 @@ export function releaseRequestClaim(attrs) {
507
507
  * @param {string} threadTs - Thread parent timestamp
508
508
  */
509
509
  export function releaseThreadLock(channel, threadTs) {
510
- if (!channel || !threadTs) return;
510
+ if (!channel) return;
511
511
  // Match normalization in acquireThreadLock — DMs always use "dm-channel"
512
+ // regardless of whether threadTs is set. This MUST happen before the
513
+ // empty-threadTs check, otherwise DM channel locks never get released
514
+ // and every DM after the first gets dropped for the full 60min TTL
515
+ // (observed in ravi-ai on 2026-05-12: CEO's follow-up DM 23min after
516
+ // the first was skipped with "thread_dedup: DM channel already
517
+ // dispatched 1200s ago").
512
518
  if (channel.startsWith("D")) threadTs = "dm-channel";
519
+ if (!threadTs) return; // non-DM channel without a thread — no lock to release
513
520
  const safeKey = sanitiseItemId(`thread-${channel}-${threadTs}`);
514
521
  const lockPath = join(LOCKS_DIR, `${safeKey}.lock`);
515
522
  try {