diff --git a/misc/openclaw/Makefile b/misc/openclaw/Makefile index b04ae96ee34f..9a4e9f95e9b4 100644 --- a/misc/openclaw/Makefile +++ b/misc/openclaw/Makefile @@ -1,100 +1,115 @@ PORTNAME= openclaw DISTVERSION= 2026.4.15 +PORTREVISION= 1 CATEGORIES= misc # machine-learning PKGNAMESUFFIX= -ai-gateway DISTFILES= ${PORTNAME}-${DISTVERSION}${EXTRACT_SUFX} DIST_SUBDIR= ${PORTNAME} MAINTAINER= yuri@FreeBSD.org COMMENT= Multi-channel AI gateway with extensible messaging integrations WWW= https://github.com/openclaw/openclaw LICENSE= MIT FETCH_DEPENDS= curl:ftp/curl \ jq:textproc/jq \ npm:www/npm \ ${LOCALBASE}/share/certs/ca-root-nss.crt:security/ca_root_nss BUILD_DEPENDS= npm:www/npm \ vips>=8.17.2:graphics/vips RUN_DEPENDS= vips>=8.17.2:graphics/vips USES= nodejs:run pkgconfig python:build USE_RC_SUBR= ${PORTNAME} +OPTIONS_DEFINE= EXTEND_AI_TIMEOUT +OPTIONS_DEFAULT= EXTEND_AI_TIMEOUT +EXTEND_AI_TIMEOUT_DESC= Set AI endpoint request timeout to 24 hours for slow models + PACKAGE_NAME= openclaw NODE_ARCH= ${ARCH:S/amd64/x64/:S/aarch64/arm64/:S/i386/ia32/:S/powerpc64le/ppc64le/:S/powerpc64/ppc64/:C/armv[67]/arm/} # modeled after electron.mk PLIST_SUB= NODE_ARCH=${NODE_ARCH} FETCH_SCRIPT= ${PORTSDIR}/Tools/scripts/npmjs-fetch-with-dependencies.sh dep_sharp_npm_name= sharp dep_sharp_version= 0.34.5 dep_node_addon_api_npm_name= node-addon-api dep_node_addon_api_version= 8.5.0 DISTFILES+= sharp-${dep_sharp_version}${EXTRACT_SUFX} \ node-addon-api-${dep_node_addon_api_version}${EXTRACT_SUFX} DD= ${DISTDIR}/${DIST_SUBDIR} do-fetch: @${MKDIR} ${DD} @if ! [ -f ${DD}/${PORTNAME}-${DISTVERSION}${EXTRACT_SUFX} ]; then \ ${SETENV} TMPDIR=${WRKDIR} LOCALBASE=${LOCALBASE} npm_config_force=true ${FETCH_SCRIPT} \ ${PACKAGE_NAME} ${DISTVERSION} \ ${FILESDIR}/package-lock.json \ ${DD}/${PORTNAME}-${DISTVERSION}${EXTRACT_SUFX}; \ fi @if ! [ -f ${DD}/sharp-${dep_sharp_version}${EXTRACT_SUFX} ]; then \ ${SETENV} TMPDIR=${WRKDIR} LOCALBASE=${LOCALBASE} ${FETCH_SCRIPT} \ ${dep_sharp_npm_name} ${dep_sharp_version} \ ${FILESDIR}/package-lock-sharp.json \ ${DD}/sharp-${dep_sharp_version}${EXTRACT_SUFX}; \ fi @if ! [ -f ${DD}/node-addon-api-${dep_node_addon_api_version}${EXTRACT_SUFX} ]; then \ ${SETENV} TMPDIR=${WRKDIR} LOCALBASE=${LOCALBASE} ${FETCH_SCRIPT} \ ${dep_node_addon_api_npm_name} ${dep_node_addon_api_version} \ ${FILESDIR}/package-lock-node-addon-api.json \ ${DD}/node-addon-api-${dep_node_addon_api_version}${EXTRACT_SUFX}; \ fi post-extract: # Move node-addon-api into sharp's node_modules for building @${MV} \ ${WRKDIR}/${dep_node_addon_api_npm_name}-${dep_node_addon_api_version}/node_modules/${dep_node_addon_api_npm_name} \ ${WRKDIR}/${dep_sharp_npm_name}-${dep_sharp_version}/node_modules/${dep_sharp_npm_name}/node_modules/node-addon-api do-build: @${ECHO_MSG} "====> Building sharp for FreeBSD..." @cd ${WRKDIR}/sharp-${dep_sharp_version}/node_modules/${dep_sharp_npm_name}/src && \ ${SETENV} HOME=${WRKDIR} PYTHON=${PYTHON_CMD} CXXFLAGS="-I${LOCALBASE}/include" \ node-gyp configure build --nodedir=${LOCALBASE} && \ ${MKDIR} ${WRKSRC}/node_modules/openclaw/node_modules/@img/sharp-freebsd-${NODE_ARCH} && \ ${CP} build/Release/sharp-freebsd-${NODE_ARCH}.node \ ${WRKSRC}/node_modules/openclaw/node_modules/@img/sharp-freebsd-${NODE_ARCH}/sharp.node do-install: # install node_modules @${MKDIR} ${STAGEDIR}${PREFIX}/lib @cd ${WRKSRC} && \ ${COPYTREE_SHARE} node_modules ${STAGEDIR}${PREFIX}/lib # remove *.node binaries for non-FreeBSD platforms @${FIND} ${STAGEDIR}${PREFIX}/lib/node_modules \ -name "*.node" ! -path "*freebsd*" -delete # update shebang ${REINPLACE_CMD} -i '' \ -e "s|#!/usr/bin/env node|#!${PREFIX}/bin/node|" \ ${STAGEDIR}${PREFIX}/lib/node_modules/${PACKAGE_NAME}/openclaw.mjs # set exec bit @${CHMOD} +x \ ${STAGEDIR}${PREFIX}/lib/node_modules/${PACKAGE_NAME}/openclaw.mjs # create wrapper script @${MKDIR} ${STAGEDIR}${PREFIX}/bin @${ECHO_CMD} '#!/bin/sh' > ${STAGEDIR}${PREFIX}/bin/openclaw @${ECHO_CMD} 'exec ${PREFIX}/lib/node_modules/${PACKAGE_NAME}/openclaw.mjs "$$@"' \ >> ${STAGEDIR}${PREFIX}/bin/openclaw @${CHMOD} +x ${STAGEDIR}${PREFIX}/bin/openclaw +post-patch-EXTEND_AI_TIMEOUT-on: + @${FIND} ${WRKSRC}/node_modules/${PACKAGE_NAME}/dist -name "*.js" \ + -exec ${GREP} -q "DEFAULT_GUARDED_HTTP_TIMEOUT_MS = 6e4" {} \; \ + -exec ${REINPLACE_CMD} \ + -e 's/DEFAULT_GUARDED_HTTP_TIMEOUT_MS = 6e4/DEFAULT_GUARDED_HTTP_TIMEOUT_MS = 86400000/' {} \; + @${FIND} ${WRKSRC}/node_modules/${PACKAGE_NAME}/dist -name "*.js" \ + -exec ${GREP} -q "DEFAULT_LLM_IDLE_TIMEOUT_MS = 120 \* 1e3" {} \; \ + -exec ${REINPLACE_CMD} \ + -e 's/DEFAULT_LLM_IDLE_TIMEOUT_MS = 120 \* 1e3/DEFAULT_LLM_IDLE_TIMEOUT_MS = 0/' {} \; + .include diff --git a/misc/openclaw/files/openclaw.in b/misc/openclaw/files/openclaw.in index c669d9062940..2567a61b1436 100644 --- a/misc/openclaw/files/openclaw.in +++ b/misc/openclaw/files/openclaw.in @@ -1,50 +1,47 @@ #!/bin/sh # PROVIDE: openclaw # REQUIRE: LOGIN # KEYWORDS: shutdown # Add the following lines to /etc/rc.conf to enable openclaw: # openclaw_enable="YES" # # openclaw_enable (bool): Set to YES to enable openclaw # Default: NO # openclaw_user (str): User to run openclaw as # Default: root -# openclaw_args (str): Additional arguments for openclaw -# Default: "" # openclaw_log (str): Log file for openclaw # Default: "/var/log/openclaw.log" # openclaw_pidfile (str): PID file for openclaw # Default: "/var/run/openclaw.pid" . /etc/rc.subr name="openclaw" rcvar=openclaw_enable load_rc_config $name : ${openclaw_enable:="NO"} : ${openclaw_user:="root"} -: ${openclaw_args:=""} : ${openclaw_log:="/var/log/openclaw.log"} : ${openclaw_pidfile:="/var/run/openclaw.pid"} run_command="%%PREFIX%%/bin/openclaw" -procname="${run_command}" +procname="%%PREFIX%%/bin/node" # node in order to be stopped properly by the framework (instead of "${run_command}") pidfile=${openclaw_pidfile} command=/usr/sbin/daemon -command_args="-f -t ${name} -p ${pidfile} -o ${openclaw_log} ${run_command} ${openclaw_args}" +command_args="-f -t ${name} -p ${pidfile} -o ${openclaw_log} ${run_command} gateway run" start_precmd="openclaw_precmd" openclaw_precmd() { export HOME=$(eval echo "~${openclaw_user}") touch ${openclaw_log} ${pidfile} chown ${openclaw_user} ${openclaw_log} ${pidfile} chmod 640 ${openclaw_log} } run_rc_command "$1" diff --git a/misc/openclaw/pkg-message b/misc/openclaw/pkg-message new file mode 100644 index 000000000000..aed99809d2ae --- /dev/null +++ b/misc/openclaw/pkg-message @@ -0,0 +1,36 @@ +[ +{ + type: install + message: < + +5. Web UI (Dashboard): + Access the management dashboard: + $ openclaw dashboard + By default, it is available at http://localhost:18789 + +For more information, see https://github.com/openclaw/openclaw +EOM +} +]