arch-ops-server 3.2.0__tar.gz → 3.3.0__tar.gz

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 (18) hide show
  1. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/PKG-INFO +1 -1
  2. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/pyproject.toml +1 -1
  3. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/__init__.py +1 -1
  4. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/server.py +87 -36
  5. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/README.md +0 -0
  6. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/aur.py +0 -0
  7. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/config.py +0 -0
  8. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/http_server.py +0 -0
  9. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/logs.py +0 -0
  10. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/mirrors.py +0 -0
  11. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/news.py +0 -0
  12. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/pacman.py +0 -0
  13. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/py.typed +0 -0
  14. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/system.py +0 -0
  15. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/system_health_check.py +0 -0
  16. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/tool_metadata.py +0 -0
  17. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/utils.py +0 -0
  18. {arch_ops_server-3.2.0 → arch_ops_server-3.3.0}/src/arch_ops_server/wiki.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arch-ops-server
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: MCP server bridging AI assistants with Arch Linux ecosystem (Wiki, AUR, official repos)
5
5
  Keywords: arch-linux,mcp,model-context-protocol,aur,pacman,wiki,ai-assistant
6
6
  Author: Nihal
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "arch-ops-server"
3
- version = "3.2.0"
3
+ version = "3.3.0"
4
4
  description = "MCP server bridging AI assistants with Arch Linux ecosystem (Wiki, AUR, official repos)"
5
5
  readme = {file = "README.md", content-type = "text/markdown"}
6
6
  license = { text = "GPL-3.0-only OR MIT" }
@@ -6,7 +6,7 @@ A Model Context Protocol server that bridges AI assistants with the Arch Linux
6
6
  ecosystem, providing access to the Arch Wiki, AUR, and official repositories.
7
7
  """
8
8
 
9
- __version__ = "3.2.0"
9
+ __version__ = "3.3.0"
10
10
 
11
11
  from .wiki import search_wiki, get_wiki_page, get_wiki_page_as_text
12
12
  from .aur import (
@@ -95,6 +95,57 @@ server = Server("arch-ops-server")
95
95
  # HELPER FUNCTIONS
96
96
  # ============================================================================
97
97
 
98
+ def create_platform_error_message(tool_name: str, current_platform: str = None) -> str:
99
+ """
100
+ Create an informative error message with recovery hints for platform-specific tools.
101
+
102
+ Args:
103
+ tool_name: Name of the tool that requires Arch Linux
104
+ current_platform: Current platform/OS (auto-detected if not provided)
105
+
106
+ Returns:
107
+ Formatted error message with recovery suggestions
108
+ """
109
+ import platform
110
+
111
+ if current_platform is None:
112
+ try:
113
+ if IS_ARCH:
114
+ current_platform = "Arch Linux"
115
+ else:
116
+ import distro
117
+ current_platform = f"{distro.name()} {distro.version()}" if distro.name() else platform.system()
118
+ except:
119
+ current_platform = platform.system()
120
+
121
+ error_msg = f"""Error: '{tool_name}' requires Arch Linux
122
+
123
+ Current system: {current_platform}
124
+
125
+ This tool requires a running Arch Linux system to function. However, you can still:
126
+
127
+ Alternative actions:
128
+ 1. Use platform-agnostic tools:
129
+ - search_archwiki: Search Arch Wiki documentation (works anywhere)
130
+ - search_aur: Search AUR packages (works anywhere)
131
+ - get_official_package_info: Get package info from archlinux.org (works anywhere)
132
+ - get_latest_news: Check Arch Linux news (works anywhere)
133
+ - check_critical_news: Check for critical Arch news (works anywhere)
134
+
135
+ 2. Browse documentation resources:
136
+ - archwiki://<page_title> - Read any Arch Wiki page
137
+ - aur://<package>/info - Get AUR package metadata
138
+ - archrepo://<package> - Get official package details
139
+
140
+ 3. If you're planning to use Arch Linux:
141
+ - Visit the Arch Wiki Installation Guide: archwiki://Installation_guide
142
+ - Check latest Arch news before installing: get_latest_news
143
+
144
+ Note: Tools marked with [DISCOVERY], [SECURITY], and news-related tools work on any system."""
145
+
146
+ return error_msg
147
+
148
+
98
149
  def create_standard_output_schema(data_schema: dict, description: str = "") -> dict:
99
150
  """
