* chore(ci): bump github-automation-template to v1.1.15
Writers-only auto-Claude, least-privilege tokens for Claude on fork PRs and
in the merge-gate assessor, merge-gate held-out BLOCKs (no repeat verdicts on
an unchanged HEAD), portable prompts. auto-pr-comment sweep moves to hourly so
stale FINAL reviews are re-posted once a push settles.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
* fix: sync automation.meta.json hubRef to v1.1.15
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
* feat: add Keenable keyless web search tool
Keenable is a web-search service (api.keenable.ai). Per AGENTS.md routing,
vendor search services belong in PraisonAI-Tools as standalone tool modules
(mirroring tavily_tool.py / brave_search_tool.py), not inline in the core
praisonaiagents web_search.py aggregator.
Keyless by default via the public endpoint (stdlib urllib, no install);
KEENABLE_API_KEY switches to the authenticated endpoint for higher limits.
Redirects are refused so X-API-Key is never resent to another host; results
are bounded (50 max, 1 MB body cap, title/URL/snippet length caps).
Auto-discovered by praisonai_tools.tools (no manual registration). 13 unit
tests cover endpoint selection, result mapping/bounds, and error handling.
Relates to MervinPraison/PraisonAI#5671
Co-authored-by: Mervin Praison <[email protected]>
* test: cover Keenable redirect refusal and bound limits
Address Greptile P2: the protective limits had no focused coverage and
build_opener was fully mocked, so _NoRedirect, the result cap, the
oversized title/url/snippet caps, and the response read limit could be
removed with the suite staying green.
- Lift _NoRedirect to module level so the redirect refusal is importable
and unit-testable (was a closure inside search()).
- _FakeResponse.read now honours the requested byte count, so the
oversized-response test exercises the actual read cap.
- Add TestProtections: result-count cap in the request body, title and
snippet truncation, oversized-URL skip, read-limit enforcement, and
_NoRedirect dropping a 302 (no follow-up request).
- Add the missing __init__ docstring.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
---------
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Mervin Praison <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
Add empty scripts/__init__.py so scripts/tests/test_mdx_escaping.py
resolves as a unique module (scripts.tests.test_mdx_escaping) instead
of colliding with tests/test_mdx_escaping.py. This lets the root and
comprehensive suites be collected together in CI without the pytest
"import file mismatch" error (issue Fix 4).
Both suites pass together: 7 + 24 = 31 passed.
Co-authored-by: Mervin Praison <[email protected]>
CI installs dev dependencies for pytest; Notion tests patch httpx.AsyncClient
and fail when httpx is not installed alongside httpx2 from openai.
Co-authored-by: Cursor <[email protected]>
- pyproject: [stripe] extra installs requests (the actual runtime dep) instead
of the unused stripe SDK, matching sibling requests-based tools (swarmscore)
- catalogue: map stripe_tool -> ('stripe',) in _MODULE_EXTRAS so discovery
reports the correct install extra
- stripe_tool: reject non-2xx responses lacking Stripe's error object instead
of treating decoded JSON as success
- tests: give mock responses a real status_code; add non-2xx failure test
- Reject non-HTTPS FIREFLIES_API_URL so the API key never leaves over plaintext
- Return a distinct error for generic HTTP failures (e.g. 5xx) instead of
normalizing an error body into an empty/missing result
- Parse GraphQL 429 payloads for extensions.metadata.retryAfter when the
Retry-After header is absent
- Clamp limit to Fireflies' 1..50 page-size bound in list/search
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Update the agent-facing description so post_comment/submit_post are
discoverable, addressing Greptile review feedback on PR #96.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Fetch pull/N/head for all PRs and block origin push on read-only forks so
claude-code-action does not fail with "couldn't find remote ref" on upstream.
Co-authored-by: Cursor <[email protected]>
Add REDDIT_ALLOW_WRITE-gated post_comment and submit_post actions to
RedditTool, a compliant default User-Agent referencing the app id, and
unit tests covering import, schema generation, write-flag gating, and
mocked write flows.
Co-authored-by: Mervin Praison <[email protected]>
Adds a narrow, audited StripeTool following existing tool patterns
(lazy optional requests import, clear errors). Covers Phase 1 reads
(get_customer, get_payment_intent, list_payment_links) and a Phase 2
guarded write (create_payment_link) requiring a correlation_id and
supporting an optional Idempotency-Key. Includes test/live key prefix
detection with a mode banner, audit-only logging (no payloads), the
[stripe] pyproject extra, .env.example, and unit tests.
Co-authored-by: Mervin Praison <[email protected]>
Switch merge-gate, review chain, CI failure, and pipeline workflows to thin
hub callers; keep local claude.yml for tools-specific prompts. Remove
redundant auto-issue-comment.yml — claude.yml now handles issues opened
with the claude label already present.
Co-authored-by: Cursor <[email protected]>
Address reviewer findings on PR #92:
- index_meeting now accepts optional segments and maps each chunk to the
covering segment start/end times instead of hardcoding 0.0 (Greptile/CodeRabbit)
- embed before delete so a failed re-index never wipes prior searchable vectors
- search_meetings uses bounded 1/(1+distance) score for Chroma squared-L2 space
- raise openai floor to >=1.12.0 (timestamp_granularities support)
- use contextlib.closing for SQLite connections (leak-safe on error)
- strengthen registration test to detect shadowed exports
- add tests: segment->timestamp mapping, failed-reindex preservation, bounded score
Co-authored-by: Mervin Praison <[email protected]>
Generator looked for docs.json at repo root; PraisonAIDocs uses
docs/docs.json so nav was never updated after auto-gen. Also run
sync_sdk_reference_nav.py after generation as a safety net.