@mandible-ai/mandible 0.2.0
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 +391 -0
- package/dist/examples/code-pipeline/index.d.ts +3 -0
- package/dist/examples/code-pipeline/index.d.ts.map +1 -0
- package/dist/examples/code-pipeline/index.js +239 -0
- package/dist/examples/code-pipeline/index.js.map +1 -0
- package/dist/examples/code-pipeline/with-providers.d.ts +3 -0
- package/dist/examples/code-pipeline/with-providers.d.ts.map +1 -0
- package/dist/examples/code-pipeline/with-providers.js +246 -0
- package/dist/examples/code-pipeline/with-providers.js.map +1 -0
- package/dist/examples/docker-pipeline/index.d.ts +3 -0
- package/dist/examples/docker-pipeline/index.d.ts.map +1 -0
- package/dist/examples/docker-pipeline/index.js +235 -0
- package/dist/examples/docker-pipeline/index.js.map +1 -0
- package/dist/examples/github-colony/mandible.config.d.ts +11 -0
- package/dist/examples/github-colony/mandible.config.d.ts.map +1 -0
- package/dist/examples/github-colony/mandible.config.js +63 -0
- package/dist/examples/github-colony/mandible.config.js.map +1 -0
- package/dist/examples/remote-pipeline/index.d.ts +3 -0
- package/dist/examples/remote-pipeline/index.d.ts.map +1 -0
- package/dist/examples/remote-pipeline/index.js +154 -0
- package/dist/examples/remote-pipeline/index.js.map +1 -0
- package/dist/examples/repo-maintenance/fixer.d.ts +80 -0
- package/dist/examples/repo-maintenance/fixer.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/fixer.js +217 -0
- package/dist/examples/repo-maintenance/fixer.js.map +1 -0
- package/dist/examples/repo-maintenance/mandible.config.d.ts +11 -0
- package/dist/examples/repo-maintenance/mandible.config.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/mandible.config.js +34 -0
- package/dist/examples/repo-maintenance/mandible.config.js.map +1 -0
- package/dist/examples/repo-maintenance/scout.d.ts +39 -0
- package/dist/examples/repo-maintenance/scout.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/scout.js +163 -0
- package/dist/examples/repo-maintenance/scout.js.map +1 -0
- package/dist/examples/repo-maintenance/seed.d.ts +3 -0
- package/dist/examples/repo-maintenance/seed.d.ts.map +1 -0
- package/dist/examples/repo-maintenance/seed.js +169 -0
- package/dist/examples/repo-maintenance/seed.js.map +1 -0
- package/dist/src/cli/index.d.ts +3 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +116 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/server.d.ts +15 -0
- package/dist/src/cli/server.d.ts.map +1 -0
- package/dist/src/cli/server.js +204 -0
- package/dist/src/cli/server.js.map +1 -0
- package/dist/src/cloud/client.d.ts +30 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js +124 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/index.d.ts +5 -0
- package/dist/src/cloud/index.d.ts.map +1 -0
- package/dist/src/cloud/index.js +3 -0
- package/dist/src/cloud/index.js.map +1 -0
- package/dist/src/cloud/types.d.ts +104 -0
- package/dist/src/cloud/types.d.ts.map +1 -0
- package/dist/src/cloud/types.js +9 -0
- package/dist/src/cloud/types.js.map +1 -0
- package/dist/src/core/attestation.d.ts +63 -0
- package/dist/src/core/attestation.d.ts.map +1 -0
- package/dist/src/core/attestation.js +331 -0
- package/dist/src/core/attestation.js.map +1 -0
- package/dist/src/core/events.d.ts +22 -0
- package/dist/src/core/events.d.ts.map +1 -0
- package/dist/src/core/events.js +45 -0
- package/dist/src/core/events.js.map +1 -0
- package/dist/src/core/index.d.ts +8 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +7 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/runtime.d.ts +57 -0
- package/dist/src/core/runtime.d.ts.map +1 -0
- package/dist/src/core/runtime.js +564 -0
- package/dist/src/core/runtime.js.map +1 -0
- package/dist/src/core/signal.d.ts +33 -0
- package/dist/src/core/signal.d.ts.map +1 -0
- package/dist/src/core/signal.js +127 -0
- package/dist/src/core/signal.js.map +1 -0
- package/dist/src/core/types.d.ts +395 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +19 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/validation.d.ts +10 -0
- package/dist/src/core/validation.d.ts.map +1 -0
- package/dist/src/core/validation.js +40 -0
- package/dist/src/core/validation.js.map +1 -0
- package/dist/src/dsl/builder.d.ts +63 -0
- package/dist/src/dsl/builder.d.ts.map +1 -0
- package/dist/src/dsl/builder.js +159 -0
- package/dist/src/dsl/builder.js.map +1 -0
- package/dist/src/dsl/index.d.ts +2 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js +2 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/environments/dolt/adapter.d.ts +45 -0
- package/dist/src/environments/dolt/adapter.d.ts.map +1 -0
- package/dist/src/environments/dolt/adapter.js +128 -0
- package/dist/src/environments/dolt/adapter.js.map +1 -0
- package/dist/src/environments/dolt/index.d.ts +2 -0
- package/dist/src/environments/dolt/index.d.ts.map +1 -0
- package/dist/src/environments/dolt/index.js +2 -0
- package/dist/src/environments/dolt/index.js.map +1 -0
- package/dist/src/environments/filesystem/adapter.d.ts +33 -0
- package/dist/src/environments/filesystem/adapter.d.ts.map +1 -0
- package/dist/src/environments/filesystem/adapter.js +296 -0
- package/dist/src/environments/filesystem/adapter.js.map +1 -0
- package/dist/src/environments/filesystem/index.d.ts +2 -0
- package/dist/src/environments/filesystem/index.d.ts.map +1 -0
- package/dist/src/environments/filesystem/index.js +2 -0
- package/dist/src/environments/filesystem/index.js.map +1 -0
- package/dist/src/environments/github/adapter.d.ts +47 -0
- package/dist/src/environments/github/adapter.d.ts.map +1 -0
- package/dist/src/environments/github/adapter.js +324 -0
- package/dist/src/environments/github/adapter.js.map +1 -0
- package/dist/src/environments/github/client.d.ts +48 -0
- package/dist/src/environments/github/client.d.ts.map +1 -0
- package/dist/src/environments/github/client.js +151 -0
- package/dist/src/environments/github/client.js.map +1 -0
- package/dist/src/environments/github/index.d.ts +5 -0
- package/dist/src/environments/github/index.d.ts.map +1 -0
- package/dist/src/environments/github/index.js +5 -0
- package/dist/src/environments/github/index.js.map +1 -0
- package/dist/src/environments/github/mapper.d.ts +66 -0
- package/dist/src/environments/github/mapper.d.ts.map +1 -0
- package/dist/src/environments/github/mapper.js +240 -0
- package/dist/src/environments/github/mapper.js.map +1 -0
- package/dist/src/environments/github/types.d.ts +71 -0
- package/dist/src/environments/github/types.d.ts.map +1 -0
- package/dist/src/environments/github/types.js +4 -0
- package/dist/src/environments/github/types.js.map +1 -0
- package/dist/src/environments/remote/adapter.d.ts +61 -0
- package/dist/src/environments/remote/adapter.d.ts.map +1 -0
- package/dist/src/environments/remote/adapter.js +392 -0
- package/dist/src/environments/remote/adapter.js.map +1 -0
- package/dist/src/environments/remote/index.d.ts +5 -0
- package/dist/src/environments/remote/index.d.ts.map +1 -0
- package/dist/src/environments/remote/index.js +3 -0
- package/dist/src/environments/remote/index.js.map +1 -0
- package/dist/src/environments/remote/protocol.d.ts +124 -0
- package/dist/src/environments/remote/protocol.d.ts.map +1 -0
- package/dist/src/environments/remote/protocol.js +24 -0
- package/dist/src/environments/remote/protocol.js.map +1 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +31 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/patterns/bridge.d.ts +32 -0
- package/dist/src/patterns/bridge.d.ts.map +1 -0
- package/dist/src/patterns/bridge.js +163 -0
- package/dist/src/patterns/bridge.js.map +1 -0
- package/dist/src/patterns/index.d.ts +5 -0
- package/dist/src/patterns/index.d.ts.map +1 -0
- package/dist/src/patterns/index.js +3 -0
- package/dist/src/patterns/index.js.map +1 -0
- package/dist/src/patterns/sentinel.d.ts +69 -0
- package/dist/src/patterns/sentinel.d.ts.map +1 -0
- package/dist/src/patterns/sentinel.js +184 -0
- package/dist/src/patterns/sentinel.js.map +1 -0
- package/dist/src/providers/agent.d.ts +23 -0
- package/dist/src/providers/agent.d.ts.map +1 -0
- package/dist/src/providers/agent.js +184 -0
- package/dist/src/providers/agent.js.map +1 -0
- package/dist/src/providers/bash.d.ts +13 -0
- package/dist/src/providers/bash.d.ts.map +1 -0
- package/dist/src/providers/bash.js +91 -0
- package/dist/src/providers/bash.js.map +1 -0
- package/dist/src/providers/claude-code.d.ts +23 -0
- package/dist/src/providers/claude-code.d.ts.map +1 -0
- package/dist/src/providers/claude-code.js +184 -0
- package/dist/src/providers/claude-code.js.map +1 -0
- package/dist/src/providers/context.d.ts +12 -0
- package/dist/src/providers/context.d.ts.map +1 -0
- package/dist/src/providers/context.js +160 -0
- package/dist/src/providers/context.js.map +1 -0
- package/dist/src/providers/index.d.ts +6 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +7 -0
- package/dist/src/providers/index.js.map +1 -0
- package/dist/src/providers/structured-output.d.ts +7 -0
- package/dist/src/providers/structured-output.d.ts.map +1 -0
- package/dist/src/providers/structured-output.js +316 -0
- package/dist/src/providers/structured-output.js.map +1 -0
- package/dist/src/providers/types.d.ts +239 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +19 -0
- package/dist/src/providers/types.js.map +1 -0
- package/package.json +129 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BridgeConfig } from '../core/types.js';
|
|
2
|
+
export interface BridgeStats {
|
|
3
|
+
signalsBridged: number;
|
|
4
|
+
signalsFiltered: number;
|
|
5
|
+
errors: number;
|
|
6
|
+
lastBridgedAt?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SignalBridge {
|
|
9
|
+
/** Start the bridge — begins watching/polling the source */
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
/** Stop the bridge gracefully */
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
/** Whether the bridge is currently running */
|
|
14
|
+
readonly running: boolean;
|
|
15
|
+
/** Bridge statistics */
|
|
16
|
+
readonly stats: BridgeStats;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a signal bridge between two environments.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* const bridge = createBridge({
|
|
23
|
+
* name: 'github-to-local',
|
|
24
|
+
* identity: bridgeId,
|
|
25
|
+
* source: githubEnv,
|
|
26
|
+
* target: localEnv,
|
|
27
|
+
* signalTypes: ['task:ready', 'review:*'],
|
|
28
|
+
* });
|
|
29
|
+
* await bridge.start();
|
|
30
|
+
*/
|
|
31
|
+
export declare function createBridge(config: BridgeConfig): SignalBridge;
|
|
32
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/patterns/bridge.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,YAAY,EAGb,MAAM,kBAAkB,CAAC;AAI1B,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,iCAAiC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CA0K/D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// SignalBridge — Colony Pattern for Cross-Environment Bridging
|
|
3
|
+
// ============================================================
|
|
4
|
+
// A bridge monitors one environment and mirrors matching signals
|
|
5
|
+
// to another, attesting each transfer with its own identity.
|
|
6
|
+
//
|
|
7
|
+
// Biological analogy: scout ants that carry pheromone markers
|
|
8
|
+
// between foraging trails, creating connections between colonies.
|
|
9
|
+
// ============================================================
|
|
10
|
+
import { prepareForBridge } from '../core/attestation.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create a signal bridge between two environments.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* const bridge = createBridge({
|
|
16
|
+
* name: 'github-to-local',
|
|
17
|
+
* identity: bridgeId,
|
|
18
|
+
* source: githubEnv,
|
|
19
|
+
* target: localEnv,
|
|
20
|
+
* signalTypes: ['task:ready', 'review:*'],
|
|
21
|
+
* });
|
|
22
|
+
* await bridge.start();
|
|
23
|
+
*/
|
|
24
|
+
export function createBridge(config) {
|
|
25
|
+
let running = false;
|
|
26
|
+
let forwardSub;
|
|
27
|
+
let reverseSub;
|
|
28
|
+
let forwardPoll;
|
|
29
|
+
let reversePoll;
|
|
30
|
+
// Track which signals we've already bridged (prevent loops)
|
|
31
|
+
const bridgedIds = new Set();
|
|
32
|
+
const MAX_TRACKED = 10_000;
|
|
33
|
+
const stats = {
|
|
34
|
+
signalsBridged: 0,
|
|
35
|
+
signalsFiltered: 0,
|
|
36
|
+
errors: 0,
|
|
37
|
+
};
|
|
38
|
+
function trackBridged(id) {
|
|
39
|
+
bridgedIds.add(id);
|
|
40
|
+
// Prevent unbounded memory growth
|
|
41
|
+
if (bridgedIds.size > MAX_TRACKED) {
|
|
42
|
+
const iter = bridgedIds.values();
|
|
43
|
+
for (let i = 0; i < MAX_TRACKED / 2; i++) {
|
|
44
|
+
bridgedIds.delete(iter.next().value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function buildQuery() {
|
|
49
|
+
return {
|
|
50
|
+
type: config.signalTypes,
|
|
51
|
+
unclaimed: false, // bridge all signals, not just unclaimed
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async function bridgeSignal(signal, from, to, fromName, toName) {
|
|
55
|
+
// Skip if we already bridged this signal (prevents loops in bidirectional)
|
|
56
|
+
if (bridgedIds.has(signal.id))
|
|
57
|
+
return;
|
|
58
|
+
// Skip signals that originated from the target (prevent echo)
|
|
59
|
+
if (signal.meta.sourceEnvironment === toName)
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
// Apply optional transform
|
|
63
|
+
let transformedSignal = signal;
|
|
64
|
+
if (config.transform) {
|
|
65
|
+
transformedSignal = config.transform(signal);
|
|
66
|
+
if (!transformedSignal) {
|
|
67
|
+
stats.signalsFiltered++;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Add attestation and bridge metadata
|
|
72
|
+
const bridgedSignal = await prepareForBridge(transformedSignal, fromName, toName, config.identity);
|
|
73
|
+
// Deposit in target environment
|
|
74
|
+
await to.deposit({
|
|
75
|
+
type: bridgedSignal.type,
|
|
76
|
+
payload: bridgedSignal.payload,
|
|
77
|
+
meta: {
|
|
78
|
+
...bridgedSignal.meta,
|
|
79
|
+
// Reset mutable state for the new environment
|
|
80
|
+
concentration: 1.0,
|
|
81
|
+
claimed_by: undefined,
|
|
82
|
+
claimed_at: undefined,
|
|
83
|
+
claim_lease: undefined,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
trackBridged(signal.id);
|
|
87
|
+
stats.signalsBridged++;
|
|
88
|
+
stats.lastBridgedAt = Date.now();
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
stats.errors++;
|
|
92
|
+
console.error(`[bridge:${config.name}] Error bridging signal ${signal.id}: ${err.message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function setupWatch(from, to, fromName, toName) {
|
|
96
|
+
return from.watch(buildQuery(), (signal) => {
|
|
97
|
+
bridgeSignal(signal, from, to, fromName, toName);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function setupPoll(from, to, fromName, toName) {
|
|
101
|
+
const interval = config.pollInterval ?? 5_000;
|
|
102
|
+
return setInterval(async () => {
|
|
103
|
+
try {
|
|
104
|
+
const signals = await from.observe(buildQuery());
|
|
105
|
+
for (const signal of signals) {
|
|
106
|
+
await bridgeSignal(signal, from, to, fromName, toName);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
stats.errors++;
|
|
111
|
+
console.error(`[bridge:${config.name}] Poll error: ${err.message}`);
|
|
112
|
+
}
|
|
113
|
+
}, interval);
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
async start() {
|
|
117
|
+
if (running)
|
|
118
|
+
return;
|
|
119
|
+
running = true;
|
|
120
|
+
const sourceName = config.source.name;
|
|
121
|
+
const targetName = config.target.name;
|
|
122
|
+
// Forward direction: source → target
|
|
123
|
+
try {
|
|
124
|
+
forwardSub = setupWatch(config.source, config.target, sourceName, targetName);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// Watch not supported, fall back to polling
|
|
128
|
+
forwardPoll = setupPoll(config.source, config.target, sourceName, targetName);
|
|
129
|
+
}
|
|
130
|
+
// Reverse direction (if bidirectional): target → source
|
|
131
|
+
if (config.bidirectional) {
|
|
132
|
+
try {
|
|
133
|
+
reverseSub = setupWatch(config.target, config.source, targetName, sourceName);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
reversePoll = setupPoll(config.target, config.source, targetName, sourceName);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
async stop() {
|
|
141
|
+
if (!running)
|
|
142
|
+
return;
|
|
143
|
+
running = false;
|
|
144
|
+
forwardSub?.unsubscribe();
|
|
145
|
+
reverseSub?.unsubscribe();
|
|
146
|
+
if (forwardPoll)
|
|
147
|
+
clearInterval(forwardPoll);
|
|
148
|
+
if (reversePoll)
|
|
149
|
+
clearInterval(reversePoll);
|
|
150
|
+
forwardSub = undefined;
|
|
151
|
+
reverseSub = undefined;
|
|
152
|
+
forwardPoll = undefined;
|
|
153
|
+
reversePoll = undefined;
|
|
154
|
+
},
|
|
155
|
+
get running() {
|
|
156
|
+
return running;
|
|
157
|
+
},
|
|
158
|
+
get stats() {
|
|
159
|
+
return { ...stats };
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/patterns/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createBridge } from './bridge.js';
|
|
2
|
+
export type { SignalBridge, BridgeStats } from './bridge.js';
|
|
3
|
+
export { createSentinel } from './sentinel.js';
|
|
4
|
+
export type { Sentinel, SentinelConfig, SentinelEvaluation, SentinelStats } from './sentinel.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Signal, Environment, TrustPolicy, TrustLevel } from '../core/types.js';
|
|
2
|
+
export interface SentinelConfig {
|
|
3
|
+
/** Name for this sentinel instance */
|
|
4
|
+
name: string;
|
|
5
|
+
/** The environment to monitor */
|
|
6
|
+
environment: Environment;
|
|
7
|
+
/** Trust policy to evaluate signals against */
|
|
8
|
+
policy: TrustPolicy;
|
|
9
|
+
/** Which signal types to monitor (glob patterns). Default: all. */
|
|
10
|
+
watchTypes?: string[];
|
|
11
|
+
/** Callback when a signal is evaluated */
|
|
12
|
+
onEvaluated?: (signal: Signal, result: SentinelEvaluation) => void;
|
|
13
|
+
/** Callback when a signal is flagged (trust below policy minimum) */
|
|
14
|
+
onFlagged?: (signal: Signal, result: SentinelEvaluation) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to deposit sentinel report signals into the environment.
|
|
17
|
+
* These signals allow other colonies to react to trust events.
|
|
18
|
+
* Default: true
|
|
19
|
+
*/
|
|
20
|
+
depositReports?: boolean;
|
|
21
|
+
/** How often to poll for new signals (ms). Default: 3000 */
|
|
22
|
+
pollInterval?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface SentinelEvaluation {
|
|
25
|
+
signalId: string;
|
|
26
|
+
signalType: string;
|
|
27
|
+
trustLevel: TrustLevel;
|
|
28
|
+
meetsPolicy: boolean;
|
|
29
|
+
reason: string;
|
|
30
|
+
evaluatedAt: number;
|
|
31
|
+
}
|
|
32
|
+
export interface SentinelStats {
|
|
33
|
+
signalsEvaluated: number;
|
|
34
|
+
signalsFlagged: number;
|
|
35
|
+
byTrustLevel: Record<TrustLevel, number>;
|
|
36
|
+
lastEvaluatedAt?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface Sentinel {
|
|
39
|
+
/** Start monitoring */
|
|
40
|
+
start(): Promise<void>;
|
|
41
|
+
/** Stop monitoring */
|
|
42
|
+
stop(): Promise<void>;
|
|
43
|
+
/** Whether the sentinel is running */
|
|
44
|
+
readonly running: boolean;
|
|
45
|
+
/** Monitoring statistics */
|
|
46
|
+
readonly stats: SentinelStats;
|
|
47
|
+
/** Get recent evaluations */
|
|
48
|
+
readonly recentEvaluations: SentinelEvaluation[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create a sentinel that monitors an environment for signal trust.
|
|
52
|
+
*
|
|
53
|
+
* Usage:
|
|
54
|
+
* const sentinel = createSentinel({
|
|
55
|
+
* name: 'local-guardian',
|
|
56
|
+
* environment: localEnv,
|
|
57
|
+
* policy: {
|
|
58
|
+
* name: 'strict',
|
|
59
|
+
* defaultTrust: 'unverified',
|
|
60
|
+
* minimumTrust: 'attested',
|
|
61
|
+
* trustedColonies: [shaperKey, criticKey],
|
|
62
|
+
* trustedBridges: [githubBridgeKey],
|
|
63
|
+
* quarantineRejected: true,
|
|
64
|
+
* },
|
|
65
|
+
* });
|
|
66
|
+
* await sentinel.start();
|
|
67
|
+
*/
|
|
68
|
+
export declare function createSentinel(config: SentinelConfig): Sentinel;
|
|
69
|
+
//# sourceMappingURL=sentinel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel.d.ts","sourceRoot":"","sources":["../../../src/patterns/sentinel.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,MAAM,EACN,WAAW,EACX,WAAW,EACX,UAAU,EAGX,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IAEb,iCAAiC;IACjC,WAAW,EAAE,WAAW,CAAC;IAEzB,+CAA+C;IAC/C,MAAM,EAAE,WAAW,CAAC;IAEpB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEnE,qEAAqE;IACrE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAEjE;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,sBAAsB;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,6BAA6B;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;CAClD;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAyJ/D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// ============================================================
|
|
2
|
+
// Sentinel — Colony Pattern for Trust Monitoring
|
|
3
|
+
// ============================================================
|
|
4
|
+
// A sentinel colony watches for signals in an environment and
|
|
5
|
+
// evaluates their provenance against a trust policy. Untrusted
|
|
6
|
+
// signals can be quarantined, tagged, or reported.
|
|
7
|
+
//
|
|
8
|
+
// Phase 1: Advisory only — flags signals, doesn't enforce.
|
|
9
|
+
// Phase 2: Enforcement — integrates with environment deposit hooks.
|
|
10
|
+
//
|
|
11
|
+
// Biological analogy: guard ants that inspect returning foragers
|
|
12
|
+
// and reject those carrying foreign colony scents.
|
|
13
|
+
// ============================================================
|
|
14
|
+
import { verifySignal } from '../core/attestation.js';
|
|
15
|
+
/** The trust level ordering for comparison */
|
|
16
|
+
const TRUST_ORDERING = {
|
|
17
|
+
verified: 3,
|
|
18
|
+
attested: 2,
|
|
19
|
+
unverified: 1,
|
|
20
|
+
rejected: 0,
|
|
21
|
+
};
|
|
22
|
+
function meetsTrustMinimum(level, minimum) {
|
|
23
|
+
return TRUST_ORDERING[level] >= TRUST_ORDERING[minimum];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a sentinel that monitors an environment for signal trust.
|
|
27
|
+
*
|
|
28
|
+
* Usage:
|
|
29
|
+
* const sentinel = createSentinel({
|
|
30
|
+
* name: 'local-guardian',
|
|
31
|
+
* environment: localEnv,
|
|
32
|
+
* policy: {
|
|
33
|
+
* name: 'strict',
|
|
34
|
+
* defaultTrust: 'unverified',
|
|
35
|
+
* minimumTrust: 'attested',
|
|
36
|
+
* trustedColonies: [shaperKey, criticKey],
|
|
37
|
+
* trustedBridges: [githubBridgeKey],
|
|
38
|
+
* quarantineRejected: true,
|
|
39
|
+
* },
|
|
40
|
+
* });
|
|
41
|
+
* await sentinel.start();
|
|
42
|
+
*/
|
|
43
|
+
export function createSentinel(config) {
|
|
44
|
+
let running = false;
|
|
45
|
+
let watchSub;
|
|
46
|
+
let pollTimer;
|
|
47
|
+
const evaluatedIds = new Set();
|
|
48
|
+
const MAX_TRACKED = 10_000;
|
|
49
|
+
const MAX_RECENT = 100;
|
|
50
|
+
const recentEvaluations = [];
|
|
51
|
+
const stats = {
|
|
52
|
+
signalsEvaluated: 0,
|
|
53
|
+
signalsFlagged: 0,
|
|
54
|
+
byTrustLevel: { verified: 0, attested: 0, unverified: 0, rejected: 0 },
|
|
55
|
+
};
|
|
56
|
+
function buildQuery() {
|
|
57
|
+
return {
|
|
58
|
+
type: config.watchTypes ?? ['*'],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function evaluateSignal(signal) {
|
|
62
|
+
// Skip already evaluated
|
|
63
|
+
if (evaluatedIds.has(signal.id))
|
|
64
|
+
return;
|
|
65
|
+
evaluatedIds.add(signal.id);
|
|
66
|
+
// Prevent unbounded growth
|
|
67
|
+
if (evaluatedIds.size > MAX_TRACKED) {
|
|
68
|
+
const iter = evaluatedIds.values();
|
|
69
|
+
for (let i = 0; i < MAX_TRACKED / 2; i++) {
|
|
70
|
+
evaluatedIds.delete(iter.next().value);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Run verification
|
|
74
|
+
const result = await verifySignal(signal, config.policy);
|
|
75
|
+
const meetsPolicy = meetsTrustMinimum(result.trustLevel, config.policy.minimumTrust);
|
|
76
|
+
const evaluation = {
|
|
77
|
+
signalId: signal.id,
|
|
78
|
+
signalType: signal.type,
|
|
79
|
+
trustLevel: result.trustLevel,
|
|
80
|
+
meetsPolicy,
|
|
81
|
+
reason: result.reason,
|
|
82
|
+
evaluatedAt: Date.now(),
|
|
83
|
+
};
|
|
84
|
+
// Track stats
|
|
85
|
+
stats.signalsEvaluated++;
|
|
86
|
+
stats.byTrustLevel[result.trustLevel]++;
|
|
87
|
+
stats.lastEvaluatedAt = evaluation.evaluatedAt;
|
|
88
|
+
// Store recent
|
|
89
|
+
recentEvaluations.push(evaluation);
|
|
90
|
+
if (recentEvaluations.length > MAX_RECENT) {
|
|
91
|
+
recentEvaluations.shift();
|
|
92
|
+
}
|
|
93
|
+
// Callbacks
|
|
94
|
+
config.onEvaluated?.(signal, evaluation);
|
|
95
|
+
if (!meetsPolicy) {
|
|
96
|
+
stats.signalsFlagged++;
|
|
97
|
+
config.onFlagged?.(signal, evaluation);
|
|
98
|
+
// Deposit sentinel report signal if configured
|
|
99
|
+
if (config.depositReports !== false) {
|
|
100
|
+
try {
|
|
101
|
+
await config.environment.deposit({
|
|
102
|
+
type: 'sentinel:flagged',
|
|
103
|
+
payload: {
|
|
104
|
+
signalId: signal.id,
|
|
105
|
+
signalType: signal.type,
|
|
106
|
+
trustLevel: result.trustLevel,
|
|
107
|
+
reason: result.reason,
|
|
108
|
+
meetsPolicy: false,
|
|
109
|
+
sourceEnvironment: signal.meta.sourceEnvironment,
|
|
110
|
+
attestationCount: signal.meta.attestations?.length ?? 0,
|
|
111
|
+
},
|
|
112
|
+
meta: {
|
|
113
|
+
deposited_by: `sentinel:${config.name}`,
|
|
114
|
+
tags: ['sentinel', 'trust', result.trustLevel],
|
|
115
|
+
caused_by: [signal.id],
|
|
116
|
+
ttl: 300_000, // sentinel reports expire after 5 minutes
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
console.error(`[sentinel:${config.name}] Error depositing report: ${err.message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
async start() {
|
|
128
|
+
if (running)
|
|
129
|
+
return;
|
|
130
|
+
running = true;
|
|
131
|
+
const query = buildQuery();
|
|
132
|
+
// Try watch first, fall back to polling
|
|
133
|
+
try {
|
|
134
|
+
watchSub = config.environment.watch(query, (signal) => {
|
|
135
|
+
evaluateSignal(signal);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
const interval = config.pollInterval ?? 3_000;
|
|
140
|
+
pollTimer = setInterval(async () => {
|
|
141
|
+
try {
|
|
142
|
+
const signals = await config.environment.observe(query);
|
|
143
|
+
for (const signal of signals) {
|
|
144
|
+
await evaluateSignal(signal);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
console.error(`[sentinel:${config.name}] Poll error: ${err.message}`);
|
|
149
|
+
}
|
|
150
|
+
}, interval);
|
|
151
|
+
}
|
|
152
|
+
// Evaluate existing signals on start
|
|
153
|
+
try {
|
|
154
|
+
const existing = await config.environment.observe(query);
|
|
155
|
+
for (const signal of existing) {
|
|
156
|
+
await evaluateSignal(signal);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
console.error(`[sentinel:${config.name}] Initial scan error: ${err.message}`);
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
async stop() {
|
|
164
|
+
if (!running)
|
|
165
|
+
return;
|
|
166
|
+
running = false;
|
|
167
|
+
watchSub?.unsubscribe();
|
|
168
|
+
if (pollTimer)
|
|
169
|
+
clearInterval(pollTimer);
|
|
170
|
+
watchSub = undefined;
|
|
171
|
+
pollTimer = undefined;
|
|
172
|
+
},
|
|
173
|
+
get running() {
|
|
174
|
+
return running;
|
|
175
|
+
},
|
|
176
|
+
get stats() {
|
|
177
|
+
return { ...stats, byTrustLevel: { ...stats.byTrustLevel } };
|
|
178
|
+
},
|
|
179
|
+
get recentEvaluations() {
|
|
180
|
+
return [...recentEvaluations];
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=sentinel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentinel.js","sourceRoot":"","sources":["../../../src/patterns/sentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentProviderConfig, ActionHandler, BedrockConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an action handler powered by the Claude Agent SDK.
|
|
4
|
+
*
|
|
5
|
+
* The SDK must be installed separately:
|
|
6
|
+
* npm install @anthropic-ai/claude-agent-sdk
|
|
7
|
+
*
|
|
8
|
+
* The handler:
|
|
9
|
+
* 1. Builds a prompt from the signal
|
|
10
|
+
* 2. Spawns a Claude agent session via the SDK's query() AsyncGenerator
|
|
11
|
+
* 3. Consumes all messages, calling onMessage for observability
|
|
12
|
+
* 4. Extracts the final result (text, cost, duration, usage)
|
|
13
|
+
* 5. Maps the agent's output to signal deposits
|
|
14
|
+
* 6. Optionally withdraws the triggering signal
|
|
15
|
+
*/
|
|
16
|
+
export declare function withAgent<T = Record<string, unknown>>(config: AgentProviderConfig<T>): ActionHandler<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Builds env vars for routing the Claude Agent SDK through AWS Bedrock.
|
|
19
|
+
* Exported for testing.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildBedrockEnv(config: BedrockConfig): Record<string, string>;
|
|
22
|
+
export declare function buildDefaultSystemPrompt(colonyName: string): string;
|
|
23
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/providers/agent.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAe,aAAa,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC7B,aAAa,CAAC,CAAC,CAAC,CA6FlB;AAuDD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuB7E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOnE"}
|