Skip to content

fix: surface registry and entry-point tools in tools list#2476

Merged
MervinPraison merged 3 commits into
mainfrom
claude/issue-2474-20260630-0846
Jun 30, 2026
Merged

fix: surface registry and entry-point tools in tools list#2476
MervinPraison merged 3 commits into
mainfrom
claude/issue-2474-20260630-0846

Conversation

@praisonai-triage-agent

@praisonai-triage-agent praisonai-triage-agent Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Fixes #2474

Summary

praisonai tools list (and the discovery shared with tools validate/tools info) previously enumerated only three of the resolver's sources — local tools.py, praisonaiagents.tools.TOOL_MAPPINGS, and the curated praisonai-tools package. Tools registered in the wrapper ToolRegistry or the core SDK registry (entry-point plugins / runtime-registered tools) resolved at run time but were invisible to discovery. Discovery now matches resolution.

Changes

  • tool_resolver.pyToolResolver.list_available() now also enumerates:
    • the wrapper ToolRegistry (list_functions()), labelled Registered tool (wrapper registry)
    • the core SDK registry (get_registry().list_tools()), triggering idempotent discover_plugins() to mirror the resolution path, labelled Registered/entry-point tool
    • Higher-precedence sources are not overridden (local tools win).
  • cli/commands/tools.pytools list gains a registered source category/filter and count; tools info reports the registry source.
  • Added regression tests asserting a wrapper-registry tool and a core-registry tool appear in list_available() and resolve at run time.

Test plan

  • tests/unit/test_tool_registry.py (13 passed, including 2 new regression tests)
  • Smoke test confirming both wrapper- and core-registry tools surface in list_available() with correct source attribution

Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • The tools list now includes a new Registered source category, making it easier to identify tools added through registry-based discovery.
    • Tool details now show a clearer label for registered/entry-point tools.
  • Bug Fixes

    • Tool discovery now surfaces more available tools in the CLI, including registry-based and other discovered tools, with safer handling if discovery fails.

ToolResolver.list_available() previously enumerated only local tools.py,
TOOL_MAPPINGS, and praisonai-tools, while the resolution chain also reached
the wrapper ToolRegistry and the core SDK tool registry (entry-point plugins
and runtime-registered tools). This made some resolvable tools invisible to
`praisonai tools list`/`validate`/`info`. Discovery now matches resolution by
also querying the wrapper registry and the core registry (triggering
idempotent entry-point discovery), with source attribution in the CLI output.

Co-authored-by: MervinPraison <MervinPraison@users.noreply.github.com>
@MervinPraison

Copy link
Copy Markdown
Owner

@coderabbitai review

@MervinPraison

Copy link
Copy Markdown
Owner

/review

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@greptile-apps

greptile-apps Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR makes tool discovery include registered tools.

  • Adds registry and entry-point tools to resolver discovery.
  • Adds source metadata for discovered tools.
  • Updates tools list and tools info to use source metadata.
  • Adds tests for registered tools and source attribution.

Confidence Score: 4/5

This is close, but the custom-source discovery path should be fixed before merging.

  • Default resolver discovery now matches the registered-tool paths better.
  • CLI source attribution no longer depends on docstring text.
  • Custom-source resolvers can still list tools outside their resolution chain.

src/praisonai/praisonai/tool_resolver.py

Important Files Changed

Filename Overview
src/praisonai/praisonai/tool_resolver.py Adds shared discovery with source metadata, but custom-source discovery can still include tools that resolve() will not return.
src/praisonai/praisonai/cli/commands/tools.py Updates tool listing and info output to use resolver-provided source metadata.
src/praisonai/tests/unit/test_tool_registry.py Adds tests for registered tool discovery and source attribution.

Reviews (3): Last reviewed commit: "fix: align tool discovery source attribu..." | Re-trigger Greptile

Comment thread src/praisonai/praisonai/tool_resolver.py Outdated
Comment thread src/praisonai/praisonai/cli/commands/tools.py Outdated
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 42f4a2d3-24e2-4b55-aae4-6993e695a51e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

ToolResolver.list_available() gains two new discovery steps that query the wrapper ToolRegistry and the core praisonaiagents registry (with plugin discovery). The tools list CLI adds a registered source filter, categorization, table label, and summary count; tools info adds a matching display branch.

Changes

Registered Tool Discovery