100
151
  Create a standard output schema with status, data, error fields.
@@ -402,7 +453,7 @@ async def read_resource(uri: str) -> str:
402
453
 
403
454
  elif scheme == "pacman":
404
455
  if not IS_ARCH:
405
- raise ValueError(f"pacman:// resources only available on Arch Linux systems")
456
+ raise ValueError(create_platform_error_message("pacman:// resources"))
406
457
 
407
458
  resource_path = parsed.netloc or parsed.path.lstrip('/')
408
459
 
@@ -523,7 +574,7 @@ async def read_resource(uri: str) -> str:
523
574
 
524
575
  elif scheme == "mirrors":
525
576
  if not IS_ARCH:
526
- raise ValueError(f"mirrors:// resources only available on Arch Linux systems")
577
+ raise ValueError(create_platform_error_message("mirrors:// resources"))
527
578
 
528
579
  resource_path = parsed.netloc or parsed.path.lstrip('/')
529
580
 
@@ -542,7 +593,7 @@ async def read_resource(uri: str) -> str:
542
593
 
543
594
  elif scheme == "config":
544
595
  if not IS_ARCH:
545
- raise ValueError(f"config:// resources only available on Arch Linux systems")
596
+ raise ValueError(create_platform_error_message("config:// resources"))
546
597
 
547
598
  resource_path = parsed.netloc or parsed.path.lstrip('/')
548
599
 
@@ -1259,14 +1310,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1259
1310
 
1260
1311
  elif name == "check_updates_dry_run":
1261
1312
  if not IS_ARCH:
1262
- return [TextContent(type="text", text="Error: check_updates_dry_run only available on Arch Linux systems")]
1313
+ return [TextContent(type="text", text=create_platform_error_message("check_updates_dry_run"))]
1263
1314
 
1264
1315
  result = await check_updates_dry_run()
1265
1316
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1266
1317
 
1267
1318
  elif name == "install_package_secure":
1268
1319
  if not IS_ARCH:
1269
- return [TextContent(type="text", text="Error: install_package_secure only available on Arch Linux systems")]
1320
+ return [TextContent(type="text", text=create_platform_error_message("install_package_secure"))]
1270
1321
 
1271
1322
  package_name = arguments["package_name"]
1272
1323
  result = await install_package_secure(package_name)
@@ -1285,7 +1336,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1285
1336
  # Package Removal Tools
1286
1337
  elif name == "remove_package":
1287
1338
  if not IS_ARCH:
1288
- return [TextContent(type="text", text="Error: remove_package only available on Arch Linux systems")]
1339
+ return [TextContent(type="text", text=create_platform_error_message("remove_package"))]
1289
1340
 
1290
1341
  package_name = arguments["package_name"]
1291
1342
  remove_dependencies = arguments.get("remove_dependencies", False)
@@ -1295,7 +1346,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1295
1346
 
1296
1347
  elif name == "remove_packages_batch":
1297
1348
  if not IS_ARCH:
1298
- return [TextContent(type="text", text="Error: remove_packages_batch only available on Arch Linux systems")]
1349
+ return [TextContent(type="text", text=create_platform_error_message("remove_packages_batch"))]
1299
1350
 
1300
1351
  package_names = arguments["package_names"]
1301
1352
  remove_dependencies = arguments.get("remove_dependencies", False)
@@ -1305,14 +1356,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1305
1356
  # Orphan Package Management
1306
1357
  elif name == "list_orphan_packages":
1307
1358
  if not IS_ARCH:
1308
- return [TextContent(type="text", text="Error: list_orphan_packages only available on Arch Linux systems")]
1359
+ return [TextContent(type="text", text=create_platform_error_message("list_orphan_packages"))]
1309
1360
 
1310
1361
  result = await list_orphan_packages()
1311
1362
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1312
1363
 
1313
1364
  elif name == "remove_orphans":
1314
1365
  if not IS_ARCH:
1315
- return [TextContent(type="text", text="Error: remove_orphans only available on Arch Linux systems")]
1366
+ return [TextContent(type="text", text=create_platform_error_message("remove_orphans"))]
1316
1367
 
