{"_id":"@coopah/bentley-core","_rev":"4-e526ad9cad10c6bb869a5650a4805712","name":"@coopah/bentley-core","dist-tags":{"latest":"0.3.0"},"versions":{"0.2.0":{"name":"@coopah/bentley-core","version":"0.2.0","keywords":["ai","agent","llm","bentley"],"license":"MIT","_id":"@coopah/bentley-core@0.2.0","maintainers":[{"name":"coopah","email":"tibo6c04@gmail.com"}],"homepage":"https://github.com/CoopahG/bentley#readme","bugs":{"url":"https://github.com/CoopahG/bentley/issues"},"dist":{"shasum":"0007e41d3355204d32d89a84b367e3e2d29ae2c7","tarball":"https://registry.npmjs.org/@coopah/bentley-core/-/bentley-core-0.2.0.tgz","fileCount":210,"integrity":"sha512-Zlho2mSapsZsuoWIWAG7reJFa/VJv6RFLyo3awYWsCe2Z1uxClIgmq7EQRhk4PzcHrc5J7mv9nTwaqBm/Msfxg==","signatures":[{"sig":"MEUCIQDdkZxacbeK8C+LGt5V4bJQWp+P5ivhn4CXQwZ2EfrUiAIgacNv6XJhyss78sN+eqYYhgj4HRu2Ig9D+W3eSaMuPgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":237533},"main":"dist/index.js","type":"module","_from":"file:coopah-bentley-core-0.2.0.tgz","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest run","build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"coopah","email":"tibo6c04@gmail.com"},"_resolved":"/private/var/folders/k4/9fdyr38j4gv59whg5k3w4fgm0000gn/T/821fe79ef33dc2831e3be51b1965faf4/coopah-bentley-core-0.2.0.tgz","_integrity":"sha512-Zlho2mSapsZsuoWIWAG7reJFa/VJv6RFLyo3awYWsCe2Z1uxClIgmq7EQRhk4PzcHrc5J7mv9nTwaqBm/Msfxg==","repository":{"url":"git+https://github.com/CoopahG/bentley.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"Agent runtime, workspace memory, skills, workflows, and DI container","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ai":"^6.0.116","zod":"^4.3.6","mitt":"^3.0.1","date-fns":"^4.1.0","date-fns-tz":"^3.2.0","gray-matter":"^4.0.3","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^25.3.5"},"_npmOperationalInternal":{"tmp":"tmp/bentley-core_0.2.0_1773093157699_0.17610922800217832","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@coopah/bentley-core","version":"0.2.1","keywords":["ai","agent","llm","bentley"],"license":"MIT","_id":"@coopah/bentley-core@0.2.1","maintainers":[{"name":"coopah","email":"tibo6c04@gmail.com"}],"homepage":"https://github.com/CoopahG/bentley#readme","bugs":{"url":"https://github.com/CoopahG/bentley/issues"},"dist":{"shasum":"a58a26184a282c681f063e815c22ee7b38bddb24","tarball":"https://registry.npmjs.org/@coopah/bentley-core/-/bentley-core-0.2.1.tgz","fileCount":211,"integrity":"sha512-fWAT7Qc439xKUJuIhB/5hUqLkWX8gE8h7VdDt6J82C0o0kSeDfhD23o1Ll0DrmbooJ1VgOg0HbkuU3PyLE2ceg==","signatures":[{"sig":"MEQCIHPJWxUzNX7n8o41hlfJ3OM/rmvZOyVb7g/w77uhoH0yAiAhZnPhwJMNdOdS0rPbgjpLe7ifU67/Qx4C+OIT51r3lQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":239247},"main":"dist/index.js","type":"module","_from":"file:coopah-bentley-core-0.2.1.tgz","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest run","build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"coopah","email":"tibo6c04@gmail.com"},"_resolved":"/private/var/folders/k4/9fdyr38j4gv59whg5k3w4fgm0000gn/T/06c9d6de256309ebd5150d1821b8d449/coopah-bentley-core-0.2.1.tgz","_integrity":"sha512-fWAT7Qc439xKUJuIhB/5hUqLkWX8gE8h7VdDt6J82C0o0kSeDfhD23o1Ll0DrmbooJ1VgOg0HbkuU3PyLE2ceg==","repository":{"url":"git+https://github.com/CoopahG/bentley.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"Agent runtime, workspace memory, skills, workflows, and DI container","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ai":"^6.0.116","zod":"^4.3.6","mitt":"^3.0.1","date-fns":"^4.1.0","date-fns-tz":"^3.2.0","gray-matter":"^4.0.3","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^25.3.5"},"_npmOperationalInternal":{"tmp":"tmp/bentley-core_0.2.1_1773093583501_0.08039419292201155","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@coopah/bentley-core","version":"0.2.2","keywords":["ai","agent","llm","bentley"],"license":"MIT","_id":"@coopah/bentley-core@0.2.2","maintainers":[{"name":"coopah","email":"tibo6c04@gmail.com"}],"homepage":"https://github.com/CoopahG/bentley#readme","bugs":{"url":"https://github.com/CoopahG/bentley/issues"},"dist":{"shasum":"1e6b3d0a59cf245498e11878e8e657a88e9d4e58","tarball":"https://registry.npmjs.org/@coopah/bentley-core/-/bentley-core-0.2.2.tgz","fileCount":211,"integrity":"sha512-t5qULQmLGGCX8FNR95MLQ/Z5Lb28so0b2wnEKxqD/kKNdnHW6WCBHrizHTo4RIozac8n985APjGcA6q7ktG2ww==","signatures":[{"sig":"MEYCIQCaupQNDmuxYmKwZVFdQpxO982P2FqAU1cIk7d3yZFtUQIhAITckhEkQeiJVp6umYDN0gTh1g0bbyIeo9n3fz2ayZ4z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242638},"main":"dist/index.js","type":"module","_from":"file:coopah-bentley-core-0.2.2.tgz","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","lint":"eslint src","test":"vitest run","build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"coopah","email":"tibo6c04@gmail.com"},"_resolved":"/private/var/folders/k4/9fdyr38j4gv59whg5k3w4fgm0000gn/T/429fea60faeee35744a9a13f2040154a/coopah-bentley-core-0.2.2.tgz","_integrity":"sha512-t5qULQmLGGCX8FNR95MLQ/Z5Lb28so0b2wnEKxqD/kKNdnHW6WCBHrizHTo4RIozac8n985APjGcA6q7ktG2ww==","repository":{"url":"git+https://github.com/CoopahG/bentley.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"Agent runtime, workspace memory, skills, workflows, and DI container","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ai":"^6.0.116","zod":"^4.3.6","mitt":"^3.0.1","date-fns":"^4.1.0","date-fns-tz":"^3.2.0","gray-matter":"^4.0.3","@modelcontextprotocol/sdk":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.18","typescript":"^5.9.3","@types/node":"^25.3.5"},"_npmOperationalInternal":{"tmp":"tmp/bentley-core_0.2.2_1773093907977_0.8163154498908991","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@coopah/bentley-core","version":"0.3.0","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"dependencies":{"@modelcontextprotocol/sdk":"^1.27.1","ai":"^6.0.116","date-fns":"^4.1.0","date-fns-tz":"^3.2.0","gray-matter":"^4.0.3","mitt":"^3.0.1","zod":"^4.3.6"},"devDependencies":{"@types/node":"^25.4.0","typescript":"^5.9.3","vitest":"^4.0.18"},"description":"Agent runtime, workspace memory, skills, workflows, and DI container","license":"MIT","repository":{"type":"git","url":"git+https://github.com/CoopahG/bentley.git","directory":"packages/core"},"engines":{"node":">=20.0.0"},"keywords":["ai","agent","llm","bentley"],"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","lint":"eslint src","typecheck":"tsc --noEmit","clean":"rm -rf dist"},"_id":"@coopah/bentley-core@0.3.0","bugs":{"url":"https://github.com/CoopahG/bentley/issues"},"homepage":"https://github.com/CoopahG/bentley#readme","_integrity":"sha512-hTMO3oQJpofn7zhxKStEQ2kiV4sNHUkIl1c99jN2Fr/ou6zEstGFLphfJrUHut+SqREGssr17mk/MRWOI4bBTw==","_resolved":"/private/var/folders/k4/9fdyr38j4gv59whg5k3w4fgm0000gn/T/9231487374928b693e20206489243427/coopah-bentley-core-0.3.0.tgz","_from":"file:coopah-bentley-core-0.3.0.tgz","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-hTMO3oQJpofn7zhxKStEQ2kiV4sNHUkIl1c99jN2Fr/ou6zEstGFLphfJrUHut+SqREGssr17mk/MRWOI4bBTw==","shasum":"f9fbfe5d21605fd821406a2e92334dd9840009dd","tarball":"https://registry.npmjs.org/@coopah/bentley-core/-/bentley-core-0.3.0.tgz","fileCount":247,"unpackedSize":404936,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFNNPzgLUKh4kpC5dLK0kNmVmKyOuXDqXGBCj62KXk2CAiEAn9pEC/K+GTcGb7aZQdjAOgkRIfIX5erUZYVcVxmViEU="}]},"_npmUser":{"name":"coopah","email":"tibo6c04@gmail.com"},"directories":{},"maintainers":[{"name":"coopah","email":"tibo6c04@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bentley-core_0.3.0_1773178076323_0.9856001248651716"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-09T21:52:37.639Z","modified":"2026-03-10T21:27:56.714Z","0.2.0":"2026-03-09T21:52:37.875Z","0.2.1":"2026-03-09T21:59:43.664Z","0.2.2":"2026-03-09T22:05:08.113Z","0.3.0":"2026-03-10T21:27:56.576Z"},"bugs":{"url":"https://github.com/CoopahG/bentley/issues"},"license":"MIT","homepage":"https://github.com/CoopahG/bentley#readme","keywords":["ai","agent","llm","bentley"],"repository":{"type":"git","url":"git+https://github.com/CoopahG/bentley.git","directory":"packages/core"},"description":"Agent runtime, workspace memory, skills, workflows, and DI container","maintainers":[{"name":"coopah","email":"tibo6c04@gmail.com"}],"readme":"# @coopah/bentley-core\n\nThe core runtime for [Bentley](https://github.com/CoopahG/bentley) — a modular AI agent orchestration framework. Provides the DI container, event bus, ReAct agent loop, file-based workspace memory, skill system, multi-agent workflows, and the plugin architecture that all other `@coopah/bentley-*` packages build on.\n\n## Install\n\n```bash\npnpm add @coopah/bentley-core\n```\n\nYou'll also want at least one LLM provider:\n\n- [`@coopah/bentley-provider-openai`](https://www.npmjs.com/package/@coopah/bentley-provider-openai)\n- [`@coopah/bentley-provider-anthropic`](https://www.npmjs.com/package/@coopah/bentley-provider-anthropic)\n- [`@coopah/bentley-provider-ollama`](https://www.npmjs.com/package/@coopah/bentley-provider-ollama)\n- [`@coopah/bentley-provider-copilot`](https://www.npmjs.com/package/@coopah/bentley-provider-copilot)\n\n## Usage\n\n```ts\nimport { createBentley } from \"@coopah/bentley-core\";\nimport { bentleyOpenAIPlugin } from \"@coopah/bentley-provider-openai\";\n\nconst bentley = createBentley({\n  plugins: [bentleyOpenAIPlugin()],\n  shellsPath: \"./shells\",\n});\n\n// One-shot invocation\nconst result = await bentley.invoke(\"my-shell\", {\n  input: \"Summarise this document\",\n  threadId: \"thread-1\",\n});\n\n// Streaming invocation\nfor await (const chunk of bentley.invokeStream(\"my-shell\", { input: \"Hello\" })) {\n  if (chunk.type === \"token\") process.stdout.write(chunk.content ?? \"\");\n  if (chunk.type === \"tool_start\") console.log(`Calling ${chunk.toolName}...`);\n}\n```\n\n## Key Concepts\n\n**Shells** — A running agent instance backed by a workspace directory containing `SOUL.md` (identity/system prompt), `MEMORY.md` (persistent facts), `HEARTBEAT.md` (recurring tasks), and `history/*.jsonl` (conversation logs).\n\n**ReAct Loop** — Streaming `AsyncGenerator<ShellChunk>` that interleaves LLM reasoning with tool execution. Chunk types: `token`, `tool_start`, `tool_end`, `done`, `error`, `react:iteration`.\n\n**Skills** — Markdown files with YAML frontmatter (`name`, `description`, `version`) that teach agents new capabilities at runtime.\n\n**Plugins** — The extension point for registering LLM providers, tools, MCP servers, skills, shell presets, evaluators, and channel adapters via `BentleyPluginContext`.\n\n## Shell Examples\n\n### Registering a shell via a plugin\n\nShells are registered as **presets** inside a plugin's `register()` method:\n\n```ts\nimport type { BentleyPlugin } from \"@coopah/bentley-core\";\n\nexport const myPlugin: BentleyPlugin = {\n  id: \"my-plugin\",\n  version: \"1.0.0\",\n\n  register(ctx) {\n    // A simple Q&A assistant\n    ctx.registerShellPreset({\n      id: \"qa-assistant\",\n      model: \"openai/gpt-4o\",\n      tools: [\"memory_write\", \"memory_read\"],\n      maxIterations: 5,\n      memory: {\n        strategy: \"sliding_window\",\n        maxMessages: 30,\n      },\n    });\n\n    // A research agent with skills, MCP servers, and cognitive features\n    ctx.registerShellPreset({\n      id: \"researcher\",\n      model: \"anthropic/claude-sonnet-4-20250514\",\n      tools: [\"memory_write\", \"memory_read\", \"web_search\"],\n      skills: [\"deep-research\", \"citation-style\"],\n      mcpServers: [\"notion\"],\n      maxIterations: 20,\n      memory: {\n        strategy: \"token_budget\",\n        maxTokens: 32_000,\n      },\n      cognitive: {\n        enabled: true,\n        innerMonologue: true,\n        planning: true,\n        reflection: true,\n        episodicMemory: true,\n      },\n      scopes: [\n        { type: \"notion_database\", label: \"Research Notes\", target: \"abc-123\" },\n      ],\n    });\n\n    // A proactive ops agent with heartbeat and channel routing\n    ctx.registerShellPreset({\n      id: \"ops-bot\",\n      model: \"openai/gpt-4o-mini\",\n      tools: [\"memory_write\", \"exec\"],\n      maxIterations: 10,\n      heartbeat: {\n        enabled: true,\n        intervalMs: 15 * 60 * 1000, // every 15 minutes\n        activeHours: { start: 8, end: 22 },\n        suppressIfOk: true,\n      },\n      channels: {\n        slack: { channel: \"ops-alerts\" },\n        webchat: true,\n      },\n    });\n  },\n};\n```\n\n### Workspace directory structure\n\nEach shell stores its identity and memory as plain files under `shellsPath`:\n\n```\nshells/\n  qa-assistant/\n    SOUL.md           # System prompt / personality\n    MEMORY.md         # Long-term facts (auto-appended)\n    HEARTBEAT.md      # Proactive task checklist (optional)\n    SCRATCHPAD.md     # Cognitive working memory (optional)\n    history/\n      thread-1.jsonl  # Conversation history per thread\n      thread-2.jsonl\n  researcher/\n    SOUL.md\n    MEMORY.md\n    ...\n```\n\n**SOUL.md** — The shell's identity. Written once by you, read every invocation:\n\n```markdown\nYou are a research assistant specializing in AI safety.\nAlways cite your sources. Be precise and thorough.\n```\n\n**MEMORY.md** — Persistent facts appended at runtime via the `memory_write` tool:\n\n```markdown\n- [2026-03-10T09:15:00Z] User prefers APA citation style.\n- [2026-03-10T10:42:00Z] Project deadline is March 28, 2026.\n```\n\n**HEARTBEAT.md** — A checklist the agent runs on a schedule (when `heartbeat.enabled` is `true`):\n\n```markdown\n- [ ] Check if new papers were published on arxiv.org/list/cs.AI\n- [ ] Summarise any Slack threads in #research that mention \"alignment\"\n```\n\n### Invoking shells\n\n```ts\nconst bentley = createBentley({\n  plugins: [myPlugin, bentleyOpenAIPlugin()],\n  shellsPath: \"./shells\",\n});\n\n// One-shot invocation\nconst { output } = await bentley.invoke({\n  shellId: \"qa-assistant\",\n  input: \"What did we discuss last time?\",\n  threadId: \"user-42:chat-1\",\n});\n\n// Streaming with tool events\nfor await (const chunk of bentley.invokeStream({\n  shellId: \"researcher\",\n  input: \"Find recent papers on RLHF and add them to Notion\",\n  threadId: \"user-42:research\",\n})) {\n  switch (chunk.type) {\n    case \"token\":\n      process.stdout.write(chunk.content ?? \"\");\n      break;\n    case \"tool_start\":\n      console.log(`\\n🔧 ${chunk.toolName}...`);\n      break;\n    case \"tool_end\":\n      console.log(`   ✓ ${chunk.toolName} done`);\n      break;\n    case \"error\":\n      console.error(\"Error:\", chunk.error);\n      break;\n  }\n}\n\n// Structured output with a Zod schema\nimport { z } from \"zod\";\n\nconst { parsedOutput } = await bentley.invoke({\n  shellId: \"researcher\",\n  input: \"List the top 3 AI safety labs\",\n  threadId: \"user-42:structured\",\n  outputSchema: z.object({\n    labs: z.array(z.object({\n      name: z.string(),\n      focus: z.string(),\n    })),\n  }),\n});\n// parsedOutput.labs → [{ name: \"Anthropic\", focus: \"...\" }, ...]\n\n// With timeout and abort signal\nconst controller = new AbortController();\n\nconst result = await bentley.invoke({\n  shellId: \"ops-bot\",\n  input: \"Run the health check\",\n  threadId: \"ops:health\",\n  timeoutMs: 30_000,\n  abortSignal: controller.signal,\n});\n```\n\n## API\n\n### Bootstrap\n\n- **`createBentley(options)`** — Wire up DI, registries, plugins; returns a `BentleyInstance`\n- **`BentleyInstance`** — `invoke()`, `invokeStream()`, `startGateway()`, `stopGateway()`\n\n### Agent Runtime\n\n- **`bentleyReactLoop` / `bentleyReactLoopCollect`** — Core ReAct loop (streaming / collected)\n- **`BentleyShellRuntime`** — Shell lifecycle, context resolution, invocation\n- **`MiddlewarePipeline`** — Composable middleware chain for shell execution\n\n### Workspace & Memory\n\n- **`BentleyFileMemory`** — File-based implementation of `BentleyWorkspaceMemory`\n- **`resolveShellPrompt` / `assembleBentleyPrompt`** — System prompt assembly from SOUL + skills + memory\n- **`applyMemoryStrategy` / `scoreMessagesByKeywords`** — Memory reduction strategies\n\n### Workflows\n\n- **`BentleyWorkflowGraph`** — Define multi-agent DAGs with conditional edges\n- **`CompiledBentleyWorkflow`** — Executable compiled graph\n- **`START_NODE` / `END_NODE`** — Graph boundary markers\n\n### Plugin System\n\n- **`BentleyPlugin` / `BentleyPluginContext`** — Plugin interface and registration context\n- **`BentleyPluginManager`** — Plugin lifecycle management\n- **`BentleyToolRegistry`** — Register and resolve tools\n- **`BentleySkillRegistry`** — Load and resolve skill markdown\n- **`BentleyMcpRegistry`** — MCP server connection management\n\n### LLM\n\n- **`BentleyProviderRegistry`** — Multi-provider model resolution\n- **`withRetry` / `withFallback`** — Model middleware for resilience\n\n### Built-in Middleware\n\n- **`bentleyCostTrackingMiddleware`** — Track token usage and cost\n- **`bentleyRateLimitMiddleware`** — Per-shell rate limiting\n- **`bentleyGuardrailMiddleware`** — Content safety guardrails\n- **`bentleyMemoryExtractionMiddleware`** — Auto-extract facts to MEMORY.md\n\n### Infrastructure\n\n- **`BentleyContainer` / `createToken` / `TOKENS`** — Lightweight DI container\n- **`createEventBus`** — Typed event bus (mitt-based)\n- **`BentleyHeartbeatRunner`** — Cron-like recurring task execution\n\n## Related Packages\n\n| Package | Role |\n|---------|------|\n| [`@coopah/bentley-server`](https://www.npmjs.com/package/@coopah/bentley-server) | HTTP/SSE server (Hono) |\n| [`@coopah/bentley-gateway`](https://www.npmjs.com/package/@coopah/bentley-gateway) | Multi-channel router (WhatsApp, Slack, Telegram, etc.) |\n| [`@coopah/bentley-react`](https://www.npmjs.com/package/@coopah/bentley-react) | React hooks & SSE client |\n| [`@coopah/bentley-langfuse`](https://www.npmjs.com/package/@coopah/bentley-langfuse) | LangFuse observability via OpenTelemetry |\n| [`@coopah/bentley-store-sqlite`](https://www.npmjs.com/package/@coopah/bentley-store-sqlite) | SQLite storage backend |\n| [`@coopah/bentley-store-postgres`](https://www.npmjs.com/package/@coopah/bentley-store-postgres) | PostgreSQL + pgvector storage backend |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}