Index: devel/swival/Makefile =================================================================== RCS file: /cvs/ports/devel/swival/Makefile,v diff -u -p -u -r1.2 Makefile --- devel/swival/Makefile 31 Aug 2026 23:43:55 -0000 1.2 +++ devel/swival/Makefile 14 Oct 2026 17:59:23 -0000 @@ -1,36 +1,42 @@ COMMENT = coding agent for AI models -MODPY_DISTV = 1.0.37 -DISTNAME = swival-${MODPY_DISTV} -REVISION = 0 +MODPY_DISTV = 1.0.47 +GH_ACCOUNT = swival +GH_PROJECT = swival +GH_TAGNAME = ${MODPY_DISTV} CATEGORIES = devel - -HOMEPAGE = https://pypi.org/project/swival/ +HOMEPAGE = https://swival.dev/ # MIT PERMIT_PACKAGE = Yes MODULES = lang/python - -MODPY_PI = Yes MODPY_PYBUILD = hatchling -# XXX may need porting: -# converters/py-html-to-markdown>=3.7.2,<4 (required) -# devel/py-google-cloud-aiplatform>=1.158.0 (required) -# devel/py-starlark-go>=1.0.1 (optional; blocked by golang/go#33896) - -RUN_DEPENDS = devel/py-litellm>=1.90,<1.91 \ - devel/py-mcp>=1.28.1,<2 \ - devel/py-prompt_toolkit>=3.0.52 \ - devel/py-rich>=15.0.0 \ - net/py-boto3>=1.43.36 \ - security/py-fast-cipher>=0.2.2 \ - textproc/py-rank-bm25>=0.2.2 \ - textproc/py-tiktoken>=0.13.0 \ - www/py-httpx>=0.28.1 \ - www/py-starlette>=1.3.1 \ - www/py-uvicorn>=0.49.0 +BUILD_DEPENDS = devel/py-hatchling>=1.32.4 +RUN_DEPENDS = converters/py-html-to-markdown>=3.17.2,<4 \ + devel/py-google-cloud-aiplatform>=2.4.0,<3 \ + devel/py-litellm>=1.105.0,<1.106 \ + devel/py-mcp>=2.3.0,<3 \ + devel/py-prompt_toolkit>=3.0.53 \ + devel/py-rich>=15.0.0 \ + net/py-boto3>=1.43.111 \ + security/py-fast-cipher>=0.2.2 \ + textproc/py-rank-bm25>=0.2.2 \ + textproc/py-tiktoken>=0.14.0 \ + www/py-httpx2>=2.13.1 \ + www/py-starlette>=1.7.0 \ + www/py-uvicorn>=0.54.0 + +MODPY_PYTEST_ARGS = -m 'not stress' +TEST_ENV += LITELLM_LOCAL_MODEL_COST_MAP=True + +# Optional metaskills need starlark-go, which requires Go's c-shared mode +# (not implemented on OpenBSD; golang/go#33896). + +# The website builder shadows the Python build frontend. +post-extract: + mv ${WRKSRC}/build.py ${WRKSRC}/build-website.py .include Index: devel/swival/distinfo =================================================================== RCS file: /cvs/ports/devel/swival/distinfo,v diff -u -p -u -r1.1.1.1 distinfo --- devel/swival/distinfo 24 Jul 2026 20:17:00 -0000 1.1.1.1 +++ devel/swival/distinfo 14 Oct 2026 17:59:23 -0000 @@ -1,2 +1,2 @@ -SHA256 (swival-1.0.37.tar.gz) = 8Eo5H0zpyIAP4M+mHneahNK9PCD9lElVkzDNCMV3YhY= -SIZE (swival-1.0.37.tar.gz) = 891967 +SHA256 (swival-1.0.47.tar.gz) = QM4hgHglVTuEDElgPodtjGsQcpe34PEaDnRAS8JO874= +SIZE (swival-1.0.47.tar.gz) = 2203771 Index: devel/swival/pkg/PLIST =================================================================== RCS file: /cvs/ports/devel/swival/pkg/PLIST,v diff -u -p -u -r1.1.1.1 PLIST --- devel/swival/pkg/PLIST 24 Jul 2026 20:17:00 -0000 1.1.1.1 +++ devel/swival/pkg/PLIST 14 Oct 2026 17:59:23 -0000 @@ -45,8 +45,14 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}config.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}continue_here.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}continue_here.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}cost.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}cost.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}deferred_tools.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}deferred_tools.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}edit.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}edit.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}exposure.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}exposure.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}fetch.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}fetch.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}filter.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} @@ -59,6 +65,8 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}input_commands.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}input_dispatch.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}input_dispatch.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}instructions.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}instructions.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}keepawake.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}keepawake.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}lifecycle.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} @@ -71,12 +79,24 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}memory.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}metaskills.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}metaskills.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}model_catalog.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}model_catalog.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}model_prefs.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}model_prefs.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}onboarding.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}onboarding.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}outline.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}outline.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}picker.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}picker.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}prompt_spans.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}prompt_spans.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}python_bridge.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}python_bridge.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}repair.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}repair.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}repl_ui.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}repl_ui.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}report.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}report.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}reviewer.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} @@ -91,6 +111,8 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}secrets.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}session.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}session.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}simplify.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}simplify.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}skills.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}skills.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}skills_cli.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} @@ -115,6 +137,8 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}traces.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}tracker.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}tracker.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}worktree.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/${MODPY_PYCACHE}worktree.${MODPY_PYC_MAGIC_TAG}pyc lib/python${MODPY_VERSION}/site-packages/swival/_env.py lib/python${MODPY_VERSION}/site-packages/swival/_msg.py lib/python${MODPY_VERSION}/site-packages/swival/a2a_client.py @@ -132,22 +156,37 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/completer.py lib/python${MODPY_VERSION}/site-packages/swival/config.py lib/python${MODPY_VERSION}/site-packages/swival/continue_here.py +lib/python${MODPY_VERSION}/site-packages/swival/cost.py +lib/python${MODPY_VERSION}/site-packages/swival/deferred_tools.py lib/python${MODPY_VERSION}/site-packages/swival/edit.py +lib/python${MODPY_VERSION}/site-packages/swival/exposure.py lib/python${MODPY_VERSION}/site-packages/swival/fetch.py lib/python${MODPY_VERSION}/site-packages/swival/filter.py lib/python${MODPY_VERSION}/site-packages/swival/fmt.py lib/python${MODPY_VERSION}/site-packages/swival/goal.py lib/python${MODPY_VERSION}/site-packages/swival/input_commands.py lib/python${MODPY_VERSION}/site-packages/swival/input_dispatch.py +lib/python${MODPY_VERSION}/site-packages/swival/instructions.py lib/python${MODPY_VERSION}/site-packages/swival/keepawake.py lib/python${MODPY_VERSION}/site-packages/swival/lifecycle.py lib/python${MODPY_VERSION}/site-packages/swival/loops.py lib/python${MODPY_VERSION}/site-packages/swival/mcp_client.py lib/python${MODPY_VERSION}/site-packages/swival/memory.py lib/python${MODPY_VERSION}/site-packages/swival/metaskills.py +lib/python${MODPY_VERSION}/site-packages/swival/model_catalog.py +lib/python${MODPY_VERSION}/site-packages/swival/model_prefs.py lib/python${MODPY_VERSION}/site-packages/swival/onboarding.py lib/python${MODPY_VERSION}/site-packages/swival/outline.py +lib/python${MODPY_VERSION}/site-packages/swival/picker.py +lib/python${MODPY_VERSION}/site-packages/swival/prompt_spans.py +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge.py +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge_client/ +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge_client/${MODPY_PYCACHE}/ +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge_client/${MODPY_PYCACHE}swival_tools.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION} +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge_client/${MODPY_PYCACHE}swival_tools.${MODPY_PYC_MAGIC_TAG}pyc +lib/python${MODPY_VERSION}/site-packages/swival/python_bridge_client/swival_tools.py lib/python${MODPY_VERSION}/site-packages/swival/repair.py +lib/python${MODPY_VERSION}/site-packages/swival/repl_ui.py lib/python${MODPY_VERSION}/site-packages/swival/report.py lib/python${MODPY_VERSION}/site-packages/swival/reviewer.py lib/python${MODPY_VERSION}/site-packages/swival/sandbox.py @@ -155,6 +194,7 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/sandbox_nono.py lib/python${MODPY_VERSION}/site-packages/swival/secrets.py lib/python${MODPY_VERSION}/site-packages/swival/session.py +lib/python${MODPY_VERSION}/site-packages/swival/simplify.py lib/python${MODPY_VERSION}/site-packages/swival/skills.py lib/python${MODPY_VERSION}/site-packages/swival/skills_cli.py lib/python${MODPY_VERSION}/site-packages/swival/snapshot.py @@ -168,3 +208,4 @@ lib/python${MODPY_VERSION}/site-packages lib/python${MODPY_VERSION}/site-packages/swival/tools.py lib/python${MODPY_VERSION}/site-packages/swival/traces.py lib/python${MODPY_VERSION}/site-packages/swival/tracker.py +lib/python${MODPY_VERSION}/site-packages/swival/worktree.py Index: devel/swival/patches/patch-swival_python_bridge_py =================================================================== --- /dev/null +++ devel/swival/patches/patch-swival_python_bridge_py @@ -0,0 +1,51 @@ +Avoid overflowing the OpenBSD thread stack on deeply nested bridge JSON. + +Index: swival/python_bridge.py +--- swival/python_bridge.py.orig ++++ swival/python_bridge.py +@@ -29,6 +29,7 @@ + + MAX_CALLS = 500 + MAX_REQUEST_BYTES = 1 << 20 ++MAX_JSON_DEPTH = 128 + MAX_RESPONSE_BYTES = 10 << 20 + MAX_TOTAL_BYTES = 64 << 20 + # Keeps a looping snippet from growing the report without end. +@@ -44,6 +45,29 @@ + _FAILED = frozenset({"refused", "error", "timeout"}) + + _HEADER = struct.Struct(">I") ++ ++ ++def _check_json_depth(frame: bytes) -> None: ++ """Bound C JSON decoder recursion before it can exhaust a thread stack.""" ++ depth = 0 ++ quoted = False ++ escaped = False ++ for char in frame: ++ if quoted: ++ if escaped: ++ escaped = False ++ elif char == 92: ++ escaped = True ++ elif char == 34: ++ quoted = False ++ elif char == 34: ++ quoted = True ++ elif char in (91, 123): ++ depth += 1 ++ if depth > MAX_JSON_DEPTH: ++ raise ValueError("the request JSON nesting is too deep") ++ elif char in (93, 125): ++ depth -= 1 + + + class _ProtocolError(Exception): +@@ -383,6 +407,7 @@ + + def _handle(self, frame: bytes) -> bytes: + try: ++ _check_json_depth(frame) + request = json.loads(frame) + except (ValueError, RecursionError): + return _usage("the request is not JSON")