@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,127 @@
1
+ // ============================================================
2
+ // Signal Factory & Utilities
3
+ // ============================================================
4
+ let idCounter = 0;
5
+ const generateId = () => {
6
+ const ts = Date.now().toString(36);
7
+ const seq = (idCounter++).toString(36).padStart(4, '0');
8
+ const rand = Math.random().toString(36).slice(2, 6);
9
+ return `sig_${ts}_${seq}_${rand}`;
10
+ };
11
+ /**
12
+ * Create a new signal with sensible defaults.
13
+ */
14
+ export function createSignal(type, payload, options) {
15
+ const now = Date.now();
16
+ return {
17
+ id: generateId(),
18
+ type,
19
+ payload,
20
+ meta: {
21
+ deposited_at: now,
22
+ deposited_by: options?.deposited_by ?? 'unknown',
23
+ concentration: options?.concentration ?? 1.0,
24
+ ttl: options?.ttl,
25
+ tags: options?.tags,
26
+ caused_by: options?.caused_by,
27
+ },
28
+ };
29
+ }
30
+ /**
31
+ * Check if a signal matches a query.
32
+ */
33
+ export function matchesQuery(signal, query) {
34
+ // Type matching (supports glob with *)
35
+ if (query.type) {
36
+ const types = Array.isArray(query.type) ? query.type : [query.type];
37
+ const typeMatches = types.some(pattern => matchType(signal.type, pattern));
38
+ if (!typeMatches)
39
+ return false;
40
+ }
41
+ // Concentration threshold
42
+ if (query.minConcentration !== undefined) {
43
+ if (signal.meta.concentration < query.minConcentration)
44
+ return false;
45
+ }
46
+ // Unclaimed filter
47
+ if (query.unclaimed === true) {
48
+ if (signal.meta.claimed_by)
49
+ return false;
50
+ }
51
+ // Tags filter (all specified tags must be present)
52
+ if (query.tags && query.tags.length > 0) {
53
+ const signalTags = new Set(signal.meta.tags ?? []);
54
+ if (!query.tags.every(t => signalTags.has(t)))
55
+ return false;
56
+ }
57
+ // Time filter
58
+ if (query.after !== undefined) {
59
+ if (signal.meta.deposited_at <= query.after)
60
+ return false;
61
+ }
62
+ // Custom filter
63
+ if (query.filter) {
64
+ if (!query.filter(signal))
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ /**
70
+ * Glob-style type matching. Supports:
71
+ * 'task:ready' — exact match
72
+ * 'task:*' — matches any task signal
73
+ * '*:ready' — matches any domain with state 'ready'
74
+ * '*' — matches everything
75
+ */
76
+ function matchType(signalType, pattern) {
77
+ if (pattern === '*')
78
+ return true;
79
+ // Convert glob to regex
80
+ const regexStr = '^' + pattern
81
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&') // escape regex special chars
82
+ .replace(/\*/g, '[^:]*') // * matches within a segment
83
+ .replace(/\*\*/g, '.*') // ** matches across segments
84
+ + '$';
85
+ return new RegExp(regexStr).test(signalType);
86
+ }
87
+ /**
88
+ * Apply concentration decay to a signal based on elapsed time.
89
+ * Returns the new concentration value (does not mutate the signal).
90
+ */
91
+ export function decayConcentration(signal, ratePerSecond, now = Date.now()) {
92
+ const elapsedMs = now - signal.meta.deposited_at;
93
+ const elapsedSeconds = elapsedMs / 1000;
94
+ const newConcentration = signal.meta.concentration - (ratePerSecond * elapsedSeconds);
95
+ return Math.max(0, newConcentration);
96
+ }
97
+ /**
98
+ * Check if a signal has expired based on its TTL.
99
+ */
100
+ export function isExpired(signal, now = Date.now()) {
101
+ if (!signal.meta.ttl)
102
+ return false;
103
+ return now - signal.meta.deposited_at > signal.meta.ttl;
104
+ }
105
+ /**
106
+ * Check if a signal's claim lease has expired.
107
+ */
108
+ export function isClaimExpired(signal, now = Date.now()) {
109
+ if (!signal.meta.claimed_by || !signal.meta.claimed_at || !signal.meta.claim_lease) {
110
+ return false;
111
+ }
112
+ return now - signal.meta.claimed_at > signal.meta.claim_lease;
113
+ }
114
+ /**
115
+ * Sort signals by concentration (highest first), then by age (newest first).
116
+ */
117
+ export function prioritize(signals) {
118
+ return [...signals].sort((a, b) => {
119
+ // Higher concentration first
120
+ const concDiff = b.meta.concentration - a.meta.concentration;
121
+ if (Math.abs(concDiff) > 0.001)
122
+ return concDiff;
123
+ // Then newer first
124
+ return b.meta.deposited_at - a.meta.deposited_at;
125
+ });
126
+ }
127
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/core/signal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,395 @@
1
+ export interface Signal<T = Record<string, unknown>> {
2
+ /** Unique signal ID */
3
+ id: string;
4
+ /**
5
+ * Hierarchical signal type, e.g. 'task:ready', 'review:needed', 'artifact:shaped'
6
+ * Convention: {domain}:{state}
7
+ */
8
+ type: string;
9
+ /** Arbitrary structured payload */
10
+ payload: T;
11
+ /** Signal metadata — managed by the framework, not the agent */
12
+ meta: SignalMeta;
13
+ }
14
+ export interface SignalMeta {
15
+ /** When the signal was deposited (epoch ms) */
16
+ deposited_at: number;
17
+ /** Which colony deposited this signal */
18
+ deposited_by: string;
19
+ /**
20
+ * Signal strength: 1.0 = fresh, decays toward 0.0 over time.
21
+ * Agents can use concentration to prioritize work.
22
+ */
23
+ concentration: number;
24
+ /** Optional time-to-live in milliseconds. Signal evaporates after this. */
25
+ ttl?: number;
26
+ /** If claimed, which colony instance holds the claim */
27
+ claimed_by?: string;
28
+ /** When the claim was taken */
29
+ claimed_at?: number;
30
+ /** Claim lease duration in ms — auto-releases if holder dies */
31
+ claim_lease?: number;
32
+ /** Lineage: signal IDs that caused this signal to be deposited */
33
+ caused_by?: string[];
34
+ /** Arbitrary tags for filtering */
35
+ tags?: string[];
36
+ /**
37
+ * Ed25519 signature of the canonical signal content.
38
+ * Signs: hash(type + JSON(payload) + JSON(caused_by))
39
+ * Proves the depositing colony actually produced this signal.
40
+ */
41
+ signature?: string;
42
+ /**
43
+ * Public key (hex-encoded) of the colony that signed this signal.
44
+ * Used to look up the colony identity for verification.
45
+ */
46
+ signer?: string;
47
+ /**
48
+ * Attestation chain for bridged signals.
49
+ * Each bridge that transfers a signal appends its own attestation.
50
+ * Verification walks the chain from origin to current environment.
51
+ */
52
+ attestations?: Attestation[];
53
+ /**
54
+ * Trust level assigned by the receiving environment's trust policy.
55
+ * Set during deposit validation. Colonies can filter by trust level.
56
+ * 'verified' — signature valid, attestation chain checks out
57
+ * 'attested' — bridge attestation present but colony sig missing
58
+ * 'unverified' — no provenance metadata (local signals, legacy)
59
+ * 'rejected' — failed verification (quarantined, not evicted)
60
+ */
61
+ trustLevel?: TrustLevel;
62
+ /**
63
+ * The environment where this signal originated.
64
+ * Set automatically by bridges when transferring signals.
65
+ * Undefined for signals deposited locally.
66
+ */
67
+ sourceEnvironment?: string;
68
+ }
69
+ export interface SignalQuery {
70
+ /** Match signal types (exact or glob pattern like 'task:*') */
71
+ type?: string | string[];
72
+ /** Only signals above this concentration threshold */
73
+ minConcentration?: number;
74
+ /** Only unclaimed signals */
75
+ unclaimed?: boolean;
76
+ /** Only signals with these tags */
77
+ tags?: string[];
78
+ /** Only signals deposited after this time */
79
+ after?: number;
80
+ /** Max results to return */
81
+ limit?: number;
82
+ /** Custom filter predicate */
83
+ filter?: (signal: Signal) => boolean;
84
+ }
85
+ export interface Environment {
86
+ /** Human-readable name for this environment instance */
87
+ readonly name: string;
88
+ /** Observe signals matching a query */
89
+ observe(query: SignalQuery): Promise<Signal[]>;
90
+ /** Deposit a new signal into the environment */
91
+ deposit(signal: Omit<Signal, 'id' | 'meta'> & {
92
+ meta?: Partial<SignalMeta>;
93
+ }): Promise<Signal>;
94
+ /** Withdraw (remove) a signal from the environment */
95
+ withdraw(signalId: string): Promise<void>;
96
+ /**
97
+ * Attempt to claim a signal. Returns true if claim succeeded.
98
+ * Supports optimistic concurrency — if two agents claim simultaneously,
99
+ * only one succeeds.
100
+ */
101
+ claim(signalId: string, claimant: string, leaseDuration?: number): Promise<boolean>;
102
+ /** Release a previously held claim */
103
+ release(signalId: string): Promise<void>;
104
+ /**
105
+ * Watch for signals matching a pattern. Callback fires when new signals appear.
106
+ * This is the reactive sensor mechanism.
107
+ */
108
+ watch(query: SignalQuery, callback: (signal: Signal) => void): Subscription;
109
+ /** Query historical signals (including withdrawn ones, if supported) */
110
+ history(query: SignalQuery & {
111
+ includeWithdrawn?: boolean;
112
+ }): Promise<Signal[]>;
113
+ /** Apply decay to all signals based on their age and TTL */
114
+ decay(): Promise<DecayResult>;
115
+ /** Get all active signals (primarily for debugging/observability) */
116
+ snapshot(): Promise<Signal[]>;
117
+ }
118
+ export interface Subscription {
119
+ unsubscribe(): void;
120
+ }
121
+ export interface DecayResult {
122
+ /** Number of signals that had their concentration reduced */
123
+ decayed: number;
124
+ /** Number of signals that were evaporated (removed) entirely */
125
+ evaporated: number;
126
+ /** Number of expired claims that were released */
127
+ claimsReleased: number;
128
+ }
129
+ export interface ColonyDefinition<T = Record<string, unknown>> {
130
+ /** Colony name — all instances share this identity */
131
+ name: string;
132
+ /** Which environment this colony operates in */
133
+ environment: Environment;
134
+ /** What signals this colony watches for */
135
+ sensors: SensorConfig[];
136
+ /** The rules that map stimuli to responses */
137
+ rules: Rule<T>[];
138
+ /** How many concurrent agents can run */
139
+ concurrency: number;
140
+ /** How to handle contention for the same signal */
141
+ claimStrategy: ClaimStrategy;
142
+ /** Colony-level configuration */
143
+ config?: ColonyConfig;
144
+ }
145
+ export interface SensorConfig {
146
+ /** Signal query to watch */
147
+ query: SignalQuery;
148
+ /** Polling interval in ms (for environments that don't support watch) */
149
+ pollInterval?: number;
150
+ /** Whether to use push-based watching (preferred) or polling */
151
+ mode?: 'watch' | 'poll';
152
+ }
153
+ export interface Rule<T = Record<string, unknown>> {
154
+ /** Human-readable rule name */
155
+ name: string;
156
+ /**
157
+ * Guard condition — if this returns false, the rule doesn't fire.
158
+ * Use for additional filtering beyond what the sensor query provides.
159
+ */
160
+ when?: (signal: Signal<T>) => boolean | Promise<boolean>;
161
+ /**
162
+ * The action to take when the rule fires.
163
+ * Receives the triggering signal and a context for depositing new signals.
164
+ */
165
+ do: (signal: Signal<T>, ctx: ActionContext) => Promise<void>;
166
+ /** Priority relative to other rules (higher = evaluated first) */
167
+ priority?: number;
168
+ }
169
+ export interface ActionContext {
170
+ /** The colony name performing this action */
171
+ colony: string;
172
+ /** Deposit a new signal into the environment */
173
+ deposit(type: string, payload?: Record<string, unknown>, options?: {
174
+ ttl?: number;
175
+ tags?: string[];
176
+ causedBy?: string[];
177
+ }): Promise<Signal>;
178
+ /** Withdraw a signal (typically the one being processed) */
179
+ withdraw(signalId: string): Promise<void>;
180
+ /** Log a message (routed through the framework's logging) */
181
+ log(message: string, level?: 'debug' | 'info' | 'warn' | 'error'): void;
182
+ /** Manually deposit a heartbeat signal (no-op if heartbeat not configured) */
183
+ heartbeat(payload?: Record<string, unknown>): Promise<void>;
184
+ }
185
+ export type ClaimStrategy = 'optimistic' | 'exclusive' | 'lease' | 'none';
186
+ export interface ColonyConfig {
187
+ /** How often the sensor polls (if not using watch mode) */
188
+ defaultPollInterval?: number;
189
+ /** Whether to automatically withdraw signals after processing */
190
+ autoWithdraw?: boolean;
191
+ /** Decay configuration for signals this colony deposits */
192
+ decayRate?: number;
193
+ /** Max time a single rule action can take before timeout */
194
+ actionTimeout?: number;
195
+ /** Retry configuration for failed actions */
196
+ retry?: {
197
+ maxAttempts: number;
198
+ backoffMs: number;
199
+ };
200
+ /** Heartbeat configuration — deposits periodic signals during long-running actions */
201
+ heartbeat?: HeartbeatConfig;
202
+ }
203
+ export interface HeartbeatConfig {
204
+ /** Milliseconds between heartbeat deposits */
205
+ interval: number;
206
+ /** TTL in ms for heartbeat signals. Defaults to Math.round(interval * 2.5) */
207
+ ttl?: number;
208
+ /** Signal type for heartbeat. Defaults to 'heartbeat:{colonyName}' */
209
+ type?: string;
210
+ }
211
+ export interface ColonyRuntime {
212
+ /** Start the colony — begins sensor loops */
213
+ start(): Promise<void>;
214
+ /** Stop the colony gracefully */
215
+ stop(): Promise<void>;
216
+ /** Current runtime state */
217
+ readonly state: RuntimeState;
218
+ /** Number of currently active agent tasks */
219
+ readonly activeCount: number;
220
+ /** Runtime statistics */
221
+ readonly stats: RuntimeStats;
222
+ /** Subscribe to runtime events */
223
+ on(event: RuntimeEvent, handler: (...args: any[]) => void): void;
224
+ }
225
+ export type RuntimeState = 'idle' | 'running' | 'stopping' | 'stopped';
226
+ export interface RuntimeStats {
227
+ signalsSensed: number;
228
+ signalsClaimed: number;
229
+ signalsProcessed: number;
230
+ signalsDeposited: number;
231
+ claimConflicts: number;
232
+ errors: number;
233
+ avgProcessingMs: number;
234
+ }
235
+ /**
236
+ * Runtime event types — the canonical set of events emitted by the stigmergy loop.
237
+ * Re-exported from events.ts as RuntimeEvent for backward compatibility.
238
+ */
239
+ import type { RuntimeEventType } from './events.js';
240
+ export type RuntimeEvent = RuntimeEventType;
241
+ export interface DecayPolicy {
242
+ /** How fast concentration drops (units per second) */
243
+ rate: number;
244
+ /** Minimum concentration before signal is evaporated entirely */
245
+ floor: number;
246
+ /** Whether to auto-release expired claims */
247
+ releaseExpiredClaims: boolean;
248
+ /** How often to run the decay sweep (ms) */
249
+ interval: number;
250
+ }
251
+ export declare const DEFAULT_DECAY_POLICY: DecayPolicy;
252
+ /**
253
+ * Trust levels assigned to signals based on provenance verification.
254
+ * 'verified' — colony signature valid, full attestation chain checks out
255
+ * 'attested' — bridge attestation present but colony signature missing
256
+ * 'unverified' — no provenance metadata (local signals, legacy systems)
257
+ * 'rejected' — failed verification (quarantined, not evicted)
258
+ */
259
+ export type TrustLevel = 'verified' | 'attested' | 'unverified' | 'rejected';
260
+ /**
261
+ * A single attestation in the chain of custody for a bridged signal.
262
+ * Each bridge that transfers a signal appends its own attestation.
263
+ * Verification walks the chain from origin → current environment.
264
+ */
265
+ export interface Attestation {
266
+ /** Identity of the bridge or environment that attests this transfer */
267
+ attester: string;
268
+ /** Public key (hex-encoded) of the attesting entity */
269
+ attesterKey: string;
270
+ /** Environment the signal was transferred FROM */
271
+ sourceEnvironment: string;
272
+ /** Environment the signal was transferred TO */
273
+ targetEnvironment: string;
274
+ /** When this attestation was created (epoch ms) */
275
+ timestamp: number;
276
+ /**
277
+ * Ed25519 signature over the attestation content.
278
+ * Signs: hash(signalId + sourceEnvironment + targetEnvironment + timestamp + previousSignature?)
279
+ * This creates a chain — each attestation signs over the previous one.
280
+ */
281
+ signature: string;
282
+ /** Optional human-readable note about the transfer */
283
+ note?: string;
284
+ }
285
+ /**
286
+ * Colony identity — the cryptographic identity of a colony.
287
+ * Generated once when a colony is first created, persisted across restarts.
288
+ * The private key stays with the colony; the public key is shared.
289
+ */
290
+ export interface ColonyIdentity {
291
+ /** Colony name (must match ColonyDefinition.name) */
292
+ name: string;
293
+ /** Ed25519 public key, hex-encoded */
294
+ publicKey: string;
295
+ /** Ed25519 private key, hex-encoded. NEVER share or log this. */
296
+ privateKey: string;
297
+ /** Which environment this colony is registered in */
298
+ environment: string;
299
+ /** When the identity was created */
300
+ createdAt: number;
301
+ /** Optional metadata (version, capabilities, etc.) */
302
+ metadata?: Record<string, unknown>;
303
+ }
304
+ /**
305
+ * Trust policy for an environment — defines how signals are evaluated.
306
+ * Phase 2 feature: environments will enforce these policies during deposit.
307
+ * For now, policies are advisory and used by Sentinel colonies.
308
+ */
309
+ export interface TrustPolicy {
310
+ /** Policy name for logging/debugging */
311
+ name: string;
312
+ /** Default trust level for signals with no provenance metadata */
313
+ defaultTrust: TrustLevel;
314
+ /** Whether to accept signals below a certain trust level */
315
+ minimumTrust: TrustLevel;
316
+ /** Explicitly trusted colony public keys (always 'verified' if sig checks out) */
317
+ trustedColonies: string[];
318
+ /** Explicitly trusted bridge/attester public keys */
319
+ trustedBridges: string[];
320
+ /**
321
+ * Environments whose signals are accepted via bridge.
322
+ * Empty array = accept from any environment.
323
+ * Undefined = accept from any environment.
324
+ */
325
+ allowedSourceEnvironments?: string[];
326
+ /**
327
+ * Environments whose signals are rejected regardless of attestation.
328
+ */
329
+ blockedSourceEnvironments?: string[];
330
+ /** Whether to quarantine rejected signals (keep but mark) or drop them entirely */
331
+ quarantineRejected: boolean;
332
+ /**
333
+ * Maximum age of the oldest attestation in the chain (ms).
334
+ * Prevents replay attacks with ancient attestation chains.
335
+ */
336
+ maxAttestationAge?: number;
337
+ /**
338
+ * Maximum number of hops (attestations) allowed in the chain.
339
+ * Prevents signals from traveling through too many intermediaries.
340
+ */
341
+ maxAttestationDepth?: number;
342
+ }
343
+ /**
344
+ * Configuration for signal signing within a colony.
345
+ * Passed to colony runtime to enable automatic signing.
346
+ */
347
+ export interface SigningConfig {
348
+ /** Colony identity with private key for signing */
349
+ identity: ColonyIdentity;
350
+ /** Whether to sign all deposited signals (default: true) */
351
+ signAll?: boolean;
352
+ /** Signal types to exclude from signing (e.g., debug signals) */
353
+ excludeTypes?: string[];
354
+ }
355
+ /**
356
+ * Result of verifying a signal's provenance.
357
+ */
358
+ export interface VerificationResult {
359
+ /** The trust level determined by verification */
360
+ trustLevel: TrustLevel;
361
+ /** Whether the colony signature is valid (if present) */
362
+ signatureValid: boolean | null;
363
+ /** Whether the attestation chain is valid (if present) */
364
+ attestationChainValid: boolean | null;
365
+ /** Human-readable reason for the trust level */
366
+ reason: string;
367
+ /** Individual attestation verification results */
368
+ attestationResults?: Array<{
369
+ attester: string;
370
+ valid: boolean;
371
+ reason: string;
372
+ }>;
373
+ }
374
+ /**
375
+ * Bridge configuration for connecting two environments.
376
+ */
377
+ export interface BridgeConfig {
378
+ /** Human-readable bridge name */
379
+ name: string;
380
+ /** Bridge identity for signing attestations */
381
+ identity: ColonyIdentity;
382
+ /** Source environment to mirror signals FROM */
383
+ source: Environment;
384
+ /** Target environment to mirror signals TO */
385
+ target: Environment;
386
+ /** Which signal types to bridge (glob patterns) */
387
+ signalTypes: string[];
388
+ /** Whether to bridge in both directions */
389
+ bidirectional?: boolean;
390
+ /** Transform signals during bridging (e.g., remap types, filter fields) */
391
+ transform?: (signal: Signal) => Signal | null;
392
+ /** How often to poll source for new signals (ms). Only if source doesn't support watch. */
393
+ pollInterval?: number;
394
+ }
395
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ // ============================================================
2
+ // @stigmergy/core — Type System
3
+ // ============================================================
4
+ // The fundamental primitives of stigmergic coordination.
5
+ // Every concept maps to a biological analogy:
6
+ // Signal = pheromone
7
+ // Environment = substrate (ground, nest, repo, filesystem)
8
+ // Colony = ant colony (group of identical agents)
9
+ // Sensor = antennae
10
+ // Actuator = mandibles
11
+ // Rule = instinct (stimulus → response)
12
+ // ============================================================
13
+ export const DEFAULT_DECAY_POLICY = {
14
+ rate: 0.01, // lose 1% per second
15
+ floor: 0.05, // evaporate below 5%
16
+ releaseExpiredClaims: true,
17
+ interval: 5_000, // sweep every 5 seconds
18
+ };
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gCAAgC;AAChC,+DAA+D;AAC/D,yDAAyD;AACzD,8CAA8C;AAC9C,0BAA0B;AAC1B,6DAA6D;AAC7D,uDAAuD;AACvD,yBAAyB;AACzB,0BAA0B;AAC1B,+CAA+C;AAC/C,+DAA+D;AAwW/D,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,IAAI,EAAE,IAAI,EAAW,qBAAqB;IAC1C,KAAK,EAAE,IAAI,EAAU,qBAAqB;IAC1C,oBAAoB,EAAE,IAAI;IAC1B,QAAQ,EAAE,KAAK,EAAM,wBAAwB;CAC9C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { SignalMeta } from './types.js';
2
+ export declare class SignalValidationError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export declare function validateSignalInput(input: {
6
+ type: string;
7
+ payload: unknown;
8
+ meta?: Partial<SignalMeta>;
9
+ }): void;
10
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/core/validation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,GACpE,IAAI,CAkCN"}
@@ -0,0 +1,40 @@
1
+ // ============================================================
2
+ // Signal Validation — reject malformed signals at deposit time
3
+ // ============================================================
4
+ export class SignalValidationError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'SignalValidationError';
8
+ }
9
+ }
10
+ export function validateSignalInput(input) {
11
+ if (typeof input.type !== 'string' || input.type.trim() === '') {
12
+ throw new SignalValidationError('Signal type must be a non-empty string');
13
+ }
14
+ if (input.payload === null || input.payload === undefined || typeof input.payload !== 'object' || Array.isArray(input.payload)) {
15
+ throw new SignalValidationError('Signal payload must be a plain object (not null, not array)');
16
+ }
17
+ if (input.meta) {
18
+ if (input.meta.deposited_by !== undefined) {
19
+ if (typeof input.meta.deposited_by !== 'string' || input.meta.deposited_by.trim() === '') {
20
+ throw new SignalValidationError('Signal meta.deposited_by must be a non-empty string');
21
+ }
22
+ }
23
+ if (input.meta.concentration !== undefined) {
24
+ if (typeof input.meta.concentration !== 'number' || input.meta.concentration < 0 || input.meta.concentration > 1) {
25
+ throw new SignalValidationError('Signal meta.concentration must be a number between 0 and 1');
26
+ }
27
+ }
28
+ if (input.meta.ttl !== undefined) {
29
+ if (typeof input.meta.ttl !== 'number' || input.meta.ttl <= 0) {
30
+ throw new SignalValidationError('Signal meta.ttl must be a positive number');
31
+ }
32
+ }
33
+ if (input.meta.tags !== undefined) {
34
+ if (!Array.isArray(input.meta.tags) || !input.meta.tags.every(t => typeof t === 'string')) {
35
+ throw new SignalValidationError('Signal meta.tags must be an array of strings');
36
+ }
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/core/validation.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,+DAA+D;AAC/D,+DAA+D;AAI/D,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAqE;IAErE,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,qBAAqB,CAAC,wCAAwC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/H,MAAM,IAAI,qBAAqB,CAAC,6DAA6D,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACzF,MAAM,IAAI,qBAAqB,CAAC,qDAAqD,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3C,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;gBACjH,MAAM,IAAI,qBAAqB,CAAC,4DAA4D,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,qBAAqB,CAAC,2CAA2C,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC1F,MAAM,IAAI,qBAAqB,CAAC,8CAA8C,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}