Layer / File(s) Summary
ToolResolver registry discovery
src/praisonai/praisonai/tool_resolver.py
After existing sources, list_available() now queries self._registry.list_functions() and praisonaiagents.tools.registry.get_registry() (triggering discover_plugins()), merging new names without overriding higher-precedence sources. Both steps are try/except guarded.
CLI registered source category
src/praisonai/praisonai/cli/commands/tools.py
tools list adds registered to --source help, a registered_tools collection, categorization logic, filter branch, table source label, and summary count. tools info adds a "Registered/entry-point tool (registry)" display branch.
Regression tests
src/praisonai/tests/unit/test_tool_registry.py
New TestListAvailableSurfacesRegistry class tests that wrapper-registered and core-registry tools appear in list_available() and can be resolved, with core registry cleanup in finally.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • MervinPraison/PraisonAI#1448: Introduced the per-instance ToolRegistry and refactored tool registration, which this PR now surfaces in list_available().
  • MervinPraison/PraisonAI#1708: Previously modified ToolResolver.list_available() and resolution logic for praisonai_tools, the same aggregation point extended here.
  • MervinPraison/PraisonAI#2059: Refactored resolve_tools() to delegate through ToolResolver, related to the same wrapper/core registry integration being extended here.

Suggested labels

pipeline/awaiting-merge-gate

Suggested reviewers

  • MervinPraison

🐇 The registry hid its tools away,
But now they hop into the light of day!
list_available hops the fence,
Entry-points make perfect sense.
No tool left behind, hooray! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main change to tool listing coverage.
Linked Issues check ✅ Passed The PR adds registry and entry-point tools to list_available, updates CLI source attribution, and includes regression tests as requested.
Out of Scope Changes check ✅ Passed The changes stay focused on tool discovery, CLI presentation, and tests with no clear unrelated additions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/issue-2474-20260630-0846

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@MervinPraison

Copy link
Copy Markdown
Owner

@copilot Do a thorough review of this PR. Read ALL existing reviewer comments above from Qodo, Coderabbit, and Gemini first — incorporate their findings.

Review areas:

  1. Bloat check: Are changes minimal and focused? Any unnecessary code or scope creep?
  2. Security: Any hardcoded secrets, unsafe eval/exec, missing input validation?
  3. Performance: Any module-level heavy imports? Hot-path regressions?
  4. Tests: Are tests included? Do they cover the changes adequately?
  5. Backward compat: Any public API changes without deprecation?
  6. Code quality: DRY violations, naming conventions, error handling?
  7. Address reviewer feedback: If Qodo, Coderabbit, or Gemini flagged valid issues, include them in your review
  8. Suggest specific improvements with code examples where possible

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/praisonai/praisonai/tool_resolver.py`:
- Around line 572-601: The discovery order in list_available() does not match
the resolution precedence used by default_sources/resolve(), so
wrapper-registered tools can be mislabeled as built-in or external tools. Update
the tool discovery flow in tool_resolver.py so the wrapper ToolRegistry lookup
runs before the praisonaiagents/praisonai-tools mapping blocks, ensuring names
added from self._registry and get_registry() win first and source attribution
matches runtime resolution. Keep the existing duplicate-check behavior, but make
the wrapper registry the earlier source in the same precedence chain as
resolve().
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cf51b018-6a5f-4f57-a17b-ff93a34e783c

📥 Commits

Reviewing files that changed from the base of the PR and between 3a5ea0a and b886659.

📒 Files selected for processing (3)
  • src/praisonai/praisonai/cli/commands/tools.py
  • src/praisonai/praisonai/tool_resolver.py
  • src/praisonai/tests/unit/test_tool_registry.py

Comment on lines +572 to +601

# 4. Add tools registered in the wrapper ToolRegistry (register_function API)
if self._registry is not None:
try:
names = self._registry.list_functions()
except Exception:
names = []
for name in names:
if name not in available:
available[name] = "Registered tool (wrapper registry)"

# 5. Add tools from the core SDK tool registry (entry-point plugins and
# runtime-registered tools). These resolve at run time via the resolution
# chain, so discovery must surface them too. Mirror the resolution path by
# triggering entry-point discovery (idempotent) before listing.
try:
from praisonaiagents.tools.registry import get_registry
reg = get_registry()
try:
reg.discover_plugins()
except Exception:
pass
for name in reg.list_tools():
if name not in available:
available[name] = "Registered/entry-point tool"
except ImportError:
pass
except Exception as e:
logger.debug(f"Error listing tools from core registry: {e}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Discovery ordering diverges from resolution precedence, so source attribution can be wrong.

The resolution chain (default_sources) orders wrapper-registry before praisonaiagents/praisonai-tools, but list_available() adds the wrapper registry (step 4) after the built-in (step 2) and external (step 3) sources. For a name present in both the wrapper registry and TOOL_MAPPINGS, step 2 wins the if name not in available race, so the tool is labeled "Built-in tool from praisonaiagents" — yet resolve() returns the wrapper-registry callable. tools info will then report the wrong source, contradicting the PR goal that discovery/info agree with runtime resolution.

Consider moving the wrapper-registry discovery block ahead of the praisonaiagents/praisonai-tools blocks to mirror resolution precedence.

🧰 Tools
🪛 Ruff (0.15.20)

[warning] 577-577: Do not catch blind exception: Exception

(BLE001)


[error] 592-593: try-except-pass detected, consider logging the exception

(S110)


[warning] 592-592: Do not catch blind exception: Exception

(BLE001)


[warning] 599-599: Do not catch blind exception: Exception

(BLE001)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/praisonai/praisonai/tool_resolver.py` around lines 572 - 601, The
discovery order in list_available() does not match the resolution precedence
used by default_sources/resolve(), so wrapper-registered tools can be mislabeled
as built-in or external tools. Update the tool discovery flow in
tool_resolver.py so the wrapper ToolRegistry lookup runs before the
praisonaiagents/praisonai-tools mapping blocks, ensuring names added from
self._registry and get_registry() win first and source attribution matches
runtime resolution. Keep the existing duplicate-check behavior, but make the
wrapper registry the earlier source in the same precedence chain as resolve().

