Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ AgentSeek is a template-first toolkit for local agent application development.
It gives editable generated projects one predictable lifecycle: discover,
create, inspect, configure, check, run, observe, and iterate.

AgentSeek 0.1.2 resolves lifecycle-v2 templates from the immutable
[`agentseek-ai/agentseek-templates` catalog](https://github.com/agentseek-ai/agentseek-templates/releases/tag/v0.1.0).
AgentSeek 0.1.3 resolves lifecycle-v2 templates from the immutable
[`agentseek-ai/agentseek-templates` catalog](https://github.com/agentseek-ai/agentseek-templates/releases/tag/v0.1.3).
The CLI lists templates from its embedded registry snapshot and fetches named
template content at the exact locked commit.

Expand Down
4 changes: 2 additions & 2 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
AgentSeek 是面向本地 Agent 应用开发的 template-first 工具包。它为可编辑的生成项目
提供一条可预期的生命周期:发现、创建、审视、配置、检查、运行、观测和迭代。

AgentSeek 0.1.2 从不可变的
[`agentseek-ai/agentseek-templates` catalog](https://github.com/agentseek-ai/agentseek-templates/releases/tag/v0.1.0)
AgentSeek 0.1.3 从不可变的
[`agentseek-ai/agentseek-templates` catalog](https://github.com/agentseek-ai/agentseek-templates/releases/tag/v0.1.3)
解析 lifecycle-v2 模板。CLI 用内嵌注册表快照列出模板;命名模板内容只按精确锁定的
commit 获取。

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "agentseek"
version = "0.1.2"
version = "0.1.3"
description = "A database-native Agent Harness for runtime data workflows, powered by Bub"
authors = [{ name = "Chojan Shang", email = "psiace@apache.org" }]
readme = "README.md"
Expand Down
38 changes: 22 additions & 16 deletions src/agentseek/data/catalog-lock.json
Original file line number Diff line number Diff line change
@@ -1,38 +1,44 @@
{
"schema_version": 1,
"catalog_repository": "https://github.com/agentseek-ai/agentseek-templates.git",
"catalog_commit": "494863bc1b9aab19f9885d716c03ce654fb26014",
"catalog_release": "v0.1.0",
"catalog_commit": "2a5e57faf3f845d4a0ad6172efd937921aac0b12",
"catalog_release": "v0.1.3",
"templates_root": "templates",
"index_path": "templates/index.json",
"lifecycle_version": 2,
"core_repository": "https://github.com/ob-labs/agentseek.git",
"core_commit": "883addad1e2993c4be6fc8ba053f87f25fb5057a",
"core_release": "core-snapshot-v0.1.0",
"core_commit": "900f89518c32f8570d7648897394ed96a86a647a",
"core_release": "v0.1.2",
"templates": {
"bub/default": "Lightweight Bub agent with AgentSeek lifecycle spec.",
"deepagents/content-builder": "DeepAgents content builder with skills, subagents, image generation, streamed UI, and AgentSeek lifecycle spec.",
"deepagents/default": "Local create_deep_agent runnable with AgentSeek lifecycle spec.",
"deepagents/mcp": "DeepAgents MCP Tools app with validated stdio/HTTP configuration, a local calculator example, streamed UI, and AgentSeek lifecycle spec.",
"deepagents/research": "DeepAgents research agent with Tavily search, streamed tool/sub-agent UI, and AgentSeek lifecycle spec.",
"deepagents/sandbox": "DeepAgents sandbox coding agent with streamed UI and AgentSeek lifecycle spec.",
"langchain/agentic-rag": "LangChain agentic RAG with OceanBase vector search and AgentSeek lifecycle spec.",
"langchain/agentic-rag-hybrid": "LangChain agentic hybrid RAG with image ingestion, vector/sparse/full-text/metadata search, comparison demos, optional Phoenix observability, and AgentSeek lifecycle spec.",
"langchain/agentic-rag-openvino": "LangChain local RAG with OpenVINO models and AgentSeek lifecycle spec.",
"langchain/cli-remote": "Remote LangGraph CLI agent bridged through LangGraphClientRunnable with AgentSeek lifecycle spec.",
"langchain/default": "LangChain create_agent plus CopilotKit middleware with AgentSeek lifecycle spec.",
"langchain/markdown-messages": "LangChain create_agent and react-markdown frontend with AgentSeek lifecycle spec."
"langchain/relay-observability": "LangChain Relay observability with bounded Tavily research, Phoenix, OceanBase SeekDB, and AgentSeek lifecycle spec.",
"langchain/markdown-messages": "LangChain create_agent and react-markdown frontend with AgentSeek lifecycle spec.",
"langchain/rubric": "LangChain create_agent with evidence-backed rubric revision, Guided Demo and Live Model UI, and AgentSeek lifecycle spec."
},
"template_digests": {
"bub/default": "096c35aeff1cfe3b3420bb5d9ba5a8473c959fa535380b3822f1fb9044b50dfa",
"deepagents/content-builder": "0239ac0ebb0632369d9b3f86b33b5fb3ab9c153a752f94a5ddcaf8d82c091b34",
"deepagents/default": "3d0b41f4af8b18ea236d11f166803c524784fa5605d18d13c5d6b310d1b47118",
"deepagents/research": "7a0ae249636015c2e1d91cbc42dffcb278bae757aff2a7f928711ad534ff4ca0",
"deepagents/sandbox": "b532af922546232aa7500f774342b957eb644e25faef26a7aca5a5c9d5773fa4",
"langchain/agentic-rag": "133635986878f88ebf16964eee05d10d298053420c432c6ef9fa30a1b7e6fdc9",
"langchain/agentic-rag-hybrid": "64c83a6d99cd1c9b916cd39f81eb24cf5424efaf26a266d57d71d61c89c239df",
"langchain/agentic-rag-openvino": "ae7227904fa2341d0698c64adf5350869867ee4947b1a9ebd08e1a871b94d3e5",
"langchain/cli-remote": "9667e628548f60cd688d6fda6bb4a37fa726712459ed97761ce2442fbf564826",
"langchain/default": "befb5541f39993bfde0938c3ec90f47693efe16d72cab505cdf2d4d5757b7d31",
"langchain/markdown-messages": "6a08b10cc113252bea0db5545554ebec41f27e962ed9f1475800ab518485c622"
"bub/default": "5cec8fc8f87ae203d4615d5664c854e30a04c10e065c293e293956cfa4a60b8c",
"deepagents/content-builder": "fd3e5bd1d59efba60edc738e5da97ddb6e990df7e83e364ef06f5c3734b3b2f2",
"deepagents/default": "d73f071bfb7063039684089af29032ca9105926c326379f9e27a8f1374907480",
"deepagents/mcp": "182c445d9fd7dfc9370bd8c37f6b3bb26a0ea9f9f269f635bd7bd8b5edb5c1d1",
"deepagents/research": "0dba10d3827f2977b61506e386d7a978cdfdec5208e20b1d68893ecd327f343d",
"deepagents/sandbox": "8477d28f63031048f5e0af56f1d90237feaf0f9b3dd83fab8d6dc007a9f3d65f",
"langchain/agentic-rag": "8f4bf863f312dbb33b3258115b398b0eeb7ea4cd6433cc5ec3392d6ebc13b9fd",
"langchain/agentic-rag-hybrid": "2027ea793442149bdd78f70c1cd61177265cc06ff4146b72030a8abfe2402434",
"langchain/agentic-rag-openvino": "1dca769085039b231559fa5de7809a6272f5d690eb4c313a4868bd69ac1ba022",
"langchain/cli-remote": "9ee99658dccf5fc0d9dd6d8b662d01ff5d5f7743c73f7db9edb1a9a20dc26ec0",
"langchain/default": "98406311b57fc7394dc0d3945e3886f734d39c1e0a3dfd9150cb3f9e2bb85703",
"langchain/relay-observability": "e3ffa595acdb9ec12997dfe6c2107a71a5055bf02692291d733867066a442edd",
"langchain/markdown-messages": "a4dd6d0b2a6eae548bbf57ed04d2e9a63a6c35c06eccd2d599d6557ebcb439d6",
"langchain/rubric": "bc29410e030d2792878457211443109234d733eeb9d851a0287ea4060b2250fd"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import subprocess
import sys
from collections.abc import AsyncIterator, Mapping
from contextlib import asynccontextmanager
from contextlib import asynccontextmanager, suppress
from dataclasses import dataclass
from pathlib import Path
from typing import Any
Expand Down Expand Up @@ -125,6 +125,13 @@ def _http_server_environment(environ: Mapping[str, str]) -> dict[str, str]:
}


async def _close_stream_writer(writer: asyncio.StreamWriter) -> None:
"""Close a short-lived probe without surfacing peer-reset cleanup noise."""
writer.close()
with suppress(OSError, TimeoutError):
await asyncio.wait_for(writer.wait_closed(), timeout=0.25)


async def _http_server_is_ready(host: str, port: int) -> bool:
try:
reader, writer = await asyncio.wait_for(asyncio.open_connection(host, port), timeout=0.25)
Expand All @@ -142,17 +149,15 @@ async def _http_server_is_ready(host: str, port: int) -> bool:
except (OSError, TimeoutError):
return False
finally:
writer.close()
await writer.wait_closed()
await _close_stream_writer(writer)


async def _http_server_accepts_connections(host: str, port: int) -> bool:
try:
_reader, writer = await asyncio.wait_for(asyncio.open_connection(host, port), timeout=0.25)
except (OSError, TimeoutError):
return False
writer.close()
await writer.wait_closed()
await _close_stream_writer(writer)
return True


Expand Down
51 changes: 33 additions & 18 deletions tests/cli_commands/test_locked_catalog.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,21 +93,25 @@ def test_packaged_catalog_lock_records_the_published_release_pair() -> None:
assert lock == {
"schema_version": 1,
"catalog_repository": "https://github.com/agentseek-ai/agentseek-templates.git",
"catalog_commit": "494863bc1b9aab19f9885d716c03ce654fb26014",
"catalog_release": "v0.1.0",
"catalog_commit": "2a5e57faf3f845d4a0ad6172efd937921aac0b12",
"catalog_release": "v0.1.3",
"templates_root": "templates",
"index_path": "templates/index.json",
"lifecycle_version": 2,
"core_repository": "https://github.com/ob-labs/agentseek.git",
"core_commit": "883addad1e2993c4be6fc8ba053f87f25fb5057a",
"core_release": "core-snapshot-v0.1.0",
"core_commit": "900f89518c32f8570d7648897394ed96a86a647a",
"core_release": "v0.1.2",
"templates": {
"bub/default": "Lightweight Bub agent with AgentSeek lifecycle spec.",
"deepagents/content-builder": (
"DeepAgents content builder with skills, subagents, image generation, "
"streamed UI, and AgentSeek lifecycle spec."
),
"deepagents/default": "Local create_deep_agent runnable with AgentSeek lifecycle spec.",
"deepagents/mcp": (
"DeepAgents MCP Tools app with validated stdio/HTTP configuration, a local calculator example, "
"streamed UI, and AgentSeek lifecycle spec."
),
"deepagents/research": (
"DeepAgents research agent with Tavily search, streamed tool/sub-agent UI, "
"and AgentSeek lifecycle spec."
Expand All @@ -127,22 +131,33 @@ def test_packaged_catalog_lock_records_the_published_release_pair() -> None:
"Remote LangGraph CLI agent bridged through LangGraphClientRunnable with AgentSeek lifecycle spec."
),
"langchain/default": ("LangChain create_agent plus CopilotKit middleware with AgentSeek lifecycle spec."),
"langchain/relay-observability": (
"LangChain Relay observability with bounded Tavily research, Phoenix, OceanBase SeekDB, "
"and AgentSeek lifecycle spec."
),
"langchain/markdown-messages": (
"LangChain create_agent and react-markdown frontend with AgentSeek lifecycle spec."
),
"langchain/rubric": (
"LangChain create_agent with evidence-backed rubric revision, Guided Demo and Live Model UI, "
"and AgentSeek lifecycle spec."
),
},
"template_digests": {
"bub/default": "096c35aeff1cfe3b3420bb5d9ba5a8473c959fa535380b3822f1fb9044b50dfa",
"deepagents/content-builder": "0239ac0ebb0632369d9b3f86b33b5fb3ab9c153a752f94a5ddcaf8d82c091b34",
"deepagents/default": "3d0b41f4af8b18ea236d11f166803c524784fa5605d18d13c5d6b310d1b47118",
"deepagents/research": "7a0ae249636015c2e1d91cbc42dffcb278bae757aff2a7f928711ad534ff4ca0",
"deepagents/sandbox": "b532af922546232aa7500f774342b957eb644e25faef26a7aca5a5c9d5773fa4",
"langchain/agentic-rag": "133635986878f88ebf16964eee05d10d298053420c432c6ef9fa30a1b7e6fdc9",
"langchain/agentic-rag-hybrid": ("64c83a6d99cd1c9b916cd39f81eb24cf5424efaf26a266d57d71d61c89c239df"),
"langchain/agentic-rag-openvino": ("ae7227904fa2341d0698c64adf5350869867ee4947b1a9ebd08e1a871b94d3e5"),
"langchain/cli-remote": "9667e628548f60cd688d6fda6bb4a37fa726712459ed97761ce2442fbf564826",
"langchain/default": "befb5541f39993bfde0938c3ec90f47693efe16d72cab505cdf2d4d5757b7d31",
"langchain/markdown-messages": ("6a08b10cc113252bea0db5545554ebec41f27e962ed9f1475800ab518485c622"),
"bub/default": "5cec8fc8f87ae203d4615d5664c854e30a04c10e065c293e293956cfa4a60b8c",
"deepagents/content-builder": "fd3e5bd1d59efba60edc738e5da97ddb6e990df7e83e364ef06f5c3734b3b2f2",
"deepagents/default": "d73f071bfb7063039684089af29032ca9105926c326379f9e27a8f1374907480",
"deepagents/mcp": "182c445d9fd7dfc9370bd8c37f6b3bb26a0ea9f9f269f635bd7bd8b5edb5c1d1",
"deepagents/research": "0dba10d3827f2977b61506e386d7a978cdfdec5208e20b1d68893ecd327f343d",
"deepagents/sandbox": "8477d28f63031048f5e0af56f1d90237feaf0f9b3dd83fab8d6dc007a9f3d65f",
"langchain/agentic-rag": "8f4bf863f312dbb33b3258115b398b0eeb7ea4cd6433cc5ec3392d6ebc13b9fd",
"langchain/agentic-rag-hybrid": ("2027ea793442149bdd78f70c1cd61177265cc06ff4146b72030a8abfe2402434"),
"langchain/agentic-rag-openvino": ("1dca769085039b231559fa5de7809a6272f5d690eb4c313a4868bd69ac1ba022"),
"langchain/cli-remote": "9ee99658dccf5fc0d9dd6d8b662d01ff5d5f7743c73f7db9edb1a9a20dc26ec0",
"langchain/default": "98406311b57fc7394dc0d3945e3886f734d39c1e0a3dfd9150cb3f9e2bb85703",
"langchain/markdown-messages": ("a4dd6d0b2a6eae548bbf57ed04d2e9a63a6c35c06eccd2d599d6557ebcb439d6"),
"langchain/relay-observability": ("e3ffa595acdb9ec12997dfe6c2107a71a5055bf02692291d733867066a442edd"),
"langchain/rubric": "bc29410e030d2792878457211443109234d733eeb9d851a0287ea4060b2250fd",
},
}

Expand Down Expand Up @@ -410,7 +425,7 @@ def stream(method: str, url: str, **kwargs: object) -> _FakeStreamContext:
assert destination.read_bytes() == payload
assert captured["method"] == "GET"
assert captured["url"] == (
"https://codeload.github.com/agentseek-ai/agentseek-templates/tar.gz/494863bc1b9aab19f9885d716c03ce654fb26014"
"https://codeload.github.com/agentseek-ai/agentseek-templates/tar.gz/2a5e57faf3f845d4a0ad6172efd937921aac0b12"
)
assert captured["follow_redirects"] is False

Expand Down Expand Up @@ -1054,7 +1069,7 @@ def run(source: TemplateSource, *, output_dir: Path, no_input: bool) -> None:
"_agentseek_source_path_posix": "",
"_agentseek_source_path_shell": "",
"_agentseek_source_url": "https://github.com/ob-labs/agentseek.git",
"_agentseek_source_ref": "883addad1e2993c4be6fc8ba053f87f25fb5057a",
"_agentseek_source_ref": "900f89518c32f8570d7648897394ed96a86a647a",
}


Expand Down Expand Up @@ -1316,7 +1331,7 @@ def run(source: TemplateSource, **kwargs: object) -> None:
"_agentseek_source_path_posix": "",
"_agentseek_source_path_shell": "",
"_agentseek_source_url": "https://github.com/ob-labs/agentseek.git",
"_agentseek_source_ref": "883addad1e2993c4be6fc8ba053f87f25fb5057a",
"_agentseek_source_ref": "900f89518c32f8570d7648897394ed96a86a647a",
}


Expand Down
20 changes: 20 additions & 0 deletions tests/test_deepagents_mcp_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,26 @@ def test_rendered_calculator_mcp_smoke_is_real(rendered_mcp: Path, monkeypatch:
assert not _loopback_port_is_open(http_port)


def test_http_connection_probe_ignores_peer_reset_while_closing(
rendered_mcp: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
smoke = import_rendered_package_module(rendered_mcp, "mcp_smoke")

class ResettingWriter:
def close(self) -> None:
pass

async def wait_closed(self) -> None:
raise ConnectionResetError(10054, "peer closed")

async def open_connection(_host: str, _port: int) -> tuple[object, ResettingWriter]:
return object(), ResettingWriter()

monkeypatch.setattr(smoke.asyncio, "open_connection", open_connection)

assert asyncio.run(smoke._http_server_accepts_connections("127.0.0.1", 2025)) is True


def test_http_smoke_child_environment_excludes_application_secrets(
rendered_mcp: Path, monkeypatch: pytest.MonkeyPatch
) -> None:
Expand Down
8 changes: 4 additions & 4 deletions tests/test_docs_lifecycle.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@

README_REQUIRED_TEXT = {
"README.md": (
"AgentSeek 0.1.2",
"releases/tag/v0.1.0",
"AgentSeek 0.1.3",
"releases/tag/v0.1.3",
"native LangGraph backend",
"React frontend",
"agentseek info --json",
Expand All @@ -161,8 +161,8 @@
f"{IMMUTABLE_ASSET_ROOT}agentseek-adlc-en.svg",
),
"README.zh.md": (
"AgentSeek 0.1.2",
"releases/tag/v0.1.0",
"AgentSeek 0.1.3",
"releases/tag/v0.1.3",
"发现、创建、审视、配置、检查、运行、观测和迭代",
"原生 LangGraph 后端",
"React 前端",
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading