{"_id":"@alma-harness/loop","_rev":"11-214f06f4cec458a0d98e0b7e2b62071a","name":"@alma-harness/loop","dist-tags":{"latest":"0.10.0"},"versions":{"0.1.0":{"name":"@alma-harness/loop","version":"0.1.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.1.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"0f9c9e44e2e4d49364dfec5d1b49693e4849e07e","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.1.0.tgz","fileCount":9,"integrity":"sha512-FzVJ1rPwg/kQVHRXIhcJycKCOSlSnNX3EQ0r3nAZmasGxwovxZ985cMH6/MQZ8lQio/GVgtvUnE4Ud42lUuWsw==","signatures":[{"sig":"MEUCIDBrLauGV3Wl5EL8hd8amqwvqLU5cHDTN4coavcx9d6rAiEAiEgdYJe5iIk4JOq3n/1UFPPWyasCsTKK9MU/SCszAjE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":233946},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/ff5fde41397edd6ca7ee5adc47373878/alma-harness-loop-0.1.0.tgz","_integrity":"sha512-FzVJ1rPwg/kQVHRXIhcJycKCOSlSnNX3EQ0r3nAZmasGxwovxZ985cMH6/MQZ8lQio/GVgtvUnE4Ud42lUuWsw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.1.0_1788211400429_0.07431568416347045","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alma-harness/loop","version":"0.2.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.2.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"b4450f14e3d2baafe7548355ff190dafe5ae002f","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.2.0.tgz","fileCount":9,"integrity":"sha512-RY2sKn8P52YcZFZHesR7f47IFpJco3Phxk65xHKlPyoZT5L8FtQo6hF0I6LKaZ+3kwUp81pn9Fbz8eR15YbH7A==","signatures":[{"sig":"MEQCIE+cgugZ1OJFtNSxY1mXV78/b4eYtGdz+PJzEgOHcdAAAiB+3Rgt/hUkhtnnhhg+3zeviALDRZXBiUhUM5Z9t806gw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":328579},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/80d1abf0ba9032b2b63f9c753c97d9b0/alma-harness-loop-0.2.0.tgz","_integrity":"sha512-RY2sKn8P52YcZFZHesR7f47IFpJco3Phxk65xHKlPyoZT5L8FtQo6hF0I6LKaZ+3kwUp81pn9Fbz8eR15YbH7A==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.2.0_1788446555002_0.847086695018356","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@alma-harness/loop","version":"0.3.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.3.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"80a3f271670d0d44a5ab59e806a4f1e01135e0c5","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.3.0.tgz","fileCount":9,"integrity":"sha512-jx0JmyF1ObQ/8nnnp2fN8WwifGG5xkHOfVMKSwsz3AaCmp+2QevdhArzMzzQPFquYD+5BwByK6jPU+l6MdKe1g==","signatures":[{"sig":"MEUCIB3xVQI13q0h2xEvZxjpPwjK2otmTNsp6AmuSJLM6ZaYAiEAyqiTBT7i/YDKTjM2VLnDg1JSuNQJJFbIsr2sGE+qhtA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQChjFvgScw3ll2wnAQG2i6/yHltzsEX/CDp77V00LgDWwIhAJ+6aw0UOBsopj7XxQ11tFNGVt2QoilVZHmxmPHgvpic","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":331058},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.3.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/c8f9ffeada3bd14e8a6e0616cb0ff2fd/alma-harness-loop-0.3.0.tgz","_integrity":"sha512-jx0JmyF1ObQ/8nnnp2fN8WwifGG5xkHOfVMKSwsz3AaCmp+2QevdhArzMzzQPFquYD+5BwByK6jPU+l6MdKe1g==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.3.0_1788455805250_0.509180225048661","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@alma-harness/loop","version":"0.4.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.4.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"132e9240f880f31a1de54ad6396eb195a1c9aad6","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.4.0.tgz","fileCount":9,"integrity":"sha512-S1ZBdaS2GeMyDvigWJaiv+jGifvThLCdWgJiU3lenmUqmNpX+IVXNFCfTK9yluYJiElDXM6+PWtVVuWKtaW9rg==","signatures":[{"sig":"MEUCIQCFS7RWRymew99mxWbxnXnewcfeOP1Us4KtzqEdl5wHjwIgGFItqgoyWeaw3FA2Aw8sTKNWrIVKII0XaJAWrdBtXV4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFI6W1h5M/W4iY+ZLA6NxcI9Tm4zQ9HfF9DJ5/2rEzxiAiAOHWHzCUqiYagxtd5+HiFvpoHre4H4yTRvzvpQ2ebIEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":342473},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.4.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/8b87723ac872b2a3506b39606d277986/alma-harness-loop-0.4.0.tgz","_integrity":"sha512-S1ZBdaS2GeMyDvigWJaiv+jGifvThLCdWgJiU3lenmUqmNpX+IVXNFCfTK9yluYJiElDXM6+PWtVVuWKtaW9rg==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.4.0_1788462167044_0.9641945657151552","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@alma-harness/loop","version":"0.5.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.5.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"872e287ae7b8fd88580f279f946274d2171bec7d","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.5.0.tgz","fileCount":9,"integrity":"sha512-QkgSTwyvFTwNf4nccfiyI7nkJD5izR6ErfMQH4HqA1U3KqFCUw2wQ3jAfkO/9XMLWri4Qop6U6gEywrrOgCI9Q==","signatures":[{"sig":"MEUCIQCyvbP8a7fZl6qeedM4kTeQ+zSlT0z6rP2wMN9FNSO/ZQIgAToSnfAGiaawlSapKf9IqFpeS2kgthxoZHvfiBU/c9w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC2jxOzeO/kLNV2AhQblFUpZbCmz4AOaqCSMDmglu0m3QIhALky2bBu4Ufgm/OxO8GnbkybW//vTUK/FjdlTKuQwjyT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322469},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.5.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/ab8df62cf894a1b73d6ac5d5e82842ae/alma-harness-loop-0.5.0.tgz","_integrity":"sha512-QkgSTwyvFTwNf4nccfiyI7nkJD5izR6ErfMQH4HqA1U3KqFCUw2wQ3jAfkO/9XMLWri4Qop6U6gEywrrOgCI9Q==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.5.0_1788473852291_0.43338256444599055","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alma-harness/loop","version":"0.6.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.6.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"0b0498d2032bac66d8a681c2c88036eef584312d","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.6.0.tgz","fileCount":15,"integrity":"sha512-A9tAgwGWAC2tXuHHK9XwRAKV+IqLAe8cgKyyK0Zo17ANEcSCksWzC05XhW5CjfxE1ImlGK1YQIAebylwzhE3xQ==","signatures":[{"sig":"MEQCID14nLVcn1zYI2/YFvbcoDVpRkU7GMZ7Cakwlkg5u06gAiBNxZ1x+wm/A4S0PIDa7nMVxh0wMeJTB4ZWS1nLmY1iFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE6z1+fOqQgiCglIXK6bGnTs54KVdwTLvMIccHTFudz7AiA6UplgrIXSOR496fmEkVfCpq1YKtXRXLKCoEaHA1zKbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":342698},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.6.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/e8ff05b5071a6da71d56be3e5a1e0c82/alma-harness-loop-0.6.0.tgz","_integrity":"sha512-A9tAgwGWAC2tXuHHK9XwRAKV+IqLAe8cgKyyK0Zo17ANEcSCksWzC05XhW5CjfxE1ImlGK1YQIAebylwzhE3xQ==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.6.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.6.0_1788902403189_0.7656987879159285","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@alma-harness/loop","version":"0.6.1","license":"Apache-2.0","_id":"@alma-harness/loop@0.6.1","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"3cd8ddca3312e9f71358d8b673dd40186bf75da5","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.6.1.tgz","fileCount":15,"integrity":"sha512-9dzG34vGnOJSVAzwDe4QoGm0uiz1IoEoIapmRskp5fu94LYtBQAVBd7PFdNkwLF2RZAXIBo9P+y8jPrhfDArLw==","signatures":[{"sig":"MEQCIBfKt1cESM/rgVe0RovOG8ODCE3o0mSXtjcYkLSqOQHZAiApFyM/GhSa6f4hdizQc12DMMb+kAWCDrVlW8RpdbFNiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCJ2jwGGRQ7ebrzI7gSf4klyw1tyI99WyPSHNCxD3UgdQIhAJa0MgUtrD3xyOWR/K9/2Vx4/WaWZEhry/nQe2YaRKwd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":342698},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.6.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/a12638ae1a7f2944a3e73898763767f8/alma-harness-loop-0.6.1.tgz","_integrity":"sha512-9dzG34vGnOJSVAzwDe4QoGm0uiz1IoEoIapmRskp5fu94LYtBQAVBd7PFdNkwLF2RZAXIBo9P+y8jPrhfDArLw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma turn engine: the agentic loop, the turn budget guard and the cache-hygiene observer.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.6.1"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.6.1_1788905988160_0.9193642380107927","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@alma-harness/loop","version":"0.7.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.7.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"1db72e11ceb8d5b7f33c707c7663616dc41a5ce3","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.7.0.tgz","fileCount":17,"integrity":"sha512-vqLwYGjQbR1G95K1ufS0jKUIDnAqSDzLiBx3YrcRvbehN+AyxdTh3KoZ+kfAPBj4a2Kdz6al9SrvLsmG+8iesw==","signatures":[{"sig":"MEYCIQC3F8RvIgl4QBLqV7SD58TNnqi4ILcd7rF/A3qBU2uT7gIhAO9OJw5lQj/cBgNmGLj7ec7yxPvcHZ63eYXit2Zs6imK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDEmcWBniBvxMc4mKhLk5+iSg8D8aHa3O6WWTKi/lcMIwIhAKJweCot5SPGBelrP4l8HzflNLBQ+LaGR49H5vKB1TIa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242358},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.7.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/b4348791eca51cfecb9dc0154058e056/alma-harness-loop-0.7.0.tgz","_integrity":"sha512-vqLwYGjQbR1G95K1ufS0jKUIDnAqSDzLiBx3YrcRvbehN+AyxdTh3KoZ+kfAPBj4a2Kdz6al9SrvLsmG+8iesw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma governed turn engine: steps, tool dispatch, delegation and cache hygiene.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.7.0","@alma-harness/memory":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.7.0_1789137193653_0.045959832285182856","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@alma-harness/loop","version":"0.8.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.8.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"20a9d6c4a2368558a239f22c0f8acff04ffc2352","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.8.0.tgz","fileCount":17,"integrity":"sha512-TQYxWEHcqUjndo89vNavFyS9gkLxncwqHScA5lPV5bzMuvzbuIajMcrKLBjNfdpUWCXe4tsuj6tsrlY5pD/OgA==","signatures":[{"sig":"MEQCIFThAMbFo+M6EkIJ7dZdT/cz6z9aIHwpbxBPpQoKjH0UAiBQlD2mNz3TuK2XXcgutSp/Dva0XWfNrimvd3dkIJPTfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDu34BsziGYI8IoGZyrtas3hE9GVZLYsRkOQ0TiyTbJeQIgDjGCnsP3GytBIB8NXWSrZTC6Fa9WmfteJuyUi5I/Fr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242358},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.8.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/87c165bc7f45c70fa5bdec91d73feeb8/alma-harness-loop-0.8.0.tgz","_integrity":"sha512-TQYxWEHcqUjndo89vNavFyS9gkLxncwqHScA5lPV5bzMuvzbuIajMcrKLBjNfdpUWCXe4tsuj6tsrlY5pD/OgA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma governed turn engine: steps, tool dispatch, delegation and cache hygiene.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.8.0","@alma-harness/memory":"^0.8.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.8.0_1789155300153_0.3730300679017553","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@alma-harness/loop","version":"0.9.0","license":"Apache-2.0","_id":"@alma-harness/loop@0.9.0","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"ea12d3ec25b563752eccd8ce408e9f062e9a4321","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.9.0.tgz","fileCount":17,"integrity":"sha512-+osDYg/RUCKaQspzgxLmiMdF67878hhqQlHkM2ppYxM7F6m1nItM/jvL+RsBlRrmGYOeS1GJ6idbWEZGQo5ZXw==","signatures":[{"sig":"MEUCIAgNGatAshIjgr4EkAUnNNmwS1jo6yZD3PGTyDJEl02BAiEA9OEKJJyjvWljdq43w8jYguV0wbO+hcOBwY7Kx5jexGc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDRl4cF4fasjh0TObPzRtYtK3GdEN1S09qvWXzdIt7rNQIhAOyByS2chjQaiARn14AuaoRYQLDtK3uPqM/RC+KiP5G8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242358},"main":"./dist/index.js","type":"module","_from":"file:alma-harness-loop-0.9.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/fd96c830e4d3d4070fefc760bee4858d/alma-harness-loop-0.9.0.tgz","_integrity":"sha512-+osDYg/RUCKaQspzgxLmiMdF67878hhqQlHkM2ppYxM7F6m1nItM/jvL+RsBlRrmGYOeS1GJ6idbWEZGQo5ZXw==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma governed turn engine: steps, tool dispatch, delegation and cache hygiene.","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.9.0","@alma-harness/memory":"^0.9.0"},"_npmOperationalInternal":{"tmp":"tmp/loop_0.9.0_1789655852726_0.8982603405453264","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"_id":"@alma-harness/loop@0.10.0","bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"dist":{"shasum":"6616a6cf52137f1785470b12917ec405db319543","tarball":"https://registry.npmjs.org/@alma-harness/loop/-/loop-0.10.0.tgz","fileCount":17,"integrity":"sha512-xV/2FIoBIUGz3edUR6vQOosnoFlYJn8yLN0WNnfDOmITTwBXTBui7+vN5kG1jTwxR8PmltUOV9umrySe3bZgrA==","signatures":[{"sig":"MEQCIGE661xCAgEEdnJwMVEqHw1BhWohobua8vQQXGRaqXb2AiBvY/0/Fevtq8ahHx6i/sZxV68/QT7AiQDbaUMqQQg6mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDETT2mI5xf59tmAXqwE2Ect4DcmKd7L7mVAU6Z+DgFVAiEA/oH3H3TP/UOIbGOAfcjJweSdISUIy3JUfK3ZiVHq/+0="}],"unpackedSize":244240},"main":"./dist/index.js","name":"@alma-harness/loop","type":"module","_from":"file:alma-harness-loop-0.10.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing/index.js"},"./internal":{"types":"./dist/internal.d.ts","default":"./dist/internal.js"}},"license":"Apache-2.0","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"version":"0.10.0","_npmUser":{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"},"homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","_resolved":"/private/var/folders/zc/snhwcnp15dj2hk0k9_g1fh3h0000gn/T/fe5ee332bd9873bf1e16a4a08123e1c1/alma-harness-loop-0.10.0.tgz","_integrity":"sha512-xV/2FIoBIUGz3edUR6vQOosnoFlYJn8yLN0WNnfDOmITTwBXTBui7+vN5kG1jTwxR8PmltUOV9umrySe3bZgrA==","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"_npmVersion":"11.18.0","description":"Alma governed turn engine: steps, tool dispatch, delegation and cache hygiene.","directories":{},"maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","typescript":"^5.9.2","@types/node":"^24.1.0"},"peerDependencies":{"@alma-harness/core":"^0.10.0","@alma-harness/memory":"^0.10.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/loop_0.10.0_1789675275227_0.4734239366259754"}}},"time":{"created":"2026-08-31T21:23:20.229Z","modified":"2026-09-17T20:01:15.586Z","0.1.0":"2026-08-31T21:23:20.628Z","0.2.0":"2026-09-03T14:42:35.155Z","0.3.0":"2026-09-03T17:16:45.449Z","0.4.0":"2026-09-03T19:02:47.179Z","0.5.0":"2026-09-03T22:17:32.439Z","0.6.0":"2026-09-08T21:20:03.293Z","0.6.1":"2026-09-08T22:19:48.323Z","0.7.0":"2026-09-11T14:33:13.739Z","0.8.0":"2026-09-11T19:35:00.279Z","0.9.0":"2026-09-17T14:37:32.820Z","0.10.0":"2026-09-17T20:01:15.373Z"},"bugs":{"url":"https://github.com/FabioFernandesCarneiro/alma/issues"},"license":"Apache-2.0","homepage":"https://github.com/FabioFernandesCarneiro/alma#readme","repository":{"url":"git+https://github.com/FabioFernandesCarneiro/alma.git","type":"git","directory":"packages/loop"},"description":"Alma governed turn engine: steps, tool dispatch, delegation and cache hygiene.","maintainers":[{"name":"fabiofernandescarneiro","email":"fabiofernandescarneiro@gmail.com"}],"readme":"# @alma-harness/loop\n\nThe internal governed turn engine of [Alma](https://github.com/FabioFernandesCarneiro/alma) — a\nTypeScript runtime for multi-tenant agents operating on sensitive data. It runs\nagainst [`@alma-harness/core`](../core). Hosts use\n[`@alma-harness/conversation`](../conversation) or the composed\n[`@alma-harness/runtime`](../runtime); this package has no standalone agent factory.\n\n> **Status: pre-1.0.** The API is still moving; see the\n> [roadmap](../../docs/architecture.md#12-adoption-roadmap) for where it stands.\n\n## What it owns\n\n- **The loop** — steps, tool dispatch, delegation and lifecycle hooks. The\n  matching-version internal API requires governed execution and a main routing\n  snapshot validated before admission. Conversation owns identity, caps and stores.\n- **The volatile suffix, per turn** (spec: volatile-per-turn) — `volatile`\n  is a function called once per turn with the turn's scope, session, intent,\n  trigger and clock; its text joins the static volatile blocks of `system`\n  as one block appended to the input, marked `origin: \"harness\"` so a screen\n  can hide it, persisted and replayed byte-identical so the cache reads\n  through it. The summary transcript omits it. A source failure after admission retains\n  `reconciliation_required` ownership.\n- **Deferred tools and the built-in search** (spec: deferred-tools) — a tool\n  registered `deferred: true` is not advertised until the model asks: while\n  any deferred tool is in the active set, every step advertises\n  `search_tools`, whose description names them; a search loads the matches\n  for the rest of the turn, logs the load on the access trail by name, and\n  tells the model what it can call now. Privileged core: never in a\n  profile, never advertised to a delegate, `tool:pre` applies.\n- **Provider-executed web search** (spec: provider-tools) — `providerTools`\n  registers the kinds; a profile grants by kind, and cannot name an\n  unregistered one. Each is advertised only to a turn at or below its\n  `maxSensitivity` (`internal` by default) and never to a delegate; the\n  call and its results are persisted in the neutral format in provider arrival order and replayed on the next step, each result is one access event\n  (`tool: \"web_search\"`, `resource: \"provider:<id>:<n> results\"`, never the\n  query), the stream narrates them, and a `pause` stop re-sends the turn as\n  another step against `maxSteps` and the cap. Priced per request from the\n  table, fail-closed. `maxUses` is a per-turn cap the loop enforces on every\n  provider (spec: what-the-wire-cuts): at the cap, the tool is withheld from\n  the turn's later steps.\n- **What the wire cuts** (spec: what-the-wire-cuts) — a tool call whose\n  arguments did not parse is answered with an invalid-input result on\n  `tool_use` while `max_tokens` withholds the step output; the raw text is never persisted.\n  A media block in the input is egress and lands on the access trail by\n  provider and kind, never by URI: by URL, the adapter hands the URI to the\n  provider to fetch.\n- **Output schemas at the hook boundary** (spec: provider-request-controls) —\n  `step:pre` cannot add or change `ModelRequest.output`. The attempt is refused\n  and recorded as metadata, with no schema content in the trail. Public agent\n  calls do not select structured output yet.\n- **The cache's duration** (spec: cache-ttl) — a policy choice may carry\n  `cache: { ttl: \"1h\" }`; the loop copies it onto every step, and a delegate's, records it on the routing trail and pins it after `step:pre`\n  like the tier; a one-hour write is priced at its own row, fail-closed.\n- **Media by bytes** (spec: media-by-bytes) — with `media` configured, the\n  bytes a block carries, or the product's `media.source` asked once per ref\n  and turn, go to the provider as base64; the session keeps the ref alone;\n  the trail adds the size; the content type is normalised before the\n  adapter sees it. Without `media`, a block carrying content is refused\n  (spec: close-066-069-findings). History media on later turns is a placeholder text\n  block by default (the bytes go once) or, with `replay: \"bytes\"`, the bytes\n  again. `maxBytes` (32 MiB) prevents oversized media from reaching the provider.\n  A source failure after admission retains uncertainty; it does not authorize a retry.\n- **Two faces on one turn** — `runTurn` returns the result when it is done;\n  `streamTurn` observes settled main-step output and carries the\n  identical result on `.result`, alongside them. One implementation, so\n  enforcement cannot differ.\n- **One-call work** lives in `@alma-harness/batch` and\n  `@alma-harness/single-call`. The legacy job factories have been removed;\n  batch ownership, original financial receipts and explicit uncertainty now\n  govern those paths (spec: legacy-job-runner-removal).\n- **Routines** run through this loop but live with the clock:\n  Governed routine adapters live in `@alma-harness/schedule` since spec:\n  routines-with-the-clock.\n- **The long-context policy** (`longContext`) — session rotation with a\n  summary at the cold boundary (§6.6, spec: long-context). A cold start\n  (the last message older than `coldAfterMs`, default five minutes) over\n  `rotateAtTokens` summarizes the older history on `summaryTier` through\n  the delegate path — routed, charged, on the trails — keeps the last\n  `keepLastMessages` verbatim from a user message, and continues from\n  `[summary, tail, input]`; the summary is persisted with a marker and every\n  later step's view starts there. Only an attested, settled zero-usage context rejection permits one reactive\n  rotation and retry; an arbitrary provider exception never grants that authority. Never mid-history pruning; absent, the\n  whole log is sent as before.\n- **Financial enforcement** — the execution composition reads authoritative spend\n  and applies normalized caps. Main calls, delegates, direct calls and summaries\n  settle through original governed receipts; the loop never writes legacy costs.\n- **Coordination and observation** live in conversation. Durable admission replaces\n  expiring lease takeover. The host retains a busy request's input and key to retry\n  after completion. WhatsApp burst aggregation is also a host responsibility.\n- **The cache-hygiene observer** (`cacheHygieneGuard`) — warns when a session\n  keeps cold-writing its prefix, which is a misconfiguration the bill would\n  otherwise report months later.\n\n## Where things are\n\n`engine.ts` defines internal construction and shared result/event types;\n`turn.ts` assembles a turn and runs its steps; `step.ts` applies the hook boundary;\n`dispatch.ts` owns tools and nested calls; `recall.ts` assembles recall. Shared\ninternals, hooks, state, cache hygiene and context helpers remain separate files.\nThere is no legacy stream controller, lease coordinator or charging implementation.\nThe matching-version `/internal` subpath is not a stable standalone host API.\n\n## What it must never do\n\n- Widen what `core` permits. Sensitivity narrows through a delegate and never\n  escalates; a hook may not rewrite routing or the advertised tool set, and may\n  lower the per-step output ceiling but never raise it (spec 029). What a\n  `step:pre` hook touched — honored or refused — lands on the `context` trail.\n- Reach the filesystem, spawn a subprocess, or ship a shell.\n- Depend on a provider SDK. The neutral message format is the boundary.\n- Narrate the model's reasoning. It is persisted with the assistant message\n  and replayed to the provider; `reply` and the stream never carry it (spec:\n  reasoning-blocks).\n\n## Usage and streaming\n\nStart with the [canonical quickstart](../../examples/quickstart). Once a canonical\n`runner` is configured, both entrypoints require the same explicit identity:\n\n```ts\nconst request = { scope, sessionId, idempotencyKey, input, intent };\nconst view = await runner.runTurn(request);\n// Or observe a new request; a completed retry replays the original result.\nconst turn = runner.streamTurn(request);\nfor await (const event of turn) {\n  if (event.type === \"text\") render(event.text);\n}\nconst finalView = await turn.result;\n```\n\n`break`, iterator return/throw and socket closure detach only the observer. They\nnever abort execution. Explicit execution cancellation or deadline expiry retains\nuncertainty for reconciliation. A slow reader has a bounded queue and resynchronizes\nthrough `read`; it cannot block the turn.\n\nText is released per settled main step, after governed output checks and a fresh\nretention/erasure read. Earlier visible steps may precede a later tool failure or\nbudget stop. No token deltas, delegate text or reasoning are exposed. The final\nresult event and `.result` use the same canonical view. Invalid input rejects;\nnon-durable routing refusal is `not_admitted`, overlapping work is `busy`, and\nadmitted failures are `reconciliation_required`, not a retryable error envelope.\n\n## Testing helpers\n\n`@alma-harness/loop/testing` ships the scripted `ModelClient` the loop's own\ntests run against — deterministic event sequences, no network, no timing.\nNothing in it imports vitest.\n\n```ts\nimport { FakeModelClient, scriptedText } from \"@alma-harness/loop/testing\";\n\nconst client = new FakeModelClient([scriptedText(\"Hello!\")]);\n```\n\n## Documentation\n\n[Docs index](../../docs/README.md) · [Architecture](../../docs/architecture.md)\n· [Invariants](../../docs/invariants.md) · [Quickstart](../../examples/quickstart)\n\nApache-2.0\n\nTemperature and output controls remain pinned at `step:pre`; attempted changes\nare recorded without schema content. Canonical public calls do not select these\ncontrols. Pure context helpers come from `@alma-harness/memory/context` and retain\nidentity through loop reexports; memory is a matching-version peer dependency.\n\nThe execution seam requires the snapshotted main choice. Summaries and children\nresolve their own routes and retain lineage, usage and root limits. Settled main\nsteps enqueue references without waiting for observers or controlling cancellation.\n\n### Explicit delegation refusal\n\n`ctx.models.tryDelegate(request)` returns either `{ status: \"completed\", text,\nusage }` or an immutable `{ status: \"refused\", reason }`, where reason is `depth`,\n`sensitivity` or `tool_grant`. A tool\nmay handle that data or return the exact refusal object to emit a bounded\n`isError` tool result. Clones and foreign objects are ordinary output. The\nexisting `delegate` keeps throwing; neither method waives handler/child failures,\ncancellation or uncertain persistence. Only a live handler can use tryDelegate.\n\nRequests are snapshotted before child routing: plain data properties, a valid\ntier/sensitivity, well-formed prompt up to 1,000,000 UTF-16 units, and at most 256\ntool names of 1–200 units. Accessors, sparse arrays and unknown fields are invalid.\nStructural refusals precede child policy, hooks and reservation. A normally\nreturned refusal still passes execution health checks and the existing tool:post,\noutput cap and advisory handling. See spec governed-delegation-refusal.\n\nThe governed main loop reacts only to conversation's trusted settled rejection\nmarker, before recording/observing rejected output. It rotates at most once;\nsummary and retry use the same root limits. There is no exception-based legacy fallback (spec: safe-context-rejection-rotation).\n\nThe optional request `toolChoice` is also frozen as a copy and pinned, including\nabsence, at `step:pre`. Hook injection, removal or substitution is refused and\nrecorded as metadata. Canonical conversations do not offer a global forced-tool\nsetting; use the official governed step runner for one-call structured extraction.\n","readmeFilename":"README.md"}