stackone-ai 2.9.1__tar.gz → 2.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- stackone_ai-2.10.0/.release-please-manifest.json +3 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/CHANGELOG.md +7 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/PKG-INFO +1 -1
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/pyproject.toml +1 -1
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/__init__.py +1 -1
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/toolset.py +39 -19
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_fetch_tools.py +18 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_tool_calling.py +27 -10
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/uv.lock +1 -1
- stackone_ai-2.9.1/.release-please-manifest.json +0 -3
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/development-workflow.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/examples-standards.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/nix-workflow.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/no-relative-imports.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/package-installation.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/release-please-standards.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.claude/rules/uv-scripts.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/examples-standards.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/no-relative-imports.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/package-installation.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/release-please-standards.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.cursor/rules/uv-scripts.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.env.example +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.envrc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/actions/setup-nix/action.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/dependabot.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/workflows/ci.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/workflows/nix-flake-update.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/workflows/nix-flake.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.github/workflows/release.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.gitignore +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.gitleaks.toml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.gitmodules +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.mcp.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/.release-please-config.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/CLAUDE.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/LICENSE +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/README.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/auth_management.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/crewai_integration.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/langchain_integration.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/langgraph_integration.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/openai_integration.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/pydantic_ai_integration.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/search_tools.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/examples/test_examples.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/flake.lock +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/flake.nix +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/justfile +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/scripts/benchmark_search.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/constants.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/feedback/__init__.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/feedback/tool.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/integrations/__init__.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/integrations/langgraph.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/local_search.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/models.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/py.typed +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/semantic_search.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/utils/__init__.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/utils/normalize.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/stackone_ai/utils/tfidf_index.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/conftest.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/mocks/serve.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_agent_tools.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_feedback.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_integrations_langgraph.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_integrations_pydantic_ai.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_local_search.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_models.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_semantic_search.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_tfidf_index.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/tests/test_toolset.py +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/development-workflow.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/file-operations.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/pnpm-usage.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/typescript-patterns.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/typescript-testing.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/skills/orama-integration/SKILL.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/file-operations.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/orama-integration.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/pnpm-usage.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/typescript-patterns.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/typescript-testing.mdc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.envrc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/CODEOWNERS +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/actions/setup-nix/action.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/check-title.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/ci.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/claude.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/dry-publish.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/nix-flake.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/release.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.gitignore +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.gitleaks.toml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.mcp.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.oxfmtrc.jsonc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.oxlintrc.jsonc +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/AGENTS.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/CHANGELOG.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/CLAUDE.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/LICENSE +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/README.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/README.md +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/anthropic-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/fetch-tools-debug.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/fetch-tools.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/fetch-tools.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/meta-tools.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-integration.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-responses-integration.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-responses-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/package.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/tsconfig.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/flake.lock +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/flake.nix +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/knip.config.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/lefthook.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.example-api.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.mcp.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.openai.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.stackone-ai.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.stackone-rpc.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.utils.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/mcp-server.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/node.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/package.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/pnpm-lock.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/pnpm-workspace.yaml +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/consts.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/feedback.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/feedback.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/headers.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/headers.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/index.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/mcp-client.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/mcp-client.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/requestBuilder.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/requestBuilder.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/rpc-client.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/rpc-client.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/schema.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/tool.test-d.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/tool.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/tool.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/toolsets.test-d.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/toolsets.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/toolsets.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/types.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/array.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/array.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/tfidf-index.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/tfidf-index.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/try-import.test.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/try-import.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/type.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/tsconfig.json +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/tsdown.config.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/vitest.config.ts +0 -0
- {stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/vitest.setup.ts +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.10.0](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.9.1...stackone-ai-v2.10.0) (2026-07-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **ENG-733:** support flat_prefixed MCP param style ([#192](https://github.com/StackOneHQ/stackone-ai-python/issues/192)) ([ff8fb9a](https://github.com/StackOneHQ/stackone-ai-python/commit/ff8fb9a41add55e9c31bd84e04447bb3685ab024))
|
|
9
|
+
|
|
3
10
|
## [2.9.1](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.9.0...stackone-ai-v2.9.1) (2026-06-03)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -7,6 +7,7 @@ import fnmatch
|
|
|
7
7
|
import json
|
|
8
8
|
import logging
|
|
9
9
|
import os
|
|
10
|
+
import re
|
|
10
11
|
import threading
|
|
11
12
|
from collections.abc import Coroutine, Sequence
|
|
12
13
|
from dataclasses import dataclass
|
|
@@ -92,6 +93,14 @@ _RPC_PARAMETER_LOCATIONS = {
|
|
|
92
93
|
}
|
|
93
94
|
_USER_AGENT = f"stackone-ai-python/{_SDK_VERSION}"
|
|
94
95
|
|
|
96
|
+
# Param-style pinned on the /mcp tool-listing URL. The MCP schema and the RPC-execution unwrap
|
|
97
|
+
# (_split_envelope_params) must agree on this, so it is pinned rather than following the server
|
|
98
|
+
# default — the server default is free to change without breaking the SDK.
|
|
99
|
+
_MCP_PARAM_STYLE = "flat_prefixed"
|
|
100
|
+
|
|
101
|
+
# Matches a flat_prefixed envelope key: `<location>_<field>` (e.g. `path_id`, `query_limit`).
|
|
102
|
+
_FLAT_ENVELOPE_KEY_PATTERN = re.compile(r"^(path|query|body|headers)_(.+)$")
|
|
103
|
+
|
|
95
104
|
|
|
96
105
|
# --- Internal tool_search + tool_execute ---
|
|
97
106
|
|
|
@@ -444,24 +453,17 @@ class _StackOneRpcTool(StackOneTool):
|
|
|
444
453
|
) -> dict[str, Any]:
|
|
445
454
|
parsed_arguments = self._parse_arguments(arguments)
|
|
446
455
|
|
|
447
|
-
|
|
448
|
-
headers_payload = self._extract_record(parsed_arguments.pop("headers", None))
|
|
449
|
-
path_payload = self._extract_record(parsed_arguments.pop("path", None))
|
|
450
|
-
query_payload = self._extract_record(parsed_arguments.pop("query", None))
|
|
451
|
-
|
|
452
|
-
rpc_body: dict[str, Any] = dict(body_payload or {})
|
|
453
|
-
for key, value in parsed_arguments.items():
|
|
454
|
-
rpc_body[key] = value
|
|
456
|
+
envelope = self._split_envelope_params(parsed_arguments)
|
|
455
457
|
|
|
456
458
|
payload: dict[str, Any] = {
|
|
457
459
|
"action": self.name,
|
|
458
|
-
"body":
|
|
459
|
-
"headers": self._build_action_headers(
|
|
460
|
+
"body": envelope["body"],
|
|
461
|
+
"headers": self._build_action_headers(envelope["headers"] or None),
|
|
460
462
|
}
|
|
461
|
-
if
|
|
462
|
-
payload["path"] =
|
|
463
|
-
if
|
|
464
|
-
payload["query"] =
|
|
463
|
+
if envelope["path"]:
|
|
464
|
+
payload["path"] = envelope["path"]
|
|
465
|
+
if envelope["query"]:
|
|
466
|
+
payload["query"] = envelope["query"]
|
|
465
467
|
|
|
466
468
|
return super().execute(payload, options=options)
|
|
467
469
|
|
|
@@ -477,10 +479,28 @@ class _StackOneRpcTool(StackOneTool):
|
|
|
477
479
|
return dict(parsed)
|
|
478
480
|
|
|
479
481
|
@staticmethod
|
|
480
|
-
def
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
482
|
+
def _split_envelope_params(params: dict[str, Any]) -> dict[str, dict[str, Any]]:
|
|
483
|
+
"""Split LLM-supplied tool arguments into the RPC envelope (path/query/headers/body).
|
|
484
|
+
|
|
485
|
+
Tools are listed with ``?param-style=flat_prefixed``, so keys arrive as
|
|
486
|
+
``<location>_<field>`` (for example ``path_id``, ``query_limit``). The prefix carries
|
|
487
|
+
the parameter location, so the split needs no per-action schema. A bare dict-valued
|
|
488
|
+
``path``/``query``/``headers``/``body`` key is still bucketed for clients holding a
|
|
489
|
+
cached nested schema, and any other key falls through to the body.
|
|
490
|
+
"""
|
|
491
|
+
buckets: dict[str, dict[str, Any]] = {"path": {}, "query": {}, "headers": {}, "body": {}}
|
|
492
|
+
for key, value in params.items():
|
|
493
|
+
match = _FLAT_ENVELOPE_KEY_PATTERN.match(key)
|
|
494
|
+
if match:
|
|
495
|
+
location, field = match.group(1), match.group(2)
|
|
496
|
+
buckets[location].setdefault(field, value)
|
|
497
|
+
continue
|
|
498
|
+
if key in ("path", "query", "headers", "body") and isinstance(value, dict):
|
|
499
|
+
for field, field_value in value.items():
|
|
500
|
+
buckets[key].setdefault(field, field_value)
|
|
501
|
+
continue
|
|
502
|
+
buckets["body"][key] = value
|
|
503
|
+
return buckets
|
|
484
504
|
|
|
485
505
|
def _build_action_headers(self, additional_headers: dict[str, Any] | None) -> dict[str, str]:
|
|
486
506
|
headers: dict[str, str] = {}
|
|
@@ -1240,7 +1260,7 @@ class StackOneToolSet:
|
|
|
1240
1260
|
if cached is not None:
|
|
1241
1261
|
return cached
|
|
1242
1262
|
|
|
1243
|
-
endpoint = f"{self.base_url.rstrip('/')}/mcp"
|
|
1263
|
+
endpoint = f"{self.base_url.rstrip('/')}/mcp?param-style={_MCP_PARAM_STYLE}"
|
|
1244
1264
|
|
|
1245
1265
|
def _fetch_for_account(account: str | None) -> list[StackOneTool]:
|
|
1246
1266
|
headers = self._build_mcp_headers(account)
|
|
@@ -662,3 +662,21 @@ class TestToolIndexCache:
|
|
|
662
662
|
toolset.search_tools("bar")
|
|
663
663
|
|
|
664
664
|
assert build_count["count"] == 2
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
class TestMcpParamStylePinning:
|
|
668
|
+
"""The /mcp listing URL must pin param-style so the schema matches the RPC unwrap."""
|
|
669
|
+
|
|
670
|
+
def test_fetch_tools_pins_flat_prefixed_param_style(self, monkeypatch):
|
|
671
|
+
captured: dict[str, str] = {}
|
|
672
|
+
|
|
673
|
+
def fake_fetch(endpoint: str, headers: dict[str, str]) -> list[_McpToolDefinition]:
|
|
674
|
+
captured["endpoint"] = endpoint
|
|
675
|
+
return []
|
|
676
|
+
|
|
677
|
+
monkeypatch.setattr("stackone_ai.toolset._fetch_mcp_tools", fake_fetch)
|
|
678
|
+
|
|
679
|
+
toolset = StackOneToolSet(api_key="test-key", base_url="https://api.example.com")
|
|
680
|
+
toolset.fetch_tools(account_ids=["acc1"])
|
|
681
|
+
|
|
682
|
+
assert captured["endpoint"] == "https://api.example.com/mcp?param-style=flat_prefixed"
|
|
@@ -327,16 +327,33 @@ class TestStackOneRpcTool:
|
|
|
327
327
|
with pytest.raises(ValueError, match="Tool arguments must be a JSON object"):
|
|
328
328
|
rpc_tool._parse_arguments("[1, 2, 3]")
|
|
329
329
|
|
|
330
|
-
def
|
|
331
|
-
"""
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
330
|
+
def test_split_envelope_params_routes_flat_prefixed_keys(self, rpc_tool):
|
|
331
|
+
"""flat_prefixed keys are bucketed into the RPC envelope by their location prefix"""
|
|
332
|
+
actual = rpc_tool._split_envelope_params(
|
|
333
|
+
{
|
|
334
|
+
"path_id": "123",
|
|
335
|
+
"query_limit": 10,
|
|
336
|
+
"headers_x-custom": "value",
|
|
337
|
+
"body_name": "test",
|
|
338
|
+
}
|
|
339
|
+
)
|
|
340
|
+
assert actual["path"] == {"id": "123"}
|
|
341
|
+
assert actual["query"] == {"limit": 10}
|
|
342
|
+
assert actual["headers"] == {"x-custom": "value"}
|
|
343
|
+
assert actual["body"] == {"name": "test"}
|
|
344
|
+
|
|
345
|
+
def test_split_envelope_params_buckets_nested_and_unprefixed_keys(self, rpc_tool):
|
|
346
|
+
"""Bare nested envelopes are accepted and unprefixed keys fall through to the body"""
|
|
347
|
+
actual = rpc_tool._split_envelope_params(
|
|
348
|
+
{
|
|
349
|
+
"body": {"nested": "value"},
|
|
350
|
+
"path": {"id": "1"},
|
|
351
|
+
"extra": "x",
|
|
352
|
+
}
|
|
353
|
+
)
|
|
354
|
+
assert actual["path"] == {"id": "1"}
|
|
355
|
+
assert actual["query"] == {}
|
|
356
|
+
assert actual["body"] == {"nested": "value", "extra": "x"}
|
|
340
357
|
|
|
341
358
|
|
|
342
359
|
class TestBinaryDownloadResponse:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/file-operations.md
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/git-workflow.md
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/pnpm-usage.md
RENAMED
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.claude/rules/typescript-testing.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/file-operations.mdc
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/git-workflow.mdc
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/orama-integration.mdc
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.cursor/rules/pnpm-usage.mdc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/check-title.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/claude.yaml
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/dry-publish.yaml
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/nix-flake.yaml
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/.github/workflows/release.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.test.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/anthropic-integration.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/fetch-tools-debug.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/fetch-tools.test.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-integration.test.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/openai-integration.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.example-api.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.stackone-ai.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/mocks/handlers.stackone-rpc.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone.test.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/error-stackone.ts
RENAMED
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/tfidf-index.test.ts
RENAMED
|
File without changes
|
|
File without changes
|
{stackone_ai-2.9.1 → stackone_ai-2.10.0}/vendor/stackone-ai-node/src/utils/try-import.test.ts
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|