@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.
Files changed (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +391 -0
  3. package/dist/examples/code-pipeline/index.d.ts +3 -0
  4. package/dist/examples/code-pipeline/index.d.ts.map +1 -0
  5. package/dist/examples/code-pipeline/index.js +239 -0
  6. package/dist/examples/code-pipeline/index.js.map +1 -0
  7. package/dist/examples/code-pipeline/with-providers.d.ts +3 -0
  8. package/dist/examples/code-pipeline/with-providers.d.ts.map +1 -0
  9. package/dist/examples/code-pipeline/with-providers.js +246 -0
  10. package/dist/examples/code-pipeline/with-providers.js.map +1 -0
  11. package/dist/examples/docker-pipeline/index.d.ts +3 -0
  12. package/dist/examples/docker-pipeline/index.d.ts.map +1 -0
  13. package/dist/examples/docker-pipeline/index.js +235 -0
  14. package/dist/examples/docker-pipeline/index.js.map +1 -0
  15. package/dist/examples/github-colony/mandible.config.d.ts +11 -0
  16. package/dist/examples/github-colony/mandible.config.d.ts.map +1 -0
  17. package/dist/examples/github-colony/mandible.config.js +63 -0
  18. package/dist/examples/github-colony/mandible.config.js.map +1 -0
  19. package/dist/examples/remote-pipeline/index.d.ts +3 -0
  20. package/dist/examples/remote-pipeline/index.d.ts.map +1 -0
  21. package/dist/examples/remote-pipeline/index.js +154 -0
  22. package/dist/examples/remote-pipeline/index.js.map +1 -0
  23. package/dist/examples/repo-maintenance/fixer.d.ts +80 -0
  24. package/dist/examples/repo-maintenance/fixer.d.ts.map +1 -0
  25. package/dist/examples/repo-maintenance/fixer.js +217 -0
  26. package/dist/examples/repo-maintenance/fixer.js.map +1 -0
  27. package/dist/examples/repo-maintenance/mandible.config.d.ts +11 -0
  28. package/dist/examples/repo-maintenance/mandible.config.d.ts.map +1 -0
  29. package/dist/examples/repo-maintenance/mandible.config.js +34 -0
  30. package/dist/examples/repo-maintenance/mandible.config.js.map +1 -0
  31. package/dist/examples/repo-maintenance/scout.d.ts +39 -0
  32. package/dist/examples/repo-maintenance/scout.d.ts.map +1 -0
  33. package/dist/examples/repo-maintenance/scout.js +163 -0
  34. package/dist/examples/repo-maintenance/scout.js.map +1 -0
  35. package/dist/examples/repo-maintenance/seed.d.ts +3 -0
  36. package/dist/examples/repo-maintenance/seed.d.ts.map +1 -0
  37. package/dist/examples/repo-maintenance/seed.js +169 -0
  38. package/dist/examples/repo-maintenance/seed.js.map +1 -0
  39. package/dist/src/cli/index.d.ts +3 -0
  40. package/dist/src/cli/index.d.ts.map +1 -0
  41. package/dist/src/cli/index.js +116 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/cli/server.d.ts +15 -0
  44. package/dist/src/cli/server.d.ts.map +1 -0
  45. package/dist/src/cli/server.js +204 -0
  46. package/dist/src/cli/server.js.map +1 -0
  47. package/dist/src/cloud/client.d.ts +30 -0
  48. package/dist/src/cloud/client.d.ts.map +1 -0
  49. package/dist/src/cloud/client.js +124 -0
  50. package/dist/src/cloud/client.js.map +1 -0
  51. package/dist/src/cloud/index.d.ts +5 -0
  52. package/dist/src/cloud/index.d.ts.map +1 -0
  53. package/dist/src/cloud/index.js +3 -0
  54. package/dist/src/cloud/index.js.map +1 -0
  55. package/dist/src/cloud/types.d.ts +104 -0
  56. package/dist/src/cloud/types.d.ts.map +1 -0
  57. package/dist/src/cloud/types.js +9 -0
  58. package/dist/src/cloud/types.js.map +1 -0
  59. package/dist/src/core/attestation.d.ts +63 -0
  60. package/dist/src/core/attestation.d.ts.map +1 -0
  61. package/dist/src/core/attestation.js +331 -0
  62. package/dist/src/core/attestation.js.map +1 -0
  63. package/dist/src/core/events.d.ts +22 -0
  64. package/dist/src/core/events.d.ts.map +1 -0
  65. package/dist/src/core/events.js +45 -0
  66. package/dist/src/core/events.js.map +1 -0
  67. package/dist/src/core/index.d.ts +8 -0
  68. package/dist/src/core/index.d.ts.map +1 -0
  69. package/dist/src/core/index.js +7 -0
  70. package/dist/src/core/index.js.map +1 -0
  71. package/dist/src/core/runtime.d.ts +57 -0
  72. package/dist/src/core/runtime.d.ts.map +1 -0
  73. package/dist/src/core/runtime.js +564 -0
  74. package/dist/src/core/runtime.js.map +1 -0
  75. package/dist/src/core/signal.d.ts +33 -0
  76. package/dist/src/core/signal.d.ts.map +1 -0
  77. package/dist/src/core/signal.js +127 -0
  78. package/dist/src/core/signal.js.map +1 -0
  79. package/dist/src/core/types.d.ts +395 -0
  80. package/dist/src/core/types.d.ts.map +1 -0
  81. package/dist/src/core/types.js +19 -0
  82. package/dist/src/core/types.js.map +1 -0
  83. package/dist/src/core/validation.d.ts +10 -0
  84. package/dist/src/core/validation.d.ts.map +1 -0
  85. package/dist/src/core/validation.js +40 -0
  86. package/dist/src/core/validation.js.map +1 -0
  87. package/dist/src/dsl/builder.d.ts +63 -0
  88. package/dist/src/dsl/builder.d.ts.map +1 -0
  89. package/dist/src/dsl/builder.js +159 -0
  90. package/dist/src/dsl/builder.js.map +1 -0
  91. package/dist/src/dsl/index.d.ts +2 -0
  92. package/dist/src/dsl/index.d.ts.map +1 -0
  93. package/dist/src/dsl/index.js +2 -0
  94. package/dist/src/dsl/index.js.map +1 -0
  95. package/dist/src/environments/dolt/adapter.d.ts +45 -0
  96. package/dist/src/environments/dolt/adapter.d.ts.map +1 -0
  97. package/dist/src/environments/dolt/adapter.js +128 -0
  98. package/dist/src/environments/dolt/adapter.js.map +1 -0
  99. package/dist/src/environments/dolt/index.d.ts +2 -0
  100. package/dist/src/environments/dolt/index.d.ts.map +1 -0
  101. package/dist/src/environments/dolt/index.js +2 -0
  102. package/dist/src/environments/dolt/index.js.map +1 -0
  103. package/dist/src/environments/filesystem/adapter.d.ts +33 -0
  104. package/dist/src/environments/filesystem/adapter.d.ts.map +1 -0
  105. package/dist/src/environments/filesystem/adapter.js +296 -0
  106. package/dist/src/environments/filesystem/adapter.js.map +1 -0
  107. package/dist/src/environments/filesystem/index.d.ts +2 -0
  108. package/dist/src/environments/filesystem/index.d.ts.map +1 -0
  109. package/dist/src/environments/filesystem/index.js +2 -0
  110. package/dist/src/environments/filesystem/index.js.map +1 -0
  111. package/dist/src/environments/github/adapter.d.ts +47 -0
  112. package/dist/src/environments/github/adapter.d.ts.map +1 -0
  113. package/dist/src/environments/github/adapter.js +324 -0
  114. package/dist/src/environments/github/adapter.js.map +1 -0
  115. package/dist/src/environments/github/client.d.ts +48 -0
  116. package/dist/src/environments/github/client.d.ts.map +1 -0
  117. package/dist/src/environments/github/client.js +151 -0
  118. package/dist/src/environments/github/client.js.map +1 -0
  119. package/dist/src/environments/github/index.d.ts +5 -0
  120. package/dist/src/environments/github/index.d.ts.map +1 -0
  121. package/dist/src/environments/github/index.js +5 -0
  122. package/dist/src/environments/github/index.js.map +1 -0
  123. package/dist/src/environments/github/mapper.d.ts +66 -0
  124. package/dist/src/environments/github/mapper.d.ts.map +1 -0
  125. package/dist/src/environments/github/mapper.js +240 -0
  126. package/dist/src/environments/github/mapper.js.map +1 -0
  127. package/dist/src/environments/github/types.d.ts +71 -0
  128. package/dist/src/environments/github/types.d.ts.map +1 -0
  129. package/dist/src/environments/github/types.js +4 -0
  130. package/dist/src/environments/github/types.js.map +1 -0
  131. package/dist/src/environments/remote/adapter.d.ts +61 -0
  132. package/dist/src/environments/remote/adapter.d.ts.map +1 -0
  133. package/dist/src/environments/remote/adapter.js +392 -0
  134. package/dist/src/environments/remote/adapter.js.map +1 -0
  135. package/dist/src/environments/remote/index.d.ts +5 -0
  136. package/dist/src/environments/remote/index.d.ts.map +1 -0
  137. package/dist/src/environments/remote/index.js +3 -0
  138. package/dist/src/environments/remote/index.js.map +1 -0
  139. package/dist/src/environments/remote/protocol.d.ts +124 -0
  140. package/dist/src/environments/remote/protocol.d.ts.map +1 -0
  141. package/dist/src/environments/remote/protocol.js +24 -0
  142. package/dist/src/environments/remote/protocol.js.map +1 -0
  143. package/dist/src/index.d.ts +25 -0
  144. package/dist/src/index.d.ts.map +1 -0
  145. package/dist/src/index.js +31 -0
  146. package/dist/src/index.js.map +1 -0
  147. package/dist/src/patterns/bridge.d.ts +32 -0
  148. package/dist/src/patterns/bridge.d.ts.map +1 -0
  149. package/dist/src/patterns/bridge.js +163 -0
  150. package/dist/src/patterns/bridge.js.map +1 -0
  151. package/dist/src/patterns/index.d.ts +5 -0
  152. package/dist/src/patterns/index.d.ts.map +1 -0
  153. package/dist/src/patterns/index.js +3 -0
  154. package/dist/src/patterns/index.js.map +1 -0
  155. package/dist/src/patterns/sentinel.d.ts +69 -0
  156. package/dist/src/patterns/sentinel.d.ts.map +1 -0
  157. package/dist/src/patterns/sentinel.js +184 -0
  158. package/dist/src/patterns/sentinel.js.map +1 -0
  159. package/dist/src/providers/agent.d.ts +23 -0
  160. package/dist/src/providers/agent.d.ts.map +1 -0
  161. package/dist/src/providers/agent.js +184 -0
  162. package/dist/src/providers/agent.js.map +1 -0
  163. package/dist/src/providers/bash.d.ts +13 -0
  164. package/dist/src/providers/bash.d.ts.map +1 -0
  165. package/dist/src/providers/bash.js +91 -0
  166. package/dist/src/providers/bash.js.map +1 -0
  167. package/dist/src/providers/claude-code.d.ts +23 -0
  168. package/dist/src/providers/claude-code.d.ts.map +1 -0
  169. package/dist/src/providers/claude-code.js +184 -0
  170. package/dist/src/providers/claude-code.js.map +1 -0
  171. package/dist/src/providers/context.d.ts +12 -0
  172. package/dist/src/providers/context.d.ts.map +1 -0
  173. package/dist/src/providers/context.js +160 -0
  174. package/dist/src/providers/context.js.map +1 -0
  175. package/dist/src/providers/index.d.ts +6 -0
  176. package/dist/src/providers/index.d.ts.map +1 -0
  177. package/dist/src/providers/index.js +7 -0
  178. package/dist/src/providers/index.js.map +1 -0
  179. package/dist/src/providers/structured-output.d.ts +7 -0
  180. package/dist/src/providers/structured-output.d.ts.map +1 -0
  181. package/dist/src/providers/structured-output.js +316 -0
  182. package/dist/src/providers/structured-output.js.map +1 -0
  183. package/dist/src/providers/types.d.ts +239 -0
  184. package/dist/src/providers/types.d.ts.map +1 -0
  185. package/dist/src/providers/types.js +19 -0
  186. package/dist/src/providers/types.js.map +1 -0
  187. 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,3 @@
1
+ export { createBridge } from './bridge.js';
2
+ export { createSentinel } from './sentinel.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}