Compare commits

..
Author SHA1 Message Date
5578beca25
fix: runs-on
Some checks failed
Test Every Endpoint on Base Sepolia / test_endpoints (push) Failing after 24s
CI/CD Go Verification / build_and_test (push) Successful in 1m42s
2026-09-03 17:19:45 +00:00
dab6fe081f
workflows on ai-main
Some checks failed
Test Every Endpoint on Base Sepolia / test_endpoints (push) Failing after 7s
CI/CD Go Verification / build_and_test (push) Has been cancelled
2026-09-03 17:18:01 +00:00
abd8b73e09
chore: tidy store integration test and deps
- remove tautological SaveTransaction SQL/Params constant checks (const string replay)
- go.mod tidy drops unused go-sqlmock indirect
- testClient/main.go: gofmt alignment
2026-09-03 17:00:45 +00:00
9865f3633c
test(x402): cover Twitter style-profile cost passing and payable boundaries
- add ComputeTwitterStyleProfileCost table and AlwaysProfitable invariant
- add edge cases (case-insensitive, negative, large counts)
- cover MultipleTools and AddPayableTool validation, HTTP 402/MCP boundaries
2026-09-03 17:00:36 +00:00
36c19e8704
refactor(server): split mcp_test into focused suites with fakeStore/fakeOllama
- extract analytics, searchactors, styleprofile, twitter_analytics, validation, storefake from mcp_test
- add fakeStore/fakeOllama harnesses, lastLimit tracking, sql.NullTime staleness
- expand mcp_test with per-platform GetPost/Latest/PostsInTime, actor and cache tests
- touch analytics/backends/cache_version/metrics/server for coverage
2026-09-03 17:00:32 +00:00
5f25956fdd
test(clients): expand coverage for rate-limit, pagination and error paths
- nostr: variants for resolvePubkey/EventID, invalid ID/author checks, relay failure
- bluesky: add FeedGetPosts/getProfile/searchActors mocks, pagination and time-filtering with cursor
- twitter: add RateLimit retry (Reset/Retry-After), exhausted retries, lookup errors, context cancel
- activitypub: fix GetPostsInTimeframe to test 2-page pagination and start/end boundary
2026-09-03 17:00:28 +00:00
08f2d5f562
test: remove tautological stdlib-roundabout tests
Aggressive deletion of tests that only replay stdlib or copy impl:
- config/config_test.go: getEnvBool/splitComma/Load defaults (strings.* wrappers)
- utils/styleProfiles_test.go: ParseEmbedding type-switch
- store/migrate_test.go: extractUpSQL marker parsing
- clustering/kmeans_test.go: IdenticalVectors/SingleItem/DifferentSeeds (trivial)
- ollama/client_test.go: PromptStructure/UsesProvidedModels (setter replay)
2026-09-03 17:00:24 +00:00
2454ef9e62
fix(analytics,x402): fix coverage gaps, engagement drivers, and Twitter cost passing
Analytics review fixes:
- Store Twitter analytics coverage as discrete intervals instead of a single
  contiguous window so disjoint fetch ranges no longer mask inner gaps as
  covered (fetch per uncovered range, add gap regression tests)
- Compute real AvgEngagement/Correlation in getEngagementDrivers instead of
  all-zero placeholders
- Make parseAnalyticsTimeRange surface invalid timestamps, cap merged analytics
  posts at limit, and normalize sentiment by timestamped posts only
- gofmt: fix misalignment in config.go and types.go
- Include Twitter in the default aggregate analytics scope; its API costs are
  passed to the caller through paid tool pricing

x402 cost passing:
- computeTwitterStyleProfileCost now charges base cost ($0.10) + user lookup
  ($0.01) + $0.005 per Twitter post, guaranteeing the charge always clears the
  underlying API cost (never break-even or loss)
- Return a $-prefixed dollar string for the settlement override, fixing the
  previously off-by-factor-100 raw-atomic-unit amount
