{"_id":"@atomicmemory/langgraph","_rev":"3-5f2eaaf22d276ae9ae2af0c95fa987c7","name":"@atomicmemory/langgraph","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@atomicmemory/langgraph","version":"0.1.0","license":"Apache-2.0","_id":"@atomicmemory/langgraph@0.1.0","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"homepage":"https://github.com/atomicstrata/atomicmemory-integrations#readme","bugs":{"url":"https://github.com/atomicstrata/atomicmemory-integrations/issues"},"dist":{"shasum":"faf75baf51515cd76b4f8b7c0b86f267f1791d04","tarball":"https://registry.npmjs.org/@atomicmemory/langgraph/-/langgraph-0.1.0.tgz","fileCount":22,"integrity":"sha512-tqeaJAVWqXZYgRBIfYPJXt+cFMHRs0wDy9T7r1RhH4tBlTqhtzgJ3JfVrY2YyNlkfxz1GztdLyU2PmrQjibneA==","signatures":[{"sig":"MEUCIF5jyk8DnK8jHgxqdFnOPRsoMNUuQE4tCqZMF5HA5ECFAiEA1iz5JA9bYwoBv0fSWTZThXoZiy3V0iH9OrysxGGQ2e8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24684},"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":"2a61647a84e2bea5190e4ad759212df05f4bd269","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","build":"tsc -p tsconfig.json","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')||v.startsWith('workspace:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"repository":{"url":"git+https://github.com/atomicstrata/atomicmemory-integrations.git","type":"git","directory":"adapters/langgraph-js"},"_npmVersion":"11.14.1","description":"AtomicMemory adapter for LangGraph JS - state-graph node factories around an injected MemoryClient.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@atomicmemory/sdk":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.6.0","@types/node":"^20.0.0"},"peerDependencies":{"@langchain/langgraph":"^0.4.0"},"peerDependenciesMeta":{"@langchain/langgraph":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/langgraph_0.1.0_1779007409010_0.9279392086374842","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@atomicmemory/langgraph","version":"0.1.1","license":"Apache-2.0","_id":"@atomicmemory/langgraph@0.1.1","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/langgraph#readme","bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"dist":{"shasum":"bf1800a7cb011607243b84aeef276a8df079e43b","tarball":"https://registry.npmjs.org/@atomicmemory/langgraph/-/langgraph-0.1.1.tgz","fileCount":22,"integrity":"sha512-Vx4lylOrYkB6CHEbLCR8I0UZXpeZGMAuYYFJB88dWO1zb/8ZLfar9426ZE4ahRDT04zLntvbeYSgzAWgZBXsig==","signatures":[{"sig":"MEQCIGKSRVzO8MNyANoXAFXK9DOJdU66b/SHZmPZp5OfnCT0AiBQYGpqAX4WlNKPtKeyPbq5iZV9D8PwoFhAUWLZOsDrdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24848},"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":"201677d74fbb3f3cfd5e0dbb5f6904e889dcbb07","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","build":"tsc -p tsconfig.json","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')||v.startsWith('workspace:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"repository":{"url":"git+https://github.com/atomicstrata/atomicmemory.git","type":"git","directory":"adapters/langgraph"},"_npmVersion":"11.14.1","description":"AtomicMemory adapter for LangGraph JS - state-graph node factories around an injected MemoryClient.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@atomicmemory/sdk":"^1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.6.0","@types/node":"^20.0.0"},"peerDependencies":{"@langchain/langgraph":"^0.4.0"},"peerDependenciesMeta":{"@langchain/langgraph":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/langgraph_0.1.1_1779188748526_0.9424659661458916","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atomicmemory/langgraph","version":"0.1.2","description":"AtomicMemory adapter for LangGraph JS - state-graph node factories around an injected MemoryClient.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"repository":{"type":"git","url":"git+https://github.com/atomicstrata/atomicmemory.git","directory":"adapters/langgraph"},"license":"Apache-2.0","engines":{"node":">=20"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","lint":"tsc -p tsconfig.json --noEmit","prepack":"pnpm build","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')||v.startsWith('workspace:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"dependencies":{"@atomicmemory/sdk":"^1.0.2"},"peerDependencies":{"@langchain/langgraph":"^0.4.0"},"peerDependenciesMeta":{"@langchain/langgraph":{"optional":true}},"devDependencies":{"@types/node":"^20.0.0","tsx":"^4.19.0","typescript":"^5.6.0"},"bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/langgraph#readme","gitHead":"65c9fe5b18faaa87b4b5768e7d04309672aeed4f","_id":"@atomicmemory/langgraph@0.1.2","_nodeVersion":"25.9.0","_npmVersion":"11.14.1","dist":{"integrity":"sha512-LOzHl/EHCl8fRGqhNxsppQPlhTij1Yl4iLF7KsGqqT+PWjiHODQ3XQYjgtgEic+iHhrOjgjNja7V2MsHFDISXA==","shasum":"1a0a08ae38ac711ca22397c0cb30b42de5c6ac9f","tarball":"https://registry.npmjs.org/@atomicmemory/langgraph/-/langgraph-0.1.2.tgz","fileCount":22,"unpackedSize":24848,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDeuTiBmXDxbkwIDL0BZ65kgoFWUxgq6bwiyde+hUx+UwIhAJgIMYSQ/kRs0Grc0AOv7K5NHJya5SdUat5e0KpV1sHw"}]},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"directories":{},"maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/langgraph_0.1.2_1779342354261_0.9376634277125602"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T08:43:28.909Z","modified":"2026-05-21T05:45:54.511Z","0.1.0":"2026-05-17T08:43:29.157Z","0.1.1":"2026-05-19T11:05:48.691Z","0.1.2":"2026-05-21T05:45:54.391Z"},"bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"license":"Apache-2.0","homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/langgraph#readme","repository":{"type":"git","url":"git+https://github.com/atomicstrata/atomicmemory.git","directory":"adapters/langgraph"},"description":"AtomicMemory adapter for LangGraph JS - state-graph node factories around an injected MemoryClient.","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"readme":"# @atomicmemory/langgraph\n\nAtomicMemory adapter for [LangGraph JS](https://langchain-ai.github.io/langgraphjs/). Node factories and framework-agnostic helpers around an injected `MemoryClient` from `@atomicmemory/sdk`.\n\n| Surface | Use when |\n|---|---|\n| `createMemoryRetrieveNode()` | You want a graph node that searches AtomicMemory and merges the rendered context into state. |\n| `createMemoryIngestNode()` | You want a graph node that persists the completed turn after the model call. |\n| `searchMemory()` / `ingestTurn()` | You want to call AtomicMemory directly inside a node body, an edge condition, or another helper. |\n\nThe adapter does **not** import `@langchain/langgraph` at runtime — the node factories emit plain async `(state) => Partial<state>` functions you register with `.addNode()`. The peer declaration documents the intended consumer; pin the framework version in your application.\n\nIf you also want agent-callable tools (`memory_search`, `memory_ingest`), use [`@atomicmemory/langchain`](../langchain-js/README.md) — LangGraph consumes the same `tool()`-shaped objects.\n\n## Install\n\n```bash\npnpm add @atomicmemory/langgraph @atomicmemory/sdk @langchain/langgraph\n```\n\n## Minimal end-to-end example\n\n```ts\nimport { StateGraph, MessagesAnnotation } from '@langchain/langgraph';\nimport { MemoryClient } from '@atomicmemory/sdk';\nimport {\n  createMemoryRetrieveNode,\n  createMemoryIngestNode,\n} from '@atomicmemory/langgraph';\n\nconst memory = new MemoryClient({\n  providers: { atomicmemory: { apiUrl: process.env.ATOMICMEMORY_URL!, apiKey: process.env.ATOMICMEMORY_KEY! } },\n});\nawait memory.initialize();\n\nconst scope = { user: 'pip', namespace: 'my-graph' };\n\nconst retrieve = createMemoryRetrieveNode<typeof MessagesAnnotation.State, { context: string | null }>(memory, {\n  scope,\n  getQuery: (state) => {\n    const last = [...state.messages].reverse().find((m) => m.getType?.() === 'human');\n    return typeof last?.content === 'string' ? last.content : '';\n  },\n  applyContext: (_state, context) => ({ context }),\n});\n\nconst ingest = createMemoryIngestNode<typeof MessagesAnnotation.State, Record<string, never>>(memory, {\n  scope,\n  getMessages: (state) => state.messages.map((m) => ({\n    role: m.getType?.() === 'human' ? 'user' : 'assistant',\n    content: typeof m.content === 'string' ? m.content : '',\n  })),\n  getCompletion: (state) => {\n    const last = state.messages.at(-1);\n    return typeof last?.content === 'string' ? last.content : '';\n  },\n});\n\nconst graph = new StateGraph(MessagesAnnotation)\n  .addNode('retrieve', retrieve)\n  .addNode('model', async () => ({ /* your model call */ }))\n  .addNode('ingest', ingest)\n  .addEdge('__start__', 'retrieve')\n  .addEdge('retrieve', 'model')\n  .addEdge('model', 'ingest')\n  .compile();\n```\n\nThe `getQuery` / `applyContext` / `getMessages` / `getCompletion` extractors keep the adapter completely decoupled from any specific state schema. Use whatever channels your graph already exposes.\n\n## Scope binding\n\nScope is fixed at factory time — agents and downstream nodes cannot rebind to other users by mutating state.\n\n## Framework-agnostic helpers\n\n```ts\nimport { searchMemory, ingestTurn } from '@atomicmemory/langgraph';\n\nconst { context } = await searchMemory(memory, { query, scope });\nawait ingestTurn(memory, { messages, completion: text, scope });\n```\n\n`ingestTurn()` excludes `system` messages by default — opt in via `includeRoles` only when your system content is genuinely user-authored material worth remembering.\n\n## License\n\nApache-2.0.\n","readmeFilename":"README.md"}