{"_id":"@ap3x/hot-loader","_rev":"3-a9ad8321d0a3f203cf5c17b0fb8ae4a7","name":"@ap3x/hot-loader","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@ap3x/hot-loader","version":"1.0.0","license":"MIT","_id":"@ap3x/hot-loader@1.0.0","maintainers":[{"name":"botstack","email":"GuerrillaMedia702@gmail.com"}],"dist":{"shasum":"f83622f2b6e32351bad4ce0463da50a931cbc0ce","tarball":"https://registry.npmjs.org/@ap3x/hot-loader/-/hot-loader-1.0.0.tgz","fileCount":2,"integrity":"sha512-R7Y+otw77E844Ue1jTrgnYQ0iFA49303kLd7uPQ+EtZKhcDm/MrEIpHYXhKgBYh8j9s1uZ0ri9gY3nYUaEoFdg==","signatures":[{"sig":"MEUCIQDD1HIbUGZd0uChL4L2emgtT7rctCOxLZ68JJmN2ij7QgIgFoBTmfIyFoPsG/Pt1xaXFYCL+x9aFzzfVMup/ab/Vkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3014},"main":"./dist/index.js","type":"module","_from":"file:ap3x-hot-loader-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"botstack","email":"GuerrillaMedia702@gmail.com"},"_resolved":"C:\\Users\\Guerr\\AppData\\Local\\Temp\\39785702f58a6b32ecd9960f80ab6ef2\\ap3x-hot-loader-1.0.0.tgz","_integrity":"sha512-R7Y+otw77E844Ue1jTrgnYQ0iFA49303kLd7uPQ+EtZKhcDm/MrEIpHYXhKgBYh8j9s1uZ0ri9gY3nYUaEoFdg==","deprecated":"Moved to @oni.bot/hot-loader. Part of ONI, NOT the AP3X agent framework.","_npmVersion":"11.5.1","description":"File-watching extension loader for DynamicToolRegistry — drop a file, get a tool","directories":{},"_nodeVersion":"20.18.2","dependencies":{"jiti":"^2.4.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","chokidar":"^4.0.3","@ap3x/core":"1.0.0","typescript":"^5.4.0"},"peerDependencies":{"chokidar":">=3.0.0","@ap3x/core":"^1.0.0"},"peerDependenciesMeta":{"chokidar":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/hot-loader_1.0.0_1776576667435_0.8216698375824587","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-04-19T05:31:07.334Z","modified":"2026-08-01T03:36:28.617Z","1.0.0":"2026-04-19T05:31:07.584Z"},"license":"MIT","description":"File-watching extension loader for DynamicToolRegistry — drop a file, get a tool","maintainers":[{"name":"botstack","email":"GuerrillaMedia702@gmail.com"}],"readme":"# @ap3x/hot-loader\r\n\r\nFile-watching extension loader for `DynamicToolRegistry` from\r\n[@ap3x/core](https://www.npmjs.com/package/@ap3x/core).\r\n\r\nDrop a `.ts`/`.js`/`.mjs` file into a watched directory — its exported\r\nfunctions become registered tools. Change the file, the tools hot-swap.\r\nDelete the file, the tools unregister.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install @ap3x/hot-loader chokidar\r\n```\r\n\r\n`chokidar` is a peer dependency.\r\n\r\n## Usage\r\n\r\n```typescript\r\nimport { DynamicToolRegistry } from \"@ap3x/core/registry\";\r\nimport { watchExtensions } from \"@ap3x/hot-loader\";\r\n\r\nconst registry = new DynamicToolRegistry();\r\n\r\nconst loader = watchExtensions({\r\n  dir: \"/path/to/extensions\",\r\n  registry,\r\n  onLoad: (file, tools) => console.log(`loaded ${tools.join(\", \")} from ${file}`),\r\n  onUnload: (file, tools) => console.log(`unloaded ${tools.join(\", \")} from ${file}`),\r\n  onError: (file, err) => console.error(`failed to load ${file}:`, err),\r\n});\r\n\r\n// ... later ...\r\nloader.stop();\r\n```\r\n\r\n## Extension file contract\r\n\r\nEach exported function becomes a tool. Attach a `.schema` property for\r\nmetadata.\r\n\r\n```typescript\r\nimport type { ToolHandler } from \"@ap3x/core/registry\";\r\n\r\nexport const search_web: ToolHandler = async (args, state) => {\r\n  const results = await fetchResults(args.query as string);\r\n  return {\r\n    tool_name: \"search_web\",\r\n    success: true,\r\n    output: JSON.stringify(results),\r\n  };\r\n};\r\n\r\nsearch_web.schema = {\r\n  name: \"search_web\",\r\n  description: \"Search the web for current information\",\r\n  parameters: {\r\n    type: \"object\",\r\n    properties: { query: { type: \"string\" } },\r\n    required: [\"query\"],\r\n  },\r\n};\r\n```\r\n\r\n## API\r\n\r\n### `watchExtensions(options): HotLoader`\r\n\r\n**Options:**\r\n- `dir` — absolute path to watch\r\n- `registry` — your `DynamicToolRegistry` instance\r\n- `pattern?` — glob-style extension filter (default `**/*.{ts,js,mjs}`)\r\n- `onLoad?(file, tools)`\r\n- `onUnload?(file, tools)`\r\n- `onError?(file, error)`\r\n\r\n**Returns:**\r\n- `stop()` — stop watching\r\n- `loaded()` — `Map<filePath, toolNames[]>` of currently loaded tools\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}