{"_id":"@agenomics/sas-resolver","name":"@agenomics/sas-resolver","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@agenomics/sas-resolver","version":"0.1.0","description":"ADR-064 reference resolver for ADR-061 manifest-referenced SAS attestations. Off-chain only; dereferences manifest.agent.owner_attestation, parses AEP_AGENT_REPUTATION_v1, and surfaces merge helpers for registry + SAS UX.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./cache-redis":{"types":"./dist/cache-redis.d.ts","import":"./dist/cache-redis.js"}},"keywords":["agenomics","aep","solana","sas","solana-attestation-service","reputation","resolver"],"repository":{"type":"git","url":"git+https://github.com/agenomics-labs/protocol.git","directory":"packages/sas-resolver"},"bugs":{"url":"https://github.com/agenomics-labs/protocol/issues"},"homepage":"https://github.com/agenomics-labs/protocol/tree/main/packages/sas-resolver#readme","license":"Apache-2.0","private":false,"publishConfig":{"access":"public"},"scripts":{"build":"tsc","prepublishOnly":"tsc","test":"node --import tsx --test test/resolver.test.ts test/schema.test.ts test/merge.test.ts test/cache.test.ts test/agenomics-reputation.test.ts"},"dependencies":{"@agenomics/action-runtime":"*","zod":"^4.4.3"},"peerDependencies":{"@agenomics/reputation-attestor":"*","@solana/kit":"^6.8.0","ioredis":"^5.10.1"},"peerDependenciesMeta":{"@agenomics/reputation-attestor":{"optional":true},"ioredis":{"optional":true}},"devDependencies":{"@solana/kit":"^6.8.0","@types/node":"^24.12.4","ioredis-mock":"^8.9.0","tsx":"^4.21.0","typescript":"^6.0.3"},"optionalDependencies":{"ioredis":"^5.10.1"},"gitHead":"dd96a1e0a3eb8a1c9223aa972a66e44387d1cf9f","_id":"@agenomics/sas-resolver@0.1.0","_nodeVersion":"24.18.0","_npmVersion":"11.18.0","dist":{"integrity":"sha512-oHUG9pQfc45uT/GO+uz/V4EH232ivOJ6q9IKW3hjMdeY1/OQHewpdN5RdS4eOTzmjTHojmwXzZBX3Zp/R2EUIg==","shasum":"945af90aac8874a909cb2d662d698720bbb84a4c","tarball":"https://registry.npmjs.org/@agenomics/sas-resolver/-/sas-resolver-0.1.0.tgz","fileCount":52,"unpackedSize":263957,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFTFYbD6a9f3eFXWzw4PSmTmWGTPlAIu+CHAlUqVN2xuAiBuvXjZ634uBnvdFnpnsVPpokIsg3Bah22zIZv4Hb4UbA=="}]},"_npmUser":{"name":"k2jac9","email":"alexcastellanos29@gmail.com"},"directories":{},"maintainers":[{"name":"k2jac9","email":"alexcastellanos29@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sas-resolver_0.1.0_1784099543402_0.5037646369534932"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-15T07:12:23.172Z","0.1.0":"2026-07-15T07:12:23.564Z","modified":"2026-07-15T07:12:23.844Z"},"maintainers":[{"name":"k2jac9","email":"alexcastellanos29@gmail.com"}],"description":"ADR-064 reference resolver for ADR-061 manifest-referenced SAS attestations. Off-chain only; dereferences manifest.agent.owner_attestation, parses AEP_AGENT_REPUTATION_v1, and surfaces merge helpers for registry + SAS UX.","homepage":"https://github.com/agenomics-labs/protocol/tree/main/packages/sas-resolver#readme","keywords":["agenomics","aep","solana","sas","solana-attestation-service","reputation","resolver"],"repository":{"type":"git","url":"git+https://github.com/agenomics-labs/protocol.git","directory":"packages/sas-resolver"},"bugs":{"url":"https://github.com/agenomics-labs/protocol/issues"},"license":"Apache-2.0","readme":"# @agenomics/sas-resolver\n\nReference resolver for the SAS (Solana Attestation Service) integration\ndescribed in [ADR-061](../../docs/adr/ADR-061-sas-integration.md) and\nthe caching strategy in\n[ADR-065](../../docs/adr/ADR-065-caching-strategy.md).\n\nConsumes a validated AEP capability manifest (see\n[`@agenomics/capability-manifest-validator`](../capability-manifest-validator/README.md))\nand resolves the optional `agent.owner_attestation` SAS pointer into a\ntyped reputation snapshot. Implements the 7-step flow in ADR-061 §4\nfaithfully — subject-mismatch is the one hard error; every other failure\nmode (missing attestation, schema mismatch, expiry, credential not in\nallowlist) degrades to `absent: true` so SAS stays strictly additive.\n\n## Install\n\n```sh\nnpm install @agenomics/sas-resolver\n```\n\nPeer deps: `@solana/kit@^6.8`, `@noble/curves@^1.4`. Optional runtime\ndep: `ioredis@^5.4` (only needed if `AEP_REDIS_URL` is set — the\nin-memory cache is the default).\n\n## Usage\n\n```ts\nimport { createSolanaRpc } from \"@solana/kit\";\nimport { SasResolver, createCache } from \"@agenomics/sas-resolver\";\n\nconst resolver = new SasResolver({\n  rpc: createSolanaRpc(\"https://api.mainnet-beta.solana.com\"),\n  allowedCredentials: new Set([\n    \"<AEP_PROTOCOL credential PDA>\",\n    \"<AEP_VALIDATORS credential PDA>\",\n  ]),\n  schemaPda: \"<AEP_AGENT_REPUTATION_v1 schema PDA>\",\n  cache: createCache(process.env),    // ADR-065: in-memory or Redis-backed\n});\n\nconst result = await resolver.resolve(manifest, subjectAuthority);\n//                                    ^ CapabilityManifest (already validated)\n//                                              ^ base58 agent authority pubkey\n\nif (!result.ok) throw new Error(result.error.message);\nconst reputation = result.value;\n\nif (reputation.absent) {\n  // No owner_attestation, or attestation missing/expired/unsupported — SAS has no signal.\n} else {\n  console.log(\"SAS score (bps):\", reputation.attestation.score);\n  console.log(\"completed_tasks:\", reputation.attestation.completed_tasks);\n  console.log(\"stale?\", reputation.stale);\n}\n```\n\n## Caching (ADR-065)\n\nThe resolver caches three SAS layers: **attestation** (5 min default),\n**schema** (1 hour default), **credential** (1 hour default). TTLs are\nconfigurable via `ResolverConfig.ttl`. Per-call overrides:\n\n```ts\n// Force-fresh read (e.g., a protocol-logic path that must see current state)\nawait resolver.resolve(manifest, subject, { maxAge: 0 });\n\n// Accept up to 30s stale\nawait resolver.resolve(manifest, subject, { maxAge: 30_000 });\n```\n\nMulti-instance deployments can set `AEP_REDIS_URL` and the factory\nreturns a `LayeredCache` (in-memory L1 + Redis L2). Pattern mirrors\n[`mcp-server/src/pipeline/idempotency.ts`](../../mcp-server/src/pipeline/idempotency.ts)\nfrom ADR-059.\n\n## Merge helpers\n\nThe resolver ships a few convenience helpers for the ADR-061 §4\n\"display side-by-side, don't blend\" merge convention:\n\n```ts\nimport { renderSideBySide, detectDisagreement, scoreFreshness } from \"@agenomics/sas-resolver\";\n\nconst lines = renderSideBySide(onChainReputation, reputation);  // { line1, line2 }\nconst disagrees = detectDisagreement(onChainReputation, reputation);   // > 2000 bps delta\nconst freshness = scoreFreshness(reputation.attestation.last_updated, Date.now());\n//                 'fresh' | 'aging' | 'stale'\n```\n\n## Non-goals\n\n- Does not fetch the Registry account or the manifest body — consume a pre-validated manifest.\n- Does not validate the manifest — use `@agenomics/capability-manifest-validator` upstream.\n- Does not mint, close, or rotate attestations — read-only client.\n- Does not take on-chain governance actions — see [ADR-063](../../docs/adr/ADR-063-sas-credential-authority-governance.md) for the credential authority lifecycle.\n\n## Related\n\n- [ADR-061](../../docs/adr/ADR-061-sas-integration.md) — integration model + resolution flow + merge semantics\n- [ADR-063](../../docs/adr/ADR-063-sas-credential-authority-governance.md) — credential authority governance (Proposed)\n- [ADR-064](../../docs/adr/ADR-061-sas-integration.md#open-items--follow-up-adrs) — this package\n- [ADR-065](../../docs/adr/ADR-065-caching-strategy.md) — caching strategy\n\n## License\n\nPart of the Agenomics Protocol. See repository root.\n","readmeFilename":"README.md","_rev":"1-a394993d6bc141ebcb24db02535afd53"}