memoryblock 0.0.1 → 0.1.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/mblk.js +6 -0
- package/dist/bin/mblk.d.ts +3 -0
- package/dist/bin/mblk.d.ts.map +1 -0
- package/dist/bin/mblk.js +339 -0
- package/dist/bin/mblk.js.map +1 -0
- package/dist/cli/commands/create.d.ts +2 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +48 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +5 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +147 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +209 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/permissions.d.ts +13 -0
- package/dist/cli/commands/permissions.d.ts.map +1 -0
- package/dist/cli/commands/permissions.js +60 -0
- package/dist/cli/commands/permissions.js.map +1 -0
- package/dist/cli/commands/plugin-settings.d.ts +6 -0
- package/dist/cli/commands/plugin-settings.d.ts.map +1 -0
- package/dist/cli/commands/plugin-settings.js +118 -0
- package/dist/cli/commands/plugin-settings.js.map +1 -0
- package/dist/cli/commands/plugins.d.ts +3 -0
- package/dist/cli/commands/plugins.d.ts.map +1 -0
- package/dist/cli/commands/plugins.js +83 -0
- package/dist/cli/commands/plugins.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +8 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +96 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/server.d.ts +25 -0
- package/dist/cli/commands/server.d.ts.map +1 -0
- package/dist/cli/commands/server.js +295 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/service.d.ts +18 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +309 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/start.d.ts +11 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +801 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +78 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +9 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +83 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/web.d.ts +5 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +63 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/constants.d.ts +38 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +80 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/logger.d.ts +12 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +40 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/engine/agent.d.ts +15 -0
- package/dist/engine/agent.d.ts.map +1 -0
- package/dist/engine/agent.js +19 -0
- package/dist/engine/agent.js.map +1 -0
- package/dist/engine/conversation-log.d.ts +35 -0
- package/dist/engine/conversation-log.d.ts.map +1 -0
- package/dist/engine/conversation-log.js +83 -0
- package/dist/engine/conversation-log.js.map +1 -0
- package/dist/engine/cost-tracker.d.ts +52 -0
- package/dist/engine/cost-tracker.d.ts.map +1 -0
- package/dist/engine/cost-tracker.js +110 -0
- package/dist/engine/cost-tracker.js.map +1 -0
- package/dist/engine/gatekeeper.d.ts +20 -0
- package/dist/engine/gatekeeper.d.ts.map +1 -0
- package/dist/engine/gatekeeper.js +43 -0
- package/dist/engine/gatekeeper.js.map +1 -0
- package/dist/engine/memory.d.ts +28 -0
- package/dist/engine/memory.d.ts.map +1 -0
- package/dist/engine/memory.js +69 -0
- package/dist/engine/memory.js.map +1 -0
- package/dist/engine/monitor.d.ts +81 -0
- package/dist/engine/monitor.d.ts.map +1 -0
- package/dist/engine/monitor.js +610 -0
- package/dist/engine/monitor.js.map +1 -0
- package/dist/engine/prompts.d.ts +31 -0
- package/dist/engine/prompts.d.ts.map +1 -0
- package/dist/engine/prompts.js +93 -0
- package/dist/engine/prompts.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +544 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +111 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +188 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +24 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +86 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +18 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +65 -0
- package/dist/utils/fs.js.map +1 -0
- package/package.json +78 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 memoryblock
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<!-- PROJECT TITLE -->
|
|
4
|
+
<h3>
|
|
5
|
+
<img width="240" alt="memoryblock logo" src="https://github.com/memoryblock-io/memoryblock/blob/main/packages/web/public/images/memoryblock-logo.png?raw=true" />
|
|
6
|
+
</h3>
|
|
7
|
+
|
|
8
|
+
<!-- ONE LINE SUMMARY -->
|
|
9
|
+
<p>
|
|
10
|
+
<b>Run AI agents that remember, think, and work - without burning through your budget.</b>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<!-- BADGES -->
|
|
14
|
+
<p>
|
|
15
|
+
<a href="https://www.npmjs.com/package/memoryblock"><img src="https://img.shields.io/npm/v/memoryblock.svg?style=flat-square&color=CB3837" alt="npm version"></a>
|
|
16
|
+
<!--<a href="https://www.npmjs.com/package/memoryblock?activeTab=versions"><img src="https://img.shields.io/npm/dt/memoryblock.svg?style=flat-square&color=38bd24" alt="downloads"></a>-->
|
|
17
|
+
<a href="https://github.com/memoryblock-io/memoryblock/stargazers"><img src="https://img.shields.io/github/stars/memoryblock-io/memoryblock?style=flat-square&logo=github" alt="stars"></a>
|
|
18
|
+
<a href="https://github.com/memoryblock-io/memoryblock/blob/main/LICENSE"><img src="https://img.shields.io/github/license/memoryblock-io/memoryblock.svg?style=flat-square&color=A31F34" alt="license"></a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
<!-- MENU -->
|
|
22
|
+
<p>
|
|
23
|
+
<h4>
|
|
24
|
+
<a href="https://memoryblock.io">View Demo</a> •
|
|
25
|
+
<a href="https://docs.memoryblock.io/getting-started/installation/">Documentation</a> •
|
|
26
|
+
<a href="https://github.com/memoryblock-io/memoryblock/issues">Report Bug</a>
|
|
27
|
+
</h4>
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
<!-- PREVIEW -->
|
|
31
|
+
<p>
|
|
32
|
+
<br/>
|
|
33
|
+
<img width="800" alt="memoryblock preview" src="https://github.com/user-attachments/assets/f7cf1e5b-e05c-4f8b-8747-0ef13adde054" />
|
|
34
|
+
<br/>
|
|
35
|
+
<sup><i>memoryblock web client dashboard preview</i></sup>
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
Memoryblock lets you deploy AI agents as isolated **blocks** - independent workspaces, each with their own memory, tools, and personality. Think of a block as a private office for an AI. Give it a job, point it at a channel, and let it run.
|
|
41
|
+
|
|
42
|
+
One block can be your personal assistant. Another can monitor your infrastructure. A third can research topics and write summaries. They don't interfere with each other, they don't share memory, and they don't waste tokens re-learning what they already know.
|
|
43
|
+
|
|
44
|
+
Need them to collaborate? A block can spawn sub-agents, the temporary workers in sandboxed environments to handle specific tasks and report back. No shared state pollution, no context confusion.
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
you ─── terminal ──── block "home" (your daily assistant)
|
|
48
|
+
├── channel ───── block "devops" (monitors + alerts)
|
|
49
|
+
└── web ui ────── block "research" (deep dives + summaries)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## ✨ What Makes This Different
|
|
53
|
+
|
|
54
|
+
### It's cheap to run. Seriously.
|
|
55
|
+
|
|
56
|
+
Most AI tools send the entire tool schema. Thousands of tokens. On *every single message*. For a background agent running all day, that's money on fire.
|
|
57
|
+
|
|
58
|
+
Memoryblock was engineered around this problem:
|
|
59
|
+
|
|
60
|
+
- **On-demand schema loading** - tool definitions are injected only when needed, then dropped. Payload sizes go from ~2,600 tokens to ~1,200 tokens per turn.
|
|
61
|
+
- **History trimming** - large tool outputs (log dumps, file contents) are read once, then truncated in memory to 500 characters. The LLM already saw it. No need to pay for it again.
|
|
62
|
+
- **Smart context recovery** - when context fills up, the engine summarizes everything into clean, actionable notes and starts fresh. No crash, no data loss, no compact context error loops.
|
|
63
|
+
|
|
64
|
+
> In testing, these optimizations reduce token growth between turns from 4.2× to under 2×, resulting in over 50% cost reduction on sustained sessions.
|
|
65
|
+
|
|
66
|
+
### It runs on Bun. Nothing else.
|
|
67
|
+
|
|
68
|
+
No Node.js. No Electron. No heavy frameworks. The entire core, HTTP server, WebSocket streaming, static file serving, is built on native APIs. Cold starts are fast. Memory usage is small.
|
|
69
|
+
|
|
70
|
+
### Every block is its own world.
|
|
71
|
+
|
|
72
|
+
Each block gets its own `config.json`, `memory.md`, `monitor.md`, `costs.json`, and log directory. Move a block between machines by copying its folder. Back it up by zipping it. There's no shared database, no centralized state, no magic.
|
|
73
|
+
|
|
74
|
+
### Talk to it from anywhere.
|
|
75
|
+
|
|
76
|
+
Your blocks are accessible through the **CLI** (a simple interactive terminal), different **Channels** (including Telegram, Discord, Slack, and more), and a **Web Dashboard** (with live WebSocket updates). Same block, same memory, different surfaces.
|
|
77
|
+
|
|
78
|
+
### Use any model you want.
|
|
79
|
+
|
|
80
|
+
Memoryblock doesn't lock you into one provider. Swap models per-block, per-task, or per-agent:
|
|
81
|
+
|
|
82
|
+
| Adapter | Auth |
|
|
83
|
+
|:---|:---|
|
|
84
|
+
| **AWS Bedrock** | AWS credentials |
|
|
85
|
+
| **OpenAI** | API key |
|
|
86
|
+
| **Google Gemini** | API key |
|
|
87
|
+
| **Anthropic** | API key |
|
|
88
|
+
|
|
89
|
+
Adding a new adapter is one file. See [adapter docs](https://docs.memoryblock.io/adapters/) for examples.
|
|
90
|
+
|
|
91
|
+
## Quick Start
|
|
92
|
+
|
|
93
|
+
**Requirements:** [Bun](https://bun.sh) ≥ 1.0 and an API key from any supported provider.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# clone and set up
|
|
97
|
+
git clone https://github.com/memoryblock-io/memoryblock.git
|
|
98
|
+
cd memoryblock
|
|
99
|
+
pnpm dev:onboard -gl
|
|
100
|
+
|
|
101
|
+
# run the setup wizard
|
|
102
|
+
mblk init
|
|
103
|
+
|
|
104
|
+
# start your first block
|
|
105
|
+
mblk start home
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
That's it. The wizard handles credentials, verification, and creating your first block.
|
|
109
|
+
|
|
110
|
+
### Web Dashboard
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
mblk web
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Opens a live dashboard at `localhost:8420` with real-time block monitoring, cost tracking, and memory inspection.
|
|
117
|
+
|
|
118
|
+
### Channels
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
mblk start home --channel telegram
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Your block is now live on the channel you chose. Same memory, same tools, accessible from anywhere.
|
|
125
|
+
|
|
126
|
+
## Commands
|
|
127
|
+
|
|
128
|
+
Everything you can do from the terminal, you can do from chat (and soon, the web UI too):
|
|
129
|
+
|
|
130
|
+
| CLI | In-Chat | What it does |
|
|
131
|
+
|:---|:---|:---|
|
|
132
|
+
| `mblk create <name>` | `/create-block <name>` | Create a new block |
|
|
133
|
+
| `mblk start <block>` | — | Start a block's monitor |
|
|
134
|
+
| `mblk stop <block>` | — | Stop a running monitor |
|
|
135
|
+
| `mblk status` | `/status` | Show all blocks and their state |
|
|
136
|
+
| `mblk delete <block>` | — | Archive a block safely |
|
|
137
|
+
| `mblk restore <archive>` | — | Restore from archive |
|
|
138
|
+
| `mblk reset <block>` | — | Reset memory and costs |
|
|
139
|
+
| `mblk add <plugin>` | — | Install a plugin |
|
|
140
|
+
|
|
141
|
+
Full reference: [command docs](https://docs.memoryblock.io/commands.md)
|
|
142
|
+
|
|
143
|
+
## Plugins
|
|
144
|
+
|
|
145
|
+
Blocks come with a core set of tools. Need more? Add them:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
mblk add web-search # search the web
|
|
149
|
+
mblk add fetch-webpage # extract text from any URL
|
|
150
|
+
mblk add agents # multi-agent orchestration
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Plugins are just npm packages. The installer resolves, downloads, and wires them in automatically.
|
|
154
|
+
|
|
155
|
+
| Plugin | What it does |
|
|
156
|
+
|:---|:---|
|
|
157
|
+
| `web-search` | Search the web with your configured provider |
|
|
158
|
+
| `fetch-webpage` | Extract clean text from URLs |
|
|
159
|
+
| `agents` | Spawn sub-agents for delegated tasks |
|
|
160
|
+
| `aws` | Cloud SDK code generation tools |
|
|
161
|
+
|
|
162
|
+
## Adapters
|
|
163
|
+
|
|
164
|
+
Each adapter is a single file that maps Memoryblock's internal message format to a provider's API. They handle authentication, request formatting, and response parsing. Writing a new adapter is straightforward — the interface is small and well-documented.
|
|
165
|
+
|
|
166
|
+
See all supported adapters and how to write your own: [adapters](https://docs.memoryblock.io/adapters/)
|
|
167
|
+
|
|
168
|
+
## Channels
|
|
169
|
+
|
|
170
|
+
Channels are how your blocks talk to the outside world. The CLI, messaging platforms, and the web dashboard are all channels — equal citizens, not afterthoughts. Adding a new channel is a single file implementation.
|
|
171
|
+
|
|
172
|
+
Supported and upcoming channels are documented in [channels](https://docs.memoryblock.io/channels/).
|
|
173
|
+
|
|
174
|
+
## Architecture
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
packages/
|
|
178
|
+
├── core/ # engine, CLI, schemas, monitor loop
|
|
179
|
+
├── adapters/ # LLM provider adapters
|
|
180
|
+
├── channels/ # messaging channel transports
|
|
181
|
+
├── api/ # HTTP + WebSocket server
|
|
182
|
+
├── web/ # static web dashboard
|
|
183
|
+
├── tools/ # base tool registry and schema helpers
|
|
184
|
+
├── daemon/ # background process management
|
|
185
|
+
└── plugins/ # extensible capability modules
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
It's a pnpm monorepo. Every package builds independently with `tsc`. No bundlers, no magic.
|
|
189
|
+
|
|
190
|
+
## Community & Support
|
|
191
|
+
- **Contributing**: We welcome PRs! See [CONTRIBUTING.md](.github/CONTRIBUTING.md).
|
|
192
|
+
- **Support**: If you find `memoryblock` useful, please consider [sponsoring the project](https://github.com/sponsors/mgks) or giving it a star ⭐.
|
|
193
|
+
|
|
194
|
+
## The `memoryblock` Ecosystem
|
|
195
|
+
|
|
196
|
+
**memoryblock** is a highly modular system. Here are the official packages:
|
|
197
|
+
|
|
198
|
+
**The Core**
|
|
199
|
+
* [**memoryblock**](https://www.npmjs.com/package/memoryblock) - The core engine interface and types.
|
|
200
|
+
* [**@memoryblock/daemon**](https://www.npmjs.com/package/@memoryblock/daemon) - Background daemon manager.
|
|
201
|
+
* [**@memoryblock/api**](https://www.npmjs.com/package/@memoryblock/api) - Core REST and WebSocket API server.
|
|
202
|
+
|
|
203
|
+
**Integrations & Tooling**
|
|
204
|
+
* [**@memoryblock/adapters**](https://www.npmjs.com/package/@memoryblock/adapters) - LLM adapters (OpenAI, Anthropic, Bedrock, etc).
|
|
205
|
+
* [**@memoryblock/channels**](https://www.npmjs.com/package/@memoryblock/channels) - Communication channels (CLI, Telegram, Web).
|
|
206
|
+
* [**@memoryblock/tools**](https://www.npmjs.com/package/@memoryblock/tools) - Standard tool definitions and schemas.
|
|
207
|
+
* [**@memoryblock/locale**](https://www.npmjs.com/package/@memoryblock/locale) - Localization strings and formatting.
|
|
208
|
+
* [**@memoryblock/web**](https://www.npmjs.com/package/@memoryblock/web) - Front-end dashboard and Web UI.
|
|
209
|
+
|
|
210
|
+
**Plugins**
|
|
211
|
+
* [**@memoryblock/plugin-installer**](https://www.npmjs.com/package/@memoryblock/plugin-installer) - Plugin installer and registry manager.
|
|
212
|
+
* [**@memoryblock/plugin-agents**](https://www.npmjs.com/package/@memoryblock/plugin-agents) - Secondary AI agents orchestrator.
|
|
213
|
+
* [**@memoryblock/plugin-aws**](https://www.npmjs.com/package/@memoryblock/plugin-aws) - AWS integrations.
|
|
214
|
+
* [**@memoryblock/plugin-fetch-webpage**](https://www.npmjs.com/package/@memoryblock/plugin-fetch-webpage) - Web content fetching and parsing.
|
|
215
|
+
* [**@memoryblock/plugin-web-search**](https://www.npmjs.com/package/@memoryblock/plugin-web-search) - Web search capabilities.
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
Distributed under the MIT License. See `LICENSE` for more information.
|
|
220
|
+
|
|
221
|
+
 
|
package/bin/mblk.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mblk.d.ts","sourceRoot":"","sources":["../../src/bin/mblk.ts"],"names":[],"mappings":""}
|
package/dist/bin/mblk.js
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { log } from '../cli/logger.js';
|
|
4
|
+
import { initCommand } from '../cli/commands/init.js';
|
|
5
|
+
import { createCommand } from '../cli/commands/create.js';
|
|
6
|
+
import { startCommand } from '../cli/commands/start.js';
|
|
7
|
+
import { stopCommand } from '../cli/commands/stop.js';
|
|
8
|
+
import { statusCommand } from '../cli/commands/status.js';
|
|
9
|
+
import { resetCommand } from '../cli/commands/reset.js';
|
|
10
|
+
import { serverStartCommand, serverStopCommand, serverStatusCommand, serverTokenCommand, shutdownCommand, restartCommand } from '../cli/commands/server.js';
|
|
11
|
+
import { addCommand, removeCommand } from '../cli/commands/plugins.js';
|
|
12
|
+
import { deleteCommand, restoreCommand } from '../cli/commands/delete.js';
|
|
13
|
+
import { permissionsCommand } from '../cli/commands/permissions.js';
|
|
14
|
+
import { pluginSettingsCommand } from '../cli/commands/plugin-settings.js';
|
|
15
|
+
import { serviceInstallCommand, serviceUninstallCommand, serviceStatusCommand } from '../cli/commands/service.js';
|
|
16
|
+
import { getVersion, DEFAULT_PORT } from '../cli/constants.js';
|
|
17
|
+
(async () => {
|
|
18
|
+
const version = await getVersion();
|
|
19
|
+
const program = new Command();
|
|
20
|
+
program
|
|
21
|
+
.name('mblk')
|
|
22
|
+
.description('Deploy isolated, multi-agent AI assistants with extreme resource efficiency.')
|
|
23
|
+
.version(version)
|
|
24
|
+
.exitOverride(() => process.exit(0)) // Don't throw ELIFECYCLE when showing help
|
|
25
|
+
.configureOutput({
|
|
26
|
+
writeOut: (str) => process.stdout.write(str),
|
|
27
|
+
writeErr: (str) => process.stdout.write(str), // Prevent stderr noise from Commander
|
|
28
|
+
});
|
|
29
|
+
program
|
|
30
|
+
.command('init')
|
|
31
|
+
.description('Interactive setup — configure credentials, verify connections, create your first block.')
|
|
32
|
+
.option('-y, --yes', 'Non-interactive mode: create defaults without prompts')
|
|
33
|
+
.action(async (opts) => {
|
|
34
|
+
try {
|
|
35
|
+
await initCommand({ nonInteractive: opts.yes });
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
log.error(err.message);
|
|
39
|
+
process.exit(0);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
program
|
|
43
|
+
.command('create <name>')
|
|
44
|
+
.description('Create a new block (isolated AI workspace).')
|
|
45
|
+
.action(async (name) => {
|
|
46
|
+
try {
|
|
47
|
+
await createCommand(name);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
log.error(err.message);
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
program
|
|
55
|
+
.command('start [block]')
|
|
56
|
+
.description('Start the monitor loop for a block (or all blocks).')
|
|
57
|
+
.option('-d, --daemon', 'Run the monitor in the background')
|
|
58
|
+
.option('-c, --channel <channel>', 'Specify override channel (e.g. web, cli)')
|
|
59
|
+
.action(async (block, opts) => {
|
|
60
|
+
try {
|
|
61
|
+
await startCommand(block, opts);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err.message;
|
|
65
|
+
// If not initialized, auto-route to init and then retry
|
|
66
|
+
if (msg.includes('not initialized') || msg.includes('mblk init')) {
|
|
67
|
+
log.warn('Workspace not initialized. Running setup first...\n');
|
|
68
|
+
try {
|
|
69
|
+
await initCommand();
|
|
70
|
+
// Retry start after init completes
|
|
71
|
+
await startCommand(block, opts);
|
|
72
|
+
}
|
|
73
|
+
catch (initErr) {
|
|
74
|
+
log.error(initErr.message);
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
log.error(msg);
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
program
|
|
84
|
+
.command('stop [block]')
|
|
85
|
+
.description('Stop a running block monitor (or all blocks).')
|
|
86
|
+
.action(async (block) => {
|
|
87
|
+
try {
|
|
88
|
+
await stopCommand(block);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
log.error(err.message);
|
|
92
|
+
process.exit(0);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
program
|
|
96
|
+
.command('status')
|
|
97
|
+
.description('Show the status of all blocks.')
|
|
98
|
+
.action(async () => {
|
|
99
|
+
try {
|
|
100
|
+
await statusCommand();
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
log.error(err.message);
|
|
104
|
+
process.exit(0);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
program
|
|
108
|
+
.command('reset <block>')
|
|
109
|
+
.description('Reset a block state (memory, pulse, costs). Use --hard to wipe logs.')
|
|
110
|
+
.option('--hard', 'Wipe logs directory as well')
|
|
111
|
+
.action(async (block, opts) => {
|
|
112
|
+
try {
|
|
113
|
+
await resetCommand(block, opts);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
log.error(err.message);
|
|
117
|
+
process.exit(0);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
program
|
|
121
|
+
.command('delete <block>')
|
|
122
|
+
.description('Archive a block to prevent data loss. Use --hard to permanently delete.')
|
|
123
|
+
.option('--hard', 'Permanently wipe the block from disk')
|
|
124
|
+
.action(async (block, opts) => {
|
|
125
|
+
try {
|
|
126
|
+
await deleteCommand(block, opts);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
log.error(err.message);
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
program
|
|
134
|
+
.command('restore <name>')
|
|
135
|
+
.description('Restore an archived block by name.')
|
|
136
|
+
.action(async (archive) => {
|
|
137
|
+
try {
|
|
138
|
+
await restoreCommand(archive);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
log.error(err.message);
|
|
142
|
+
process.exit(0);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
program
|
|
146
|
+
.command('permissions <block>')
|
|
147
|
+
.description('View or update block permissions (CLI-only).')
|
|
148
|
+
.option('-s, --scope <level>', 'Set scope: block, workspace, or system')
|
|
149
|
+
.option('--allow-shell', 'Allow shell command execution')
|
|
150
|
+
.option('--deny-shell', 'Deny shell command execution')
|
|
151
|
+
.option('--allow-network', 'Allow network/fetch access')
|
|
152
|
+
.option('--deny-network', 'Deny network/fetch access')
|
|
153
|
+
.option('--max-timeout <seconds>', 'Max command timeout in seconds')
|
|
154
|
+
.action(async (block, opts) => {
|
|
155
|
+
try {
|
|
156
|
+
await permissionsCommand(block, opts);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
log.error(err.message);
|
|
160
|
+
process.exit(0);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
program
|
|
164
|
+
.command('settings [plugin]')
|
|
165
|
+
.description('View or edit plugin settings.')
|
|
166
|
+
.action(async (pluginId) => {
|
|
167
|
+
try {
|
|
168
|
+
await pluginSettingsCommand(pluginId);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
log.error(err.message);
|
|
172
|
+
process.exit(0);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// ===== Server Subcommand Group =====
|
|
176
|
+
const server = program
|
|
177
|
+
.command('server')
|
|
178
|
+
.description('Manage the web/API server.');
|
|
179
|
+
server
|
|
180
|
+
.command('start')
|
|
181
|
+
.description('Start the web UI and API server.')
|
|
182
|
+
.option('-p, --port <port>', 'Port to listen on', DEFAULT_PORT)
|
|
183
|
+
.option('--new-token', 'Generate a new auth token')
|
|
184
|
+
.option('-d, --daemon', 'Run the server in the background')
|
|
185
|
+
.action(async (opts) => {
|
|
186
|
+
try {
|
|
187
|
+
await serverStartCommand(opts);
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
log.error(err.message);
|
|
191
|
+
process.exit(0);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
server
|
|
195
|
+
.command('stop')
|
|
196
|
+
.description('Stop the running server.')
|
|
197
|
+
.action(async () => {
|
|
198
|
+
try {
|
|
199
|
+
await serverStopCommand();
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
log.error(err.message);
|
|
203
|
+
process.exit(0);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
server
|
|
207
|
+
.command('status')
|
|
208
|
+
.description('Show server status (PID, port, running state).')
|
|
209
|
+
.action(async () => {
|
|
210
|
+
try {
|
|
211
|
+
await serverStatusCommand();
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
log.error(err.message);
|
|
215
|
+
process.exit(0);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
server
|
|
219
|
+
.command('token')
|
|
220
|
+
.description('View the current API token, or generate a new one.')
|
|
221
|
+
.option('--new-token', 'Generate and set a new API token')
|
|
222
|
+
.action(async (opts) => {
|
|
223
|
+
try {
|
|
224
|
+
await serverTokenCommand(opts);
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
log.error(err.message);
|
|
228
|
+
process.exit(0);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
// ===== Service Subcommand Group =====
|
|
232
|
+
const service = program
|
|
233
|
+
.command('service')
|
|
234
|
+
.description('Manage OS-level auto-start (launchd/systemd).');
|
|
235
|
+
service
|
|
236
|
+
.command('install')
|
|
237
|
+
.description('Register memoryblock to start on boot/login.')
|
|
238
|
+
.action(async () => {
|
|
239
|
+
try {
|
|
240
|
+
await serviceInstallCommand();
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
log.error(err.message);
|
|
244
|
+
process.exit(0);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
service
|
|
248
|
+
.command('uninstall')
|
|
249
|
+
.description('Remove memoryblock from system auto-start.')
|
|
250
|
+
.action(async () => {
|
|
251
|
+
try {
|
|
252
|
+
await serviceUninstallCommand();
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
log.error(err.message);
|
|
256
|
+
process.exit(0);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
service
|
|
260
|
+
.command('status')
|
|
261
|
+
.description('Check if the auto-start service is installed.')
|
|
262
|
+
.action(async () => {
|
|
263
|
+
try {
|
|
264
|
+
await serviceStatusCommand();
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
log.error(err.message);
|
|
268
|
+
process.exit(0);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
// ===== Lifecycle Commands =====
|
|
272
|
+
program
|
|
273
|
+
.command('shutdown')
|
|
274
|
+
.description('Stop all blocks and the server.')
|
|
275
|
+
.action(async () => {
|
|
276
|
+
try {
|
|
277
|
+
await shutdownCommand();
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
log.error(err.message);
|
|
281
|
+
process.exit(0);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
program
|
|
285
|
+
.command('restart')
|
|
286
|
+
.description('Restart: stop everything, then start server as daemon.')
|
|
287
|
+
.option('-p, --port <port>', 'Port to listen on', DEFAULT_PORT)
|
|
288
|
+
.action(async (opts) => {
|
|
289
|
+
try {
|
|
290
|
+
await restartCommand(opts);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
log.error(err.message);
|
|
294
|
+
process.exit(0);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
// Backward-compatible alias: `mblk web` = `mblk server start`
|
|
298
|
+
program
|
|
299
|
+
.command('web')
|
|
300
|
+
.description('Alias for `mblk server start`.')
|
|
301
|
+
.option('-p, --port <port>', 'Port to listen on', DEFAULT_PORT)
|
|
302
|
+
.option('--new-token', 'Generate a new auth token')
|
|
303
|
+
.option('-d, --daemon', 'Run the server in the background')
|
|
304
|
+
.action(async (opts) => {
|
|
305
|
+
try {
|
|
306
|
+
await serverStartCommand(opts);
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
log.error(err.message);
|
|
310
|
+
process.exit(0);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
program
|
|
314
|
+
.command('add [plugin]')
|
|
315
|
+
.description('Install a plugin (run without args to list available plugins).')
|
|
316
|
+
.action(async (plugin) => {
|
|
317
|
+
try {
|
|
318
|
+
await addCommand(plugin);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
log.error(err.message);
|
|
322
|
+
process.exit(0);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
program
|
|
326
|
+
.command('remove <plugin>')
|
|
327
|
+
.description('Remove an installed plugin.')
|
|
328
|
+
.action(async (plugin) => {
|
|
329
|
+
try {
|
|
330
|
+
await removeCommand(plugin);
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
log.error(err.message);
|
|
334
|
+
process.exit(0);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
program.parse();
|
|
338
|
+
})();
|
|
339
|
+
//# sourceMappingURL=mblk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mblk.js","sourceRoot":"","sources":["../../src/bin/mblk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAYA,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDpE"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { ensureDir, writeJson, atomicWrite, pathExists } from '../../utils/fs.js';
|
|
3
|
+
import { loadGlobalConfig, resolveBlockPath, isInitialized, } from '../../utils/config.js';
|
|
4
|
+
import { BlockConfigSchema, PulseStateSchema } from '../../schemas.js';
|
|
5
|
+
import { log } from '../logger.js';
|
|
6
|
+
import { FILE_TEMPLATES } from '../../engine/prompts.js';
|
|
7
|
+
// Templates moved to prompts.ts
|
|
8
|
+
export async function createCommand(blockName) {
|
|
9
|
+
if (!(await isInitialized())) {
|
|
10
|
+
throw new Error('Not initialized. Run `mblk init` first.');
|
|
11
|
+
}
|
|
12
|
+
if (!/^[a-z0-9][a-z0-9-]{0,31}$/.test(blockName)) {
|
|
13
|
+
throw new Error('Block name must start with a letter/number and contain only lowercase letters, numbers, and hyphens (max 32 chars).');
|
|
14
|
+
}
|
|
15
|
+
const globalConfig = await loadGlobalConfig();
|
|
16
|
+
const blockPath = resolveBlockPath(globalConfig, blockName);
|
|
17
|
+
if (await pathExists(blockPath)) {
|
|
18
|
+
throw new Error(`Block "${blockName}" already exists at ${blockPath}`);
|
|
19
|
+
}
|
|
20
|
+
log.brand(`Creating block: ${blockName}\n`);
|
|
21
|
+
// Directory structure
|
|
22
|
+
await ensureDir(blockPath);
|
|
23
|
+
await ensureDir(join(blockPath, 'agents'));
|
|
24
|
+
await ensureDir(join(blockPath, 'logs'));
|
|
25
|
+
// Block config (inherits global defaults)
|
|
26
|
+
const blockConfig = BlockConfigSchema.parse({
|
|
27
|
+
name: blockName,
|
|
28
|
+
adapter: globalConfig.defaults.adapter,
|
|
29
|
+
memory: globalConfig.defaults.memory,
|
|
30
|
+
pulse: globalConfig.defaults.pulse,
|
|
31
|
+
});
|
|
32
|
+
await writeJson(join(blockPath, 'config.json'), blockConfig);
|
|
33
|
+
log.success('Created config.json');
|
|
34
|
+
// Initial pulse state
|
|
35
|
+
const pulse = PulseStateSchema.parse({});
|
|
36
|
+
await writeJson(join(blockPath, 'pulse.json'), pulse);
|
|
37
|
+
log.success('Created pulse.json');
|
|
38
|
+
// Core identity files
|
|
39
|
+
await atomicWrite(join(blockPath, 'memory.md'), FILE_TEMPLATES.MEMORY_MD);
|
|
40
|
+
log.success('Created memory.md');
|
|
41
|
+
await atomicWrite(join(blockPath, 'monitor.md'), FILE_TEMPLATES.MONITOR_MD(blockName));
|
|
42
|
+
log.success('Created monitor.md');
|
|
43
|
+
console.log('');
|
|
44
|
+
log.brand(`Block "${blockName}" is ready.`);
|
|
45
|
+
log.dim(` Path: ${blockPath}`);
|
|
46
|
+
log.dim(` Start: mblk start ${blockName}`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=create.js.map
|