{"_id":"@away_from/pi-triple","_rev":"4-e09b99010c16762f12691929460c3174","name":"@away_from/pi-triple","dist-tags":{"latest":"1.1.3"},"versions":{"0.8.0":{"name":"@away_from/pi-triple","version":"0.8.0","_id":"@away_from/pi-triple@0.8.0","maintainers":[{"name":"phenol1145","email":"alexphenol0725@gmail.com"}],"bin":{"ptl":"packages/framework/dist/pit.js"},"dist":{"shasum":"8d6c7149beb610d0e65218e110b6814bc879b011","tarball":"https://registry.npmjs.org/@away_from/pi-triple/-/pi-triple-0.8.0.tgz","fileCount":780,"integrity":"sha512-lvrfvI6iCNAiLzmzHBsx85A9kqmQFcdKeKiyUXOs+WRZAHL31or9C7AM2pDZYfZChxwj1kJNYOQfm1mWAH0lxA==","signatures":[{"sig":"MEUCIQD/gmUg47VBePLp8t0kRTxfhtEOwt+vJ7Yh/Tr2wHSVtwIgWyX/JWfnO2AmpgEE7gH5Lv0jiCEIYPfUqRloi+J0tIY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3175416},"type":"module","engines":{"node":">=22"},"gitHead":"140dc55631822b08a7d2ae285f40c565edb3d621","scripts":{"lint":"tsc --noEmit && tsc -p packages/shared --noEmit && tsc -p packages/framework --noEmit","test":"vitest run","build":"tsc -p packages/shared && tsc -p packages/infra && tsc -p packages/framework && tsc -p packages/mailbox && tsc -p packages/extensions-in-container && tsc -p tsconfig.json","clean":"rm -rf dist packages/shared/dist packages/infra/dist packages/framework/dist packages/mailbox/dist packages/extensions-in-container/dist","monitor":"node tools/docker-monitor/server.js","pth:dev":"tsx watch src/pth/main.ts","ptl:dev":"tsx packages/framework/src/pit.ts","pth:start":"node dist/pth/main.js","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"phenol1145","email":"alexphenol0725@gmail.com"},"workspaces":["packages/*"],"_npmVersion":"11.11.0","description":"<p align=\"center\">   <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\"> </p>","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.22.0","ink":"^5.2.1","zod":"^4.0.0","react":"^18.3.1","bullmq":"^5.0.0","fastify":"^5.0.0","ioredis":"^5.4.0","chokidar":"^4.0.0","prom-client":"^15.0.0","string-width":"^7.2.0","@away_from/infra":"^0.8.0","@away_from/shared":"^0.8.0","@sinclair/typebox":"^0.34.52","@fastify/websocket":"^11.0.0","@earendil-works/pi-ai":"^0.82.1","@earendil-works/pi-coding-agent":"^0.82.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/react":"^18.3.31","testcontainers":"^12.1.0","ink-testing-library":"^4.0.0","@testcontainers/postgresql":"^12.1.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-triple_0.8.0_1786373273439_0.6985829647368376","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@away_from/pi-triple","version":"0.10.0","_id":"@away_from/pi-triple@0.10.0","maintainers":[{"name":"phenol1145","email":"alexphenol0725@gmail.com"}],"bin":{"ptl":"packages/framework/dist/pit.js"},"dist":{"shasum":"a0f7a2e80e80757420bca4dd5ecf3cf57e190595","tarball":"https://registry.npmjs.org/@away_from/pi-triple/-/pi-triple-0.10.0.tgz","fileCount":822,"integrity":"sha512-nBBQjFr2IsUiJgSaVQ6/d2eUJMkYt6bGqSTal0rsKYVUbVZWNvA09QWiZZr9xSIYrmBEQw8tX90Q/nL/B2/9Tg==","signatures":[{"sig":"MEYCIQCHtVr3/B5uwb8ff54l/ZjMd28vbE131Wb+BNolVUf+KQIhANDjmRm6HEABVrIbT6mFFvfp9PFAbHnppMDg09ky8muE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3544973},"type":"module","engines":{"node":">=22"},"gitHead":"aad72fdd20daba8427d693da7ac49298beb0a997","scripts":{"lint":"tsc --noEmit && tsc -p packages/shared --noEmit && tsc -p packages/framework --noEmit","test":"vitest run","build":"tsc -p packages/shared && tsc -p packages/infra && tsc -p packages/framework && tsc -p packages/mailbox && tsc -p packages/extensions-in-container && tsc -p tsconfig.json","clean":"rm -rf dist packages/shared/dist packages/infra/dist packages/framework/dist packages/mailbox/dist packages/extensions-in-container/dist","monitor":"node tools/docker-monitor/server.js","pth:dev":"tsx watch src/pth/main.ts","ptl:dev":"tsx packages/framework/src/pit.ts","pth:start":"node dist/pth/main.js","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"phenol1145","email":"alexphenol0725@gmail.com"},"workspaces":["packages/*"],"_npmVersion":"11.11.0","description":"<p align=\"center\">   <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\"> </p>","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.22.0","ink":"^5.2.1","zod":"^4.0.0","react":"^18.3.1","bullmq":"^5.0.0","fastify":"^5.0.0","ioredis":"^5.4.0","chokidar":"^4.0.0","prom-client":"^15.0.0","string-width":"^7.2.0","@away_from/infra":"^0.10.0","@away_from/shared":"^0.10.0","@sinclair/typebox":"^0.34.52","@fastify/websocket":"^11.0.0","@earendil-works/pi-ai":"^0.82.1","@earendil-works/pi-coding-agent":"^0.82.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/react":"^18.3.31","testcontainers":"^12.1.0","ink-testing-library":"^4.0.0","@vscode/debugprotocol":"^1.68.0","@testcontainers/postgresql":"^12.1.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-triple_0.10.0_1786517309693_0.6939162789048441","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@away_from/pi-triple","version":"1.0.0","_id":"@away_from/pi-triple@1.0.0","maintainers":[{"name":"phenol1145","email":"alexphenol0725@gmail.com"}],"bin":{"ptl":"packages/framework/dist/pit.js"},"dist":{"shasum":"dbffd3581861db028ed47b4d3eb026da1e0c41fb","tarball":"https://registry.npmjs.org/@away_from/pi-triple/-/pi-triple-1.0.0.tgz","fileCount":879,"integrity":"sha512-9BH8IxU1AJZVhOo2hLkKJe1lWLz8OZC0k6IxurQC3YPkqCcfrO4iTVfCBFlgjCKKTonUb4AFKPVRclc8PZKfrA==","signatures":[{"sig":"MEUCIQCWg96QqelzpKxbARK6sOuZGSGQI6bY0aYWoSYIROYeEwIgCSRzZRTUUUNprdZdoQ2/ErHeZx0C+FVlwMHEeard8XI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3953653},"type":"module","engines":{"node":">=22"},"gitHead":"db8cde42f8a0e48b563eaf6c1b21209d2f71000e","scripts":{"pth":"tsx scripts/pth-cli.ts","lint":"tsc --noEmit && tsc -p packages/shared --noEmit && tsc -p packages/framework --noEmit","test":"vitest run","build":"tsc -p packages/shared && tsc -p packages/infra && tsc -p packages/framework && tsc -p packages/mailbox && tsc -p packages/extensions-in-container && tsc -p tsconfig.json","clean":"rm -rf dist packages/shared/dist packages/infra/dist packages/framework/dist packages/mailbox/dist packages/extensions-in-container/dist","monitor":"node tools/docker-monitor/server.js","pth:dev":"tsx watch src/pth/main.ts","ptl:dev":"tsx packages/framework/src/pit.ts","ext:check":"tsx scripts/ext-check.ts","pth:start":"node dist/pth/main.js","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"phenol1145","email":"alexphenol0725@gmail.com"},"workspaces":["packages/*"],"_npmVersion":"11.11.0","description":"<p align=\"center\">   <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\"> </p>","directories":{},"_nodeVersion":"24.14.1","dependencies":{"pg":"^8.22.0","ink":"^5.2.1","zod":"^4.0.0","react":"^18.3.1","bullmq":"^5.0.0","fastify":"^5.0.0","ioredis":"^5.4.0","chokidar":"^4.0.0","prom-client":"^15.0.0","string-width":"^7.2.0","@away_from/infra":"^1.0.0","@away_from/shared":"^1.0.0","@sinclair/typebox":"^0.34.52","@fastify/websocket":"^11.0.0","@earendil-works/pi-ai":"^0.82.1","@earendil-works/pi-coding-agent":"^0.82.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.0.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/react":"^18.3.31","testcontainers":"^12.1.0","@away_from/mailbox":"^1.0.0","ink-testing-library":"^4.0.0","@testcontainers/postgresql":"^12.1.0","@away_from/extensions-in-container":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pi-triple_1.0.0_1786639005819_0.8803354171698499","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@away_from/pi-triple","version":"1.1.3","type":"module","workspaces":["packages/*"],"bin":{"ptl":"packages/framework/dist/pit.js"},"engines":{"node":">=22"},"scripts":{"prepublishOnly":"npm run build","clean":"rm -rf dist packages/shared/dist packages/infra/dist packages/framework/dist packages/mailbox/dist packages/dev-container/dist packages/pth-memory/dist packages/pth-sandbox/dist","build":"tsc -p packages/shared && tsc -p packages/infra && tsc -p packages/pth-memory && tsc -p packages/pth-sandbox && tsc -p packages/framework && tsc -p packages/mailbox && tsc -p packages/dev-container && tsc -p tsconfig.json","pth:dev":"tsx watch src/pth/main.ts","pth:start":"node dist/pth/main.js","adjudicate":"node --experimental-strip-types scripts/adjudicate-tensions.ts","test":"vitest run","test:watch":"vitest","verify:sandbox-build":"bash scripts/verify-clean-sandbox-build.sh","lint":"tsc -p packages/shared && tsc -p packages/infra && tsc -p packages/pth-memory && tsc -p packages/pth-sandbox && tsc --noEmit && tsc -p packages/shared --noEmit && tsc -p packages/framework --noEmit && npm run check:pth-boundaries && npm run check:pth-config","monitor":"node tools/docker-monitor/server.js","ptl:dev":"tsx packages/framework/src/pit.ts","ext:check":"tsx scripts/ext-check.ts","check:pth-boundaries":"tsx scripts/check-pth-boundaries.ts","check:pth-config":"tsx scripts/check-pth-config.ts","pth":"tsx scripts/pth-cli.ts"},"dependencies":{"@away_from/infra":"^1.1.3","@away_from/pth-memory":"^1.1.3","@away_from/pth-sandbox":"^1.1.3","@away_from/shared":"^1.1.3","@earendil-works/pi-ai":"^0.82.1","@earendil-works/pi-coding-agent":"^0.82.1","@fastify/websocket":"^11.0.0","@sinclair/typebox":"^0.34.52","bullmq":"^5.0.0","chokidar":"^4.0.0","fastify":"^5.0.0","ink":"^5.2.1","ioredis":"^5.4.0","pg":"^8.22.0","prom-client":"^15.0.0","react":"^18.3.1","string-width":"^7.2.0","zod":"^4.0.0"},"devDependencies":{"@away_from/dev-container":"^1.1.3","@away_from/mailbox":"^1.1.3","@testcontainers/postgresql":"^12.1.0","@types/node":"^22.0.0","@types/pg":"^8.21.0","@types/react":"^18.3.31","ink-testing-library":"^4.0.0","testcontainers":"^12.1.0","tsx":"^4.0.0","typescript":"^5.7.0","vitest":"^3.0.0"},"gitHead":"015dab6f1d2e1f2d94bcfebd49b49d57b905565a","_id":"@away_from/pi-triple@1.1.3","description":"<p align=\"center\">   <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\"> </p>","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-HsRs2QKmgXI2VaC/NxAxi5oSfJ/5M/20MUfLpKTW45/tssiYkppLqkRvpuEk6wRZNRKW7+gR/ZFkVFCIEzMfFw==","shasum":"fb9c1cb372b80fd251a332004e509c67f217f761","tarball":"https://registry.npmjs.org/@away_from/pi-triple/-/pi-triple-1.1.3.tgz","fileCount":1101,"unpackedSize":4435092,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCnK5U9k4y0gxai/C237ltlZf3W+ifpKpSnFhn8IQAb2gIhAPLFghdPNPUmZr+QdCnfhVWWOMTnDqpmb62PKN0v0rjR"}]},"_npmUser":{"name":"phenol1145","email":"alexphenol0725@gmail.com"},"directories":{},"maintainers":[{"name":"phenol1145","email":"alexphenol0725@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pi-triple_1.1.3_1786967008799_0.427162410769909"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-10T14:47:53.264Z","modified":"2026-08-17T11:43:29.138Z","0.8.0":"2026-08-10T14:47:53.628Z","0.10.0":"2026-08-12T06:48:29.874Z","1.0.0":"2026-08-13T16:36:46.015Z","1.1.3":"2026-08-17T11:43:29.001Z"},"description":"<p align=\"center\">   <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\"> </p>","maintainers":[{"name":"phenol1145","email":"alexphenol0725@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"docs/images/pi-triple-banner.svg\" alt=\"Pi-Triple\" width=\"320\">\n</p>\n\n<p align=\"center\">\n  <a href=\"https://img.shields.io/badge/version-1.1.3-blue\"><img alt=\"version\" src=\"https://img.shields.io/badge/version-1.1.3-blue?style=flat-square\" /></a>\n  <a href=\"https://img.shields.io/badge/tests-1988%20passed-green\"><img alt=\"tests\" src=\"https://img.shields.io/badge/tests-1988%20passed-green?style=flat-square\" /></a>\n  <a href=\"https://img.shields.io/badge/node-%3E%3D22-green\"><img alt=\"node\" src=\"https://img.shields.io/badge/node-%3E%3D22-green?style=flat-square\" /></a>\n  <a href=\"https://img.shields.io/badge/typescript-5.7-blue\"><img alt=\"ts\" src=\"https://img.shields.io/badge/typescript-5.7-blue?style=flat-square\" /></a>\n  <a href=\"https://img.shields.io/badge/license-MIT-green\"><img alt=\"license\" src=\"https://img.shields.io/badge/license-MIT-green?style=flat-square\" /></a>\n</p>\n\n<p align=\"center\">\n  <strong>基于 <a href=\"https://www.npmjs.com/package/@earendil-works/pi-coding-agent\">pi SDK</a> 的两个独立产品——多环境共存平台（PTL）+ 自耦自然语言解释器（PTH）。PTL 可通过 PTH CLI 调用 PTH。</strong>\n</p>\n\n<p align=\"center\">\n  <a href=\"docs/README.md\">📖 文档中心</a>\n  ·\n  <a href=\"#-quick-start\">🚀 Quick Start</a>\n  ·\n  <a href=\"ARCHITECTURE.md\">🏗️ 架构</a>\n  ·\n  <a href=\"#-roadmap\">🗺️ Roadmap</a>\n  ·\n  <a href=\"docs/pth/kernel.md\">⚙️ PTH Kernel</a>\n  ·\n  <a href=\"#-license\">📄 License</a>\n</p>\n\n---\n\n## What is Pi-Triple?\n\nPi-Triple 是跑在 pi SDK 之上的两个独立产品：**PTL** 是基于 pi 的多环境共存平台（CLI + TUI + tmux），**PTH** 是自耦自然语言解释器（解释即执行）。二者不存在前后端关系，PTL 可通过 PTH CLI 调用 PTH。\n\n| | PTL（Pi-Triple-Lite） | PTH（Pi-Triple-Heavy） |\n|---|----------------------|------------------------|\n| **定位** | 基于 pi 的多环境共存平台 | 自耦自然语言解释器（解释即执行） |\n| **入口** | `ptl` CLI | `pth` CLI（`pth submit/status/wait`） |\n| **运行时** | pi 进程 × tmux | AgentEngine + Redis + BullMQ + PostgreSQL |\n| **适用** | 多 pi 环境并行共存 · 交互式调试 | 自然语言解释执行 · CLI/程序化调用 |\n| **源码** | `packages/framework/` | `src/pth/` |\n| **文档** | [PTL 架构](./docs/ptl/architecture.md) | [PTH 架构](./docs/pth/architecture.md) · [Kernel 体系](./docs/pth/kernel.md) |\n\n```text\nPTL（多环境共存平台）        PTH（自耦自然语言解释器）\n─────────────────          ──────────────────────────────\nptl tui/CLI            →     pth CLI（submit/status/wait）\nptl tui dashboard      →     Gateway（HTTP/SSE 兼容通道）\n（旧 ptl hub HTTP 桥兼容）→     AgentEngine\n                          →     Kernel 任务内核（解释即执行的内部机制）\n```\n\n> 🔧 **SDK 兼容性**：所有 pi SDK 调用通过 `packages/infra/src/sdk-adapter/` 适配层隔离，升级 SDK 只改适配层。当前适配 `@earendil-works/pi-coding-agent@^0.82.1`。\n\n---\n\n## ✨ Quick Start\n\n### PTL：30 秒上手\n\n```bash\n# 前置：Node >= 22，至少配置一个 LLM API key（ptl onboard 会检查）\ngit clone https://github.com/Phenol1145/pi-triple.git && cd pi-triple\nnpm install && npm run build && npm link   # ★ 必须先 build：ptl bin 跑 packages/framework/dist/\n\nptl onboard          # 环境导引（检查 + 初始化配置/模板/共享扩展）\nptl template new dev # 新建一个工作模板（默认模板别名 local 已存在）\nptl start            # tmux 会话，立即接入\nptl tui dashboard    # 系统总控 TUI\n```\n\n### PTH：自然语言解释器试运行\n\n```bash\n# 先构建 dist（见上方 Quick Start 或 Development 节），再启动\n# 独立 postgres/redis 见 docs/pth/deployment.md\nDATABASE_URL=... REDIS_URL=... PORT=33100 node dist/pth/main.js\n\n# 发布任务 + 启动 worker\ncurl -X POST http://localhost:33100/api/v1/kernel/tasks \\\n  -d '{\"title\":\"demo\",\"text\":\"return {sum:[1,2,3].reduce((a,b)=>a+b)}\",\"createdBy\":\"demo\",\"tags\":[\"demo\"]}' \\\n  -H \"Authorization: Bearer <token>\"\nptl hub kernel batch add 2     # 启动 2 个 worker\n\n# 可观测\ncurl http://localhost:33100/metrics   # Prometheus 四层指标\n```\n\n---\n\n## What Pi-Triple can do\n\n### PTL\n\n- **双 Ink TUI**：`ptl tui dashboard` 系统总控 / `ptl tui lab` 模型调试（遥测 SQLite）\n- **tmux 多会话管理**：`ptl start --bg --name coding` 后台启动，`attach/switch` 瞬移切换\n- **共享扩展层**：bundled 扩展 symlink 注入各模板，一处更新全局可见\n- **PTL→PTH 桥**：`ptl hub submit/run` — agent 程序打包提交到 PTH 运行\n\n### PTH Kernel（任务内核）\n\n| 能力 | 说明 | 实测 |\n|------|------|------|\n| **多语言持久 REPL** | PyKernel 管道 JSON-RPC / BashKernel 持久 shell / TS VM 沙箱（能力白名单） | Python 执行 **230x**（0.12ms vs spawn 12ms） |\n| **编译核** | C 首发（gcc/clang/tcc 变体）：编译-运行管道 + **持久缓存**（跨调用/跨容器重启——同代码 ~1ms 命中）+ 命名编译单元（c.saveUnit/executeUnit——跨任务复用 + 增量重算） | 缓存恢复端到端验证（cacheHits 3/coldCompiles 0） |\n| **调试核** | gdb MI 全链路（断点/单步/栈/变量/求值——sandbox 端点生产可用）+ 异步停止模型 | 端到端：breakpoint-hit bkptno=1 frame args x=14 → evaluate x+1=15 |\n| **Batch 架构** | **单大 batch 默认**（启动即全量构成——node 基线不重复省 40% 内存）+ **worker 级控制**（pause/resume/remove/add——进程内启停）+ **资源分配策略接口**（balanced/reinforced + 注册表可扩展） | 端到端：remove→pending/add→completed/pause 隔离其他角色 |\n| **自动调度** | descheduler 思想（PTH_AUTOSCALE_MODE=balanced|reinforced——per-role 队列积压自动强化 batch） | reinforced：角色积压超阈值自动 spawn 强化 |\n| **调试协议** | gdb MI 解析器 + CDebugSession（断点/单步/栈/变量/求值）+ 四级回退链（L0 gdb → L2 bash 核 strace/valgrind） | 容器内断点命中契约验证（breakpoint-hit + frame args） |\n| **标准扩展包** | memory/context/model/perf/obs 五成员（ts 核内能力对象）+ 配置中心（env 快照 + 运行时 SET）+ 策略闭环（publish/apply）+ obs IPC 请求通道 | 端到端：LLM 用 obs 调查发现系统 bug 并报告 |\n| **任务池** | 发布（代码形态）→ 认领 → 执行 → submit/reject 闭环，多 worker batch | 语法错误任务按 reject 处理（不误标 completed） |\n| **Kernel Sandbox** | REPL kernel 池落独立容器（internal 网络零出口 + 零业务密钥 + Bearer 认证 + 非 root + 资源限额） | SUM5050=5050 端到端；os.environ 仅共享密钥 |\n| **记忆闭环** | 任务完成 → LLM 提炼 → tool-function 源码+spec / 洞察 双通道持久化 → 状态召回 | fibonacci → refine → fib(20)=6765 跨任务复用 |\n| **任务链** | `payload.flow` 自带路由（transform/decompose/branch/loop/wait/terminal）+ 递归注销 | developer → 自动生成验收任务 → 双 completed |\n| **工具文件通道** | `fs.readText/list`（toolstore）——LLM 自主 import 工具文件 | fact(10)=3628800 端到端 |\n| **监控** | 四层 35+ 指标（L0 基建/L1 kernel/L2 任务/L3 产出）+ `/metrics` + ResourceProvider 跨 OS | cpu/rss/llm tokens/kernel exec/refine 全可查 |\n| **日志** | KernelLogger（JSON 默认，taskId/role/batchPid 链路 ctx，batch IPC 转发） | 全链路下钻 |\n\n### 平台\n\n- **统一 provider 后端**：pit-providers 声明式 JSON + 多 Key failover（401/403 自动切换）\n- **跨会话通信**：mailbox 文件邮箱 + manual/auto/hybrid 审核 + 不可变审计日志\n- **凭据单一出口**：`resolveSdkConfigPaths()`（PTL/PTH 同源，异机/容器不分叉）\n\n---\n\n## 🏗️ Architecture\n\n```text\nPTL                         PTH\n─────                       ──────────────────────────────────\npackages/framework/         src/pth/\n  cli/ 命令模块               gateway/   Fastify + auth + SSE\n  bridge/ PTL→PTH 桥          core/      AgentEngine · SessionPool\n  lab-data/ 遥测 SQLite       programs/  ProgramStore（桥服务端）\n  tui-ptl/ tui-lab/           kernel/    ★★ 任务内核\npackages/shared/                       execution（TaskLoop·Batch·Resolver·Refiner）\n  config · tmux · presence             interpreter（PyKernel·BashKernel·TS VM·toolstore）\npackages/infra/                        storage（PostgreSQL：tasks/memory/transcripts）\n  sdk-adapter · model-router           observability（四层指标 + ResourceProvider）\n  sdk-paths.ts ★ 凭据唯一出口\n```\n\n**扩展生态（5 个 bundled）**：pit-providers · mailbox · pit-control · pth-tasks · extensions-in-container（workflow/agent-lab 已归档至 archive/）\n\n**技术栈**：Node ≥22 · TypeScript 5.7 · pi SDK 0.82 · React+Ink · tmux · Fastify 5 · ioredis+BullMQ · **PostgreSQL** · pino · prom-client · vitest\n\n详见 [ARCHITECTURE.md](./ARCHITECTURE.md)（单一真相源）· [PTH Kernel 体系](./docs/pth/kernel.md) · [API 参考](./docs/pth/api.md) · [部署指南](./docs/pth/deployment.md)\n\n---\n\n## 🧭 Design Philosophy\n\n| 原则 | 说明 |\n|------|------|\n| **pi 是引擎，平台是壳** | 不重写 pi 能力，做外层治理/编排/体验 |\n| **接口先行** | 模块间 JSON 可序列化 DTO + AsyncIterable，不直接依赖内部实现 |\n| **模板隔离** | PTL：独立 pi 进程 + `PI_TEMPLATE`；PTH：Engine 层强制校验 |\n| **错误用判别联合** | `Result<T> = {ok:true, data} \\| {ok:false, error}` |\n| **任务即数据包** | 任务 text 代码形态 + payload 自带路由（flow）——零 eval 零 new Function |\n| **可观测优先** | 日志链路 ctx + 四层指标，从开发期就计量 |\n| **零外部依赖（扩展）** | bundled 扩展只用 `node:` 内置 + 相对导入 |\n\n---\n\n## 🛠️ Development\n\n```bash\nnpm run build && npm link # ★ 先 build：ptl/pth bin 跑 dist/，端到端验证前必须 build\nnpx vitest run           # 1897 tests（232 文件，9 hostile skip）\nnpm run lint             # 类型检查 + 模块边界 + pth-config 门禁\nbash scripts/check-release-clean.sh  # 发行门禁（发布包零用户痕迹）\n```\n\n> ⚠️ `tsc --noEmit` 与 vitest 都不产出/不依赖 dist，会掩盖\"改了 src 未重建\"的问题；CLI 冒烟前务必 `npm run build`。\n\n### 扩展开发\n\n| 想做什么 | 参考 |\n|----------|------|\n| 新建 pi 扩展（bundled） | `extensions/pit-providers/` — provider 注册 |\n| 扩展命令 + 参数补全 | `extensions/pit-control/index.ts` — registerCommand |\n| 跨会话通信 | `extensions/mailbox/` — 文件邮箱 + Delivery 决策 |\n| PTH 任务交互扩展 | `extensions/pth-tasks/` — /pthtask 命令族 |\n| PTH 任务内核扩展 | `src/pth/kernel/` — 见 [Kernel 体系](./docs/pth/kernel.md) |\n| PTL 加 CLI 命令 | `packages/framework/src/cli/` + `pit.ts` |\n| TUI 新页面 | 遵循 [Screen 布局模板](./packages/framework/src/tui-shared/README.md) 5 条规则 |\n\n---\n\n## 📖 Documentation\n\n| 文档 | 内容 |\n|------|------|\n| [docs/README.md](./docs/README.md) | ★ 全部文档索引（specs/plans/runbooks） |\n| [ARCHITECTURE.md](./ARCHITECTURE.md) | 架构总览（单一真相源） |\n| [PTL 架构](./docs/ptl/architecture.md) · [创作指南](./docs/ptl/authoring.md) | PTL 子系统 / 技能扩展放置规范 |\n| [PTH 架构](./docs/pth/architecture.md) · [Kernel 体系](./docs/pth/kernel.md) | PTH 分层 / 任务内核专档 |\n| [PTH API](./docs/pth/api.md) · [部署](./docs/pth/deployment.md) | 端点参考 / 本地+Docker 部署 |\n| [性能计量 SPEC](./docs/superpowers/specs/2026-08-08-pth-perf-metrics-design.md) | 四层 35+ 指标设计 |\n| [多语言 REPL SPEC](./docs/superpowers/specs/2026-08-08-pth-multilang-repl-design.md) | PyKernel/BashKernel 协议与池化规划 |\n\n---\n\n## 🗺️ Roadmap\n\n### ✅ 已完成\n\n- [x] PTL：tmux 多会话管理 + 双 TUI（dashboard/lab）+ PTL→PTH 桥（hub submit + hub kernel）\n- [x] PTL：共享扩展层 + pit-providers 统一 provider 后端 + mailbox 跨会话通信\n- [x] PTL→PTH 桥：`ptl hub submit/run` — agent 程序打包提交到 PTH 运行\n- [x] PTH：多语言持久 REPL（PyKernel 230x / BashKernel / TS VM + KernelManager）\n- [x] PTH：任务池（发布/认领/执行/submit-reject 闭环 + 模板库 + 批量 worker）\n- [x] PTH：记忆闭环（Refine 管线：快照→LLM→tool-function 源码+spec/洞察双通道 + state 召回）\n- [x] PTH：任务链（TaskResolver：payload.flow 自带路由 + 自动验收闭环）\n- [x] PTH：日志体系（KernelLogger + taskId 链路 + batch IPC 转发）\n- [x] PTH：监控设施（四层 35+ 指标 + /metrics + ResourceProvider 跨 OS）\n- [x] 凭据统一：`resolveSdkConfigPaths` 唯一出口（PTL/PTH 同源）\n\n### 🚧 规划\n\n- [ ] PTH：任务池 v2（deps 就绪过滤、自然语言任务支持）\n- [ ] PTH：REPL 进程池化（min(worker, CPU)）\n- [ ] PTH：Windows 平台适配\n- [ ] PTH：Dapr/K8s Phase 2 迁移\n\n---\n\n## 已知限制\n\n- **PTL 无 HTTP API**：面向本地多 pi 环境共存管理；需要程序化调用 PTH 时使用 PTH CLI。\n- **PTH 暂无专属前端**：以 CLI 为规范调用接口（HTTP/SSE 为兼容通道）；专属前端与无容器版本在规划中。\n- **tmux**：Unix-only（Windows 支持规划中）\n- **PTH 进程限制**：BullMQ worker 在主进程（Phase 1 技术债）\n- **mailbox**：单机通信，不支持跨机器\n- **任务 text 兼容双形态**：代码形态直执行，自然语言走 NL 翻译（PTC 程序模式）\n\n---\n\n## 📄 License\n\nMIT\n","readmeFilename":"README.md"}