@mandible-ai/mandible 0.3.5 → 0.3.7
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/README.md +46 -22
- package/dist/examples/code-pipeline/index.js +2 -12
- package/dist/examples/code-pipeline/index.js.map +1 -1
- package/dist/examples/code-pipeline/with-providers.js +45 -100
- package/dist/examples/code-pipeline/with-providers.js.map +1 -1
- package/dist/src/cli/index.js +24 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/server.d.ts +58 -13
- package/dist/src/cli/server.d.ts.map +1 -1
- package/dist/src/cli/server.js +90 -256
- package/dist/src/cli/server.js.map +1 -1
- package/dist/src/environments/github/adapter.d.ts +15 -1
- package/dist/src/environments/github/adapter.d.ts.map +1 -1
- package/dist/src/environments/github/adapter.js +178 -47
- package/dist/src/environments/github/adapter.js.map +1 -1
- package/dist/src/environments/github/client.d.ts +18 -1
- package/dist/src/environments/github/client.d.ts.map +1 -1
- package/dist/src/environments/github/client.js +124 -0
- package/dist/src/environments/github/client.js.map +1 -1
- package/dist/src/environments/github/index.d.ts +2 -2
- package/dist/src/environments/github/index.d.ts.map +1 -1
- package/dist/src/environments/github/index.js +1 -1
- package/dist/src/environments/github/index.js.map +1 -1
- package/dist/src/environments/github/mapper.d.ts +47 -1
- package/dist/src/environments/github/mapper.d.ts.map +1 -1
- package/dist/src/environments/github/mapper.js +176 -1
- package/dist/src/environments/github/mapper.js.map +1 -1
- package/dist/src/environments/github/types.d.ts +100 -0
- package/dist/src/environments/github/types.d.ts.map +1 -1
- package/dist/src/hosts/docker.d.ts.map +1 -1
- package/dist/src/hosts/docker.js +22 -4
- package/dist/src/hosts/docker.js.map +1 -1
- package/dist/src/hosts/local.d.ts +3 -0
- package/dist/src/hosts/local.d.ts.map +1 -1
- package/dist/src/hosts/local.js +20 -4
- package/dist/src/hosts/local.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/patterns/debug-bridge.d.ts +48 -0
- package/dist/src/patterns/debug-bridge.d.ts.map +1 -0
- package/dist/src/patterns/debug-bridge.js +216 -0
- package/dist/src/patterns/debug-bridge.js.map +1 -0
- package/dist/src/patterns/index.d.ts +2 -0
- package/dist/src/patterns/index.d.ts.map +1 -1
- package/dist/src/patterns/index.js +1 -0
- package/dist/src/patterns/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -86,7 +86,7 @@ await host.stop();
|
|
|
86
86
|
|
|
87
87
|
#### Docker
|
|
88
88
|
|
|
89
|
-
Runs each colony
|
|
89
|
+
Runs each colony in a Docker container. Same colony definitions, but the runtime boundary is containers instead of running in-process:
|
|
90
90
|
|
|
91
91
|
```typescript
|
|
92
92
|
import { mandible, FilesystemEnvironment, docker } from '@mandible-ai/mandible';
|
|
@@ -95,23 +95,19 @@ const env = new FilesystemEnvironment({ root: './.mandible/signals' });
|
|
|
95
95
|
|
|
96
96
|
const host = await mandible('code-pipeline')
|
|
97
97
|
.environment(env)
|
|
98
|
-
.host(docker({
|
|
99
|
-
apiUrl: process.env.MANDIBLE_API_URL!,
|
|
100
|
-
apiKey: process.env.MANDIBLE_API_KEY!,
|
|
101
|
-
image: 'mandible-colony:latest',
|
|
102
|
-
}))
|
|
98
|
+
.host(docker({ image: 'mandible-colony:latest' }))
|
|
103
99
|
.colony('shaper', shaper)
|
|
104
100
|
.colony('critic', critic)
|
|
105
101
|
.colony('keeper', keeper)
|
|
106
102
|
.start();
|
|
107
103
|
|
|
108
|
-
|
|
104
|
+
await host.dashboard(); // signal snapshots + colony names from containers
|
|
109
105
|
await host.stop();
|
|
110
106
|
```
|
|
111
107
|
|
|
112
|
-
#### Cloud (
|
|
108
|
+
#### Cloud (microVMs)
|
|
113
109
|
|
|
114
|
-
For production workloads, run colonies in isolated
|
|
110
|
+
For production workloads, run colonies in isolated zones via [Mandible Cloud](https://mandible.cloud):
|
|
115
111
|
|
|
116
112
|
```typescript
|
|
117
113
|
import { mandible, FilesystemEnvironment } from '@mandible-ai/mandible';
|
|
@@ -162,7 +158,7 @@ mandible dev mandible.config.ts --port 8080 # custom port
|
|
|
162
158
|
mandible dev mandible.config.ts --no-open # skip auto-opening browser
|
|
163
159
|
```
|
|
164
160
|
|
|
165
|
-
|
|
161
|
+

|
|
166
162
|
|
|
167
163
|
## Architecture
|
|
168
164
|
|
|
@@ -175,7 +171,7 @@ Every concept maps to a biological analogy:
|
|
|
175
171
|
| Mandible | Biology | Description |
|
|
176
172
|
|----------|---------|-------------|
|
|
177
173
|
| **Signal** | Pheromone | A typed marker deposited in the environment with a payload, concentration, and TTL. |
|
|
178
|
-
| **Environment** | Substrate | The shared medium agents read from and write to. Filesystem, GitHub,
|
|
174
|
+
| **Environment** | Substrate | The shared medium agents read from and write to. Filesystem, GitHub, Dolt. |
|
|
179
175
|
| **Colony** | Ant caste | A group of identical agents with shared sensors, rules, and claim strategy. |
|
|
180
176
|
| **Sensor** | Antennae | How a colony perceives signals. A query pattern like `task:ready` or `review:*`. |
|
|
181
177
|
| **Rule** | Instinct | A stimulus→response mapping: "when I sense X, do Y and deposit Z." |
|
|
@@ -221,17 +217,45 @@ const host = await mandible('my-swarm')
|
|
|
221
217
|
|
|
222
218
|
### Colony builder
|
|
223
219
|
|
|
224
|
-
|
|
220
|
+
Colony definitions are typically written as standalone configurator functions that return a `ColonyBuilder` callback. This keeps colony logic in its own module, reusable across hosts:
|
|
225
221
|
|
|
226
222
|
```typescript
|
|
227
|
-
|
|
228
|
-
|
|
223
|
+
// colonies/worker.ts
|
|
224
|
+
import type { ColonyBuilder } from '@mandible-ai/mandible';
|
|
225
|
+
|
|
226
|
+
export function configureWorker() {
|
|
227
|
+
return (c: ColonyBuilder) => c
|
|
228
|
+
.sense('task:ready', { unclaimed: true })
|
|
229
|
+
.do('process', async (signal, ctx) => {
|
|
230
|
+
ctx.log(`processing ${signal.id}`);
|
|
231
|
+
await ctx.deposit('task:done', signal.payload, {
|
|
232
|
+
causedBy: [signal.id],
|
|
233
|
+
});
|
|
234
|
+
await ctx.withdraw(signal.id);
|
|
235
|
+
})
|
|
236
|
+
.concurrency(1)
|
|
237
|
+
.claim('exclusive');
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Then wire it into a mandible system:
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
import { configureWorker } from './colonies/worker.js';
|
|
245
|
+
|
|
246
|
+
const host = await mandible('my-system')
|
|
247
|
+
.environment(env)
|
|
248
|
+
.colony('worker', configureWorker())
|
|
249
|
+
.start();
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
The builder supports the full range of colony configuration:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
(c: ColonyBuilder) => c
|
|
229
256
|
.sense('type:pattern', { unclaimed: true }) // what to watch for
|
|
230
257
|
.when(signal => signal.payload.priority > 0) // optional guard
|
|
231
|
-
.do('shape',
|
|
232
|
-
prompt: signal => `Implement: ${signal.payload.name}`,
|
|
233
|
-
allowedTools: ['Read', 'Write'],
|
|
234
|
-
}))
|
|
258
|
+
.do('shape', handler) // action handler
|
|
235
259
|
.concurrency(3) // max parallel agents
|
|
236
260
|
.claim('lease', 30_000) // claim strategy
|
|
237
261
|
.poll(2000) // sensor poll interval (ms)
|
|
@@ -239,7 +263,6 @@ colony('name')
|
|
|
239
263
|
.autoWithdraw() // auto-remove processed signals
|
|
240
264
|
.timeout(60_000) // action timeout
|
|
241
265
|
.retry(3, 1000) // retry with backoff
|
|
242
|
-
.build();
|
|
243
266
|
```
|
|
244
267
|
|
|
245
268
|
**Claim strategies:**
|
|
@@ -400,7 +423,7 @@ src/
|
|
|
400
423
|
server.ts Dashboard HTTP + WebSocket server
|
|
401
424
|
dashboard.html Live dashboard UI
|
|
402
425
|
cloud/
|
|
403
|
-
index.ts Cloud client for
|
|
426
|
+
index.ts Cloud client for deploy + bundle upload
|
|
404
427
|
core/
|
|
405
428
|
types.ts Core type system (Signal, Environment, Colony, Trust)
|
|
406
429
|
signal.ts Signal creation, matching, decay, priority sorting
|
|
@@ -426,6 +449,7 @@ src/
|
|
|
426
449
|
sentinel.ts Sentinel — trust monitoring and violation reporting
|
|
427
450
|
|
|
428
451
|
tests/
|
|
452
|
+
cli/ Dashboard server, resolveEnvironments tests
|
|
429
453
|
core/ Signal, runtime, attestation tests
|
|
430
454
|
environments/ Filesystem, GitHub adapter tests
|
|
431
455
|
dsl/ DSL and mandible() builder tests
|
|
@@ -484,11 +508,11 @@ Both colonies are wired to real Claude agents via `withClaudeCode`. The dashboar
|
|
|
484
508
|
|
|
485
509
|
- [x] `mandible dev` CLI + live dashboard
|
|
486
510
|
- [x] `withClaudeCode` wired to Claude Code SDK
|
|
487
|
-
- [x] Test suite (
|
|
511
|
+
- [x] Test suite (462 tests, 95%+ coverage)
|
|
488
512
|
- [x] GitHub environment adapter
|
|
489
513
|
- [x] `mandible()` DSL with Host/Environment separation
|
|
490
514
|
- [x] `local()` and `docker()` host implementations
|
|
491
|
-
- [
|
|
515
|
+
- [x] `@mandible-ai/cloud` — run colonies in isolation using microVMs via Mandible Cloud
|
|
492
516
|
- [ ] `create-mandible` starter template
|
|
493
517
|
- [ ] Dashboard GIF + landing page
|
|
494
518
|
- [ ] Dolt full implementation
|
|
@@ -40,16 +40,6 @@ for (const task of SEED_TASKS) {
|
|
|
40
40
|
});
|
|
41
41
|
console.log(` seeded: task:ready "${task.name}"`);
|
|
42
42
|
}
|
|
43
|
-
console.log('\nColonies are self-organizing. Watch
|
|
44
|
-
|
|
45
|
-
// Let colonies work
|
|
46
|
-
await new Promise(r => setTimeout(r, 20_000));
|
|
47
|
-
// Report
|
|
48
|
-
const snapshot = await env.snapshot();
|
|
49
|
-
console.log(`\nActive signals: ${snapshot.length}`);
|
|
50
|
-
for (const s of snapshot) {
|
|
51
|
-
console.log(` [${s.type}] ${s.payload.task ?? s.payload.name ?? '?'}`);
|
|
52
|
-
}
|
|
53
|
-
await host.stop();
|
|
54
|
-
console.log('Stopped.');
|
|
43
|
+
console.log('\nColonies are self-organizing. Watch the dashboard.\n');
|
|
44
|
+
await host.dashboard({ port: 4040 });
|
|
55
45
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../examples/code-pipeline/index.ts"],"names":[],"mappings":";AACA,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,4DAA4D;AAC5D,4DAA4D;AAC5D,+BAA+B;AAC/B,EAAE;AACF,+BAA+B;AAC/B,uDAAuD;AACvD,+BAA+B;AAC/B,EAAE;AACF,UAAU;AACV,4CAA4C;AAC5C,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE/C,cAAc;AACd,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3C,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAEjF,qEAAqE;AACrE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC;KACzC,WAAW,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,KAAK,EAAE,CAAC;AAEX,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,gBAAgB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;AAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC;AAE1C,kCAAkC;AAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;IAC9B,MAAM,GAAG,CAAC,OAAO,CAAC;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;KACtD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../examples/code-pipeline/index.ts"],"names":[],"mappings":";AACA,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,4DAA4D;AAC5D,4DAA4D;AAC5D,+BAA+B;AAC/B,EAAE;AACF,+BAA+B;AAC/B,uDAAuD;AACvD,+BAA+B;AAC/B,EAAE;AACF,UAAU;AACV,4CAA4C;AAC5C,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE/C,cAAc;AACd,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3C,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;AAEjF,qEAAqE;AACrE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC;KACzC,WAAW,CAAC,GAAG,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;KACxB,KAAK,EAAE,CAAC;AAEX,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,gBAAgB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;AAC7E,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC;AAE1C,kCAAkC;AAClC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;IAC9B,MAAM,GAAG,CAAC,OAAO,CAAC;QAChB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;KACtD,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;AAEtE,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -18,30 +18,20 @@
|
|
|
18
18
|
// ============================================================
|
|
19
19
|
import { resolve } from 'node:path';
|
|
20
20
|
import { rm, mkdir } from 'node:fs/promises';
|
|
21
|
-
import { FilesystemEnvironment } from '../../src/
|
|
22
|
-
import { colony } from '../../src/dsl/index.js';
|
|
23
|
-
import { createRuntime } from '../../src/core/runtime.js';
|
|
24
|
-
import { withClaudeCode } from '../../src/providers/claude-code.js';
|
|
25
|
-
import { withStructuredOutput } from '../../src/providers/structured-output.js';
|
|
26
|
-
import { withBash } from '../../src/providers/bash.js';
|
|
27
|
-
import { assembleContext } from '../../src/providers/context.js';
|
|
21
|
+
import { mandible, FilesystemEnvironment, withClaudeCode, withStructuredOutput, withBash, assembleContext, } from '../../src/index.js';
|
|
28
22
|
const ENV_ROOT = resolve('/tmp/stigmergy-demo-providers');
|
|
29
23
|
const WORKSPACE = resolve('/tmp/stigmergy-workspace');
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
console.log(`📁 Workspace: ${WORKSPACE}\n`);
|
|
37
|
-
}
|
|
24
|
+
// Clean slate
|
|
25
|
+
await rm(ENV_ROOT, { recursive: true, force: true });
|
|
26
|
+
await rm(WORKSPACE, { recursive: true, force: true });
|
|
27
|
+
await mkdir(ENV_ROOT, { recursive: true });
|
|
28
|
+
await mkdir(WORKSPACE, { recursive: true });
|
|
29
|
+
const env = new FilesystemEnvironment({ root: ENV_ROOT, name: 'code-pipeline' });
|
|
38
30
|
// ----------------------------------------------------------
|
|
39
|
-
// Colony
|
|
31
|
+
// Colony configurators using real providers
|
|
40
32
|
// ----------------------------------------------------------
|
|
41
|
-
function
|
|
42
|
-
|
|
43
|
-
const shaperDef = colony('shaper')
|
|
44
|
-
.in(env)
|
|
33
|
+
function shaper(c) {
|
|
34
|
+
return c
|
|
45
35
|
.sense('task:ready', { unclaimed: true, minConcentration: 0.1 })
|
|
46
36
|
.do('shape-code', withClaudeCode({
|
|
47
37
|
model: 'claude-sonnet-4-5-20250929',
|
|
@@ -53,7 +43,6 @@ function defineColonies(env) {
|
|
|
53
43
|
'Be concise — implement exactly what is asked, nothing more.',
|
|
54
44
|
].join('\n'),
|
|
55
45
|
prompt: async (signal) => {
|
|
56
|
-
// Assemble context from signal lineage
|
|
57
46
|
const context = await assembleContext(signal, env, {
|
|
58
47
|
includeLineage: true,
|
|
59
48
|
includeRelated: ['review:changes-needed'],
|
|
@@ -76,12 +65,11 @@ function defineColonies(env) {
|
|
|
76
65
|
},
|
|
77
66
|
}))
|
|
78
67
|
.concurrency(2)
|
|
79
|
-
.claim('lease', 120_000)
|
|
80
|
-
.poll(2000)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.in(env)
|
|
68
|
+
.claim('lease', 120_000)
|
|
69
|
+
.poll(2000);
|
|
70
|
+
}
|
|
71
|
+
function critic(c) {
|
|
72
|
+
return c
|
|
85
73
|
.sense('artifact:shaped', { unclaimed: true, minConcentration: 0.1 })
|
|
86
74
|
.do('review-code', withStructuredOutput({
|
|
87
75
|
model: 'claude-sonnet-4-5-20250929',
|
|
@@ -112,13 +100,6 @@ function defineColonies(env) {
|
|
|
112
100
|
'Review this artifact and provide your assessment.',
|
|
113
101
|
].join('\n');
|
|
114
102
|
},
|
|
115
|
-
// Schema would be a Zod object in real usage:
|
|
116
|
-
// schema: z.object({
|
|
117
|
-
// approved: z.boolean(),
|
|
118
|
-
// feedback: z.string(),
|
|
119
|
-
// severity: z.enum(['minor', 'major', 'blocking']),
|
|
120
|
-
// suggestions: z.array(z.string()).optional(),
|
|
121
|
-
// }),
|
|
122
103
|
route: (result, signal) => {
|
|
123
104
|
if (result.approved) {
|
|
124
105
|
return {
|
|
@@ -137,19 +118,15 @@ function defineColonies(env) {
|
|
|
137
118
|
}))
|
|
138
119
|
.concurrency(2)
|
|
139
120
|
.claim('lease', 60_000)
|
|
140
|
-
.poll(2000)
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
.in(env)
|
|
121
|
+
.poll(2000);
|
|
122
|
+
}
|
|
123
|
+
function keeper(c) {
|
|
124
|
+
return c
|
|
145
125
|
.sense('review:approved', { unclaimed: true, minConcentration: 0.1 })
|
|
146
126
|
.do('merge-artifact', withBash({
|
|
147
127
|
command: (signal) => {
|
|
148
128
|
const artifact = signal.payload.artifact ?? {};
|
|
149
129
|
const task = artifact.task ?? artifact.name ?? 'unknown';
|
|
150
|
-
// In a real setup this would be:
|
|
151
|
-
// git merge feature/${task} --no-ff -m "Merge: ${task}"
|
|
152
|
-
// For the demo, we just echo success
|
|
153
130
|
return `echo "Merged artifact: ${task}" && date`;
|
|
154
131
|
},
|
|
155
132
|
cwd: WORKSPACE,
|
|
@@ -180,66 +157,34 @@ function defineColonies(env) {
|
|
|
180
157
|
}))
|
|
181
158
|
.concurrency(1)
|
|
182
159
|
.claim('exclusive')
|
|
183
|
-
.poll(2000)
|
|
184
|
-
.build();
|
|
185
|
-
return { shaperDef, criticDef, keeperDef };
|
|
160
|
+
.poll(2000);
|
|
186
161
|
}
|
|
187
162
|
// ----------------------------------------------------------
|
|
188
|
-
//
|
|
163
|
+
// Start via mandible DSL
|
|
189
164
|
// ----------------------------------------------------------
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
type: 'task:ready',
|
|
212
|
-
payload: task,
|
|
213
|
-
meta: { deposited_by: 'orchestrator', tags: [task.priority] },
|
|
214
|
-
});
|
|
215
|
-
console.log(` → task:ready "${task.name}" (${signal.id})`);
|
|
216
|
-
}
|
|
217
|
-
console.log('\n' + '─'.repeat(60));
|
|
218
|
-
console.log(' Colonies self-organizing with real LLM providers.');
|
|
219
|
-
console.log(' Shaper: Claude Code SDK | Critic: Anthropic | Keeper: Bash');
|
|
220
|
-
console.log('─'.repeat(60) + '\n');
|
|
221
|
-
// Let colonies work
|
|
222
|
-
await sleep(60_000);
|
|
223
|
-
// Report
|
|
224
|
-
console.log('\n' + '═'.repeat(60));
|
|
225
|
-
const snapshot = await env.snapshot();
|
|
226
|
-
console.log(`\n Active signals: ${snapshot.length}`);
|
|
227
|
-
for (const s of snapshot) {
|
|
228
|
-
console.log(` [${s.type}] ${JSON.stringify(s.payload).slice(0, 80)}`);
|
|
229
|
-
}
|
|
230
|
-
console.log('\n Colony stats:');
|
|
231
|
-
console.log(` Shaper: ${shaperRuntime.stats.signalsProcessed} processed`);
|
|
232
|
-
console.log(` Critic: ${criticRuntime.stats.signalsProcessed} processed`);
|
|
233
|
-
console.log(` Keeper: ${keeperRuntime.stats.signalsProcessed} processed`);
|
|
234
|
-
await Promise.all([
|
|
235
|
-
shaperRuntime.stop(),
|
|
236
|
-
criticRuntime.stop(),
|
|
237
|
-
keeperRuntime.stop(),
|
|
238
|
-
]);
|
|
239
|
-
console.log('\n✅ Done.\n');
|
|
240
|
-
}
|
|
241
|
-
function sleep(ms) {
|
|
242
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
165
|
+
const host = await mandible('code-pipeline-providers')
|
|
166
|
+
.environment(env)
|
|
167
|
+
.colony('shaper', shaper)
|
|
168
|
+
.colony('critic', critic)
|
|
169
|
+
.colony('keeper', keeper)
|
|
170
|
+
.start();
|
|
171
|
+
console.log(`Started ${host.colonies.length} colonies on ${host.name} host`);
|
|
172
|
+
console.log(`Environment: ${ENV_ROOT}`);
|
|
173
|
+
console.log(`Workspace: ${WORKSPACE}\n`);
|
|
174
|
+
// Seed tasks
|
|
175
|
+
const tasks = [
|
|
176
|
+
{ name: 'auth-middleware', priority: 'high', description: 'Add JWT authentication middleware for Express' },
|
|
177
|
+
{ name: 'rate-limiter', priority: 'medium', description: 'Implement sliding window rate limiter' },
|
|
178
|
+
];
|
|
179
|
+
for (const task of tasks) {
|
|
180
|
+
await env.deposit({
|
|
181
|
+
type: 'task:ready',
|
|
182
|
+
payload: task,
|
|
183
|
+
meta: { deposited_by: 'seed', tags: [task.priority] },
|
|
184
|
+
});
|
|
185
|
+
console.log(` seeded: task:ready "${task.name}"`);
|
|
243
186
|
}
|
|
244
|
-
|
|
187
|
+
console.log('\nColonies self-organizing with real LLM providers.');
|
|
188
|
+
console.log('Shaper: Claude Code SDK | Critic: Anthropic | Keeper: Bash\n');
|
|
189
|
+
await host.dashboard({ port: 4040 });
|
|
245
190
|
//# sourceMappingURL=with-providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-providers.js","sourceRoot":"","sources":["../../../examples/code-pipeline/with-providers.ts"],"names":[],"mappings":";AACA,+DAA+D;AAC/D,+CAA+C;AAC/C,+DAA+D;AAC/D,wDAAwD;AACxD,uCAAuC;AACvC,EAAE;AACF,gEAAgE;AAChE,gEAAgE;AAChE,gCAAgC;AAChC,EAAE;AACF,iBAAiB;AACjB,iEAAiE;AACjE,wCAAwC;AACxC,EAAE;AACF,OAAO;AACP,qDAAqD;AACrD,+DAA+D;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"with-providers.js","sourceRoot":"","sources":["../../../examples/code-pipeline/with-providers.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -106,8 +106,30 @@ async function runDev(devArgs) {
|
|
|
106
106
|
process.exit(1);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
|
-
const {
|
|
110
|
-
|
|
109
|
+
const { startDashboard, LocalDashboardSource, resolveEnvironments } = await import('./server.js');
|
|
110
|
+
const { createRuntime, ColonyRuntime } = await import('../core/runtime.js');
|
|
111
|
+
const { EventBus } = await import('../core/events.js');
|
|
112
|
+
const environments = resolveEnvironments(config);
|
|
113
|
+
if (environments.length === 0) {
|
|
114
|
+
console.error('Config requires at least one environment or colonies with environments');
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
const eventBus = new EventBus();
|
|
118
|
+
const runtimes = config.colonies.map((def) => createRuntime(def, { eventBus }));
|
|
119
|
+
console.log(` starting ${runtimes.length} colonies...`);
|
|
120
|
+
for (const rt of runtimes) {
|
|
121
|
+
await rt.start();
|
|
122
|
+
console.log(` + ${rt.name} [running]`);
|
|
123
|
+
}
|
|
124
|
+
console.log('');
|
|
125
|
+
const source = new LocalDashboardSource(eventBus, environments, () => runtimes.map(rt => ({
|
|
126
|
+
name: rt.name,
|
|
127
|
+
state: rt.state,
|
|
128
|
+
activeCount: rt.activeCount,
|
|
129
|
+
concurrency: rt.concurrency,
|
|
130
|
+
stats: rt.stats,
|
|
131
|
+
})));
|
|
132
|
+
await startDashboard(source, { port, open: openBrowser });
|
|
111
133
|
}
|
|
112
134
|
main().catch((err) => {
|
|
113
135
|
console.error(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/server.d.ts
CHANGED
|
@@ -1,21 +1,66 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { RuntimeEventData } from '../core/events.js';
|
|
2
|
+
import { EventBus } from '../core/events.js';
|
|
3
|
+
import type { ColonyDefinition, Environment, Signal } from '../core/types.js';
|
|
4
|
+
export interface ColonyInfo {
|
|
5
|
+
name: string;
|
|
6
|
+
state: string;
|
|
7
|
+
activeCount: number;
|
|
8
|
+
concurrency: number;
|
|
9
|
+
stats: {
|
|
10
|
+
signalsSensed: number;
|
|
11
|
+
signalsClaimed: number;
|
|
12
|
+
signalsProcessed: number;
|
|
13
|
+
signalsDeposited: number;
|
|
14
|
+
claimConflicts: number;
|
|
15
|
+
errors: number;
|
|
16
|
+
avgProcessingMs: number;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export interface DashboardSource {
|
|
20
|
+
/** Subscribe to runtime events */
|
|
21
|
+
onEvent(callback: (event: RuntimeEventData) => void): void;
|
|
22
|
+
/** Get current signal snapshot across all environments */
|
|
23
|
+
snapshot(): Promise<Signal[]>;
|
|
24
|
+
/** Get colony info */
|
|
25
|
+
colonies(): ColonyInfo[];
|
|
26
|
+
/** Get environment names */
|
|
27
|
+
environments(): string[];
|
|
28
|
+
/** Deposit a signal from the dashboard inspector */
|
|
29
|
+
deposit(type: string, payload: Record<string, unknown>, env?: string, tags?: string[]): Promise<Signal>;
|
|
30
|
+
/** Events buffered before dashboard started */
|
|
31
|
+
readonly bufferedEvents: RuntimeEventData[];
|
|
32
|
+
/** Cleanup */
|
|
33
|
+
close(): void;
|
|
6
34
|
}
|
|
7
|
-
export
|
|
35
|
+
export declare class LocalDashboardSource implements DashboardSource {
|
|
36
|
+
private eventBus;
|
|
37
|
+
private envs;
|
|
38
|
+
private colonyInfoFn;
|
|
39
|
+
private _bufferedEvents;
|
|
40
|
+
constructor(eventBus: EventBus, envs: Environment[], colonyInfoFn: () => ColonyInfo[], _bufferedEvents?: RuntimeEventData[]);
|
|
41
|
+
onEvent(cb: (event: RuntimeEventData) => void): void;
|
|
42
|
+
snapshot(): Promise<Signal[]>;
|
|
43
|
+
colonies(): ColonyInfo[];
|
|
44
|
+
environments(): string[];
|
|
45
|
+
deposit(type: string, payload: Record<string, unknown>, env?: string, tags?: string[]): Promise<Signal>;
|
|
46
|
+
get bufferedEvents(): RuntimeEventData[];
|
|
47
|
+
close(): void;
|
|
48
|
+
}
|
|
49
|
+
export interface SimpleConfig {
|
|
8
50
|
environment?: Environment;
|
|
9
|
-
|
|
51
|
+
environments?: Environment[];
|
|
10
52
|
colonies: ColonyDefinition[];
|
|
11
|
-
dashboard?: {
|
|
12
|
-
port?: number;
|
|
13
|
-
open?: boolean;
|
|
14
|
-
};
|
|
15
53
|
}
|
|
16
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Resolve environments from config with 3-tier fallback:
|
|
56
|
+
* 1. Explicit environments[] array
|
|
57
|
+
* 2. Singular environment field
|
|
58
|
+
* 3. Auto-discover from colony definitions (deduplicated by name)
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveEnvironments(config: SimpleConfig): Environment[];
|
|
61
|
+
export interface DashboardOptions {
|
|
17
62
|
port: number;
|
|
18
63
|
open: boolean;
|
|
19
64
|
}
|
|
20
|
-
export declare function
|
|
65
|
+
export declare function startDashboard(source: DashboardSource, options: DashboardOptions): Promise<void>;
|
|
21
66
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/cli/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/cli/server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM9E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3D,0DAA0D;IAC1D,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,sBAAsB;IACtB,QAAQ,IAAI,UAAU,EAAE,CAAC;IACzB,4BAA4B;IAC5B,YAAY,IAAI,MAAM,EAAE,CAAC;IACzB,oDAAoD;IACpD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxG,+CAA+C;IAC/C,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;IAC5C,cAAc;IACd,KAAK,IAAI,IAAI,CAAC;CACf;AAID,qBAAa,oBAAqB,YAAW,eAAe;IAExD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,eAAe;gBAHf,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,WAAW,EAAE,EACnB,YAAY,EAAE,MAAM,UAAU,EAAE,EAChC,eAAe,GAAE,gBAAgB,EAAO;IAGlD,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,IAAI;IAI9C,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYnC,QAAQ,IAAI,UAAU,EAAE;IAIxB,YAAY,IAAI,MAAM,EAAE;IAIlB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAW7G,IAAI,cAAc,IAAI,gBAAgB,EAAE,CAEvC;IAED,KAAK,IAAI,IAAI;CAGd;AAID,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,EAAE,CAavE;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuHf"}
|