@MervinPraison

Copy link
Copy Markdown
Owner

@claude You are the FINAL architecture reviewer. If the branch is under MervinPraison/PraisonAI (not a fork), you are able to make modifications to this branch and push directly. SCOPE: Focus ONLY on Python packages (praisonaiagents, praisonai). Do NOT modify praisonai-rust or praisonai-ts. Read ALL comments above from Gemini, Qodo, CodeRabbit, and Copilot carefully before responding.

Phase 1: Review per AGENTS.md

  1. Protocol-driven: check heavy implementations vs core SDK
  2. Backward compatible: ensure zero feature regressions
  3. Performance: no hot-path regressions
  4. SDK value: review in depth whether the change genuinely adds value to the SDK — never add features for the sake of adding them. It must strengthen the SDK (simpler, more user-friendly, robust, world-class, secure). If it does not clearly add value, request changes or recommend rejecting/closing rather than merging scope creep
  5. Do not bloat the Agent class with additional params — only if absolutely required; we already support many params.

Phase 2: FIX Valid Issues
5. For any VALID bugs or architectural flaws found by Gemini, CodeRabbit, Qodo, Copilot, or any other reviewer: implement the fix
6. Push all code fixes directly to THIS branch (do NOT create a new PR)
7. Comment a summary of exact files modified and what you skipped

Phase 3: Final Verdict
8. If all issues are resolved, approve the PR / close the Issue
9. If blocking issues remain, request changes / leave clear action items

@MervinPraison MervinPraison added pipeline/awaiting-merge-gate FINAL done; waiting for merge gate / CI pipeline/blocked:cooldown Blocked: post-push or @claude cooldown and removed pipeline/final-claude-pending Reviews done; waiting for FINAL @claude pipeline/blocked:no-final Blocked: no FINAL @claude trigger yet labels Jun 30, 2026
@praisonai-triage-agent

praisonai-triage-agent Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

Claude finished @MervinPraison's task —— View job


Final Architecture Review — PR #2476 ✅ Approved (with fixes pushed)

  • Read AGENTS.md & guidelines
  • Read changed files (tool_resolver.py, tools.py, tests)
  • Analyze reviewer feedback (Greptile, CodeRabbit, Copilot, Qodo)
  • Phase 1: Architecture review per AGENTS.md
  • Phase 2: Fix valid issues
  • Phase 3: Test & final verdict

Phase 1 — Architecture review

Criterion Verdict
Protocol-driven (core vs wrapper) ✅ Correctly routed. Discovery lives in the wrapper (praisonai/tool_resolver.py + CLI). Core SDK registry is only queried, not modified.
Backward compatible list_available() keeps its Dict[str, str] (name→description) contract; public list_available_tools() unchanged. New list_available_sources() is purely additive.
Performance ✅ No hot-path regression. Discovery is a CLI/diagnostic path; discover_plugins() is idempotent. resolve() untouched.
SDK value ✅ Genuine value — tools list/info/validate now agree with runtime resolution. No scope creep, no new Agent params.

