{"_id":"@ai-presence/adapters","_rev":"7-449987f049e447028af61e380774a8f6","name":"@ai-presence/adapters","dist-tags":{"latest":"0.1.6"},"versions":{"0.1.0":{"name":"@ai-presence/adapters","version":"0.1.0","license":"MIT","_id":"@ai-presence/adapters@0.1.0","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"a0cf9b1e60a9983acadab1463690e39eef024441","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.0.tgz","fileCount":5,"integrity":"sha512-9Mor6o/gLHf6sSuvz8e6WLbD2JeqoyV/EWcGQwokhmCGnbkfxL8DLxRrGzt/DniMKcG3qyqhRdWTRm2OW3V7fQ==","signatures":[{"sig":"MEQCIHm0GKYzG0rZIDywfgaCJHYj3E6a7bQK4tmhb6BQdMCsAiA+dAI8047sJML3AGAEGM+MoW0awe3hWJRZs6rJa4PfxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20671},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"a9dbe4abd880634e4323fbf7bcbebd374d7f13f9","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.0_1781445992181_0.8192948974182508","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@ai-presence/adapters","version":"0.1.1","license":"MIT","_id":"@ai-presence/adapters@0.1.1","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"d7b7fd153f9a037659e6abf28766f347cfb94676","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.1.tgz","fileCount":5,"integrity":"sha512-wc2duTbQKLCeAt4zg2Qc5He1LKhKDDYqnMeYyZjaar8ayc4xQpvAToIRUpj8A2aJtwu6zj/yYXdblErgSUAmRw==","signatures":[{"sig":"MEUCIARILgXXVJ72DVSzrGiNYem/dlb9mNSnTKLozFIFMnENAiEA84AItJsupMBF/eMLgb1A70KLV9MSEcNXAn++nBCkZIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20671},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"f9eb05107edba0379a016ea5a4a3a00ab09010d0","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.1_1781454477168_0.3291975665908593","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@ai-presence/adapters","version":"0.1.2","license":"MIT","_id":"@ai-presence/adapters@0.1.2","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"077e0358f86940697c4f8bb53136333288cea824","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.2.tgz","fileCount":5,"integrity":"sha512-PT36Rc5ROJSPpB3ZNJztMDgBBVyM/+pS9Jz1npKE3a8xQHbhkK9bFkcaH/S1Tcc0UgS4l/MNceKdTfcAxhLL4w==","signatures":[{"sig":"MEYCIQDi3LQ/Ma0sGMr5txgGR90pTXJq/ACuDrVJ1zN3CiPGuAIhALJNipUaU4JaZmlHFct7WYygyHA7m4EyTD9ItArD/CET","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25492},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"efc06ceb83fb4599b7db9de849272a1b58adeb37","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.2_1781499358194_0.2509501308514124","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@ai-presence/adapters","version":"0.1.3","license":"MIT","_id":"@ai-presence/adapters@0.1.3","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"90ae304c242a0269faa96a0a384dabc88968b5b7","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.3.tgz","fileCount":5,"integrity":"sha512-7znaDNQ/4W3BdmFVzrHyYeAzvIBgd43w9g1PIQj8fs6oAuPBi5tsBJfxl+XM7Cazq7+C3c79U5XBwCP8KOElHg==","signatures":[{"sig":"MEQCID2sYFAdvFEiWsdqUBeQ+RnvP+Lwbm6oeD6+aegblSbGAiBiywEC8+shyEOoDDfFCbS5KXhkJ4YVsYELcleUyhGajw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34760},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"ba4c3bffd6cbc80de77651a712744974e3bdd287","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.3_1781503771040_0.812310580132682","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ai-presence/adapters","version":"0.1.4","license":"MIT","_id":"@ai-presence/adapters@0.1.4","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"7e2e3a3a1821a9b50ea75af08c84114cacd7be8e","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.4.tgz","fileCount":5,"integrity":"sha512-f6k6kbuEbo2SIgrJV5dJ9ClqH6jVSXA3nXuMbNRkR23lFMzxHO9iUHkSoYsIm5cXbTas6AKh3hklGxAHWxHyOA==","signatures":[{"sig":"MEQCICIVzYg501nOeHFHwXnz2FPsV2J7znk7lo4HBTbMQ+xnAiBT4rJdN87RzCbdsxeo6FKYMvvgU7Nmj06rE8yPsEYAbw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35863},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"433bd413af48a4c502ed451959425384e8b4c747","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.4"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.4_1781505801791_0.46271808105728174","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ai-presence/adapters","version":"0.1.5","license":"MIT","_id":"@ai-presence/adapters@0.1.5","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"dist":{"shasum":"70b0db65873aaab8fd09c50f406aa919fe3d10c7","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.5.tgz","fileCount":5,"integrity":"sha512-nvWzksRuopy6ZjxvdTAV9lS8ObtmHXtsgZMhwqM8U8i0CNxb7iqpKA9F4z0re5DgKcB2JDCMeW/4CwPMyILG7Q==","signatures":[{"sig":"MEUCIQDriehhaKeSZwV6jvSH3DmK74sSxZuLEnGjhwu2QZbiHwIgGl/f7kSQt8GObOeiWgXiTnQXB2q+W6rVX3NPHIxo1x8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36630},"main":"./src/runtime-adapter.js","type":"commonjs","types":"./src/runtime-adapter.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","default":"./src/runtime-adapter.js","require":"./src/runtime-adapter.js"}},"gitHead":"76bb308641f37aedd73be1cb63ae84b1e49d3fbc","_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"_npmVersion":"10.2.4","description":"Runtime signal adapters for AI Presence Kit.","directories":{},"sideEffects":false,"_nodeVersion":"20.11.1","dependencies":{"@ai-presence/core":"0.1.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adapters_0.1.5_1781738747729_0.23561881802373574","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@ai-presence/adapters","version":"0.1.6","description":"Runtime signal adapters for AI Presence Kit.","type":"commonjs","main":"./src/runtime-adapter.js","module":"./dist/index.mjs","types":"./src/runtime-adapter.d.ts","exports":{".":{"types":"./src/runtime-adapter.d.ts","import":"./dist/index.mjs","require":"./src/runtime-adapter.js","default":"./src/runtime-adapter.js"}},"dependencies":{"@ai-presence/core":"0.1.6"},"sideEffects":false,"license":"MIT","_id":"@ai-presence/adapters@0.1.6","gitHead":"f116b9f6144aaeb1cb04b592f63d45445e4801e0","_nodeVersion":"20.11.1","_npmVersion":"10.2.4","dist":{"integrity":"sha512-SAv4TccYb8ruyATOpoMfwn2tdJGvoCAI0DkVIEQ6/zLO+pYOhMhgQhZ8nDioEOpSta8PDUtCHEI56KKFxPcZjw==","shasum":"0af1384d5d0982aef4eba237a6b469e65b1d577e","tarball":"https://registry.npmjs.org/@ai-presence/adapters/-/adapters-0.1.6.tgz","fileCount":5,"unpackedSize":36630,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA05csFER/e4xWhQYSpEP3ClVx/o0AqzjEoTi9zamEIxAiEAhIemfUhoatWl1/ORTnLMTb98u25UM1jQj1HgcN9UIAU="}]},"_npmUser":{"name":"_branavan_","email":"branavan.selva@gmail.com"},"directories":{},"maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adapters_0.1.6_1781741626530_0.7153735445614933"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-14T14:06:31.947Z","modified":"2026-06-18T00:13:46.864Z","0.1.0":"2026-06-14T14:06:32.336Z","0.1.1":"2026-06-14T16:27:57.333Z","0.1.2":"2026-06-15T04:55:58.335Z","0.1.3":"2026-06-15T06:09:31.160Z","0.1.4":"2026-06-15T06:43:21.965Z","0.1.5":"2026-06-17T23:25:47.908Z","0.1.6":"2026-06-18T00:13:46.720Z"},"license":"MIT","description":"Runtime signal adapters for AI Presence Kit.","maintainers":[{"name":"_branavan_","email":"branavan.selva@gmail.com"}],"readme":"# @ai-presence/adapters\n\nStarter adapter utilities for converting AI runtime events into AI Presence Kit events.\n\nAdapters should stay upstream of any renderer. Their job is to translate signals like user input, stream open, first token, speech start, interruption, and errors into the canonical state machine exposed by `@ai-presence/core`.\n\nCurrent adapters:\n\n- `createRuntimeSignalAdapter`: generic signal-to-presence bridge.\n- `createAssistantLifecycleAdapter`: maps framework-style thread/run/message lifecycle objects to presence.\n- `createVercelAISDKAdapter`: maps AI SDK chat statuses and callbacks to presence.\n- `createOpenAIResponsesAdapter`: maps OpenAI Responses streaming event objects to presence.\n- `createOpenAIRealtimeAdapter`: maps OpenAI Realtime server events to presence.\n- `createChatEventAdapter`: maps small generic chat lifecycle events to presence.\n\nThe adapters intentionally avoid importing framework packages. They accept plain objects so they can be wrapped by React, Svelte, Vue, server streams, WebRTC handlers, or custom chat runtimes later.\n\n```js\nimport { createVercelAISDKAdapter } from \"@ai-presence/adapters\";\n\nconst aiSdkPresence = createVercelAISDKAdapter(presenceRuntime);\naiSdkPresence.update({ status: \"streaming\", messages: [] });\n```\n\nRun the local adapter trace demo with:\n\n```bash\nnpm run demo:adapters\n```\n\nThe trace demo prints each adapter transition with the shared core control inputs, reference face frame evidence, and bounded six-channel decision-trace evidence that a renderer can consume, for example `phase=before-output`, `attention=response`, `face=thinking`, `channels=gaze,blink,brows,mouth,posture,motion`, `trace=complete`, `decisions=6`, `safe=true`, `warnings=0`, `transition=thinking:stream-open+0ms`, `transitionReads=6/6`, and `reads=state,transitionEvent,transitionAgeMs`.\n\n## Vercel AI SDK\n\nPrimary AI SDK docs checked for this adapter route:\n\n```text\nhttps://ai-sdk.dev/docs/reference/ai-sdk-ui/use-chat\nhttps://ai-sdk.dev/docs/ai-sdk-ui/chatbot\n```\n\nThe current AI SDK `useChat` status values are:\n\n```text\nsubmitted\nstreaming\nready\nerror\n```\n\nAdapter mapping:\n\n```text\nsubmitted -> model-waiting -> thinking\nstreaming with no assistant content -> stream-open -> waiting\nstreaming with assistant content -> token -> streaming\nready -> response-complete -> ready\nerror -> error -> error\n```\n\nThe current `useChat` reference also documents `messages` as `UIMessage[]`, message `role`, message `parts`, `onFinish.isAbort`, `onFinish.isError`, and `onError`. The chatbot guide renders assistant text from `message.parts` when `part.type === \"text\"`.\n\nThis preserves the important distinction for presence before output: `streaming` means the response stream is active, while visible assistant text still depends on the message content. The presence state stays `waiting` until content arrives.\n\nRun `node examples/vercel-ai-sdk-presence.mjs` for the named no-network proof. It prints `framework=vercel-ai-sdk`, `statusPath`, `streamOpenMs`, `firstOutputMs`, `leadMs`, `presenceBeforeOutputMs`, `finalState=ready`, `hasOutput=true`, `complete=true`, `interrupted=false`, `abortState=interrupted`, and `errorState=error`.\n\n## Assistant Lifecycle\n\n`createAssistantLifecycleAdapter` is a framework-package-free bridge for assistant app shapes that already have threads, runs, messages, and streaming text deltas. It does not claim an exact external package event contract. Pass plain lifecycle objects from your app layer, or wrap framework callbacks into these names:\n\n```js\nimport { createAssistantLifecycleAdapter } from \"@ai-presence/adapters\";\n\nconst assistantPresence = createAssistantLifecycleAdapter(presenceRuntime);\n\nassistantPresence.handleEvent({ type: \"run-created\", threadId, runId });\nassistantPresence.handleEvent({ type: \"message-created\", threadId, runId, messageId });\nassistantPresence.handleEvent({ type: \"text-delta\", threadId, runId, messageId, delta: \"Hello\" });\nassistantPresence.handleEvent({ type: \"run-completed\", threadId, runId });\n```\n\nAdapter mapping:\n\n```text\ncomposer-input -> user-input -> user-typing\ncomposer-pause -> user-pause -> reading/thinking\nrun-created / run-started / submitted / running -> model-waiting -> thinking\nmessage-created / content-block-start / stream-open -> stream-open -> waiting\nstreaming with no assistant content -> stream-open -> waiting\ntext-delta / message-delta / output -> token -> streaming\nrun-completed / message-completed / ready -> response-complete -> ready\nrun-cancelled / abort / interrupt -> interrupt -> interrupted\nrun-failed / error -> error -> error\n```\n\nRun `node examples/assistant-lifecycle-presence.mjs` for the no-network proof. It simulates a thread/run opening and an assistant message shell existing before text arrives, then prints `statePath`, `eventPath`, `frameworkEventPath`, `streamOpenMs`, `firstOutputMs`, `leadMs`, `presenceBeforeOutputMs`, `finalState`, `hasOutput`, `complete`, and `interrupted`.\n\n## assistant-ui ExternalStoreRuntime\n\nThe assistant lifecycle adapter can also be wrapped around assistant-ui's documented `ExternalStoreRuntime` route without importing assistant-ui. Primary assistant-ui docs expose `onNew`, `isRunning`, mutable `messages`, and assistant message `status.type` values such as `running`, `complete`, and `incomplete`.\n\n`examples/assistant-ui-external-store-presence.mjs` maps:\n\n```text\nonNew -> run-created -> model-waiting -> thinking\nisRunning=true -> running -> model-waiting -> thinking\nempty assistant message with status.type=\"running\" -> message-created -> stream-open -> waiting\nfirst assistant text chunk -> text-delta -> token -> streaming\nassistant message status.type=\"complete\" -> complete -> response-complete -> ready\n```\n\nRun `node examples/assistant-ui-external-store-presence.mjs` for the named no-network proof. It prints `framework=assistant-ui`, `route=ExternalStoreRuntime`, `frameworkEventPath`, `frameworkStatusPath`, `streamOpenMs`, `firstOutputMs`, `leadMs`, `presenceBeforeOutputMs`, `finalState`, `hasOutput`, `complete`, and `interrupted`.\n\n## OpenAI Responses\n\n`createOpenAIResponsesAdapter` is an event-mapping helper, not an SDK wrapper. Pass each typed streaming event object from your Responses stream consumer to `handleEvent(event)`. The adapter branches on `event.type`, copies text or function-call argument chunks into `detail.delta` and `detail.text` when present, and never imports the OpenAI SDK, calls the network, or reads environment config.\n\nAdapter mapping:\n\n```text\nresponse.created -> model-waiting -> thinking\nresponse.in_progress -> stream-open -> waiting\nresponse.output_item.added -> stream-open -> waiting\nresponse.content_part.added -> stream-open -> waiting\nresponse.output_text.delta -> token -> streaming\nresponse.function_call_arguments.delta -> token -> streaming\nresponse.output_text.done -> response-complete -> ready\nresponse.function_call_arguments.done -> response-complete -> ready\nresponse.completed -> response-complete -> ready\nresponse.failed / error -> error -> error\nresponse.incomplete -> interrupt -> interrupted\n```\n\nThis preserves presence-before-output: `response.created` can move the runtime into `thinking`, stream-opening events can move it into `waiting`, and the first `response.output_text.delta` moves it into `streaming`.\n\n## OpenAI Realtime\n\nAdapter mapping:\n\n```text\ninput_audio_buffer.speech_started -> local-read -> reading\ninput_audio_buffer.speech_stopped -> model-waiting -> thinking\nresponse.created -> model-waiting -> thinking\nresponse.output_item.created -> stream-open -> waiting\nresponse.content_part.added -> stream-open -> waiting\nresponse.output_text.delta -> token -> streaming\nresponse.output_audio_transcript.delta -> token -> streaming\nresponse.output_audio.delta -> speech-start -> speaking\nresponse.output_audio.done -> speech-end -> ready\nresponse.done -> response-complete -> ready\nerror / response.failed -> error -> error\n```\n\nOlder alias events already used by the prototype, such as `response.audio.delta` and `response.text.delta`, are also accepted.\n","readmeFilename":"README.md"}