Skip to content

Suppress -Wincompatible-pointer-types when needed - #397

Closed
knu wants to merge 1 commit into
rubyjs:mainfrom
knu:fix/darwin_build
Closed

Suppress -Wincompatible-pointer-types when needed#397
knu wants to merge 1 commit into
rubyjs:mainfrom
knu:fix/darwin_build

Conversation

@knu

@knu knu commented Mar 7, 2026

Copy link
Copy Markdown

LLVM Clang 22+ treats -Wincompatible-pointer-types as an error by default, which breaks compilation of mini_racer_extension.c due to the unsigned long vs uint64_t mismatch in the bigint serialization code.

Add -Wno-incompatible-pointer-types to CFLAGS when the compiler rejects an unsigned long to uint64_t pointer conversion, as a workaround until the type mismatch is properly fixed in the extension source.

Ref: #359
Ref: #361

@tisba

tisba commented Mar 7, 2026

Copy link
Copy Markdown
Collaborator

Hey! I added macOS 26 (both on arm and x86) to the CI matrix: #398. It seems to compile just fine, even without your change… 🤔 The images use clang 17, according to https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md.

Maybe there is another cause for the compilation issues?

EDIT: The referenced issues mention this problem also happening on older macOS versions, not only macOS 26.

LLVM Clang 22+ treats -Wincompatible-pointer-types as an error
by default, which breaks compilation of mini_racer_extension.c
due to the unsigned long vs uint64_t mismatch in the bigint
serialization code.

Add -Wno-incompatible-pointer-types to CFLAGS when the compiler
rejects an unsigned long to uint64_t pointer conversion, as a
workaround until the type mismatch is properly fixed in the
extension source.

Ref: rubyjs#359
Ref: rubyjs#361
@knu
knu force-pushed the fix/darwin_build branch from aa0835f to 172396b Compare March 7, 2026 12:53
@knu knu changed the title Suppress -Wincompatible-pointer-types on macOS Suppress -Wincompatible-pointer-types when needed Mar 7, 2026
@knu

knu commented Mar 7, 2026

Copy link
Copy Markdown
Author

@tisba Sorry, the build process picked Clang 22 installed via Homebrew, which was the cause. I've updated the fix.

https://github.com/llvm/llvm-project/blob/llvmorg-22.1.0/clang/docs/ReleaseNotes.rst#c-c-language-potentially-breaking-changes

knu added a commit to huginn/huginn that referenced this pull request Mar 7, 2026
knu added a commit to huginn/huginn that referenced this pull request Mar 7, 2026
@tisba

tisba commented Mar 7, 2026

Copy link
Copy Markdown
Collaborator

Thank you. This greatly exceeds my level of expertise though 😅

Maybe @SamSaffron @bnoordhuis can take a look?

@knu

knu commented Mar 7, 2026

Copy link
Copy Markdown
Author

The added conditional basically checks if the compiler accepts -Wincompatible-pointer-types and if such a warning counts as a hard error, and we add -Wno-incompatible-pointer-types to CFLAGS if that's the case.

@bnoordhuis

Copy link
Copy Markdown
Collaborator

Wouldn't this also solve the issue?

diff --git a/ext/mini_racer_extension/serde.c b/ext/mini_racer_extension/serde.c
index 7d5d51f..3a3d8eb 100644
--- a/ext/mini_racer_extension/serde.c
+++ b/ext/mini_racer_extension/serde.c
@@ -244,7 +244,7 @@ static void ser_num(Ser *s, double v)
 }
 
 // ser_bigint: |n| is in bytes, not quadwords