1317
1368
  dry_run = arguments.get("dry_run", True)
1318
1369
  exclude = arguments.get("exclude", None)
@@ -1322,7 +1373,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1322
1373
  # Package Ownership Tools
1323
1374
  elif name == "find_package_owner":
1324
1375
  if not IS_ARCH:
1325
- return [TextContent(type="text", text="Error: find_package_owner only available on Arch Linux systems")]
1376
+ return [TextContent(type="text", text=create_platform_error_message("find_package_owner"))]
1326
1377
 
1327
1378
  file_path = arguments["file_path"]
1328
1379
  result = await find_package_owner(file_path)
@@ -1330,7 +1381,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1330
1381
 
1331
1382
  elif name == "list_package_files":
1332
1383
  if not IS_ARCH:
1333
- return [TextContent(type="text", text="Error: list_package_files only available on Arch Linux systems")]
1384
+ return [TextContent(type="text", text=create_platform_error_message("list_package_files"))]
1334
1385
 
1335
1386
  package_name = arguments["package_name"]
1336
1387
  filter_pattern = arguments.get("filter_pattern", None)
@@ -1339,7 +1390,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1339
1390
 
1340
1391
  elif name == "search_package_files":
1341
1392
  if not IS_ARCH:
1342
- return [TextContent(type="text", text="Error: search_package_files only available on Arch Linux systems")]
1393
+ return [TextContent(type="text", text=create_platform_error_message("search_package_files"))]
1343
1394
 
1344
1395
  filename_pattern = arguments["filename_pattern"]
1345
1396
  result = await search_package_files(filename_pattern)
@@ -1348,7 +1399,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1348
1399
  # Package Verification
1349
1400
  elif name == "verify_package_integrity":
1350
1401
  if not IS_ARCH:
1351
- return [TextContent(type="text", text="Error: verify_package_integrity only available on Arch Linux systems")]
1402
+ return [TextContent(type="text", text=create_platform_error_message("verify_package_integrity"))]
1352
1403
 
1353
1404
  package_name = arguments["package_name"]
1354
1405
  thorough = arguments.get("thorough", False)
@@ -1358,14 +1409,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1358
1409
  # Package Groups
1359
1410
  elif name == "list_package_groups":
1360
1411
  if not IS_ARCH:
1361
- return [TextContent(type="text", text="Error: list_package_groups only available on Arch Linux systems")]
1412
+ return [TextContent(type="text", text=create_platform_error_message("list_package_groups"))]
1362
1413
 
1363
1414
  result = await list_package_groups()
1364
1415
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1365
1416
 
1366
1417
  elif name == "list_group_packages":
1367
1418
  if not IS_ARCH:
1368
- return [TextContent(type="text", text="Error: list_group_packages only available on Arch Linux systems")]
1419
+ return [TextContent(type="text", text=create_platform_error_message("list_group_packages"))]
1369
1420
 
1370
1421
  group_name = arguments["group_name"]
1371
1422
  result = await list_group_packages(group_name)
@@ -1374,14 +1425,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1374
1425
  # Install Reason Management
1375
1426
  elif name == "list_explicit_packages":
1376
1427
  if not IS_ARCH:
1377
- return [TextContent(type="text", text="Error: list_explicit_packages only available on Arch Linux systems")]
1428
+ return [TextContent(type="text", text=create_platform_error_message("list_explicit_packages"))]
1378
1429
 
1379
1430
  result = await list_explicit_packages()
1380
1431
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1381
1432
 
1382
1433
  elif name == "mark_as_explicit":
1383
1434
  if not IS_ARCH:
1384
- return [TextContent(type="text", text="Error: mark_as_explicit only available on Arch Linux systems")]
1435
+ return [TextContent(type="text", text=create_platform_error_message("mark_as_explicit"))]
1385
1436
 
1386
1437
  package_name = arguments["package_name"]
1387
1438
  result = await mark_as_explicit(package_name)
@@ -1389,7 +1440,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1389
1440
 
1390
1441
  elif name == "mark_as_dependency":
1391
1442
  if not IS_ARCH:
1392
- return [TextContent(type="text", text="Error: mark_as_dependency only available on Arch Linux systems")]
1443
+ return [TextContent(type="text", text=create_platform_error_message("mark_as_dependency"))]
1393
1444
 
