{"id":28349296,"url":"https://github.com/stackonehq/stackone-ai-node","last_synced_at":"2026-04-02T13:39:00.614Z","repository":{"id":280624562,"uuid":"938992370","full_name":"StackOneHQ/stackone-ai-node","owner":"StackOneHQ","description":"integrations for ai agents","archived":false,"fork":false,"pushed_at":"2026-03-19T22:53:55.000Z","size":2151,"stargazers_count":27,"open_issues_count":15,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-20T04:50:58.273Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StackOneHQ.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-02-25T20:23:40.000Z","updated_at":"2026-03-19T20:59:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"968a765a-a5bd-408c-aadc-7d6498707992","html_url":"https://github.com/StackOneHQ/stackone-ai-node","commit_stats":null,"previous_names":["stackonehq/stackone-ai-node"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/StackOneHQ/stackone-ai-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StackOneHQ%2Fstackone-ai-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StackOneHQ%2Fstackone-ai-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StackOneHQ%2Fstackone-ai-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StackOneHQ%2Fstackone-ai-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StackOneHQ","download_url":"https://codeload.github.com/StackOneHQ/stackone-ai-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StackOneHQ%2Fstackone-ai-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31307184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-27T19:41:05.894Z","updated_at":"2026-04-02T13:39:00.606Z","avatar_url":"https://github.com/StackOneHQ.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# StackOne AI SDK\n\n\u003e A unified interface for performing actions on SaaS tools through AI-friendly APIs.\n\n[![npm version](https://img.shields.io/npm/v/@stackone/ai?color=yellow)](https://npmjs.com/package/@stackone/ai) [![DeepWiki](https://img.shields.io/badge/DeepWiki-StackOneHQ%2Fstackone--ai--node-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/StackOneHQ/stackone-ai-node) [![Coverage](https://stackonehq.github.io/stackone-ai-node/badges.svg)](https://stackonehq.github.io/stackone-ai-node)\n\n\u003c!-- DeepWiki badge generated by https://deepwiki.ryoppippi.com/ --\u003e\n\n## StackOneToolSet\n\nThe StackOne AI SDK provides the `StackOneToolSet` class, which fetches tools dynamically from StackOne's MCP (Model Context Protocol) endpoint. This ensures you always have access to the latest tool definitions.\n\n## Installation\n\n```bash\n# Using npm\nnpm install @stackone/ai zod\n\n# Using yarn\nyarn add @stackone/ai zod\n\n# Using pnpm\npnpm add @stackone/ai zod\n\n# Using bun\nbun add @stackone/ai zod\n```\n\n\u003e **Note:** `zod` is a peer dependency required for AI SDK integrations and internal schema validation. Version `\u003e=3.25.0 \u003c5` is supported.\n\n## Usage\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\nconst employeeTool = tools.getTool('bamboohr_list_employees');\nconst employees = await employeeTool.execute();\n```\n\n### Authentication\n\nSet the `STACKONE_API_KEY` environment variable:\n\n```bash\nexport STACKONE_API_KEY=\u003cyour-api-key\u003e\n```\n\nor load from a .env file using your preferred environment variable library.\n\n### Account IDs\n\nStackOne uses account IDs to identify different integrations. You can specify the account ID at different levels:\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\n// Single account - simplest approach\nconst toolset = new StackOneToolSet({ accountId: 'your-bamboohr-account' });\nconst tools = await toolset.fetchTools();\n\n// Multiple accounts - returns tools from both integrations\nconst multiAccountToolset = new StackOneToolSet();\nconst allTools = await multiAccountToolset.fetchTools({\n\taccountIds: ['bamboohr-account-123', 'workday-account-456'],\n});\n\n// Filter to specific integration when using multiple accounts\nconst bamboohrOnly = await multiAccountToolset.fetchTools({\n\taccountIds: ['bamboohr-account-123', 'workday-account-456'],\n\tactions: ['bamboohr_*'], // Only BambooHR tools\n});\n\n// Set directly on a tool instance\ntools.setAccountId('direct-account-id');\nconst currentAccountId = tools.getAccountId(); // Get the current account ID\n```\n\n## Integrations\n\nThe StackOneToolSet makes it super easy to use StackOne APIs as tools in your AI applications.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith OpenAI Chat Completions API\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai openai  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport { OpenAI } from 'openai';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\n\nawait openai.chat.completions.create({\n\tmodel: 'gpt-5.1',\n\tmessages: [\n\t\t{\n\t\t\trole: 'system',\n\t\t\tcontent: 'You are a helpful HR assistant using BambooHR.',\n\t\t},\n\t\t{\n\t\t\trole: 'user',\n\t\t\tcontent: 'Create a time-off request for employee id cxIQ5764hj2',\n\t\t},\n\t],\n\ttools: tools.toOpenAI(),\n});\n```\n\n[View full example](examples/openai-integration.ts)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith OpenAI Responses API\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai openai  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport OpenAI from 'openai';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\n\nconst openai = new OpenAI();\n\nawait openai.responses.create({\n\tmodel: 'gpt-5.1',\n\tinstructions: 'You are a helpful HR assistant.',\n\tinput: 'What is the phone number for employee c28xIQ?',\n\ttools: tools.toOpenAIResponses(),\n});\n```\n\n[View full example](examples/openai-responses-integration.ts)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith Anthropic Claude\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai @anthropic-ai/sdk  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport Anthropic from '@anthropic-ai/sdk';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\n\nconst anthropic = new Anthropic();\n\nawait anthropic.messages.create({\n\tmodel: 'claude-haiku-4-5-20241022',\n\tmax_tokens: 1024,\n\tsystem: 'You are a helpful HR assistant.',\n\tmessages: [\n\t\t{\n\t\t\trole: 'user',\n\t\t\tcontent: 'What is the phone number for employee c28xIQ?',\n\t\t},\n\t],\n\ttools: tools.toAnthropic(),\n});\n```\n\n[View full example](examples/anthropic-integration.ts)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith AI SDK by Vercel\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai ai @ai-sdk/openai  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport { openai } from '@ai-sdk/openai';\nimport { generateText } from 'ai';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\n\nawait generateText({\n\tmodel: openai('gpt-5.1'),\n\ttools: await tools.toAISDK(),\n\tmaxSteps: 3,\n});\n```\n\n[View full example](examples/ai-sdk-integration.ts)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith TanStack AI\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai @tanstack/ai @tanstack/ai-openai zod  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport { chat } from '@tanstack/ai';\nimport { openai } from '@tanstack/ai-openai';\nimport { z } from 'zod';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\nconst tools = await toolset.fetchTools();\nconst employeeTool = tools.getTool('bamboohr_get_employee');\n\n// TanStack AI requires Zod schemas for tool input validation\nconst getEmployeeTool = {\n\tname: employeeTool.name,\n\tdescription: employeeTool.description,\n\tinputSchema: z.object({\n\t\tid: z.string().describe('The employee ID'),\n\t}),\n\texecute: async (args: { id: string }) =\u003e {\n\t\treturn employeeTool.execute(args);\n\t},\n};\n\nconst adapter = openai();\nconst stream = chat({\n\tadapter,\n\tmodel: 'gpt-5.1',\n\tmessages: [{ role: 'user', content: 'Get employee with id: abc123' }],\n\ttools: [getEmployeeTool],\n});\n\nfor await (const chunk of stream) {\n\t// Process streaming chunks\n}\n```\n\n[View full example](examples/tanstack-ai-integration.ts)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWith Claude Agent SDK\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\nnpm install @stackone/ai @anthropic-ai/claude-agent-sdk zod  # or: yarn/pnpm/bun add\n```\n\n```typescript\nimport { query } from '@anthropic-ai/claude-agent-sdk';\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({\n\taccountId: 'your-account-id',\n});\n\n// Fetch tools and convert to Claude Agent SDK format\nconst tools = await toolset.fetchTools();\nconst mcpServer = await tools.toClaudeAgentSdk();\n\n// Use with Claude Agent SDK query\nconst result = query({\n\tprompt: 'Get the employee with id: abc123',\n\toptions: {\n\t\tmodel: 'claude-sonnet-4-5-20250929',\n\t\tmcpServers: { 'stackone-tools': mcpServer },\n\t\ttools: [], // Disable built-in tools\n\t\tmaxTurns: 3,\n\t},\n});\n\nfor await (const message of result) {\n\t// Process streaming messages\n}\n```\n\n[View full example](examples/claude-agent-sdk-integration.ts)\n\n\u003c/details\u003e\n\n## Features\n\n### Filtering Tools with fetchTools()\n\nYou can filter tools by account IDs, providers, and action patterns:\n\n```typescript\n// Filter by account IDs\ntoolset.setAccounts(['account-123', 'account-456']);\nconst tools = await toolset.fetchTools();\n// OR\nconst tools = await toolset.fetchTools({\n\taccountIds: ['account-123', 'account-456'],\n});\n\n// Filter by providers\nconst tools = await toolset.fetchTools({ providers: ['hibob', 'bamboohr'] });\n\n// Filter by actions with exact match\nconst tools = await toolset.fetchTools({\n\tactions: ['hibob_list_employees', 'hibob_create_employees'],\n});\n\n// Filter by actions with glob patterns\nconst tools = await toolset.fetchTools({ actions: ['*_list_employees'] });\n\n// Combine multiple filters\nconst tools = await toolset.fetchTools({\n\taccountIds: ['account-123'],\n\tproviders: ['hibob'],\n\tactions: ['*_list_*'],\n});\n```\n\nThis is especially useful when you want to:\n\n- Limit tools to specific linked accounts\n- Focus on specific HR/CRM/ATS providers\n- Get only certain types of operations (e.g., all \"list\" operations)\n\n[View full example](examples/fetch-tools.ts)\n\n### Search Tool\n\nSearch for tools using natural language queries. Works with both semantic (cloud) and local BM25+TF-IDF search.\n\n#### Basic Usage\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\n// Get a callable search tool\nconst toolset = new StackOneToolSet({ accountId: 'your-account-id' });\nconst searchTool = toolset.getSearchTool();\n\n// Search for relevant tools — returns a Tools collection\nconst tools = await searchTool.search('manage employees', { topK: 5 });\n\n// Execute a discovered tool directly\nconst listTool = tools.getTool('bamboohr_list_employees');\nconst result = await listTool.execute({ query: { limit: 10 } });\n```\n\n### Semantic Search\n\nDiscover tools using natural language instead of exact names. Queries like \"onboard new hire\" resolve to the right actions even when the tool is called `bamboohr_create_employee`.\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({ accountId: 'your-account-id' });\n\n// Search by intent — returns Tools collection ready for any framework\nconst tools = await toolset.searchTools('manage employee records', { topK: 5 });\nconst openAITools = tools.toOpenAI();\n\n// Lightweight: inspect results without fetching full tool definitions\nconst results = await toolset.searchActionNames('time off requests', { topK: 5 });\n```\n\n#### Search Modes\n\nControl which search backend `searchTools()` uses via the `search` option:\n\n```typescript\n// 'auto' (default) — tries semantic search first, falls back to local\nconst tools = await toolset.searchTools('manage employees', { search: 'auto' });\n\n// 'semantic' — semantic API only, throws if unavailable\nconst tools = await toolset.searchTools('manage employees', { search: 'semantic' });\n\n// 'local' — local BM25+TF-IDF only, no semantic API call\nconst tools = await toolset.searchTools('manage employees', { search: 'local' });\n```\n\nResults are automatically scoped to connectors in your linked accounts. See [Search Tools Example](examples/search-tools.ts) for `SearchTool` (`getSearchTool`) integration, AI SDK, and agent loop patterns.\n\n### Custom Base URL\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet({ baseUrl: 'https://api.example-dev.com' });\n```\n\n### Testing with dryRun\n\nYou can use the `dryRun` option to return the api arguments from a tool call without making the actual api call:\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\n// Initialize the toolset\nconst toolset = new StackOneToolSet();\n\nconst tools = await toolset.fetchTools();\nconst employeeTool = tools.getTool('bamboohr_list_employees');\n\n// Use dryRun to see the request details\nconst dryRunResult = await employeeTool.execute({ query: { limit: 5 } }, { dryRun: true });\n\nconsole.log(dryRunResult);\n// {\n//   url: \"https://api.stackone.com/actions/rpc\",\n//   method: \"POST\",\n//   headers: { ... },\n//   body: \"...\",\n//   mappedParams: { ... }\n// }\n```\n\nThe `dryRun` option returns an object containing:\n\n- `url`: The full URL with query parameters\n- `method`: The HTTP method\n- `headers`: The request headers\n- `body`: The request body\n- `mappedParams`: The parameters after mapping and derivation\n\n### Feedback Collection Tool\n\nThe StackOne AI SDK includes a built-in feedback collection tool (`tool_feedback`) that allows users to provide feedback on their experience with StackOne tools. This tool is automatically included when using `fetchTools()` and helps improve the SDK based on user input.\n\n#### How It Works\n\nThe feedback tool:\n\n- **Requires explicit user consent** before submitting feedback\n- **Collects user feedback** about their experience with StackOne tools\n- **Tracks tool usage** by recording which tools were used\n- **Submits to StackOne** via the `/ai/tool-feedback` endpoint\n- **Uses the same API key** as other SDK operations for authentication\n\n#### Usage\n\nThe feedback tool is automatically available when using `StackOneToolSet`:\n\n```typescript\nimport { StackOneToolSet } from '@stackone/ai';\n\nconst toolset = new StackOneToolSet();\nconst tools = await toolset.fetchTools();\n\n// The feedback tool is automatically included\nconst feedbackTool = tools.getTool('tool_feedback');\n\n// Use with AI agents - they will ask for user consent first\nconst openAITools = tools.toOpenAI();\n// or\nconst aiSdkTools = await tools.toAISDK();\n```\n\n#### Manual Usage\n\nYou can also use the feedback tool directly:\n\n```typescript\n// Get the feedback tool\nconst feedbackTool = tools.getTool('tool_feedback');\n\n// Submit feedback (after getting user consent)\nconst result = await feedbackTool.execute({\n\tfeedback: 'The tools worked great! Very easy to use.',\n\taccount_id: 'acc_123456',\n\ttool_names: ['bamboohr_list_employees', 'bamboohr_create_time_off'],\n});\n```\n\n#### Multiple Account Support\n\nThe feedback tool supports both single and multiple account IDs. When you provide an array of account IDs, the feedback will be sent to each account individually:\n\n```typescript\n// Single account ID (string)\nawait feedbackTool.execute({\n\tfeedback: 'The tools worked great! Very easy to use.',\n\taccount_id: 'acc_123456',\n\ttool_names: ['bamboohr_list_employees', 'bamboohr_create_time_off'],\n});\n\n// Multiple account IDs (array)\nawait feedbackTool.execute({\n\tfeedback: 'The tools worked great! Very easy to use.',\n\taccount_id: ['acc_123456', 'acc_789012'],\n\ttool_names: ['bamboohr_list_employees', 'bamboohr_create_time_off'],\n});\n```\n\n**Response Format**: When using multiple account IDs, the tool returns a summary of all submissions:\n\n```typescript\n{\n  message: \"Feedback sent to 2 account(s)\",\n  total_accounts: 2,\n  successful: 2,\n  failed: 0,\n  results: [\n    {\n      account_id: \"acc_123456\",\n      status: \"success\",\n      result: { message: \"Feedback successfully stored\", ... }\n    },\n    {\n      account_id: \"acc_789012\",\n      status: \"success\",\n      result: { message: \"Feedback successfully stored\", ... }\n    }\n  ]\n}\n```\n\n#### AI Agent Integration\n\nWhen AI agents use this tool, they will:\n\n1. **Ask for user consent**: \"Are you ok with sending feedback to StackOne?\"\n2. **Collect feedback**: Get the user's verbatim feedback\n3. **Track tool usage**: Record which tools were used in the session\n4. **Submit to all accounts**: Send the same feedback to each account ID provided\n5. **Report results**: Show which accounts received the feedback successfully\n\nThe tool description includes clear instructions for AI agents to always ask for explicit user consent before submitting feedback.\n\n## Development Environment\n\n### Using Nix Flake\n\nThis project includes a Nix flake for reproducible development environments. All development tools are defined in [flake.nix](./flake.nix) and provided via Nix.\n\n#### Installing Nix\n\n```bash\n# Install Nix with flakes enabled (if not already installed)\ncurl --proto '=https' --tlsv1.2 -sSf -L https://artifacts.nixos.org/experimental-installer | \\\n  sh -s -- install\n\n# If flakes are not enabled, enable them with:\nmkdir -p ~/.config/nix \u0026\u0026 echo \"experimental-features = nix-command flakes\" \u003e\u003e ~/.config/nix/nix.conf\n```\n\n#### Activating the Development Environment\n\n```bash\n# Automatic activation with direnv (recommended)\ndirenv allow\n\n# Or manual activation\nnix develop\n```\n\nThe flake provides all necessary development dependencies including Node.js, pnpm, and other build tools.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackonehq%2Fstackone-ai-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstackonehq%2Fstackone-ai-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstackonehq%2Fstackone-ai-node/lists"}