- Raise getStyleProfile base registration to $0.36 to authorize the max Twitter
  charge
- Add tests for the cost formula, profitable floor, and dollar formatting
2026-09-02 22:44:02 +00:00
2ba8f5cbef
chore: ignore local test-endpoints binaries 2026-09-02 23:50:02 +02:00
2cab149422
test: add coverage-range tests for twitter analytics caching 2026-09-02 23:49:57 +02:00
4c3b8a8a7d
feat: add analytics tools with real engagement, pattern, topic and sentiment computation
Register five payable analytics MCP tools (engagement metrics, posting
patterns, topic modeling, sentiment trends, engagement drivers).

- Thread real post timestamps and engagement metrics through the compute
  functions instead of time.Now()/zero placeholders (enabled by the
  enriched clustering.Item).
- Report the requested author (args.Author) instead of a literal string.
- Implement sentiment shift detection (from/to/magnitude) ordered by time.
- Cache analytics results keyed by scope: a single "all" key for
  cross-platform aggregates and per-platform keys for single-platform
  queries, so aggregate results are not mixed with partial data.
- Use configurable per-tool cache TTLs stored on the Server.

Also cache Twitter post data permanently to avoid repeat paid API calls:
newly fetched posts are persisted, and a coverage watermark (analytics
coverage table) ensures the paid Twitter API is only called for time
ranges not already retrieved.
2026-09-02 23:49:54 +02:00
06c03c1bc0
clustering: enrich Item with timestamp and engagement fields
Carry post metadata (timestamp, likes, reposts, replies, quotes) through
the clustering pipeline so analytics compute functions can use real values
instead of placeholders. The clustering algorithm only consumes Text and
Embedding, so this is backward-compatible.
2026-09-02 23:49:41 +02:00
23b09dec68
config: add per-tool analytics cache TTL settings
Wire configurable cache TTLs for each analytics tool from environment
variables, and provide a helper for parsing duration env vars.
2026-09-02 23:49:38 +02:00
07af712b4d
store: add sqlc queries for analytics cache, posts and coverage 2026-09-02 23:49:35 +02:00
5289a977ce
schema: add analytics cache, posts and coverage tables
Add tables backing the analytics cache, the permanent per-platform post
store, and the coverage watermark used to avoid re-fetching paid Twitter
posts once a time range has already been retrieved.
2026-09-02 23:49:32 +02:00
950214cd60
ci: use env vars for ollama model pulls in test workflow
- Pull Ollama Models step now uses ${EMBEDDING_MODEL} and ${STYLE_MODEL}
- Values sourced from config/models.env in Load model config step

---

