{"_id":"@aimondev/sdk","_rev":"3-c31ca32d64c35324e9984ecfe20fcf23","name":"@aimondev/sdk","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@aimondev/sdk","version":"0.1.0","keywords":["error-monitoring","aimon","sentry-alternative"],"license":"MIT","_id":"@aimondev/sdk@0.1.0","maintainers":[{"name":"codeshr1mp","email":"hoff26@live.dk"}],"bin":{"aimon":"dist/cli.js"},"dist":{"shasum":"73f30e6a44b9813d8612dc89d6edc0165207bef5","tarball":"https://registry.npmjs.org/@aimondev/sdk/-/sdk-0.1.0.tgz","fileCount":9,"integrity":"sha512-4nVW1IGRC2MVNDCTW+GtMMpVzRbZ5aTI80AshGo6BNM8HFj2TRnm0YmiRnNR5j8WZFxaLOFgL2ckU++HvuLcQw==","signatures":[{"sig":"MEYCIQDjgti1vbuHNBfiQ536Nc2xiy3ZUxlNPmANmvrq1NUsfgIhANJ7hcnTyIP8rCqoKk5sJXLXNJoFsYHKdjJggOrHi8Kb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76044},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"14d8efc5e971ef8b2c37986b3eb365a88b2a2487","scripts":{"dev":"tsup --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"codeshr1mp","email":"hoff26@live.dk"},"_npmVersion":"11.6.2","description":"Aimon error monitoring SDK for Node.js","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","tsup":"^8.0.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.0_1772998014912_0.5076390068427323","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aimondev/sdk","version":"0.1.1","keywords":["error-monitoring","aimon","sentry-alternative"],"license":"MIT","_id":"@aimondev/sdk@0.1.1","maintainers":[{"name":"codeshr1mp","email":"hoff26@live.dk"}],"bin":{"aimon":"dist/cli.js"},"dist":{"shasum":"49775b2e4d95e2933e8849f5ad2efa4423a34eca","tarball":"https://registry.npmjs.org/@aimondev/sdk/-/sdk-0.1.1.tgz","fileCount":9,"integrity":"sha512-X/BeepoM/iIcJdzw7gsYdw6oksG111ol+9Y+mipt418/vw0DzuVAMtAQt0eNDdTknGI5NcZbF5rfZFPqo9oJ6g==","signatures":[{"sig":"MEUCIQDHhwUKvVMFF/fo4aQSDHUxirBdXGrh/jyHkljVHDqorwIgCAuEG9+1xXgPnNTbDJ1XjF8W9eFa7Oejys11g5Y0N6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76138},"main":"./dist/index.cjs","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2bb4e2f2dd3707105029b066d39b0ae189bf66c2","scripts":{"dev":"tsup --watch","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"codeshr1mp","email":"hoff26@live.dk"},"_npmVersion":"11.6.2","description":"Aimon error monitoring SDK for Node.js","directories":{},"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","tsup":"^8.0.0","vitest":"^1.6.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1772998772443_0.30187140640865495","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@aimondev/sdk","version":"0.1.2","description":"Aimon error monitoring SDK for Node.js","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"}},"bin":{"aimon":"dist/cli.js"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","lint":"tsc --noEmit"},"keywords":["error-monitoring","aimon","sentry-alternative"],"license":"MIT","devDependencies":{"@types/node":"^20.0.0","msw":"^2.0.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^1.6.0"},"gitHead":"2bb4e2f2dd3707105029b066d39b0ae189bf66c2","_id":"@aimondev/sdk@0.1.2","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-vfDpCPUvuAx1AzNYSmrCDNMolHcjJqGCo61S1wWhlzMThhr7mBu82DhSocPlGW4eMrfB6w9xXAepztQJn/JCnA==","shasum":"ca3a29eb4fd46df2969af708f8ca9b532bd84608","tarball":"https://registry.npmjs.org/@aimondev/sdk/-/sdk-0.1.2.tgz","fileCount":9,"unpackedSize":77330,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBzB4QkRRftR1+u6/Ri+3BJAGYdYm4VhKyzYFzxwAoZkAiA9yt8rJ850+LjEJ6TFngY7Xu92jGlmpn+PSD45FkYzKQ=="}]},"_npmUser":{"name":"codeshr1mp","email":"hoff26@live.dk"},"directories":{},"maintainers":[{"name":"codeshr1mp","email":"hoff26@live.dk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.2_1773001127815_0.06002923188276621"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T19:26:54.822Z","modified":"2026-03-08T20:18:48.085Z","0.1.0":"2026-03-08T19:26:55.071Z","0.1.1":"2026-03-08T19:39:32.592Z","0.1.2":"2026-03-08T20:18:47.966Z"},"license":"MIT","keywords":["error-monitoring","aimon","sentry-alternative"],"description":"Aimon error monitoring SDK for Node.js","maintainers":[{"name":"codeshr1mp","email":"hoff26@live.dk"}],"readme":"# @aimondev/sdk\n\nError monitoring SDK for Node.js and Next.js. Captures exceptions and sends them to your Aimon project for AI-powered triage and routing.\n\n## Installation\n\n```bash\nnpm install @aimondev/sdk\n# or\nyarn add @aimondev/sdk\n# or\npnpm add @aimondev/sdk\n```\n\n---\n\n## Quick start — plain Node.js\n\n```ts\nimport { initAimon, captureException } from '@aimondev/sdk';\n\ninitAimon({\n  dsn: 'aimon://YOUR_KEY@your-api.azurecontainerapps.io/YOUR_PROJECT_ID',\n  service: 'my-api',\n  environment: 'production',\n  release: '1.0.0',\n});\n\n// Manual capture\ntry {\n  await processPayment(order);\n} catch (err) {\n  captureException(err, {\n    transaction: 'POST /checkout',\n    user: { id: user.id },\n    tags: { plan: 'pro' },\n  });\n  throw err; // re-throw if you want the error to propagate\n}\n\n// Uncaught exceptions and unhandled promise rejections\n// are captured automatically — no extra code needed.\n```\n\n---\n\n## Next.js (App Router)\n\n### 1. Create `instrumentation.ts` at the project root\n\nNext.js runs this file once on server startup. It's the right place to initialise the SDK.\n\n```ts\n// instrumentation.ts  (project root, next to package.json)\nexport async function register() {\n  if (process.env.NEXT_RUNTIME === 'nodejs') {\n    const { initAimon } = await import('@aimondev/sdk');\n\n    initAimon({\n      dsn: process.env.AIMON_DSN!,\n      service: 'web',\n      environment: process.env.NODE_ENV,\n      release: process.env.NEXT_PUBLIC_APP_VERSION,\n    });\n  }\n}\n```\n\nEnable the instrumentation hook in `next.config.ts` if you're on Next.js < 15:\n\n```ts\n// next.config.ts\nconst nextConfig = {\n  experimental: {\n    instrumentationHook: true,   // not needed in Next.js 15+\n  },\n};\nexport default nextConfig;\n```\n\n### 2. Add your DSN to `.env.local`\n\n```env\nAIMON_DSN=aimon://YOUR_KEY@your-api.azurecontainerapps.io/YOUR_PROJECT_ID\n```\n\n### 3. Capture errors in Route Handlers\n\n```ts\n// app/api/orders/route.ts\nimport { captureException } from '@aimondev/sdk';\nimport { NextRequest, NextResponse } from 'next/server';\n\nexport async function POST(req: NextRequest) {\n  try {\n    const body = await req.json();\n    const order = await createOrder(body);\n    return NextResponse.json(order);\n  } catch (err) {\n    captureException(err, {\n      transaction: 'POST /api/orders',\n      tags: { handler: 'orders' },\n    });\n    return NextResponse.json({ error: 'Internal server error' }, { status: 500 });\n  }\n}\n```\n\n### 4. Capture errors in Server Actions\n\n```ts\n// app/actions/checkout.ts\n'use server';\nimport { captureException } from '@aimondev/sdk';\n\nexport async function checkoutAction(formData: FormData) {\n  try {\n    await processPayment(formData);\n  } catch (err) {\n    captureException(err, {\n      transaction: 'checkoutAction',\n      user: { id: formData.get('userId') as string },\n    });\n    throw err;\n  }\n}\n```\n\n### 5. Capture errors in Server Components\n\n```ts\n// app/dashboard/page.tsx\nimport { captureException } from '@aimondev/sdk';\n\nexport default async function DashboardPage() {\n  try {\n    const data = await fetchDashboardData();\n    return <Dashboard data={data} />;\n  } catch (err) {\n    captureException(err, { transaction: 'DashboardPage' });\n    throw err; // triggers Next.js error.tsx boundary\n  }\n}\n```\n\n---\n\n## Express / Fastify\n\n```ts\nimport express from 'express';\nimport { initAimon, captureException } from '@aimondev/sdk';\n\ninitAimon({\n  dsn: process.env.AIMON_DSN!,\n  service: 'api',\n  environment: process.env.NODE_ENV,\n});\n\nconst app = express();\n\n// Add as the last middleware to catch all errors\napp.use((err: Error, req: express.Request, res: express.Response, next: express.NextFunction) => {\n  captureException(err, {\n    transaction: `${req.method} ${req.path}`,\n    request_id: req.headers['x-request-id'] as string,\n    user: (req as any).user,\n    tags: {\n      method: req.method,\n      path: req.path,\n      status: res.statusCode.toString(),\n    },\n  });\n  res.status(500).json({ error: 'Internal server error' });\n});\n```\n\n---\n\n## Configuration options\n\n```ts\ninitAimon({\n  // Required\n  dsn: 'aimon://KEY@host/project_id',\n\n  // Optional\n  service: 'my-service',          // shown in the dashboard, default: 'unknown'\n  environment: 'production',      // default: process.env.NODE_ENV\n  release: '1.2.3',               // git SHA or semver, shown in event list\n  debug: false,                   // log SDK activity to console\n  captureGlobalErrors: true,      // auto-capture uncaughtException + unhandledRejection\n\n  // Filter or modify events before sending\n  beforeSend(event) {\n    // Drop events from health checks\n    if (event.transaction?.includes('/health')) return null;\n    // Scrub sensitive data\n    if (event.extra?.password) delete event.extra.password;\n    return event;\n  },\n});\n```\n\n---\n\n## `captureException` context\n\n```ts\ncaptureException(error, {\n  transaction: 'POST /api/payments',  // route or function name\n  request_id: 'req-abc-123',          // correlate with your request logs\n  user: {\n    id: 'usr-42',                     // hashed before storage — never stored raw\n    role: 'admin',\n  },\n  tags: {\n    plan: 'enterprise',               // searchable key-value pairs\n    region: 'eu-west-1',\n  },\n  extra: {\n    orderId: '123',                   // any extra debug data\n    retryCount: 3,\n  },\n});\n```\n\n---\n\n## What happens when you call `captureException`\n\n1. Stack trace is parsed into structured frames\n2. Event is sent to your Aimon backend (`POST /v1/events`) with your DSN as auth\n3. Backend computes a fingerprint → deduplicates against existing groups\n4. If it's a new error (or a spike): AI triage runs in the background\n5. AI assigns severity, writes root cause analysis and suggested fixes\n6. Routing runs: creates Linear issue and/or launches Cursor agent based on your project settings\n7. Error appears in your Aimon dashboard within seconds\n\n---\n\n## Publishing to npm (for Aimon maintainers)\n\n```bash\n# 1. Create an account at npmjs.com then log in\nnpm login\n\n# 2. Build\ncd sdk-js\nnpm run build\n\n# 3. Publish (first time — scoped packages need --access public)\nnpm publish --access public\n\n# 4. For future releases, bump version first\nnpm version patch   # 0.1.0 → 0.1.1\nnpm run build\nnpm publish\n```\n\nAfter publishing, customers install with:\n\n```bash\nnpm install @aimondev/sdk\n```\n","readmeFilename":"README.md"}