Phase 2 — Valid issues found & fixed

I confirmed and fixed three valid issues raised by reviewers:

  1. Discovery ordering ≠ resolution precedence (CodeRabbit 🟡 / Greptile P1) — list_available() listed the wrapper registry after built-in/external, so a name in both wrapper-registry and TOOL_MAPPINGS was mislabeled builtin even though resolve() returns the wrapper callable. Fix: reordered discovery to mirror default_sources() precedence (local → wrapper-registry → builtin → external → core-registry).

  2. Docstrings becoming source tags (Greptile P2) — the CLI bucketed tools via substring matching on the description (e.g. a local tool documented "Registered user handler" landed in the registered bucket). Fix: added ToolResolver.list_available_sources() returning a stable source id (local/builtin/external/registered); CLI list and info now use it instead of fragile string matching.

  3. Custom source chains advertising unresolvable tools (Greptile P1) — a resolver built with sources=[...] excluding the core registry still listed core/entry-point tools it couldn't resolve. Fix: default-chain sources are only enumerated when the resolver uses the default chain (_uses_default_sources); the wrapper registry is still always listed since it's passed independently.

Files modified:

  • src/praisonai/praisonai/tool_resolver.py — reordered discovery into _discover_available(), added list_available_sources(), custom-chain guard.
  • src/praisonai/praisonai/cli/commands/tools.pylist & info use authoritative source map.
  • src/praisonai/tests/unit/test_tool_registry.py — +3 regression tests (precedence attribution, docstring isolation, custom-source isolation).

Skipped: Ruff BLE001/S110 lint nits on the broad except Exception guards — intentional defensive handling consistent with the surrounding file's style; not behavioral bugs.

Phase 3 — Tests

tests/unit/test_tool_registry.py … 16 passed (13 original + 3 new)
list_available / list_available_sources keys match (134 tools) — public API intact
Smoke: wrapper 'internet_search' wins over builtin in both attribution & resolution
Smoke: ToolResolver(sources=[]) advertises nothing

Verdict: ✅ Approve — all valid reviewer issues resolved, backward compatible, no SDK bloat. (I cannot formally approve via GitHub for security reasons, but I recommend merge.)

Job run · branch claude/issue-2474-20260630-0846

- Reorder list_available() discovery to match resolve()/default_sources
  precedence (wrapper registry before built-in/external), so a name present
  in multiple sources is attributed to the source resolve() actually returns.
- Add ToolResolver.list_available_sources() returning canonical source ids;
  CLI now uses it instead of fragile substring matching on descriptions, so
  a local tool whose docstring contains "Registered" is no longer mis-bucketed.
- Do not advertise default-chain tools (built-in/external/core registry) when
  the resolver is built with a custom sources= chain it cannot resolve.
- Add regression tests for precedence attribution, docstring isolation, and
  custom-source isolation.

Co-authored-by: Mervin Praison <MervinPraison@users.noreply.github.com>
@MervinPraison

Copy link
Copy Markdown
Owner

@claude You are the FINAL architecture reviewer. If the branch is under MervinPraison/PraisonAI (not a fork), you are able to make modifications to this branch and push directly. SCOPE: Focus ONLY on Python packages (praisonaiagents, praisonai). Do NOT modify praisonai-rust or praisonai-ts. Read ALL comments above from Gemini, Qodo, CodeRabbit, and Copilot carefully before responding.

Phase 1: Review per AGENTS.md

  1. Protocol-driven: check heavy implementations vs core SDK
  2. Backward compatible: ensure zero feature regressions
  3. Performance: no hot-path regressions
  4. SDK value: review in depth whether the change genuinely adds value to the SDK — never add features for the sake of adding them. It must strengthen the SDK (simpler, more user-friendly, robust, world-class, secure). If it does not clearly add value, request changes or recommend rejecting/closing rather than merging scope creep
  5. Do not bloat the Agent class with additional params — only if absolutely required; we already support many params.

Phase 2: FIX Valid Issues
5. For any VALID bugs or architectural flaws found by Gemini, CodeRabbit, Qodo, Copilot, or any other reviewer: implement the fix
6. Push all code fixes directly to THIS branch (do NOT create a new PR)
7. Comment a summary of exact files modified and what you skipped

Phase 3: Final Verdict
8. If all issues are resolved, approve the PR / close the Issue
9. If blocking issues remain, request changes / leave clear action items

