{"_id":"@appydave/appysentinel-core","_rev":"4-73745763910496ac33aac5f24b0621d6","name":"@appydave/appysentinel-core","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@appydave/appysentinel-core","version":"0.1.0","keywords":["appydave","appysentinel","sentinel","telemetry","observability","collector","signal","bun","node"],"author":{"name":"David Cruwys"},"license":"MIT","_id":"@appydave/appysentinel-core@0.1.0","maintainers":[{"name":"klueless-io","email":"david@ideasmen.com.au"}],"homepage":"https://github.com/appydave/appysentinal#readme","bugs":{"url":"https://github.com/appydave/appysentinal/issues"},"dist":{"shasum":"e1ab7d325aed97caca874d785a01b3070e36554e","tarball":"https://registry.npmjs.org/@appydave/appysentinel-core/-/appysentinel-core-0.1.0.tgz","fileCount":47,"integrity":"sha512-bAn6fB2PkmK7i5bk0sdPrBDFCioOEiHZi1KdQh7O21EllMZc2RURc8VYZ3JoihgD/jxdsVHyw6p8tbfhhnbyCA==","signatures":[{"sig":"MEQCIBOtY7jkzXqyiKgvXPwQlDdk73U/tUlbSY4sSPHZ+v3UAiAYQpjHc5pMT6qh8ZriqYsxt91XMbh0oZxotSkNHzuu9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97509},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./bus":{"types":"./dist/bus.d.ts","import":"./dist/bus.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./logger":{"types":"./dist/logger.d.ts","import":"./dist/logger.js"},"./signal":{"types":"./dist/signal.d.ts","import":"./dist/signal.js"},"./lifecycle":{"types":"./dist/lifecycle.d.ts","import":"./dist/lifecycle.js"},"./atomic-write":{"types":"./dist/atomic-write.d.ts","import":"./dist/atomic-write.js"},"./serial-queue":{"types":"./dist/serial-queue.d.ts","import":"./dist/serial-queue.js"}},"gitHead":"f7caf0226461024dda2a761dbc07f4047e5d4884","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"echo 'core lint stub' && exit 0","test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","prepublishOnly":"bun run build"},"_npmUser":{"name":"klueless-io","email":"david@ideasmen.com.au"},"repository":{"url":"git+https://github.com/appydave/appysentinal.git","type":"git","directory":"packages/core"},"_npmVersion":"11.11.0","description":"AppySentinel runtime library — Signal envelope, event bus, lifecycle, config loader, atomic write, serial queue, logger, createSentinel()","directories":{},"_nodeVersion":"25.8.0","dependencies":{"zod":"^3.23.0","pino":"^9.5.0","ulid":"^2.3.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/appysentinel-core_0.1.0_1777202613470_0.3019130647120649","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@appydave/appysentinel-core","version":"0.2.0","keywords":["appydave","appysentinel","sentinel","telemetry","observability","collector","signal","bun","node"],"author":{"name":"David Cruwys"},"license":"MIT","_id":"@appydave/appysentinel-core@0.2.0","maintainers":[{"name":"klueless-io","email":"david@ideasmen.com.au"}],"homepage":"https://github.com/appydave/appysentinal#readme","bugs":{"url":"https://github.com/appydave/appysentinal/issues"},"dist":{"shasum":"3ed257352546d4fd879416c7e8938a570793bdde","tarball":"https://registry.npmjs.org/@appydave/appysentinel-core/-/appysentinel-core-0.2.0.tgz","fileCount":52,"integrity":"sha512-vXkyxQDvmvMSTiyCowBmU01wRZDmSJn8AFC0Z4ledceokEclOftD/X/urggcV6Oq3Y9ac1pasbXwSLI4ZWvlgg==","signatures":[{"sig":"MEUCICx770HcUchywwm8Nj5ud0ryT1syCbW/+fRwXnOjIv6MAiEA/6iZ5jtMt4ulSnmIyIgqChmTYtIPTNv7r1nCDzizqak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98949},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./bus":{"types":"./dist/bus.d.ts","import":"./dist/bus.js"},"./config":{"types":"./dist/config.d.ts","import":"./dist/config.js"},"./logger":{"types":"./dist/logger.d.ts","import":"./dist/logger.js"},"./signal":{"types":"./dist/signal.d.ts","import":"./dist/signal.js"},"./lifecycle":{"types":"./dist/lifecycle.d.ts","import":"./dist/lifecycle.js"},"./atomic-write":{"types":"./dist/atomic-write.d.ts","import":"./dist/atomic-write.js"},"./serial-queue":{"types":"./dist/serial-queue.d.ts","import":"./dist/serial-queue.js"}},"gitHead":"9bcf68a1fdabe68ac31ec0ae67ffda641ef64ec5","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"echo 'core lint stub' && exit 0","test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","prepublishOnly":"bun run build"},"_npmUser":{"name":"klueless-io","email":"david@ideasmen.com.au"},"repository":{"url":"git+https://github.com/appydave/appysentinal.git","type":"git","directory":"packages/core"},"_npmVersion":"11.12.1","description":"AppySentinel runtime library — Signal envelope, event bus, lifecycle, config loader, atomic write, serial queue, logger, createSentinel()","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.0","pino":"^9.5.0","ulid":"^2.3.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/appysentinel-core_0.2.0_1777340753366_0.5608936048611424","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@appydave/appysentinel-core","version":"0.3.0","keywords":["appydave","appysentinel","sentinel","telemetry","observability","collector","signal","bun","node"],"author":{"name":"David Cruwys"},"license":"MIT","_id":"@appydave/appysentinel-core@0.3.0","maintainers":[{"name":"klueless-io","email":"david@ideasmen.com.au"}],"homepage":"https://github.com/appydave/appysentinel#readme","bugs":{"url":"https://github.com/appydave/appysentinel/issues"},"dist":{"shasum":"a8c068fdb76fb205e4be71877e29bdcce56330b8","tarball":"https://registry.npmjs.org/@appydave/appysentinel-core/-/appysentinel-core-0.3.0.tgz","fileCount":27,"integrity":"sha512-7Zs5BZE2RSViML2FvzxE0z3RZ1TV3dxmK4Xc4fkNki9kYUcpFE2CZgnqQuSWV/lumEM416FmJ1bPS1ZOi6t/7w==","signatures":[{"sig":"MEUCIQCP40nQvT6BMUe/xicFYVP957IaUUhHqUzGtZLCOwg3ggIgN46RoioufF1/8oVBbpUPaPY6JU35v9JqLxnKU9GPVp4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44864},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./bus":{"types":"./dist/bus.d.ts","import":"./dist/bus.js"},"./signal":{"types":"./dist/signal.d.ts","import":"./dist/signal.js"}},"gitHead":"94e22deefdd63669fd8598f77be93f7e2cba93cc","scripts":{"dev":"tsc -p tsconfig.json --watch","lint":"echo 'core lint stub' && exit 0","test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test:watch":"vitest","prepublishOnly":"bun run build"},"_npmUser":{"name":"klueless-io","email":"david@ideasmen.com.au"},"repository":{"url":"git+https://github.com/appydave/appysentinel.git","type":"git","directory":"packages/core"},"_npmVersion":"11.11.0","description":"AppySentinel runtime library — Signal envelope, event bus, createSentinel(); shared primitives (lifecycle, config, atomic write, serial queue, logger) re-exported from @appydave/core","directories":{},"_nodeVersion":"25.8.1","dependencies":{"ulid":"^2.3.0","@appydave/core":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/appysentinel-core_0.3.0_1784457083708_0.3681792473938401","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@appydave/appysentinel-core","version":"0.4.0","description":"AppySentinel runtime library — Signal envelope, event bus, createSentinel(), query result. Foundation primitives (lifecycle, config, logger, atomic-write, serial-queue) are NOT re-exported; import them from @appydave/core (one symbol, one home)","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./signal":{"types":"./dist/signal.d.ts","import":"./dist/signal.js"},"./bus":{"types":"./dist/bus.d.ts","import":"./dist/bus.js"}},"scripts":{"build":"tsc -p tsconfig.json","dev":"tsc -p tsconfig.json --watch","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit -p tsconfig.json","lint":"echo 'core lint stub' && exit 0","prepublishOnly":"bun run build"},"dependencies":{"@appydave/core":"^0.1.0","ulid":"^2.3.0"},"devDependencies":{"@types/node":"^22.10.0","typescript":"^5.7.0","vitest":"^2.1.0"},"keywords":["appydave","appysentinel","sentinel","telemetry","observability","collector","signal","bun","node"],"repository":{"type":"git","url":"git+https://github.com/appydave/appysentinel.git","directory":"packages/core"},"homepage":"https://github.com/appydave/appysentinel#readme","author":{"name":"David Cruwys"},"license":"MIT","gitHead":"3af2a57a6d3d8d458386c93d1fa0173775b53446","_id":"@appydave/appysentinel-core@0.4.0","bugs":{"url":"https://github.com/appydave/appysentinel/issues"},"_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-GEQpOgt4ymqAImW4MEaH1gaTlrqzAMPwr/E/3b/Q9gQPVgMwnvUdaC5J4+1pn/cUCdH7EpFiZlzRJi3UUAHyTg==","shasum":"90c04beaacb1ef77c9158f44e532f16d31e5f8bd","tarball":"https://registry.npmjs.org/@appydave/appysentinel-core/-/appysentinel-core-0.4.0.tgz","fileCount":27,"unpackedSize":44224,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH6SaSxhCGbzDR1Fdcqc7OKvVlHDpXNuZseofLRfM625AiEAiiW8GRa4ikFUFL8ZQbE3iz8EHHYZm1wsf0+WHIZp424="}]},"_npmUser":{"name":"klueless-io","email":"david@ideasmen.com.au"},"directories":{},"maintainers":[{"name":"klueless-io","email":"david@ideasmen.com.au"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appysentinel-core_0.4.0_1784536102861_0.3940792319828401"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-26T11:23:33.353Z","modified":"2026-07-20T08:28:23.169Z","0.1.0":"2026-04-26T11:23:33.649Z","0.2.0":"2026-04-28T01:45:53.518Z","0.3.0":"2026-07-19T10:31:23.858Z","0.4.0":"2026-07-20T08:28:23.023Z"},"bugs":{"url":"https://github.com/appydave/appysentinel/issues"},"author":{"name":"David Cruwys"},"license":"MIT","homepage":"https://github.com/appydave/appysentinel#readme","keywords":["appydave","appysentinel","sentinel","telemetry","observability","collector","signal","bun","node"],"repository":{"type":"git","url":"git+https://github.com/appydave/appysentinel.git","directory":"packages/core"},"description":"AppySentinel runtime library — Signal envelope, event bus, createSentinel(), query result. Foundation primitives (lifecycle, config, logger, atomic-write, serial-queue) are NOT re-exported; import them from @appydave/core (one symbol, one home)","maintainers":[{"name":"klueless-io","email":"david@ideasmen.com.au"}],"readme":"# @appydave/appysentinel-core\n\nRuntime library for AppySentinel — the per-machine, observer-only telemetry collector boilerplate.\n\nThis package ships the **seven baked-in primitives** that every Sentinel uses (spec §5):\n\n1. **Signal envelope** — common outer contract (`Signal<P>`)\n2. **SignalBus** — internal pub/sub\n3. **Lifecycle harness** — start / stop / reload / health, with SIGINT/SIGTERM/SIGHUP wiring\n4. **ConfigLoader** — defaults → file → env, Zod-validated, reloadable\n5. **atomicWrite** — temp-file + rename helper\n6. **SerialQueue** — promise-chain serialisation primitive\n7. **Logger** — pre-configured Pino with child-logger support\n\nPlus the convenience factory `createSentinel()` that wires them all together.\n\n## Installation\n\n```bash\nbun add @appydave/appysentinel-core\n# or\nnpm install @appydave/appysentinel-core\n```\n\n## Usage\n\n```typescript\nimport { createSentinel } from '@appydave/appysentinel-core';\n\nconst sentinel = createSentinel({\n  name: 'my-sentinel',\n  machine: process.env.MACHINE_NAME ?? 'unknown',\n});\n\nsentinel.on((signal) => {\n  console.log(signal.kind, signal.name, signal.payload);\n});\n\nsentinel.lifecycle.onStart(async () => {\n  // wire collectors here\n});\n\nsentinel.lifecycle.onStop(async (reason) => {\n  // flush + close handles\n});\n\nawait sentinel.start();\n\nsentinel.emit({\n  source: 'demo',\n  kind: 'event',\n  name: 'sentinel.started',\n  payload: { example: true },\n});\n```\n\n## What this library is not\n\n- **Not a collector** — `watch-directory`, `poll-command`, etc. are *recipes* (markdown specs), not bundled code.\n- **Not a transport** — `http-push`, `otlp-push`, etc. are recipes.\n- **Not an interface** — REST / MCP / Socket.io are recipes.\n\nRecipes are generated into your project by the `configure-sentinel` agent at scaffold time. Core is intentionally just the plumbing.\n\n## Module map\n\n| Subpath | Exports |\n|---------|---------|\n| (root) `@appydave/appysentinel-core` | everything |\n| `/signal` | `Signal`, `SignalKind`, `SignalPayload`, `mintSignal` |\n| `/bus` | `createSignalBus`, `SignalBus` |\n| `/lifecycle` | `createLifecycle`, `Lifecycle` |\n| `/config` | `createConfigLoader`, `z` |\n| `/atomic-write` | `atomicWrite` |\n| `/serial-queue` | `SerialQueue` |\n| `/logger` | `createLogger`, `Logger` |\n\n## Stack\n\nTypeScript strict, ESM, ULID for ids, Zod for schemas, Pino for logs. Bun-recommended runtime; works on Node ≥ 20.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}