- Use $FORGEJO instead of $GITHUB variables
2026-09-02 02:00:59 +02:00
487979c409
config: single source of truth for model names via config/models.env
- config/models.env: EMBEDDING_MODEL and STYLE_MODEL defaults
- config.go: loads models.env by finding project root (go.mod), removes hardcoded defaults
- test-endpoints.yaml: sources config/models.env to set env vars for CI
- Works from any working directory (server, tests, CI)
2026-09-02 01:41:00 +02:00
908d6236bd
config: switch STYLE_MODEL to qwen3:4b-instruct-2507-q4_K_M
- Instruction-tuned variant for reliable prompt following
- Q4_K_M quantization for CPU latency optimization
- Updated test workflow to pull correct model
2026-09-02 01:06:46 +02:00
48dd192ecb
refactor: simplify ticker channel loop 2026-09-02 00:37:55 +02:00
d017a10432
deps: go mod tidy cleanup
- Remove unused indirect dependencies (fsnotify, oapi-codegen, influxdb, graphql-go, etc.)
- Kept: github.com/ethereum/go-ethereum for test client wallet funding
2026-09-02 00:30:37 +02:00
bd574eda3a
test: add clustering KMeans tests and ollama client tests
- clustering/kmeans_test.go: TestKMeans (basic, empty, k>n, identical, single, deterministic, high-dim), TestCosineSimilarity, TestNormalize, TestInitializeKMeansPlusPlus
- ollama/client_test.go: TestEmbedTexts, TestSummarizeStyle (streaming, errors, empty input), TestNew_UsesProvidedModels
- ollama/client.go: early return for empty input in EmbedTexts/SummarizeStyle
2026-09-02 00:30:19 +02:00
fbb97dd689
config: move Ollama model defaults to config package
- config.go: set EMBEDDING_MODEL=qwen3-embedding:0.6b, STYLE_MODEL=qwen3:4b as defaults
- ollama/client.go: remove hardcoded fallback logic, use passed values directly
- Single source of truth for model defaults in config package
2026-09-02 00:09:06 +02:00
424cd0eb8c
db: update embedding dimension to 1024 for qwen3-embedding:0.6b
- Migration 002: VECTOR(768) -> VECTOR(1024) to match qwen3-embedding:0.6b default output
- integration_test.go: update test vector from 768 to 1024 dimensions
2026-09-02 00:00:10 +02:00
53faf09f96
ci: fix test workflow Ollama models to match project defaults
- Pull qwen3-embedding:0.6b and qwen3:4b instead of nomic-embed-text/llama3.1:8b
- Set EMBEDDING_MODEL and STYLE_MODEL env vars for test server
2026-09-01 23:53:09 +02:00
f7c4061c1d
ci: add docker-compose.test.yml for test infrastructure
- PostgreSQL with pgvector for migrations and tests
- Ollama for embedding/style models
- Used by test-endpoints.yaml workflow
2026-09-01 23:47:55 +02:00
c22bf2175f
db: make migrations idempotent, regenerate store, minor cleanup
- schema: add IF NOT EXISTS to CREATE TABLE/INDEX for idempotent migrations
- store: regenerate with sqlc v1.31.1 (adds UserStylePost, interface{} for Embedding)
- webhook: minor formatting cleanup
2026-09-01 23:42:23 +02:00
7e8f5386f3
db: add user_style_posts table for post ID caching
- migration 004: create user_style_posts with user_id, platform, post_id, post_text, created_at
- queries: UpsertStylePosts, DeleteStylePosts (excludes Twitter), GetStylePosts, GetStylePostsByIDs, GetStylePostByID, PruneStylePosts
- activitypub: add ID field to Post struct
- server: fetchProfilePosts checks cache first, upserts on miss; buildStyleProfile deletes non-Twitter posts before rebuild; background pruner runs daily
2026-09-01 23:41:45 +02:00
fd4acabdf3
ollama: fix EmbedTexts signature, add model config, use clustering package
- ollama/client.go: EmbedTexts accepts []clustering.Item, returns [][]float64
- backends.go: ollamaBackend interface uses clustering.Item
- utils/styleProfiles.go: remove duplicate KMeans, normalize, cosineSimilarity
- clustering/: new package with Item, Result types and KMeans
- config.go: add EmbeddingModel, StyleModel env vars
- main.go: pass model config to ollama.New()
- go.mod: add github.com/ethereum/go-ethereum for test client
2026-09-01 23:40:21 +02:00
3b787ac27e
test: add auto-funding to test client and fix CI workflow
- testClient: add ensureFundedWallet() with USDC/ETH balance checks and faucet requests
- fund-wallet.sh: update faucet format for Coinbase CDP API
- start-test-server.sh: use Coinbase facilitator URL, add payment endpoint verification
- test-endpoints.yaml: fund test wallet before server, pass RPC/Faucet URLs to test client
2026-09-01 23:39:14 +02:00
f8efe2f551
Complete Matrix webhook integration and interface{}→any migration
- Add MATRIX_WEBHOOK_URL and MATRIX_SERVER_ID config fields (optional, defaults to hostname)
- Create internal/server/webhook.go: WebhookSender with exponential backoff retry (5 attempts),
  first/last attempt logging, non-blocking goroutine integration