1394
1445
  package_name = arguments["package_name"]
1395
1446
  result = await mark_as_dependency(package_name)
@@ -1406,7 +1457,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1406
1457
 
1407
1458
  elif name == "get_pacman_cache_stats":
1408
1459
  if not IS_ARCH:
1409
- return [TextContent(type="text", text="Error: get_pacman_cache_stats only available on Arch Linux systems")]
1460
+ return [TextContent(type="text", text=create_platform_error_message("get_pacman_cache_stats"))]
1410
1461
 
1411
1462
  result = await get_pacman_cache_stats()
1412
1463
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
@@ -1434,7 +1485,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1434
1485
 
1435
1486
  elif name == "get_news_since_last_update":
1436
1487
  if not IS_ARCH:
1437
- return [TextContent(type="text", text="Error: get_news_since_last_update only available on Arch Linux systems")]
1488
+ return [TextContent(type="text", text=create_platform_error_message("get_news_since_last_update"))]
1438
1489
 
1439
1490
  result = await get_news_since_last_update()
1440
1491
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
@@ -1442,7 +1493,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1442
1493
  # Transaction log tools
1443
1494
  elif name == "get_transaction_history":
1444
1495
  if not IS_ARCH:
1445
- return [TextContent(type="text", text="Error: get_transaction_history only available on Arch Linux systems")]
1496
+ return [TextContent(type="text", text=create_platform_error_message("get_transaction_history"))]
1446
1497
 
1447
1498
  limit = arguments.get("limit", 50)
1448
1499
  transaction_type = arguments.get("transaction_type", "all")
@@ -1451,7 +1502,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1451
1502
 
1452
1503
  elif name == "find_when_installed":
1453
1504
  if not IS_ARCH:
1454
- return [TextContent(type="text", text="Error: find_when_installed only available on Arch Linux systems")]
1505
+ return [TextContent(type="text", text=create_platform_error_message("find_when_installed"))]
1455
1506
 
1456
1507
  package_name = arguments.get("package_name")
1457
1508
  if not package_name:
@@ -1462,14 +1513,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1462
1513
 
1463
1514
  elif name == "find_failed_transactions":
1464
1515
  if not IS_ARCH:
1465
- return [TextContent(type="text", text="Error: find_failed_transactions only available on Arch Linux systems")]
1516
+ return [TextContent(type="text", text=create_platform_error_message("find_failed_transactions"))]
1466
1517
 
1467
1518
  result = await find_failed_transactions()
1468
1519
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1469
1520
 
1470
1521
  elif name == "get_database_sync_history":
1471
1522
  if not IS_ARCH:
1472
- return [TextContent(type="text", text="Error: get_database_sync_history only available on Arch Linux systems")]
1523
+ return [TextContent(type="text", text=create_platform_error_message("get_database_sync_history"))]
1473
1524
 
1474
1525
  limit = arguments.get("limit", 20)
1475
1526
  result = await get_database_sync_history(limit=limit)
@@ -1478,14 +1529,14 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1478
1529
  # Mirror management tools
1479
1530
  elif name == "list_active_mirrors":
1480
1531
  if not IS_ARCH:
1481
- return [TextContent(type="text", text="Error: list_active_mirrors only available on Arch Linux systems")]
1532
+ return [TextContent(type="text", text=create_platform_error_message("list_active_mirrors"))]
1482
1533
 
1483
1534
  result = await list_active_mirrors()
1484
1535
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1485
1536
 
1486
1537
  elif name == "test_mirror_speed":
1487
1538
  if not IS_ARCH:
1488
- return [TextContent(type="text", text="Error: test_mirror_speed only available on Arch Linux systems")]
1539
+ return [TextContent(type="text", text=create_platform_error_message("test_mirror_speed"))]
1489
1540
 
1490
1541
  mirror_url = arguments.get("mirror_url")
1491
1542
  result = await test_mirror_speed(mirror_url=mirror_url)
@@ -1499,7 +1550,7 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1499
1550
 
1500
1551
  elif name == "check_mirrorlist_health":
1501
1552
  if not IS_ARCH:
1502
- return [TextContent(type="text", text="Error: check_mirrorlist_health only available on Arch Linux systems")]
1553
+ return [TextContent(type="text", text=create_platform_error_message("check_mirrorlist_health"))]
1503
1554
 
1504
1555
  result = await check_mirrorlist_health()
1505
1556
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
@@ -1507,42 +1558,42 @@ async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent |
1507
1558
  # Configuration tools
1508
1559
  elif name == "analyze_pacman_conf":
1509
1560
  if not IS_ARCH:
1510
- return [TextContent(type="text", text="Error: analyze_pacman_conf only available on Arch Linux systems")]
1561
+ return [TextContent(type="text", text=create_platform_error_message("analyze_pacman_conf"))]
1511
1562
 
1512
1563
  result = await analyze_pacman_conf()
1513
1564
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1514
1565
 
1515
1566
  elif name == "analyze_makepkg_conf":
1516
1567
  if not IS_ARCH:
1517
- return [TextContent(type="text", text="Error: analyze_makepkg_conf only available on Arch Linux systems")]
1568
+ return [TextContent(type="text", text=create_platform_error_message("analyze_makepkg_conf"))]
1518
1569
 
1519
1570
  result = await analyze_makepkg_conf()
1520
1571
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1521
1572
 
1522
1573
  elif name == "check_ignored_packages":
1523
1574
  if not IS_ARCH:
1524
- return [TextContent(type="text", text="Error: check_ignored_packages only available on Arch Linux systems")]
1575
+ return [TextContent(type="text", text=create_platform_error_message("check_ignored_packages"))]
1525
1576
 
1526
1577
  result = await check_ignored_packages()
1527
1578
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1528
1579
 
1529
1580
  elif name == "get_parallel_downloads_setting":
1530
1581
  if not IS_ARCH:
1531
- return [TextContent(type="text", text="Error: get_parallel_downloads_setting only available on Arch Linux systems")]
1582
+ return [TextContent(type="text", text=create_platform_error_message("get_parallel_downloads_setting"))]
1532
1583
 
1533
1584
  result = await get_parallel_downloads_setting()
1534
1585
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1535
1586
 
1536
1587
  elif name == "run_system_health_check":
1537
1588
  if not IS_ARCH:
1538
- return [TextContent(type="text", text="Error: run_system_health_check only available on Arch Linux systems")]
1589
+ return [TextContent(type="text", text=create_platform_error_message("run_system_health_check"))]
1539
1590
 
1540
1591
  result = await run_system_health_check()
1541
1592
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
1542
1593
 
1543
1594
  elif name == "check_database_freshness":
1544
1595
  if not IS_ARCH:
1545
- return [TextContent(type="text", text="Error: check_database_freshness only available on Arch Linux systems")]
1596
+ return [TextContent(type="text", text=create_platform_error_message("check_database_freshness"))]
1546
1597
 
1547
1598
  result = await check_database_freshness()
1548
1599
  return [TextContent(type="text", text=json.dumps(result, indent=2))]
@@ -1883,7 +1934,7 @@ paru -S {package_name} # or yay -S {package_name}
1883
1934
  role="assistant",
1884
1935
  content=PromptMessage.TextContent(
1885
1936
  type="text",
1886
- text="Error: safe_system_update prompt only available on Arch Linux systems"
1937
+ text=create_platform_error_message("safe_system_update prompt")
1887
1938
  )
1888
1939
  )
1889
1940
  ]
@@ -2038,7 +2089,7 @@ paru -S {package_name} # or yay -S {package_name}
2038
2089
  role="assistant",
2039
2090
  content=PromptMessage.TextContent(
2040
2091
  type="text",
2041
- text="Error: cleanup_system prompt only available on Arch Linux systems"
2092
+ text=create_platform_error_message("cleanup_system prompt")
2042
2093
  )
2043
2094
  )
2044
2095
  ]
@@ -2214,7 +2265,7 @@ Be detailed and provide specific mirror URLs and configuration commands."""
2214
2265
  role="assistant",
2215
2266
  content=PromptMessage.TextContent(
2216
2267
  type="text",
2217
- text="Error: system_health_check prompt only available on Arch Linux systems"
2268
+ text=create_platform_error_message("system_health_check prompt")
2218
2269
  )
2219
2270
  )
2220
2271
  ]