{"_id":"@ancientpantheon/khronoton-core","_rev":"16-b9f4e7fb7bc42a5729252fafdc123f75","name":"@ancientpantheon/khronoton-core","dist-tags":{"latest":"0.11.0"},"versions":{"0.1.0":{"name":"@ancientpantheon/khronoton-core","version":"0.1.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.1.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"a86e0bb318cd28b0d12cf2e4ef4e368dff1a209e","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.1.0.tgz","fileCount":10,"integrity":"sha512-cbdcFkGlJyHbEgxjgP4dG3yDExsfbdwJnVsampHegyF9+y3qPUJHyOn3AzDJu+ZB1tqz9b4iPAQ2t3yC1mgglA==","signatures":[{"sig":"MEQCIDd6SnXZr8iijaBEr25Iyh8k3z6H3Dpv4NkoJPWZsj4aAiBNlV3CtfqAaQRKlUH7I4MrlzO9bC4xPOCaOO00xaD16w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45939},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"824efa6eeb75651865622e3f44c824701fd2ebb0","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"deprecated":"Superseded by a later release — this version's exports map is ESM-only (no `require` condition) and cannot be loaded by CommonJS runtimes; pin the latest 0.1.x instead.","repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.1.0_1783188791990_0.8721633900055561","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ancientpantheon/khronoton-core","version":"0.1.1","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.1.1","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"d9a45e61b9afdd4c201bb18a367d72610e957aae","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.1.1.tgz","fileCount":10,"integrity":"sha512-0qBXVWhtB9GVJtQb3rZkOyaarPmoP1r8AsoX9wBAkeqs7HAqx3anwgxEV5QGas18xI3BVMW2YeiyjnvIC2JLHA==","signatures":[{"sig":"MEQCICsAJt1i6h+R/TTLaBpdqnWPP68HrvQW17MKOKS7xVGoAiBCfkH04//YW5k6Hb6RoMrQlrimIwXFdX89o5XUt2r5YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":46976},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"478acca7587f149a9700d9ac8b2fcd1ff371d87c","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.1.1_1783191268139_0.18369408738385484","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ancientpantheon/khronoton-core","version":"0.2.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.2.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"5656e38af8f1fc8115115caf995699287eb82110","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.2.0.tgz","fileCount":48,"integrity":"sha512-m2mZdG/xtPd52AXThdunrb6yYKlobfm+ooN04GYNeq2zSeDxBUHYaQ90Xy0tkaOVd1eQJByUb2TlliMBKRd6Hw==","signatures":[{"sig":"MEUCIErAxwdTaUFBndVeH29QGrztK+2NoCL1NFDvcPTRw5dPAiEAs4t5Dd7lVhd1eTEkggBd+cGUHNvu2HSIaxEhfNhkMf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":211169},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"}},"gitHead":"289f8a45a1a7086dd50cc0ac65a85e15303abbbe","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"better-sqlite3":"^12.11.1","@types/better-sqlite3":"^7.6.13"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.2.0_1783882344182_0.7936062280331453","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@ancientpantheon/khronoton-core","version":"0.3.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.3.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"fbfc88ef023a14f2a3b0d18f5a9e8aacdbbb7732","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.3.0.tgz","fileCount":74,"integrity":"sha512-OiNCzlfWZ57L4oL9NQ3c1Y/b1t7MW6SoA/7CWES37zknNCKCxddloOrmTqGpDSJjkHRs1v2GYhyfCwn5GN2Mew==","signatures":[{"sig":"MEUCIDLiGFOFa7RuEiiEnw/KNOf082BLkr1xGEaorYzqp3UKAiEAkRoPqEM0bZjsF0gZaQvXA0mkS8yrGyEP10ARzKVKsKw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":552427},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"}},"gitHead":"8a77fb373fb6074a33f641ada75f46e301fa975d","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@testing-library/dom":"^10.4.1","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.3.0_1783974132167_0.17866494434869185","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@ancientpantheon/khronoton-core","version":"0.4.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.4.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"5f9c15c3812d218b25aaaac964d8f32031c48a30","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.4.0.tgz","fileCount":77,"integrity":"sha512-I6VetXPuaK9UKucNSNBQK15ytoS1vwhi6PECfM726az9uz/6HtDdVqAkKqqH2dcXFGEIzGDN41AadxySs+/tMA==","signatures":[{"sig":"MEQCIFp6cyZBDNwbLVJHN/6ulVUiqSoG6XdRPRvIG8JkGRNCAiBu82raiyKugiHl3aoPZxixks6f5EDJJFyC0Bc0HDejkQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":560817},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"1753361acd8a25601cb36cdbab5f293c104cc235","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/ouronet-core":"^4.3.6","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@stoachain/stoa-core":"^4.3.6","@stoachain/ouronet-core":"^4.3.6","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@stoachain/ouronet-core":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.4.0_1783977648479_0.8166364924088807","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@ancientpantheon/khronoton-core","version":"0.4.1","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.4.1","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"a6354bfbee12c60067ada57463b683f6402d4fa5","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.4.1.tgz","fileCount":77,"integrity":"sha512-So4YBUc8j+VXNdvZTLFd5kXKQbm5mraSzCp2lwVA4KXmeojGrSehWGnCCGoOEtxDnXRTLii3/xZpWCpQHhsfrw==","signatures":[{"sig":"MEQCIGaOArBE08oFcIoy0un1RbB86bdGJ8FT/GSRN7zorizkAiA4phmsBOyF5z6e+px0BO7NkNcilVPMSe+UHco/1R3YHg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":562090},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"808140fc324e263f67d0bdf4e578d67802288465","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@stoachain/ouronet-core":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.4.1_1784724875612_0.6721952547226293","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@ancientpantheon/khronoton-core","version":"0.4.2","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.4.2","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"54e0c69e849ebbe34bf7c89da75dcb4ab38c2390","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.4.2.tgz","fileCount":77,"integrity":"sha512-CJSs9tIcVgPq2v4ZFzWDM00eB5fm3ZFmjX+bC8tCg5ptPnRn7vEZMu3hQct9MDNydbc3LVdyZDqG2DyEB/xF9w==","signatures":[{"sig":"MEYCIQDQvCmlbETasEpU12pCjn9W4kw+BOatHQbwCkPLQRiU/AIhAKImxgDSBBsS8tlpczsTlbH3G6G8zxad8GexpyfnegPQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":563056},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"771190b7a94ca08e712b0a2e6deb44f8bcba9345","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.4.2_1784762487217_0.8564933364692806","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@ancientpantheon/khronoton-core","version":"0.5.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.5.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"b99d85ea979bc2c1516407defcad974f16755084","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.5.0.tgz","fileCount":77,"integrity":"sha512-Ho1rY6ybjv3pxsOVMPOJMj/Bh4Nq3rAKnMUXg130Vp+yYzNgTjYkeiDtOE2LgBFoif0JpltFl8oJQWb/3xuL2A==","signatures":[{"sig":"MEUCIHO5N0Fe1nlNGsoq3YrldEN8XlP5CupNmjXtds4gOpTQAiEA6HADoDvdHEkQhLJ5HxqCNri+jWoW1FFb961LeDXLY7M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":577923},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"77288a8b48fc1b71af3ba0f3eb7ad9c3b9d8a260","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.5.0_1785686447717_0.30100625871613595","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@ancientpantheon/khronoton-core","version":"0.6.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.6.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"b0f6e49f2aba35b4be6015e2b5030e3e1a119fb5","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.6.0.tgz","fileCount":77,"integrity":"sha512-cPKT+uUsPqovC8XFP15tMCzg5YwfPcHASCgojolMY111K5karLpVTDGyyITs7pmcCPrYirANv2wdXWz6qMb1Ig==","signatures":[{"sig":"MEUCIFTBCKTrTG/quO60WwzBQTAJCu3pk9+0qxiFfzo9dvxLAiEA2q1ncDhcHgltAuqttqkccVWlwR0hz2U+QSKOO/BW04g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":585074},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"aee413b02a50ddbed0d7a6e8f3943701669d17a2","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.6.0_1785698335911_0.42989905833590214","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@ancientpantheon/khronoton-core","version":"0.6.1","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.6.1","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"bf936c4896bb982c2323c427faad3339338f5eed","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.6.1.tgz","fileCount":77,"integrity":"sha512-+3u3e2qUs8+Hez0mF7ZqQ5UWSIsybxtWNm9/ITTTDrwetmvzrAHXwmw/nW4T4QfC/xdECQqYgOx7capKj8gTgA==","signatures":[{"sig":"MEUCIQDA9tkbOqB6LLK7E3CWVbiSECC0bgN98D9Dd+sPE9OgZQIgKNC0yQsxE0gJifF1LECZsAzPKlsnEemTQHt3axG+M5I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":587834},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"00e066da506e308c3bab29a9b408da2a0977ffaa","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.6.1_1785706505718_0.1901973628995135","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@ancientpantheon/khronoton-core","version":"0.7.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.7.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"f569dc716a53457ca56823827c427a90febaa070","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.7.0.tgz","fileCount":77,"integrity":"sha512-N9YzYQmOKx9uadbBScnC8qbWsIlzV4RQw/SLivUWu77dgmiy5lBRL+oVkrpAUTJ3TuM3AAaEPxDNHNAZ8lMp8A==","signatures":[{"sig":"MEUCIFj+9cRwNlzpY7LHvhPVt6oBiQPAYej70m9tvUrd28/HAiEA9XuAu7Xql66mSF4Vhkb7Xf6UL9FaK503tJaV3pvuLkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":607825},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"69fe96660b79457f5f2b6f82747208399843f2ba","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.7.0_1785782546899_0.07739751306874654","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@ancientpantheon/khronoton-core","version":"0.8.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.8.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"de19d0114e183aaeebb2bb1374d63a9ae47227cb","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.8.0.tgz","fileCount":77,"integrity":"sha512-EKB6FIzdDM7Poa4F71luqN9gWikXSxU4u3w9hGFiaqVBA2svgdRdD3Lg7+ciTuyrmw88+yJRN0Q9ozrXoT9jHw==","signatures":[{"sig":"MEYCIQDhgJ65h/DAv+oiKFr2SJ0V2RFXJcwzq3PN3zy535LjjwIhALUHGPpfXpVBcS+LAs/gDzUemGB0jxMppBN58eqR9PpJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":614954},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"0f82f4b083716a5ced731bf206dc3e4fc220a4b2","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.3.6","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.3.6"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.3.6","@ouronet/ouronet-core":"^4.3.6","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.3.6"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.8.0_1785799391903_0.6344133481929559","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@ancientpantheon/khronoton-core","version":"0.9.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.9.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"09446f9a2e5d509a8e7d94b61f2ceacec7bbbeb5","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.9.0.tgz","fileCount":77,"integrity":"sha512-Ujdgw5/BpEysk2O1i+0qORbpL+WWkmEEs77IUDmMOTvXtjgwpyZd9obpIAyba/h8dzZL+Ar0Q47d/qAM5GJ0Xg==","signatures":[{"sig":"MEQCICC1276ULygEpDBX+zBPaxXN3KA6sy4QxZR+AkqpQGc9AiALcDpe6E0moCz4nd1fruvgweeWnK+MUbpdpuXoDVl/4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":631469},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"c733ce82480b9742f2c34bf74df8466cd89d83e2","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.6.0","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.4.0"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@ouronet/ouronet-core":"^4.6.0","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.4.0"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.9.0_1788820026788_0.16125643797500033","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@ancientpantheon/khronoton-core","version":"0.10.0","license":"UNLICENSED","_id":"@ancientpantheon/khronoton-core@0.10.0","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"homepage":"https://github.com/AncientPantheon/Khronoton#readme","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"e97bd974eecb2b1f5ac509c0517bc6cce286be11","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.10.0.tgz","fileCount":77,"integrity":"sha512-Z4UoCv3pks9NoYpCvqbTzM/UB0ch+xc3233hf95MxB1kidQ1+01jrdyYjpiJY68nTaJJLMORYUQhmMcV74tdtA==","signatures":[{"sig":"MEUCIQCN7KTQ/cZ4phufj+f71X81W5Kp6VqBcqIpEr6+NDXvbQIga3ABZ2KOp9/KINB/06lLSqEzPxpqPu5iR4319DPnRJ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":648754},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"5862b1db59e0c20469f70d75664b0a7f1869223e","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.6.0","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.4.0"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@ouronet/ouronet-core":"^4.6.0","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.4.0"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/khronoton-core_0.10.0_1788895393440_0.3643847524096613","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"_id":"@ancientpantheon/khronoton-core@0.11.0","bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"dist":{"shasum":"564b1e2ec7867a62b34d9796b781271ee0942b36","tarball":"https://registry.npmjs.org/@ancientpantheon/khronoton-core/-/khronoton-core-0.11.0.tgz","fileCount":77,"integrity":"sha512-u8vg6fVp+HxQ6H+GDa3LpEzpsAsUROA3ycmdRxZ0DkOtcQFwcLaPLKKjM3Q+Iv+jy7Ou9ptmV0asQFGc4faOzw==","signatures":[{"sig":"MEQCIFfYOTAYUD4WGGIQcM/CANZMmRJum4mvm4ogOZSGRLixAiBocuJJ45gaTgs8R4DbZG0UDHJhSJRXfix+bDeBkcstBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDzIr4Gdg5hyo8oDsV1A/UIMdnHJJnrfFXz4e3rJwn+TwIhAJkH+2AsCCiLzV4luk36IyUbpyeHYiLCqCs3wy5uhhpq"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ancientpantheon%2fkhronoton-core@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":671959},"main":"./dist/index.js","name":"@ancientpantheon/khronoton-core","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./ui":{"types":"./dist/ui/index.d.ts","import":"./dist/ui/index.js","require":"./dist/ui/index.js"},"./hooks":{"types":"./dist/hooks/index.d.ts","import":"./dist/hooks/index.js","require":"./dist/hooks/index.js"},"./server":{"types":"./dist/server/index.d.ts","import":"./dist/server/index.js","require":"./dist/server/index.js"},"./ui.css":"./dist/ui.css","./handlers":{"types":"./dist/handlers/index.d.ts","import":"./dist/handlers/index.js","require":"./dist/handlers/index.js"},"./provider":{"types":"./dist/provider/index.d.ts","import":"./dist/provider/index.js","require":"./dist/provider/index.js"},"./blockchain/stoachain":{"types":"./dist/blockchain/stoachain.d.ts","import":"./dist/blockchain/stoachain.js","require":"./dist/blockchain/stoachain.js"}},"gitHead":"ae8d0a2b31b0ec92ad1ba3a3d7cd683285f7180b","license":"UNLICENSED","scripts":{"test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.build.json && tsup && node scripts/bundle-css.mjs","clean":"rimraf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:integration":"vitest run --config vitest.integration.config.ts"},"version":"0.11.0","_npmUser":{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"},"homepage":"https://github.com/AncientPantheon/Khronoton#readme","repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"_npmVersion":"10.9.8","description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","directories":{},"maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.4.0","jsdom":"^29.1.1","react":"^19.2.0","react-dom":"^19.2.0","@types/react":"^19.0.10","lucide-react":"^0.475.0","better-sqlite3":"^12.11.1","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@types/react-dom":"^19.0.4","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@testing-library/dom":"^10.4.1","@ouronet/ouronet-core":"^4.6.0","@types/better-sqlite3":"^7.6.13","@uiw/react-codemirror":"^4.23.10","@testing-library/react":"^16.3.2","@stoachain/kadena-stoic-legacy":"^4.4.0"},"peerDependencies":{"react":"^18 || ^19","react-dom":"^18 || ^19","@codemirror/view":"^6.36.4","@lezer/highlight":"^1.2.3","@codemirror/state":"^6.5.2","@codemirror/language":"^6.12.4","@stoachain/stoa-core":"^4.4.0","@ouronet/ouronet-core":"^4.6.0","@uiw/react-codemirror":"^4.23.10","@stoachain/kadena-stoic-legacy":"^4.4.0"},"optionalDependencies":{"better-sqlite3":"^12.11.1"},"peerDependenciesMeta":{"react":{"optional":true},"react-dom":{"optional":true},"@codemirror/view":{"optional":true},"@lezer/highlight":{"optional":true},"@codemirror/state":{"optional":true},"@codemirror/language":{"optional":true},"@stoachain/stoa-core":{"optional":true},"@ouronet/ouronet-core":{"optional":true},"@uiw/react-codemirror":{"optional":true},"@stoachain/kadena-stoic-legacy":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/khronoton-core_0.11.0_1789651418454_0.7353025798542838"}}},"time":{"created":"2026-07-04T18:13:11.812Z","modified":"2026-09-17T13:23:38.938Z","0.1.0":"2026-07-04T18:13:12.135Z","0.1.1":"2026-07-04T18:54:28.286Z","0.2.0":"2026-07-12T18:52:24.326Z","0.3.0":"2026-07-13T20:22:12.355Z","0.4.0":"2026-07-13T21:20:48.712Z","0.4.1":"2026-07-22T12:54:35.769Z","0.4.2":"2026-07-22T23:21:27.446Z","0.5.0":"2026-08-02T16:00:47.868Z","0.6.0":"2026-08-02T19:18:56.075Z","0.6.1":"2026-08-02T21:35:05.896Z","0.7.0":"2026-08-03T18:42:27.182Z","0.8.0":"2026-08-03T23:23:12.130Z","0.9.0":"2026-09-07T22:27:06.940Z","0.10.0":"2026-09-08T19:23:13.591Z","0.11.0":"2026-09-17T13:23:38.577Z"},"bugs":{"url":"https://github.com/AncientPantheon/Khronoton/issues"},"license":"UNLICENSED","homepage":"https://github.com/AncientPantheon/Khronoton#readme","repository":{"url":"git+https://github.com/AncientPantheon/Khronoton.git","type":"git","directory":"packages/khronoton-core"},"description":"Headless framework-agnostic scheduler engine: pure schedule math plus an injectable tick engine. No database, no job queue, no framework — hosts inject storage and firing via hooks.","maintainers":[{"name":"kjrkentolopon","email":"kjrkentolopon@ancientholdings.eu"}],"readme":"# @ancientpantheon/khronoton-core\n\nThe headless scheduler engine of the AncientPantheon stack — pure 7-mode schedule math plus an injectable `tickOnce` tick engine. Extracted from the AncientHoldings hub's inline scheduler (\"Cronoton\"), generalised into a framework-agnostic library: **no database, no job queue, no framework**. Hosts inject storage and firing behaviour via hooks; the engine only decides *when* things are due and *what* to fire.\n\nKhronoton is the \"When do I act?\" Constructor of the Pantheon architecture — the heartbeat that separates an autonomous Automaton from a human-triggered Daimon. See the [repo README](https://github.com/AncientPantheon/Khronoton) for the full positioning.\n\n## Status\n\n**`0.11.0` on public npmjs** — **MINOR.** Released 2026-09-17. Two independent handoffs, shipped together. **Editor Save:** an always-visible edit-mode `SaveBar` (Simulate + Save changes + live status) now renders on every tab, gated on the edited row having actually loaded so it can never fire a Simulate against a blank default state; the Execute tab's own Commit button is edit-aware (\"Save changes\"); a new shared `useCommitGate(state, sim)` hook keeps both surfaces reading the identical commit body and gate, computed once. **Auto self-calibrating gas:** `autoGasLimit` now defaults to `true` for new cronotons; `ChainClient` gains optional `preflightRead` (accurate gas via the SDK's preflight mode, replacing `dirtyRead`'s execution-only measurement for AUTO fires) and `getBlockGasLimit` (a live block-ceiling fetch with a static fallback); a transaction whose measured gas exceeds the resolved ceiling is now refused with a structured error — never silently capped or submitted — for both AUTO and MANUAL fires, with the ceiling itself validated against `NaN`/non-finite/non-positive values before use. **980 specs pass.**\n\n**`0.10.0` on public npmjs** — **MINOR.** Released 2026-09-08. The Builder's absolute \"Gas Price (ANU)\" field is gone: the UI now shows a read-only, live-refreshing \"Live Network Floor\" plus an editable \"Priority Buffer (ANU above floor)\" (default 0), and every fire prices as `liveFloor(creationTime) + buffer`. New optional `CodexTxConfig.gasPriceBufferAnu` (absent/pre-migration rows default to 0, self-healing with no DB migration); `gasPrice` stays, `@deprecated`, for reading historical rows. `ChainRuntime.gasMeta` gains an optional 2nd `bufferAnu` param (non-breaking) — the adapter sums floor+buffer **in ANU** before the one conversion, not two summed STOA floats. A negative/non-finite buffer can never underprice a fire — enforced at three layers: client `validateConfig`, the store's `commitCodexCronoton`/`editCodexCronoton` (reject before any write), and the seam's own defensive clamp. New `useLiveGasFloor()` hook polls every 30s plus visibilitychange/focus. `BuilderConfig.gasPriceAnu` and `CommitGateOptions.minGasPriceAnu` are **removed** (not deprecated-in-place) — both lost all meaning once there's no absolute price to floor-check. **938 specs pass** (+5 real-runtime integration specs).\n\n**`0.9.0` on public npmjs** — **MINOR.** Released 2026-09-07. Scheduled transactions are now priced against the chain's **live** gas floor at fire time instead of a static value stored at creation time. A cronoton's `gasPrice` was persisted once at creation and read back verbatim on every tick, so as chainweb's post-fork Yin Engine floor rises, a long-lived cronoton silently drifts below it and its fire is rejected — with nobody watching a 3am tick. (Live, not theoretical: at release the floor was **11,569 ANU** against a stored default of **10,000**.) Adds an **optional** `ChainRuntime.gasMeta(floorAnu)` seam returning `{ creationTime, gasPrice }` from one clock read; the stored price becomes a **floor an operator can raise, never a cap**, so existing rows **self-heal with no migration**. `creationTime` is now stamped explicitly from the same call that produced the price (it was previously auto-stamped by the Pact builder from a second, independent clock read), and the AUTO-gas rebuild re-derives both fresh. Transaction meta uses the precision-safe `anuToStoaNumber` rather than float division. A StoaChain fire on a runtime lacking `gasMeta` **fails loudly** rather than silently reusing the stale price. Requires a coordinated bump of `@stoachain/stoa-core@^4.4.0`, `@stoachain/kadena-stoic-legacy@^4.4.0`, `@ouronet/ouronet-core@^4.6.0`. **907 specs pass** (+5 real-runtime integration specs).\n\n**`0.8.0` on public npmjs** — **MINOR.** Released 2026-08-03. Finalizes the evented-resolver UI. **(1)** The cronoton **DETAIL** card's \"Schedule\" field now reads **\"Evented\"** for a trigger-only/evented row (it previously showed the stored schedule like \"Daily at 12:00 UTC\" while Next Fire already read \"—\"); the list and detail now share one `isTriggerOnly(row)` predicate (`external_fireable === 1 || runtime-arg keys`) so they can't drift. **(2)** A system (`server_resolver`) cronoton is now **deletable behind a confirm-gated warning** instead of a hard 409: `DELETE /[id]?force=1` permits the delete (the 409 still stands without force), threaded via `ConfirmOpts.force` + both reference adapters + the widened `remove.run({ force })`; the bundled Builder's Delete button is enabled for an admin on a system row and shows a warning naming the resolver before deleting, with the audit recording `forced: true`. Ordinary scheduled cronotons and non-forced deletes are unchanged. **893 specs pass.**\n\n**`0.7.0` on public npmjs** — **MINOR.** Released 2026-08-03. Makes event-driven resolvers **server-authoritative**: `SingleTxResolver`/`MultiTxResolver` gain an `evented?` flag, and the **store** forces an evented resolver's cronoton scheduleless (`next_fire_at = NULL`, excluded from the due-query) **and `external_fireable = 1`** even when a schedule is sent — the guarantee no longer depends on the consumer. Adds `GET /resolvers` (+ an OPTIONAL `resolvers()` adapter method and `useServerResolvers` hook) so the Builder learns which resolvers are evented; the list shows **\"Evented\"** as the next-fire for a trigger-only row; and the store enforces **one resolver ↔ one cronoton** (a second bind is rejected). Deliberately reverses 0.6.0's HMAC stance — an evented row is now HMAC-fireable — codifying Pythia's shipped behavior (see version history). **871 specs pass.**\n\n**`0.6.1` on public npmjs** — **PATCH.** Released 2026-08-02. Fixes a crash that white-screened the Khronoton admin list whenever it held ≥1 cronoton: `listCodexCronotons` returned a camelCase 9-field projection while `CronotonList` renders full snake_case rows, so `pact_code` was `undefined` and crashed `pactPreview`. The list now returns full `CodexCronotonRow`s (`SELECT *`, like `getCodexCronoton`) and `pactPreview` guards a missing `pact_code`. **850 specs pass.**\n\n**`0.6.0` on public npmjs** — **MINOR.** Released 2026-08-02. Server resolvers can now declare themselves **event-driven** (`ServerResolverOption.eventDriven`): selecting one in the Builder commits the cronoton scheduler-off (`next_fire_at = NULL`, never auto-fired) and swaps the schedule editor for an event-driven notice — the host fires it in-process via the existing `executeNow` (not the HMAC endpoint). Ordinary scheduled resolvers are unchanged. **848 specs pass.**\n\n**`0.5.0` on public npmjs** — **MINOR.** Released 2026-08-02. The Builder screen's Pact-code editor is now syntax-highlighted (via the package's `--khr-*` theme tokens, five new ones added), moved to a full-width top strip (~7 lines, internal scroll) with the header/tabs/tab content full-width below it, and gained a live tx-size/gas metering strip. `@uiw/react-codemirror` + the CodeMirror/Lezer packages it now depends on for highlighting are real optional `peerDependencies`. **832 specs pass.**\n\n**`0.4.2` on public npmjs** — **PATCH.** Released 2026-07-22. Aligns the `peerDependenciesMeta` key with the `@ouronet/ouronet-core` peer renamed in 0.4.1 (the meta entry still named the old `@stoachain` peer). No code change. **799 specs pass.**\n\n**`0.4.1` on public npmjs** — **PATCH (dependency rename, no code change).** Released 2026-07-22. `@stoachain/ouronet-core` → `@ouronet/ouronet-core` — same code, new scope, following the Phase-4 split into OuroborosNetwork/ouronet-libs. **799 specs pass.**\n\n**`0.4.0` on public npmjs** — the complete drop-in codex-cronoton experience, matching the AncientHoldings Hub, now **chain-polyglot**. On top of the byte-unchanged root `.` schedule engine and `/server` automaton engine (both from 0.2.0), the package ships the whole experience layer as subpaths so a consumer wires the Hub's cronoton UX end to end without re-implementing it:\n\n- **`/handlers`** — framework-agnostic HTTP route handlers over the `/server` store + executor (list/get/fires/signers/commit/edit/pause/resume/delete/simulate/execute-now/trigger/batch/recover), driven by a tiny `HandlerRequest`/`HandlerResponse` seam so any router (Next.js, Express, …) can mount them.\n- **`/provider` + `/hooks`** — the React data layer: `<KhronotonProvider adapter={…}>`, the 16-method `KhronotonAdapter` seam with two reference adapters (`createFetchAdapter` over HTTP, `createMemoryAdapter` over in-process handlers), the shared `runGated` confirm-retry, and the data + action hooks (`useCronotons`/`useCronoton`/`useCronotonFires`/`useManualBatch` + the lifecycle/execute action hooks).\n- **`/ui` + `/ui.css`** — the React UI at full Hub parity: the four screens **List**, **Detail/Observe** (fire history with 50/page pager, definition-drift flag, result tooltip, pluggable multi-tx renderer, wired recover), **Builder** (syntax-highlighted Pact-code editor full-width on top, Config/Payload/Gas Payer/Signatures/Execute tabs full-width below, Simulate→AUTO-gas calibrate, a live tx-size/gas metering strip), and a **Public** read-only transparency view — themed entirely through `--khr-*` CSS variables inside `<KhronotonUiRoot>`.\n\nKhronoton isn't chain-*agnostic* — it's chain-*polyglot*: the root schedule/tick engine orchestrates, and the **`/blockchain/<chain>`** subpath family teaches it to speak each supported chain's language natively (0.4.0):\n\n- **`/blockchain/stoachain`** — `createStoachainRuntime(config?)` wraps the `@stoachain/*` runtime into the core `ChainRuntime` seam, so a StoaChain automaton injects one object instead of reaching for `@stoachain/*` directly. Future chains land as sibling subpaths (`/blockchain/<chain>`).\n\nEach chain's SDK is an **optional peer dependency** (`@stoachain/*` for `/blockchain/stoachain`), and the adapter imports it lazily — so `npm install @ancientpantheon/khronoton-core` pulls **zero** chain SDKs, and you carry only the SDK(s) for the chain(s) you actually import. It's one package, one version, one drop-in for every automaton. Likewise React is an optional peer for the `/provider`, `/hooks`, and `/ui` subpaths only. Every JS subpath resolves under both import conditions (ESM `import` + CJS `require`); the root `.`, `/server`, and `/handlers` outputs are byte-identical to 0.3.0/0.2.0.\n\n## Schedule engine\n\nThe engine exports pure functions over a discriminated `ScheduleConfig` union — no side effects, no clock reads, no randomness. You pass in the current time (`now`) explicitly; two calls with identical arguments always return identical results.\n\n### The 7 schedule modes\n\n`ScheduleMode` is one of seven string literals, each paired with its own config shape:\n\n| Mode | Config fields | Fires |\n| --- | --- | --- |\n| `daily-at-utc` | `hours: number[]`, `minute: number` | At each listed UTC hour every day |\n| `every-n-minutes` | `startDate: string` (ISO), `intervalMinutes: number` | Every N minutes, anchored to `startDate` |\n| `weekly` | `daysOfWeek: number[]` (0–6), `hour`, `minute` | At the given UTC time on each listed weekday |\n| `monthly` | `daysOfMonth: number[]` (1–31), `hour`, `minute` | At the given UTC time on each listed day of month |\n| `cron-expression` | `expression: string` | Per the 5-field UTC cron expression (see below) |\n| `one-time` | `fireAt: string` (ISO) | Exactly once, then terminal |\n| `several-times-per-day` | `times: { hour; minute }[]` | At each listed UTC time-of-day, every day |\n\n### `computeNextFire(mode, config, now)`\n\n```ts\ncomputeNextFire(mode: ScheduleMode, config: ScheduleConfig, now: Date): Date | null\n```\n\nReturns the next instant strictly after `now` at which the schedule is due. The contract is **TOTAL**, **MONOTONIC**, and **PURE**:\n\n- **TOTAL** — a valid `(mode, config, now)` triple never throws; a malformed config throws `InvalidScheduleConfigError`. Recurring modes always yield a future `Date`. The terminal `one-time` mode yields `null` once its single fire is in the past (a valid result, not an error).\n- **MONOTONIC** — for the same recurring schedule, a later `now` yields an equal-or-later next-fire; every recurring mode iterates strictly forward from `now`.\n- **PURE** — no `Math.random`, no `Date.now()`; `now` is the explicit input.\n\n```ts\nimport { computeNextFire } from '@ancientpantheon/khronoton-core';\n\ncomputeNextFire(\n  'daily-at-utc',\n  { mode: 'daily-at-utc', hours: [12], minute: 0 },\n  new Date('2026-06-01T00:00:00.000Z'),\n); // → Date 2026-06-01T12:00:00.000Z\n```\n\n### `summariseSchedule(mode, config)`\n\n```ts\nsummariseSchedule(mode: ScheduleMode, config: ScheduleConfig): string\n```\n\nReturns a short human-readable description of a schedule (e.g. `\"One-time at 2026-07-01T12:00:00.000Z UTC\"`). Pure — it never reads `Date.now()` or the system locale.\n\n### In-tree cron parser\n\nThe `cron-expression` mode is backed by a pruned in-tree parser — **no `cron-parser` dependency is added**. It accepts the standard 5-field UTC shape `minute hour dayOfMonth month dayOfWeek`, with this per-field syntax:\n\n| Syntax | Meaning |\n| --- | --- |\n| `*` | any value |\n| `N` | a literal integer |\n| `N,M,...` | a comma list |\n| `N-M` | an inclusive range |\n| `*/STEP` | step from the field's start |\n| `N/M` | step from `N` |\n\nExplicitly **rejected** (throws `InvalidScheduleConfigError`): `@hourly`/`@daily` and other `@macro` shorthands, a seconds field (6-field expressions), and the Quartz extensions `L`, `W`, and `#`.\n\n`dayOfMonth` and `dayOfWeek` follow standard cron **OR-matching** when both are restricted: a day matches if it satisfies *either* field. A field written as its full range (`1-31` for dayOfMonth, `0-6` for dayOfWeek) is detected as a wildcard, so the OR only applies when both fields are genuinely restricted.\n\n### Errors\n\n`InvalidScheduleConfigError` is the single typed reject for malformed configs (out-of-range values, non-integer times, unparseable ISO instants, malformed cron expressions). Well-formed inputs never throw.\n\n## Tick engine\n\n`tickOnce(now, deps)` walks the rows that are due at `now` and fires each once, delegating all host coupling to three injected hooks. It performs no storage, queue, clock, or framework access of its own — the host supplies those through `deps`. It calls `computeNextFire` internally to decide each row's next instant.\n\n```ts\nimport { tickOnce } from '@ancientpantheon/khronoton-core';\nimport type { TickRow, TickResult, TickDeps } from '@ancientpantheon/khronoton-core';\n\ntickOnce(now: Date, deps: TickDeps): TickResult\n```\n\n### The three injected hooks\n\n| Hook | Signature | Role |\n| --- | --- | --- |\n| `loadDue` | `(now: Date) => TickRow[]` | Return the rows due at `now`. A throw here propagates out of `tickOnce` (isolation is per-row, not batch-level). |\n| `enqueueFire` | `(row: TickRow) => void` | Dispatch the fire (queue/audit). Receives the host's **full** row object — the generic engine reads only `id`/`mode`/`config`, so any extra host fields ride along untouched. |\n| `persistNextFire` | `(id: string, nextDate: Date, firedAt: Date) => void` | Durably record the advance. `firedAt` is the tick's explicit `now` — never a clock read. |\n\nA `TickRow` is `{ id: string; mode: ScheduleMode; config: ScheduleConfig | string }`. Its `config` accepts **both host forms**: a typed `ScheduleConfig` object, or a JSON string that the engine parses per-row inside the isolated try (so one unparseable row is skipped, not the whole batch).\n\n### Result semantics\n\n`tickOnce` returns `{ firedIds: string[]; skippedIds: string[] }`:\n\n- **Fired** — a row's id lands in `firedIds` only when **both** `enqueueFire` and `persistNextFire` returned without throwing.\n- **Skipped** — every other processed outcome lands in `skippedIds`: an unparseable config, a `computeNextFire` rejection, a throwing hook, or a spent `one-time` schedule (`computeNextFire` → `null`, a valid terminal state, not an error and not logged).\n- The two sets are disjoint and together cover exactly the rows that were processed.\n\n### Guarantees\n\n- **Enqueue strictly before persist**, and persist runs **only after** enqueue succeeds. A crash between the two re-fires the row on the next tick rather than silently dropping it. An `enqueueFire` throw leaves `persistNextFire` uncalled for that row.\n- **Per-row isolation** — each row is processed in its own `try`; one bad row is logged and skipped, and the tick continues. No status or row mutation: the engine's only write channel is `persistNextFire`, whose signature cannot express a status change.\n- **Batch cap** — at most `maxBatch` rows are processed per tick (default **100**), regardless of how many `loadDue` returns. Overflow rows appear in **neither** result set; they stay due and are re-read next tick. A provided `maxBatch` that is not a positive integer (`0`, negative, fractional, `NaN`) throws a `RangeError` **before** any hook runs — never a silent zero-batch or dropped-tail.\n- **Synchronous** — `tickOnce` returns a plain object, not a Promise. The engine holds no in-memory timers and carries no state across calls, so it is restart-safe: the host re-reads due state via `loadDue` each tick.\n\n### Optional deps\n\n- `maxBatch?: number` — override the default 100 (positive integer only; see above).\n- `logError?: (message: string) => void` — redirect skip logging; defaults to `console.error`.\n\n### Host preconditions\n\n1. **The three hooks must themselves be synchronous.** TypeScript's `=> void` contextual typing silently accepts an `async` hook, but its returned Promise is neither awaited nor error-handled — an async hook voids the enqueue-before-persist ordering and the per-row-isolation guarantees. Async hosts are a future, separate additive API.\n2. **`loadDue` must return at most one row per id.** The fired/skipped disjoint-set semantics assume unique ids; behavior under duplicate ids is unspecified.\n\n```ts\nconst result = tickOnce(new Date('2026-05-24T12:00:00.500Z'), {\n  loadDue: () => [\n    { id: 'r1', mode: 'daily-at-utc', config: { mode: 'daily-at-utc', hours: [12], minute: 0 } },\n  ],\n  enqueueFire: (row) => queue.push(row.id),\n  persistNextFire: (id, nextDate, firedAt) => db.advance(id, nextDate, firedAt),\n});\n// → { firedIds: ['r1'], skippedIds: [] }; nextDate = 2026-05-25T12:00:00.000Z, firedAt = the passed now\n```\n\n## What this package does NOT contain\n\nPersistence, queues, timers, HTTP, or any framework binding — those stay in the host (the AncientHoldings hub keeps its own glue and imports this package for the scheduling logic). The `tickOnce` tick engine walks due schedules and invokes host hooks, but it never touches storage, queues, or clocks itself — the host injects all coupling through `loadDue`/`enqueueFire`/`persistNextFire`.\n\n## Server engine (`/server`)\n\nThe `@ancientpantheon/khronoton-core/server` subpath is the stand-alone automaton layer: everything needed to run scheduled, signed, on-chain firing on top of the root schedule engine. It ships **no** chain client, **no** database driver, and **no** framework — the host injects those through six seams. The root `.` import (pure schedule math + `tickOnce`) is byte-unchanged and carries no server dependency.\n\n```ts\nimport {\n  installSchema,\n  codexCronotonTickOnce,\n  processDueManualBatchesOnce,\n  startKhronotonLoop,\n  executeCodexTransaction,\n  registerServerResolver,\n  fireByServerResolver,\n} from '@ancientpantheon/khronoton-core/server';\n```\n\n### The six injection seams\n\nThe host provides these; the engine stays framework- and chain-agnostic:\n\n- **`KeyResolver`** — resolves a public key to a signing keypair (`getKeyPairByPublicKey`, `listCodexPubs`). This is where the codex signs.\n- **`ChainRuntime`** — the chain client + constants: a Pact builder, `createClient(url) → { dirtyRead, submit, listen }`, a universal signer, gas helpers (`calculateAutoGasLimit`, `anuToStoa`), and `networkId` / `namespace` / `getPactUrl` / `gasStationAccount`.\n- **`Database`** — a minimal structural handle (`exec`, `prepare(...).run/get/all`); a `better-sqlite3` instance satisfies it structurally, but any driver of that shape works. Run `installSchema(db)` once to create the three tables.\n- **`onAudit`** — a sink called once per fire with `{ action, result, targetKind, targetId, detail }`.\n- **`resolveFireMode`** — synchronous `(cronotonId) => 'test' | 'live'`; a per-row `fire_mode_override='live'` wins first.\n- **`Config`** — six optional knobs; each defaults when omitted:\n\n  | Field | Default | Meaning |\n  | --- | --- | --- |\n  | `tickIntervalMs` | `30_000` | Loop interval |\n  | `listenTimeoutMs` | `300_000` | Fire listen timeout |\n  | `autoGasCeiling` | `2_000_000` | AUTO-gas pre-flight build ceiling |\n  | `singleTxGasGuard` | `1_600_000` | Server-resolver single-tx gas guard |\n  | `tickBatchLimit` | `100` | Rows claimed per tick |\n  | `manualBatch` | `{ min: 2, max: 60, intervalSeconds: 60 }` | Manual-batch bounds + spacing |\n\n  (There is no `gasPriceFloor` or `ttl` knob — the executor uses each cronoton's own `definition.config` gas price and TTL directly.)\n\n### Exactly-once (claim-before-fire)\n\nA due fire happens **once and only once**. Before firing, the tick issues an atomic conditional `UPDATE` that re-asserts the row is still due and advances its `next_fire_at` in the same statement; it fires only if that write claimed the row (`changes === 1`). Two overlapping ticks on the same row → the second claim is a no-op → no double-submit. This is the primary double-fire guard and needs **no leader election**; a multi-worker lease, if ever wanted, is the host's concern.\n\n### Wire-in recipe (Automaton host, e.g. Mnemosyne)\n\n```ts\nimport Database from 'better-sqlite3';\nimport { installSchema, startKhronotonLoop } from '@ancientpantheon/khronoton-core/server';\n\nconst db = new Database('automaton.db');\ndb.pragma('foreign_keys = ON');\ninstallSchema(db);\n\nconst ctx = {\n  db,\n  resolver,        // your KeyResolver adapter\n  runtime,         // your ChainRuntime adapter\n  onAudit,         // your audit sink\n  resolveFireMode, // () => 'test' | 'live'\n  config,          // full Config (or omit fields to take the defaults above)\n};\n\nconst { stop } = startKhronotonLoop(ctx); // ticks every config.tickIntervalMs; call stop() to halt\n```\n\n### API route contract (deferred)\n\nThis bump ships the engine only. Framework-agnostic HTTP handlers (create/edit/list/trigger/simulate a cronoton) are **not** included — a host writes thin routes over the exported store + `executeCodexTransaction`/`fireByServerResolver` surface. The route contract is documented for that; concrete handlers arrive in a later bump.\n\n### Node floor\n\nThe `/server` subpath's CJS `require` condition relies on Node's `require(esm)` support (Node **≥ 20.19 / ≥ 22.12**), the same mechanism as the root's 0.1.1 `require` condition — so the effective Node floor for CommonJS consumers is ≥ 20.19. The package `engines` field stays `>=20` (unchanged), matching the root.\n\n## Install\n\n```bash\nnpm install @ancientpantheon/khronoton-core\n```\n\n## Version history\n\n**v0.11.0** — Discoverable edit-mode Save + auto self-calibrating gas. Two independent handoffs built and shipped together. **Editor Save.** Editing an existing cronoton had no discoverable Save — the only action was the \"Commit Codex Cronoton\" button on the last (Execute) tab, silently disabled under AUTO gas until a Simulate ran, with the reason invisible from any other tab. Adds an always-visible edit-mode `SaveBar` (`ui/builder/SaveBar.tsx`) — Simulate, Save changes, and a live status line — rendered above the Pact editor/tabs on every tab, gated on `Builder.tsx`'s `editReady` (the edited row having actually finished loading) so it can never fire a Simulate against the blank default `makeEmptyBuilderState()` during the load window. The Execute tab's own Commit button is now edit-aware (\"Save changes\" / \"Saving…\"); create mode is byte-identical to before. A new shared `useCommitGate(state, sim)` hook (`ui/builder/use-commit-gate.ts`), extracted from `ExecuteTab.tsx`'s own prior inline logic, is called ONCE in `Builder.tsx` and threaded as `commit`/`gate` props to both `SaveBar` and `ExecuteTab` — no risk of two independent `builderToCommit`/`canCommit` call sites drifting apart, and no duplicate computation on every keystroke when both are mounted. Both of `SaveBar`'s buttons are `canMutate(access)`-gated in their CLICK HANDLERS, not just their `disabled` attribute (a directly-dispatched click event still reaches a React handler regardless of the DOM disabled state). **Auto self-calibrating gas.** Khronoton transactions defaulted to a fixed, manually-set gas limit, so fires over-reserved gas wildly — a real pool-payout fire measured 594 gas used against a 600,000 limit. `makeEmptyBuilderState()`'s `config.autoGasLimit` now defaults to `true`. `ChainClient` (`server/seams.ts`) gains two new optional methods: `preflightRead` — implemented in `blockchain/stoachain.ts` via the SDK's raw `local(tx, {preflight:true, signatureVerification:false})`, NOT its `.preflight` convenience alias (which also forces `signatureVerification:true`) — measures the TRUE gas including the transaction-size charge that plain `dirtyRead` omits; `getBlockGasLimit` does a best-effort `/config` fetch (mirroring OuronetUI's `gas-limits.ts`, ported without its browser-oriented module-level mutable-singleton cache — this package fetches fresh per fire instead, since a Node server core handling concurrent fires can't safely share that kind of global state) falling back to the existing static `AUTO_GAS_CEILING` on any failure. `executor.ts`'s `runSimulate`/`runFire` were reordered so the `ChainClient` is constructed BEFORE ceiling resolution (ceiling resolution needs it) — a real sequencing fix, not just an addition. AUTO-gas fires now calibrate from `preflightRead`; a runtime missing it hard-throws on an AUTO-gas fire only (mirroring the 0.9.0 `gasMeta` precedent — silent fallback would ship the exact over-reservation bug this exists to fix), while a MANUAL-gas fire on the same un-upgraded runtime is completely unaffected. A new refuse-unmineable check returns a structured `{ok:false, error}` — never a silent cap, never a submit — when measured gas exceeds the resolved ceiling, for BOTH AUTO and MANUAL fires. The ceiling itself (from either the live fetch or an explicit `Config.autoGasCeiling` override) is validated via a new `isSaneCeiling` check (`Number.isFinite && > 0`) before use — `NaN` in particular would otherwise silently defeat the refuse check entirely, since every `gasUsed > NaN` comparison is `false` in JS. Reviewed via nectar (2 rounds, 5 lenses then a targeted 2-lens re-pass, adversarial validation throughout): 9 CONFIRMED findings fixed, including two initially-HIGH findings (the `SaveBar` pre-load readiness gap; its originally-unguarded Simulate click) validated down to MEDIUM once the actual blast radius was traced against the code (Save itself stayed correctly disabled during the load window; the server independently re-authorizes via its own `withConfirm`/`auth.requireConfirm` gate regardless of what the UI allows). Full history in `docs/work/khronoton-editor-save-and-auto-gas/review.md`. Released 2026-09-17. **980 specs pass.**\n\n**v0.10.0** — Locked live-floor gas + priority buffer. 0.9.0 made the executor floor a *stored* absolute price against the live Yin Engine floor so a fire could no longer underprice, but the Builder UI still framed gas price as something an operator *sets* — the wrong model for a recurring transaction, since any absolute number typed today is guaranteed to go stale as the live floor keeps rising every ~3h. This finishes the redesign: the UI shows a read-only, live-refreshing \"Live Network Floor\" display plus an editable \"Priority Buffer (ANU above floor)\" (default 0), and every fire prices as `liveFloor(creationTime) + buffer`, derived fresh at build time — never a cached/stored absolute value. **Schema.** `CodexTxConfig` gains optional `gasPriceBufferAnu`; `gasPrice` stays, `@deprecated`, read-only, so historical `config_json` still parses — absence (every pre-migration row) defaults to 0, self-healing with no DB migration. **Seam.** `ChainRuntime.gasMeta(floorAnu, bufferAnu?)` — the buffer is a new optional 2nd parameter (non-breaking: TypeScript accepts a shorter existing implementation as satisfying the widened optional signature). The adapter (`blockchain/stoachain.ts`) sums `floorAnu + bufferAnu` **in ANU**, inside the adapter, before the **one** `anuToStoaNumber` conversion at the end — summing two independently-converted STOA floats instead produces a different serialized value in roughly 1 in 5 floor/buffer pairs, reintroducing the exact precision bug 0.9.0 fixed. `buildTransaction` always calls `gasMeta(0, config.gasPriceBufferAnu ?? 0)` now — there is no more stored absolute value to raise to a floor, so the seam's first argument is always 0. **Defense in depth.** A negative or non-finite buffer can never underprice a fire, enforced at three independent layers: `ui/builder-state.ts`'s `validateConfig` blocks commit client-side; `server/store/cronoton.ts`'s `commitCodexCronoton`/`editCodexCronoton` reject a present-and-invalid `gasPriceBufferAnu` before any write, so a caller reaching the store directly (bypassing the Builder UI) can't persist a row that silently underprices every future fire; and `blockchain/stoachain.ts`'s `gasMeta` clamps a bad buffer to 0 as a third line of defense for any `CodexTxDefinition` built outside the store entirely. **Live display.** New `useLiveGasFloor()` hook (`ui/builder/live-gas-floor.ts`) polls the live floor every 30s plus a `visibilitychange`/`focus` refresh — browsers throttle `setInterval` in backgrounded tabs, and this Builder screen is routinely left open for hours — called once in `Builder.tsx`, threaded to `ConfigTab` and `ExecuteTab`. **Precision fix applied a second place.** `ui/tx-size.ts`'s size estimator now uses the same floor+buffer-summed-in-ANU-then-converted-once formula the executor uses, instead of the deprecated absolute `gasPrice`. **Breaking at the UI-type layer.** `BuilderConfig.gasPriceAnu` and `CommitGateOptions.minGasPriceAnu` are **removed**, not deprecated-in-place — both lose all meaning once there is no absolute price to floor-check against, and keeping them would be actively misleading; `CodexTxConfig` itself stays additive. Reviewed via nectar across 3 rounds (5 lenses each, adversarial validation): round 1 found and fixed a HIGH gap (server-side validation of the buffer was entirely absent) plus 5 lower-severity test-coverage/UI gaps; round 2 re-verified those fixes and caught 3 more small issues (a misleading UI label, duplicated validation logic, a test-loop robustness nit); round 3 caught one last barrel-export asymmetry — all fixed, full history in `docs/work/gas-price-buffer/review.md`. Released 2026-09-08. **938 specs pass** (+5 real-runtime integration specs).\n\n**v0.9.0** — Live gas floor at fire time. `buildTransaction` priced every fire off `definition.config.gasPrice`, a plain ANU number persisted in `codex_cronotons` at creation time and read back verbatim on every tick (`server/tick.ts`, `server/store/mappers.ts`) — never re-derived. Post-fork, chainweb-node validates a signed transaction's price against the rising Yin Engine floor **as of that transaction's own `creationTime`**, so a cronoton created at the builder's 10,000 ANU default is already underpriced and drifts further as it ages; because this is unattended automation, the rejection surfaces at 3am with nobody watching. **The seam.** `ChainRuntime` gains an **optional** `gasMeta(floorAnu): { creationTime, gasPrice }`. Optional keeps the package chain-POLYGLOT and `@stoachain/*` an optional peer dependency — a chain without a rising floor omits it — but the executor **hard throws** when a StoaChain fire finds it missing, because a silent fallback to the stored value would ship the original bug to anyone who did not notice they must upgrade their adapter. In `fire` mode that throw is caught by the existing F-002 wrapper and returned as a structured `{ ok: false, error }`, so a one-time entry still records its spent attempt instead of re-firing forever. **Floor, not cap.** The implementation returns `max(storedAnu, minGasPriceAnu(creationTime))`, so an operator may still price above the minimum and existing stored rows self-heal with **no database migration**. **One clock read.** `setMeta` previously omitted `creationTime` entirely, letting the Pact builder auto-stamp its own at `createTransaction()` — an independent second read the price no longer corresponded to. Both fields now come from a single `stoaGasMeta()`-derived call, and the AUTO-gas calibrated rebuild+re-sign re-enters the seam rather than reusing the pre-flight values, so the two builds cannot straddle a 3-hour tick boundary and underprice the transaction that actually ships (pinned by a regression spec that fails if the call is hoisted out of `buildTransaction`). **Precision.** Transaction meta now converts via `anuToStoaNumber` (exact padded-decimal) instead of `anuToStoa` (float division), which upstream documents as unsafe for a value chainweb hashes and validates exactly; the same fix lands in `ui/tx-size.ts`'s fee meter, whose purpose is predicting the real signed transaction's byte size. **Builder gate.** `validateConfig` accepts `CommitGateOptions.minGasPriceAnu` in place of a hardcoded `>= 10000` check that accepted already-underpriced values, and names the applied floor in its message; omitting it falls back to the genesis floor, under-rejecting rather than over-rejecting since the executor raises the price at fire time regardless. **Boundary.** `blockchain/stoachain.ts` is the only module that knows the Yin Engine exists, wrapping `@stoachain/stoa-core/gas` rather than reimplementing a formula already independently reimplemented four times across the ecosystem; `/server` stays free of any `@stoachain/*` import. Requires a coordinated dependency bump — stoa-core 4.4.0 peer-pins kadena-stoic-legacy 4.4.0 exactly, and only ouronet-core 4.6.0 accepts stoa-core 4.4.0, so the three move together. All new surface (`StoaGasMeta`, `ChainRuntime.gasMeta`, `CommitGateOptions.minGasPriceAnu`) is additive. Released 2026-09-07. **907 specs pass** (+5 real-runtime integration specs).\n\n**v0.8.0** — Finalizes the evented-resolver UI (the last two gaps after 0.7.0). **Fix 1 — DETAIL \"Schedule\" reads \"Evented\".** The read-only cronoton detail card rendered the stored `schedule_config` (e.g. \"Daily at 12:00 UTC\") for a trigger-only/evented row even though Next Fire already showed \"—\" and the edit form already disabled the scheduler; root cause was `Detail.tsx` deriving `triggerOnly` from runtime-arg keys only, ignoring `external_fireable`. The list's predicate is extracted to a shared `isTriggerOnly(row)` (`row.external_fireable === 1 || parseRuntimeArgKeys(row.runtime_arg_keys).length > 0`) in `ui/row-derive.ts`, used by both the list next-fire cell and the detail Schedule cell so they can't drift; the detail Schedule cell now reads **\"Evented\"** for a trigger-only row. **Fix 2 — confirm-gated system delete.** `DELETE /[id]` hard-refused any `server_resolver` (\"system\") cronoton with `409 { protected: true }`; it now accepts `?force=1` (still behind the admin confirm gate) to permit the delete, while the 409 stands without force. Threaded end-to-end: `ConfirmOpts.force` → `createFetchAdapter` sends `?force=1` / `createMemoryAdapter` passes `query: { force: \"1\" }` → the widened `DeleteAction`/`remove.run({ force })` action hook. In the bundled Builder, `deleteDisabled` now **enables** the Delete button for an admin on a system cronoton (non-admins still blocked), and both the detail and list `handleDelete` show a `deleteSystemConfirm` warning naming the resolver — *\"This is the automaton's `<name>` template. Deleting it stops that capability until it's recreated. Delete anyway?\"* — as the first prompt, keeping the existing in-gate password confirm. The delete audit is preserved and records `forced: true` for a forced system delete. Ordinary scheduled cronotons, non-system deletes, and `delete(id)`/`remove.run()` without force are byte-identical to 0.7.0; a system delete without force still 409s. All new surface (`ConfirmOpts.force`, `DeleteRunOpts`, `deleteSystemConfirm`, `row-derive`'s `isTriggerOnly`) is additive. Released 2026-08-03. **893 specs pass.**\n\n**v0.7.0** — Server-authoritative evented resolvers. `SingleTxResolver`/`MultiTxResolver` gain an optional `evented?` flag; the **store** (`createCodexCronoton`/`editCodexCronoton`, via an acyclic `getServerResolver` lookup) forces an evented resolver's cronoton `next_fire_at = NULL` **and `external_fireable = 1`** even when a real schedule is committed, so the scheduleless guarantee lives in the package rather than each consumer's proxy (`fetchDueCodexCronotons` skips it; an evented→non-evented edit re-arms `next_fire_at` and clears `external_fireable`; a genuine non-evented external-fireable row is never clobbered). A new `GET /resolvers` handler + `listServerResolvers()` expose `{ name, kind, evented }`; the `KhronotonAdapter` read tier gains an **OPTIONAL** `resolvers()` method (both reference adapters implement it, but it is **not** in `REQUIRED_METHODS`, so older adapters still pass `assertAdapter`), consumed by the new `useServerResolvers` hook. The Builder makes `eventDrivenResolver` server-authoritative (registry `evented` OR the 0.6.0 `serverResolverOptions.eventDriven` fallback), commits `externalFireable: true` for an evented resolver (derived at commit time — never stuck when switching away), and the `CronotonList` next-fire cell reads **\"Evented\"** for a trigger-only row (`external_fireable === 1` or runtime-arg keys). The store also enforces **one resolver ↔ one cronoton** — a second `createCodexCronoton` reusing a bound `server_resolver` throws `CodexCronotonValidationError` naming the existing id (→ 400). **Deliberate reversal of 0.6.0's HMAC stance:** an evented row is now `external_fireable = 1` and thus HMAC-fireable — a conscious choice codifying Pythia's already-shipped production behavior (v2.7.19/2.7.20), giving one persisted signal the store, Builder, and list all read; manually firing an evented resolver just re-runs its idempotent resolve (no-ops when nothing is ready). The published 0.6.0 `eventDriven` surface is kept intact as an additive fallback; ordinary scheduled resolvers are unchanged. Released 2026-08-03. **871 specs pass.**\n\n**v0.6.1** — Fix a CronotonList white-screen crash on any non-empty list. `listCodexCronotons` returned a camelCase 9-field projection while the read handler declares `CodexCronotonRow[]` and `CronotonList` renders full snake_case fields — so `pact_code`/`schedule_mode`/`schedule_config_json`/`next_fire_at`/`last_fire_at`/`runtime_arg_keys`/`description`/`server_resolver` were all `undefined` and `pactPreview(row.pact_code).replace(...)` crashed. The list now returns full `CodexCronotonRow`s via `SELECT *` (matching the declared type and what the UI reads), and `pactPreview` guards a missing/non-string `pact_code` → `\"(empty)\"`. `CodexCronotonListItem` is now a deprecated alias of `CodexCronotonRow`. Released 2026-08-02. **850 specs pass.**\n\n**v0.6.0** — Event-driven server resolvers. `ServerResolverOption` gains an optional `eventDriven` flag; a cronoton on an event-driven resolver commits scheduler-off (`next_fire_at = NULL`, excluded from the tick due-query) and the Builder shows an \"Event-driven (host-fired)\" notice instead of a schedule editor. The host fires it via the existing `executeNow` primitive, in-process — event-driven is a dedicated commit-envelope flag, deliberately NOT `externalFireable`, so it never exposes the public HMAC trigger endpoint. `server_resolver` + event-driven is allowed; `server_resolver` + `runtime_arg_keys` stays forbidden. No new DB column (the `next_fire_at = NULL` state carries it; edit and pause/resume keep it NULL). Ordinary scheduled resolvers unchanged; a non-event-driven commit body is byte-identical to 0.5.0. Released 2026-08-02. **848 specs pass.**\n\n**v0.5.0** — Builder screen upgrade: the Pact-code editor is syntax-highlighted (keywords, definitions, types, strings, numbers, booleans, comments, `@doc`/`@model` annotations, parens/atoms — colored via new `--khr-syntax-*`/`--khr-selection` tokens, not hardcoded), moved to a full-width top strip (~7 lines, internal scroll) with the header/tab bar/tab content full-width below it as the one standard layout, and gained a live tx-size/gas metering strip (local byte estimate against StoaChain's 2 MB ceiling; gas-used-vs-limit once Simulate runs). `@uiw/react-codemirror`, `@codemirror/state`, `@codemirror/view`, `@codemirror/language`, `@lezer/highlight` are now real optional `peerDependencies` instead of silently relied upon via hoisting. Released 2026-08-02. **832 specs pass.**\n\n**v0.4.2** — fix dangling `peerDependenciesMeta` key (was still `@stoachain/ouronet-core`). Released 2026-07-22. **799 specs pass.**\n\n**v0.4.1** — dependency rename, no code change. Released 2026-07-22. `@stoachain/ouronet-core` → `@ouronet/ouronet-core`. **799 specs pass.**\n\n**v0.4.0** — Made khronoton **chain-polyglot**: added the `/blockchain/<chain>` subpath family, starting with `/blockchain/stoachain` (`createStoachainRuntime(config?)` → the core `ChainRuntime` seam, wrapping `@stoachain/*`). Each chain's SDK is an **optional peer dependency** imported lazily, so the package stays zero-SDK on install and a consumer carries only the chains it imports — one package, one drop-in for every automaton, rather than a separate npm package per chain. (This folds in the previously-separate `@ancientpantheon/khronoton-stoachain`, which is removed and was never published.) Root `.`/`/server`/`/handlers` outputs unchanged. React and `@stoachain/*` are optional peers for their respective subpaths only.\n\n**v0.3.0** — Added the complete drop-in **experience layer** on new subpaths, byte-preserving the root `.` and `/server` outputs from 0.2.0: `/handlers` (framework-agnostic HTTP route handlers over the store + executor, behind a tiny request/response seam), `/provider` + `/hooks` (the React data layer — `<KhronotonProvider>`, the 16-method `KhronotonAdapter` seam with `createFetchAdapter`/`createMemoryAdapter` reference adapters, the shared `runGated` confirm-retry, and the data + action hooks), and `/ui` + `/ui.css` (the React UI at full Hub parity — the four screens List, Detail/Observe with the 50/page fire-history pager + definition-drift + result tooltip + pluggable multi-tx renderer + wired recover, the two-pane create/edit Builder with Simulate→AUTO-gas calibrate, and a Public read-only view — themed via `--khr-*` inside `<KhronotonUiRoot>`). Chain specifics stay out of core as the separate `@ancientpantheon/khronoton-stoachain` `ChainRuntime` adapter; core stays zero-runtime-dependency with React an optional peer for the three React subpaths. Every JS subpath resolves under both ESM `import` and CJS `require`.\n\n**v0.2.0** — Added the server/automaton engine on the new `@ancientpantheon/khronoton-core/server` subpath (dual ESM `import` + CJS `require`), behind six injection seams (`KeyResolver`, `ChainRuntime`, `Database`, `onAudit`, `resolveFireMode`, `Config`): the store + atomic claim-before-fire (exactly-once, proven end-to-end), the headless single-transaction executor (never-throws-on-fire, dirty-read pre-flight, AUTO-gas calibrate, 504/derived-key recovery), the server tick + `startKhronotonLoop`, the server-resolver registry/dispatcher, and `installSchema` for the three tables — lifted faithfully from the AncientHoldings hub's inline `codex-cronoton` system and generalised. The root `.` schedule engine is unchanged.\n\n**v0.1.1** — Packaging fix: added a `require` condition to the exports map so the package is a drop-in for CommonJS consumers (e.g. the hub's tsx/CJS worker) as well as ESM. No API or behaviour change from v0.1.0.\n\n**v0.1.0** — First published version: 7-mode schedule engine + injectable tickOnce tick engine.\n\n**v0.0.1** — Initial package skeleton, then the pure schedule engine: the 7-mode `ScheduleMode`/`ScheduleConfig` model, `computeNextFire` (TOTAL / MONOTONIC / PURE), `summariseSchedule`, `InvalidScheduleConfigError`, and an in-tree 5-field UTC cron parser — lifted faithfully from the AncientHoldings hub and locked by four contract suites. Then the injectable `tickOnce(now, deps)` tick engine: three host-injected hooks (`loadDue`/`enqueueFire`/`persistNextFire`), enqueue-before-persist firing, per-row isolation, an engine-enforced batch cap, and `{ firedIds, skippedIds }` membership — generalised from the hub's tick loop and locked by two more contract suites. Zero runtime dependencies, plain-`tsc` ESM build to `dist/`. Still unpublished.\n\n## License\n\nProprietary — **all rights reserved** by AncientHoldings (ancientholdings.eu). See [LICENSE](./LICENSE).\n\nThis package is published for the operational convenience of AncientHoldings and its own systems. Public availability on the registry grants **no** license or right to any third party: no use, copying, modification, or distribution is permitted without the prior explicit written consent of AncientHoldings. Not open source.\n","readmeFilename":"README.md"}