- Wire webhook into OnAfterSettle callback in server.go (goroutine, fire-and-forget)
- Migrate all persistent interface{} to any (Go 1.25.4 convention):
  db.go: ...any in DBTX interface
  models.go: Embedding any
  FindSimilarUsers.sql.go: QueryEmbedding any, Embedding any
  UpsertStyleProfiles.sql.go: Embedding any
- Migrate server.go map[string]interface{} to map[string]any in webhook payload
- Add TestStoreSaveTransaction integration test (skipped without TEST_DATABASE_URL)
- Add TestSettleHook unit test for param mapping
2026-08-31 01:02:55 +02:00
94c6ede6f5
Complete transaction save test suite
- TestSettleHook (internal/server/mcp_test.go): verifies SaveTransactionParams field mapping
  - Tests all 6 params: X402TransactionHash, Amount, Asset, Network, Recipient, Sender
  - Ensures params are settable without panic, critical for legal compliance of x402 flow

- TestStoreSaveTransaction (internal/store/integration_test.go): integration test against real Postgres
  - Exercised SaveTransaction query end-to-end with full param mapping
  - Skipped without TEST_DATABASE_URL (same pattern as TestStoreRoundTrip)
  - Verifies: insert returns ID and CreatedAt, ID is positive, CreatedAt is valid
  - Uses unique transaction hash per test run via time.Now().Unix()

Both tests ensure the critical transaction-saving mechanism is verified at both unit and integration levels, providing regression protection for the legal-compliance x402 payment flow.
2026-08-31 00:01:29 +02:00
2e87c46b2f
Add SaveTransaction SQL and params tests
- TestSaveTransactionSQL: verifies the sqlc-generated SaveTransaction query constant matches the source SQL file
- TestSaveTransactionParams: verifies SaveTransactionParams struct can be constructed with valid and edge-case values (empty hash, empty amount)

Both tests are pure-unit tests that don't require a database connection. They ensure the critical transaction-saving SQL query and its parameter mapping remain consistent, which is important for legal compliance of the x402 payment flow.
2026-08-30 23:56:40 +02:00
51ccc6338c
Add ModelVersion/SchemaVersion/AlgorithmVersion fields to UserStyleProfile and update db.go version
- Add missing ModelVersion, SchemaVersion, AlgorithmVersion fields to UserStyleProfile struct
- Update sqlc version from v1.30.0 to v1.31.1 in db.go and models.go
- Fix any/interface{} type consistency in db.go
2026-08-30 22:42:47 +02:00
25fcaa5de0
Use named parameters in SQL queries to avoid ColumnN naming in sqlc generated structs
- Rewrite GetStyleProfile, FindSimilarUsers, UpsertStyleProfiles SQL queries
  to use @named parameters instead of  positional placeholders
- Regenerate sqlc Go files with meaningful parameter names
- Update server.go and integration test to use new parameter field names
- Fix Similarity int32→float64 type conversion
2026-08-30 22:41:53 +02:00
ffb42070c4
x402: implement dynamic pricing for Twitter getStyleProfile
- Add upto scheme support for dynamic pricing on getStyleProfile
- computeTwitterStyleProfileCost: calculates actual charge based on posts fetched + user lookup
  - User read: /bin/bash.01 (if not cached)
  - Posts read: /bin/bash.005 per post, max 50 posts = /bin/bash.25
  - Minimum: /bin/bash.10
  - Maximum: /bin/bash.26
