aisc-cli 0.1.8__tar.gz → 0.1.9__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.
- {aisc_cli-0.1.8/src/aisc_cli.egg-info → aisc_cli-0.1.9}/PKG-INFO +1 -1
- aisc_cli-0.1.9/src/aisc/VERSION +1 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/cc_switch_resolver.py +34 -13
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/docker_lifecycle.py +1536 -1240
- aisc_cli-0.1.9/src/aisc/application/extensions.py +239 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/artifact.py +4 -1
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/build.py +9 -5
- aisc_cli-0.1.9/src/aisc/cli/commands/extensions.py +176 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/main.py +177 -1
- {aisc_cli-0.1.8 → aisc_cli-0.1.9/src/aisc_cli.egg-info}/PKG-INFO +1 -1
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/SOURCES.txt +2 -0
- aisc_cli-0.1.8/src/aisc/VERSION +0 -1
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/LICENSE +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/MANIFEST.in +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/README.md +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/pyproject.toml +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/setup.cfg +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/__main__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/config_reader.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/container_registry.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/data_root_store.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_gateway.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/docker_sdk_backed.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/maintenance_lock.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/state_file.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/system.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/windows_config_reader.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/adapters/workspace_lease_store.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/artifact.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/bundle_fetch.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/cc_switch_provider.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/config_service.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/conversation.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/data_migration.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/data_root.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/doctor.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/legacy_scan.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/network_subscription.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/profile_service.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/provider.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/repair.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/resources.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/runtime.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/session.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/tool_versions.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/toolchain.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/update.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/usage.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/version.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/web_gateway.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/work_collection.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/worklog.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/application/workspace_reconcile.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/applog.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/build_progress_parser.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/agents.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/bundle.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/cc_switch.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/config.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/container.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/conversation.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/data_root.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/logs.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/network.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/profile.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/provider.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/run.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/runs.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/runtime.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/serve.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/serve_fs.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/session.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/update.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/usage.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/wizard.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/work_record.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/worklog.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/commands/workspaces.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/help_i18n.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/output.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/cli/tutorial.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/artifacts.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/cc_switch_release.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/config.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/data_migration.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/data_root.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/docker_ownership.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/gateway.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/models.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/toolchain.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/web_services.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/domain/workspace_lease.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/schemas/__init__.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc/schemas/config_schema.py +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/dependency_links.txt +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/entry_points.txt +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/requires.txt +0 -0
- {aisc_cli-0.1.8 → aisc_cli-0.1.9}/src/aisc_cli.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.9
|
|
@@ -48,6 +48,10 @@ from aisc.domain.cc_switch_release import (
|
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
DEFAULT_API_BASE = "https://api.github.com"
|
|
51
|
+
#: ghfast.top rejects API paths with 403; gh-proxy.com has been verified to
|
|
52
|
+
#: proxy GitHub's JSON API. Only supplement the default base — an explicit
|
|
53
|
+
#: corporate/test base must remain the sole source of truth.
|
|
54
|
+
DEFAULT_API_MIRROR_PREFIX = "https://gh-proxy.com/"
|
|
51
55
|
DEFAULT_TIMEOUT_S = 15.0
|
|
52
56
|
DEFAULT_TTL_S = 600.0
|
|
53
57
|
DEFAULT_PER_PAGE = 50
|
|
@@ -134,6 +138,9 @@ class CcSwitchResolver:
|
|
|
134
138
|
self._transport = transport
|
|
135
139
|
self._cache_dir = Path(cache_dir) if cache_dir is not None else None
|
|
136
140
|
self._api_base = (api_base or os.environ.get("AISC_GH_API_BASE") or DEFAULT_API_BASE).rstrip("/")
|
|
141
|
+
self._api_bases = [self._api_base]
|
|
142
|
+
if self._api_base == DEFAULT_API_BASE:
|
|
143
|
+
self._api_bases.append(f"{DEFAULT_API_MIRROR_PREFIX}{DEFAULT_API_BASE}")
|
|
137
144
|
self._token = token or os.environ.get("AISC_GH_API_TOKEN") or ""
|
|
138
145
|
self._timeout = timeout
|
|
139
146
|
self._ttl_s = ttl_s
|
|
@@ -201,9 +208,9 @@ class CcSwitchResolver:
|
|
|
201
208
|
|
|
202
209
|
# --- GitHub API ----------------------------------------------------------
|
|
203
210
|
|
|
204
|
-
def _fetch_page(self, page: int) -> Tuple[List[Dict[str, Any]], bool]:
|
|
211
|
+
def _fetch_page(self, page: int, api_base: str) -> Tuple[List[Dict[str, Any]], bool]:
|
|
205
212
|
url = (
|
|
206
|
-
f"{
|
|
213
|
+
f"{api_base}/repos/{UPSTREAM_REPO}/releases"
|
|
207
214
|
f"?per_page={DEFAULT_PER_PAGE}&page={page}"
|
|
208
215
|
)
|
|
209
216
|
headers: Dict[str, str] = {"Accept": "application/vnd.github+json"}
|
|
@@ -235,17 +242,31 @@ class CcSwitchResolver:
|
|
|
235
242
|
return body, len(body) < DEFAULT_PER_PAGE
|
|
236
243
|
|
|
237
244
|
def _fetch_releases(self) -> List[Dict[str, Any]]:
|
|
238
|
-
|
|
239
|
-
for
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
245
|
+
last_error: Optional[ResolveError] = None
|
|
246
|
+
for api_base in self._api_bases:
|
|
247
|
+
try:
|
|
248
|
+
all_releases: List[Dict[str, Any]] = []
|
|
249
|
+
for page in range(1, DEFAULT_MAX_PAGES + 1):
|
|
250
|
+
page_releases, last = self._fetch_page(page, api_base)
|
|
251
|
+
all_releases.extend(page_releases)
|
|
252
|
+
if last or not page_releases:
|
|
253
|
+
break
|
|
254
|
+
else:
|
|
255
|
+
# Exhausted pagination without finding a terminal page;
|
|
256
|
+
# keep what we have — selection fails closed if the target
|
|
257
|
+
# isn't in range.
|
|
258
|
+
pass
|
|
259
|
+
return all_releases
|
|
260
|
+
except ResolveError as exc:
|
|
261
|
+
if exc.code not in (
|
|
262
|
+
CC_SWITCH_ERROR_NETWORK,
|
|
263
|
+
CC_SWITCH_ERROR_RATE_LIMITED,
|
|
264
|
+
):
|
|
265
|
+
raise
|
|
266
|
+
last_error = exc
|
|
267
|
+
raise last_error or ResolveError(
|
|
268
|
+
CC_SWITCH_ERROR_NETWORK, "github api unavailable"
|
|
269
|
+
)
|
|
249
270
|
|
|
250
271
|
# --- cache ---------------------------------------------------------------
|
|
251
272
|
|