diff --git a/AGENTS.md b/AGENTS.md
index cf7efd41..bb21cf7c 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -43,7 +43,7 @@
When creating issues:
- Add `pkg:*` labels to indicate which package(s) the issue affects
- - Available labels: `pkg:agent`, `pkg:ai`, `pkg:coding-agent`, `pkg:mom`, `pkg:pods`, `pkg:tui`, `pkg:web-ui`
+ - Available labels: `pkg:agent`, `pkg:ai`, `pkg:coding-agent`, `pkg:tui`, `pkg:web-ui`
- If an issue spans multiple packages, add all relevant labels
When posting issue/PR comments:
diff --git a/README.md b/README.md
index df05f3ed..327882d8 100644
--- a/README.md
+++ b/README.md
@@ -25,7 +25,7 @@
> **Looking for the pi coding agent?** See **[packages/coding-agent](packages/coding-agent)** for installation and usage.
-Tools for building AI agents and managing LLM deployments.
+Tools for building AI agents.
## Share your OSS coding agent sessions
@@ -50,10 +50,12 @@ I regularly publish my own `pi-mono` work sessions here:
| **[@mariozechner/pi-ai](packages/ai)** | Unified multi-provider LLM API (OpenAI, Anthropic, Google, etc.) |
| **[@mariozechner/pi-agent-core](packages/agent)** | Agent runtime with tool calling and state management |
| **[@mariozechner/pi-coding-agent](packages/coding-agent)** | Interactive coding agent CLI |
-| **[@mariozechner/pi-mom](packages/mom)** | Slack bot that delegates messages to the pi coding agent |
| **[@mariozechner/pi-tui](packages/tui)** | Terminal UI library with differential rendering |
| **[@mariozechner/pi-web-ui](packages/web-ui)** | Web components for AI chat interfaces |
-| **[@mariozechner/pi-pods](packages/pods)** | CLI for managing vLLM deployments on GPU pods |
+
+## Chat bot workflows
+
+For Slack/chat automation, see [earendil-works/pi-chat](https://github.com/earendil-works/pi-chat).
## Contributing
diff --git a/package-lock.json b/package-lock.json
index c7acde2d..359f8534 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,35 +34,6 @@
"node": ">=20.0.0"
}
},
- "node_modules/@anthropic-ai/sandbox-runtime": {
- "version": "0.0.16",
- "resolved": "https://registry.npmjs.org/@anthropic-ai/sandbox-runtime/-/sandbox-runtime-0.0.16.tgz",
- "integrity": "sha512-I2Us7dRvwCJkqcImrqP7NWrV5kHmKX7AumFDnznCjMd0hB5ZUzg9Is9SlxrMzHiUY2RndEaRLXCOJrUt8JnE4w==",
- "license": "Apache-2.0",
- "dependencies": {
- "@pondwader/socks5-server": "^1.0.10",
- "@types/lodash-es": "^4.17.12",
- "commander": "^12.1.0",
- "lodash-es": "^4.17.21",
- "shell-quote": "^1.8.3",
- "zod": "^3.24.1"
- },
- "bin": {
- "srt": "dist/cli.js"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@anthropic-ai/sandbox-runtime/node_modules/zod": {
- "version": "3.25.76",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
- "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- },
"node_modules/@anthropic-ai/sdk": {
"version": "0.91.1",
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.91.1.tgz",
@@ -1809,10 +1780,6 @@
"node": ">= 20"
}
},
- "node_modules/@mariozechner/pi": {
- "resolved": "packages/pods",
- "link": true
- },
"node_modules/@mariozechner/pi-agent-core": {
"resolved": "packages/agent",
"link": true
@@ -1825,10 +1792,6 @@
"resolved": "packages/coding-agent",
"link": true
},
- "node_modules/@mariozechner/pi-mom": {
- "resolved": "packages/mom",
- "link": true
- },
"node_modules/@mariozechner/pi-tui": {
"resolved": "packages/tui",
"link": true
@@ -2470,12 +2433,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@pondwader/socks5-server": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/@pondwader/socks5-server/-/socks5-server-1.0.10.tgz",
- "integrity": "sha512-bQY06wzzR8D2+vVCUoBsr5QS2U6UgPUQRmErNwtsuI6vLcyRKkafjkr3KxbtGFf9aBBIV2mcvlsKD1UYaIV+sg==",
- "license": "MIT"
- },
"node_modules/@preact/signals-core": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.14.1.tgz",
@@ -2881,71 +2838,6 @@
"integrity": "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==",
"license": "Apache-2.0"
},
- "node_modules/@slack/logger": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.1.tgz",
- "integrity": "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==",
- "license": "MIT",
- "dependencies": {
- "@types/node": ">=18"
- },
- "engines": {
- "node": ">= 18",
- "npm": ">= 8.6.0"
- }
- },
- "node_modules/@slack/socket-mode": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-2.0.6.tgz",
- "integrity": "sha512-Aj5RO3MoYVJ+b2tUjHUXuA3tiIaCUMOf1Ss5tPiz29XYVUi6qNac2A8ulcU1pUPERpXVHTmT1XW6HzQIO74daQ==",
- "license": "MIT",
- "dependencies": {
- "@slack/logger": "^4.0.1",
- "@slack/web-api": "^7.15.0",
- "@types/node": ">=18",
- "@types/ws": "^8",
- "eventemitter3": "^5",
- "ws": "^8"
- },
- "engines": {
- "node": ">= 18",
- "npm": ">= 8.6.0"
- }
- },
- "node_modules/@slack/types": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.20.1.tgz",
- "integrity": "sha512-eWX2mdt1ktpn8+40iiMc404uGrih+2fxiky3zBcPjtXKj6HLRdYlmhrPkJi7JTJm8dpXR6BWVWEDBXtaWMKD6A==",
- "license": "MIT",
- "engines": {
- "node": ">= 12.13.0",
- "npm": ">= 6.12.0"
- }
- },
- "node_modules/@slack/web-api": {
- "version": "7.15.1",
- "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.15.1.tgz",
- "integrity": "sha512-y+TAF7TszcmFzbVtBkFqAdBwKSoD+8shkNxhp4WIfFwXmCKdFje9WD6evROApPa2FTy1v1uc9yBaJs3609PPgg==",
- "license": "MIT",
- "dependencies": {
- "@slack/logger": "^4.0.1",
- "@slack/types": "^2.20.1",
- "@types/node": ">=18",
- "@types/retry": "0.12.0",
- "axios": "^1.15.0",
- "eventemitter3": "^5.0.1",
- "form-data": "^4.0.4",
- "is-electron": "2.2.2",
- "is-stream": "^2",
- "p-queue": "^6",
- "p-retry": "^4",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">= 18",
- "npm": ">= 8.6.0"
- }
- },
"node_modules/@smithy/config-resolver": {
"version": "4.4.17",
"resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.17.tgz",
@@ -3927,21 +3819,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/lodash": {
- "version": "4.17.24",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
- "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
- "license": "MIT"
- },
- "node_modules/@types/lodash-es": {
- "version": "4.17.12",
- "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
- "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
- "license": "MIT",
- "dependencies": {
- "@types/lodash": "*"
- }
- },
"node_modules/@types/mime-types": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz",
@@ -3986,15 +3863,6 @@
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT"
},
- "node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/yauzl": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
@@ -4330,23 +4198,6 @@
"node": ">=4"
}
},
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "license": "MIT"
- },
- "node_modules/axios": {
- "version": "1.15.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz",
- "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.11",
- "form-data": "^4.0.5",
- "proxy-from-env": "^2.1.0"
- }
- },
"node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
@@ -4487,19 +4338,6 @@
"node": ">=8"
}
},
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/canvas": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz",
@@ -4681,27 +4519,6 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "license": "MIT",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/concurrently": {
"version": "9.2.1",
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz",
@@ -4830,15 +4647,6 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"license": "MIT"
},
- "node_modules/croner": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/croner/-/croner-9.1.0.tgz",
- "integrity": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==",
- "license": "MIT",
- "engines": {
- "node": ">=18.0"
- }
- },
"node_modules/cross-spawn": {
"version": "6.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
@@ -4942,15 +4750,6 @@
"node": ">= 14"
}
},
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -4978,20 +4777,6 @@
"jszip": ">=3.0.0"
}
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/ecdsa-sig-formatter": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
@@ -5029,19 +4814,11 @@
"node": ">=10.13.0"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -5054,33 +4831,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/esbuild": {
"version": "0.27.7",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
@@ -5193,12 +4943,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/eventemitter3": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
- "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
- "license": "MIT"
- },
"node_modules/execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
@@ -5413,42 +5157,6 @@
"node": ">=8"
}
},
- "node_modules/follow-redirects": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
- "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
- "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -5486,6 +5194,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5540,43 +5249,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
- "license": "MIT",
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "license": "MIT",
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -5691,18 +5363,6 @@
"node": ">=14"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -5718,37 +5378,11 @@
"node": ">=8"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/hasown": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -5909,12 +5543,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-electron": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz",
- "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==",
- "license": "MIT"
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -5957,18 +5585,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -6417,12 +6033,6 @@
"@types/trusted-types": "^2.0.2"
}
},
- "node_modules/lodash-es": {
- "version": "4.18.1",
- "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
- "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
- "license": "MIT"
- },
"node_modules/long": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
@@ -6472,15 +6082,6 @@
"node": ">= 18"
}
},
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -6505,27 +6106,6 @@
"node": ">=8.6"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
@@ -6771,33 +6351,12 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
- "node_modules/p-queue": {
- "version": "6.6.2",
- "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
- "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
- "license": "MIT",
- "dependencies": {
- "eventemitter3": "^4.0.4",
- "p-timeout": "^3.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-queue/node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "license": "MIT"
- },
"node_modules/p-retry": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
@@ -6811,18 +6370,6 @@
"node": ">=8"
}
},
- "node_modules/p-timeout": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
- "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
- "license": "MIT",
- "dependencies": {
- "p-finally": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/pac-proxy-agent": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
@@ -7150,15 +6697,6 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
- "node_modules/proxy-from-env": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
- "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
@@ -7438,6 +6976,7 @@
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -8714,67 +8253,6 @@
"dev": true,
"license": "MIT"
},
- "packages/mom": {
- "name": "@mariozechner/pi-mom",
- "version": "0.70.6",
- "license": "MIT",
- "dependencies": {
- "@anthropic-ai/sandbox-runtime": "^0.0.16",
- "@mariozechner/pi-agent-core": "^0.70.6",
- "@mariozechner/pi-ai": "^0.70.6",
- "@mariozechner/pi-coding-agent": "^0.70.6",
- "@slack/socket-mode": "^2.0.0",
- "@slack/web-api": "^7.0.0",
- "chalk": "^5.6.2",
- "croner": "^9.1.0",
- "diff": "^8.0.2",
- "typebox": "^1.1.24"
- },
- "bin": {
- "mom": "dist/main.js"
- },
- "devDependencies": {
- "@types/diff": "^7.0.2",
- "@types/node": "^24.3.0",
- "typescript": "^5.7.3"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
- "packages/mom/node_modules/@types/node": {
- "version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.16.0"
- }
- },
- "packages/mom/node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
- "dev": true,
- "license": "MIT"
- },
- "packages/pods": {
- "name": "@mariozechner/pi",
- "version": "0.70.6",
- "license": "MIT",
- "dependencies": {
- "@mariozechner/pi-agent-core": "^0.70.6",
- "chalk": "^5.5.0"
- },
- "bin": {
- "pi-pods": "dist/cli.js"
- },
- "devDependencies": {},
- "engines": {
- "node": ">=20.0.0"
- }
- },
"packages/tui": {
"name": "@mariozechner/pi-tui",
"version": "0.70.6",
diff --git a/package.json b/package.json
index 00d96414..3cf6d4aa 100644
--- a/package.json
+++ b/package.json
@@ -12,8 +12,8 @@
],
"scripts": {
"clean": "npm run clean --workspaces",
- "build": "cd packages/tui && npm run build && cd ../ai && npm run build && cd ../agent && npm run build && cd ../coding-agent && npm run build && cd ../mom && npm run build && cd ../web-ui && npm run build && cd ../pods && npm run build",
- "dev": "concurrently --names \"ai,agent,coding-agent,mom,web-ui,tui\" --prefix-colors \"cyan,yellow,red,white,green,magenta\" \"cd packages/ai && npm run dev\" \"cd packages/agent && npm run dev\" \"cd packages/coding-agent && npm run dev\" \"cd packages/mom && npm run dev\" \"cd packages/web-ui && npm run dev\" \"cd packages/tui && npm run dev\"",
+ "build": "cd packages/tui && npm run build && cd ../ai && npm run build && cd ../agent && npm run build && cd ../coding-agent && npm run build && cd ../web-ui && npm run build",
+ "dev": "concurrently --names \"ai,agent,coding-agent,web-ui,tui\" --prefix-colors \"cyan,yellow,red,green,magenta\" \"cd packages/ai && npm run dev\" \"cd packages/agent && npm run dev\" \"cd packages/coding-agent && npm run dev\" \"cd packages/web-ui && npm run dev\" \"cd packages/tui && npm run dev\"",
"dev:tsc": "concurrently --names \"ai,web-ui\" --prefix-colors \"cyan,green\" \"cd packages/ai && npm run dev:tsc\" \"cd packages/web-ui && npm run dev:tsc\"",
"check": "biome check --write --error-on-warnings . && tsgo --noEmit && npm run check:browser-smoke && cd packages/web-ui && npm run check",
"check:browser-smoke": "node scripts/check-browser-smoke.mjs",
diff --git a/packages/mom/.gitignore b/packages/mom/.gitignore
deleted file mode 100644
index 8fce6030..00000000
--- a/packages/mom/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-data/
diff --git a/packages/mom/CHANGELOG.md b/packages/mom/CHANGELOG.md
deleted file mode 100644
index 67f8997b..00000000
--- a/packages/mom/CHANGELOG.md
+++ /dev/null
@@ -1,554 +0,0 @@
-# Changelog
-
-## [Unreleased]
-
-## [0.70.6] - 2026-04-28
-
-## [0.70.5] - 2026-04-27
-
-## [0.70.4] - 2026-04-27
-
-## [0.70.3] - 2026-04-27
-
-## [0.70.2] - 2026-04-24
-
-## [0.70.1] - 2026-04-24
-
-## [0.70.0] - 2026-04-23
-
-### Fixed
-
-- Fixed Mom event-directory `fs.watch` error handling to retry after transient watcher failures such as `EMFILE`, avoiding startup crashes ([#3564](https://github.com/badlogic/pi-mono/issues/3564))
-
-## [0.69.0] - 2026-04-22
-
-### Breaking Changes
-
-- Migrated Mom's TypeBox-based tool examples and runtime dependency from `@sinclair/typebox` 0.34.x to `typebox` 1.x. Install and import from `typebox` instead of `@sinclair/typebox` when authoring Mom tools and integrations ([#3112](https://github.com/badlogic/pi-mono/issues/3112))
-
-## [0.68.1] - 2026-04-22
-
-## [0.68.0] - 2026-04-20
-
-## [0.67.68] - 2026-04-17
-
-## [0.67.67] - 2026-04-17
-
-## [0.67.6] - 2026-04-16
-
-## [0.67.5] - 2026-04-16
-
-## [0.67.4] - 2026-04-16
-
-## [0.67.3] - 2026-04-15
-
-## [0.67.2] - 2026-04-14
-
-## [0.67.1] - 2026-04-13
-
-## [0.67.0] - 2026-04-13
-
-## [0.66.1] - 2026-04-08
-
-## [0.66.0] - 2026-04-08
-
-## [0.65.2] - 2026-04-06
-
-## [0.65.1] - 2026-04-05
-
-## [0.65.0] - 2026-04-03
-
-## [0.64.0] - 2026-03-29
-
-## [0.63.2] - 2026-03-29
-
-## [0.63.1] - 2026-03-27
-
-### Fixed
-
-- Fixed Mom compaction status handling to follow the unified `compaction_start` and `compaction_end` session events, keeping compaction notifications working after the event rename ([#2617](https://github.com/badlogic/pi-mono/issues/2617))
-
-## [0.63.0] - 2026-03-27
-
-## [0.62.0] - 2026-03-23
-
-## [0.61.1] - 2026-03-20
-
-## [0.61.0] - 2026-03-20
-
-## [0.60.0] - 2026-03-18
-
-## [0.59.0] - 2026-03-17
-
-## [0.58.4] - 2026-03-16
-
-## [0.58.3] - 2026-03-15
-
-## [0.58.2] - 2026-03-15
-
-## [0.58.1] - 2026-03-14
-
-## [0.58.0] - 2026-03-14
-
-## [0.57.1] - 2026-03-07
-
-## [0.57.0] - 2026-03-07
-
-## [0.56.3] - 2026-03-06
-
-## [0.56.2] - 2026-03-05
-
-## [0.56.1] - 2026-03-05
-
-## [0.56.0] - 2026-03-04
-
-## [0.55.4] - 2026-03-02
-
-### Fixed
-
-- Fixed mom startup crash caused by settings API drift by using `SettingsManager` with workspace-backed storage ([#1444](https://github.com/badlogic/pi-mono/issues/1444))
-
-## [0.55.3] - 2026-02-27
-
-## [0.55.2] - 2026-02-27
-
-## [0.55.1] - 2026-02-26
-
-## [0.55.0] - 2026-02-24
-
-## [0.54.2] - 2026-02-23
-
-## [0.54.1] - 2026-02-22
-
-## [0.54.0] - 2026-02-19
-
-## [0.53.1] - 2026-02-19
-
-## [0.53.0] - 2026-02-17
-
-## [0.52.12] - 2026-02-13
-
-## [0.52.11] - 2026-02-13
-
-## [0.52.10] - 2026-02-12
-
-## [0.52.9] - 2026-02-08
-
-## [0.52.8] - 2026-02-07
-
-## [0.52.7] - 2026-02-06
-
-## [0.52.6] - 2026-02-05
-
-## [0.52.5] - 2026-02-05
-
-## [0.52.4] - 2026-02-05
-
-## [0.52.3] - 2026-02-05
-
-## [0.52.2] - 2026-02-05
-
-## [0.52.1] - 2026-02-05
-
-## [0.52.0] - 2026-02-05
-
-## [0.51.6] - 2026-02-04
-
-## [0.51.5] - 2026-02-04
-
-## [0.51.4] - 2026-02-03
-
-## [0.51.3] - 2026-02-03
-
-## [0.51.2] - 2026-02-03
-
-## [0.51.1] - 2026-02-02
-
-## [0.51.0] - 2026-02-01
-
-## [0.50.9] - 2026-02-01
-
-## [0.50.8] - 2026-02-01
-
-## [0.50.7] - 2026-01-31
-
-## [0.50.6] - 2026-01-30
-
-## [0.50.5] - 2026-01-30
-
-## [0.50.3] - 2026-01-29
-
-## [0.50.2] - 2026-01-29
-
-## [0.50.1] - 2026-01-26
-
-## [0.50.0] - 2026-01-26
-
-## [0.49.3] - 2026-01-22
-
-## [0.49.2] - 2026-01-19
-
-## [0.49.1] - 2026-01-18
-
-## [0.49.0] - 2026-01-17
-
-## [0.48.0] - 2026-01-16
-
-## [0.47.0] - 2026-01-16
-
-## [0.46.0] - 2026-01-15
-
-## [0.45.7] - 2026-01-13
-
-## [0.45.6] - 2026-01-13
-
-## [0.45.5] - 2026-01-13
-
-## [0.45.4] - 2026-01-13
-
-## [0.45.3] - 2026-01-13
-
-## [0.45.2] - 2026-01-13
-
-## [0.45.1] - 2026-01-13
-
-## [0.45.0] - 2026-01-13
-
-## [0.44.0] - 2026-01-12
-
-## [0.43.0] - 2026-01-11
-
-## [0.42.5] - 2026-01-11
-
-### Fixed
-
-- Use coding-agent's SessionManager instead of custom MomSessionManager to fix API mismatch crash ([#595](https://github.com/badlogic/pi-mono/issues/595))
-
-## [0.42.4] - 2026-01-10
-
-## [0.42.3] - 2026-01-10
-
-## [0.42.2] - 2026-01-10
-
-## [0.42.1] - 2026-01-09
-
-## [0.42.0] - 2026-01-09
-
-## [0.41.0] - 2026-01-09
-
-## [0.40.1] - 2026-01-09
-
-## [0.40.0] - 2026-01-08
-
-## [0.39.1] - 2026-01-08
-
-## [0.39.0] - 2026-01-08
-
-## [0.38.0] - 2026-01-08
-
-## [0.37.8] - 2026-01-07
-
-## [0.37.7] - 2026-01-07
-
-## [0.37.6] - 2026-01-06
-
-## [0.37.5] - 2026-01-06
-
-## [0.37.4] - 2026-01-06
-
-## [0.37.3] - 2026-01-06
-
-## [0.37.2] - 2026-01-05
-
-## [0.37.1] - 2026-01-05
-
-## [0.37.0] - 2026-01-05
-
-## [0.36.0] - 2026-01-05
-
-## [0.35.0] - 2026-01-05
-
-## [0.34.2] - 2026-01-04
-
-## [0.34.1] - 2026-01-04
-
-## [0.34.0] - 2026-01-04
-
-## [0.33.0] - 2026-01-04
-
-## [0.32.3] - 2026-01-03
-
-## [0.32.2] - 2026-01-03
-
-## [0.32.1] - 2026-01-03
-
-## [0.32.0] - 2026-01-03
-
-## [0.31.1] - 2026-01-02
-
-## [0.31.0] - 2026-01-02
-
-### Breaking Changes
-
-- `AgentTool` import moved from `@mariozechner/pi-ai` to `@mariozechner/pi-agent-core`
-- `AppMessage` type renamed to `AgentMessage`
-- `Attachment` type replaced with `ImageContent` for image handling
-- `MomSessionManager.loadSession()` renamed to `buildSessionContex()`
-- `MomSessionManager.createBranchedSessionFromEntries()` signature changed to `createBranchedSession(leafId)`
-- `ProviderTransport` removed from Agent config, replaced with direct `getApiKey` callback
-- `messageTransformer` renamed to `convertToLlm`
-- `ANTHROPIC_API_KEY`/`ANTHROPIC_OAUTH_TOKEN` no longer checked at startup (deferred to first API call)
-
-### Changed
-
-- Session entries now include `id` and `parentId` fields for tree structure support
-- Auth lookup now uses `AuthStorage` class instead of direct environment variable access
-- Image attachments use `ImageContent` type with `data` field instead of `Attachment` with `content`
-- `session.prompt()` now uses `images` option instead of `attachments`
-
-### Added
-
-- Support for OAuth login via coding agent's `/login` command (link `~/.pi/agent/auth.json` to `~/.pi/mom/auth.json`)
-
-## [0.20.2] - 2025-12-13
-
-### Fixed
-
-- **Skill paths now use container paths**: Skill file paths in system prompt are translated to container paths (e.g., `/workspace/skills/...`) so mom can read them from inside Docker.
-
-## [0.20.1] - 2025-12-13
-
-### Added
-
-- **Skills auto-discovery**: Mom now automatically discovers skills from `workspace/skills/` and `channel/skills/` directories. Skills are directories containing a `SKILL.md` file with `name` and `description` in YAML frontmatter. Available skills are listed in the system prompt with their descriptions. Mom reads the `SKILL.md` file before using a skill.
-
-## [0.19.2] - 2025-12-12
-
-### Added
-
-- Events system: schedule wake-ups via JSON files in `workspace/events/`
- - Immediate events: trigger when file is created (for webhooks, external signals)
- - One-shot events: trigger at specific time (for reminders)
- - Periodic events: trigger on cron schedule (for recurring tasks)
-- `SlackBot.enqueueEvent()` for queueing events (max 5 per channel)
-- `[SILENT]` response marker: deletes status message, posts nothing to Slack (for periodic events with nothing to report)
-- Events documentation in `docs/events.md`
-- System prompt section explaining events to mom
-
-## [0.18.8] - 2025-12-12
-
-### Changed
-
-- Timestamp prefix now includes timezone offset (`[YYYY-MM-DD HH:MM:SS+HH:MM]`)
-
-## [0.18.7] - 2025-12-12
-
-### Added
-
-- Timestamp prefix on user messages (`[YYYY-MM-DD HH:MM:SS]`) so mom knows current date/time
-
-### Fixed
-
-- Sync deduplication now strips timestamp prefix before comparing
-
-## [0.18.6] - 2025-12-12
-
-### Fixed
-
-- Duplicate message in context when message has attachments (sync from log didn't strip attachment section before comparing)
-- Use `
-')) { - data = data.replace('', liveReloadScript + ''); - } else { - data = data + liveReloadScript; - } - - res.type('html').send(data); - }); -}); - -// Serve static files -app.use(express.static(FILES_DIR)); - -// Error handling -app.use((err, req, res, next) => { - console.error('Express error:', err.message); - res.status(500).send('Internal server error'); -}); - -server.on('error', (err) => { - if (err.code === 'EADDRINUSE') { - console.error(`Port ${PORT} is already in use`); - process.exit(1); - } else { - console.error('Server error:', err.message); - } -}); - -// Global error handlers -process.on('uncaughtException', (err) => { - console.error('Uncaught exception:', err); -}); - -process.on('unhandledRejection', (reason) => { - console.error('Unhandled rejection:', reason); -}); - -// Graceful shutdown -process.on('SIGTERM', () => { - console.log('SIGTERM received, closing gracefully'); - watcher.close(); - server.close(() => process.exit(0)); -}); - -process.on('SIGINT', () => { - console.log('SIGINT received, closing gracefully'); - watcher.close(); - server.close(() => process.exit(0)); -}); - -// Start server -server.listen(PORT, () => { - console.log(`Artifacts server running on http://localhost:${PORT}`); - console.log(`Serving files from: ${FILES_DIR}`); - console.log(`Add ?ws=true to any URL for live reload`); -}); -``` - -Make executable: -```bash -chmod +x /workspace/artifacts/server.js -``` - -### 3. Create Startup Script - -Save this as `/workspace/artifacts/start-server.sh`: - -```bash -#!/bin/sh -set -e - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -cd "$SCRIPT_DIR" - -echo "Starting artifacts server..." - -# Start Node.js server in background -node server.js > /tmp/server.log 2>&1 & -NODE_PID=$! - -# Wait for server to be ready -sleep 2 - -# Start cloudflare tunnel -echo "Starting Cloudflare Tunnel..." -cloudflared tunnel --url http://localhost:8080 2>&1 | tee /tmp/cloudflared.log & -TUNNEL_PID=$! - -# Wait for tunnel to establish -sleep 5 - -# Extract and display public URL -PUBLIC_URL=$(grep -o 'https://.*\.trycloudflare\.com' /tmp/cloudflared.log | head -1) - -if [ -n "$PUBLIC_URL" ]; then - echo "" - echo "==========================================" - echo "Artifacts server is running!" - echo "==========================================" - echo "Public URL: $PUBLIC_URL" - echo "Files directory: $SCRIPT_DIR/files/" - echo "" - echo "Add ?ws=true to any URL for live reload" - echo "Example: $PUBLIC_URL/test.html?ws=true" - echo "==========================================" - echo "" - - echo "$PUBLIC_URL" > /tmp/artifacts-url.txt -else - echo "Warning: Could not extract public URL" -fi - -# Keep script running -cleanup() { - echo "Shutting down..." - kill $NODE_PID 2>/dev/null || true - kill $TUNNEL_PID 2>/dev/null || true - exit 0 -} - -trap cleanup INT TERM -wait $NODE_PID $TUNNEL_PID -``` - -Make executable: -```bash -chmod +x /workspace/artifacts/start-server.sh -``` - -## Directory Structure - -``` -/workspace/artifacts/ -├── server.js # Node.js server -├── start-server.sh # Startup script -├── package.json # Dependencies -├── node_modules/ # Installed packages -└── files/ # PUT YOUR ARTIFACTS HERE - ├── 2025-12-14-demo/ - │ ├── index.html - │ ├── style.css - │ └── logo.png - ├── 2025-12-15-chart/ - │ └── index.html - └── test.html (standalone OK) -``` - -## Usage - -### Starting the Server - -```bash -cd /workspace/artifacts -./start-server.sh -``` - -This will: -1. Start Node.js server on localhost:8080 -2. Create Cloudflare Tunnel with public URL -3. Print the URL (e.g., `https://random-words-123.trycloudflare.com`) -4. Save URL to `/tmp/artifacts-url.txt` - -**Note:** URL changes every time you restart (free Cloudflare Tunnel limitation). - -### Creating Artifacts - -**Folder organization:** -- Create one subfolder per artifact: `$(date +%Y-%m-%d)-description/` -- Put main file as `index.html` for clean URLs -- Include images, CSS, JS, data in same folder -- CDN resources (Tailwind, Three.js, etc.) work fine - -**Example:** -```bash -mkdir -p /workspace/artifacts/files/$(date +%Y-%m-%d)-dashboard -cat > /workspace/artifacts/files/$(date +%Y-%m-%d)-dashboard/index.html << 'EOF' - - -
- - -
-