- handleRESTCall: apply settlement override for upto scheme on getStyleProfile
- GetStyleProfileResponse: local schema type for cost calculation
2026-08-30 18:20:17 +02:00
02e123f7f7
twitter: policy compliance and per-post pricing
- Change base URI from api.twitter.com to api.x.com/2
- Rate limit: honor x-rate-limit-remaining and x-rate-limit-reset headers
- Remove GetActor/SearchActors from Twitter client (policy: prohibits reselling user/profile data)
- Block Twitter from getActor, searchActors, getPost, getLatestPosts, getPostsInTime, getFeed in MCP server
- Allow Twitter for getStyleProfile with exact /bin/bash.10 pricing (minimum across all platforms)
- Remove GetActor/SearchActors from twitterBackend interface
- Update tests for new Twitter restrictions
- Add upto EVM scheme support for future dynamic pricing
2026-08-30 17:44:30 +02:00
7b103ffbe1
refactor: replace interface{} with any
- convert remaining interface{} usages to any in store, utils, bluesky
- consolidate pgvector extension drop into 002 migration
2026-08-30 16:03:03 +02:00
0792180da7
Add observability, post caching, dedup, Bluesky refresh, Twitter backoff, MCP tests
- Per-tool Prometheus-style metrics via /metrics and error logging on failures
- In-memory TTL post cache for getPost/getLatestPosts/getPostsInTime/getFeed
- searchActors dedupes cross-platform duplicates by normalized handle
- Bluesky client refreshes session on auth/expired-token errors (retry once)
- Twitter client backs off on HTTP 429 honoring Retry-After
- MCP tests with fake platform backends (dispatch, caching, dedup, partial/full failure)

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:46:17 +02:00
4f034251a9
fix: searchActors errors only when all platforms fail
Return merged results whenever at least one platform succeeds (even if others errored or
returned empty). Only surface an error when every platform failed, so a caller is never
billed for a search that produced nothing while still getting partial results when available.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:28:14 +02:00
c6058c10cb
fix: payable tools fail fast on server errors instead of degrading
The x402 layer only settles payment when a tool handler succeeds (server.go:604-605
creates a cancellation dispatcher, not a settlement, on handler error / non-2xx). So
returning a real error is what prevents billing a caller for a deliverable they didn't
ask for.

- Revert the Ollama-down graceful degradation in buildStyleProfile: getStyleProfile and
  findSimilarUsers now return an error when embedding/summary generation fails, instead of a
  successful zero-embedding profile.
- searchActors now fails fast: if any platform client errors, the error is surfaced rather
  than silently returning a partial (other-platforms-only) result.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:24:08 +02:00
e9c2296304
test: cover getActor/searchActors clients and migrations
Runnable (HTTP-mocked) unit tests:
- activitypub: GetActor (accounts/lookup) plus id-lookup fallback, and SearchActors
  (accounts/search).
- twitter: GetActor (/users/by/username) and SearchActors (/users/search).
- nostr: SearchActors best-effort path (non-resolvable query returns empty, no network).
- store: extractUpSQL parsing helper.

Store integration test (TestStoreRoundTrip) is gated behind TEST_DATABASE_URL and skipped
when no Postgres+pgvector is available; it runs Migrate and exercises the Upsert/Get/
FindSimilarUsers round-trip against a real database.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:16:39 +02:00
fcdd1fcc46
feat: add getActor and searchActors tools across platforms
Introduce a shared actor.Profile type (internal/actor) so every platform client can return a
common shape without importing the server package (which would be an import cycle).

- Bluesky: GetActor (app.bsky.actor.getProfile) and SearchActors (app.bsky.actor.searchActors) via XRPC.
- ActivityPub: GetActor (accounts/lookup, falling back to accounts/{id}) and SearchActors
  (accounts/search).
- Nostr: GetActor subscribes to kind:0 metadata; SearchActors is best-effort (resolves a
  pubkey/npub query to a single profile; Nostr has no global actor search).
- Twitter: GetActor (/users/by/username) and SearchActors (/users/search).

server: register getActor and searchActors as payable tools; searchActors fans the query out
to all four platforms and merges results, skipping any platform that errors.

