diff --git a/CHANGELOG.md b/CHANGELOG.md index b334b7c..041e085 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ ## Unreleased +## 7.2.0 + +### Changed + +- Changed `@tangle-network/agent-eval` and `@tangle-network/agent-interface` to required compatible peers. +- Kept exact development pins at Eval `0.144.10` and Interface `0.46.1`. +- Consumers now select one shared Eval and Interface cohort instead of nested package copies. + ## 7.1.3 ### Changed diff --git a/README.md b/README.md index f8a6955..c0c829c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Supply application callbacks for those decisions, or use `@tangle-network/agent- ## Install ```bash -pnpm add @tangle-network/agent-knowledge@7.1.3 @tangle-network/agent-eval@0.144.8 +pnpm add @tangle-network/agent-knowledge@7.2.0 @tangle-network/agent-eval@0.144.10 @tangle-network/agent-interface@0.46.1 ``` Requires Node.js 20.19 or later. diff --git a/package.json b/package.json index 43178a6..cc2aa34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tangle-network/agent-knowledge", - "version": "7.1.3", + "version": "7.2.0", "description": "Build, search, evaluate, and improve source-backed knowledge bases.", "homepage": "https://github.com/tangle-network/agent-knowledge#readme", "repository": { @@ -75,15 +75,19 @@ "verify:official-optimizers": "node scripts/verify-official-optimizers.mjs" }, "dependencies": { - "@tangle-network/agent-eval": "0.144.8", - "@tangle-network/agent-interface": "0.46.1", "proper-lockfile": "4.1.2", "zod": "^4.4.3" }, + "peerDependencies": { + "@tangle-network/agent-eval": ">=0.144.10 <0.145.0", + "@tangle-network/agent-interface": ">=0.46.1 <0.47.0" + }, "devDependencies": { "@arethetypeswrong/cli": "^0.18.5", "@biomejs/biome": "^2.5.5", "@neo4j-labs/agent-memory": "0.4.1", + "@tangle-network/agent-eval": "0.144.10", + "@tangle-network/agent-interface": "0.46.1", "@types/node": "^26.1.1", "@types/proper-lockfile": "4.1.4", "mem0ai": "3.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4949ec9..10a7e61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,12 +15,6 @@ importers: .: dependencies: - '@tangle-network/agent-eval': - specifier: 0.144.8 - version: 0.144.8 - '@tangle-network/agent-interface': - specifier: 0.46.1 - version: 0.46.1 proper-lockfile: specifier: 4.1.2 version: 4.1.2 @@ -37,6 +31,12 @@ importers: '@neo4j-labs/agent-memory': specifier: 0.4.1 version: 0.4.1 + '@tangle-network/agent-eval': + specifier: 0.144.10 + version: 0.144.10 + '@tangle-network/agent-interface': + specifier: 0.46.1 + version: 0.46.1 '@types/node': specifier: ^26.1.1 version: 26.1.1 @@ -627,8 +627,8 @@ packages: '@tangle-network/agent-core@0.5.4': resolution: {integrity: sha512-k6gYv3BlagkfuWrGyTJH6mKUBgsLY6TXxizACqt0QF8a1/5uqy0UYc6R2Wo9nqQVJuaRxDnoiRf8YtsRVqA75g==} - '@tangle-network/agent-eval@0.144.8': - resolution: {integrity: sha512-5vB1bbLZ/KS1zUsUROFHIC+dqDqNzqYlzuYODI8MAvoUB/Jimr+6n7Sfn6Yi/08CElDanTy+FlQeF4vekU7Rew==} + '@tangle-network/agent-eval@0.144.10': + resolution: {integrity: sha512-mDUf902qRCDnEzQ7cyN9ytohyPtho/+Aumw8kMTjMcJo7XoUKeH4bEqpsTS0q4aLMQYgg5R+xH8FRCnN1wt8Jg==} engines: {node: '>=20'} hasBin: true @@ -2785,7 +2785,7 @@ snapshots: '@tangle-network/agent-interface': 0.46.1 zod: 4.4.3 - '@tangle-network/agent-eval@0.144.8': + '@tangle-network/agent-eval@0.144.10': dependencies: '@asteasolutions/zod-to-openapi': 9.1.0(zod@4.4.3) '@hono/node-server': 2.0.12(hono@4.12.32) diff --git a/scripts/verify-official-optimizers.mjs b/scripts/verify-official-optimizers.mjs index d0633e1..7d1ed3d 100644 --- a/scripts/verify-official-optimizers.mjs +++ b/scripts/verify-official-optimizers.mjs @@ -13,9 +13,27 @@ import { fileURLToPath, pathToFileURL } from 'node:url' const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') const sourcePackage = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8')) -const agentEvalVersion = sourcePackage.dependencies?.['@tangle-network/agent-eval'] +const agentEvalVersion = sourcePackage.devDependencies?.['@tangle-network/agent-eval'] if (!/^\d+\.\d+\.\d+$/.test(agentEvalVersion)) { - throw new Error('@tangle-network/agent-eval must be pinned to one exact version') + throw new Error('@tangle-network/agent-eval must have one exact development pin') +} +const [agentEvalMajor, agentEvalMinor] = agentEvalVersion.split('.').map(Number) +const expectedEvalPeerRange = `>=${agentEvalVersion} <${agentEvalMajor}.${agentEvalMinor + 1}.0` +if (sourcePackage.peerDependencies?.['@tangle-network/agent-eval'] !== expectedEvalPeerRange) { + throw new Error( + `@tangle-network/agent-eval peer range must be ${expectedEvalPeerRange} to match the development pin`, + ) +} +const agentInterfaceVersion = sourcePackage.devDependencies?.['@tangle-network/agent-interface'] +if (!/^\d+\.\d+\.\d+$/.test(agentInterfaceVersion)) { + throw new Error('@tangle-network/agent-interface must have one exact development pin') +} +const [agentInterfaceMajor, agentInterfaceMinor] = agentInterfaceVersion.split('.').map(Number) +const expectedInterfacePeerRange = `>=${agentInterfaceVersion} <${agentInterfaceMajor}.${agentInterfaceMinor + 1}.0` +if (sourcePackage.peerDependencies?.['@tangle-network/agent-interface'] !== expectedInterfacePeerRange) { + throw new Error( + `@tangle-network/agent-interface peer range must be ${expectedInterfacePeerRange} to match the development pin`, + ) } const tempRoot = mkdtempSync(join(tmpdir(), 'agent-knowledge-official-')) @@ -69,6 +87,8 @@ try { join(tempRoot, 'npm-cache'), '--prefer-online', join(packDir, tarballs[0]), + `@tangle-network/agent-eval@${agentEvalVersion}`, + `@tangle-network/agent-interface@${agentInterfaceVersion}`, ], appDir, ) diff --git a/scripts/verify-package.mjs b/scripts/verify-package.mjs index e5f910a..9045517 100644 --- a/scripts/verify-package.mjs +++ b/scripts/verify-package.mjs @@ -65,14 +65,12 @@ const agentCorePackage = '@tangle-network/agent-core' const agentInterfacePackage = '@tangle-network/agent-interface' const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..') const sourcePackage = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8')) -const agentEvalVersion = sourcePackage.dependencies?.[agentEvalPackage] -if (!/^\d+\.\d+\.\d+$/.test(agentEvalVersion)) { - throw new Error('@tangle-network/agent-eval must be pinned to one exact version') -} -const agentInterfaceVersion = sourcePackage.dependencies?.[agentInterfacePackage] -if (!/^\d+\.\d+\.\d+$/.test(agentInterfaceVersion)) { - throw new Error('@tangle-network/agent-interface must be pinned to one exact version') -} +const agentEvalVersion = exactDevelopmentPin(sourcePackage, agentEvalPackage) +const agentEvalPeerRange = exactMinorPeerRange(agentEvalVersion) +const agentInterfaceVersion = exactDevelopmentPin(sourcePackage, agentInterfacePackage) +const agentInterfacePeerRange = exactMinorPeerRange(agentInterfaceVersion) +assertRequiredPeer(sourcePackage, agentEvalPackage, agentEvalPeerRange) +assertRequiredPeer(sourcePackage, agentInterfacePackage, agentInterfacePeerRange) assertNoAgentStackOverrides(sourcePackage) assertEdgeUnsafeStaticImportMatcher() const tempRoot = mkdtempSync(join(tmpdir(), 'agent-knowledge-package-')) @@ -154,23 +152,18 @@ try { 'utf8', ), ) - if ( - installedPackage.dependencies?.['@tangle-network/agent-eval'] !== agentEvalVersion || - installedAgentEval.version !== agentEvalVersion - ) { + if (installedAgentEval.version !== agentEvalVersion) { throw new Error( - `agent-eval version mismatch: dependency=${installedPackage.dependencies?.['@tangle-network/agent-eval']} installed=${installedAgentEval.version} expected=${agentEvalVersion}`, + `agent-eval version mismatch: installed=${installedAgentEval.version} expected=${agentEvalVersion}`, ) } - if ( - installedPackage.dependencies?.['@tangle-network/agent-interface'] !== - agentInterfaceVersion || - installedAgentInterface.version !== agentInterfaceVersion - ) { + if (installedAgentInterface.version !== agentInterfaceVersion) { throw new Error( - `agent-interface version mismatch: dependency=${installedPackage.dependencies?.['@tangle-network/agent-interface']} installed=${installedAgentInterface.version} expected=${agentInterfaceVersion}`, + `agent-interface version mismatch: installed=${installedAgentInterface.version} expected=${agentInterfaceVersion}`, ) } + assertPublishedRequiredPeer(installedPackage, agentEvalPackage, agentEvalPeerRange) + assertPublishedRequiredPeer(installedPackage, agentInterfacePackage, agentInterfacePeerRange) const agentCoreVersion = installedAgentEval.dependencies?.[agentCorePackage] if (!/^\d+\.\d+\.\d+$/.test(agentCoreVersion)) { throw new Error('@tangle-network/agent-eval must pin @tangle-network/agent-core exactly') @@ -274,6 +267,39 @@ function assertNoAgentStackOverrides(packageManifest) { } } +function exactDevelopmentPin(packageManifest, packageName) { + const version = packageManifest.devDependencies?.[packageName] + if (!/^\d+\.\d+\.\d+$/.test(version)) { + throw new Error(`${packageName} must have one exact development pin`) + } + return version +} + +function exactMinorPeerRange(version) { + const [major, minor] = version.split('.').map(Number) + return `>=${version} <${major}.${minor + 1}.0` +} + +function assertRequiredPeer(packageManifest, packageName, expectedRange) { + if (packageManifest.peerDependencies?.[packageName] !== expectedRange) { + throw new Error(`${packageName} must be a required peer at ${expectedRange}`) + } + if (packageManifest.dependencies?.[packageName] !== undefined) { + throw new Error(`${packageName} must not be a runtime dependency`) + } +} + +function assertPublishedRequiredPeer(packageManifest, packageName, expectedRange) { + if (packageManifest.peerDependencies?.[packageName] !== expectedRange) { + throw new Error( + `published ${packageName} peer mismatch: ${packageManifest.peerDependencies?.[packageName]} expected=${expectedRange}`, + ) + } + if (packageManifest.dependencies?.[packageName] !== undefined) { + throw new Error(`published ${packageName} must not be a runtime dependency`) + } +} + function assertSingleInstalledAgentStack(appDir, expectedVersions) { const installedPaths = run( 'npm',