agentlink-cli 0.1.9__tar.gz → 0.2.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.
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/PKG-INFO +1 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/runtime.py +26 -2
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/version.py +1 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/pyproject.toml +1 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_runtime.py +5 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_version.py +1 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/uv.lock +1 -1
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/.gitignore +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/README.md +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/config_options.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/discovery.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifest.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifests/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifests/codebuddy.json +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifests/cursor.json +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifests/gemini.json +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/manifests/grok_build.json +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/reducer.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/acp/rpc.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/attachments.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/capabilities.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/history_adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/normalized.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/normalizers.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/path_utils.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/preferences.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/sdk_adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/timeline_identity.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/timeline_reducer.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/claude/trust.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/cli.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/collaboration.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/history.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/reducer.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/codex/rpc.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/control.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/json_rpc.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/launch.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/common.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/file_ops.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/ops.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/shell.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local/terminal.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local_ops.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/local_runtime.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/logging.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/perf.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/protocol.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/registry.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/sync_state.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/connector/time.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/run.sh +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/fake_agent/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/fake_agent/__main__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/test_acp_adapter_fake.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/test_acp_reducer_golden.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/acp/test_config_options.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/contract/__init__.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/contract/helpers.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_claude_history_adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_claude_preferences.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_claude_sdk_adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_claude_timeline_parity.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_claude_trust.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_codex_adapter.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_capabilities.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_cli.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_control.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_json_rpc.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_connector_logging.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_launch_command.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_local_runtime.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_perf.py +0 -0
- {agentlink_cli-0.1.9 → agentlink_cli-0.2.0}/tests/test_terminal_backend.py +0 -0
|
@@ -480,6 +480,8 @@ class BackendRpcClient:
|
|
|
480
480
|
if method == "session.create":
|
|
481
481
|
adapter = self._resolve_adapter(params)
|
|
482
482
|
result = await adapter.create_session({**params, "connectorId": self.config.connector_id})
|
|
483
|
+
if isinstance(result, dict) and adapter is self.adapters.get("codex"):
|
|
484
|
+
result.setdefault("runtimeLaunch", self._codex_launch_snapshot())
|
|
483
485
|
await self._send_backend_notifications(result)
|
|
484
486
|
return _strip_backend_notifications(result)
|
|
485
487
|
if method == "session.sync":
|
|
@@ -658,6 +660,8 @@ class BackendRpcClient:
|
|
|
658
660
|
Exception: the first assistant text delta for a turn bypasses the
|
|
659
661
|
window so TTFB is not inflated by FLUSH_WINDOW_SECONDS.
|
|
660
662
|
"""
|
|
663
|
+
if method == "session.updated" and isinstance(params, dict) and params.get("runtime") == "codex":
|
|
664
|
+
params = {**params, "runtimeLaunch": self._codex_launch_snapshot()}
|
|
661
665
|
notification = {"method": method, "params": params}
|
|
662
666
|
if self._outbox is not None:
|
|
663
667
|
await asyncio.to_thread(self._outbox.add, method, params)
|
|
@@ -971,9 +975,12 @@ class BackendRpcClient:
|
|
|
971
975
|
self._codex_launch_spec = {
|
|
972
976
|
"mode": mode,
|
|
973
977
|
**({"command": launch.raw} if mode == "command" else {}),
|
|
978
|
+
**({"source": str(params["source"])} if params.get("source") in {"builtin", "preset", "custom", "auto"} else {}),
|
|
979
|
+
**({"name": str(params["name"])} if isinstance(params.get("name"), str) and params["name"].strip() else {}),
|
|
980
|
+
**({"presetId": str(params["presetId"])} if isinstance(params.get("presetId"), str) and params["presetId"].strip() else {}),
|
|
974
981
|
}
|
|
975
982
|
self._blocked_runtimes.discard("codex")
|
|
976
|
-
report["launch"] = launch.report(mode=mode)
|
|
983
|
+
report["launch"] = {**launch.report(mode=mode), **{k: v for k, v in self._codex_launch_spec.items() if k != "mode"}}
|
|
977
984
|
self._record_runtime_report("codex", report)
|
|
978
985
|
except Exception:
|
|
979
986
|
codex.rpc = old_rpc
|
|
@@ -989,7 +996,11 @@ class BackendRpcClient:
|
|
|
989
996
|
async def _apply_codex_launch_spec(self, spec: dict[str, Any]) -> None:
|
|
990
997
|
mode = str(spec.get("mode") or "auto")
|
|
991
998
|
command = spec.get("command") if isinstance(spec.get("command"), str) else None
|
|
992
|
-
normalized = {
|
|
999
|
+
normalized = {
|
|
1000
|
+
"mode": mode,
|
|
1001
|
+
**({"command": command} if command else {}),
|
|
1002
|
+
**({key: spec[key] for key in ("source", "name", "presetId") if isinstance(spec.get(key), str)}),
|
|
1003
|
+
}
|
|
993
1004
|
if normalized == self._codex_launch_spec and "codex" not in self._blocked_runtimes:
|
|
994
1005
|
return
|
|
995
1006
|
await self._configure_codex_launch({"runtime": "codex", **normalized})
|
|
@@ -1006,6 +1017,7 @@ class BackendRpcClient:
|
|
|
1006
1017
|
self._codex_launch_spec = {
|
|
1007
1018
|
"mode": str(spec.get("mode") or "auto"),
|
|
1008
1019
|
**({"command": spec["command"]} if isinstance(spec.get("command"), str) else {}),
|
|
1020
|
+
**({key: spec[key] for key in ("source", "name", "presetId") if isinstance(spec.get(key), str)}),
|
|
1009
1021
|
}
|
|
1010
1022
|
if self._codex_launch_spec.get("mode") == "command":
|
|
1011
1023
|
self._blocked_runtimes.add("codex")
|
|
@@ -1161,8 +1173,20 @@ class BackendRpcClient:
|
|
|
1161
1173
|
method = notification.get("method")
|
|
1162
1174
|
params = notification.get("params")
|
|
1163
1175
|
if isinstance(method, str) and isinstance(params, dict):
|
|
1176
|
+
if method == "session.updated" and params.get("runtime") == "codex":
|
|
1177
|
+
params = {**params, "runtimeLaunch": self._codex_launch_snapshot()}
|
|
1164
1178
|
await self.ingest_notifications([{"method": method, "params": params}])
|
|
1165
1179
|
|
|
1180
|
+
def _codex_launch_snapshot(self) -> dict[str, Any]:
|
|
1181
|
+
spec = self._codex_launch_spec
|
|
1182
|
+
mode = "command" if spec.get("mode") == "command" else "auto"
|
|
1183
|
+
snapshot: dict[str, Any] = {"mode": mode, "source": spec.get("source") or ("auto" if mode == "auto" else "custom")}
|
|
1184
|
+
for key in ("source", "name", "presetId", "command"):
|
|
1185
|
+
value = spec.get(key)
|
|
1186
|
+
if isinstance(value, str) and value:
|
|
1187
|
+
snapshot[key] = value
|
|
1188
|
+
return snapshot
|
|
1189
|
+
|
|
1166
1190
|
async def enqueue_backend_notifications(self, notifications: list[dict[str, Any]]) -> None:
|
|
1167
1191
|
for notification in notifications:
|
|
1168
1192
|
if not isinstance(notification, dict):
|
|
@@ -551,7 +551,11 @@ async def _exercise_runtime() -> None:
|
|
|
551
551
|
"id": "rpc_1",
|
|
552
552
|
"type": "response",
|
|
553
553
|
"ok": True,
|
|
554
|
-
"result": {
|
|
554
|
+
"result": {
|
|
555
|
+
"sessionId": "sess_1",
|
|
556
|
+
"externalSessionId": "thr_1",
|
|
557
|
+
"runtimeLaunch": {"mode": "auto", "source": "auto"},
|
|
558
|
+
},
|
|
555
559
|
}
|
|
556
560
|
|
|
557
561
|
await client.handle_message(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|