{"_id":"@x12i/ai-profiles","_rev":"39-9ee34cb6cbe685ab8fc5b71151544352","name":"@x12i/ai-profiles","dist-tags":{"latest":"5.0.0"},"versions":{"1.0.0":{"name":"@x12i/ai-profiles","version":"1.0.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.0.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"918c0bcb79299ad204daea9817e088c0e146b732","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.0.0.tgz","fileCount":65,"integrity":"sha512-vuwGl7n723MpiHHuGTs8caCENfqDsjVb6Kt/tt1m18v0trxgElHpG2mUkslvSw0EWS5Ik1mjG7mwrgd6zDnC+Q==","signatures":[{"sig":"MEQCIBhBEPEorqDlSLj4JtVSo0tokt0Bfas4bGMcGKRi+f8sAiAlKpk8m0uVZI5GIBtSeiki0oEGsdUTkfMo5uVcIQ5aKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84149},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"f5bb555260a9f342b6ac9d1fdeccf11227e342a0","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.0.0_1779873738392_0.6636166744061456","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@x12i/ai-profiles","version":"1.0.2","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.0.2","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"861b869466bff0ba984ebcab1ed45cf12f413dad","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.0.2.tgz","fileCount":81,"integrity":"sha512-Cku+WEpEm4M2G4MZAk8p8iSJ4oxAwUDKBUB0jufKo1PjNykNk5VAPkr9TrpJwqNWuzz0vlLJJ79QnihfL51IgA==","signatures":[{"sig":"MEQCIDi804uS+71gfy6KcRlGj8rPeJVkNB7YTK+fVuem9fQrAiBcfy37m58e/OSxivk8pFhVddMTVZ44rQhc98LkANPHwg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94392},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"be0b85bc0fc638c96f6de5d157dcc7e95f3a01c1","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.0.2_1779876631831_0.526508148018983","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@x12i/ai-profiles","version":"1.1.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.1.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"910e34d736d2877ef1b96d182def65328ebf5660","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.1.0.tgz","fileCount":81,"integrity":"sha512-uab4UGQkqf3s2570FFPxqXe/uS/U9sCHB9wWXAiy1F2IPeYlsvG3zQbu6CY38C2fUE0HpJsP26mE4S3pUeTOPg==","signatures":[{"sig":"MEUCICXkPRvgH9YWYvyYVi50kYKc9LXNtfU0U5acX0JVUq0JAiEA06q4WZRV50lfEVs6wgSCTR2ncEmuVK/hGQdpAXtgrwM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95860},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"0840d214c33d7cd5053781eb38edff8d21991640","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.1.0_1779878789064_0.9728217665546111","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@x12i/ai-profiles","version":"1.2.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"a9a78ab8cf45e5e2caedc03031f9423743ce7c5e","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.0.tgz","fileCount":85,"integrity":"sha512-c/5yfG9ENK8fsuQkoF2RvV8kkIlCDWgSVPHIxv5rVDoHW4am2YwTv2IzecuLRNrxTox+qWRmAO7Hu51L4FWdmA==","signatures":[{"sig":"MEQCIF6sx20QRJGU5/hLIjgVht53tU8JtNURUek7W/bAdmTpAiBQUzCzr1bwwmg9P44X3tGuiqwXnGNcxzoEZyEzLaD4bg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110520},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"10af4c6cee8b5280153d2d493bc37b7d5bb3f767","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.0_1779889776704_0.45041693588403797","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@x12i/ai-profiles","version":"1.2.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"df1cfb4290180768c397a9db329b9fdfb0a1d221","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.1.tgz","fileCount":85,"integrity":"sha512-xoNK0fMsIoDs0qt0zMUPe8DwsxWXSkLPw6wpE+eq5cjU8qFA7Ogvn59rfAvq/c1zQ3WLy+QGZhRu/X0FA2hpiw==","signatures":[{"sig":"MEYCIQCzA1k9OA8bVVFiofRdjmT7C7NGmeaeW66gTvXl/nSBogIhANQSzyY4HUZFcV8Rs1F8dx+nfyD7C8LbmnIrvR44avnU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110884},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"1d47feeeec9045404b73340c6f27d636805c92f3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.1_1779916070511_0.6572188433388169","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@x12i/ai-profiles","version":"1.2.2","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.2","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"dfb23aeab4ce011b1f7f9b384df1feeff1d3eb66","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.2.tgz","fileCount":85,"integrity":"sha512-o0lAkION8dd3SI1c2YzDBaAnY28yToWrk/70RPfXl/FmyleTnA1GGIxWg61GaJieN25IOyj2n3pFV3WcprmFyQ==","signatures":[{"sig":"MEUCIHhDptBgtzAmWqWbTsKRjGNKlDZFeF4vRXVAoMsZrEgrAiEA8Qfxk3qCGd23/JUPsdPgyUU1c4vV5otMivNo9y0ZZ8k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110902},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"1d47feeeec9045404b73340c6f27d636805c92f3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.2_1779917568765_0.7000624350028013","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@x12i/ai-profiles","version":"1.2.3","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.3","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"1b9ea6f8ad3b2638e4dd572cf972fe085b823a53","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.3.tgz","fileCount":85,"integrity":"sha512-yJieY7X093HYJMQQBwMr8Sp9JnPw97Steyn4+dRCOJH09t8svbczShadkcztQFxsDnCjQMIWneoE+35utRXDOA==","signatures":[{"sig":"MEQCICJOV+BL7ROQdGfFH7dTDLciglSMhZOtBF/2XhGt1bvUAiBWO6xumMbC/HtB64IzEAVfDCSYwwOrBloM+hyEFe4YKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110902},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"1d47feeeec9045404b73340c6f27d636805c92f3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.3_1779917600643_0.06033338660513632","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@x12i/ai-profiles","version":"1.2.5","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.5","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"20f3c0f3fcfc15ec511e372112b24a81cce4cda2","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.5.tgz","fileCount":89,"integrity":"sha512-mxxlNNRqFAB2y7jolP6EhrDOuySxVb1l6Gmm38wqRxTOumd8YRoLjjB1fGyKhFvRm1IjMRaa6Y7Mm8zcuxOnhA==","signatures":[{"sig":"MEYCIQC+NadSQFK3Kj+DEzSJDkxed8AIrDZ240gC+d/epkiACgIhALRxYHaQs4bQYKbIaud2NLC8Qx1Rf3eRn0BeHo0xHeEq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125340},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"1d47feeeec9045404b73340c6f27d636805c92f3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.5_1779980132583_0.7588617478605226","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"@x12i/ai-profiles","version":"1.2.7","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.2.7","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"b898ce6d0d25d650be18f43721fa7636ac0d035e","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.2.7.tgz","fileCount":93,"integrity":"sha512-/hjrY9L0RhNRbVxD399fNfatV/o9KHC74iw/iX45mW6UhffDgV9aBXhX6rDl0smDxrzNwx9lQFbQZXQfftTD8Q==","signatures":[{"sig":"MEQCIAVo4+uF1evXfHxBoQo+I09z5KR8eLEkhKXU4ok5b9a8AiAat0UT/NdlMU6rDBBKA/Nbo77+ohwG2O6aoJJCaVBvOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127184},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"39a50bfe910af4d1bbdebb10d395fd0ec8216011","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.2.7_1779980755978_0.5033085332983638","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@x12i/ai-profiles","version":"1.4.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.4.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"8bde8926843cefdc1bb8d4b382278530cdc4c525","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.4.0.tgz","fileCount":97,"integrity":"sha512-a1rlXK4ICwlC4b/cmswZmOTphvhq1PjTLBBLok0QYojlgPzYYOCoIUv6iDsWhyHV4LOxrmEnvULLr+3hKabztA==","signatures":[{"sig":"MEUCIQDgw0jHP9s0EKdyQZJur5nIv7lK1bpujTSw6sZ6eo0ZKAIgNB1IrCKoCI8oUtblZWOp1X9bYKTDyV1EBbRxz17tlrQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":138521},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"8aad041e7c3ac5e6d6fac1413a939eec51329771","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","test:watch":"vitest","prepublishOnly":"npm test","publish:public":"npm publish --access public","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.4.0_1780003167580_0.41173062576243225","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@x12i/ai-profiles","version":"1.5.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.5.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"b698466df64ac9df6a78db10f0de4d36ae1f1580","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.5.0.tgz","fileCount":193,"integrity":"sha512-Tbm3ZjRWOf4Z3meD2cmtJ9OAqVDRvek65xm0t8bZNHkvSSad3Pac4nyaGyYhk2HkZwEpg78bgr7FvleLP3iWEg==","signatures":[{"sig":"MEUCIANps+/EkPWVwBOvfVWCReYvBhESL1VdsTQcOGI8LXKdAiEAlHWpIJS8PcRL1TZxP/EC/jbxB0sHWskIjgAaHcnG86g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":560886},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"7f315a891c5281712a8040f1f1aeefc97ead199f","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run catalog:verify","migrate:profiles-v2":"npm run build && node scripts/migrate-models-profiles-v2.mjs","migrate:profiles-v3":"npm run build && node scripts/migrate-models-profiles-v3.mjs","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.5.0_1780090175117_0.5996849119881451","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@x12i/ai-profiles","version":"1.6.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.6.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"d989d0264d46968089922ab215b756d3ab746d17","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.6.0.tgz","fileCount":197,"integrity":"sha512-32WzHRjoGd2AIUMBd2eZzM+2ydL/4HWn+5Usw1FeqiW7VvbXYldlEdbW7P0fDmDN99iZFABgOyFAk+5oKQDi3w==","signatures":[{"sig":"MEUCIHZKXnrP5GoqDlbsUEVAu9XOb5PGykKqcMJL/WAxPKg0AiEAose5R/kcKKRwdqfNTIvR+45EIc3u7tEh4EORQUX/GZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":575914},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"7f315a891c5281712a8040f1f1aeefc97ead199f","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run catalog:verify","migrate:profiles-v2":"npm run build && node scripts/migrate-models-profiles-v2.mjs","migrate:profiles-v3":"npm run build && node scripts/migrate-models-profiles-v3.mjs","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.6.0_1780090740699_0.7420838100239346","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@x12i/ai-profiles","version":"1.7.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.7.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"08fc882005fe2ac5f3d7d6f57dd6766ce1c322f6","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.7.0.tgz","fileCount":221,"integrity":"sha512-qFzM6byLcLZyu1vYcIO2cNRBIOJQYWhTveuHuKxmbYB9tGfKRWgkotkBFG8qjpVM0IPMJ1PEACV6bD0kxOLvzA==","signatures":[{"sig":"MEQCIFtPC7FlJasfBa3h906XAWM969ObgE5iQXGSSrTu6YI4AiBoncS9DI+di1EMep7sHA06QIakQh/ksobG52d6D4+6WQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652427},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"5e4a610b81a1f8ac34ee6c0f13a0456d1ae49ef3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run catalog:verify","migrate:profiles-v2":"npm run build && node scripts/migrate-models-profiles-v2.mjs","migrate:profiles-v3":"npm run build && node scripts/migrate-models-profiles-v3.mjs","verify:openrouter:live":"node scripts/verify-openrouter-alignment.mjs --source live"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.7.0_1780174127867_0.5049519708234573","host":"s3://npm-registry-packages-npm-production"}},"1.7.2":{"name":"@x12i/ai-profiles","version":"1.7.2","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.7.2","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"dd87b04b59bc8060f08e4eed4b28f25a05b65700","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.7.2.tgz","fileCount":229,"integrity":"sha512-gRScCevYieLJ8aztm1K5kzQE1MRMdNcU8Lg36gFrBciED9cuHUcnAaL0GwQ9p+oOeDnRt1KqjYja/FjG8oao/A==","signatures":[{"sig":"MEYCIQCToiNOrdQsNUB35n4uP1F62BcziC3CyLPclS71kPm2RgIhAIxkaWEhmBvcJPBYkVKYNfAbsMVU2bD568dbTuCP7WLZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":616984},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"9b1773d173ed241f49e4ddd1a657d4cfa2aa31c3","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","migrate:profiles-v2":"npm run build && node scripts/migrate-models-profiles-v2.mjs","migrate:profiles-v3":"npm run build && node scripts/migrate-models-profiles-v3.mjs","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.7.2_1780212145400_0.06095812582919624","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@x12i/ai-profiles","version":"1.8.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@1.8.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"7c4079261f73b2dd412d28bc85dfae752a03fad8","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-1.8.0.tgz","fileCount":241,"integrity":"sha512-/QzYnvqmKKQ1QzP41tw8ozfsX5ZhEm4EXqm04IhUdMO627GlfdNhAwg3n28ZK6u/erahax5HDAwsPldHwQ4oMg==","signatures":[{"sig":"MEUCIQDrVBaG30pyWCSlwebVeBi6CuSFv1KOONqMI2oW/snALQIgUJRHbAoplNolOnYG4ApoaftmPinK91hVE2SisKPTsyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":658498},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"3e3d863c158e8f6397737eed3160ac22eb19f8f6","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","migrate:profiles-v2":"npm run build && node scripts/migrate-models-profiles-v2.mjs","migrate:profiles-v3":"npm run build && node scripts/migrate-models-profiles-v3.mjs","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_1.8.0_1780230974841_0.5656953398309341","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@x12i/ai-profiles","version":"2.0.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.0.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"c41953bddbd1c5576a71ac718f28e42593b0b781","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.0.0.tgz","fileCount":257,"integrity":"sha512-SYdCTVLK1fJArjtt5tAU8QVtJg5NJrKVbPghiVzzg+zpemwA/X+bN9jcytc60dqBGvPw4tagtmUkd4uERWXizg==","signatures":[{"sig":"MEUCICsgwzwXPbj2uEcH30DXt6dboPWT4wYt4XbJ+goAq3AKAiEAqkH1KWRlQhW66Rt6rqRmQARKhiTnO0D7Vw2aV2gagqE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":718229},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"3e3d863c158e8f6397737eed3160ac22eb19f8f6","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.0.0_1780301527214_0.11726820396893767","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@x12i/ai-profiles","version":"2.0.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.0.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"32cf43a2638e54d88e988512dcb4931f00cd2f43","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.0.1.tgz","fileCount":265,"integrity":"sha512-I9TjHZFXXotlr7hSnFSkHIzoqAjyVnWW8zGWpPYMDk2QO9l3tAgYtdEwZ/1Z+rZxR99L1j4o5bfC4KeofcSs1Q==","signatures":[{"sig":"MEUCIQCj7w1rDsWbe/5uetLbBkklJBqGrua3HdMwNpV61O8mKQIgQzCdaExBdxF6xBxAn/yK6ymPpkEG6IRd8ICGAGOoFPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":758898},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"9cd846e192e1f22572098af52384e7b08871ba79","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.0.1_1780331382924_0.4726136266632135","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@x12i/ai-profiles","version":"2.1.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.1.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"1d931ff95a2b8fa00b11bd70ab8779f9760ba129","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.1.0.tgz","fileCount":294,"integrity":"sha512-zYNxT400XfbcRwNRw3ZrtG5AlM1ylLmAC94QEwDxecAWUCdOQZlu3sr5d4GIElvn6kdK9uiOYL9ajGGdA7Boew==","signatures":[{"sig":"MEUCIGIk0S/sHVfGx6AfVEWKNaQGLXTveGSuImZb5aLTYxPlAiEA/TCVZFiqh6B+ZaXrKch+h6Y6DyVuHHFDy7qIzgt3+k4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":894579},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"1b05f5060cc10b34e72aeb83456cdf63fe369124","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.1.0_1780408670688_0.4742138862620393","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@x12i/ai-profiles","version":"2.1.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.1.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"992e13a74f168b9222846f6271764ca9371bd1d3","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.1.1.tgz","fileCount":294,"integrity":"sha512-HX6ZzXlBYZZf52zOI3KGwYhAcJ4gMf2tWMKBTQgfoy8tXD5vbjZHOphh2a/wPL6c0svKAh6ybfQir43qm0/EBw==","signatures":[{"sig":"MEUCIQCcZoi2X7g/baGVC7DgUeq0e9JK/7E37WF/fMwf4X++XgIgVaEbkFPwdvxJV1Vc3E3rzN6zJ7TqmyMBDGaTd/r671o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":898413},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e6431cf6758d62d4649efa116c3cee5f489cef78","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.1.1_1780588104921_0.6403313926163523","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@x12i/ai-profiles","version":"2.2.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.2.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"167096161c35705acd2cd03e3073a71fceebce0c","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.2.0.tgz","fileCount":322,"integrity":"sha512-D4/Z18+NV5y9RoGjqtYjAyVk5L/ao0Gge1n56TeMEGqj+UXMSjsMJ8HtkoZbOkOKH1qEWn3nVJrF4iz2+Uu4Zw==","signatures":[{"sig":"MEUCIQC4ghoeCRWeMOJYcgo0mFg/4nectjTVaeNAwZwdwUTpfgIgcago6bB3n9rYiI4zwWpiE04GUMb4B+fHER9wTuVKHMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":942255},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"3afe1626b92d919dbe281c84a3f2011defab5b8a","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.2.0_1780669310839_0.055491790464681","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@x12i/ai-profiles","version":"2.2.2","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@2.2.2","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"ffd46390d9b789f9b074aac2d6e09be46d8ac59a","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-2.2.2.tgz","fileCount":326,"integrity":"sha512-nXx90SIqxBu/0oVJMMKThgitbVDuhD/ADk19OugIc2Ri4yFAS1HOLHkwBS5zBF7Ak9lLc8t+MVelF+DaCUBffg==","signatures":[{"sig":"MEYCIQCONSqTQG5h3D+FS2VTKG0hyKTULxUm35kZM1T9cQT/sgIhAOflb8O88aRCTjurJerLGfgz0dhEEKphV6b2oIxCguJ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":945514},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"3afe1626b92d919dbe281c84a3f2011defab5b8a","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_2.2.2_1780669730231_0.9320600612122696","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@x12i/ai-profiles","version":"3.0.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.0.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"3ff7655f822c00a615da41f61d97ad63cd01eb62","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.0.0.tgz","fileCount":330,"integrity":"sha512-BoKgKQn54fZKjbHbg7bRD1hU0gPTtPSBXYFIsuPwC1XTXf4Cj24nu4gBYZfeF7F2SXM9uHCjcWwdu1VbIItjEA==","signatures":[{"sig":"MEUCIQCO3e2vqjRdp89EVs2h/Z+9Yj/9LZuB9e3OgaYo5BqreAIgXTllA3fe2xFBnmMQd8tgqXbVxK/EsGn8wNCosl/NJds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":930351},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"18f4e966af3e40459942a0e2a46e07fe42d9ce11","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.0.0_1780670886380_0.5079002557797239","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@x12i/ai-profiles","version":"3.1.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.1.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"6dc8e62db8fa4cd8f21df7cce89b7d27b5ca7269","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.1.0.tgz","fileCount":334,"integrity":"sha512-53xZjBLshQdOtGOmt8lx2aa0gtytG7s+aAOytwJZ+4FxVvH1C5dFBy6qlufa8lufRxb8xfBV1YmC6jOjye9RDA==","signatures":[{"sig":"MEQCID/hTe/4YgTOafST3NnNSBTis1oqwbLePeWY8p7MM547AiBXiR6cCQdcqLS13qsYLMQB/kxDTc8aB9WCMwMaNbub9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":949251},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"de664d7e9828c7c7feccc2e12dfe3cef8d4291fb","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.1.0_1780684032863_0.594413537656441","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@x12i/ai-profiles","version":"3.2.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.2.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"f58e4772dd538667c9d37c251a475497e64774f8","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.2.0.tgz","fileCount":334,"integrity":"sha512-hvFMTAaC3PRgNklqj6Dl8RzhqC/tnPf/U+YsgFJFY/RjpLpqZt7+GxMNljDi2gKn876nrjXCh0mmyQnfZrARDA==","signatures":[{"sig":"MEYCIQDWSRMoqC1xd2L7XfkUcz+3KVpqhyS402o47jUmSPNx5gIhAOn+Su8P0lBeqtSQzrJgi4tDZGCVnpC0OccbcwIahjOc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953881},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"de664d7e9828c7c7feccc2e12dfe3cef8d4291fb","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.2.0_1780684635137_0.2960052562551534","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@x12i/ai-profiles","version":"3.2.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.2.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"cc70142b2b64246478b6b9fc2165511b5a2bfd2a","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.2.1.tgz","fileCount":342,"integrity":"sha512-PIaAVDdwcB644tkxyxeoFCDqxnEqeXUqsRgXj9jAs9jVSkPODNwe49vF+Ytv7tSVa71ECeOdP5WDT0Vp6LXmZA==","signatures":[{"sig":"MEUCIC86YMNq3X2bALx6zztrypEoiQUQ5xAdbrLUYW6HITemAiEAwavpWd+MMox50MLl9boB0/7Yh4LkBhM6REc3C3jiw2E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":982691},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"fe9df7cf0028ced769682a5d95837375fdb2e47b","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.2.1_1780900816651_0.5622876217200405","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@x12i/ai-profiles","version":"3.3.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.3.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"a3f6bc41bbabbe2a8f798595da931afc6e4562b1","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.3.0.tgz","fileCount":342,"integrity":"sha512-//iQWnxSBce83IxcWWWTKzviGvHepH/i3ZmTPCRKf4rvaGTccoF+n0VBXbQODp+PGXYpYA4gEPjgIyVwPUUtbw==","signatures":[{"sig":"MEYCIQDv12v0S/MRQQU40jdnp6FL9EvF1zfTgEZPnIhiRf5HqgIhAMnTJL6pBy0R8+uGA0cRWqlq3jTCyF2Fp3rDALGsrwXc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":985904},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"fe9df7cf0028ced769682a5d95837375fdb2e47b","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.3.0_1780903929226_0.34085873405888556","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"@x12i/ai-profiles","version":"3.4.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.4.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"b377f2fbc33392ad5d9acd6e60073e93ba6c9fa4","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.4.0.tgz","fileCount":374,"integrity":"sha512-vM/rPHCsdlSOGY3+IxI0GlXRZ4J1QK0KVtvnsJmNMDCR9NwUqrvGbua9nTZilI0VG0pscQAeXogpItMLYx/kNA==","signatures":[{"sig":"MEYCIQDdbltyAFl/rJx6Juc1G26cl5SUt9jOqUeTkAS4XU7H0AIhAIagjzk38Noty5HWtJIZDibSRQvAxm0++Z9sDazWH3b4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1092509},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"a9f9e80abadd9f6b4f47ffdefa3e812440d20edb","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^4.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.4.0_1780947890138_0.6661124253740316","host":"s3://npm-registry-packages-npm-production"}},"3.4.1":{"name":"@x12i/ai-profiles","version":"3.4.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@3.4.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"a19d6a5d6d86b56721312ba2f3d77f2c0b472f8e","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-3.4.1.tgz","fileCount":374,"integrity":"sha512-YuumIrjDlP9D944OqOswRbrP3eTKMU6h3bJwGNISmHh4Bq1cYnk8hNLuEYfx2m0kLCnk7LzaKtdGTf+dwxKrlw==","signatures":[{"sig":"MEUCIQDqMg7wnBWG1dnPyFIl5/WN3BwjW2lXfJTH4Bmj1d3JHgIgIf4gegVCa4/s60IHEmPKLFWVjrGBkRqNqbGtqKLV+cA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1092509},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e41716a139c4a3faef4c312d589df176b36beb59","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/refresh-catalog-curated.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_3.4.1_1782568873843_0.26152193415359215","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@x12i/ai-profiles","version":"4.0.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.0.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"32c0730f0948ba0b250c776001c95bf7b68e8c2b","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.0.0.tgz","fileCount":374,"integrity":"sha512-FCZDAtiyZ3XE0Jcg/lul0Q7KaV7hkJ6OhESYPbTPgZ5TU9kPeg4cn4kKurqb5xhcS4Y7BkJG2nLv1XAp3W6+gg==","signatures":[{"sig":"MEUCIQDRTP3CG4aoOMUqn6CNRkkdkrVvP5l5G4/h0KOCTLbxnQIgK7uaM5jegeMHK3OX54jQDaxrYY9cbfv3pzf49LSxChE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3273267},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"a71abed78097e0211bd45c72967a364563e7cd31","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.0.0_1783430184897_0.47034046875983027","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@x12i/ai-profiles","version":"4.1.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.1.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"f2f8ba971daa03b700257f3ca1af732ce1fac155","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.1.0.tgz","fileCount":374,"integrity":"sha512-l8rr4SYuZcKPGc0RTNgGQ59oKEi/rptXc+EhSxqNJJ/4mzmB5WLDrSiZ6bq6ZecOZhGAFdQT9YXL0GO3OhGe1w==","signatures":[{"sig":"MEUCIQCm816yIFe6WSqu/rCy5r5cTyuNxbII+ft/EHStFLDndwIgFzpuE4WaWwsBXtATbLWGjw0ibBcHDvNp5O2Y5VYD9g8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1714881},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"b9bdee3d281475ed35b30a21fd8549ab7b270337","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.1.0_1783508033270_0.5363703494459939","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@x12i/ai-profiles","version":"4.1.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.1.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"2e6f84a474e1ea52f8f0acadf519a2bef916160f","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.1.1.tgz","fileCount":382,"integrity":"sha512-+cp+wBkKiNqHDZDG+blafAu+Xdl06Is8WGeAoAAyteOGGMLxA87tvB2KRfF/N181nqB0gmohwZTMSMaNzCO6Uw==","signatures":[{"sig":"MEUCIQCHRXSpA5hh0Tda+Zf7X3tT/fyeKGFp4lKAYcYT5DupQQIgYlccy/WAiq6EKxIxjmniOFLbaSToozyzglFDq9PU85s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1745908},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"a04a1bc2a3185dc609e9620f72b54b4a39c942d0","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.1.1_1783521730862_0.8209888815587743","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"@x12i/ai-profiles","version":"4.2.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.2.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"ffdf95efb59399e73d9cb451f916c7ca002f951d","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.2.0.tgz","fileCount":394,"integrity":"sha512-tObbUOhXoM3ZsEVp+zcq0D6Ni+vVZLClIeRLQctlPHeZWuFGQOf1vARHOLDeM4LMRoez3WAaF3+WMKzTX/aTjA==","signatures":[{"sig":"MEQCIBGUy/h5EXbnN6dnSWMpTw8q+DWnopjx71Styp2wQxeZAiAcBtbptADTxYmlSsmKwG4285RpicWH6ncMgJwC3Ns+Pg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1823046},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"72cde6900c0bef55d6882a23455f030121c227d0","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.2.0_1783606325030_0.4411433871336812","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"@x12i/ai-profiles","version":"4.2.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.2.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"50650efaf58e0be8becd090f06e29b132b16ad4b","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.2.1.tgz","fileCount":398,"integrity":"sha512-q3zrzgbzztKqXz0rDoKOABNxgs4afDBS7s437UBNW4M3wQJY+/Ji6FPycPdB1sbuw4AQhJ0CEe78PB/afpZNaA==","signatures":[{"sig":"MEUCIAQ5ucEOhZxOC2+dmvTJNnr/tdFOc7aNu4iIcG+c+jajAiEAvc0A7GWxyS6556UodOr2vqzOA5lzoPhVrkQrOz6BbAI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1837914},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"dbd6512c210d8f41541b7b0a0a006f8e5e258f15","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.2.1_1783699032991_0.7338872604194158","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"@x12i/ai-profiles","version":"4.3.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.3.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"355975c8a3f3da8b6d8dfb9e7890c9c83d53464d","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.3.0.tgz","fileCount":406,"integrity":"sha512-9KMxcG1v/P4nhE4lHKSgbnpmXPoIeY+nQThOYWrE7vrFZEjkCTPK74J7XXdSVNG2SZ8ufBdzozF3Qf3XVWGbyA==","signatures":[{"sig":"MEUCIH0gOZwcdH68FtHQd08NSEETBpAWq1uZZUqba6VQMzYlAiEA6wviNq/uPFp/pZNbA/U05biLvJ1fHQaCFp7TF7tTJf8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1848468},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"dbc87e3dab7b6056eb042e48d4ba1a7aba3f4a6f","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.3.0_1783710511736_0.5558922154525114","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"@x12i/ai-profiles","version":"4.4.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.4.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"cf26868814c1633c972b40325510a9601ae05ca0","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.4.0.tgz","fileCount":478,"integrity":"sha512-/LvwsCZZbAFL4kCFGgiLnW5cYI/u6ISPkq/nA1bW5RmKcTzdddn9xgdeeB47YQ5pBG/ro8fi09i20dFBMwPn6A==","signatures":[{"sig":"MEQCICAFIhhAxp+IbUGSLOKO5t0yUF6AZpDloktiP0sSuHMjAiBvx/g7V187fjz5EHEjy/pevfiqKaLikn6RJSX15u6phA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2255322},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"99e5afa7104fbbdd7ba0c5f5816a8e8e9a0c82f1","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","evidence:refresh":"npm run build && node scripts/model-evidence.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git"},"_npmVersion":"10.9.2","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.13.0","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.4.0_1783858723791_0.4311881434398839","host":"s3://npm-registry-packages-npm-production"}},"4.4.1":{"name":"@x12i/ai-profiles","version":"4.4.1","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.4.1","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles/tree/main/packages/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"d0b31d6d77ddb9c885b35459fbb2d52ec35b5ff5","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.4.1.tgz","fileCount":452,"integrity":"sha512-ZHCjgpIpSmLWeUDNadeNgQe8575PnF2X5hx1jzKlvl8HD6gjM3KjQ0AyqsmteU/i6zNyIVIEHzEhf+m3M3+Lwg==","signatures":[{"sig":"MEUCIQD2FePuQOR+3IOWAgzJGnRzan1JG3erdDfybtwov1EhWwIgevIeSc3y1MkThV+NYDwh/vevLlSssp1T0UoHN3x9+MQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2313303},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./browser":{"types":"./dist/browser.d.ts","default":"./dist/browser.js"}},"gitHead":"ebcbbce66659f189134fa563e4e16943500c7505","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","evidence:refresh":"npm run build && node scripts/model-evidence.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git","directory":"packages/ai-profiles"},"_npmVersion":"10.9.8","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.4.1_1789502717017_0.02250967318529673","host":"s3://npm-registry-packages-npm-production"}},"4.4.2":{"name":"@x12i/ai-profiles","version":"4.4.2","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.4.2","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles/tree/main/packages/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"77ff5558d1dfb85fbbe9d82490d12aba09c34981","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.4.2.tgz","fileCount":452,"integrity":"sha512-Kg4FaDrF3cXdhX/Uu2iHq4fW3uo6ORCgv4TnGTk3JZKKgnmdS3Xdz3yOYIplcL1E+ZkaEL0yo1gPWomN4nrkYQ==","signatures":[{"sig":"MEUCIQDHIye8vYB59qNvg3IiPkH0AsiojuMuF1ZqLq6QVJX95QIge7tXNqRAbCJxVbAps3YquVtLFmSLbRAgnEfli0iHs2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2322670},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./browser":{"types":"./dist/browser.d.ts","default":"./dist/browser.js"}},"gitHead":"93b3984c94f9fac6d0543cd2ab0c93bbdc33d052","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","evidence:refresh":"npm run build && node scripts/model-evidence.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git","directory":"packages/ai-profiles"},"_npmVersion":"10.9.8","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.4.2_1789504800289_0.5125092371509745","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"@x12i/ai-profiles","version":"4.5.0","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"author":{"name":"x12i"},"license":"MIT","_id":"@x12i/ai-profiles@4.5.0","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"homepage":"https://github.com/x12i/ai-profiles/tree/main/packages/ai-profiles#readme","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"e5daa4e3e14c769b2210392288a252be45789c91","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-4.5.0.tgz","fileCount":476,"integrity":"sha512-vq05donvnor2xz/DZWCecQ3/tNqgsX/87djc94hQY6OinaMkN8ZfdPfsAPKY+lPCnjFXKRCMTzvY5aR7oRYC9g==","signatures":[{"sig":"MEUCIHLa0ACKWnwMnKPcX92ppAs3uantY6g5MJ+WkT6AMaoRAiEA91UMfVbi1o8Vo8YSirkz7e5ZZLZ4H1PEJsoU8MOe7Ms=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDd32z8oihhiBh0aNZvOfElngZJc9KM34lHHKjhq/fqXgIgBYyUhlCibwi26Q8mnuJD6Zlc5f+/bu32ZuFYEFaFI7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2467227},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./browser":{"types":"./dist/browser.d.ts","default":"./dist/browser.js"}},"gitHead":"0b3779046dbb6cbfda643db5a0599d0484acf1a9","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","evidence:refresh":"npm run build && node scripts/model-evidence.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"_npmUser":{"name":"x12i","email":"ami@x12i.com"},"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git","directory":"packages/ai-profiles"},"_npmVersion":"10.9.8","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"tmp":"tmp/ai-profiles_4.5.0_1790159505260_0.6913179335058903","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"_id":"@x12i/ai-profiles@5.0.0","bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"dist":{"shasum":"76183d8ed4f423af9fb6ebfa8455d88e4554f96c","tarball":"https://registry.npmjs.org/@x12i/ai-profiles/-/ai-profiles-5.0.0.tgz","fileCount":482,"integrity":"sha512-OYJqODgvGCuUhPHFwpmn1Tg44qhq7kmB/BPG2Kq+Qj1Qncg4HWBQuePdCKqshBPXTh9y9TtJY5W7TA74ms8ARg==","signatures":[{"sig":"MEYCIQCOh0MRpxUy6IKCLqiLEwF/tsn62JnX6NUmgTVNImr2zgIhAIwS3O7BSsgTS5fYfcT6AdyFKLkJcK56zn9DMUGLJQPY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA2RbkGDqaogGy9ctgzaeH3I12ettQYWJz55i+BAZ/BRAiEAs5CC1yIzcK/8gxHC6x1yQJNOes6ehvgInOxu8fiA6l8="}],"unpackedSize":2750081},"main":"./dist/index.js","name":"@x12i/ai-profiles","type":"module","types":"./dist/index.d.ts","author":{"name":"x12i"},"engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./browser":{"types":"./dist/browser.d.ts","default":"./dist/browser.js"}},"gitHead":"0b3779046dbb6cbfda643db5a0599d0484acf1a9","license":"MIT","scripts":{"test":"npm run build && vitest run","build":"tsc && node scripts/copy-data.mjs","stats":"npm run build && node scripts/print-registry-stats.mjs","prepack":"npm run build","test:unit":"vitest run --exclude 'test/{integration,exports}.test.ts'","pack:check":"npm pack --dry-run","stats:json":"npm run build && node scripts/print-registry-stats.mjs --json","test:watch":"vitest","catalog:pull":"node scripts/sync-models-registry.mjs pull","catalog:sync":"node scripts/sync-models-registry.mjs sync","catalog:build":"node scripts/sync-models-registry.mjs build","audit:profiles":"npm run build && node scripts/simulate-profile-resolve.mjs","catalog:verify":"node scripts/sync-models-registry.mjs verify","prepublishOnly":"npm test","publish:public":"npm publish --access public","catalog:sync-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or && node scripts/extend-profiles-from-catalog.mjs && npm run registry:finish","reasoning:build":"node scripts/build-reasoning-directives.mjs","registry:finish":"npm run build && node scripts/finish-registry-e2e.mjs","catalog:fetch-or":"npm run build && node scripts/sync-models-registry.mjs fetch-or","evidence:refresh":"npm run build && node scripts/model-evidence.mjs","test:integration":"npm run build && vitest run test/integration.test.ts test/exports.test.ts","validate:linkage":"npm run build && vitest run test/bundledProfileCatalogLinkage.test.ts test/invokeCost.test.ts","verify:openrouter":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled","catalog:fetch-text":"npm run build && node scripts/sync-models-registry.mjs fetch-or","verify:openrouter:live":"npm run build && node scripts/verify-openrouter-alignment.mjs --source bundled --check-api","catalog:extend-profiles":"node scripts/extend-profiles-from-catalog.mjs","verify:catalog-coverage":"npm run build && node scripts/verify-catalog-coverage.mjs"},"version":"5.0.0","_npmUser":{"name":"x12i","email":"ami@x12i.com"},"homepage":"https://github.com/x12i/ai-profiles/tree/main/packages/ai-profiles#readme","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git","directory":"packages/ai-profiles"},"_npmVersion":"10.9.8","description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","directories":{},"maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"@x12i/env":"^4.0.1","@x12i/logxer":"^5.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.1.4","typescript":"^5.8.3","@types/node":"^22.15.21"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ai-profiles_5.0.0_1790163642567_0.5914615247803192"}}},"time":{"created":"2026-05-27T09:22:18.293Z","modified":"2026-09-23T11:40:42.885Z","1.0.0":"2026-05-27T09:22:18.519Z","1.0.2":"2026-05-27T10:10:31.988Z","1.1.0":"2026-05-27T10:46:29.220Z","1.2.0":"2026-05-27T13:49:36.842Z","1.2.1":"2026-05-27T21:07:50.669Z","1.2.2":"2026-05-27T21:32:48.918Z","1.2.3":"2026-05-27T21:33:21.162Z","1.2.5":"2026-05-28T14:55:32.727Z","1.2.7":"2026-05-28T15:05:56.143Z","1.4.0":"2026-05-28T21:19:27.724Z","1.5.0":"2026-05-29T21:29:35.347Z","1.6.0":"2026-05-29T21:39:00.940Z","1.7.0":"2026-05-30T20:48:48.010Z","1.7.2":"2026-05-31T07:22:25.543Z","1.8.0":"2026-05-31T12:36:14.979Z","2.0.0":"2026-06-01T08:12:07.399Z","2.0.1":"2026-06-01T16:29:43.126Z","2.1.0":"2026-06-02T13:57:50.874Z","2.1.1":"2026-06-04T15:48:25.090Z","2.2.0":"2026-06-05T14:21:51.125Z","2.2.2":"2026-06-05T14:28:50.427Z","3.0.0":"2026-06-05T14:48:06.638Z","3.1.0":"2026-06-05T18:27:13.135Z","3.2.0":"2026-06-05T18:37:15.361Z","3.2.1":"2026-06-08T06:40:16.827Z","3.3.0":"2026-06-08T07:32:09.414Z","3.4.0":"2026-06-08T19:44:50.276Z","3.4.1":"2026-06-27T14:01:14.136Z","4.0.0":"2026-07-07T13:16:25.080Z","4.1.0":"2026-07-08T10:53:53.433Z","4.1.1":"2026-07-08T14:42:11.018Z","4.2.0":"2026-07-09T14:12:05.258Z","4.2.1":"2026-07-10T15:57:13.206Z","4.3.0":"2026-07-10T19:08:31.973Z","4.4.0":"2026-07-12T12:18:43.936Z","4.4.1":"2026-09-15T20:05:17.135Z","4.4.2":"2026-09-15T20:40:00.513Z","4.5.0":"2026-09-23T10:31:45.361Z","5.0.0":"2026-09-23T11:40:42.657Z"},"bugs":{"url":"https://github.com/x12i/ai-profiles/issues"},"author":{"name":"x12i"},"license":"MIT","homepage":"https://github.com/x12i/ai-profiles/tree/main/packages/ai-profiles#readme","keywords":["ai","profiles","models","llm","x12i","model-selection","gemini","openai","anthropic"],"repository":{"url":"git+https://github.com/x12i/ai-profiles.git","type":"git","directory":"packages/ai-profiles"},"description":"Resolve AI profile names into concrete model choices with bundled defaults and remote JSON refresh","maintainers":[{"name":"x12i","email":"ami@x12i.com"}],"readme":"> Part of the **ai-catalog** monorepo. Root docs: [../../README.md](../../README.md) · [../../docs/MONOREPO.md](../../docs/MONOREPO.md)\r\n\r\n> **v4.4.1** adds `@x12i/ai-profiles/browser` for Vite/UI. Explore via `npm run ui` (AI Profiles tab).\r\n\r\n> **v5.0** replaces `resolveReasoning` with a target-specific directive (`applied`, `degraded`, `ignored`). `openai` means the Responses API. Pin **`\"@x12i/ai-profiles\": \"^5.0.0\"`**. See [CHANGELOG.md](CHANGELOG.md).\r\n\r\n# @x12i/ai-profiles\r\n\r\nResolve AI profile names into concrete model choices. The package ships JSON in `src/data/` as the offline fallback. By default, registry data is fetched from public assets, validated, and cached in memory.\r\n\r\n> **v4.4** ships production routing (OpenRouter default + vendor-direct), product-line `*-latest-model` vendor routes, Gemini-backed google lanes, and **unversioned** open-assets URLs. Pin **`\"@x12i/ai-profiles\": \"^4.4.0\"`**. Upload `models-profiles.json` / `models-catalog.json` to open-assets **without** `.v4` / `.v2` suffixes.\r\n>\r\n> **v4.3** adds **`isConcreteModelId`**, **`isModelProfileReference`**, and **`toOptimixerModelProfile`** so consumers do not invent concrete-vs-profile or reasoning heuristics.\r\n>\r\n> **v3.2** adds **`normalizeInvokeModel`**, **`resolveAndNormalizeInvokeModel`**, and **`resolveAndNormalizeBundledInvokeModel`** for gateway invoke wire shape.\r\n>\r\n> **v3.0** removes legacy resolution inputs: shortcuts, bare profiles, and aliases. Only four resolution forms are accepted — `profile/choice`, vendor slug, gateway wire, and `{ provider, modelId }`. See [CHANGELOG.md](CHANGELOG.md).\r\n>\r\n> **v2.0** (still relevant): every `resolveAIProfile` call must pass `catalogLane` (`\"text\"`, `\"image\"`, …). Profile keys `deepseek` and `summarization` are gone — use `vol` and `sum`.\r\n\r\n## Why AI profiles\r\n\r\nAny system that runs many different AI tasks—classification, architecture review, JSON extraction, tool-using agents—faces the same problem: **tasks are not interchangeable**. They differ in reasoning quality, cost sensitivity, latency, output shape (prose vs schema vs citations), and which provider traits matter (instruction following, long context, tool use).\r\n\r\nHardcoding one model everywhere leads to one of three failures: overpaying for simple high-volume work, under-serving hard problems with a weak model, or locking the product to a single vendor with no fallback when prices or availability change.\r\n\r\n### What a profile is\r\n\r\nAn **AI profile** is **not** a model. It is a **capability contract**: a stable name for *what kind of work* you need, not *which SKU* fulfills it.\r\n\r\nWhen a graph node or function asks for `deep`, it means: high reasoning effort, complex work—resolve that intent to a concrete `provider` + `modelId` + runtime defaults **today**, without the caller caring whether that is Claude, GPT, or Gemini. The registry (`models-profiles.json`) is the mapping layer; profiles are the interface tasks depend on.\r\n\r\n### Profiles vs choices\r\n\r\n| Layer | Role | Example |\r\n|-------|------|---------|\r\n| **Profile** | Semantic intent (cost, speed, reasoning tier, output mode, agentic behavior) | `cheap`, `balanced`, `json`, `agentic` |\r\n| **Choice** | Implementation option within that profile (provider, model, batch vs sync, cost/quality trade-off) | `default`, `google_floor`, `anthropic_cheap` |\r\n\r\nEvery profile has a **`defaultChoice`** (recommended) and typically **two alternatives** so operators can tune without changing task code:\r\n\r\n- **Provider diversity** — Anthropic (writing/reasoning), OpenAI (code/instruction following), Google (cost, long context) within the same profile.\r\n- **Cost flexibility** — e.g. `balanced` + `google_balanced` vs `anthropic_balanced` for the same “normal work” intent.\r\n- **Capability variants** — e.g. `google_deep` when the constraint is window size, not reasoning tier alone.\r\n- **Execution mode** — e.g. `cheap` + `google_floor` with `executionMode: batch` for background bulk work.\r\n- **Resilience** — swap choice or fall back within the same profile when a provider is down or rate-limited.\r\n\r\nTasks should declare **requirements** as explicit `profile/choice` keys (e.g. `cheap/default`), not model names. Use discovery APIs (`listAIProfiles`, `resolveAIProfileByTags`) to pick a profile when the caller does not already have a composite key.\r\n\r\n### Graph and stored model config\r\n\r\nGraph JSON, studio defaults, and run overrides store **profile slot strings only** — never concrete provider model ids. Each task uses a complete triple:\r\n\r\n| Slot | Example | Phase |\r\n|------|---------|-------|\r\n| `preActionModel` | `deep/default` | PRE (xynthesis / planning) |\r\n| `skillModel` | `balanced/default` | MAIN (skill gateway) |\r\n| `postActionModel` | `cheap/default` | POST (xynthesis / wrap-up) |\r\n\r\nCanonical storage form is **`profile/choice`** (separator `/`). Use **`formatProfileChoiceKey(profile, choice)`** when writing slots and **`isKnownProfileInput(input)`** (or **`isKnownProfileChoice`** / **`matchStrictProfileInput`**) before persist or execute. Always include the choice segment — even for the profile default (`cheap/default`, not bare `cheap`).\r\n\r\n**Classification SSOT (do not re-implement in consumers):**\r\n\r\n| Question | API |\r\n|----------|-----|\r\n| Is this a profile-side authoring ref? | `isModelProfileReference(value)` (or strict `isKnownProfileInput` for `profile/choice` only) |\r\n| Is this a concrete catalog model? | `isConcreteModelId(value)` |\r\n| Reasoning capability? | `isReasoningModel(value)` / `resolved.modelSignals.isReasoningModel` |\r\n| Optimixer `{ provider, model, reasoning }`? | `toOptimixerModelProfile(wire)` |\r\n\r\nNever classify concrete models via vendor keywords (`gpt-`, `claude`, `gemini`) or `looksLike*` helpers — gaps belong upstream in this package.\r\n\r\n```json\r\n\"modelConfig\": {\r\n  \"cases\": [\r\n    {\r\n      \"modelConfig\": {\r\n        \"preActionModel\": \"cyber/default\",\r\n        \"skillModel\": \"audit/default\",\r\n        \"postActionModel\": \"cheap/default\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n**At execute time**, hosts pass the stored alias triple unchanged; each phase resolves independently via `resolveAIProfile` (or `resolveAndNormalizeInvokeModel` at the gateway boundary). Do **not** pre-resolve aliases to concrete ids in graph JSON, `runtime.modelConfig`, or `aliasConfig`.\r\n\r\n**Forbidden in stored config:** legacy keys (`xynthesisModel`, `postStrategyModel`), legacy aliases (`default`, `strong`, `weak`), bare profile keys (`cheap`), concrete slugs (`openai/gpt-4o-mini`), and legacy `@` composites (`cheap@anthropic_cheap` — migrate to `cheap/anthropic_cheap` on save).\r\n\r\n### Profile catalog (bundled)\r\n\r\nProfiles are grouped by **what kind of work** they represent—not only by price/quality tier. Several axes are orthogonal (structured output, agents, research, local inference).\r\n\r\n| Profile | Category | When to use it |\r\n|---------|----------|----------------|\r\n| `cheap` | cost | High-volume, non-critical work: routing, classification, simple transforms. “Cheap” means low-cost selection, not always the absolute cheapest SKU. |\r\n| `fast` | speed | Interactive UX where latency matters more than maximum reasoning depth. |\r\n| `balanced` | standard | Default workhorse: general graph execution, coding, product logic (~80% of tasks). |\r\n| `deep` | reasoning | Hard problems: architecture, planning, analysis, code review—work that needs real reasoning, not pattern matching. |\r\n| `pro` | premium | Critical outputs where quality or a wrong answer has high downstream cost; use sparingly. |\r\n| `json` | output | Strict JSON/schema, extraction, classification—machine-readable pipelines (`outputMode: schema`, low temperature). |\r\n| `agentic` | agentic | Tool use, planning, multi-step execution (`toolPolicy` allows writes with approval). |\r\n| `research` | research | Source-heavy reading, synthesis, citations (read-only tools, web/file search). |\r\n| `cyber` | security | Threat analysis, TPRM, contract verification, security log parsing. |\r\n| `content` | creative | Prose, marketing copy, programmatic SEO, brand voice. |\r\n| `sum` | analysis | Document triage, digests, compressing very large corpora. |\r\n| `vol` | agent | Volume/economic agent lane (Flash default, Pro for hard/final). |\r\n| `coding` | engineering | Software engineering: implementation, refactors, reviews, debugging. |\r\n| `extraction` | extraction | NER, classification, taxonomy mapping, entity extraction, document labeling. |\r\n| `routing` | routing | Intent classification, record routing, workflow branching (cheapest viable). |\r\n| `local` | local | **CPU only** — runtime adapters (llama.cpp, Ollama, LM Studio, vLLM, Transformers.js, ONNX). **No OpenRouter.** |\r\n\r\n### Typical choices per profile\r\n\r\nEach profile’s `choices` in `models-profiles.json` follow a consistent pattern: **`default`** (recommended), plus variants along cost, provider family, or a specific capability.\r\n\r\n| Profile | Choices (bundled) | What the variants optimize |\r\n|---------|-------------------|------------------------------|\r\n| `cheap` | `default`, `google_floor`, `anthropic_cheap`, `deepseek_cheap`, `minimax_cheap` | Normal cheap vs batch floor vs safer Haiku vs DeepSeek volume floor vs MiniMax M2.5 |\r\n| `fast` | `default`, `google_fast`, `anthropic_fast`, `grok_fast`, `minimax_fast` | Interactive default vs lower cost vs stronger quality vs Grok vs MiniMax M2 |\r\n| `balanced` | `default`, `anthropic_balanced`, `google_balanced`, `minimax_balanced` | General default vs stronger reasoning vs lower cost vs MiniMax M2.5 |\r\n| `deep` | `default`, `openai_deep`, `google_deep`, `deepseek_pro`, `grok_flagship`, `minimax_deep` | High reasoning default vs OpenAI vs long context vs DeepSeek vs Grok vs MiniMax M2.7 |\r\n| `pro` | `default`, `claude_pro`, `anthropic_pro` | Premium default vs Claude premium vs Sonnet-level “pro-like” at lower cost |\r\n| `json` | `default`, `google_json`, `anthropic_json` | Reliable schema output vs volume/cost vs complex extraction needing reasoning |\r\n| `agentic` | `default`, `openai_agentic`, `google_agentic`, `minimax_agentic` | Agent default vs OpenAI orchestration vs lower-cost moderate agents vs MiniMax |\r\n| `research` | `default`, `openai_research`, `google_research` | Synthesis default vs highest quality vs very large context |\r\n| `cyber` | `default`, `log_analysis`, `deep_forensics` | Policy/contract review vs bulk log JSON vs max forensics |\r\n| `content` | `default`, `pseo_bulk`, `brand_voice` | Natural prose vs batch pSEO schema vs premium copy |\r\n| `sum` | `default`, `mega_context` | Fast digest (Haiku) vs multi-hundred-k token compression |\r\n| `vol` | `default`, `flash`, `pro`, `final` | Volume/economic agent lane (Flash default, Pro for hard/final) |\r\n| `local` | `llama_cpp_gguf`, `ollama`, `lmstudio_openai`, `vllm_openai`, `transformersjs_text`, `onnx_runtime` | **CPU / offline adapters** — env-probed local runtimes (no cloud LLM) |\r\n\r\nEvery **remote** profile choice must resolve to an active OpenRouter catalog id. Profiles without OpenRouter support are not included (use vendor APIs outside this registry, or add catalog coverage first). The only exception is the **`local`** profile, which is explicitly CPU / self-hosted.\r\n\r\nVendor-family profiles (`openai`, `claude`, `google`, `grok`, `deepseek`, …) also expose **`default` / `cheapest` / `best`** plus product-line **`<family>-latest-model`** choices (e.g. `google/flash-lite-latest-model`). Those choice *names* are aliases; `modelId` is always a **concrete** pinned SKU refreshed from the catalog.\r\n\r\n### OpenRouter-only and catalog lanes\r\n\r\nNot every profile is OpenRouter-backed: **`local`** is CPU/self-hosted only (no catalog entry). All other bundled remote choices map to an entry in `models-catalog.json` with an active OpenRouter slug.\r\n\r\n| Option | Purpose |\r\n|--------|---------|\r\n| `requireOpenRouterCatalog: true` | Fail resolution if the chosen model is not in the catalog with an active OpenRouter id (use for production paths that must not call vendor-direct guesses). |\r\n| `catalogLane: \"text\" \\| \"image\" \\| …` | Only resolve profiles declared for that OpenRouter browser lane. Tier profiles (`cheap`, `cyber`, `vol`, …) are **`text`**. Lanes without profiles yet (`image`, `embeddings`, `rerank`, `speech`, `transcription`, …) can be added when you introduce lane-specific profiles. |\r\n| `listAIProfiles({ catalogLane: \"text\" })` | List only lane-matching profiles. |\r\n\r\n```ts\r\nawait resolveAIProfile(\"cyber/default\", {\r\n  catalogLane: \"text\",\r\n  requireOpenRouterCatalog: true,\r\n});\r\n\r\nawait listAIProfiles({ catalogLane: \"text\" });\r\n```\r\n\r\n### Cost tiers (optional)\r\n\r\nIf you want to restrict model selection by price, you can either set an explicit `costCapPer1M`, or use a named `costTier`.\r\n\r\n```ts\r\nimport { resolveAIProfile } from \"@x12i/ai-profiles\";\r\n\r\n// Tier-based (default tiers: tier1=$0.5/1M output, tier2=$3, tier3=$10, tier4=$30)\r\nconst cheapTier1 = await resolveAIProfile(\"balanced/default\", {\r\n  catalogLane: \"text\",\r\n  costTier: \"tier1\",\r\n});\r\n\r\n// Override tiers (per-tier caps can be maxOutput/maxInput/maxBlended)\r\nconst customTier = await resolveAIProfile(\"balanced\", {\r\n  catalogLane: \"text\",\r\n  costTier: \"budget\",\r\n  costTiers: [{ key: \"budget\", cap: { maxOutput: 0.5 } }],\r\n});\r\n\r\n// Explicit caps always win if both are provided\r\nconst explicitCap = await resolveAIProfile(\"balanced\", {\r\n  catalogLane: \"text\",\r\n  costTier: \"tier1\",\r\n  costCapPer1M: { maxBlended: 2 },\r\n});\r\n```\r\n\r\n### Alternatives by cost tier\r\n\r\nWhen you want a profile’s “same intent, different price points”, use:\r\n\r\n```ts\r\nimport { resolveAIProfileWithCostAlternatives } from \"@x12i/ai-profiles\";\r\n\r\nconst { primary, alternativesByCostTier } =\r\n  await resolveAIProfileWithCostAlternatives(\"deep\", {\r\n    catalogLane: \"text\",\r\n    tiers: [\r\n      { key: \"tier1\", cap: { maxOutput: 0.5 } },\r\n      { key: \"tier2\", cap: { maxOutput: 3 } },\r\n      { key: \"tier3\", cap: { maxOutput: 10 } },\r\n    ],\r\n  });\r\n\r\n// alternativesByCostTier: [{ tier, resolved|null, reason? }, ...]\r\n```\r\n\r\n### Focus filters (catalog-derived)\r\n\r\nYou can filter choices (and optionally profile listings) by catalog-derived capabilities.\r\n\r\n```ts\r\nimport { listAIProfiles, resolveAIProfile } from \"@x12i/ai-profiles\";\r\n\r\n// Preset focus filter\r\nconst reasoningModel = await resolveAIProfile(\"deep\", {\r\n  catalogLane: \"text\",\r\n  focus: \"reasoning\",\r\n});\r\n\r\n// Explicit capability filter\r\nconst structured = await resolveAIProfile(\"json\", {\r\n  catalogLane: \"text\",\r\n  capabilityFilter: { structuredOutput: true },\r\n});\r\n\r\n// Filter profile discovery to profiles with at least one matching choice\r\nconst reasoningProfiles = await listAIProfiles({\r\n  source: \"bundled\",\r\n  focus: \"reasoning\",\r\n});\r\n```\r\n\r\n### Reasoning model flag (always communicated)\r\n\r\nEvery resolved primary and secondary includes a stable boolean:\r\n\r\n```ts\r\nconst resolved = await resolveAIProfile(\"cheap/default\", {\r\n  catalogLane: \"text\",\r\n  includeSecondary: true,\r\n});\r\n\r\nresolved.modelSignals.isReasoningModel; // boolean\r\nresolved.secondary?.modelSignals.isReasoningModel; // boolean\r\n```\r\n\r\nRegistry fields on each choice—`runtime` (`reasoningEffort`, `toolPolicy`, `outputMode`, `instructionTier`, `backend`), `modelStatus` (`verified` | `predicted`), `api` (vendor + OpenRouter slugs), and `reason`—document *why* that model backs the choice. **Pricing and capabilities** come from `models-catalog.json` at resolve time. Profile-level `requiredCapabilities` describes intent for future dynamic selection (Optimixer). Consumers use `resolveAIProfile` to materialize the merged result.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install @x12i/ai-profiles\r\n```\r\n\r\n## Public API\r\n\r\n### Profiles and registry loading\r\n\r\n| Export | Sync? | Purpose |\r\n|--------|-------|---------|\r\n| `listAIProfiles(options?)` | No (async) | Profile summaries: primary `profile` key, tags, choices, defaults |\r\n| `getAIRegistryStatistics(options?)` | No (async) | Counts: profiles, choices, providers, catalog models, linkage health |\r\n| `formatRegistryStatistics(stats)` | Yes | Human-readable summary for logs / CLI |\r\n| `loadAIProfilesRegistry(options?)` | No (async) | Raw profiles registry (`auto` / `remote` / `bundled`, 24h memory cache) |\r\n| `loadAIProfilesRegistryWithWarnings(options?)` | No (async) | Same as above, plus `warnings[]` (stale cache, bundled fallback, etc.) |\r\n| `loadModelsCatalog(options?)` | No (async) | Unified models catalog (`auto` / `remote` / `bundled`, same cache pattern as profiles) |\r\n| `loadBundledModelsCatalog()` | Yes | Package-shipped `models-catalog.json` only |\r\n| `loadBundledModelsRegistry()` | Yes | Package-shipped `models-registry.json` (linkage index) |\r\n| `listAIProfileChoices(options?)` | No (async) | List explicit `profile/choice` keys for strict pickers and stored config |\r\n| `formatProfileChoiceKey(profile, choice)` | Yes | Build canonical slot key (`cheap/default`) |\r\n| `parseProfileChoiceKey(input)` | Yes | Parse `profile/choice` (accepts `\\` as separator on input) |\r\n| `matchStrictProfileInput(registry, input)` | Yes | Resolve input to profile+choice or `invalidChoice` |\r\n| `isKnownProfileChoice(input)` | Yes (bundled only) | Whether input is a known valid `profile/choice` key |\r\n| `isKnownProfileInput(input)` | Yes (bundled only) | Profile-intent gate: known `profile/choice` → `true`; concrete model ids → `false` |\r\n| `isKnownProfileOrShortcut(input)` | Yes (bundled only) | Alias of `isKnownProfileInput` (shortcuts are not supported) |\r\n| `isModelProfileReference(input)` | Yes (bundled only) | Authoring gate: known `profile/choice`, bare profile key, or legacy `profile@choice` |\r\n| `isConcreteModelId(input)` | Yes (bundled only) | Catalog-backed concrete model gate (no vendor-keyword heuristics) |\r\n| `toOptimixerModelProfile(input)` | Yes (bundled only) | `{ provider, model, reasoning }` from catalog wire (optional profile resolve) |\r\n| `isKnownProfileChoiceInput(registry, input)` | Yes | Same as above with an explicit registry |\r\n| `getBundledRegistry()` | Yes | Sync bundled profiles registry (no network) |\r\n| `resolveBundledAIProfile(input, options)` | Yes | Strict `profile/choice` → model, pricing, runtime (`source: \"bundled\"`) |\r\n| `resolveBundledInput(input, options)` | Yes | Unified sync resolver: `profile/choice` → registry; vendor slug / gateway wire / `{ provider, modelId }` → catalog |\r\n| `resolveInput(input, options)` | No (async) | Unified async resolver (same order as `resolveBundledInput`; `source: \"auto\" \\| \"remote\" \\| \"bundled\"`) |\r\n| `resolveBundledCatalogModel(input, options?)` | Yes | Sync strict catalog resolution (exact/high confidence only) |\r\n| `ensureConcreteModel(input, options?)` | Yes | String normalizer: `profile/choice` (strict) or concrete model (catalog best-effort) → invoke-time `{ provider, modelId }` |\r\n| `normalizeInvokeModel(input, options?)` | Yes | Idempotent gateway invoke tuple: strips `openrouter/` display slugs; rejects unresolved `profile/choice` aliases |\r\n| `resolveAndNormalizeInvokeModel(alias, options)` | No (async) | `resolveAIProfile` → `normalizeInvokeModel` for MAIN / handoff paths |\r\n| `resolveAndNormalizeBundledInvokeModel(alias, options)` | Yes | Bundled `resolveAIProfile` → `normalizeInvokeModel` (no network) |\r\n| `calculateInvokeCost(input, options?)` | No (async) | Token → USD from catalog pricing (`costStatus: \"priced\" \\| \"unpriced\"`) |\r\n| `calculateInvokeCostSync(input, options?)` | Yes | Bundled offline cost calculator |\r\n| `calculateInvokeCostFromRecord(record, options?)` | No (async) | Activix snake_case usage record → USD |\r\n| `buildInvokePricingRecord(input)` | Yes | Build Activix-compatible invoke billing record |\r\n| `lookupBundledCatalogCaps({ provider, modelId })` | Yes | Sync quick caps + pricing summary from bundled catalog |\r\n| `lookupBundledCatalogModel(slug, options?)` | Yes | Sync rich catalog snapshot for a slug (pricing, reasoning, modalities); returns `undefined` on miss |\r\n| `resolveBundledCatalogModelDetails(slug, options?)` | Yes | Same as above but throws `UNKNOWN_MODEL` on miss |\r\n| `resolveCatalogModelDetails(slug, options?)` | No (async) | Rich catalog snapshot with optional remote catalog refresh |\r\n| `isReasoningModel(input, options?)` | Yes | `true`/`false` for supported inputs (throws `UNKNOWN_MODEL` on unknown concrete models) |\r\n| `resolveReasoning({ target, model, effort })` | Yes | Bundled directive for `openrouter`, `bedrock`, or `openai` (Responses). `outcome` is `applied`, `degraded`, or `ignored`. Throws `AIProfilesError` for unknown models and incomplete mappings |\r\n| `mergeReasoningBody(targetBody, directiveBody)` | Yes | Deep-merge a directive body. Objects merge, arrays and scalars replace, inputs are not mutated |\r\n| `resolveAIProfile(input, options?)` | No (async) | Resolve an explicit `profile/choice` key → model, pricing, runtime. Pass `includeSecondary: true` to attach `secondary`; `includeCatalog: true` to attach full `catalogModel`. |\r\n| `resolveSecondaryModel(input, options?)` | No (async) | Resolve primary choice + optional companion `secondary` from profile `secondary` refs |\r\n| `getSecondaryForResolvedProfile(resolved, registry, catalog?)` | Yes | Secondary for an already-resolved primary (no extra I/O when catalog is passed) |\r\n| `listProfileSecondaries(profileKey, registry)` | Yes | List per-choice `secondary` declarations on a profile |\r\n| `resolveAIProfileByTags(tags, options?)` | No (async) | Pick best profile by weighted tags (`tagMatch`, excludes discovery by default), then resolve |\r\n| `listAICatalogModels(options?)` | No (async) | Filter/rank catalog models by tags, provider, status, modalities, tools/reasoning; attaches intent `profileChoices` |\r\n| `resolveCatalogModelByTags(tags, options?)` | No (async) | Best catalog model by weighted tags (+ optional profile branch map) |\r\n| `scoreProfileTags` / `rankProfilesByTags` | Yes | Weighted tag scoring for discovery and custom UIs |\r\n| `AIProfilesError` / `AIProfilesErrorCode` | — | Typed errors (`UNKNOWN_PROFILE`, `INVOKE_MODEL_ALIAS_AT_GATEWAY`, `INVOKE_MODEL_SHAPE_INVALID`, …) |\r\n\r\n### Model identity (vendor + model strings)\r\n\r\nUse these when callers pass **raw model ids or OpenRouter slugs**, not profile names.\r\n\r\n| Export | Sync? | Purpose |\r\n|--------|-------|---------|\r\n| `resolveCatalogModel(input, options?)` | No (async) | Resolve a model SKU or OpenRouter slug via `models-catalog.json` (strict; no profile intent) |\r\n| `resolveModelIdentity(input, options?)` | Yes | Given a bare id or `vendor/slug`, return `{ provider, modelId, invocation? }` via bundled registry + catalog fallback. Returns `null` for known `profile/choice` keys. |\r\n| `buildModelInvocation(provider, modelId)` | Yes | `{ direct, openrouter }` endpoints for a provider hint + model string |\r\n| `buildDirectInvocation(provider, modelId)` | Yes | Vendor-direct `{ provider, modelId }`; splits prefixed slugs for all vendors |\r\n| `buildOpenRouterModelId(provider, modelId)` | Yes | Build an OpenRouter slug (`openai/gpt-5.4`) from registry fields |\r\n| `parseDirectFromOpenRouterSlug(slug, family?)` | Yes | Split `vendor/model` → direct slice (`custom` + bare id when vendor is not a first-class provider) |\r\n| `normalizeAnthropicVersionSlug(slug)` | Yes | Dotted minor versions for Anthropic (`4-6` → `4.6`) |\r\n| `buildRegistryKey(provider, modelId)` | Yes | Stable registry key (`vendor:…`) used in `models-registry.json` |\r\n| `matchOpenRouterCatalog(provider, modelId, index)` | Yes | Match a choice against a catalog index |\r\n| `lookupInvocationForChoice(registry, provider, modelId)` | Yes | Lookup prebuilt invocation from `models-registry.json` |\r\n\r\n**Prefixed slugs:** `buildDirectInvocation(\"meta-llama\", \"meta-llama/llama-3.1-8b-instruct\")` yields `{ provider: \"meta-llama\", modelId: \"llama-3.1-8b-instruct\" }`. Host paths keep the nested id when the provider hint differs (e.g. Together: `together` + `meta-llama/Llama-3.3-70b-instruct`). Bare and prefixed Anthropic inputs normalize to the same direct and OpenRouter ids.\r\n\r\n### Routing, validation, and maintainer tooling\r\n\r\n| Export | Sync? | Purpose |\r\n|--------|-------|---------|\r\n| `resolvePreferOpenRouter(explicit?)` | Yes | Resolve OpenRouter vs vendor-direct routing (option → env → default) |\r\n| `applyModelRouting(choice, backend, preferOpenRouter, catalog?)` | Yes | Turn a registry choice into invoke-time `{ provider, modelId, routing }` (same rules as `resolveAIProfile`) |\r\n| `normalizeGatewayWireId(input)` | Yes | `openrouter/openai/gpt-5.5` → `{ provider: \"openrouter\", modelId: \"openai/gpt-5.5\" }` (profile keys like `cheap/default` are not gateway wires) |\r\n| `validateBundledProfileVendorCoverage(options?)` | Yes | Advisory report of leading-vendor coverage per profile |\r\n| `validateBundledProfileModalityCoverage(options?)` | Yes | Advisory report of profile choice vs required input/output media |\r\n| `isProfileVendorTrimReady(profile, allowedProviders)` | Yes | Whether auto-pick can satisfy a vendor filter |\r\n| `isProfileModalityCoverageReady(profileKey)` | Yes | Whether a profile has at least one modality-compatible choice |\r\n| `listFaultyProfileChoices()` | Yes | Profile choices with faulty OpenRouter catalog linkage |\r\n| `buildModelsRegistry`, `verifyOpenRouterAlignment`, … | Yes | Catalog/registry build and alignment (see scripts below) |\r\n\r\nRegistry JSON lives in four bundled assets:\r\n\r\n| File | Schema | Role |\r\n|------|--------|------|\r\n| `models-profiles.json` | `x12i.ai-profiles.model-registry.v4` | Profile intent, lean choices referencing catalog — **no embedded pricing** |\r\n| `models-catalog.json` | `x12i.ai-profiles.models-catalog` (v2.0.0) | Per-model pricing, capabilities, `modelFamily` (OpenRouter-normalized) |\r\n| `models-registry.json` | `x12i.ai-profiles.models-registry` | Built linkage index: vendor keys, OpenRouter slugs, `invocation` pairs |\r\n\r\n**v4 contract:** Each profile choice stores `provider` + **vendor-native** `modelId` as a pointer into `models-catalog.json`, which owns the `direct` and `openrouter` listings. Choice `displayName` / `description` are optional (hydrated from catalog). Never embed `api`, `defaultTransport`, or OpenRouter slugs on profile choices. Vendor-family profiles (`vendorFamily: true`) expose `default` / `cheapest` / `best` / `<family>-latest-model` without hijacking concrete slugs like `openai/gpt-4`. Run `npm run registry:finish` to strip legacy fields, verify linkage, and rebuild `models-registry.json`.\r\n\r\nValidate with `src/data/models-profiles.schema.json`. Maintainer scripts: `npm run catalog:extend-profiles`, `npm run registry:finish` (catalog supplement + verified defaults + linkage rebuild).\r\n\r\n## Sync bundled resolution (predict / invoke)\r\n\r\nFor consumers that need **no network** and a single entry point:\r\n\r\n```ts\r\nimport {\r\n  ensureConcreteModel,\r\n  isKnownProfileInput,\r\n  isReasoningModel,\r\n  mergeReasoningBody,\r\n  resolveReasoning,\r\n  resolveBundledInput,\r\n  resolveBundledAIProfile,\r\n  applyModelRouting,\r\n  normalizeGatewayWireId,\r\n  lookupBundledCatalogCaps,\r\n  getBundledRegistry,\r\n} from \"@x12i/ai-profiles\";\r\n\r\n// Four supported resolution forms:\r\n// 1. profile/choice  → registry (strict)\r\n// 2. vendor slug     → catalog (strict in resolveBundledCatalogModel; best-effort in ensureConcreteModel)\r\n// 3. gateway wire    → catalog\r\n// 4. { provider, modelId } → catalog\r\n\r\nensureConcreteModel(\"cheap/default\");\r\n// → { provider: \"openrouter\", modelId: \"deepseek/deepseek-v4-flash\", profileChoice: { profile: \"cheap\", choice: \"default\" } }\r\n\r\nensureConcreteModel(\"google/gemini-2.5-flash-lite\");\r\n// → { provider: \"openrouter\", modelId: \"google/gemini-2.5-flash-lite\", matchConfidence: \"exact\" }\r\n\r\nensureConcreteModel(\"openrouter/openai/gpt-5.5\");\r\n// → { provider: \"openrouter\", modelId: \"openai/gpt-5.5\" }\r\n\r\nif (isKnownProfileInput(\"cheap/default\")) {\r\n  const resolved = resolveBundledInput(\"cheap/default\", { catalogLane: \"text\" });\r\n  // resolved.provider is never \"cheap\"\r\n}\r\n\r\nconst wire = normalizeGatewayWireId(\"openrouter/openai/gpt-5.5\");\r\n// → { provider: \"openrouter\", modelId: \"openai/gpt-5.5\" }\r\n\r\nisReasoningModel(\"deep/default\"); // true\r\nisReasoningModel(\"cheap/default\"); // true (catalog marks gemini-2.5-flash-lite reasoning-capable)\r\nisReasoningModel(\"google/gemini-2.5-flash-lite\"); // false\r\n\r\nconst resolved = resolveBundledAIProfile(\"deep/default\", { catalogLane: \"text\" });\r\nlet prompt = \"Classify this ticket.\";\r\nlet body: Record<string, unknown> = { messages: [{ role: \"user\", content: prompt }] };\r\nconst directive = resolveReasoning({\r\n  target: \"openrouter\",\r\n  model: resolved.invocation.openrouter.modelId,\r\n  effort: resolved.runtime.reasoningEffort ?? \"medium\",\r\n});\r\n// Skip this block when the caller already set reasoning. Explicit config wins.\r\nif (directive.outcome !== \"ignored\") {\r\n  if (directive.model) body.model = directive.model;\r\n  if (directive.promptPrefix) prompt = directive.promptPrefix + prompt;\r\n  body = mergeReasoningBody(body, directive.body);\r\n}\r\n\r\nconst caps = lookupBundledCatalogCaps({\r\n  provider: \"openrouter\",\r\n  modelId: \"google/gemini-2.5-flash-lite\",\r\n});\r\n\r\nconst registry = getBundledRegistry();\r\nconst routed = applyModelRouting(\r\n  registry.profiles.cheap.choices.default,\r\n  \"openrouter\",\r\n  true,\r\n);\r\n```\r\n\r\n`reasoningTextPaths` and `usage.reasoningTokenPaths` are JSON Pointers. `*` means every array element. Both lists are ordered alternatives: use the first path that yields a value, and do not sum usage paths. `streamReasoningKeys` are exact keys on a flat delta (`choices[*].delta` for OpenRouter). `streamReasoningPaths` are pointers into one stream event (Bedrock `contentBlockDelta`, or an OpenAI `response.reasoning_summary_text.delta` event). A directive fills only one of those stream fields. `stripFromHistoryPaths` lists fields that are safe to delete from a replayed message. OpenRouter `reasoning_details`, Bedrock `reasoningContent` signatures, and Responses reasoning items stay. `stripThinkTags` separates a whole `<think>...</think>` section from answer text, including tags split across chunks; an unclosed section at end of stream stays out of the answer. It is false unless a mapping says the model puts thoughts in answer text.\r\n\r\n`\"openai\"` is `POST https://api.openai.com/v1/responses`. Do not send Chat Completions `reasoning_effort`. The resolver cannot see `max_output_tokens`, Bedrock `maxTokens`, or sampling parameters. Those constraints are on the mapping provenance in `reasoning-directives.json` and in [CHANGELOG.md](CHANGELOG.md). Coverage for 5.0.0 is that changelog, not every model on a provider.\r\n\r\nFor the same profile-first order with optional remote registry/catalog (`source: \"auto\"` / `\"remote\"` / `\"bundled\"`), use **`resolveInput`**:\r\n\r\n```ts\r\nimport { resolveInput } from \"@x12i/ai-profiles\";\r\n\r\nawait resolveInput(\"cheap/default\", { catalogLane: \"text\", source: \"auto\" });\r\nawait resolveInput(\"google/gemma-3-4b-it\", { source: \"bundled\" });\r\n```\r\n\r\n`isKnownProfileInput` / `isKnownProfileChoice` return **false** for bare profiles (`cheap`), legacy shortcuts (`cheapest`), and concrete slugs (`google/gemini-2.5-flash-lite`).\r\n\r\n## Basic usage\r\n\r\n```ts\r\nimport {\r\n  listAIProfiles,\r\n  listAIProfileChoices,\r\n  isKnownProfileInput,\r\n  resolveAIProfile,\r\n  resolveCatalogModel,\r\n  resolveInput,\r\n} from \"@x12i/ai-profiles\";\r\n\r\nconst profiles = await listAIProfiles();\r\nconst choices = await listAIProfileChoices();\r\n\r\n// Strict lookup key: profile/choice\r\nconst model = await resolveAIProfile(\"cheap/default\", { catalogLane: \"text\" });\r\n// Or unified async: await resolveInput(\"cheap/default\", { catalogLane: \"text\" });\r\n\r\nconsole.log(model.profile); // canonical primary key: cheap\r\nconsole.log(model.provider); // \"openrouter\" by default for remote profiles\r\nconsole.log(model.modelId); // \"google/gemini-2.5-flash-lite\"\r\nconsole.log(model.routing); // \"openrouter\" | \"direct\"\r\nconsole.log(model.pricing); // from models-catalog.json\r\nconsole.log(model.modelStatus); // verified | predicted\r\nconsole.log(model.requiredCapabilities); // profile intent\r\nconsole.log(model.capabilities); // contextWindow, supportsTools, …\r\nconsole.log(model.instructionTier);\r\nconsole.log(model.backend);\r\n\r\n// SKU lookup (catalog), not a profile\r\nconst sku = await resolveCatalogModel(\"google/gemini-2.5-flash-lite\", {\r\n  source: \"bundled\",\r\n  preferOpenRouter: false,\r\n});\r\n\r\nconsole.log(isKnownProfileInput(\"cheap/default\")); // true\r\nconsole.log(isKnownProfileInput(\"cheap\")); // false\r\n```\r\n\r\n## Registry statistics\r\n\r\nUse **`getAIRegistryStatistics()`** for discovery dashboards, CI summaries, and operator tooling. It loads profiles and the models catalog with the same `source` / `refresh` options as `resolveAIProfile`, then returns structured counts.\r\n\r\n```ts\r\nimport {\r\n  formatRegistryStatistics,\r\n  getAIRegistryStatistics,\r\n} from \"@x12i/ai-profiles\";\r\n\r\nconst { statistics, warnings } = await getAIRegistryStatistics({\r\n  source: \"bundled\", // or \"auto\" | \"remote\"\r\n  includeCatalog: true,\r\n  includeLinkage: true,\r\n});\r\n\r\nconsole.log(statistics.profiles.total);\r\nconsole.log(statistics.profiles.providers);\r\nconsole.log(statistics.catalog?.totalModels);\r\nconsole.log(statistics.linkage?.faulty);\r\n\r\nconsole.log(formatRegistryStatistics(statistics));\r\n```\r\n\r\nCLI (after build): `npm run stats` (text) or `npm run stats:json`.\r\n\r\n## Supported resolution inputs\r\n\r\nResolution accepts exactly **four** input forms:\r\n\r\n| Form | Example | Resolver |\r\n|------|---------|----------|\r\n| Profile + choice | `cheap/default` | Registry (`resolveAIProfile`, `resolveBundledAIProfile`) |\r\n| Vendor slug | `google/gemini-2.5-flash-lite` | Catalog (`resolveCatalogModel`, `resolveBundledCatalogModel`) |\r\n| Gateway wire | `openrouter/openai/gpt-5.5` | Catalog (gateway normalization) |\r\n| Object | `{ provider: \"google\", modelId: \"gemini-2.5-flash-lite\" }` | Catalog |\r\n\r\n**Not supported:** shortcuts (`cheapest`), bare profiles (`cheap`), aliases (`cost-sensitive`). Use discovery to pick a profile, then resolve an explicit `profile/choice`.\r\n\r\n**Tags exist to filter.** Short codes on profiles and catalog models (`cyb`, `eco`, `cod`, `oai`, …). Get the tag list, then filter:\r\n\r\n```ts\r\nimport {\r\n  listAIProfileTags,       // all allowed tags (+ labels)\r\n  listUsedAIProfileTags,   // tags present in the loaded registry\r\n  listAIProfiles,          // filter profiles by tags\r\n  resolveAIProfileByTags,  // pick best matching profile → resolve it\r\n  listAICatalogModels,     // filter catalog models by tags\r\n  resolveCatalogModelByTags, // pick best matching model (+ optional profile branch)\r\n} from \"@x12i/ai-profiles\";\r\n\r\nlistAIProfileTags();                              // glossary for pickers\r\nawait listUsedAIProfileTags({ source: \"bundled\" }); // what's actually used\r\n\r\n// Filter: keep profiles that have these tags\r\nawait listAIProfiles({ tags: [\"cyb\", \"eco\"], tagMatch: \"any\" });  // any of\r\nawait listAIProfiles({ tags: [\"cyb\", \"sec\"], tagMatch: \"all\" });  // all of\r\n\r\n// Filter + resolve in one step\r\nawait resolveAIProfileByTags([\"cyb\", \"eco\", \"ds\"], { catalogLane: \"text\" });\r\n\r\n// Catalog models (tags are derived + inherited during registry:finish)\r\nawait listAICatalogModels({\r\n  tags: [\"cod\", \"eco\"],\r\n  tagMatch: \"all\",\r\n  provider: \"google\",\r\n  status: \"active\",\r\n  supportsTools: true,\r\n});\r\nawait resolveCatalogModelByTags([\"cod\", \"eco\"], { catalogLane: \"text\" });\r\n```\r\n\r\n`tagMatch: \"any\"` (default) = match if any requested tag is present. `\"all\"` = every requested tag must be present. Results are ranked by **weighted** tag score (domain/task 3, capability 2, tier/vendor 1, `wf` 0.25), then coverage ratio, then fewer tags.\r\n\r\n**Discovery exclusion:** by default, tag list/resolve pools skip `vendorFamily` and `category: \"discovery\"` profiles (`catalog`, `claude`, `grok`, …). Pass `includeDiscovery: true`, or include the `vnd` tag, to include them.\r\n\r\nInput is normalized (trimmed, lowercased) before matching. Composite keys accept **`/` or `\\`** as the separator (`cyber\\default` → `cyber/default`). **Profile and choice segment names treat `-` and `_` as equivalent** (`cheap/google-floor` → `cheap/google_floor`).\r\n\r\n### Examples\r\n\r\n```ts\r\n// Composite key\r\nawait resolveAIProfile(\"balanced/default\", { catalogLane: \"text\" });\r\n\r\n// Tag-based pick (partial overlap OK) → explicit profile/choice\r\nawait resolveAIProfileByTags([\"cyb\", \"eco\", \"ds\"], { catalogLane: \"text\" });\r\n\r\n// Model SKU → catalog, not a profile\r\nawait resolveCatalogModel(\"google/gemini-2.5-flash-lite\", { source: \"bundled\" });\r\n\r\n// String normalizer for invoke-time routing\r\nensureConcreteModel(\"cheap/default\");\r\nensureConcreteModel(\"google/gemini-2.5-flash-lite\");\r\n```\r\n\r\n`listAIProfiles()` returns profile keys, tags, and choices for pickers. `listAIProfileChoices()` lists every valid `profile/choice` composite key.\r\n\r\n## Invoke wire shape (gateway / HTTP)\r\n\r\nDownstream packages (`ai-tasks`, `ai-skills`, `ai-gateway`, `xynthesis`, `optimixer`) must agree on what is sent on the wire **after** semantic resolution. **Stored graph config** uses `profile/choice` aliases; **gateway / HTTP** uses the invoke tuple below.\r\n\r\n### Display slug\r\n\r\nA **display slug** is a single string with an `openrouter/` prefix for human-readable UI and logs, e.g. `openrouter/deepseek/deepseek-v4-pro`. Studio pickers, plan previews, and Activix run logs may show this form. It is **not** the shape passed to `ai-gateway` catalog lookup or OpenRouter HTTP — normalize before those boundaries.\r\n\r\n### Invoke tuple\r\n\r\nAn **invoke tuple** is `{ provider, model, routing }` where `provider` is `\"openrouter\"` (or a vendor for direct routing) and `model` is the **bare** vendor/model slug without a gateway prefix, e.g. `{ provider: \"openrouter\", model: \"deepseek/deepseek-v4-pro\", routing: \"openrouter\" }`. This is what `ai-gateway` uses for catalog lookup and what OpenRouter HTTP expects.\r\n\r\nCall **`normalizeInvokeModel`** at every gateway boundary (idempotent). Profile intent still goes through **`resolveAIProfile`** first, or use **`resolveAndNormalizeInvokeModel`** / **`resolveAndNormalizeBundledInvokeModel`** for the combined path.\r\n\r\n| Export | Sync? | Purpose |\r\n|--------|-------|---------|\r\n| `normalizeInvokeModel(input, options?)` | Yes | Display slug or invoke object → canonical invoke tuple; rejects unresolved `profile/choice` |\r\n| `resolveAndNormalizeInvokeModel(alias, options)` | No (async) | `resolveAIProfile` → `normalizeInvokeModel` |\r\n| `resolveAndNormalizeBundledInvokeModel(alias, options)` | Yes | Bundled `resolveAIProfile` → `normalizeInvokeModel` (no network) |\r\n\r\n```ts\r\nimport {\r\n  normalizeInvokeModel,\r\n  resolveAndNormalizeInvokeModel,\r\n  resolveAndNormalizeBundledInvokeModel,\r\n} from \"@x12i/ai-profiles\";\r\n\r\n// Display slug → invoke tuple (string or { model } object)\r\nnormalizeInvokeModel(\"openrouter/deepseek/deepseek-v4-pro\");\r\nnormalizeInvokeModel({ model: \"openrouter/deepseek/deepseek-v4-pro\" });\r\n// → { provider: \"openrouter\", model: \"deepseek/deepseek-v4-pro\", routing: \"openrouter\", displaySlug: \"...\" }\r\n\r\n// Already-correct tuple → unchanged (idempotent)\r\nnormalizeInvokeModel({ provider: \"openrouter\", model: \"deepseek/deepseek-v4-pro\" });\r\n\r\n// Unresolved profile/choice at gateway → INVOKE_MODEL_ALIAS_AT_GATEWAY\r\nnormalizeInvokeModel(\"cheap/default\");\r\nnormalizeInvokeModel({ model: \"cheap/default\" }); // same error\r\n\r\n// Profile/choice → resolve, then normalize (gateway catalog-lookup tuple)\r\nawait resolveAndNormalizeInvokeModel(\"cyber/deep_forensics\", {\r\n  catalogLane: \"text\",\r\n  preferOpenRouter: true,\r\n});\r\n// → { provider: \"openrouter\", model: \"deepseek/deepseek-v4-pro\", routing: \"openrouter\", ... }\r\n\r\n// Sync bundled variant (tests, predict paths)\r\nresolveAndNormalizeBundledInvokeModel(\"cyber/deep_forensics\", {\r\n  catalogLane: \"text\",\r\n  preferOpenRouter: true,\r\n});\r\n```\r\n\r\n**Error codes** (on `AIProfilesError.code`):\r\n\r\n| Code | When |\r\n|------|------|\r\n| `INVOKE_MODEL_ALIAS_AT_GATEWAY` | `profile/choice` reached `normalizeInvokeModel` without prior `resolveAIProfile` |\r\n| `INVOKE_MODEL_SHAPE_INVALID` | Empty model, missing provider, or unparseable composite after normalization |\r\n\r\n`allowAlias: true` exists for rare internal paths; **gateway and HTTP callers should not use it** — resolve aliases first.\r\n\r\n## Sync validation (bundled registry)\r\n\r\nUse **`isKnownProfileInput(input)`** (or **`isKnownProfileChoice`**) before run/execute or on first paint when the remote registry may not be loaded yet. It reads the **bundled** JSON only (no network, no in-memory cache race).\r\n\r\n```ts\r\nconst canRun =\r\n  isKnownProfileInput(aiProfileKey) &&\r\n  isKnownProfileInput(fallbackKey);\r\n```\r\n\r\nAccepts **valid `profile/choice` keys only**. Unknown strings return `false`.\r\n\r\nAfter validation, call `resolveAIProfile` (usually `source: \"auto\"` or `\"bundled\"`) to get the canonical `resolved.profile` and the concrete model details.\r\n\r\n### UI guidance\r\n\r\n- **Profile picker**: `await listAIProfiles()` → use each row’s `profile` as the value; show `displayName` as the label.\r\n- **Choice picker**: `await listAIProfileChoices({ profile: \"cheap\" })` or list choices from the profile summary.\r\n- **Stored config**: store `profile/choice` composite keys (e.g. `cheap/default`).\r\n\r\n## Pick a specific model implementation (choice)\r\n\r\n```ts\r\nconst model = await resolveAIProfile(\"cheap/anthropic_cheap\", {\r\n  catalogLane: \"text\",\r\n});\r\n```\r\n\r\n## OpenRouter vs vendor-direct routing\r\n\r\nRemote profiles (anything that is not `local` / on-device) can be resolved for **OpenRouter** or for a **vendor API directly**. Local CPU profiles are always returned as-is.\r\n\r\n### Resolution priority\r\n\r\n1. **`options.preferOpenRouter`** when passed to `resolveAIProfile`\r\n2. **`PREFER_OPENROUTER`** in `.env` / process env\r\n3. **Default: `true`** (OpenRouter)\r\n\r\nSupported today: **OpenRouter** and **vendor-direct**. Azure and AWS routing are not supported yet.\r\n\r\n### OpenRouter (default)\r\n\r\n```ts\r\nconst resolved = await resolveAIProfile(\"cheap/default\", { catalogLane: \"text\" });\r\n// or explicitly:\r\nawait resolveAIProfile(\"cheap/default\", { catalogLane: \"text\", preferOpenRouter: true });\r\n\r\n// resolved.provider === \"openrouter\"\r\n// resolved.modelId === \"google/gemini-3.1-flash-lite\"\r\n// resolved.routing === \"openrouter\"\r\n// resolved.backend === \"openrouter\"\r\n```\r\n\r\nRegistry choices store vendor-native ids (e.g. `gpt-5.4`, `gemini-2.5-flash-lite`). When routing via OpenRouter, this package rewrites them to full slugs: `{vendor}/{model}` (e.g. `openai/gpt-5.4`, `anthropic/claude-sonnet-4.6`). Anthropic version segments are normalized to dotted form (`4.6`, not `4-6`).\r\n\r\nThis applies to any `profile/choice` input that resolves to a remote profile choice.\r\n\r\n### Avoid hardcoded OpenRouter slugs (especially dated previews)\r\n\r\nDo **not** copy OpenRouter slugs into graph JSON or app config (`preActionModel`, `skillModel`, `postActionModel`, env vars, etc.) and do **not** use `canonicalSlug` from the catalog for API calls. OpenRouter retires dated preview ids (e.g. `google/gemini-2.5-flash-lite-preview-06-17`) while stable ids remain (`google/gemini-2.5-flash-lite`).\r\n\r\n```ts\r\n// Good — store profile/choice; resolve at execute time\r\npreActionModel: \"cheap/default\";\r\nskillModel: \"balanced/default\";\r\npostActionModel: \"cheap/default\";\r\n\r\nconst pre = await resolveAIProfile(\"cheap/default\", { catalogLane: \"text\" });\r\n// pre.modelId → \"google/gemini-2.5-flash-lite\" (concrete id only after resolution)\r\n\r\n// Bad — concrete slug in stored config (stale when catalog moves)\r\npreActionModel: \"google/gemini-2.5-flash-lite-preview-06-17\";\r\n```\r\n\r\nUse `assertStableOpenRouterSlug(slug)` before outbound OpenRouter calls when you must accept external slug strings. Run `npm run verify:openrouter:live` in CI to catch catalog drift.\r\n\r\n### Vendor-direct\r\n\r\n```ts\r\nconst resolved = await resolveAIProfile(\"cheap/default\", {\r\n  catalogLane: \"text\",\r\n  preferOpenRouter: false,\r\n});\r\n\r\n// resolved.provider === \"google\"\r\n// resolved.modelId === \"gemini-2.5-flash-lite\"\r\n// resolved.routing === \"direct\"\r\n// resolved.backend === \"custom\"\r\n```\r\n\r\nUse this when calling OpenAI, Anthropic, Google, etc. APIs directly instead of through OpenRouter.\r\n\r\n### Rich catalog data (pricing, reasoning, modalities)\r\n\r\nUse the right entry point for your input shape:\r\n\r\n| Input | Function | Returns |\r\n|-------|----------|---------|\r\n| OpenRouter / vendor slug | `resolveCatalogModelDetails(slug)` or sync `lookupBundledCatalogModel(slug)` | `ResolvedCatalogModel` |\r\n| `profile/choice` | `resolveAIProfile(key, { catalogLane, includeCatalog: true })` | `ResolvedAIProfile` + `catalogModel` |\r\n| Post-resolve slug check | `requireCatalogModel(slug, { includeDetails: true })` | presence + optional `catalogModel` |\r\n\r\n```ts\r\n// Slug → full catalog enrichment\r\nconst model = await resolveCatalogModelDetails(\"google/gemini-2.5-flash-lite\", {\r\n  source: \"bundled\",\r\n});\r\nmodel.pricing?.input;                    // flattened per-1M rates\r\nmodel.catalogPricing?.imageInput;        // raw OpenRouter pricing slice\r\nmodel.contextWindow;                     // e.g. 1048576\r\nmodel.maxCompletionTokens;               // e.g. 65536 (catalog maxCompletionTokens)\r\nmodel.limits?.maxOutputTokens;           // same as maxCompletionTokens\r\nmodel.modelSignals.isReasoningModel;     // true\r\nmodel.modelSignals.maxOutputTokens;      // same as maxCompletionTokens\r\nmodel.catalogCapabilities?.toolCalling;  // true\r\nmodel.invocation.openrouter?.modelId;    // \"google/gemini-2.5-flash-lite\"\r\nmodel.capabilities?.supportsOpenRouterReasoningParam; // legacy hint; use resolveReasoning for the wire body\r\n```\r\n\r\n### Invoke cost (Activix / FuncX)\r\n\r\n```ts\r\nimport { calculateInvokeCost, buildInvokePricingRecord } from \"@x12i/ai-profiles\";\r\n\r\nconst cost = await calculateInvokeCost(\r\n  {\r\n    model: \"cheap/default\",\r\n    tokens: { prompt: 1000, completion: 500 },\r\n  },\r\n  { catalogLane: \"text\", bundledOnly: true, includeBreakdown: true },\r\n);\r\n// cost.costUsd, cost.costStatus: \"priced\", cost.breakdown\r\n\r\n// Profile/choice catalog validation\r\nconst required = await requireCatalogModel(\"cheap/default\", {\r\n  catalogLane: \"text\",\r\n  resolveProfileKeys: true,\r\n  bundledOnly: true,\r\n});\r\n// required.found, required.modelId, required.profileChoice\r\n```\r\n\r\nSee `.docs/AI-PROFILES-ACTIVIX-COST-CONTRACT.md` for Activix migration wire.\r\n\r\n**Catalog SOT:** do not use ai-tools' small OpenRouter index for invoke gating — use `requireCatalogModel` / `validateBundledProfileCatalogLinkage` on this package (`npm run validate:linkage`).\r\n\r\n```ts\r\n// Profile → same enrichment on catalogModel\r\nconst resolved = await resolveAIProfile(\"cheap/default\", {\r\n  catalogLane: \"text\",\r\n  includeCatalog: true,\r\n  includeCatalogEntry: true, // attach full models-catalog.json row\r\n});\r\nresolved.catalogModel?.pricing;\r\nresolved.catalogModel?.catalogEntry;\r\n```\r\n\r\n### Env fallback\r\n\r\nSet in `.env` or the process environment:\r\n\r\n```env\r\nPREFER_OPENROUTER=1    # or true, yes, on  → OpenRouter\r\nPREFER_OPENROUTER=0    # or false, no, off → vendor-direct\r\n```\r\n\r\nWhen `preferOpenRouter` is omitted from `resolveAIProfile`, the env value is used. An explicit option always wins over env.\r\n\r\n```ts\r\nprocess.env.PREFER_OPENROUTER = \"0\";\r\nawait resolveAIProfile(\"cheap/default\", { catalogLane: \"text\" }); // vendor-direct\r\n\r\nawait resolveAIProfile(\"cheap/default\", { catalogLane: \"text\", preferOpenRouter: true }); // still OpenRouter\r\n```\r\n\r\nHelper exports:\r\n\r\n```ts\r\nimport {\r\n  resolvePreferOpenRouter,\r\n  buildOpenRouterModelId,\r\n  buildModelInvocation,\r\n  resolveModelIdentity,\r\n} from \"@x12i/ai-profiles\";\r\n\r\nresolvePreferOpenRouter(); // true by default\r\nresolvePreferOpenRouter(false); // explicit override\r\n\r\nbuildOpenRouterModelId(\"openai\", \"gpt-5.4\"); // \"openai/gpt-5.4\"\r\n\r\n// Same direct + OpenRouter shape whether input is bare or prefixed:\r\nbuildModelInvocation(\"anthropic\", \"claude-3-5-sonnet-20241022\");\r\nbuildModelInvocation(\"anthropic\", \"anthropic/claude-3-5-sonnet-20241022\");\r\n\r\n// Bare model string → vendor + model (no profile name required):\r\nresolveModelIdentity(\"google/gemini-2.5-flash-lite\");\r\n// { provider: \"google\", modelId: \"gemini-2.5-flash-lite\", invocation: { … } }\r\n\r\nresolveModelIdentity(\"google/gemini-2.5-flash-lite\", { asOpenRouter: true });\r\n// { provider: \"openrouter\", modelId: \"google/gemini-2.5-flash-lite\", … }\r\n```\r\n\r\nTests: `test/resolveModelRouting.test.ts`, `test/modelIdentity.test.ts`, `test/resolveModelIdentity.test.ts`.\r\n\r\n## Use bundled only\r\n\r\n```ts\r\nconst model = await resolveAIProfile(\"balanced/default\", {\r\n  catalogLane: \"text\",\r\n  source: \"bundled\",\r\n});\r\n```\r\n\r\n## Force refresh\r\n\r\n```ts\r\nconst model = await resolveAIProfile(\"balanced/default\", {\r\n  catalogLane: \"text\",\r\n  refresh: true,\r\n});\r\n```\r\n\r\n## Runtime behavior\r\n\r\n**Default (`source: \"auto\"`):**\r\n\r\n1. Fetch `models-profiles.json` from the assets URL (see below).\r\n2. Validate the response; if valid, use it and cache it in process memory for 24 hours.\r\n3. If fetch or validation fails, use the JSON shipped inside this npm package (bundled fallback).\r\n4. After TTL, the next call tries fetch again; if that fails but an earlier fetch was cached, reuse the stale cache with a warning.\r\n\r\n**`source: \"bundled\"`** — package JSON only, no network.\r\n\r\n**`source: \"remote\"`** — fetch every time (still cached after success); errors propagate, no bundled fallback.\r\n\r\nNo database. No disk cache in v1.\r\n\r\nThe `version` field in the JSON files (and `registryVersion` on resolved output) is an optional label for humans or external tooling. This package does not compare versions, enforce semver, or pick assets by version number.\r\n\r\n## Remote assets\r\n\r\nUpload the bundled JSON files **as-is** (no filename version suffix):\r\n\r\n- `https://open-assets.x12i.com/models-profiles.json`\r\n- `https://open-assets.x12i.com/models-catalog.json`\r\n\r\nOlder `.v4` / `.v2` URLs are intentionally retired — point every consumer at the unversioned paths above.\r\n\r\n## Integration example\r\n\r\n```ts\r\nimport { resolveAIProfile, resolveAndNormalizeInvokeModel } from \"@x12i/ai-profiles\";\r\n\r\n// Graph JSON stores aliases only (merged job defaults + node overrides per task)\r\nconst slots = {\r\n  preActionModel: node.taskConfiguration.modelConfig?.preActionModel ?? \"deep/default\",\r\n  skillModel: node.taskConfiguration.modelConfig?.skillModel ?? \"balanced/default\",\r\n  postActionModel: node.taskConfiguration.modelConfig?.postActionModel ?? \"cheap/default\",\r\n};\r\n\r\n// Resolve each phase independently at execute time\r\nconst pre = await resolveAIProfile(slots.preActionModel, { catalogLane: \"text\" });\r\nconst main = await resolveAIProfile(slots.skillModel, { catalogLane: \"text\" });\r\nconst post = await resolveAIProfile(slots.postActionModel, { catalogLane: \"text\" });\r\n\r\n// Gateway handoff: resolve + normalize invoke tuple\r\nconst mainInvoke = await resolveAndNormalizeInvokeModel(slots.skillModel, {\r\n  catalogLane: \"text\",\r\n  preferOpenRouter: true,\r\n});\r\n// mainInvoke → { provider: \"openrouter\", model: \"openai/gpt-5.6-terra\", routing: \"openrouter\", ... }\r\n```\r\n\r\n## Profile matrix (FuncX contract)\r\n\r\nDefault choice per profile (vendor-native ids in registry; OpenRouter slugs when `preferOpenRouter` is true):\r\n\r\n| Profile | Inference | Instruction tier | Default choice | Example model |\r\n|---------|-----------|------------------|----------------|---------------|\r\n| `cheap` | Remote | **`default`** | `default` | `deepseek-v4-flash` |\r\n| `fast` | Remote | **`default`** | `default` | `gpt-5.6-luna` |\r\n| `balanced` | Remote | **`default`** | `default` | `gpt-5.6-terra` |\r\n| `deep` | Remote | **`reasoning`** | `default` | `claude-sonnet-5` |\r\n| `pro` | Remote | **`default`** | `default` | `gpt-5.6-sol-pro` |\r\n| `json` | Remote | **`default`** | `default` | `gpt-5.6-luna` (schema output) |\r\n| `agentic` | Remote | **`default`** | `default` | `claude-sonnet-5` |\r\n| `research` | Remote | **`reasoning`** | `default` | `claude-sonnet-5` |\r\n| `cyber` | Remote | **`default`** | `default` | `deepseek-v4-flash` |\r\n| `content` | Remote | **`default`** | `default` | `claude-fable-5` |\r\n| `sum` | Remote | **`default`** | `default` | `claude-haiku-4.5` |\r\n| `vol` | Remote | **`default`** | `default` | `deepseek-v4-flash` |\r\n| `routing` | Remote | **`default`** | `default` | `gemini-2.5-flash-lite` |\r\n| `extraction` | Remote | **`default`** | `default` | `gemini-2.5-flash-lite` |\r\n| `coding` | Remote | **`default`** | `default` | `deepseek-v4-flash` |\r\n| `local` | CPU (no OpenRouter) | **`cpu`** | `llama_cpp_gguf` | `funcx:llama-cpp:gguf` |\r\n\r\nLocal CPU choices expose FuncX / runtime env keys in `resolved.metadata` (e.g. `LLAMA_CPP_MODEL_PATH`, `OLLAMA_MODEL`, `VLLM_BASE_URL`).\r\n\r\n### OpenRouter model ids\r\n\r\nRemote profile choices in `models-profiles.json` use vendor-native `modelId` values (e.g. `gpt-5.6-sol-pro`, `gemini-2.5-flash-lite`). By default, `resolveAIProfile` returns OpenRouter-ready output:\r\n\r\n- `provider`: `\"openrouter\"`\r\n- `modelId`: full slug such as `openai/gpt-5.6-sol-pro` (with correct OpenRouter prefixes, e.g. `x-ai/…`)\r\n- `routing`: `\"openrouter\"`\r\n\r\nPass `preferOpenRouter: false` (or `PREFER_OPENROUTER=0`) to get vendor-native `provider` + `modelId` for direct API calls.\r\n\r\nEvery resolved profile includes **`invocation`** with both call shapes:\r\n\r\n```ts\r\nresolved.invocation.direct    // { provider: \"openai\", modelId: \"gpt-5.6-sol-pro\" }\r\nresolved.invocation.openrouter // { provider: \"openrouter\", modelId: \"openai/gpt-5.6-sol-pro\" } | null\r\n```\r\n\r\nTop-level `provider` / `modelId` / `routing` remain the **active** path selected by `preferOpenRouter`.\r\n\r\n### Vendor trimming\r\n\r\nRestrict resolution to specific vendors (auto-picks within the profile when the default is outside the set). **Leading vendors** (`openai`, `anthropic`, `google`, `deepseek`, `minimax`, `xai`) are **preferred** during auto-pick, not forced — explicit `choice` still honors `together` and other providers.\r\n\r\n```ts\r\nawait resolveAIProfile(\"balanced/default\", {\r\n  catalogLane: \"text\",\r\n  allowedProviders: [\"google\", \"openai\"],\r\n  preferLeadingVendors: true, // default\r\n});\r\n```\r\n\r\n### Modality filtering (input / output media)\r\n\r\nEvery profile declares **required input and output media** in `requiredCapabilities`:\r\n\r\n- Most profiles: `inputModalities: [\"text\"]`, `outputModalities: [\"text\"]`\r\n- `vision`: `inputModalities: [\"text\", \"image\"]`, `outputModalities: [\"text\"]`\r\n\r\nSupported values: `text`, `image`, `audio`, `video`, `file` (aligned with `models-catalog.json`).\r\n\r\nDuring resolution, choices whose catalog modalities do not satisfy the contract are **excluded**. A text-only model cannot be picked for `vision`; a vision-capable model can still serve text profiles.\r\n\r\n```ts\r\nconst resolved = await resolveAIProfile(\"vision/default\", { catalogLane: \"image\" });\r\n// resolved.requiredModalities.input includes \"image\"\r\n// resolved.modalities reflects the picked model from catalog\r\n\r\nawait resolveAIProfile(\"cheap/default\", {\r\n  catalogLane: \"text\",\r\n  inputModalities: [\"text\", \"image\"], // override for this call\r\n  outputModalities: [\"text\"],\r\n});\r\n```\r\n\r\nOverride at resolve time with `inputModalities` / `outputModalities`. Incompatible explicit `choice` values throw `NO_MODALITY_MATCH`.\r\n\r\nRegistry maintenance:\r\n\r\n```ts\r\nimport { validateBundledProfileModalityCoverage } from \"@x12i/ai-profiles\";\r\n\r\nvalidateBundledProfileModalityCoverage(); // { ok, profiles[] } with mismatches\r\n```\r\n\r\n`npm run catalog:build` writes `MODALITY_MISMATCH` rows to `reports/fault-report.json`.\r\n\r\n### Cost cap filtering\r\n\r\nRestrict auto-pick to choices whose catalog pricing stays under a USD-per-1M-token ceiling:\r\n\r\n```ts\r\n// Both input and output rates must be <= $0.20 / 1M tokens\r\nawait resolveAIProfile(\"balanced/default\", { catalogLane: \"text\", costCapPer1M: 0.2 });\r\n\r\n// Finer control\r\nawait resolveAIProfile(\"cheap/minimax_cheap\", {\r\n  catalogLane: \"text\",\r\n  costCapPer1M: { maxInput: 0.2, maxOutput: 2 },\r\n});\r\n```\r\n\r\nWhen the default choice exceeds the cap, resolution auto-picks the next compatible alternative (respecting fallback order and vendor preferences). Explicit `choice` values over the cap throw `NO_COST_CAP_MATCH`. Local/self-hosted choices are treated as zero cost.\r\n\r\n### Keeping models aligned over time\r\n\r\nBundled linkage lives in `src/data/models-registry.json`, built from `models-profiles.json` and `src/data/models-catalog.json`.\r\n\r\nEach catalog model has **two explicit call shapes** (never `provider: \"openrouter\"` with `modelId: \"qwen/...\"` as the only view):\r\n\r\n- `direct` — vendor-native (`{ provider: \"google\", modelId: \"gemini-3.5-flash\" }`)\r\n- `openrouter` — transport (`{ provider: \"openrouter\", modelId: \"google/gemini-3.5-flash\" }`)\r\n\r\nLegacy open-assets files named `openrouter-models-catalog.json` are normalized into this shape on `catalog:pull`.\r\n\r\nWhen OpenRouter deprecates or renames a model slug:\r\n\r\n1. Update `src/data/models-profiles.json` to a current vendor-native id (preferred).\r\n2. Refresh `src/data/models-catalog.json` via `npm run catalog:pull` (fetched from open-assets, normalized locally).\r\n3. Run alignment checks before publishing:\r\n\r\n```bash\r\nnpm run registry:finish         # merge profile catalog supplement, verified defaults, rebuild linkage\r\nnpm run catalog:sync            # pull catalog, rebuild models-registry.json, verify\r\nnpm run catalog:pull            # fetch open-assets catalog into src/data/\r\nnpm run catalog:build           # rebuild models-registry.json + reports/fault-report.json\r\nnpm run verify:openrouter       # bundled catalog + resolved slug policy (offline-safe)\r\nnpm run verify:openrouter:live  # above + live OpenRouter API id check (needs network; retries 3x)\r\nnpm run catalog:verify          # registry build / fault report from sync-models-registry\r\n```\r\n\r\nWith the seed catalog (&lt;50 models), choices not yet listed are marked `catalog-miss` in the registry (warnings in `reports/fault-report.json`, not CI failures). A full catalog promotes true `faulty` rows for slug mismatches.\r\n\r\nUnit tests in `test/openrouterAlignment.test.ts`, `test/modelIdentity.test.ts`, `test/resolveModelIdentity.test.ts`, and `test/resolveModelRouting.test.ts` guard resolution rules offline.\r\n\r\nVendor-direct-only choices (not routed via OpenRouter) can opt out:\r\n\r\n```json\r\n\"metadata\": { \"openRouter\": \"vendor-direct\" }\r\n```\r\n\r\n## Tests\r\n\r\n```bash\r\nnpm test              # build + full suite\r\nnpm run test:unit     # source tests only (skip integration/exports)\r\nnpm run test:integration  # integration + dist export smoke tests\r\nnpm run pack:check    # dry-run npm tarball contents\r\n```\r\n\r\n## Publishing to npm\r\n\r\nThis package is published as a **public** scoped module: `@x12i/ai-profiles` on [npmjs.com](https://www.npmjs.com/).\r\n\r\n### Prerequisites\r\n\r\n1. [npm](https://www.npmjs.com/) account with access to the **`@x12i`** organization/scope\r\n2. Authenticated CLI: `npm login` (or set `NPM_TOKEN` — see `.npmrc.example`)\r\n3. Git remote: [github.com/x12i/ai-profiles](https://github.com/x12i/ai-profiles)\r\n\r\n### Publish locally\r\n\r\n```bash\r\nnpm run pack:check   # verify tarball includes dist/ + JSON data\r\nnpm publish --access public\r\n```\r\n\r\n`prepublishOnly` runs the full test suite; `prepack` rebuilds `dist/` before packing.\r\n\r\n### Publish via GitHub Actions\r\n\r\nWorkflow YAML is in [`docs/github-workflows/`](docs/github-workflows/). Copy into `.github/workflows/` and push using a GitHub token with the **`workflow`** scope (see `docs/github-workflows/README.md`).\r\n\r\n1. Add repository secret **`NPM_TOKEN`** (npm automation token with publish rights for `@x12i`)\r\n2. Create a **GitHub Release** (tag e.g. `v1.0.0`) — triggers `publish-npm.yml`\r\n3. Or run **Publish to npm** workflow manually from the Actions tab\r\n\r\n### After publish\r\n\r\nConsumers install with:\r\n\r\n```bash\r\nnpm install @x12i/ai-profiles@^4.2.0\r\n```\r\n\r\nPeer dependency for downstream repos (graphs-studio, graph-engine, ai-tasks):\r\n\r\n```json\r\n\"@x12i/ai-profiles\": \"^4.1.0\"\r\n```\r\n\r\n## License\r\n\r\nMIT — see [LICENSE](LICENSE).\r\n","readmeFilename":"README.md"}