{"_id":"@can_in_can/limkenion-agent","name":"@can_in_can/limkenion-agent","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@can_in_can/limkenion-agent","version":"1.0.0","description":"最小 agent 内核：主循环与系统工具","publishConfig":{"access":"public"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"tsgo -p tsconfig.build.json","test":"vitest --run","prepublishOnly":"npm run clean && npm run build"},"dependencies":{"@can_in_can/limkenion-ai":"^1.0.0"},"keywords":["ai","agent","llm","tools"],"author":{"name":"IamCanincan"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/IamCanincan/Limkenion-Agent.git","directory":"packages/agent"},"engines":{"node":">=22.19.0"},"devDependencies":{"@types/node":"22.19.19","typescript":"5.9.3","vitest":"4.1.9"},"gitHead":"67bd5fbf374e626b23fd1a12bcec7833ec6baef5","_id":"@can_in_can/limkenion-agent@1.0.0","bugs":{"url":"https://github.com/IamCanincan/Limkenion-Agent/issues"},"homepage":"https://github.com/IamCanincan/Limkenion-Agent#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-1+xkWSMaM6yiv4Jfel3wNaDMliuRk/atJsXgime6gmhYTf3U5HwoWK34mWLqKBTuZzj6+WYtSuXQrM5DupUqWg==","shasum":"673c7ebb22b6d3bb9ac6c6f2660e28773844ac2a","tarball":"https://registry.npmjs.org/@can_in_can/limkenion-agent/-/limkenion-agent-1.0.0.tgz","fileCount":51,"unpackedSize":198469,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDyM6SRgIrjOd42Kh6IAMicLoex+xWmVkEvlzCfLFpnkgIgOHl4cZuDzylcJnSThrDCSED0L0txIfZRYgMMkf4c1CI="}]},"_npmUser":{"name":"can_in_can","email":"2065384887@qq.com"},"directories":{},"maintainers":[{"name":"can_in_can","email":"2065384887@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/limkenion-agent_1.0.0_1789144242420_0.49963818590835696"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-11T16:30:42.228Z","1.0.0":"2026-09-11T16:30:42.608Z","modified":"2026-09-11T16:30:42.822Z"},"maintainers":[{"name":"can_in_can","email":"2065384887@qq.com"}],"description":"最小 agent 内核：主循环与系统工具","homepage":"https://github.com/IamCanincan/Limkenion-Agent#readme","keywords":["ai","agent","llm","tools"],"repository":{"type":"git","url":"git+https://github.com/IamCanincan/Limkenion-Agent.git","directory":"packages/agent"},"author":{"name":"IamCanincan"},"bugs":{"url":"https://github.com/IamCanincan/Limkenion-Agent/issues"},"license":"MIT","readme":"# @can_in_can/limkenion-agent\n\n最小 agent 内核：一个主循环加四个系统工具。\n\n## 安装\n\n```bash\nnpm install @can_in_can/limkenion-agent\n```\n\n## 使用\n\n```ts\nimport { Agent, createSystemTools, readApiKey } from \"@can_in_can/limkenion-agent\";\n\nconst agent = new Agent({\n\tapiKey: readApiKey(),\n\tmodelId: \"deepseek-flash\",\n\tcwd: process.cwd(),\n\ttools: createSystemTools({ cwd: process.cwd() }),\n\tonEvent(event) {\n\t\tif (event.type === \"text\") process.stdout.write(event.delta);\n\t\tif (event.type === \"tool_start\") console.log(`\\n[${event.name}]`);\n\t},\n});\n\nawait agent.prompt(\"把 README 里的错别字改掉\");\n```\n\n## 项目说明自动注入\n\n工作目录及其上级目录里的 `AGENTS.md` 会被自动读出来，注入系统提示词：\n\n```ts\nconst agent = new Agent({\n\tapiKey: readApiKey(),\n\tcwd: process.cwd(),\n\ttools: createSystemTools({ cwd: process.cwd() }),\n\t// 不传就自动发现；传 [] 表示明确不要注入；传具体内容则完全由你决定\n\tinstructions: undefined,\n\t// 全局说明目录，它的 AGENTS.md 作为跨项目的个人偏好\n\tglobalConfigDir: \"~/.limkenion/agent\",\n});\n```\n\n发现规则与 opencode 一致：项目侧按 `AGENTS.md` → `CLAUDE.md` → `CONTEXT.md` 的顺序尝试，\n**第一个有命中的文件名胜出**，且该名字沿路径向上的**所有**命中都会注入（近的在前）。\n向上查找不越过 git 仓库根。单文件上限 32KB、合计 64KB，超出截断并标注。\n\n`discoverInstructions()` 与 `buildSystemPrompt()` 也单独导出，便于自己控制注入时机。\n每轮提问前会重新发现一次，所以编辑 `AGENTS.md` 后接着问就生效；内容没变时不会改动\n系统消息，以免作废服务端的前缀缓存。\n\n系统提示词里还带一段环境信息（工作目录、是否 git 仓库、平台、今天日期）。\n\n## 内核做什么，不做什么\n\n`Agent` 只负责一件事：把用户输入变成「调用模型 → 执行工具 → 回灌结果」的循环，直到模型\n不再要求调用工具。\n\n明确不做的部分：\n\n- **不做权限系统**：工具以进程权限直接执行，是否安全由使用场景决定（容器或沙箱隔离）。\n- **不做会话持久化**：历史就在 `agent.messages` 里，落盘由调用方决定。\n- **不做重试**：网络抖动直接以 `error` 事件上报，避免掩盖问题。\n- **不做扩展机制**：需要新工具就直接实现 `AgentTool` 并传进 `tools`。\n- **不做上下文压缩**：超出窗口时由调用方裁剪 `agent.messages`。\n\n## 系统工具\n\n| 工具 | 作用 | 主要限制 |\n|------|------|----------|\n| `bash` | 执行 shell 命令 | 默认 120 秒超时，输出超 50KB 截断并终止进程 |\n| `read` | 读取文本文件 | 单次最多 2000 行或 50KB，超出需用 `offset` 续读 |\n| `write` | 新建或整体覆盖文件 | 自动建父目录；只适合新文件与整体重写 |\n| `edit` | 精确文本替换 | 每段 `oldText` 必须在文件中唯一且互不重叠 |\n\n工具通过 `AgentTool` 接口扩展：\n\n```ts\nimport type { AgentTool } from \"@can_in_can/limkenion-agent\";\n\nconst tool: AgentTool = {\n\tname: \"now\",\n\tdescription: \"返回当前时间\",\n\tparameters: { type: \"object\", properties: {} },\n\tasync execute() {\n\t\treturn { content: new Date().toISOString(), isError: false };\n\t},\n};\n```\n\n## 事件\n\n```ts\ntype AgentEvent =\n\t| { type: \"reasoning\"; delta: string }\n\t| { type: \"text\"; delta: string }\n\t| { type: \"tool_start\"; name: string; input: Record<string, unknown> }\n\t| { type: \"tool_end\"; name: string; outcome: ToolOutcome }\n\t| { type: \"done\"; turns: number; usage: Usage | null }\n\t| { type: \"error\"; message: string };\n```\n\n`prompt()` 只会在正常跑完时发出 `done`；接口出错或超过 `maxTurns`（默认 25）会发出\n`error`，并且不会在历史里留下残缺的助理消息，因此修好问题后可以继续用同一个 `Agent`。\n\n## 许可证\n\nMIT\n","readmeFilename":"README.md","_rev":"1-8d7594e866c682493ab102ae7b1c404e"}