@misterhuydo/sentinel 1.5.60 → 1.5.61

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "message": "Auto-checkpoint at 2026-04-21T08:26:07.121Z",
3
- "checkpoint_at": "2026-04-21T08:26:07.122Z",
2
+ "message": "Auto-checkpoint at 2026-04-21T09:17:19.216Z",
3
+ "checkpoint_at": "2026-04-21T09:17:19.218Z",
4
4
  "active_files": [
5
5
  "J:\\Projects\\Sentinel\\cli\\bin\\sentinel.js",
6
6
  "J:\\Projects\\Sentinel\\cli\\lib\\test.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@misterhuydo/sentinel",
3
- "version": "1.5.60",
3
+ "version": "1.5.61",
4
4
  "description": "Sentinel — Autonomous DevOps Agent installer and manager",
5
5
  "bin": {
6
6
  "sentinel": "./bin/sentinel.js"
@@ -1 +1 @@
1
- __version__ = "1.5.60"
1
+ __version__ = "1.5.61"
@@ -1846,28 +1846,47 @@ async def _execute_monitor(monitor: dict, cfg_loader: ConfigLoader, store: State
1846
1846
  # Only post if there is something to show
1847
1847
  if formatted_parts:
1848
1848
  combined = "\n".join(formatted_parts)
1849
- # Slack section blocks are capped at 3000 chars — keep content well under
1850
- MAX_LEN = 2900
1851
- if len(combined) > MAX_LEN:
1852
- tail = combined[:MAX_LEN]
1853
- # Close any unclosed code block before the truncation note
1854
- if tail.count("```") % 2 == 1:
1855
- tail += "\n```"
1856
- combined = tail + f"\n_…truncated ({len(combined)} chars total)_"
1857
1849
  header = f":repeat: *Monitor `{mon_id}`* ({mon_name}) — run #{runs_after}"
1858
1850
  if done:
1859
1851
  header += " _(final)_"
1860
- try:
1861
- await slack_client.chat_postMessage(
1862
- channel=channel,
1863
- text=header, # plain-text fallback for notifications
1864
- blocks=[
1865
- {"type": "section", "text": {"type": "mrkdwn", "text": header}},
1866
- {"type": "section", "text": {"type": "mrkdwn", "text": combined}},
1867
- ],
1868
- )
1869
- except Exception as e:
1870
- logger.warning("Monitor %s: Slack post failed: %s", mon_id, e)
1852
+
1853
+ # Split into 2900-char chunks (Slack section block limit is 3000).
1854
+ # Chunk on line boundaries where possible; preserve open/close ``` pairs.
1855
+ CHUNK = 2900
1856
+ chunks: list[str] = []
1857
+ remaining = combined
1858
+ while remaining:
1859
+ if len(remaining) <= CHUNK:
1860
+ chunks.append(remaining)
1861
+ break
1862
+ # Find last newline within the limit
1863
+ split_at = remaining.rfind("\n", 0, CHUNK)
1864
+ if split_at == -1:
1865
+ split_at = CHUNK
1866
+ piece = remaining[:split_at]
1867
+ rest = remaining[split_at:].lstrip("\n")
1868
+ # Close any unclosed code block so each chunk is self-contained,
1869
+ # and reopen it at the start of the next chunk
1870
+ if piece.count("```") % 2 == 1:
1871
+ piece += "\n```"
1872
+ rest = "```\n" + rest
1873
+ chunks.append(piece)
1874
+ remaining = rest
1875
+
1876
+ for i, chunk in enumerate(chunks):
1877
+ chunk_header = header if i == 0 else f"_{mon_name} continued ({i + 1}/{len(chunks)})_"
1878
+ try:
1879
+ await slack_client.chat_postMessage(
1880
+ channel=channel,
1881
+ text=chunk_header,
1882
+ blocks=[
1883
+ {"type": "section", "text": {"type": "mrkdwn", "text": chunk_header}},
1884
+ {"type": "section", "text": {"type": "mrkdwn", "text": chunk}},
1885
+ ],
1886
+ )
1887
+ except Exception as e:
1888
+ logger.warning("Monitor %s: Slack post chunk %d failed: %s", mon_id, i, e)
1889
+ break
1871
1890
 
1872
1891
  if done:
1873
1892
  try: