@mandible-ai/mandible 0.3.6 → 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 +45 -21
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -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';
|
|
@@ -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
|
package/dist/src/index.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export { createBridge } from './patterns/bridge.js';
|
|
|
22
22
|
export type { SignalBridge, BridgeStats } from './patterns/bridge.js';
|
|
23
23
|
export { createSentinel } from './patterns/sentinel.js';
|
|
24
24
|
export type { Sentinel, SentinelConfig, SentinelEvaluation, SentinelStats } from './patterns/sentinel.js';
|
|
25
|
+
export { createDebugBridge } from './patterns/debug-bridge.js';
|
|
26
|
+
export type { DebugBridge, DebugBridgeConfig } from './patterns/debug-bridge.js';
|
|
25
27
|
export { startDashboard, LocalDashboardSource, resolveEnvironments } from './cli/server.js';
|
|
26
28
|
export type { DashboardSource, ColonyInfo, DashboardOptions as DashboardServerOptions, SimpleConfig } from './cli/server.js';
|
|
27
29
|
export { withClaudeCode } from './providers/claude-code.js';
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,MAAM,EACN,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,IAAI,EACJ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,IAAI,cAAc,EAC/B,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EAEX,IAAI,EAEJ,UAAU,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKrF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG9E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGjG,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAGlF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -30,6 +30,7 @@ export { generateIdentity, signSignal, createSigner, verifySignature, verifyAtte
|
|
|
30
30
|
// Patterns — reusable colony patterns
|
|
31
31
|
export { createBridge } from './patterns/bridge.js';
|
|
32
32
|
export { createSentinel } from './patterns/sentinel.js';
|
|
33
|
+
export { createDebugBridge } from './patterns/debug-bridge.js';
|
|
33
34
|
// Dashboard
|
|
34
35
|
export { startDashboard, LocalDashboardSource, resolveEnvironments } from './cli/server.js';
|
|
35
36
|
// Action providers
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAkC/D,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,iBAAiB;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,qDAAqD;AACrD,qDAAqD;AACrD,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGvD,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAElF,uBAAuB;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,kCAAkC;AAClC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG5F,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wBAAwB;AACxB,+DAA+D;AAkC/D,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,iBAAiB;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,qDAAqD;AACrD,qDAAqD;AACrD,gFAAgF;AAChF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGvD,UAAU;AACV,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,aAAa;AACb,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAElF,uBAAuB;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAInE,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,kCAAkC;AAClC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG5F,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Signal, Environment } from '../core/types.js';
|
|
2
|
+
import type { BridgeStats } from './bridge.js';
|
|
3
|
+
export interface DebugBridgeConfig {
|
|
4
|
+
/** Human-readable name for this bridge instance */
|
|
5
|
+
name?: string;
|
|
6
|
+
/** Signal server WebSocket URL */
|
|
7
|
+
url: string;
|
|
8
|
+
/** API key for signal server authentication */
|
|
9
|
+
apiKey: string;
|
|
10
|
+
/** Project ID for signal isolation */
|
|
11
|
+
project: string;
|
|
12
|
+
/** Target environment — inbound signals are deposited here */
|
|
13
|
+
environment: Environment;
|
|
14
|
+
/** Signal type filter patterns sent to the signal server (default: ['*']) */
|
|
15
|
+
signalTypes?: string[];
|
|
16
|
+
/** Auto-reconnect on disconnect (default: true) */
|
|
17
|
+
reconnect?: boolean;
|
|
18
|
+
/** Callback when a signal is successfully bridged */
|
|
19
|
+
onBridged?: (signal: Signal) => void;
|
|
20
|
+
/** Callback on errors */
|
|
21
|
+
onError?: (error: Error) => void;
|
|
22
|
+
/** Connection timeout in ms (default: 10000) */
|
|
23
|
+
connectTimeout?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface DebugBridge {
|
|
26
|
+
start(): Promise<void>;
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
readonly running: boolean;
|
|
29
|
+
readonly stats: BridgeStats;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a debug bridge that subscribes to signals from a signal server
|
|
33
|
+
* and deposits them into a local environment.
|
|
34
|
+
*
|
|
35
|
+
* This is a one-way gate: signal server → environment. It enables ad-hoc
|
|
36
|
+
* testing from the cloud console's deposit drawer.
|
|
37
|
+
*
|
|
38
|
+
* Usage:
|
|
39
|
+
* const bridge = createDebugBridge({
|
|
40
|
+
* url: 'ws://localhost:8080/ws',
|
|
41
|
+
* apiKey: 'mnd_...',
|
|
42
|
+
* project: 'my-project',
|
|
43
|
+
* environment: localEnv,
|
|
44
|
+
* });
|
|
45
|
+
* await bridge.start();
|
|
46
|
+
*/
|
|
47
|
+
export declare function createDebugBridge(config: DebugBridgeConfig): DebugBridge;
|
|
48
|
+
//# sourceMappingURL=debug-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-bridge.d.ts","sourceRoot":"","sources":["../../../src/patterns/debug-bridge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IAEZ,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IAEf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAEhB,8DAA8D;IAC9D,WAAW,EAAE,WAAW,CAAC;IAEzB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAiMxE"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// PURPOSE: DebugBridge — one-way gate from signal server to a local environment.
|
|
2
|
+
// PURPOSE: Enables ad-hoc testing: console deposits a signal → bridge carries it into the colony's real environment.
|
|
3
|
+
import WebSocket from 'ws';
|
|
4
|
+
const PING_INTERVAL = 30_000;
|
|
5
|
+
const PONG_TIMEOUT = 10_000;
|
|
6
|
+
const MAX_BACKOFF = 30_000;
|
|
7
|
+
const MAX_TRACKED = 10_000;
|
|
8
|
+
const DEFAULT_CONNECT_TIMEOUT = 10_000;
|
|
9
|
+
/**
|
|
10
|
+
* Create a debug bridge that subscribes to signals from a signal server
|
|
11
|
+
* and deposits them into a local environment.
|
|
12
|
+
*
|
|
13
|
+
* This is a one-way gate: signal server → environment. It enables ad-hoc
|
|
14
|
+
* testing from the cloud console's deposit drawer.
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* const bridge = createDebugBridge({
|
|
18
|
+
* url: 'ws://localhost:8080/ws',
|
|
19
|
+
* apiKey: 'mnd_...',
|
|
20
|
+
* project: 'my-project',
|
|
21
|
+
* environment: localEnv,
|
|
22
|
+
* });
|
|
23
|
+
* await bridge.start();
|
|
24
|
+
*/
|
|
25
|
+
export function createDebugBridge(config) {
|
|
26
|
+
const name = config.name ?? 'debug-bridge';
|
|
27
|
+
const signalTypes = config.signalTypes ?? ['*'];
|
|
28
|
+
const shouldReconnect = config.reconnect !== false;
|
|
29
|
+
const connectTimeout = config.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT;
|
|
30
|
+
let running = false;
|
|
31
|
+
let intentionalClose = false;
|
|
32
|
+
let ws = null;
|
|
33
|
+
let pingTimer = null;
|
|
34
|
+
let pongTimer = null;
|
|
35
|
+
let reconnectTimer = null;
|
|
36
|
+
let attempt = 0;
|
|
37
|
+
let msgCounter = 0;
|
|
38
|
+
let pendingSubId = null;
|
|
39
|
+
// Dedup set — prevents re-depositing the same signal on reconnect
|
|
40
|
+
const bridgedIds = new Set();
|
|
41
|
+
const stats = {
|
|
42
|
+
signalsBridged: 0,
|
|
43
|
+
signalsFiltered: 0,
|
|
44
|
+
errors: 0,
|
|
45
|
+
};
|
|
46
|
+
function trackBridged(id) {
|
|
47
|
+
bridgedIds.add(id);
|
|
48
|
+
if (bridgedIds.size > MAX_TRACKED) {
|
|
49
|
+
const iter = bridgedIds.values();
|
|
50
|
+
for (let i = 0; i < MAX_TRACKED / 2; i++) {
|
|
51
|
+
bridgedIds.delete(iter.next().value);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function clearTimers() {
|
|
56
|
+
if (pingTimer) {
|
|
57
|
+
clearInterval(pingTimer);
|
|
58
|
+
pingTimer = null;
|
|
59
|
+
}
|
|
60
|
+
if (pongTimer) {
|
|
61
|
+
clearTimeout(pongTimer);
|
|
62
|
+
pongTimer = null;
|
|
63
|
+
}
|
|
64
|
+
if (reconnectTimer) {
|
|
65
|
+
clearTimeout(reconnectTimer);
|
|
66
|
+
reconnectTimer = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function scheduleReconnect() {
|
|
70
|
+
if (intentionalClose || !shouldReconnect)
|
|
71
|
+
return;
|
|
72
|
+
const delay = Math.min(1000 * 2 ** attempt, MAX_BACKOFF);
|
|
73
|
+
attempt++;
|
|
74
|
+
reconnectTimer = setTimeout(() => {
|
|
75
|
+
if (!intentionalClose && running) {
|
|
76
|
+
connectWs();
|
|
77
|
+
}
|
|
78
|
+
}, delay);
|
|
79
|
+
}
|
|
80
|
+
function connectWs(onAuthenticated, onFailed) {
|
|
81
|
+
const socket = new WebSocket(config.url);
|
|
82
|
+
ws = socket;
|
|
83
|
+
socket.on('open', () => {
|
|
84
|
+
attempt = 0;
|
|
85
|
+
socket.send(JSON.stringify({ type: 'auth', apiKey: config.apiKey, project: config.project }));
|
|
86
|
+
});
|
|
87
|
+
socket.on('message', (raw) => {
|
|
88
|
+
let msg;
|
|
89
|
+
try {
|
|
90
|
+
msg = JSON.parse(typeof raw === 'string' ? raw : raw.toString());
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (msg.type === 'authenticated') {
|
|
96
|
+
// Start keepalive pings
|
|
97
|
+
pingTimer = setInterval(() => {
|
|
98
|
+
if (socket.readyState === WebSocket.OPEN) {
|
|
99
|
+
socket.ping();
|
|
100
|
+
pongTimer = setTimeout(() => {
|
|
101
|
+
socket.terminate();
|
|
102
|
+
}, PONG_TIMEOUT);
|
|
103
|
+
}
|
|
104
|
+
}, PING_INTERVAL);
|
|
105
|
+
// Subscribe to inbound signals — wait for server ack before resolving
|
|
106
|
+
const subId = `debug_bridge_${++msgCounter}`;
|
|
107
|
+
pendingSubId = subId;
|
|
108
|
+
socket.send(JSON.stringify({
|
|
109
|
+
type: 'subscribe',
|
|
110
|
+
id: subId,
|
|
111
|
+
query: { type: signalTypes.length === 1 ? signalTypes[0] : signalTypes },
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
else if (msg.type === 'result' && msg.id === pendingSubId) {
|
|
115
|
+
pendingSubId = null;
|
|
116
|
+
onAuthenticated?.();
|
|
117
|
+
}
|
|
118
|
+
else if (msg.type === 'signal' && msg.signal) {
|
|
119
|
+
const sig = msg.signal;
|
|
120
|
+
if (bridgedIds.has(sig.id))
|
|
121
|
+
return;
|
|
122
|
+
trackBridged(sig.id);
|
|
123
|
+
config.environment.deposit({
|
|
124
|
+
type: sig.type,
|
|
125
|
+
payload: sig.payload,
|
|
126
|
+
meta: {
|
|
127
|
+
deposited_by: sig.meta?.deposited_by ?? 'console',
|
|
128
|
+
tags: sig.meta?.tags,
|
|
129
|
+
caused_by: sig.meta?.caused_by,
|
|
130
|
+
...(sig.meta?.ttl != null && { ttl: sig.meta.ttl }),
|
|
131
|
+
},
|
|
132
|
+
}).then(() => {
|
|
133
|
+
stats.signalsBridged++;
|
|
134
|
+
stats.lastBridgedAt = Date.now();
|
|
135
|
+
config.onBridged?.(sig);
|
|
136
|
+
}).catch((err) => {
|
|
137
|
+
stats.errors++;
|
|
138
|
+
config.onError?.(err instanceof Error ? err : new Error(String(err)));
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
else if (msg.type === 'error') {
|
|
142
|
+
const err = new Error(`signal server error: ${msg.code} — ${msg.message}`);
|
|
143
|
+
stats.errors++;
|
|
144
|
+
config.onError?.(err);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
socket.on('pong', () => {
|
|
148
|
+
if (pongTimer) {
|
|
149
|
+
clearTimeout(pongTimer);
|
|
150
|
+
pongTimer = null;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
socket.on('error', (err) => {
|
|
154
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
155
|
+
stats.errors++;
|
|
156
|
+
config.onError?.(error);
|
|
157
|
+
onFailed?.(error);
|
|
158
|
+
});
|
|
159
|
+
socket.on('close', () => {
|
|
160
|
+
clearTimers();
|
|
161
|
+
ws = null;
|
|
162
|
+
if (!intentionalClose && running) {
|
|
163
|
+
scheduleReconnect();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
start() {
|
|
169
|
+
if (running)
|
|
170
|
+
return Promise.resolve();
|
|
171
|
+
running = true;
|
|
172
|
+
intentionalClose = false;
|
|
173
|
+
attempt = 0;
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
let settled = false;
|
|
176
|
+
const timeout = setTimeout(() => {
|
|
177
|
+
if (!settled) {
|
|
178
|
+
settled = true;
|
|
179
|
+
reject(new Error(`[debug-bridge:${name}] connection timeout after ${connectTimeout}ms`));
|
|
180
|
+
}
|
|
181
|
+
}, connectTimeout);
|
|
182
|
+
connectWs(() => {
|
|
183
|
+
if (!settled) {
|
|
184
|
+
settled = true;
|
|
185
|
+
clearTimeout(timeout);
|
|
186
|
+
resolve();
|
|
187
|
+
}
|
|
188
|
+
}, (err) => {
|
|
189
|
+
if (!settled) {
|
|
190
|
+
settled = true;
|
|
191
|
+
clearTimeout(timeout);
|
|
192
|
+
reject(err);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
async stop() {
|
|
198
|
+
if (!running)
|
|
199
|
+
return;
|
|
200
|
+
running = false;
|
|
201
|
+
intentionalClose = true;
|
|
202
|
+
clearTimers();
|
|
203
|
+
if (ws) {
|
|
204
|
+
ws.close();
|
|
205
|
+
ws = null;
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
get running() {
|
|
209
|
+
return running;
|
|
210
|
+
},
|
|
211
|
+
get stats() {
|
|
212
|
+
return { ...stats };
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=debug-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-bridge.js","sourceRoot":"","sources":["../../../src/patterns/debug-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,6 @@ export { createBridge } from './bridge.js';
|
|
|
2
2
|
export type { SignalBridge, BridgeStats } from './bridge.js';
|
|
3
3
|
export { createSentinel } from './sentinel.js';
|
|
4
4
|
export type { Sentinel, SentinelConfig, SentinelEvaluation, SentinelStats } from './sentinel.js';
|
|
5
|
+
export { createDebugBridge } from './debug-bridge.js';
|
|
6
|
+
export type { DebugBridge, DebugBridgeConfig } from './debug-bridge.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/package.json
CHANGED