@praisonai-triage-agent

praisonai-triage-agent Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor Author

Claude finished @MervinPraison's task —— View job


Final Architecture Review — PR #2476 ✅ Approve (no new fixes needed)

  • Read AGENTS.md & guidelines
  • Read changed files & verify previous fixes are present
  • Phase 1: Architecture review per AGENTS.md
  • Phase 2: Verify reviewer issues are resolved
  • Phase 3: Run tests & final verdict

Phase 1 — Architecture review

Criterion Verdict
Protocol-driven (core vs wrapper) ✅ Discovery lives entirely in the wrapper (praisonai/tool_resolver.py + CLI). The core SDK registry is only queried (get_registry().list_tools() / idempotent discover_plugins()), never modified. Correct routing.
Backward compatible list_available() keeps its Dict[str,str] (name→description) contract. New list_available_sources() is purely additive. No public signature changes.
Performance ✅ No hot-path regression — discovery is a CLI/diagnostic path; resolve() is untouched. discover_plugins() is idempotent.
SDK value ✅ Genuine value: tools list/info/validate now agree with runtime resolution. No scope creep. Zero new Agent paramsagent.py not touched.

Phase 2 — Reviewer issues (all already resolved in commit 97ef4516)

I verified each flagged issue against the current branch HEAD — all three are fixed; no further code changes required:

  1. Discovery ordering ≠ resolution precedence (CodeRabbit 🟡 / Greptile P1) — ✅ Fixed. _discover_available() now walks sources in true precedence order: local → wrapper-registry → builtin → external → core-registry (tool_resolver.py:561-651). Wrapper-registry names now win attribution over TOOL_MAPPINGS, matching resolve().

  2. Docstrings becoming source tags (Greptile P2) — ✅ Fixed. Added list_available_sources() (tool_resolver.py:546-559) returning a stable source id (local/builtin/external/registered). CLI list and info bucket via this authoritative map, not substring matching on descriptions (tools.py:40,58-59,81).

  3. Custom source chains advertising unresolvable tools (Greptile P1) — ✅ Fixed. The default built-in/external/core-registry sources are enumerated only when _uses_default_sources is True (tool_resolver.py:606-607); the wrapper registry is still always listed since it's passed independently.

Lint nits intentionally skipped: Ruff BLE001 / S110 on the broad except Exception guards around registry discovery — these are deliberate defensive boundaries (a failing optional registry must not break tools list), consistent with the surrounding file style. Not behavioral bugs.

Phase 3 — Tests

tests/unit/test_tool_registry.py … 16 passed in 0.24s
  ├─ TestListAvailableSurfacesRegistry (wrapper + core registry surface)
  └─ TestListAvailableSourceAttribution
       ├─ test_source_matches_resolution_precedence   ✅
       ├─ test_local_docstring_does_not_change_source  ✅
       └─ test_custom_sources_do_not_advertise_default_registry ✅
Smoke: list_available()/list_available_sources() keys match — public API intact
Smoke: ToolResolver(sources=[]) advertises 0 default-chain tools

Verdict: ✅ Approve — recommend merge

All valid reviewer issues (CodeRabbit, Greptile P1/P2) were already implemented and verified on this branch. The change is backward-compatible, protocol-correct (wrapper-only), adds no Agent params, and discovery now faithfully mirrors runtime resolution. No new commits were needed from this pass. (I cannot formally approve via GitHub for security reasons, but I recommend merge.)

Job run · branch claude/issue-2474-20260630-0846

Comment on lines +594 to +601
if self._registry is not None:
try:
names = self._registry.list_functions()
except Exception:
names = []
for name in names:
if name not in available:
available[name] = ("Registered tool (wrapper registry)", "registered")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Custom sources still diverge

When a resolver is created with a custom source chain, this block can still list wrapper-registry tools that the same resolver cannot resolve. For example, ToolResolver(sources=[], registry=registry) will include names from registry.list_functions() here, but resolve() only walks self._sources, so it returns None for those same names. Local tools loaded above this guard have the same problem when custom sources exclude the local source. This keeps list_available() from matching runtime resolution for custom-source resolvers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pipeline/awaiting-merge-gate FINAL done; waiting for merge gate / CI pipeline/blocked:ci Blocked: CI not green on HEAD

Projects

None yet

Development

Successfully merging this pull request may close these issues.

praisonai tools list should reflect the full resolvable tool surface (entry-point and registry-registered tools)

1 participant