@misterhuydo/sentinel 1.4.40 → 1.4.42

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-25T07:51:06.248Z
1
+ 2026-03-25T08:22:19.770Z
@@ -1,6 +1,6 @@
1
1
  {
2
- "message": "Auto-checkpoint at 2026-03-25T08:05:30.425Z",
3
- "checkpoint_at": "2026-03-25T08:05:30.426Z",
2
+ "message": "Auto-checkpoint at 2026-03-25T08:23:06.186Z",
3
+ "checkpoint_at": "2026-03-25T08:23:06.187Z",
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.40",
3
+ "version": "1.4.42",
4
4
  "description": "Sentinel — Autonomous DevOps Agent installer and manager",
5
5
  "bin": {
6
6
  "sentinel": "./bin/sentinel.js"
@@ -21,7 +21,7 @@ from .notify import alert_if_rate_limited, slack_alert
21
21
 
22
22
  logger = logging.getLogger(__name__)
23
23
 
24
- SUBPROCESS_TIMEOUT = 120
24
+ SUBPROCESS_TIMEOUT = 600
25
25
  MAX_FILES_IN_PATCH = 5
26
26
  MAX_LINES_IN_PATCH = 200
27
27
 
@@ -126,13 +126,17 @@ def scan_issues(project_dir: Path) -> list[IssueEvent]:
126
126
  target_repo = ""
127
127
  body_start = 0
128
128
 
129
- # Parse optional TARGET_REPO: header (must be the first non-blank line)
129
+ # Parse metadata headers in any order (TARGET_REPO, SUBMITTED_BY, SUBMITTED_AT, etc.)
130
+ _META = ("TARGET_REPO:", "SUBMITTED_BY:", "SUBMITTED_AT:", "SUPPORT_URL:")
130
131
  for i, line in enumerate(lines):
131
132
  stripped = line.strip()
132
- if stripped.upper().startswith(_TARGET_REPO_PREFIX):
133
+ upper = stripped.upper()
134
+ if upper.startswith(_TARGET_REPO_PREFIX):
133
135
  target_repo = stripped[len(_TARGET_REPO_PREFIX):].strip()
134
136
  body_start = i + 1
135
- elif stripped:
137
+ elif any(upper.startswith(p) for p in _META) or not stripped:
138
+ body_start = i + 1
139
+ else:
136
140
  break
137
141
 
138
142
  body = "\n".join(lines[body_start:]).strip() or content
@@ -85,7 +85,7 @@ async def _handle_error(event: ErrorEvent, cfg_loader: ConfigLoader, store: Stat
85
85
  logger.debug("Fix already attempted recently for %s", event.fingerprint)
86
86
  return
87
87
 
88
- patches_dir = Path(sentinel.workspace_dir) / "patches"
88
+ patches_dir = Path(sentinel.workspace_dir).resolve() / "patches"
89
89
  status, patch_path, marker = generate_fix(event, repo, sentinel, patches_dir, store)
90
90
 
91
91
  if status != "patch" or patch_path is None:
@@ -184,7 +184,7 @@ async def _handle_issue(event: IssueEvent, cfg_loader: ConfigLoader, store: Stat
184
184
  return # Leave the file so admin can add the header
185
185
 
186
186
  try:
187
- patches_dir = Path(sentinel.workspace_dir) / "patches"
187
+ patches_dir = Path(sentinel.workspace_dir).resolve() / "patches"
188
188
  status, patch_path, marker = generate_fix(event, repo, sentinel, patches_dir, store)
189
189
 
190
190
  if status != "patch" or patch_path is None: