@misterhuydo/sentinel 1.4.47 → 1.4.49

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/.cairn/.hint-lock CHANGED
@@ -1 +1 @@
1
- 2026-03-25T10:49:00.064Z
1
+ 2026-03-25T11:19:33.099Z
@@ -1,6 +1,6 @@
1
1
  {
2
- "message": "Auto-checkpoint at 2026-03-25T11:04:20.432Z",
3
- "checkpoint_at": "2026-03-25T11:04:20.433Z",
2
+ "message": "Auto-checkpoint at 2026-03-25T11:16:59.180Z",
3
+ "checkpoint_at": "2026-03-25T11:16:59.181Z",
4
4
  "active_files": [],
5
5
  "notes": [],
6
6
  "mtime_snapshot": {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@misterhuydo/sentinel",
3
- "version": "1.4.47",
3
+ "version": "1.4.49",
4
4
  "description": "Sentinel — Autonomous DevOps Agent installer and manager",
5
5
  "bin": {
6
6
  "sentinel": "./bin/sentinel.js"
@@ -124,7 +124,11 @@ def _run_tests(repo: RepoConfig, local_path: str) -> bool:
124
124
  return True
125
125
 
126
126
  logger.info("Running tests for %s: %s", repo.repo_name, " ".join(cmd))
127
- r = subprocess.run(cmd, cwd=local_path, capture_output=True, text=True, timeout=300)
127
+ try:
128
+ r = subprocess.run(cmd, cwd=local_path, capture_output=True, text=True, timeout=300)
129
+ except FileNotFoundError:
130
+ logger.warning("Test runner '%s' not found on this server — skipping tests for %s", cmd[0], repo.repo_name)
131
+ return True
128
132
  if r.returncode != 0:
129
133
  logger.error("Tests failed:\n%s", r.stdout[-2000:] + r.stderr[-1000:])
130
134
  return False
@@ -145,11 +145,12 @@ async def run_slack_bot(cfg_loader, store) -> None:
145
145
  await _dispatch(event, client, cfg_loader, store)
146
146
  return
147
147
 
148
- # Thread replies in channels — route to Boss if the user has an active session
149
- # (so the user can reply "yes" / "go ahead" without typing @Sentinel each time)
148
+ # Thread replies in channels — route to Boss without requiring @mention
149
+ # (so the user can reply "yes" / "go ahead" in a thread without typing @Sentinel)
150
150
  if event.get("thread_ts") and not event.get("subtype"):
151
151
  user_id = event.get("user", "")
152
- if user_id and user_id in _sessions:
152
+ allowed = cfg_loader.sentinel.slack_allowed_users
153
+ if user_id and (not allowed or user_id in allowed):
153
154
  await _dispatch(event, client, cfg_loader, store)
154
155
 
155
156
  # ── Start ─────────────────────────────────────────────────────────────────