-static void ser_bigint(Ser *s, const uint64_t *p, size_t n, int sign)
+static void ser_bigint(Ser *s, const unsigned long *p, size_t n, int sign)
 {
     if (*s->err)
         return;

@knu

knu commented Apr 4, 2026

Copy link
Copy Markdown
Author

@bnoordhuis It doesn't.

...
compiling mini_racer_v8.cc
clang++: warning: argument unused during compilation: '-rdynamic' [-Wunused-command-line-argument]
In file included from mini_racer_extension.c:37:
./serde.c:101:27: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
  101 |     n = next_power_of_two(n);
      |         ~~~~~~~~~~~~~~~~~ ^
./serde.c:111:14: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
  111 |     b->cap = n;
      |            ~ ^
./serde.c:283:23: error: incompatible pointer types passing 'uint64_t *' (aka 'unsigned long long *') to parameter of type 'const unsigned long *' [-Wincompatible-pointer-types]
  283 |         ser_bigint(s, &t, sizeof(t), sign);
      |                       ^~
./serde.c:247:53: note: passing argument to parameter 'p' here
  247 | static void ser_bigint(Ser *s, const unsigned long *p, size_t n, int sign)
      |                                                     ^
...
% clang++ --version
Homebrew clang version 22.1.2
Target: arm64-apple-darwin25.4.0
Thread model: posix
InstalledDir: /opt/homebrew/Cellar/llvm/22.1.2/bin
Configuration file: /opt/homebrew/Cellar/llvm/22.1.2/etc/clang/arm64-apple-darwin25.cfg

@SamSaffron

SamSaffron commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

#434

Does this work? I think it resolves it without hacking compile - cc @bnoordhuis

@SamSaffron

Copy link
Copy Markdown
Collaborator

merged my pr I think we compile fine now

@SamSaffron SamSaffron closed this Aug 13, 2026
@knu

knu commented Aug 26, 2026

Copy link
Copy Markdown
Author

Has a new version to address this already released?

@tisba

tisba commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

Has a new version to address this already released?

as far as I can tell, not yet. Might be an oversight /cc @SamSaffron

@SamSaffron

Copy link
Copy Markdown
Collaborator

yes I think so. it should released.

@tisba

tisba commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

554923f is not in the v0.22.0 tag ( v0.22.0...main)

@SamSaffron

SamSaffron commented Aug 27, 2026 via email

Copy link
Copy Markdown
Collaborator

@knu

knu commented Aug 27, 2026

Copy link
Copy Markdown
Author

Thank you for releasing 0.22.1!

knu added a commit to huginn/huginn that referenced this pull request Aug 27, 2026
0.22.1 includes the Clang 22+ build fix (rubyjs/mini_racer#397).
martadinata666 added a commit to martadinata666/huginn that referenced this pull request Sep 1, 2026
* Replace Unicorn with single-threaded Puma

- Switch runtime and deployment entrypoints from Unicorn to single-threaded Puma
- Keep clustered Puma available via WEB_CONCURRENCY while defaulting threads to 1
- Update Docker, Heroku, OpenShift, nginx, Capistrano, and manual deployment assets

* Document Puma fork worker tuning [ci skip]

* Update patch updated gems (huginn#3574)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency devise to v5.0.3 [SECURITY] (huginn#3575)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Stabilize Chrome startup in tests

* Modernize Docker test environment

- Replace the old PhantomJS-based test image with Google Chrome and matching ChromeDriver on the official Huginn base image
- Refresh docker/test compose usage and document the current amd64-based Chrome test setup
- Keep schema dumps and browser cache files out of the worktree, and separate Docker Bundler installs under vendor/bundle

* Fix SMTP TLS configuration for net-smtp 0.5+

* Add multi-arch (amd64 + arm64) Docker build & push

- Build amd64 and arm64 images in parallel on native runners
  (ubuntu-latest / ubuntu-24.04-arm), then merge per-arch digests
  into multi-arch manifests via docker buildx imagetools create
- Keep test image amd64-only (Chrome lacks arm64 Linux support)
- Add GHA layer cache with per-job scopes for faster rebuilds
- Optimize DockerHub push by adding OUTDATED_DOCKER_REGISTRY=true
  as a thin ENV layer on top of the GHCR image, avoiding a full
  rebuild
- Remove build_docker_image.sh, replaced by docker/build-push-action
  and inline workflow steps
- Use architecture-appropriate MySQL in multi-process image:
  MySQL 5.7 (Oracle repo) on amd64 for existing install compatibility,
  MySQL 8.0 (Ubuntu) on arm64 where 5.7 is unavailable
- Fix jq binary download for multi-arch (jqlang/jq, arch-aware URL)

* Minimize permissions

* Fix flaky select2 automation in tests

* Upgrade Font Awesome 6 to 7

font-awesome-sass gem does not support FA7, so switch to directly
installing the @fortawesome/fontawesome-free npm package with
pre-compiled CSS served through Sprockets.

- Configure Sprockets asset paths for FA7 CSS and webfonts
- Add @font-face overrides to fix Sprockets font path resolution
- Replace FA SCSS mixin usage in tables.scss with inline CSS

* Match glyphicon width to Font Awesome 7 icons

FA7 sets width: 1.25em on all icons by default, unlike FA6.
Apply the same width to .glyphicon so they align consistently
when displayed alongside FA7 icons.

* Replace deprecated google-api-client with google-apis-calendar_v3

* Fix Docker artifact names

* Fix MySQL socket config

* Add OpenaiConcern for shared OpenAI-compatible API integration logic

Provides a reusable concern for agents that interact with OpenAI-compatible
APIs. Includes configurable base_url (works with OpenAI, Ollama, Groq,
Azure OpenAI, vLLM, etc.), Bearer token auth, organization header support,
JSON and multipart HTTP request helpers, and common error handling.

Built on top of WebRequestConcern (Faraday) and FormConfigurable.

* Add OpenAI LLM Agent for chat completions via any OpenAI-compatible API

Supports configurable model, system/user messages with Liquid templating,
temperature, max_tokens, top_p, frequency/presence penalties, and JSON
response format. Works with OpenAI, Ollama, Groq, and any provider
exposing a /v1/chat/completions endpoint.

Includes RSpec tests with WebMock stubs and JSON fixture data.

* Add OpenAI Speech Agent for Whisper transcription/translation and TTS

Three modes in one agent: transcribe (Whisper STT), translate (Whisper
to English), and speak (TTS). Accepts audio via URL or file_pointer
events. TTS supports voice selection (alloy, echo, fable, onyx, nova,
shimmer) and multiple output formats. Returns base64-encoded audio for
TTS and transcribed text for STT.

Includes RSpec tests with WebMock stubs and JSON fixture data.

* Add OpenAI Image Generation Agent for DALL-E and compatible APIs

Supports DALL-E 2, DALL-E 3, and any compatible image generation endpoint.
Configurable size, quality (standard/hd), style (vivid/natural), and
response format (URL or base64). Emits one event per generated image,
supporting batch generation via the n parameter.

Includes RSpec tests with WebMock stubs and JSON fixture data.

* Add OpenAI Video Generation Agent with async submit/poll for Sora-compatible APIs

Supports three modes: submit (fire-and-forget), poll (check status by ID),
and submit_and_poll (submit then track in agent memory for automatic
polling on subsequent scheduled runs). Handles various API response shapes
for provider compatibility. Configurable endpoint path for non-standard
providers.

Includes RSpec tests with WebMock stubs and JSON fixture data.

* Refactor OpenAI agents: consolidate Faraday builders, fix global parse_body override, and harden video agent

- Consolidate three duplicate Faraday connection builders into a single
  build_openai_connection(parse_json:, multipart:) private method
- Remove global parse_body? override that broke binary audio fetching;
  JSON parsing is now per-connection via parse_json parameter
- Add MAX_PENDING_GENERATIONS (50) and PENDING_GENERATION_TTL (24h) to
  video agent to prevent unbounded memory growth
- Fix check_pending_generations to preserve original event payload when
  output_mode is merge
- Extract duplicated working? method from all four agents into
  OpenaiConcern
- Add expected_receive_period_in_days validation to OpenaiConcern

* Fix OpenAI agent test expectations

- Fix OpenaiLlmAgent merge mode test: 'message' field is always present
  as the LLM response content, not only when merging from incoming events
- Fix OpenaiVideoGenerationAgent test: move input event creation outside
  the expect block so only agent output events are counted

* Address PR huginn#3560 review comments

- Use Faraday :json middleware in openai_multipart_request instead of
  manual JSON.parse; expose parse_json: kwarg so callers can opt out for
  plain-text response formats (text, srt, vtt)
- Handle non-JSON transcription/translation response formats: pass
  parse_json: false and emit { response_format => raw_string } payload
- Validate response_format against allowed values per mode in
  OpenaiSpeechAgent#validate_options
- Use File.basename when building the multipart filename from a
  file_pointer to avoid leaking the full path to the API server
- Fix submit_and_poll description: scheduled check() only polls
  pending generations, it does not re-submit

* Properly apply knu's review: always enable Faraday :json middleware

The :json middleware is safe to enable unconditionally because Faraday
only decodes the body when Content-Type contains 'json'. This means
plain-text/binary responses (text, srt, vtt, audio) pass through
unchanged with no extra branching needed.

- Remove parse_json: kwarg from build_openai_connection and all callers
- openai_multipart_request no longer needs a parse_json: option
- perform_transcription/perform_translation branch on response.is_a?(Hash)
  rather than tracking the format string explicitly

* Centralize OpenAI error handling in request helpers and fix JSON.parse on decoded body

* Upgrade Liquid to 5.12 and update the monkey patch

* Introduce rspec-retry for flaky feature specs

* Add aarch64-linux-gnu platform and update nokogiri to 1.19.2

* Update dependency json to v2.19.2 [SECURITY] (huginn#3581)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Use Faraday::Request::Json middleware for JSON serialization

* Use URI for OpenAI endpoint URL construction

Resolve endpoint URLs with URI#+ instead of string interpolation,
and validate that resolved URLs stay within the base URL.

* Use targeted ENV stubs instead of stub_const in OpenAI agent specs

* Make coffee-script gem optional

Replace coffee-rails with coffee-script and move it to the optional
gems section.  JavaScriptAgent now dynamically enables CoffeeScript
support only when the gem is available.

* Update CHANGES.md [ci skip]

* Update docker/build-push-action action to v7 (huginn#3587)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update docker/login-action action to v4 (huginn#3588)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update docker/setup-buildx-action action to v4 (huginn#3589)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update GitHub Artifact Actions (huginn#3590)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3585)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3586)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Upgrade amd64 MySQL to 8.0 in multi-process image

MySQL 5.7 on amd64 has reached EOL.  We should move the multi-process image to MySQL 8.0.

MySQL 8.0 can upgrade existing 5.7 data automatically once it has been shut down cleanly, so add a startup upgrade path that fixes old dirty shutdowns first.  Also stop mysqld with SIGTERM and a longer wait so future upgrades remain smooth.

* Update patch updated gems (huginn#3592)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Refresh Dropbox and Weibo integrations

- Update OmniAuth-related dependencies, including the move to oauth2 2.x, so the authentication stack can move forward without the older dependency constraints.
- Replace unmaintained Dropbox and Weibo libraries with maintained or in-repo integrations that match the APIs Huginn actually uses.
- Tighten the Dropbox OAuth setup and agent documentation, including the scopes required by each agent.
- Stop using Kernel#open for Weibo uploads, reject non-HTTP image URLs, and derive upload content types from the fetched response instead of the filename.

* Fix PostAgent spec query assertion

* Remove CoffeeScript support from JavaScriptAgents

- Automatically transpile legacy CoffeeScript agent code and credential-backed code with npx coffeescript in the database migration

* Remove language selection from JavaScriptAgent form

The language option is no longer user-facing since CoffeeScript was
removed.  It is now automatically set to "JavaScript" via
before_validation instead of being a form field.

- Set ace editor mode to javascript explicitly
- Remove JS-side language selector and mode switching code
- Add feature spec for creating and editing JavaScriptAgents

* Relax gem version constraints

* Remove unused development workflow gems

- Remove better_errors, binding_of_caller, web-console, guard, guard-livereload, guard-rspec, and rack-livereload
- Delete Guardfile and the Rack::LiveReload middleware config
- I do not use these tools in my development workflow

* Add vendored dotenv update task

* Upgrade dotenv to 3.2.0

* Preserve dotenv parsing in cap sync

* Adjust Renovate gem update rules

* Update development and test gems to v3.20.0 (huginn#3599)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency faraday-typhoeus to v2

* Update dependency sprockets to v4.2.2 (huginn#3600)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Remove shoulda-matchers

* Update dependency rubocop-rspec to v3 (huginn#3602)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems to v1.23.0 (huginn#3604)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Replace the deprecated on_worker_boot with before_worker_boot

* Add Threads service and agents

- Add a Threads OmniAuth provider with long-lived token exchange and refresh
- Add ThreadsPublishAgent and ThreadsUserAgent

* Add service reauthorization flow

Users can now reauthorize their services with updated credentials or
scopes without having to recreate them and reconfigure agents.

* Improve Services UI

- Add an icon to each provider name in the table
- Turn "Global?" into a confirm-backed toggle switch
- Add a "List Agents" action and agent filtering by service
- Group service actions in a dropdown

* Skip duplicate CI runs on PR branches [ci skip]

* Center table rows

* Turn off the deprecated reconnect option of the MySQL connector

* Replace our JSON editor with vanilla-jsoneditor

* Support typed JSON option values

* Update CHANGES.md [ci skip]

* Switch omniauth-dropbox2 from GitHub HEAD to the latest release

* Replace twitter-stream with twitter

- Switch TwitterStreamAgent to Twitter::Streaming::Client
- Stop relying on EventMachine and the twitter-stream gem
- Use the released twitter gem instead of a GitHub source
- Avoid the simple_oauth lockfile conflict

* Switch httparty back from GitHub HEAD to the latest release

* Rework Tumblr agents by replacing obsolete gems

- Stop depending on unmaintained tumblr_client and its Faraday 2 fork
- Drop omniauth-tumblr, which still depends on old omniauth-oauth
- Replace them with an in-tree Faraday client and OAuth middleware
- Add a local Tumblr OmniAuth strategy that works on Rack 3

* Update dependency aws-sdk-s3 to '~> 1', '>= 1.218.0' (huginn#3614)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency execjs to v2.10.1 (huginn#3613)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance

* Stop sourcing capybara-select-2 from GitHub

- Use the rubygems 0.5.1 release instead
- The only code difference is a minor README change
- The packaged gem is slimmer because it omits extra repository files

* Update status badges [ci skip]

* Update huginn_agent to 0.6.4

* Support JSON-serialized fields on all backends

- Switch Service options from YAML serialization to JSON serialization
- Keep indifferent-access behavior for text and native JSON columns
- Cover reload behavior for agent, event, and service serialized fields

* Stabilize JSON duplicate detection

- Compare JSON objects independent of key order
- Use stable JSON when deduplicating whole-event payloads
- Cover reordered payloads in agent and utility specs

* Add staged JSON column rollout migrations

- Add a data migration that converts Service options to JSON serialization
- Add a native JSON column migration guarded by NATIVE_JSON_COLUMNS
- Add migration path and specs for flagged native JSON rollout

* Test native JSON rollout in CI

- Add enabled and disabled NATIVE_JSON_COLUMNS matrix lanes
- Run MySQL and PostgreSQL test jobs in both rollout modes

* Describe NATIVE_JSON_COLUMNS in .env.example

* Apply suggestion from @dsander

Co-authored-by: Dominik Sander <git@dsander.de>

* Update development and test gems to v1.86.1 (huginn#3620)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency puma to v8 (huginn#3619)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency aws-sdk-s3 to '~> 1', '>= 1.219.0' (huginn#3621)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3618)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Add fetch and fetchAll APIs to JavaScriptAgent

Expose a synchronous subset of the Web fetch API inside the
JavaScriptAgent sandbox as global `fetch(url, options)` and
`fetchAll(requests, options)` functions, backed by Faraday with the
Typhoeus adapter.

- `fetch` performs a single request and returns a Response-like object
  with `ok`, `status`, `statusText`, `url`, `redirected`, `headers`
  (with `get`/`has`), `text()`, and `json()`
- `fetchAll` runs multiple requests concurrently via Typhoeus'
  parallel manager and returns results in input order; each element
  may be a URL string or a `[url, options]` pair mirroring the
  arguments of `fetch`
- Supports `method`, `headers`, `body`, `timeout`, and `redirect`
  options
- Matches `fetch` semantics: HTTP error statuses set `ok=false` but do
  not throw, while any network-level failure raises a `TypeError` (for
  the whole batch in `fetchAll`)

* Update patch updated gems (huginn#3624)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Add whatwg-url-without-unicode and esbuild as npm dependencies

* Add build task for the whatwg-url polyfill

* Expose URL and URLSearchParams to JavaScriptAgent

Load the whatwg-url polyfill into MiniRacer on first reference so
that sandboxes that never touch URL do not pay the parse cost.

* Make sure fetch and fetchAll accept URL objects

* Update CHANGES.md [ci skip]

* Update patch updated gems to v2.19.4 (huginn#3627)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3628)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3623)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3631)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency spring to v4.5.0 (huginn#3632)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3630)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Track Ruby in CI, docs, and Dockerfiles

- Add regex managers for Ruby versions in CI, manual install docs, and Docker base images
- Keep Ruby source archive URLs aligned across minor and major updates
- Pin current Ruby references to 3.4.9

* Fix renovate configuration with the compatiblity part

* Update dependency ruby to v4

* bundle update --ruby

* Use .tool-versions for Ruby version

* Add bundle install workflow for Ruby bumps

* Revert "Upgrade Ruby to 4"

* Use .tool-versions for Ruby version

* Add bundle install workflow for Ruby bumps

* Fix the renovate settings for grouping ruby version bumps

* Update dependency ruby to v4 (huginn#3638)

* Update dependency ruby to v4

* Update bundle for Ruby version

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update documentation: add NPM for Font Awesome, remove --deployment flag

* Update dependency devise to v5.0.4 [SECURITY] (huginn#3644)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Bump fast-uri from 3.1.0 to 3.1.2

Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.0 to 3.1.2.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](fastify/fast-uri@v3.1.0...v3.1.2)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update patch updated gems (huginn#3646)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3647)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3652)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Suppress MySQL 9 updates

* Update patch updated gems (huginn#3654)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency ruby to v4.0.4 (huginn#3653)

* Update dependency ruby to v4.0.4

* Update bundle for Ruby version

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update Docker Compose MySQL to 8.0 [ci skip]

* Update dependency esbuild to ^0.28.0 (huginn#3655)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Avoid upgrading MySQL to >8.0.x for now [ci skip]

* Update dependency ruby to v4.0.5 (huginn#3660)

* Update dependency ruby to v4.0.5

* Update bundle for Ruby version

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3657)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3658)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Remove obsolete data fixtures

* Remove AdiosoAgent

The Adioso flight-search service has shut down: api.adioso.com no
longer resolves, so the agent cannot work any more.  Drop the agent,
its spec, fixtures, and the README mention.

* Improve JSON editor UX

- Add a drag handle for vertical resizing
- Add a fullscreen toggle (ESC or backdrop click to close)
- Fit initial height to existing content (capped at 80% of viewport)
- Stop clipping the context menu by dropping `overflow: hidden`
- Rewrite without jQuery using plain DOM APIs
- Rename json-editor.js.erb to json-editor.js (no ERB tags remain)

Addresses huginn#3641.

* Update development and test gems to v1.87.0 (huginn#3659)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3661)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems to v1.24.6 (huginn#3665)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Handle native JSON values in JSON serializer

During native JSON column migration or mixed boot paths, Active Record can
still route a serialized attribute through JsonWithIndifferentAccess even
though the database adapter has already decoded the JSON column value into a
Hash.  That inconsistent state makes the legacy serializer call JSON.parse on
the Hash and fail with "no implicit conversion of Hash into String".

Only parse String input as JSON so already-decoded Hash values are wrapped
with indifferent access.  Keep parser error handling scoped to JSON.parse and
cover string, hash, and nil inputs.

* Add Raindrop service and agents

- Add Raindrop service authentication with OAuth token refresh.
- Add RaindropBookmarksAgent for polling bookmarks.
- Add RaindropPublishAgent for saving incoming links.

* Refresh Threads tokens before expiry

Threads long-lived access tokens must be refreshed before they expire.  Once
Meta considers the session expired, the refresh endpoint returns an OAuth
error and the user has to reauthorize the service.

Refresh Threads services during request preparation when the token is within
seven days of expiry, while leaving other providers on the existing expired
token path.  Also raise provider refresh errors instead of silently ignoring a
failed token update.

Require the initial Threads token exchange to succeed as well, so a short-lived
OAuth token is not saved as if it were refreshable long-lived credentials.

* Lock file maintenance (huginn#3664)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Add signed file pointer validation

Sign all file pointers emitted by FileHandling agents and add
`require_signed_file_pointer` for consumers that need to reject forged
pointers.

New default options require signed file pointers for `ReadFileAgent`,
`CsvAgent`, `PostAgent`, and `OpenaiSpeechAgent`.  Existing agents without
the option keep accepting legacy unsigned pointers, avoiding breakage for
queued or retained events from older workflows.

This preserves compatibility while allowing file-consuming workflows to
treat file pointers not signed by a file-handling agent as invalid.

* Lock file maintenance (huginn#3670)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3671)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* clear sf weather reference in seeds

* Lock file maintenance (huginn#3672)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems to '~> 1', '>= 1.226.0' (huginn#3673)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Sync ACE editor into its form field on change

The editor's value was only copied into its backing form field by the
form submit handler (updateFromEditors).  Clicking Save could race that
handler and submit the original code, so an edit was occasionally lost.

Mirror the editor session into the source field on every change so the
field is always current regardless of submit timing.

* Fix flaky JavaScriptAgent feature spec

Add a set_ace_editor_value helper that waits for the editor to finish
initializing before entering a value, so the value is no longer clobbered
by buildAce seeding the editor on load.

* Sort optional agent gems alphabetically by agent name

- Reorder the optional libraries section so each gem is grouped under
  an agent-name comment and the groups are sorted alphabetically

* Drop redundant tzinfo dependency

- activesupport already requires tzinfo (~> 2.0, >= 2.0.5), so listing
  it explicitly in the Gemfile is unnecessary

* Drop redundant ffi dependency

- ffi is already pulled in transitively (typhoeus via ethon, among
  others), and the explicit `>= 1.17.4` floor is well below what those
  dependents resolve to, so the pin no longer serves a purpose

* Remove uglifier and execjs leftovers from the terser switch

- The asset JS compressor is terser (config.assets.js_compressor =
  :terser in production.rb); uglifier is no longer referenced anywhere
  and is dropped
- execjs was only an explicit pin with no direct use; terser still
  pulls it in transitively, so it stays resolved in Gemfile.lock

* Update actions/checkout action to v7 (huginn#3674)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3676)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency @fortawesome/fontawesome-free to v7.3.0 (huginn#3678)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3681)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency rubocop to v1.88.2 (huginn#3682)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3683)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency @fortawesome/fontawesome-free to v7.3.1 (huginn#3688)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems (huginn#3691)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3690)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency selenium-webdriver to v4.46.0 (huginn#3686)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency ruby to v4.0.6 (huginn#3689)

* Update dependency ruby to v4.0.6

* Update bundle for Ruby version

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Pin Erector revision to avoid stale cache

* Lock file maintenance (huginn#3680)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency aws-sdk-s3 to '~> 1', '>= 1.228.1' (huginn#3695)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency vanilla-jsoneditor to v3.13.0 (huginn#3696)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Bump fast-uri from 3.1.3 to 3.1.4

Bumps [fast-uri](https://github.com/fastify/fast-uri) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](fastify/fast-uri@v3.1.3...v3.1.4)

---
updated-dependencies:
- dependency-name: fast-uri
  dependency-version: 3.1.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* Improve Agent type picker search

- Rank name matches ahead of description matches, then by match position.
- Open the type picker automatically on new Agent forms.
- Cover ranking and initial-open behavior with a feature spec.

* Fix pre-opened Agent picker feature specs

- Select Agent types through the shared helper so it closes the picker before capybara-select-2 reopens it.
- Allow the helper to wait for the ACE editor on JavaScriptAgent forms.

* Lock file maintenance (huginn#3693)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Fix duplicate events in RaindropBookmarksAgent

The agent re-emitted the same raindrops on every check due to two
bugs in the dedup memory:

- `memory["since"]` was saved with `Time#iso8601`, which drops
  sub-second precision.  Raindrop's `created` timestamps carry
  milliseconds, so on the next check the latest raindrop compared as
  strictly newer than `since` and was emitted again, forever.
  Save with `iso8601(3)` to keep millisecond precision.
- When a new raindrop shared the exact `created` timestamp of an
  already-seen one, `memory["since_ids"]` was rebuilt from the newly
  emitted items only, dropping the seen ids and re-emitting them on
  the next check.  Seed the latest-timestamp tracking from the stored
  `since`/`since_ids` instead so seen ids are carried over.

The seen check now tests id membership before timestamps, so agents
whose memory already holds a truncated `since` self-heal on the next
check without emitting one more duplicate.  Also drop the `@since_ids`
memoization, which could go stale across runs on a reused instance.

Add regression specs for both scenarios.

* Raise MySQL sort_buffer_size for JSON columns

With NATIVE_JSON_COLUMNS enabled, ORDER BY queries on events include
the JSON payload column in filesort rows, and MySQL 8 fails with "Out
of sort memory" (ER 1038) at the default sort_buffer_size of 256K.
Observed with AgentReceiveJob on a DataOutputAgent under MySQL 8.4.

- Set sort_buffer_size = 4M for the MySQL server bundled in the
  multi-process Docker image.
- Recommend the same in .env.example and the installation manual for
  self-managed MySQL servers.

* Clarify that NATIVE_JSON_COLUMNS is only consulted by migrations [ci skip]

* Improve agent search with type matching

* Update CHANGES.md [ci skip]

* Lock file maintenance (huginn#3706)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency rubocop to v1.89.0 (huginn#3707)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3708)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3712)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Deduplicate queued periodic runs

Add a delayed_job uniqueness key backed by a database unique index so
concurrent enqueue attempts for the same schedule are skipped.  Restrict
the enqueue transaction to keyed jobs so failures in unrelated inline jobs
do not roll back their side effects.  Release keys on permanent failure and
let the scheduler report skipped runs.

* Update minor updated gems to v1.25.0 (huginn#3714)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency esbuild to v0.28.2 (huginn#3717)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update development and test gems to v4.47.0 (huginn#3718)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency aws-sdk-s3 to '~> 1', '>= 1.229.0' (huginn#3716)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Serialize concurrent Agent execution

Use database advisory locks to prevent an Agent's check, receive,
web request, reemit, scheduler, and runner callbacks from overlapping.
Reload Agent state after acquiring the lock and test contention across
separate database connections.

* Update development and test gems to v1.90.0 (huginn#3722)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update minor updated gems to v4.4.0 (huginn#3721)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3720)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Limit manual event propagation to current user

Run manual propagation only for the signed-in user's Agents by invoking propagation through the association scope.  Make Agent.receive! honor Active Record scopes so immediate and scheduled propagation can use the same relation-based API and empty scopes do no work.

* Serialize event propagation scans

Concurrent propagation scans can select the same pending events before either updates receiver cursors, enqueueing duplicate receive jobs.  Use a database advisory lock around event selection, cursor updates, and enqueueing so subsequent scans observe committed progress.

* Propagate events after commit

Defer immediate propagation until the event transaction commits so the propagation lock protects committed cursor updates.  Skip propagation when there are no immediate receivers.

* Update CHANGES.md [ci skip]

* Extract HumanTaskAgent from core

AWS closed Mechanical Turk to new customers on July 30, 2026 and does not
plan to add new features, putting the service on a maintenance-only path.

HumanTaskAgent depends on rturk 2.12.1, released in August 2013 from a branch
that has not changed since October 2013.  It also needs a pinned Erector fork
for current Rails compatibility.

Move the agent and its legacy dependencies to the extracted gem:

https://github.com/huginn/huginn_human_task_agent

Existing users can opt in without keeping these dependencies in Huginn core.
Retain the historical database migration for existing HumanTaskAgent records.

* Update CHANGES.md [ci skip]

* Restore the direct mime-types dependency

Removing rturk also removed mime-types through its rest-client dependency,
but OpenaiSpeechAgent and FileHandling use MIME::Types directly.  Declare the
dependency explicitly instead of relying on an unrelated transitive
dependency.

* Switch mini_racer back to the released gem

0.22.1 includes the Clang 22+ build fix (rubyjs/mini_racer#397).

* Prevent cross-user Service bindings

Require Agent services to be owned by the same user or explicitly global, preventing GHSA-73v6-mq4f-33gw cross-tenant OAuth credential abuse.

Disconnect and disable existing Agents with unauthorized private Service bindings during migration.

* Keep Service fixtures within user boundaries

Give Jane a private Service fixture and use it for Jane-owned Agents so the
ownership validation does not make unrelated specs invalid.

* Update development and test gems to v4.48.0 (huginn#3730)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update patch updated gems (huginn#3729)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Lock file maintenance (huginn#3728)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Akinori Musha <knu@idaemons.org>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: abc@pompel.me <abc@pompel.me>
Co-authored-by: Dominik Sander <git@dsander.de>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Peter Upfold <pgithub@upfold.org.uk>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: tania paiva <taniadaniela1803@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: martadinata666 <2433562+martadinata666@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants