commits
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduce framework-agnostic routing (arod_route), memoization with TTL
(arod_memo), and pure handler functions (arod_handlers). Move tiny_httpd
dependency to separate arod.server library. Simplifies main.ml from ~500
to ~120 lines.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sync opam package metadata including x-maintenance-intent
and external dependency specifications.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename directory httpz/ to httpzo/
- Update package name in dune-project and regenerate opam file
- Rename library and module from Httpz to Httpzo
- Update all internal module references
- Update CLI name, XDG config path, and server identity
- Update README.md package index
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
f42a95f7 Fix sync: pull subtree from local checkout, not remote URL
871a6560 Fork: configure src/ repo to accept pushes to checked-out branch
ceac75e2 Fork: only update sources.toml for true forks (different namespace)
707e9526 Fix SPLIT_COMMIT placeholder replacement in fork
cf6dca0a Fork: derive default push URL from dune-project metadata
1032f0fd Fix fork: prompt for push URL, fix split_commit display truncation
e7691e71 Integrate fork workflow: create src, rm mono, rejoin as subtree
c403cdb9 monopam rejoin
git-subtree-dir: monopam
git-subtree-split: f42a95f72077faea7b668f13c46cbe8e94ffe4e5
83d49ab6 disable jsoo builds for now
git-subtree-dir: ocaml-langdetect
git-subtree-split: 83d49ab6c01b559062361539ca54ddb7c76843ad
f105e906 Fix dune-project URLs to point to upstream repos
c8b987b1 Merge commit '8c19843f614d6665dadddb55791cf938e01b3d43'
4c425954 Update dune-project files
ddb40327 jsonwt: Update homepage to gazagnaire.org fork
c763228f jsonwt: Standardize .ocamlformat
2c922fdb Add untracked directories
c50984c7 ocaml-atp: Apply ocamlformat and disable for generated lexicons
git-subtree-dir: ocaml-jsonwt
git-subtree-split: f105e9065ddf3ed85527cb783e8f1e0f4783008b
af0ee831 disable jsoo builds for now
git-subtree-dir: ocaml-jmap
git-subtree-split: af0ee831f48547f6d021eaff98cf74c02ed5de7e
f28b8b93 disable jsoo builds for now
git-subtree-dir: ocaml-html5rw
git-subtree-split: f28b8b937077279adc8454f45fe82eaa751ab98b
4b0f6299 Port bushel to use typesense library with incremental sync and dryrun
git-subtree-dir: ocaml-bushel
git-subtree-split: 4b0f6299b0097240d6fcbc8091805a4a2118b76c
14d2e0c0 delete manifest
git-subtree-dir: braid
git-subtree-split: 14d2e0c09eed58460dfb4263b8d61835551cc292
Doctor changes:
- Add --quiet flag for cron job usage (only output on issues)
- Add health status computation (Healthy/Warning/Critical)
- Return proper exit codes (0=healthy, 1=warning, 2=critical)
- Add has_issues helper to check if report needs attention
Code tidying:
- doctor.ml: Use Option.value for cleaner URL/Ptime handling
- git.ml: Extract retryable_error_patterns list for readability
- status.ml: Use Option.bind for sources lookup
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rewrite bushel_typesense to use typed Typesense library APIs
- Use Typesense.Field.T.v and Typesense.CollectionSchema.T.v for schemas
- Use Jsont.Json module for document construction
- Add incremental sync that compares with existing documents
- Export existing document IDs from Typesense
- Only create/update changed documents
- Delete documents that no longer exist locally
- Implement proper dryrun mode that reports what would change
- Shows document IDs that would be created/deleted
- Reports counts per collection
- Add sync_stats tracking (created, updated, deleted, unchanged, errors)
- Update bushel_sync.ml to use new Typesense_auth.Client API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move server logic from bin/ to lib/server.ml for library use
- Extract request parsing to lib/request_parse.ml (avoids circular dep)
- Use cmdliner for CLI with proper man pages and help text
- Use magic-mime for MIME type detection instead of hardcoded types
- Add xdge for XDG base directory config file support
- Add tomlt for TOML configuration file parsing
- Config file at ~/.config/httpz/config.toml with:
- port, root, max_content_length, max_header_size, etc.
- CLI flags override config file, config overrides defaults
Binary is now a minimal ~120 line wrapper around the library.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Convert all OxCaml-specific features to standard OCaml:
- Replace unboxed types (int16#, int64#, char#, float#) with regular types
- Convert unboxed records #{...} to regular records {...}
- Remove @ local mode annotations and exclave_ keywords
- Replace incr/decr with Int.incr/Int.decr for Base compatibility
Rewrite server from Jane Street Async to Eio:
- Use Eio.Net for TCP server
- Use Eio.Flow for connection handling
- Use Eio.Switch for resource management
All tests pass. Server supports Range requests, ETag, and If-None-Match.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
060a1cae Update clients to use regenerated Peer_tube module
6d9a13b4 Replace curl with requests library and fix sync pipeline order
fbe57508 Fix JSON feed differences: slugs, PDFs, DOI cache
6b2df6d5 Port full thumbnail logic and show thumbnails in CLI
d898093c wip website
git-subtree-dir: ocaml-bushel
git-subtree-split: 060a1cae8e689b8c600e437c969f7e34e71209a3
50b1018b Pass event-level flags through to bot handlers
b2c5d3a6 Add multi-turn session tracking with silent context accumulation
git-subtree-dir: ocaml-zulip
git-subtree-split: 50b1018bd0ef6ae027decb7dff2b966b598afa51
f35834da Fix quoted empty strings being parsed as null in YAML
git-subtree-dir: ocaml-yamlt
git-subtree-split: f35834da2b17929e30a7251b5efdac693fea5044
d43450d2 Migrate ocaml-typesense to OpenAPI-generated library
git-subtree-dir: ocaml-typesense
git-subtree-split: d43450d210c7f40c242f5fa7247f7c270e180341
31fe302d dead code
a5164358 clean up comparison operator
git-subtree-dir: ocaml-tomlt
git-subtree-split: 31fe302da4642a46361be4ef6b3b347ee820a549
91b087dd poe: fix long prompts
28c662f1 poe: track cross-verse fork activity and de-emphasise metadata in daily updates
0d41ca0d Pass event-level flags through to bot handlers
7a0cf762 poe: fix mentions
57858464 Show active sessions in status command with stats
b80cea64 Add multi-turn session tracking with silent context accumulation
34347a4a Post Claude agent activity to Zulip channel/DM during sessions
41d30ab7 Add per-channel and per-DM session tracking for multi-turn Claude conversations
git-subtree-dir: poe
git-subtree-split: 91b087dd2cc586570f802a9981dd26a737028994
1cb14e65 Update clients to use regenerated Peer_tube module
42c6a22a Add default values, validation, and field-level unions to OpenAPI generator
5c44b743 Complete OpenAPI generator with typed responses and nullable fields
2eae7818 Fix OpenAPI codegen to resolve $ref path parameters
git-subtree-dir: ocaml-peertube
git-subtree-split: 1cb14e6516bed297c31f91e65ac0911027fa8fe2
3799e796 Add default values, validation, and field-level unions to OpenAPI generator
1841cd44 Complete OpenAPI generator with typed responses and nullable fields
7fdcbda9 Fix OpenAPI codegen to resolve $ref path parameters
git-subtree-dir: ocaml-openapi
git-subtree-split: 3799e79679cf44a553938a718259ef94f025748b
4dfd7671 Update clients to use regenerated Peer_tube module
19dcdb2f Add default values, validation, and field-level unions to OpenAPI generator
git-subtree-dir: ocaml-immich
git-subtree-split: 4dfd7671c7a6a7df6f779e512a58284c2da3484b
5d9d79a4 Fix JSON feed differences: slugs, PDFs, DOI cache
git-subtree-dir: ocaml-frontmatter
git-subtree-split: 5d9d79a47a9a2916f6269832d89c0c763c5bec7f
Replace the handwritten Typesense bindings with an OpenAPI-generated
library following the pattern established in ocaml-immich and
ocaml-peertube. This provides full Typesense API v30.0 coverage.
Changes:
- Add typesense-openapi.yaml spec from upstream
- Generate typesense.ml/mli using openapi-gen
- Create typesense.auth library with:
- session.ml: Profile-based API key storage
- client.ml: Wrapper with JSONL batch import/export
- error.ml: Typesense error handling
- cmd.ml: Cmdliner integration for auth commands
- Create typesense-cli with commands for:
- auth: login, logout, status, profile management
- collections: list, get, delete
- documents: get, delete, import, export
- search: full-text search with filters
- health: server health check
- Delete old handwritten library (lib/typesense/)
- Update dune-project with new dependencies
The bushel consumer does not depend on the old typesense library,
so there are no backwards compatibility concerns.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
In decode_any_scalar, quoted scalars that look like null (e.g., "" or
"null") were incorrectly being treated as null values. Only plain
(unquoted) scalars should be resolved as null according to YAML spec.
This fix adds a style check before the is_null_scalar check, ensuring
that quoted empty strings like `default: ""` are correctly parsed as
empty strings rather than null.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename Peertube module references to Peer_tube in client library
- Refactor bushel_peertube to use generated Peer_tube types
- Remove hand-coded JSON codecs in favor of generated ones
- Add helper functions to extract values from Jsont.json for untyped fields
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add default value support: extract JSON defaults and generate OCaml literals
for bools, ints, floats, strings, enums, null, and empty arrays
- Generate constructors with optional params using ?(name=default) syntax
- Generate jsont codecs with ~dec_absent:default for absent field handling
- Add runtime validation for strings (minLength, maxLength, pattern),
numbers (minimum, maximum, exclusiveMinimum, exclusiveMaximum),
and lists (minItems, maxItems, uniqueItems)
- Add field-level union types for primitive oneOf/anyOf schemas
- Handle forward references in circular dependencies with Jsont.json fallback
- Improve topological sort to handle cycles gracefully
- Regenerate immich and peertube clients with new features
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major enhancements to the OpenAPI code generator:
1. allOf composition support:
- Added resolve_schema_ref to look up referenced schemas
- Added flatten_all_of to recursively merge properties from composed schemas
- Added expand_schema to resolve allOf before generating types
- VideoDetails now contains all 50+ fields from Video merged in
2. Property type reference resolution:
- Updated type_of_json_schema to handle allOf with $ref in properties
- Properties like "id: allOf: [$ref: '#/components/schemas/id']" now
resolve to the correct type
3. Nullable field handling:
- Added is_nullable tracking to field_info
- Added nullable combinators to runtime (nullable_any, nullable_string,
nullable_ptime, nullable_int, nullable_float, nullable_bool)
- Fields marked "nullable: true" use these combinators to handle both
absent and explicit JSON null values
4. public_name in generated dune files:
- Libraries are now public by default for proper dependency management
The peertube library now generates fully typed records with proper
accessors for all schemas, including composed types like VideoDetails.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The code generator was ignoring parameters that use $ref references
(e.g., $ref: '#/components/parameters/idOrUUID'). This caused path
template parameters like {id} to not be substituted in the generated
code.
Changes:
- Add param_name_from_ref to extract parameter name from $ref string
- Add resolve_parameter to look up referenced parameters in components
- Update analyze_operation to accept spec and path_item_params
- Merge path_item parameters with operation parameters
- Add explicit type annotation for path_item to fix type inference
The peertube library is regenerated with this fix, so get_video and
similar endpoints now correctly accept their path parameters.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace curl-based HTTP client with ocaml-requests library
- Proper HTTP status code handling (was silently failing on errors)
- Connection pooling and TLS support via Eio
- Change ~proc_mgr parameter to ~http across all sync modules
- Fix PeerTube JSON parsing for nullable fields
- Add nullable_string and nullable_ptime Jsont combinators
- Handle null values in description, originallyPublishedAt, thumbnailPath
- Reorder sync pipeline: images -> thumbs -> faces -> videos -> srcsetter
- Srcsetter now runs last to process all fetched images
- Thumbnails now go to local_source_dir for srcsetter processing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename directory httpz/ to httpzo/
- Update package name in dune-project and regenerate opam file
- Rename library and module from Httpz to Httpzo
- Update all internal module references
- Update CLI name, XDG config path, and server identity
- Update README.md package index
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
f42a95f7 Fix sync: pull subtree from local checkout, not remote URL
871a6560 Fork: configure src/ repo to accept pushes to checked-out branch
ceac75e2 Fork: only update sources.toml for true forks (different namespace)
707e9526 Fix SPLIT_COMMIT placeholder replacement in fork
cf6dca0a Fork: derive default push URL from dune-project metadata
1032f0fd Fix fork: prompt for push URL, fix split_commit display truncation
e7691e71 Integrate fork workflow: create src, rm mono, rejoin as subtree
c403cdb9 monopam rejoin
git-subtree-dir: monopam
git-subtree-split: f42a95f72077faea7b668f13c46cbe8e94ffe4e5
f105e906 Fix dune-project URLs to point to upstream repos
c8b987b1 Merge commit '8c19843f614d6665dadddb55791cf938e01b3d43'
4c425954 Update dune-project files
ddb40327 jsonwt: Update homepage to gazagnaire.org fork
c763228f jsonwt: Standardize .ocamlformat
2c922fdb Add untracked directories
c50984c7 ocaml-atp: Apply ocamlformat and disable for generated lexicons
git-subtree-dir: ocaml-jsonwt
git-subtree-split: f105e9065ddf3ed85527cb783e8f1e0f4783008b
Doctor changes:
- Add --quiet flag for cron job usage (only output on issues)
- Add health status computation (Healthy/Warning/Critical)
- Return proper exit codes (0=healthy, 1=warning, 2=critical)
- Add has_issues helper to check if report needs attention
Code tidying:
- doctor.ml: Use Option.value for cleaner URL/Ptime handling
- git.ml: Extract retryable_error_patterns list for readability
- status.ml: Use Option.bind for sources lookup
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rewrite bushel_typesense to use typed Typesense library APIs
- Use Typesense.Field.T.v and Typesense.CollectionSchema.T.v for schemas
- Use Jsont.Json module for document construction
- Add incremental sync that compares with existing documents
- Export existing document IDs from Typesense
- Only create/update changed documents
- Delete documents that no longer exist locally
- Implement proper dryrun mode that reports what would change
- Shows document IDs that would be created/deleted
- Reports counts per collection
- Add sync_stats tracking (created, updated, deleted, unchanged, errors)
- Update bushel_sync.ml to use new Typesense_auth.Client API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move server logic from bin/ to lib/server.ml for library use
- Extract request parsing to lib/request_parse.ml (avoids circular dep)
- Use cmdliner for CLI with proper man pages and help text
- Use magic-mime for MIME type detection instead of hardcoded types
- Add xdge for XDG base directory config file support
- Add tomlt for TOML configuration file parsing
- Config file at ~/.config/httpz/config.toml with:
- port, root, max_content_length, max_header_size, etc.
- CLI flags override config file, config overrides defaults
Binary is now a minimal ~120 line wrapper around the library.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Convert all OxCaml-specific features to standard OCaml:
- Replace unboxed types (int16#, int64#, char#, float#) with regular types
- Convert unboxed records #{...} to regular records {...}
- Remove @ local mode annotations and exclave_ keywords
- Replace incr/decr with Int.incr/Int.decr for Base compatibility
Rewrite server from Jane Street Async to Eio:
- Use Eio.Net for TCP server
- Use Eio.Flow for connection handling
- Use Eio.Switch for resource management
All tests pass. Server supports Range requests, ETag, and If-None-Match.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
060a1cae Update clients to use regenerated Peer_tube module
6d9a13b4 Replace curl with requests library and fix sync pipeline order
fbe57508 Fix JSON feed differences: slugs, PDFs, DOI cache
6b2df6d5 Port full thumbnail logic and show thumbnails in CLI
d898093c wip website
git-subtree-dir: ocaml-bushel
git-subtree-split: 060a1cae8e689b8c600e437c969f7e34e71209a3
91b087dd poe: fix long prompts
28c662f1 poe: track cross-verse fork activity and de-emphasise metadata in daily updates
0d41ca0d Pass event-level flags through to bot handlers
7a0cf762 poe: fix mentions
57858464 Show active sessions in status command with stats
b80cea64 Add multi-turn session tracking with silent context accumulation
34347a4a Post Claude agent activity to Zulip channel/DM during sessions
41d30ab7 Add per-channel and per-DM session tracking for multi-turn Claude conversations
git-subtree-dir: poe
git-subtree-split: 91b087dd2cc586570f802a9981dd26a737028994
1cb14e65 Update clients to use regenerated Peer_tube module
42c6a22a Add default values, validation, and field-level unions to OpenAPI generator
5c44b743 Complete OpenAPI generator with typed responses and nullable fields
2eae7818 Fix OpenAPI codegen to resolve $ref path parameters
git-subtree-dir: ocaml-peertube
git-subtree-split: 1cb14e6516bed297c31f91e65ac0911027fa8fe2
3799e796 Add default values, validation, and field-level unions to OpenAPI generator
1841cd44 Complete OpenAPI generator with typed responses and nullable fields
7fdcbda9 Fix OpenAPI codegen to resolve $ref path parameters
git-subtree-dir: ocaml-openapi
git-subtree-split: 3799e79679cf44a553938a718259ef94f025748b
Replace the handwritten Typesense bindings with an OpenAPI-generated
library following the pattern established in ocaml-immich and
ocaml-peertube. This provides full Typesense API v30.0 coverage.
Changes:
- Add typesense-openapi.yaml spec from upstream
- Generate typesense.ml/mli using openapi-gen
- Create typesense.auth library with:
- session.ml: Profile-based API key storage
- client.ml: Wrapper with JSONL batch import/export
- error.ml: Typesense error handling
- cmd.ml: Cmdliner integration for auth commands
- Create typesense-cli with commands for:
- auth: login, logout, status, profile management
- collections: list, get, delete
- documents: get, delete, import, export
- search: full-text search with filters
- health: server health check
- Delete old handwritten library (lib/typesense/)
- Update dune-project with new dependencies
The bushel consumer does not depend on the old typesense library,
so there are no backwards compatibility concerns.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
In decode_any_scalar, quoted scalars that look like null (e.g., "" or
"null") were incorrectly being treated as null values. Only plain
(unquoted) scalars should be resolved as null according to YAML spec.
This fix adds a style check before the is_null_scalar check, ensuring
that quoted empty strings like `default: ""` are correctly parsed as
empty strings rather than null.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename Peertube module references to Peer_tube in client library
- Refactor bushel_peertube to use generated Peer_tube types
- Remove hand-coded JSON codecs in favor of generated ones
- Add helper functions to extract values from Jsont.json for untyped fields
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add default value support: extract JSON defaults and generate OCaml literals
for bools, ints, floats, strings, enums, null, and empty arrays
- Generate constructors with optional params using ?(name=default) syntax
- Generate jsont codecs with ~dec_absent:default for absent field handling
- Add runtime validation for strings (minLength, maxLength, pattern),
numbers (minimum, maximum, exclusiveMinimum, exclusiveMaximum),
and lists (minItems, maxItems, uniqueItems)
- Add field-level union types for primitive oneOf/anyOf schemas
- Handle forward references in circular dependencies with Jsont.json fallback
- Improve topological sort to handle cycles gracefully
- Regenerate immich and peertube clients with new features
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Major enhancements to the OpenAPI code generator:
1. allOf composition support:
- Added resolve_schema_ref to look up referenced schemas
- Added flatten_all_of to recursively merge properties from composed schemas
- Added expand_schema to resolve allOf before generating types
- VideoDetails now contains all 50+ fields from Video merged in
2. Property type reference resolution:
- Updated type_of_json_schema to handle allOf with $ref in properties
- Properties like "id: allOf: [$ref: '#/components/schemas/id']" now
resolve to the correct type
3. Nullable field handling:
- Added is_nullable tracking to field_info
- Added nullable combinators to runtime (nullable_any, nullable_string,
nullable_ptime, nullable_int, nullable_float, nullable_bool)
- Fields marked "nullable: true" use these combinators to handle both
absent and explicit JSON null values
4. public_name in generated dune files:
- Libraries are now public by default for proper dependency management
The peertube library now generates fully typed records with proper
accessors for all schemas, including composed types like VideoDetails.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The code generator was ignoring parameters that use $ref references
(e.g., $ref: '#/components/parameters/idOrUUID'). This caused path
template parameters like {id} to not be substituted in the generated
code.
Changes:
- Add param_name_from_ref to extract parameter name from $ref string
- Add resolve_parameter to look up referenced parameters in components
- Update analyze_operation to accept spec and path_item_params
- Merge path_item parameters with operation parameters
- Add explicit type annotation for path_item to fix type inference
The peertube library is regenerated with this fix, so get_video and
similar endpoints now correctly accept their path parameters.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace curl-based HTTP client with ocaml-requests library
- Proper HTTP status code handling (was silently failing on errors)
- Connection pooling and TLS support via Eio
- Change ~proc_mgr parameter to ~http across all sync modules
- Fix PeerTube JSON parsing for nullable fields
- Add nullable_string and nullable_ptime Jsont combinators
- Handle null values in description, originallyPublishedAt, thumbnailPath
- Reorder sync pipeline: images -> thumbs -> faces -> videos -> srcsetter
- Srcsetter now runs last to process all fetched images
- Thumbnails now go to local_source_dir for srcsetter processing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>