agentlink-cli 0.2.0__tar.gz → 0.2.1__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.2.0 → agentlink_cli-0.2.1}/PKG-INFO +1 -1
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/common.py +1 -3
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/version.py +1 -1
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/pyproject.toml +1 -1
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_runtime.py +33 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_version.py +1 -1
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/uv.lock +1 -1
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/.gitignore +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/README.md +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/config_options.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/discovery.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifest.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifests/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifests/codebuddy.json +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifests/cursor.json +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifests/gemini.json +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/manifests/grok_build.json +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/reducer.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/acp/rpc.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/attachments.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/capabilities.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/history_adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/normalized.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/normalizers.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/path_utils.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/preferences.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/sdk_adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/timeline_identity.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/timeline_reducer.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/claude/trust.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/cli.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/collaboration.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/history.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/reducer.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/codex/rpc.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/control.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/json_rpc.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/launch.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/file_ops.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/ops.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/shell.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local/terminal.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local_ops.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/local_runtime.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/logging.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/perf.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/protocol.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/registry.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/runtime.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/sync_state.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/connector/time.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/run.sh +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/fake_agent/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/fake_agent/__main__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/test_acp_adapter_fake.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/test_acp_reducer_golden.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/acp/test_config_options.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/contract/__init__.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/contract/helpers.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_claude_history_adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_claude_preferences.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_claude_sdk_adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_claude_timeline_parity.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_claude_trust.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_codex_adapter.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_capabilities.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_cli.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_control.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_json_rpc.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_connector_logging.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_launch_command.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_local_runtime.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_perf.py +0 -0
- {agentlink_cli-0.2.0 → agentlink_cli-0.2.1}/tests/test_terminal_backend.py +0 -0
|
@@ -40,10 +40,8 @@ def workspace_root(params: dict[str, Any]) -> Path:
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
def resolve_path(root: Path, raw_path: str) -> Path:
|
|
43
|
-
if raw_path.startswith("~"):
|
|
44
|
-
raise WorkspaceBoundaryError("path must stay within the workspace")
|
|
45
43
|
root = root.resolve(strict=False)
|
|
46
|
-
path = Path(raw_path)
|
|
44
|
+
path = Path(raw_path).expanduser()
|
|
47
45
|
if not path.is_absolute():
|
|
48
46
|
path = root / path
|
|
49
47
|
resolved = path.resolve(strict=False)
|
|
@@ -324,6 +324,39 @@ def test_connector_rejects_workspace_symlink_escape(tmp_path) -> None:
|
|
|
324
324
|
asyncio.run(exercise())
|
|
325
325
|
|
|
326
326
|
|
|
327
|
+
def test_connector_accepts_home_shorthand_within_home(tmp_path, monkeypatch) -> None:
|
|
328
|
+
async def exercise() -> None:
|
|
329
|
+
home = tmp_path / "home"
|
|
330
|
+
child = home / "project"
|
|
331
|
+
child.mkdir(parents=True)
|
|
332
|
+
(child / "README.md").write_text("home workspace", encoding="utf-8")
|
|
333
|
+
monkeypatch.setenv("HOME", str(home))
|
|
334
|
+
monkeypatch.setenv("USERPROFILE", str(home))
|
|
335
|
+
|
|
336
|
+
client = BackendRpcClient(
|
|
337
|
+
ConnectorConfig("http://127.0.0.1:8000", "conn_1", "secret"),
|
|
338
|
+
adapters={"codex": FakeAdapter()},
|
|
339
|
+
)
|
|
340
|
+
home_result = await client.dispatch("fs.readDir", {"root": "~", "path": "~"})
|
|
341
|
+
assert home_result["path"] == str(home)
|
|
342
|
+
assert [entry["name"] for entry in home_result["entries"]] == ["project"]
|
|
343
|
+
|
|
344
|
+
child_result = await client.dispatch(
|
|
345
|
+
"fs.readDir", {"root": "~", "path": "~/project"}
|
|
346
|
+
)
|
|
347
|
+
assert child_result["path"] == str(child)
|
|
348
|
+
assert [entry["name"] for entry in child_result["entries"]] == ["README.md"]
|
|
349
|
+
|
|
350
|
+
workspace = tmp_path / "workspace"
|
|
351
|
+
workspace.mkdir()
|
|
352
|
+
with pytest.raises(WorkspaceBoundaryError):
|
|
353
|
+
await client.dispatch(
|
|
354
|
+
"fs.readDir", {"root": str(workspace), "path": "~"}
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
asyncio.run(exercise())
|
|
358
|
+
|
|
359
|
+
|
|
327
360
|
def test_notification_outbox_survives_reopen(tmp_path) -> None:
|
|
328
361
|
path = tmp_path / "state.sqlite3"
|
|
329
362
|
outbox = SqliteNotificationOutbox(
|
|
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
|