Schema fixes: document that getPost.collection is Bluesky-only, and that getFeed.uri is a feed
URI for Bluesky but an author handle for other platforms.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:14:29 +02:00
f845a8bbaa
ops: migrator, enrichment backpressure, ollama fallback, readiness
- Add dependency-free in-process schema migrator (internal/store/migrate.go) that applies
  sql/schema/*.sql in order, tracking versions in schema_migrations. Gated by MIGRATE_ON_START
  and MIGRATIONS_DIR (default sql/schema).
- Fix migration ordering: 002 now creates the 'vector' extension before defining the
  user_style_profiles table (previously the extension was only created later in 003).
- Bound concurrent background enrichment with a 4-slot semaphore so bursts of live
  getStyleProfile calls cannot overwhelm Ollama.
- buildStyleProfile degrades gracefully when Ollama is down: stores a zero embedding and a
  keyword-based fallback summary instead of failing the whole request.
- Add a /readyz side server (READYZ_PORT, default 9090) that checks DB connectivity and
  Ollama availability.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 02:09:50 +02:00
98e8b5acc7
test: cover new cross-platform client methods
Add runnable (HTTP-mocked) unit tests for the client methods added when extending the
post tools to all platforms:

- twitter: GetPost (single-tweet object response + author expansion + public_metrics) and
  GetPostsInTimeframe (start_time/end_time query params + metrics)
- activitypub: GetPostsInTimeframe (paginated Mastodon statuses within a window)
- nostr: resolvePubkey/resolveEventID resolution helpers via real npub/note encoding

Also fix a latent bug in internal/nostr: resolvePubkey/resolveEventID wrapped the wrong
error variable (the nip19 error instead of the hex-decode error) when the 64-hex fallback
failed, producing misleading messages.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 01:44:39 +02:00
ec0cd2e83a
feat: extend post tools (getPost, getLatestPosts, getPostsInTime, getFeed) to all platforms
Previously these tools were Bluesky-only. They now dispatch by platform:

- getPost: Bluesky uses actor+collection+rkey; ActivityPub uses GetPost(statusID);
  Nostr uses GetPost(noteID); Twitter uses GetPost(tweetID)
- getLatestPosts / getPostsInTime: delegate to each platform client
- getFeed: Bluesky uses GetFeed; other platforms treat the URI as an author handle and
  return their latest posts (no custom-feed concept elsewhere)

Client additions:
- twitter: GetPost, GetPostsInTimeframe; Post now carries like/repost/quote/reply
  counts from public_metrics (populated in GetLatestNPosts and GetPostsInTimeframe)
- nostr: GetPost, GetPostsInTimeframe (relay queries with Since/Until); resolveEventID
  helper mirroring resolvePubkey

Server gains normalized mapping/dispatch helpers (bskyPostViewToResponse,
apPostToResponse, nostrPostToResponse, twitterPostToResponse, fetchSinglePost,
fetchLatestPosts, fetchPostsInTime, fetchFeed) that return a uniform
GetPostResponsePost, mapping missing engagement counts to 0.

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 01:41:14 +02:00
fc843023fe
test: add unit tests for pure helpers and HTTP clients
Add runnable unit tests (no external services required):

- internal/utils: FormatVector/ParseEmbedding (all type branches + round-trip),
  AverageVector, TopWords (min-length + stopword filtering + ranking)
- internal/config: getEnvBool, splitComma, Load defaults/override
- internal/server: determinePlatform (did/npub/@-handle/64-hex/dotted) and
  platformFromString
- internal/twitter: mocked Twitter API v2 (empty-token error, fetch+parse,
  max_results clamping, non-200 error)
- internal/activitypub: mocked Mastodon API (constructor validation,
  GetLatestNPosts, GetPost, non-200 error)

Not covered (require live services / heavy mocking): store sqlc queries +
pgvector migrations (need Postgres), nostr client (needs a relay), ollama
client (wraps the ollama/go API over HTTP), and server orchestration
(requestStyleProfile, enrichCrossPlatform, fetchProfilePosts, getSimilarProfiles
need a DB + platform clients).

Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>
2026-08-29 01:33:42 +02:00
4d31e12242
add: findSimilarUsers payable tool (pgvector similarity search)
- register findSimilarUsers (price 0.05) which reuses requestStyleProfile to get the source
  persona embedding, encodes it with utils.FormatVector, and queries the existing (previously
  unused) FindSimilarUsers pgvector query for ranked cross-platform matches; self excluded
- add FindSimilarUsersRequest/Response/SimilarUser types and an OutputSchema for the tool
- fix generated store: FindSimilarUsersRow.Similarity int32 -> float64 (SQL returns
  1 - (embedding <=> $1::vector), a float8; scanning into int32 would error)
2026-08-29 01:26:41 +02:00
def05e5697
add: background cross-platform enrichment on profile request
- refactor requestStyleProfile into a shared requestStyleProfileForced core (resolve -> cache
  check -> build) so a specific platform can be targeted regardless of identifier format
- on a live getStyleProfile request, fire-and-forget enrichCrossPlatform: bounded fan-out
  (<=3 goroutines) tries the same identifier on every other platform, logs/skips mismatches,
  and still obeys the 1-week update gate; uses a detached context (context.WithoutCancel +
  5m timeout) so it outlives the request
- trigger only on live tool calls (not the prewarmer) and gated by ENRICH_CROSS_PLATFORM
  (default true)
- add platformFromString helper
2026-08-29 01:26:08 +02:00
18ad654ce0
add: multi-platform getStyleProfile with slow, discovery-based prewarmer
- Nostr client (fiatjaf.com/nostr) fetching kind:1 notes from relays
- Twitter client using raw Twitter API v2 (no external X library), optional (no token = lazy error)
- getStyleProfile dispatches by platform; a profile is updated only when a request is
  made and the cached profile is older than a week (served from cache otherwise)
- shared requestStyleProfile path used by both the tool and the prewarmer
- StartPrewarm discovers interesting authors (from a feed URI or seed list) and
  pre-fetches at most one profile per minute; fresh profiles are never re-embedded
2026-08-29 01:07:47 +02:00
2cb1682b13
add: make getStyleProfile work (embeddings, platform gating, pgvector extension) 2026-08-29 00:32:50 +02:00
52ac01ecaa
fix: long standing typo
All checks were successful
CI/CD Go Verification / build_and_test (push) Successful in 1m44s
2026-08-03 13:23:52 +00:00
2ae53d8dc5
add: supported network config option
update: align testClient with x402-v2
2026-08-03 12:40:04 +00:00
9359b79f36
add: global logging 2026-08-03 11:08:53 +00:00
7a434dc53a
revert label
Some checks failed
CI/CD Go Verification / build_and_test (push) Failing after 1s
2026-08-02 00:53:31 +00:00
5745c09cd6
update runner label
Some checks failed
CI/CD Go Verification / build_and_test (push) Failing after 1s
2026-08-02 00:49:54 +00:00
12f4c635a7
Merge pull request 'task/migrate-x402-v2' (#1) from task/migrate-x402-v2 into main
All checks were successful
CI/CD Go Verification / build_and_test (push) Successful in 3m25s
Reviewed-on: #1
2026-07-30 08:13:05 +00:00
252eede995
add x402 unit test
All checks were successful
CI/CD Go Verification / build_and_test (pull_request) Successful in 59s
add test workflow
2026-07-30 06:45:26 +00:00
e0aeb8521a
critical: fix infinite recursion 2026-07-29 22:09:32 +00:00
779ddf981f
Remove obsolete types 2026-07-29 22:09:31 +00:00
d5b16cba3a
rewrite wrapper
migrate server from v1 to v2
2026-07-29 22:09:27 +00:00
9b33e9b7bb
Migrate internal x402 wrapper 2026-07-29 22:09:12 +00:00
3716462cb8
migrate middlewares 2026-07-29 22:09:01 +00:00
923d605916
feat: add activitypub 2026-07-18 22:42:44 +00:00

Diff content is not available