{"_id":"@ankhzet/goap","_rev":"5-7ae5b9448fecac080554c323cea50123","name":"@ankhzet/goap","dist-tags":{"latest":"1.3.2"},"versions":{"1.1.0":{"name":"@ankhzet/goap","version":"1.1.0","author":{"name":"AnkhZet ankhzet@gmail.com"},"_id":"@ankhzet/goap@1.1.0","maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"dist":{"shasum":"e068ab85af0bc86e0314b940d81ed58996d220be","tarball":"https://registry.npmjs.org/@ankhzet/goap/-/goap-1.1.0.tgz","fileCount":28,"integrity":"sha512-zU2EiSHLtyVICjBGqDjclPg/QcxAw0AkHZ1ObMLUEHaraiWZXtlc1AIwbuja7YBRzv4HtGR8HI4OP2UaZUbflA==","signatures":[{"sig":"MEUCIQCXurAHsiADbzM5uFdv+X9BAwIWOdLicnx6kTJOH+GasgIgYOyPLf+GdFFz/ryCm2BDOENgwpIbFYoTghaXEAnJgJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36240},"main":"./src/index.ts","type":"module","_from":"file:ankhzet-goap-1.1.0.tgz","types":"./src/index.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"api":"api-extractor run --local --verbose","sync":"pnpm -r up @ankhzet/*@latest","build":"vite build","clean":"rm -rf ./{build,dist,api} && rm -rf ./*.log","preview":".bin/publish --dry-run --no-git-checks"},"_npmUser":{"name":"ankhzet","email":"ankhzet@gmail.com"},"_resolved":"/private/var/folders/t0/crkrf0813j10dr28s3t630c40000gn/T/73b75e228ed25d65eac589e4420f5d82/ankhzet-goap-1.1.0.tgz","_integrity":"sha512-zU2EiSHLtyVICjBGqDjclPg/QcxAw0AkHZ1ObMLUEHaraiWZXtlc1AIwbuja7YBRzv4HtGR8HI4OP2UaZUbflA==","_npmVersion":"11.12.1","description":"","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@ankhzet/gcl":"1.1.0","@ankhzet/eventual":"1.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/jest":"^30.0.0","@microsoft/api-extractor":"^7.58.7"},"_npmOperationalInternal":{"tmp":"tmp/goap_1.1.0_1779805217233_0.4006748513933458","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@ankhzet/goap","version":"1.2.0","author":{"name":"AnkhZet ankhzet@gmail.com"},"_id":"@ankhzet/goap@1.2.0","maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"dist":{"shasum":"8ce8a09d26dd1dffa9b417979d34e0381415c525","tarball":"https://registry.npmjs.org/@ankhzet/goap/-/goap-1.2.0.tgz","fileCount":31,"integrity":"sha512-VSEQqjPP+J7ePZEW5L96aDJv2jp0rG0w9OpHKebZjF/6GmUdjeKTGhAkNeAy5gj7/Eu6G7vW3UbYpCt+jHeHUg==","signatures":[{"sig":"MEUCIQD+ZTaqmzGxYxFSDN4OpXhdU7uQ2PWV15S6lTb5aSr3dwIgDokRrwCO98DTsK1WSWi4xaae2iOq5H1CyDlptiWuKYs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101220},"main":"./src/index.ts","type":"module","_from":"file:ankhzet-goap-1.2.0.tgz","types":"./src/index.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"api":"api-extractor run --local --verbose","sync":"pnpm -r up @ankhzet/*@latest","build":"vite build","clean":"rm -rf ./{build,dist,api} && rm -rf ./*.log","preview":".bin/publish --dry-run --no-git-checks"},"_npmUser":{"name":"ankhzet","email":"ankhzet@gmail.com"},"_resolved":"/private/var/folders/t0/crkrf0813j10dr28s3t630c40000gn/T/289e700832a712cffd9d1e66a6eba767/ankhzet-goap-1.2.0.tgz","_integrity":"sha512-VSEQqjPP+J7ePZEW5L96aDJv2jp0rG0w9OpHKebZjF/6GmUdjeKTGhAkNeAy5gj7/Eu6G7vW3UbYpCt+jHeHUg==","_npmVersion":"11.12.1","description":"","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@ankhzet/gcl":"1.2.0","@ankhzet/eventual":"1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/jest":"^30.0.0","@microsoft/api-extractor":"^7.58.7"},"_npmOperationalInternal":{"tmp":"tmp/goap_1.2.0_1779807312610_0.4199159452618","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@ankhzet/goap","version":"1.3.0","author":{"name":"AnkhZet ankhzet@gmail.com"},"_id":"@ankhzet/goap@1.3.0","maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"dist":{"shasum":"42826b42e5c04431214e904f52d0451bc4f80a62","tarball":"https://registry.npmjs.org/@ankhzet/goap/-/goap-1.3.0.tgz","fileCount":31,"integrity":"sha512-YoT3It1LzDUWhzEoCvXNdS6i3Y3qyFAWm5jVgQsbT8vttwAlAPoVHTDjjw5c3+DUJTZgC7cf0gCHzH8OQyfk2Q==","signatures":[{"sig":"MEUCIBXYVnb68u0mVBdQ02OAhvD5NyMTsbkTTe8wM777RCnzAiEAtMI4QPWexwxAj5A9W8EFpD8dLTbD1MYVKKJiVSWa4+4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105718},"main":"./src/index.ts","type":"module","_from":"file:ankhzet-goap-1.3.0.tgz","types":"./src/index.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"api":"api-extractor run --local --verbose","sync":"pnpm -r up @ankhzet/*@latest","build":"vite build","clean":"rm -rf ./{build,dist,api} && rm -rf ./*.log","preview":".bin/publish --dry-run --no-git-checks"},"_npmUser":{"name":"ankhzet","email":"ankhzet@gmail.com"},"_resolved":"/private/var/folders/t0/crkrf0813j10dr28s3t630c40000gn/T/b248b2f4aba164cab7bc6f6c0f3bc9a8/ankhzet-goap-1.3.0.tgz","_integrity":"sha512-YoT3It1LzDUWhzEoCvXNdS6i3Y3qyFAWm5jVgQsbT8vttwAlAPoVHTDjjw5c3+DUJTZgC7cf0gCHzH8OQyfk2Q==","_npmVersion":"11.12.1","description":"Goal-Oriented Action Planning library for TypeScript/JavaScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@ankhzet/gcl":"1.2.0","@ankhzet/eventual":"1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/jest":"^30.0.0","@microsoft/api-extractor":"^7.58.7"},"_npmOperationalInternal":{"tmp":"tmp/goap_1.3.0_1780178417023_0.5298881266616222","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@ankhzet/goap","version":"1.3.1","author":{"name":"AnkhZet ankhzet@gmail.com"},"_id":"@ankhzet/goap@1.3.1","maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"dist":{"shasum":"cc54e8e245a186c42dd87f52507737429de4f7c4","tarball":"https://registry.npmjs.org/@ankhzet/goap/-/goap-1.3.1.tgz","fileCount":31,"integrity":"sha512-IMdl5ZkGc/KojokOxtMfRwENePCElrkQ0zUjc1tK8D3p5nk0g8TtFjIMPF9/X85LF+Vgj54xUbmouMyMci3iXQ==","signatures":[{"sig":"MEUCIQD5fx7i5z+yy5A8dMX7o83OnNG3GqYo04et1hOFT+NUHQIgWpAFwy0JXPyxUjugSAtEYcEGAnWSXSATvytJOq4+hbE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105840},"main":"./src/index.ts","type":"module","_from":"file:ankhzet-goap-1.3.1.tgz","types":"./src/index.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"api":"api-extractor run --local --verbose","sync":"pnpm -r up @ankhzet/*@latest","build":"vite build","clean":"rm -rf ./{build,dist,api} && rm -rf ./*.log","preview":".bin/publish --dry-run --no-git-checks"},"_npmUser":{"name":"ankhzet","email":"ankhzet@gmail.com"},"_resolved":"/private/var/folders/t0/crkrf0813j10dr28s3t630c40000gn/T/39b39aee83555ce69e8df69a0035f76b/ankhzet-goap-1.3.1.tgz","_integrity":"sha512-IMdl5ZkGc/KojokOxtMfRwENePCElrkQ0zUjc1tK8D3p5nk0g8TtFjIMPF9/X85LF+Vgj54xUbmouMyMci3iXQ==","_npmVersion":"11.12.1","description":"Goal-Oriented Action Planning library for TypeScript/JavaScript.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"@ankhzet/gcl":"1.2.0","@ankhzet/eventual":"1.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/jest":"^30.0.0","@microsoft/api-extractor":"^7.58.7"},"_npmOperationalInternal":{"tmp":"tmp/goap_1.3.1_1780214310031_0.6914496645405646","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@ankhzet/goap","version":"1.3.2","author":{"name":"AnkhZet ankhzet@gmail.com"},"type":"module","main":"./src/index.ts","types":"./src/index.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"publishConfig":{"access":"public"},"dependencies":{"@ankhzet/eventual":"1.2.0","@ankhzet/gcl":"1.2.0"},"devDependencies":{"@microsoft/api-extractor":"^7.58.7","@types/jest":"^30.0.0"},"sideEffects":false,"scripts":{"clean":"rm -rf ./{build,dist,api} && rm -rf ./*.log","build":"vite build","api":"api-extractor run --local --verbose","preview":".bin/publish --dry-run --no-git-checks","sync":"pnpm -r up @ankhzet/*@latest"},"_id":"@ankhzet/goap@1.3.2","description":"Goal-Oriented Action Planning library for TypeScript/JavaScript.","_integrity":"sha512-4R/nNYeJeir8i2axW4rSiihwhz6oBJrjpGCB8E6jWEW0XUXECOfyiSLBMrH/iUz7Rr970jVdH8k6DOUyijFZFQ==","_resolved":"/private/var/folders/t0/crkrf0813j10dr28s3t630c40000gn/T/afef61f2375d925a0c404f670e07da5c/ankhzet-goap-1.3.2.tgz","_from":"file:ankhzet-goap-1.3.2.tgz","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-4R/nNYeJeir8i2axW4rSiihwhz6oBJrjpGCB8E6jWEW0XUXECOfyiSLBMrH/iUz7Rr970jVdH8k6DOUyijFZFQ==","shasum":"9515fdab82e96540d03a133035c93ce0cf30a79f","tarball":"https://registry.npmjs.org/@ankhzet/goap/-/goap-1.3.2.tgz","fileCount":31,"unpackedSize":105890,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCfWEhgnYNgWzEZ+FgYqa+Rcs2hVZgoyju5++gWTKcOSQIhAKWk57LEv5e/YrBaD3CFUgGUY6h2ADs9nEMsWfGOI65p"}]},"_npmUser":{"name":"ankhzet","email":"ankhzet@gmail.com"},"directories":{},"maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/goap_1.3.2_1781353821700_0.056332504720359555"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T14:20:17.112Z","modified":"2026-06-13T12:30:22.040Z","1.1.0":"2026-05-26T14:20:17.454Z","1.2.0":"2026-05-26T14:55:12.768Z","1.3.0":"2026-05-30T22:00:17.171Z","1.3.1":"2026-05-31T07:58:30.206Z","1.3.2":"2026-06-13T12:30:21.915Z"},"author":{"name":"AnkhZet ankhzet@gmail.com"},"description":"Goal-Oriented Action Planning library for TypeScript/JavaScript.","maintainers":[{"name":"ankhzet","email":"ankhzet@gmail.com"}],"readme":"# GoAP\n\nGoal-Oriented Action Planning library for TypeScript/JavaScript.\n\n## Overview\n\nGoAP enables autonomous agents to dynamically generate action sequences to achieve goals. Unlike behavior trees or state machines, plans are computed at runtime based on current world state and available actions.\n\n**Key features:**\n- Automatic plan generation via backward-chaining search\n- Cost-based path selection\n- Dynamic state evaluation at runtime\n- Action hierarchies with preconditions and effects\n- Extensible via TypeScript mixins\n\n## Installation\n\n```bash\nnpm install @ankhzet/goap\n# or\nyarn add @ankhzet/goap\n# or\npnpm add @ankhzet/goap\n```\n\nRequires TypeScript 4.0+ or ES2018+ runtime.\n\n## Quick Start\n\n```typescript\nimport {\n  Action,\n  ActionEnactor,\n  ActionProcessingResult,\n  EnactorState,\n  GoalActionPlanner,\n  GoalActionExecutor,\n  StateBitInterface,\n  StateInterface\n} from 'goap';\n\n// Define state bits\nconst isHungry: StateBitInterface<Agent> = { name: 'isHungry' };\nconst hasFood: StateBitInterface<Agent> = { name: 'hasFood' };\n\n// Define actions\nclass EatAction extends Action<Agent> {\n  cost = 1;\n  requires = new EnactorState([[isHungry, true]]);\n  provides = new EnactorState([[hasFood, true]]);\n\n  process(enactor: Agent): ActionProcessingResult {\n    enactor.hunger = 100;\n    return ActionProcessingResult.Finished;\n  }\n}\n\n// Create agent\nclass Agent extends ActionEnactor(BaseClass) {\n  actions = new Set([new EatAction()]);\n  state = new EnactorState();\n  deriveGoal(): StateInterface<Agent> {\n    return new EnactorState([[hasFood, true]]);\n  }\n}\n\n// Plan and execute\nconst planner = new GoalActionPlanner<Agent>();\nconst executor = new GoalActionExecutor<Agent>();\n\nconst plan = planner.plan(agent, agent.deriveGoal(), agent.state);\nif (plan) {\n  agent.acceptSequence(plan);\n  // In game loop:\n  executor.process(agent, delta);\n}\n```\n\n## Documentation\n\n- [Core Concepts](./docs/core-concepts.md) - State system, actions, goals, planner algorithm\n- [Public API](./docs/public-api.md) - Complete type and method reference\n- [Examples](./docs/) - Real-world usage patterns\n\n### Examples\n\n| Domain | Description |\n|--------|-------------|\n| [Game NPC AI](./docs/example-game-npc.md) | Survival game with hunger, health, combat, socialization |\n| [Warehouse Robot](./docs/example-warehouse-robot.md) | Pick-and-deliver logistics with battery management |\n| [Smart Home](./docs/example-smart-home.md) | Home automation with HVAC, lighting, security |\n| [Autonomous Vehicle](./docs/example-autonomous-vehicle.md) | Navigation with routing, obstacle avoidance, parking |\n\n## Core Concepts\n\n### State\n\nWorld state is represented as a collection of bits with boolean values:\n\n```typescript\nconst state = new EnactorState<Agent>([\n  [hasWeapon, true],\n  [isHealthy, false]\n]);\n```\n\nState bits can be static or dynamic:\n\n```typescript\nconst nearEnemy = {\n  name: 'nearEnemy',\n  isFulfilledBy: (agent) => agent.distanceToEnemy < 10\n};\n```\n\n### Actions\n\nActions have preconditions (`requires`), effects (`provides`), and cost:\n\n```typescript\nclass MyAction extends Action<Agent> {\n  cost = 5;\n  requires = new EnactorState([[hasAmmo, true]]);\n  provides = new EnactorState([[enemyDead, true]]);\n\n  process(enactor: Agent, delta: number): ActionProcessingResult {\n    // Execution logic\n    return ActionProcessingResult.Finished;\n  }\n}\n```\n\n### Agents\n\nAgents combine state with available actions:\n\n```typescript\nclass MyAgent extends ActionEnactor(BaseClass) {\n  actions = new Set<ActionInterface<MyAgent>>();\n  state = new EnactorState<MyAgent>();\n\n  deriveGoal(): StateInterface<MyAgent> {\n    // Compute goal based on current needs\n    return new EnactorState([[hasFood, true]]);\n  }\n}\n```\n\n### Planning\n\nThe planner finds the cheapest sequence to achieve a goal:\n\n```typescript\nconst planner = new GoalActionPlanner<MyAgent>();\nconst plan = planner.plan(agent, goal, currentState);\n// Returns ActionInterface[] or undefined\n```\n\n### Execution\n\nThe executor runs the planned sequence:\n\n```typescript\nconst executor = new GoalActionExecutor<MyAgent>();\n\n// In game loop:\nconst isActing = executor.process(agent, delta);\nif (!isActing) {\n  // Replan\n}\n```\n\n## API Overview\n\n| Class | Purpose |\n|-------|---------|\n| `EnactorState` | Mutable world state |\n| `Action` | Base action class |\n| `ActionWithTarget` | Action requiring movement |\n| `ActionEnactor` | Mixin for action-performing agents |\n| `GoalActionPlanner` | Plan generation |\n| `GoalActionExecutor` | Plan execution |\n\nSee [Public API](./docs/public-api.md) for complete reference.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}