{"_id":"@affectively/aeon-flux-runtime","_rev":"6-5a642649a35b7ee3c85bbaf4eec0e632","name":"@affectively/aeon-flux-runtime","dist-tags":{"latest":"5.0.1"},"versions":{"0.9.0":{"name":"@affectively/aeon-flux-runtime","version":"0.9.0","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"license":"MIT","_id":"@affectively/aeon-flux-runtime@0.9.0","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively/aeon-flux#readme","bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"dist":{"shasum":"1a6234d8c54a8b00cad0c01e010a54c2f118e2ef","tarball":"https://registry.npmjs.org/@affectively/aeon-flux-runtime/-/aeon-flux-runtime-0.9.0.tgz","fileCount":67,"integrity":"sha512-lGLFs88dCFldsDpyQHAagrb8lNkTxUUmbUYejz6VJ3I5zPqEAIvVJ15FYDwOj99wHSjzwZt8Ay/fuo/NUCKuug==","signatures":[{"sig":"MEUCIHvu9nZHHilLh1oBHtJjIp0wMIqWPMjrVBLkjsnZyDMLAiEAlXFQ0r7traCnUdYYP9tcsucH0R4MdEv9Wu2jM46TILY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":643522},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"}},"scripts":{"dev":"bun --watch ./src/index.ts","tail":"wrangler tail","test":"bun test","build":"bun run build.ts && tsc --declaration --emitDeclarationOnly","deploy":"wrangler deploy","db:create":"wrangler d1 create aeon-flux","db:migrate":"wrangler d1 execute aeon-flux --file=./schema.sql","dev:worker":"wrangler dev","deploy:staging":"wrangler deploy --env staging","prepublishOnly":"bun run build","db:migrate:local":"wrangler d1 execute aeon-flux --local --file=./schema.sql"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"_npmVersion":"11.8.0","description":"Bun/Cloudflare runtime for @affectively/aeon-flux","directories":{},"sideEffects":false,"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^3.24.0","react":"^19.0.0","@types/bun":"latest","typescript":"^5.7.0","@types/react":"^19.0.0"},"peerDependencies":{"bun":">=1.0.0","zod":">=3.0.0","react":">=18.0.0","@affectively/aeon":">=0.1.0"},"peerDependenciesMeta":{"@affectively/aeon":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aeon-flux-runtime_0.9.0_1771377280655_0.880541011362906","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."},"0.9.1":{"name":"@affectively/aeon-flux-runtime","version":"0.9.1","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"license":"MIT","_id":"@affectively/aeon-flux-runtime@0.9.1","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively/aeon-flux#readme","bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"dist":{"shasum":"ff80c779a834bbd8236ff5d46fda3553963c2eb4","tarball":"https://registry.npmjs.org/@affectively/aeon-flux-runtime/-/aeon-flux-runtime-0.9.1.tgz","fileCount":67,"integrity":"sha512-rnpIqvDuZyFBzDFcC+18d/Y7T+UQetR0aCtOcCPcUTgagg1a5KzEWNEY4SX5m2D/8GHi+XMfpu0SejnB8XvEWw==","signatures":[{"sig":"MEQCIGsri65ezEi6eF6un7e5FtLwHC5bKTKmqLBCL/7C79WIAiBM3CRpuEbXNoJQOqJ7zkX3in7N2ZAdGd0bn48hTUpkuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":643486},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"}},"scripts":{"dev":"bun --watch ./src/index.ts","tail":"wrangler tail","test":"bun test","build":"bun run build.ts && tsc --declaration --emitDeclarationOnly","deploy":"wrangler deploy","db:create":"wrangler d1 create aeon-flux","db:migrate":"wrangler d1 execute aeon-flux --file=./schema.sql","dev:worker":"wrangler dev","deploy:staging":"wrangler deploy --env staging","prepublishOnly":"bun run build","db:migrate:local":"wrangler d1 execute aeon-flux --local --file=./schema.sql"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"_npmVersion":"11.8.0","description":"Bun/Cloudflare runtime for @affectively/aeon-flux","directories":{},"sideEffects":false,"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"devDependencies":{"zod":"^3.24.0","react":"^19.0.0","@types/bun":"latest","typescript":"^5.7.0","@types/react":"^19.0.0"},"peerDependencies":{"bun":">=1.0.0","zod":">=3.0.0","react":">=18.0.0","@affectively/aeon":">=0.1.0"},"peerDependenciesMeta":{"@affectively/aeon":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aeon-flux-runtime_0.9.1_1771377626245_0.06512515304797617","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."},"0.10.0":{"name":"@affectively/aeon-flux-runtime","version":"0.10.0","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"license":"MIT","_id":"@affectively/aeon-flux-runtime@0.10.0","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively/aeon-flux#readme","bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"dist":{"shasum":"c30d8e8d0a736559c7c984751c7dd147aa4c6f2b","tarball":"https://registry.npmjs.org/@affectively/aeon-flux-runtime/-/aeon-flux-runtime-0.10.0.tgz","fileCount":70,"integrity":"sha512-1zaPWdEoz707jVOt1xI+O6bVuJnmOMAMjh4G6ucxTdNnF5nl+2iyGUjIgJFJzb01H8FpuY7KeukWOvZSeGq7ew==","signatures":[{"sig":"MEQCIAhv+I8+O8Bn+D7tuNcM4H4lwdmRQicr3Avp0bByO7hhAiA/tUtASfgB1qF47AjXBEyhf2dKNzG91vo8cX1Ih29D7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":697571},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"}},"scripts":{"dev":"bun --watch ./src/index.ts","tail":"wrangler tail","test":"bun test","build":"bun run build.ts && tsc --declaration --emitDeclarationOnly","deploy":"wrangler deploy","db:create":"wrangler d1 create aeon-flux","db:migrate":"wrangler d1 execute aeon-flux --file=./schema.sql","dev:worker":"wrangler dev","deploy:staging":"wrangler deploy --env staging","prepublishOnly":"bun run build","db:migrate:local":"wrangler d1 execute aeon-flux --local --file=./schema.sql"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"_npmVersion":"11.6.2","description":"Bun/Cloudflare runtime for @affectively/aeon-flux","directories":{},"sideEffects":["./dist/**/*.js"],"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"zod":"^3.24.0","react":"^19.0.0","@types/bun":"latest","typescript":"^5.7.0","@types/react":"^19.0.0"},"peerDependencies":{"bun":">=1.0.0","zod":">=3.0.0","react":">=18.0.0","@affectively/aeon":">=0.1.0"},"peerDependenciesMeta":{"@affectively/aeon":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aeon-flux-runtime_0.10.0_1771456284172_0.30287811298934586","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."},"0.11.0":{"name":"@affectively/aeon-flux-runtime","version":"0.11.0","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"license":"MIT","_id":"@affectively/aeon-flux-runtime@0.11.0","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively/aeon-flux#readme","bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"dist":{"shasum":"a523146a12ce9d05ef3b8b59014b8ac9b3437756","tarball":"https://registry.npmjs.org/@affectively/aeon-flux-runtime/-/aeon-flux-runtime-0.11.0.tgz","fileCount":73,"integrity":"sha512-zzJk7Fwp/60qSn9pOrqyL40IES7YkXxN1acy2FaPdBAcINOoNhzu/JaBoxKD8vcITNm+qZTFbCu8Wl3///rO3Q==","signatures":[{"sig":"MEUCIARg9CDBr7J3fxpjskAcftUD2Glx7OMjIHgj9bklNlu+AiEA+FFBw6MxIMfit9CmHT1E3h13Wo8R0QklK6O1el/VR4o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":939481},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"}},"scripts":{"dev":"bun --watch ./src/index.ts","tail":"wrangler tail","test":"bun test","build":"bun run build.ts && tsc --declaration --emitDeclarationOnly","deploy":"wrangler deploy","db:create":"wrangler d1 create aeon-flux","db:migrate":"wrangler d1 execute aeon-flux --file=./schema.sql","dev:worker":"wrangler dev","deploy:staging":"wrangler deploy --env staging","prepublishOnly":"bun run build","db:migrate:local":"wrangler d1 execute aeon-flux --local --file=./schema.sql"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"_npmVersion":"11.6.2","description":"Bun/Cloudflare runtime for @affectively/aeon-flux","directories":{},"sideEffects":["./dist/**/*.js"],"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"devDependencies":{"zod":"^3.24.0","react":"^19.0.0","@types/bun":"latest","typescript":"^5.7.0","@types/react":"^19.0.0"},"peerDependencies":{"bun":">=1.0.0","zod":">=3.0.0","react":">=18.0.0","@affectively/aeon":">=0.1.0"},"peerDependenciesMeta":{"@affectively/aeon":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aeon-flux-runtime_0.11.0_1771470225173_0.09812951869284126","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."},"5.0.1":{"name":"@affectively/aeon-flux-runtime","version":"5.0.1","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"license":"UNLICENSED","_id":"@affectively/aeon-flux-runtime@5.0.1","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively/aeon-flux#readme","bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"dist":{"shasum":"ad9383d77c3aff54c32f9ec91599c05d342cc14a","tarball":"https://registry.npmjs.org/@affectively/aeon-flux-runtime/-/aeon-flux-runtime-5.0.1.tgz","fileCount":104,"integrity":"sha512-Cr9a40W9V8wMuV0cXsauI2zltI/KZ1IT015mkbcbVtol+PVFsXtFhwQfBfmSU4Ry7fh9A3rmPinte7HT4L2F0A==","signatures":[{"sig":"MEUCIGeggt3mP2J6sa1XZPSQno3FBH2kazYugSj2BFm8b0IsAiEAyqVC2Zx9f/B4HFgi5/bacSXX+LjgwDuPCzt6ZjDKpQc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":889857},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./router":{"types":"./dist/router/index.d.ts","import":"./dist/router/index.js"},"./server":{"types":"./dist/server.d.ts","import":"./dist/server.js"}},"scripts":{"dev":"bun --watch ./src/index.ts","tail":"wrangler tail","test":"bun test","build":"bun run build.ts","deploy":"wrangler deploy","db:create":"wrangler d1 create aeon-flux","db:migrate":"wrangler d1 execute aeon-flux --file=./schema.sql","dev:worker":"wrangler dev","deploy:staging":"wrangler deploy --env staging","prepublishOnly":"bun run build","db:migrate:local":"wrangler d1 execute aeon-flux --local --file=./schema.sql"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"_npmVersion":"11.8.0","description":"Bun/Cloudflare runtime for @affectively/aeon-flux","directories":{},"sideEffects":["./dist/**/*.js"],"_nodeVersion":"25.5.0","dependencies":{"@opentelemetry/api":"^1.9.0","@opentelemetry/resources":"^2.6.0","@opentelemetry/sdk-trace-base":"^2.6.0","@opentelemetry/semantic-conventions":"^1.40.0","@opentelemetry/exporter-trace-otlp-http":"^0.213.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.24.0","react":"^19.0.0","@types/bun":"latest","typescript":"^5.7.0","@types/react":"^19.0.0"},"peerDependencies":{"bun":">=1.0.0","zod":">=3.0.0","react":">=18.0.0","@affectively/aeon":">=0.1.0"},"peerDependenciesMeta":{"@affectively/aeon":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/aeon-flux-runtime_5.0.1_1773157511890_0.6788948385013136","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."}},"time":{"created":"2026-02-18T01:14:40.562Z","modified":"2026-03-27T19:58:32.910Z","0.9.0":"2026-02-18T01:14:40.892Z","0.9.1":"2026-02-18T01:20:26.508Z","0.10.0":"2026-02-18T23:11:24.393Z","0.11.0":"2026-02-19T03:03:45.394Z","5.0.1":"2026-03-10T15:45:12.046Z"},"bugs":{"url":"https://github.com/affectively/aeon-flux/issues"},"license":"UNLICENSED","homepage":"https://github.com/affectively/aeon-flux#readme","keywords":["aeon","pages","framework","collaborative","bun","cloudflare"],"repository":{"url":"git+https://github.com/affectively/aeon-flux.git","type":"git"},"description":"Bun/Cloudflare runtime for @affectively/aeon-flux","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"readme":"# @affectively/aeon-flux-runtime\n\nEdge-first rendering runtime for Aeon-Flux with Edge Side Inference (ESI), hyperpersonalized routing, and real-time collaboration.\n\n## Installation\n\n```bash\nbun add @affectively/aeon-flux-runtime\n```\n\n## Features\n\n### Edge Side Inference (ESI)\n\nAI-powered personalization at render time. Components that adapt to user context before reaching the browser.\n\n```tsx\nimport { ESI, ESIProvider } from '@affectively/aeon-flux-runtime/router';\n\nfunction App() {\n  return (\n    <ESIProvider>\n      {/* AI-generated personalized greeting */}\n      <ESI.Infer prompt=\"Greet the user based on time of day\">\n        {(greeting) => <h1>{greeting}</h1>}\n      </ESI.Infer>\n\n      {/* Tier-gated content */}\n      <ESI.TierGate tier=\"premium\">\n        <PremiumFeatures />\n      </ESI.TierGate>\n\n      {/* Emotion-aware content */}\n      <ESI.EmotionGate emotions={['calm', 'content']}>\n        <RelaxingContent />\n      </ESI.EmotionGate>\n    </ESIProvider>\n  );\n}\n```\n\n### AI Translation\n\nAutomatic translation at the edge. Supports 33 languages with LLM-based translation.\n\n```tsx\nimport { ESI, TranslationProvider } from '@affectively/aeon-flux-runtime/router';\n\n// App-wide translation with user's preferred language\nfunction App() {\n  return (\n    <TranslationProvider defaultLanguage=\"es\">\n      <ESI.Translate>Welcome to our platform</ESI.Translate>\n      {/* Renders: \"Bienvenido a nuestra plataforma\" */}\n    </TranslationProvider>\n  );\n}\n\n// Explicit target language\n<ESI.Translate targetLanguage=\"ja\">Hello world</ESI.Translate>\n// Renders: \"こんにちは世界\"\n\n// With context for better translation quality\n<ESI.Translate\n  targetLanguage=\"fr\"\n  context=\"emotional wellness app\"\n>\n  We're here to help you understand your feelings.\n</ESI.Translate>\n```\n\n#### Data-Attribute Translation\n\nAutomatically translate any element with `data-translate`:\n\n```html\n<p data-translate data-target-lang=\"es\">Hello world</p>\n<!-- Becomes: \"Hola mundo\" -->\n\n<span data-translate data-translate-context=\"formal, business\">\n  Please review the attached document.\n</span>\n```\n\n```tsx\nimport { useTranslationObserver } from '@affectively/aeon-flux-runtime/router';\n\nfunction App() {\n  // Automatically translates all data-translate elements\n  useTranslationObserver({ defaultTargetLanguage: 'es' });\n\n  return <div data-translate>Hello</div>;\n}\n```\n\n#### Language Configuration Priority\n\n1. `ESI.Translate` `targetLanguage` prop\n2. `TranslationProvider` context\n3. `window.__AEON_ESI_STATE__.preferences.language`\n4. `<meta name=\"aeon-language\" content=\"es\">`\n5. User preferences\n6. Browser `navigator.language`\n\n#### Supported Languages\n\n`en`, `es`, `fr`, `de`, `it`, `pt`, `nl`, `pl`, `ru`, `zh`, `ja`, `ko`, `ar`, `hi`, `bn`, `vi`, `th`, `tr`, `id`, `ms`, `tl`, `sv`, `da`, `no`, `fi`, `cs`, `el`, `he`, `uk`, `ro`, `hu`, `ca`, `hy`\n\n### Hyperpersonalized Routing\n\nRoutes adapt to user context: time, location, emotion state, and tier.\n\n```tsx\nimport { HeuristicAdapter } from '@affectively/aeon-flux-runtime/router';\n\nconst adapter = new HeuristicAdapter({\n  tierFeatures: {\n    free: { maxAIInferences: 5 },\n    premium: { maxAIInferences: 100 },\n  },\n});\n\n// Route decision based on user context\nconst decision = await adapter.decide(userContext, '/dashboard');\n// Returns: layout, theme, skeleton hints, prefetch suggestions\n```\n\n### Speculative Pre-rendering\n\nPages render before you click. Zero perceived latency.\n\n```tsx\nimport { SpeculationManager, autoInitSpeculation } from '@affectively/aeon-flux-runtime/router';\n\n// Auto-initialize based on browser support\nautoInitSpeculation();\n\n// Or manual control\nconst speculation = new SpeculationManager({\n  prefetchUrls: ['/dashboard', '/settings'],\n  prerenderUrls: ['/about'],\n});\nspeculation.start();\n```\n\n### ESI Control Components\n\nDeclarative control flow with AI-powered conditions.\n\n```tsx\nimport { ESI } from '@affectively/aeon-flux-runtime/router';\n\n// Conditional rendering\n<ESI.If condition=\"user.tier === 'premium'\">\n  <PremiumBadge />\n</ESI.If>\n\n// Pattern matching\n<ESI.Match value={userEmotion}>\n  <ESI.Case when=\"happy\"><HappyContent /></ESI.Case>\n  <ESI.Case when=\"sad\"><SupportContent /></ESI.Case>\n  <ESI.Default><NeutralContent /></ESI.Default>\n</ESI.Match>\n\n// Time-based gates\n<ESI.TimeGate hours={{ start: 9, end: 17 }}>\n  <BusinessHoursContent />\n</ESI.TimeGate>\n\n// A/B Testing\n<ESI.ABTest variants={['control', 'variant-a', 'variant-b']}>\n  {(variant) => <Component variant={variant} />}\n</ESI.ABTest>\n```\n\n### Cyrano Whisper Channel\n\nAI assistant guidance with contextual awareness.\n\n```tsx\nimport { esiCyrano, esiHalo } from '@affectively/aeon-flux-runtime/router';\n\n// Generate AI whisper for user guidance\nconst whisper = esiCyrano({\n  intent: 'guide',\n  tone: 'warm',\n  context: sessionContext,\n});\n\n// Halo insights for behavioral patterns\nconst insight = esiHalo({\n  observation: 'user-hesitation',\n  action: 'offer-help',\n});\n```\n\n### Merkle-Based UCAN Capabilities\n\nFine-grained access control to component nodes using Merkle hashes. Integrates with UCAN tokens for cryptographic authorization.\n\n```tsx\nimport {\n  createNodeCapabilityVerifier,\n  createNodeReadCapability,\n  createTreeCapability,\n  checkNodeAccess,\n} from '@affectively/aeon-flux-runtime';\n\n// Create capabilities for specific nodes by Merkle hash\nconst readCapability = createNodeReadCapability('a1b2c3d4e5f6');\n// { can: 'aeon:node:read', with: 'merkle:a1b2c3d4e5f6' }\n\n// Create tree capability (grants access to node and all descendants)\nconst treeCapability = createTreeCapability('a1b2c3d4e5f6');\n// { can: 'aeon:node:*', with: 'tree:a1b2c3d4e5f6' }\n\n// Create path-based capability (grants access to all nodes on a route)\nconst pathCapability = createPathCapability('/dashboard/*');\n// { can: 'aeon:node:*', with: 'path:/dashboard/*' }\n\n// Verify access to a specific node\nconst canAccess = checkNodeAccess(\n  userCapabilities,\n  { merkleHash: 'a1b2c3d4e5f6', routePath: '/dashboard' },\n  'read'\n);\n```\n\n#### Resource Formats\n\n| Format | Example | Description |\n|--------|---------|-------------|\n| `merkle:<hash>` | `merkle:a1b2c3d4e5f6` | Exact match on Merkle hash |\n| `tree:<hash>` | `tree:a1b2c3d4e5f6` | Match node or any ancestor |\n| `path:<route>` | `path:/dashboard/*` | All nodes on a route (wildcards) |\n| `*` | `*` | Match any node (wildcard) |\n\n#### Capability Actions\n\n| Action | Description |\n|--------|-------------|\n| `aeon:node:read` | Read access to node |\n| `aeon:node:write` | Write access to node |\n| `aeon:node:*` | Full access to node |\n\n#### Creating a Verifier from UCAN Token\n\n```tsx\nimport { createNodeCapabilityVerifier } from '@affectively/aeon-flux-runtime';\n\nconst verifier = createNodeCapabilityVerifier(token, {\n  extractCapabilities: async (t) => {\n    const decoded = await decodeUCAN(t);\n    return decoded.capabilities;\n  },\n  verifyToken: async (t) => {\n    return await verifyUCANSignature(t);\n  },\n});\n\n// Check if user can read a specific node\nconst canRead = await verifier(\n  { merkleHash: 'a1b2c3d4e5f6' },\n  'read'\n);\n\n// Check with full tree path context\nconst canWrite = await verifier(\n  {\n    merkleHash: 'a1b2c3d4e5f6',\n    treePath: ['root', 'layout', 'header', 'button'],\n    ancestorHashes: ['f1e2d3c4b5a6', 'b2c3d4e5f6a1'],\n    routePath: '/dashboard',\n  },\n  'write'\n);\n```\n\n#### Integration with Analytics\n\nMerkle capabilities integrate seamlessly with `@affectively/aeon-flux-analytics`:\n\n```tsx\nimport { buildMerkleTreeSync } from '@affectively/aeon-flux-analytics';\nimport { checkNodeAccess } from '@affectively/aeon-flux-runtime';\n\n// Build Merkle tree from component tree\nconst merkleTree = buildMerkleTreeSync(componentTree);\n\n// Check access for each node\nfor (const [nodeId, merkleNode] of merkleTree) {\n  const canEdit = checkNodeAccess(\n    userCapabilities,\n    {\n      merkleHash: merkleNode.hash,\n      treePath: merkleNode.path,\n      routePath: currentRoute,\n    },\n    'write'\n  );\n\n  if (canEdit) {\n    // Show edit controls for this node\n  }\n}\n```\n\n## API Reference\n\n### Components\n\n| Component | Description |\n|-----------|-------------|\n| `ESI.Provider` | Root ESI context provider |\n| `ESI.Infer` | AI inference at render time |\n| `ESI.Translate` | Automatic translation |\n| `ESI.TranslationProvider` | App-wide translation context |\n| `ESI.TierGate` | Tier-based content gating |\n| `ESI.EmotionGate` | Emotion-based content gating |\n| `ESI.TimeGate` | Time-based content gating |\n| `ESI.If` / `ESI.Show` / `ESI.Hide` | Conditional rendering |\n| `ESI.Match` / `ESI.Case` | Pattern matching |\n| `ESI.ABTest` | A/B testing |\n| `ESI.ForEach` | AI-powered iteration |\n| `ESI.Select` | AI-powered selection |\n\n### Hooks\n\n| Hook | Description |\n|------|-------------|\n| `useESI()` | Access ESI context and processing |\n| `useESIInfer()` | AI inference hook |\n| `useTranslation()` | Translation context access |\n| `useTranslationObserver()` | Auto-translate data-attribute elements |\n| `useGlobalESIState()` | Access global ESI state |\n| `useESITier()` | Get current user tier |\n| `useESIEmotionState()` | Get current emotion state |\n\n### Functions\n\n| Function | Description |\n|----------|-------------|\n| `esiTranslate()` | Create translation directive |\n| `translateWithAIGateway()` | Direct AI Gateway translation |\n| `normalizeLanguageCode()` | Normalize language code |\n| `getSupportedLanguages()` | Get list of supported languages |\n| `initTranslationObserver()` | Auto-init DOM translation observer |\n\n### Merkle Capability Functions\n\n| Function | Description |\n|----------|-------------|\n| `createNodeReadCapability(hash)` | Create read capability for a Merkle hash |\n| `createNodeWriteCapability(hash)` | Create write capability for a Merkle hash |\n| `createTreeCapability(hash, action)` | Create tree capability (node + descendants) |\n| `createPathCapability(path, action)` | Create path-based capability |\n| `createWildcardNodeCapability(action)` | Create wildcard capability (all nodes) |\n| `createNodeCapabilityVerifier(token, opts)` | Create verifier from UCAN token |\n| `checkNodeAccess(caps, request, action)` | Check if capabilities grant access |\n| `filterAccessibleNodes(nodes, caps, action)` | Filter nodes by access |\n| `getMostSpecificCapability(caps, request)` | Get most specific matching capability |\n| `parseResource(resource)` | Parse resource identifier |\n| `formatResource(type, value)` | Format resource identifier |\n| `capabilityGrantsAccess(cap, request, action)` | Check single capability |\n\n## Configuration\n\n### Head Meta Tags\n\n```html\n<!-- Default translation language -->\n<meta name=\"aeon-language\" content=\"es\">\n\n<!-- Translation endpoint -->\n<meta name=\"aeon-translation-endpoint\" content=\"https://ai-gateway.example.com\">\n\n<!-- Cache TTL in seconds -->\n<meta name=\"aeon-translation-cache-ttl\" content=\"86400\">\n```\n\n### ESI State\n\nGlobal state is available at `window.__AEON_ESI_STATE__`:\n\n```typescript\ninterface GlobalESIState {\n  tier: 'free' | 'premium' | 'enterprise';\n  emotion: EmotionState;\n  preferences: {\n    language: string;\n    theme: 'light' | 'dark' | 'system';\n  };\n  features: Record<string, boolean>;\n}\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}