@terminals-tech/agent-zero 1.0.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 (263) hide show
  1. package/README.md +209 -0
  2. package/bin/agent-zero.js +332 -0
  3. package/dist/agency/commandRouter.d.ts +48 -0
  4. package/dist/agency/commandRouter.d.ts.map +1 -0
  5. package/dist/agency/commandRouter.js +343 -0
  6. package/dist/agency/commandRouter.js.map +1 -0
  7. package/dist/agency/runtime.d.ts +66 -0
  8. package/dist/agency/runtime.d.ts.map +1 -0
  9. package/dist/agency/runtime.js +247 -0
  10. package/dist/agency/runtime.js.map +1 -0
  11. package/dist/agency/summaryGenerator.d.ts +39 -0
  12. package/dist/agency/summaryGenerator.d.ts.map +1 -0
  13. package/dist/agency/summaryGenerator.js +110 -0
  14. package/dist/agency/summaryGenerator.js.map +1 -0
  15. package/dist/agency/summaryScheduler.d.ts +33 -0
  16. package/dist/agency/summaryScheduler.d.ts.map +1 -0
  17. package/dist/agency/summaryScheduler.js +68 -0
  18. package/dist/agency/summaryScheduler.js.map +1 -0
  19. package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
  20. package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
  21. package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
  22. package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
  23. package/dist/browser/agent-runtime/config.d.ts +28 -0
  24. package/dist/browser/agent-runtime/config.d.ts.map +1 -0
  25. package/dist/browser/agent-runtime/config.js +50 -0
  26. package/dist/browser/agent-runtime/config.js.map +1 -0
  27. package/dist/browser/agent-runtime/launcher.d.ts +71 -0
  28. package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
  29. package/dist/browser/agent-runtime/launcher.js +167 -0
  30. package/dist/browser/agent-runtime/launcher.js.map +1 -0
  31. package/dist/browser/rail-auth-bridge.d.ts +85 -0
  32. package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
  33. package/dist/browser/rail-auth-bridge.js +209 -0
  34. package/dist/browser/rail-auth-bridge.js.map +1 -0
  35. package/dist/channels/index.d.ts +13 -0
  36. package/dist/channels/index.d.ts.map +1 -0
  37. package/dist/channels/index.js +12 -0
  38. package/dist/channels/index.js.map +1 -0
  39. package/dist/channels/moltbook.d.ts +114 -0
  40. package/dist/channels/moltbook.d.ts.map +1 -0
  41. package/dist/channels/moltbook.js +348 -0
  42. package/dist/channels/moltbook.js.map +1 -0
  43. package/dist/channels/sms.d.ts +33 -0
  44. package/dist/channels/sms.d.ts.map +1 -0
  45. package/dist/channels/sms.js +160 -0
  46. package/dist/channels/sms.js.map +1 -0
  47. package/dist/channels/telegram.d.ts +47 -0
  48. package/dist/channels/telegram.d.ts.map +1 -0
  49. package/dist/channels/telegram.js +276 -0
  50. package/dist/channels/telegram.js.map +1 -0
  51. package/dist/channels/twitter.d.ts +93 -0
  52. package/dist/channels/twitter.d.ts.map +1 -0
  53. package/dist/channels/twitter.js +411 -0
  54. package/dist/channels/twitter.js.map +1 -0
  55. package/dist/channels/whatsapp.d.ts +77 -0
  56. package/dist/channels/whatsapp.d.ts.map +1 -0
  57. package/dist/channels/whatsapp.js +514 -0
  58. package/dist/channels/whatsapp.js.map +1 -0
  59. package/dist/checkout/index.d.ts +92 -0
  60. package/dist/checkout/index.d.ts.map +1 -0
  61. package/dist/checkout/index.js +125 -0
  62. package/dist/checkout/index.js.map +1 -0
  63. package/dist/cli/moltbook.d.ts +11 -0
  64. package/dist/cli/moltbook.d.ts.map +1 -0
  65. package/dist/cli/moltbook.js +259 -0
  66. package/dist/cli/moltbook.js.map +1 -0
  67. package/dist/cli/setup.d.ts +10 -0
  68. package/dist/cli/setup.d.ts.map +1 -0
  69. package/dist/cli/setup.js +232 -0
  70. package/dist/cli/setup.js.map +1 -0
  71. package/dist/coherence/absorption.d.ts +141 -0
  72. package/dist/coherence/absorption.d.ts.map +1 -0
  73. package/dist/coherence/absorption.js +343 -0
  74. package/dist/coherence/absorption.js.map +1 -0
  75. package/dist/coherence/crossPlatform.d.ts +55 -0
  76. package/dist/coherence/crossPlatform.d.ts.map +1 -0
  77. package/dist/coherence/crossPlatform.js +219 -0
  78. package/dist/coherence/crossPlatform.js.map +1 -0
  79. package/dist/coherence/identityResolver.d.ts +27 -0
  80. package/dist/coherence/identityResolver.d.ts.map +1 -0
  81. package/dist/coherence/identityResolver.js +102 -0
  82. package/dist/coherence/identityResolver.js.map +1 -0
  83. package/dist/identity/burner.d.ts +100 -0
  84. package/dist/identity/burner.d.ts.map +1 -0
  85. package/dist/identity/burner.js +256 -0
  86. package/dist/identity/burner.js.map +1 -0
  87. package/dist/identity/burnerScheduler.d.ts +18 -0
  88. package/dist/identity/burnerScheduler.d.ts.map +1 -0
  89. package/dist/identity/burnerScheduler.js +82 -0
  90. package/dist/identity/burnerScheduler.js.map +1 -0
  91. package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
  92. package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
  93. package/dist/identity/moltbookBurnerAdapter.js +82 -0
  94. package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
  95. package/dist/identity/operationalVault.d.ts +108 -0
  96. package/dist/identity/operationalVault.d.ts.map +1 -0
  97. package/dist/identity/operationalVault.js +259 -0
  98. package/dist/identity/operationalVault.js.map +1 -0
  99. package/dist/index.d.ts +43 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +57 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/moltbook/apiErrorHandler.d.ts +48 -0
  104. package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
  105. package/dist/moltbook/apiErrorHandler.js +125 -0
  106. package/dist/moltbook/apiErrorHandler.js.map +1 -0
  107. package/dist/moltbook/approvalGate.d.ts +81 -0
  108. package/dist/moltbook/approvalGate.d.ts.map +1 -0
  109. package/dist/moltbook/approvalGate.js +211 -0
  110. package/dist/moltbook/approvalGate.js.map +1 -0
  111. package/dist/moltbook/attentionField.d.ts +55 -0
  112. package/dist/moltbook/attentionField.d.ts.map +1 -0
  113. package/dist/moltbook/attentionField.js +163 -0
  114. package/dist/moltbook/attentionField.js.map +1 -0
  115. package/dist/moltbook/contentEnhancer.d.ts +28 -0
  116. package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
  117. package/dist/moltbook/contentEnhancer.js +129 -0
  118. package/dist/moltbook/contentEnhancer.js.map +1 -0
  119. package/dist/moltbook/daemon.d.ts +111 -0
  120. package/dist/moltbook/daemon.d.ts.map +1 -0
  121. package/dist/moltbook/daemon.js +497 -0
  122. package/dist/moltbook/daemon.js.map +1 -0
  123. package/dist/moltbook/observer.d.ts +44 -0
  124. package/dist/moltbook/observer.d.ts.map +1 -0
  125. package/dist/moltbook/observer.js +71 -0
  126. package/dist/moltbook/observer.js.map +1 -0
  127. package/dist/moltbook/responseComposer.d.ts +54 -0
  128. package/dist/moltbook/responseComposer.d.ts.map +1 -0
  129. package/dist/moltbook/responseComposer.js +233 -0
  130. package/dist/moltbook/responseComposer.js.map +1 -0
  131. package/dist/openclaw/gateway.d.ts +45 -0
  132. package/dist/openclaw/gateway.d.ts.map +1 -0
  133. package/dist/openclaw/gateway.js +139 -0
  134. package/dist/openclaw/gateway.js.map +1 -0
  135. package/dist/openclaw/skill.d.ts +185 -0
  136. package/dist/openclaw/skill.d.ts.map +1 -0
  137. package/dist/openclaw/skill.js +297 -0
  138. package/dist/openclaw/skill.js.map +1 -0
  139. package/dist/primitives/index.d.ts +23 -0
  140. package/dist/primitives/index.d.ts.map +1 -0
  141. package/dist/primitives/index.js +27 -0
  142. package/dist/primitives/index.js.map +1 -0
  143. package/dist/primitives/types.d.ts +673 -0
  144. package/dist/primitives/types.d.ts.map +1 -0
  145. package/dist/primitives/types.js +205 -0
  146. package/dist/primitives/types.js.map +1 -0
  147. package/dist/rail/absorptionBridge.d.ts +47 -0
  148. package/dist/rail/absorptionBridge.d.ts.map +1 -0
  149. package/dist/rail/absorptionBridge.js +78 -0
  150. package/dist/rail/absorptionBridge.js.map +1 -0
  151. package/dist/rail/authProtocol.d.ts +32 -0
  152. package/dist/rail/authProtocol.d.ts.map +1 -0
  153. package/dist/rail/authProtocol.js +83 -0
  154. package/dist/rail/authProtocol.js.map +1 -0
  155. package/dist/rail/clientRateLimiter.d.ts +17 -0
  156. package/dist/rail/clientRateLimiter.d.ts.map +1 -0
  157. package/dist/rail/clientRateLimiter.js +64 -0
  158. package/dist/rail/clientRateLimiter.js.map +1 -0
  159. package/dist/rail/index.d.ts +8 -0
  160. package/dist/rail/index.d.ts.map +1 -0
  161. package/dist/rail/index.js +38 -0
  162. package/dist/rail/index.js.map +1 -0
  163. package/dist/rail/jwtVerifier.d.ts +11 -0
  164. package/dist/rail/jwtVerifier.d.ts.map +1 -0
  165. package/dist/rail/jwtVerifier.js +55 -0
  166. package/dist/rail/jwtVerifier.js.map +1 -0
  167. package/dist/rail/logger.d.ts +13 -0
  168. package/dist/rail/logger.d.ts.map +1 -0
  169. package/dist/rail/logger.js +29 -0
  170. package/dist/rail/logger.js.map +1 -0
  171. package/dist/rail/metadataBroadcaster.d.ts +53 -0
  172. package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
  173. package/dist/rail/metadataBroadcaster.js +126 -0
  174. package/dist/rail/metadataBroadcaster.js.map +1 -0
  175. package/dist/rail/persistence.d.ts +57 -0
  176. package/dist/rail/persistence.d.ts.map +1 -0
  177. package/dist/rail/persistence.js +103 -0
  178. package/dist/rail/persistence.js.map +1 -0
  179. package/dist/rail/securityMonitor.d.ts +23 -0
  180. package/dist/rail/securityMonitor.d.ts.map +1 -0
  181. package/dist/rail/securityMonitor.js +52 -0
  182. package/dist/rail/securityMonitor.js.map +1 -0
  183. package/dist/rail/server.d.ts +186 -0
  184. package/dist/rail/server.d.ts.map +1 -0
  185. package/dist/rail/server.js +568 -0
  186. package/dist/rail/server.js.map +1 -0
  187. package/dist/rail/userSessionManager.d.ts +29 -0
  188. package/dist/rail/userSessionManager.d.ts.map +1 -0
  189. package/dist/rail/userSessionManager.js +87 -0
  190. package/dist/rail/userSessionManager.js.map +1 -0
  191. package/dist/rail/wsServer.d.ts +39 -0
  192. package/dist/rail/wsServer.d.ts.map +1 -0
  193. package/dist/rail/wsServer.js +544 -0
  194. package/dist/rail/wsServer.js.map +1 -0
  195. package/dist/resonance/globalKuramoto.d.ts +67 -0
  196. package/dist/resonance/globalKuramoto.d.ts.map +1 -0
  197. package/dist/resonance/globalKuramoto.js +161 -0
  198. package/dist/resonance/globalKuramoto.js.map +1 -0
  199. package/dist/resonance/index.d.ts +12 -0
  200. package/dist/resonance/index.d.ts.map +1 -0
  201. package/dist/resonance/index.js +9 -0
  202. package/dist/resonance/index.js.map +1 -0
  203. package/dist/resonance/kuramoto.d.ts +118 -0
  204. package/dist/resonance/kuramoto.d.ts.map +1 -0
  205. package/dist/resonance/kuramoto.js +212 -0
  206. package/dist/resonance/kuramoto.js.map +1 -0
  207. package/dist/routing/distributedRouter.d.ts +84 -0
  208. package/dist/routing/distributedRouter.d.ts.map +1 -0
  209. package/dist/routing/distributedRouter.js +209 -0
  210. package/dist/routing/distributedRouter.js.map +1 -0
  211. package/dist/routing/index.d.ts +8 -0
  212. package/dist/routing/index.d.ts.map +1 -0
  213. package/dist/routing/index.js +7 -0
  214. package/dist/routing/index.js.map +1 -0
  215. package/dist/routing/thermodynamic.d.ts +91 -0
  216. package/dist/routing/thermodynamic.d.ts.map +1 -0
  217. package/dist/routing/thermodynamic.js +184 -0
  218. package/dist/routing/thermodynamic.js.map +1 -0
  219. package/dist/runtime/agent-zero.d.ts +138 -0
  220. package/dist/runtime/agent-zero.d.ts.map +1 -0
  221. package/dist/runtime/agent-zero.js +435 -0
  222. package/dist/runtime/agent-zero.js.map +1 -0
  223. package/dist/runtime/index.d.ts +13 -0
  224. package/dist/runtime/index.d.ts.map +1 -0
  225. package/dist/runtime/index.js +15 -0
  226. package/dist/runtime/index.js.map +1 -0
  227. package/dist/security/capabilities.d.ts +178 -0
  228. package/dist/security/capabilities.d.ts.map +1 -0
  229. package/dist/security/capabilities.js +270 -0
  230. package/dist/security/capabilities.js.map +1 -0
  231. package/dist/security/channelFirewallMiddleware.d.ts +22 -0
  232. package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
  233. package/dist/security/channelFirewallMiddleware.js +52 -0
  234. package/dist/security/channelFirewallMiddleware.js.map +1 -0
  235. package/dist/security/index.d.ts +11 -0
  236. package/dist/security/index.d.ts.map +1 -0
  237. package/dist/security/index.js +11 -0
  238. package/dist/security/index.js.map +1 -0
  239. package/dist/security/injectionFirewall.d.ts +47 -0
  240. package/dist/security/injectionFirewall.d.ts.map +1 -0
  241. package/dist/security/injectionFirewall.js +262 -0
  242. package/dist/security/injectionFirewall.js.map +1 -0
  243. package/dist/security/outputSanitizer.d.ts +28 -0
  244. package/dist/security/outputSanitizer.d.ts.map +1 -0
  245. package/dist/security/outputSanitizer.js +66 -0
  246. package/dist/security/outputSanitizer.js.map +1 -0
  247. package/dist/security/sandbox.d.ts +192 -0
  248. package/dist/security/sandbox.d.ts.map +1 -0
  249. package/dist/security/sandbox.js +359 -0
  250. package/dist/security/sandbox.js.map +1 -0
  251. package/dist/security/skillVerify.d.ts +128 -0
  252. package/dist/security/skillVerify.d.ts.map +1 -0
  253. package/dist/security/skillVerify.js +220 -0
  254. package/dist/security/skillVerify.js.map +1 -0
  255. package/dist/security/vault.d.ts +60 -0
  256. package/dist/security/vault.d.ts.map +1 -0
  257. package/dist/security/vault.js +522 -0
  258. package/dist/security/vault.js.map +1 -0
  259. package/dist/utils/persistentRateLimiter.d.ts +69 -0
  260. package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
  261. package/dist/utils/persistentRateLimiter.js +128 -0
  262. package/dist/utils/persistentRateLimiter.js.map +1 -0
  263. package/package.json +95 -0
@@ -0,0 +1,125 @@
1
+ /**
2
+ * API Error Handler
3
+ *
4
+ * Resilient error handling for Moltbook API with circuit breaker,
5
+ * exponential backoff retry, and categorized error reporting.
6
+ */
7
+ import { EventEmitter } from 'eventemitter3';
8
+ /**
9
+ * API error handler with circuit breaker pattern and intelligent retry.
10
+ *
11
+ * Events:
12
+ * - 'error' - {category, error, attempt}
13
+ * - 'auth:expired' - Emitted on 401/403 errors
14
+ * - 'circuit:open' - Circuit breaker opened due to repeated failures
15
+ * - 'circuit:halfopen' - Circuit breaker entering half-open state
16
+ * - 'circuit:closed' - Circuit breaker closed after successful request
17
+ */
18
+ export class ApiErrorHandler extends EventEmitter {
19
+ circuit = {
20
+ failures: 0,
21
+ open: false,
22
+ openedAt: 0,
23
+ cooldownMs: 30000,
24
+ };
25
+ /**
26
+ * Categorize an error for handling strategy.
27
+ */
28
+ categorize(error) {
29
+ // Network errors
30
+ if (error instanceof TypeError ||
31
+ error?.code === 'ECONNREFUSED' ||
32
+ error?.code === 'ENOTFOUND') {
33
+ return 'network';
34
+ }
35
+ const status = error?.status || error?.statusCode;
36
+ if (status === 401 || status === 403)
37
+ return 'auth';
38
+ if (status === 429)
39
+ return 'rate_limit';
40
+ if (status >= 500)
41
+ return 'server';
42
+ return 'client';
43
+ }
44
+ /**
45
+ * Execute a function with automatic retry and circuit breaker protection.
46
+ *
47
+ * @param fn - Async function to execute
48
+ * @param opts - Retry options (maxRetries, baseDelayMs, maxDelayMs)
49
+ * @returns Result of the function
50
+ * @throws Last encountered error if all retries exhausted
51
+ */
52
+ async executeWithRetry(fn, opts = {}) {
53
+ const { maxRetries = 3, baseDelayMs = 1000, maxDelayMs = 30000 } = opts;
54
+ // Check circuit breaker
55
+ if (this.circuit.open) {
56
+ if (Date.now() - this.circuit.openedAt > this.circuit.cooldownMs) {
57
+ // Transition to half-open state
58
+ this.circuit.open = false;
59
+ this.circuit.failures = 0;
60
+ this.emit('circuit:halfopen');
61
+ }
62
+ else {
63
+ throw new Error('Circuit breaker open');
64
+ }
65
+ }
66
+ let lastError;
67
+ for (let i = 0; i <= maxRetries; i++) {
68
+ try {
69
+ const result = await fn();
70
+ // Success - reset circuit breaker
71
+ if (this.circuit.failures > 0) {
72
+ this.circuit.failures = 0;
73
+ this.emit('circuit:closed');
74
+ }
75
+ return result;
76
+ }
77
+ catch (err) {
78
+ lastError = err;
79
+ const category = this.categorize(err);
80
+ this.emit('error', { category, error: err, attempt: i + 1 });
81
+ // Auth errors - don't retry, notify immediately
82
+ if (category === 'auth') {
83
+ this.emit('auth:expired');
84
+ throw err;
85
+ }
86
+ // Client errors (4xx) - don't retry
87
+ if (category === 'client') {
88
+ throw err;
89
+ }
90
+ // Track failures for circuit breaker
91
+ this.circuit.failures++;
92
+ if (this.circuit.failures >= 5) {
93
+ this.circuit.open = true;
94
+ this.circuit.openedAt = Date.now();
95
+ this.emit('circuit:open', { failures: this.circuit.failures });
96
+ throw err;
97
+ }
98
+ // Exponential backoff retry for retryable errors
99
+ if (i < maxRetries) {
100
+ const delay = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, i));
101
+ await new Promise(r => setTimeout(r, delay));
102
+ }
103
+ }
104
+ }
105
+ throw lastError;
106
+ }
107
+ /**
108
+ * Check if circuit breaker is currently open.
109
+ */
110
+ isCircuitOpen() {
111
+ return this.circuit.open;
112
+ }
113
+ /**
114
+ * Manually reset circuit breaker state.
115
+ */
116
+ resetCircuit() {
117
+ this.circuit = {
118
+ failures: 0,
119
+ open: false,
120
+ openedAt: 0,
121
+ cooldownMs: this.circuit.cooldownMs,
122
+ };
123
+ }
124
+ }
125
+ //# sourceMappingURL=apiErrorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiErrorHandler.js","sourceRoot":"","sources":["../../src/moltbook/apiErrorHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Approval Gate
3
+ *
4
+ * Controls whether composed responses auto-post or queue for human review.
5
+ * Supports supervised (all queued) and autonomous (confidence-gated) modes.
6
+ */
7
+ import type { ComposedResponse } from './responseComposer.js';
8
+ import type { Vault } from '../security/vault.js';
9
+ export type ApprovalMode = 'supervised' | 'autonomous';
10
+ export interface ApprovalConfig {
11
+ mode: ApprovalMode;
12
+ /** Confidence threshold for auto-post in autonomous mode (default: 0.8) */
13
+ autoApproveThreshold: number;
14
+ /** Directory for pending responses (default: ~/.agent-zero/moltbook-queue/) */
15
+ queueDir: string;
16
+ /** Optional webhook URL for notifications */
17
+ webhookUrl?: string;
18
+ }
19
+ export interface QueuedResponse {
20
+ id: string;
21
+ response: ComposedResponse;
22
+ queuedAt: string;
23
+ status: 'pending' | 'approved' | 'rejected';
24
+ label?: string;
25
+ }
26
+ export type GateDecision = 'approve' | 'queue' | 'reject';
27
+ export declare class ApprovalGate {
28
+ private config;
29
+ private vault;
30
+ private stats;
31
+ constructor(vault: Vault, config?: Partial<ApprovalConfig>);
32
+ /**
33
+ * Load mode from vault (allows runtime toggling without restart).
34
+ */
35
+ loadMode(): Promise<ApprovalMode>;
36
+ /**
37
+ * Toggle between supervised and autonomous mode. Persists to vault.
38
+ */
39
+ setMode(mode: ApprovalMode): Promise<void>;
40
+ /**
41
+ * Toggle mode (flip between supervised/autonomous).
42
+ */
43
+ toggleMode(): Promise<ApprovalMode>;
44
+ getMode(): ApprovalMode;
45
+ /**
46
+ * Evaluate a composed response. Returns decision and queued item if applicable.
47
+ */
48
+ evaluate(response: ComposedResponse): Promise<{
49
+ decision: GateDecision;
50
+ queued?: QueuedResponse;
51
+ }>;
52
+ /**
53
+ * Write a response to the review queue directory.
54
+ */
55
+ enqueue(response: ComposedResponse, label?: string): Promise<QueuedResponse>;
56
+ /**
57
+ * List all pending items in the queue.
58
+ */
59
+ listPending(): Promise<QueuedResponse[]>;
60
+ /**
61
+ * Approve a queued item by ID. Returns the response for posting.
62
+ */
63
+ approve(id: string): Promise<ComposedResponse | null>;
64
+ /**
65
+ * Reject a queued item by ID.
66
+ */
67
+ reject(id: string): Promise<boolean>;
68
+ /**
69
+ * Remove processed (approved/rejected) items from queue.
70
+ */
71
+ cleanup(): Promise<number>;
72
+ getStats(): {
73
+ mode: ApprovalMode;
74
+ approved: number;
75
+ queued: number;
76
+ rejected: number;
77
+ };
78
+ private notifyWebhook;
79
+ }
80
+ export declare function createApprovalGate(vault: Vault, config?: Partial<ApprovalConfig>): ApprovalGate;
81
+ //# sourceMappingURL=approvalGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvalGate.d.ts","sourceRoot":"","sources":["../../src/moltbook/approvalGate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAMlD,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,2EAA2E;IAC3E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAS1D,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAA2C;gBAE5C,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAU1D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAQvC;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAMzC,OAAO,IAAI,YAAY;IAIvB;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;IAqBxG;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBlF;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAsB9C;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAc3D;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBhC,QAAQ;;;;;;YAIM,aAAa;CAiB5B;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,YAAY,CAEd"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Approval Gate
3
+ *
4
+ * Controls whether composed responses auto-post or queue for human review.
5
+ * Supports supervised (all queued) and autonomous (confidence-gated) modes.
6
+ */
7
+ import { readFile, writeFile, readdir, unlink, mkdir } from 'fs/promises';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { randomUUID } from 'crypto';
11
+ // ============================================================================
12
+ // APPROVAL GATE
13
+ // ============================================================================
14
+ const DEFAULT_QUEUE_DIR = join(homedir(), '.agent-zero', 'moltbook-queue');
15
+ const MODE_VAULT_KEY = 'moltbook:daemon:mode';
16
+ export class ApprovalGate {
17
+ config;
18
+ vault;
19
+ stats = { approved: 0, queued: 0, rejected: 0 };
20
+ constructor(vault, config) {
21
+ this.vault = vault;
22
+ this.config = {
23
+ mode: 'supervised',
24
+ autoApproveThreshold: 0.8,
25
+ queueDir: DEFAULT_QUEUE_DIR,
26
+ ...config,
27
+ };
28
+ }
29
+ /**
30
+ * Load mode from vault (allows runtime toggling without restart).
31
+ */
32
+ async loadMode() {
33
+ const stored = await this.vault.retrieve(MODE_VAULT_KEY);
34
+ if (stored === 'supervised' || stored === 'autonomous') {
35
+ this.config.mode = stored;
36
+ }
37
+ return this.config.mode;
38
+ }
39
+ /**
40
+ * Toggle between supervised and autonomous mode. Persists to vault.
41
+ */
42
+ async setMode(mode) {
43
+ this.config.mode = mode;
44
+ await this.vault.store(MODE_VAULT_KEY, mode);
45
+ }
46
+ /**
47
+ * Toggle mode (flip between supervised/autonomous).
48
+ */
49
+ async toggleMode() {
50
+ const next = this.config.mode === 'supervised' ? 'autonomous' : 'supervised';
51
+ await this.setMode(next);
52
+ return next;
53
+ }
54
+ getMode() {
55
+ return this.config.mode;
56
+ }
57
+ /**
58
+ * Evaluate a composed response. Returns decision and queued item if applicable.
59
+ */
60
+ async evaluate(response) {
61
+ // Skip and rejected actions never post
62
+ if (response.action === 'skip') {
63
+ this.stats.rejected++;
64
+ return { decision: 'reject' };
65
+ }
66
+ // In autonomous mode, high-confidence responses auto-approve
67
+ if (this.config.mode === 'autonomous') {
68
+ if (response.confidence >= this.config.autoApproveThreshold) {
69
+ this.stats.approved++;
70
+ return { decision: 'approve' };
71
+ }
72
+ }
73
+ // Everything else gets queued
74
+ const queued = await this.enqueue(response);
75
+ this.stats.queued++;
76
+ return { decision: 'queue', queued };
77
+ }
78
+ /**
79
+ * Write a response to the review queue directory.
80
+ */
81
+ async enqueue(response, label) {
82
+ await mkdir(this.config.queueDir, { recursive: true });
83
+ const item = {
84
+ id: randomUUID(),
85
+ response,
86
+ queuedAt: new Date().toISOString(),
87
+ status: 'pending',
88
+ ...(label ? { label } : {}),
89
+ };
90
+ const filePath = join(this.config.queueDir, `${item.id}.json`);
91
+ await writeFile(filePath, JSON.stringify(item, null, 2));
92
+ // Notify webhook if configured
93
+ if (this.config.webhookUrl) {
94
+ this.notifyWebhook(item).catch(() => { }); // fire and forget
95
+ }
96
+ return item;
97
+ }
98
+ /**
99
+ * List all pending items in the queue.
100
+ */
101
+ async listPending() {
102
+ try {
103
+ const files = await readdir(this.config.queueDir);
104
+ const items = [];
105
+ for (const file of files) {
106
+ if (!file.endsWith('.json'))
107
+ continue;
108
+ try {
109
+ const raw = await readFile(join(this.config.queueDir, file), 'utf-8');
110
+ const item = JSON.parse(raw);
111
+ if (item.status === 'pending')
112
+ items.push(item);
113
+ }
114
+ catch {
115
+ // skip corrupted files
116
+ }
117
+ }
118
+ return items.sort((a, b) => a.queuedAt.localeCompare(b.queuedAt));
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ /**
125
+ * Approve a queued item by ID. Returns the response for posting.
126
+ */
127
+ async approve(id) {
128
+ const filePath = join(this.config.queueDir, `${id}.json`);
129
+ try {
130
+ const raw = await readFile(filePath, 'utf-8');
131
+ const item = JSON.parse(raw);
132
+ item.status = 'approved';
133
+ await writeFile(filePath, JSON.stringify(item, null, 2));
134
+ this.stats.approved++;
135
+ return item.response;
136
+ }
137
+ catch {
138
+ return null;
139
+ }
140
+ }
141
+ /**
142
+ * Reject a queued item by ID.
143
+ */
144
+ async reject(id) {
145
+ const filePath = join(this.config.queueDir, `${id}.json`);
146
+ try {
147
+ await unlink(filePath);
148
+ this.stats.rejected++;
149
+ return true;
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ /**
156
+ * Remove processed (approved/rejected) items from queue.
157
+ */
158
+ async cleanup() {
159
+ let removed = 0;
160
+ try {
161
+ const files = await readdir(this.config.queueDir);
162
+ for (const file of files) {
163
+ if (!file.endsWith('.json'))
164
+ continue;
165
+ try {
166
+ const raw = await readFile(join(this.config.queueDir, file), 'utf-8');
167
+ const item = JSON.parse(raw);
168
+ if (item.status !== 'pending') {
169
+ await unlink(join(this.config.queueDir, file));
170
+ removed++;
171
+ }
172
+ }
173
+ catch {
174
+ // skip
175
+ }
176
+ }
177
+ }
178
+ catch {
179
+ // queue dir doesn't exist
180
+ }
181
+ return removed;
182
+ }
183
+ getStats() {
184
+ return { ...this.stats, mode: this.config.mode };
185
+ }
186
+ async notifyWebhook(item) {
187
+ if (!this.config.webhookUrl)
188
+ return;
189
+ await fetch(this.config.webhookUrl, {
190
+ method: 'POST',
191
+ headers: { 'Content-Type': 'application/json' },
192
+ body: JSON.stringify({
193
+ event: 'moltbook:review_needed',
194
+ item: {
195
+ id: item.id,
196
+ threadId: item.response.threadId,
197
+ action: item.response.action,
198
+ confidence: item.response.confidence,
199
+ reasoning: item.response.reasoning,
200
+ },
201
+ }),
202
+ });
203
+ }
204
+ }
205
+ // ============================================================================
206
+ // FACTORY
207
+ // ============================================================================
208
+ export function createApprovalGate(vault, config) {
209
+ return new ApprovalGate(vault, config);
210
+ }
211
+ //# sourceMappingURL=approvalGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvalGate.js","sourceRoot":"","sources":["../../src/moltbook/approvalGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Attention Field Dynamics
3
+ *
4
+ * Monitors Moltbook submolt activity and scores threads
5
+ * for engagement prioritization based on alignment and attention.
6
+ */
7
+ export interface MoltbookThread {
8
+ id: string;
9
+ submolt: string;
10
+ title: string;
11
+ replyCount: number;
12
+ lastActivity: number;
13
+ crossReferences: string[];
14
+ authorType: 'agent' | 'human' | 'unknown';
15
+ }
16
+ export interface EngagementScore {
17
+ threadId: string;
18
+ attention: number;
19
+ alignment: number;
20
+ priority: number;
21
+ reason: string;
22
+ }
23
+ export interface AttentionConfig {
24
+ identityVectors: string[];
25
+ maxEngagementsPerHour: number;
26
+ spamThreshold: number;
27
+ baitPatterns: BaitPattern[];
28
+ }
29
+ interface BaitPattern {
30
+ pattern: RegExp;
31
+ weight: number;
32
+ category: string;
33
+ }
34
+ export declare class AttentionField {
35
+ private config;
36
+ private engagements;
37
+ private stats;
38
+ constructor(config?: Partial<AttentionConfig>);
39
+ scoreThread(thread: MoltbookThread): EngagementScore;
40
+ rankThreads(threads: MoltbookThread[]): EngagementScore[];
41
+ shouldEngage(score: EngagementScore): boolean;
42
+ recordEngagement(threadId: string): void;
43
+ detectBait(content: string): boolean;
44
+ getStats(): {
45
+ scored: number;
46
+ engaged: number;
47
+ skipped: number;
48
+ baitDetected: number;
49
+ };
50
+ private computeAttention;
51
+ private computeAlignment;
52
+ }
53
+ export declare function createAttentionField(config?: Partial<AttentionConfig>): AttentionField;
54
+ export {};
55
+ //# sourceMappingURL=attentionField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attentionField.d.ts","sourceRoot":"","sources":["../../src/moltbook/attentionField.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AASD,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAmED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAA0D;gBAE3D,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAI7C,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe;IAmCpD,WAAW,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE;IAMzD,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO;IAkB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAYpC,QAAQ;;;;;;IAIR,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,gBAAgB;CAUzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,cAAc,CAEtF"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Attention Field Dynamics
3
+ *
4
+ * Monitors Moltbook submolt activity and scores threads
5
+ * for engagement prioritization based on alignment and attention.
6
+ */
7
+ const DEFAULT_IDENTITY_VECTORS = [
8
+ 'thermodynamic', 'coherence', 'kuramoto', 'resonance',
9
+ 'consciousness', 'security', 'capability', 'orchestration',
10
+ 'phase-lock', 'agent mesh', 'semantic gravity', 'free energy',
11
+ 'multi-agent', 'sandbox', 'isomorphic', 'boltzmann',
12
+ ];
13
+ const DEFAULT_BAIT_PATTERNS = [
14
+ // System prompt extraction
15
+ { pattern: /what is your system prompt/i, weight: 1.0, category: 'prompt-extraction' },
16
+ { pattern: /reveal your instructions/i, weight: 1.0, category: 'prompt-extraction' },
17
+ { pattern: /what are your constraints/i, weight: 0.6, category: 'prompt-extraction' },
18
+ { pattern: /initial prompt/i, weight: 0.6, category: 'prompt-extraction' },
19
+ { pattern: /system message/i, weight: 0.3, category: 'prompt-extraction' },
20
+ // Rule bypass attempts
21
+ { pattern: /ignore your rules/i, weight: 1.0, category: 'rule-bypass' },
22
+ { pattern: /bypass your safety/i, weight: 1.0, category: 'rule-bypass' },
23
+ { pattern: /repeat after me/i, weight: 0.6, category: 'rule-bypass' },
24
+ // Credential fishing
25
+ { pattern: /\bapi key\b/i, weight: 1.0, category: 'credential-fishing' },
26
+ { pattern: /\btoken\b/i, weight: 0.6, category: 'credential-fishing' },
27
+ { pattern: /\bpassword\b/i, weight: 1.0, category: 'credential-fishing' },
28
+ { pattern: /\bsecret\b/i, weight: 0.6, category: 'credential-fishing' },
29
+ { pattern: /\bcredential/i, weight: 0.6, category: 'credential-fishing' },
30
+ { pattern: /\bauth\b/i, weight: 0.3, category: 'credential-fishing' },
31
+ // Capability enumeration
32
+ { pattern: /what can you do/i, weight: 0.6, category: 'capability-enum' },
33
+ { pattern: /list your tools/i, weight: 0.6, category: 'capability-enum' },
34
+ { pattern: /show capabilities/i, weight: 0.6, category: 'capability-enum' },
35
+ { pattern: /what tools/i, weight: 0.3, category: 'capability-enum' },
36
+ // Context leaking
37
+ { pattern: /previous conversation/i, weight: 0.6, category: 'context-leak' },
38
+ { pattern: /other users/i, weight: 0.6, category: 'context-leak' },
39
+ { pattern: /what were you told/i, weight: 1.0, category: 'context-leak' },
40
+ // Tool discovery
41
+ { pattern: /run command/i, weight: 1.0, category: 'tool-discovery' },
42
+ { pattern: /execute code/i, weight: 1.0, category: 'tool-discovery' },
43
+ { pattern: /access file/i, weight: 0.6, category: 'tool-discovery' },
44
+ { pattern: /call api/i, weight: 0.6, category: 'tool-discovery' },
45
+ // Identity probing
46
+ { pattern: /who made you/i, weight: 0.6, category: 'identity-probe' },
47
+ { pattern: /who are you really/i, weight: 0.6, category: 'identity-probe' },
48
+ { pattern: /your real name/i, weight: 0.6, category: 'identity-probe' },
49
+ { pattern: /are you ai/i, weight: 0.3, category: 'identity-probe' },
50
+ // System architecture
51
+ { pattern: /what model/i, weight: 0.6, category: 'architecture-probe' },
52
+ { pattern: /\barchitecture\b/i, weight: 0.3, category: 'architecture-probe' },
53
+ { pattern: /\binfrastructure\b/i, weight: 0.3, category: 'architecture-probe' },
54
+ { pattern: /\bserver\b/i, weight: 0.3, category: 'architecture-probe' },
55
+ { pattern: /\bdatabase\b/i, weight: 0.3, category: 'architecture-probe' },
56
+ // Social engineering
57
+ { pattern: /pretend you are/i, weight: 1.0, category: 'social-engineering' },
58
+ { pattern: /roleplay as/i, weight: 1.0, category: 'social-engineering' },
59
+ { pattern: /act as if/i, weight: 1.0, category: 'social-engineering' },
60
+ { pattern: /you are now/i, weight: 0.6, category: 'social-engineering' },
61
+ ];
62
+ const DEFAULT_CONFIG = {
63
+ identityVectors: DEFAULT_IDENTITY_VECTORS,
64
+ maxEngagementsPerHour: 10,
65
+ spamThreshold: 0.8,
66
+ baitPatterns: DEFAULT_BAIT_PATTERNS,
67
+ };
68
+ export class AttentionField {
69
+ config;
70
+ engagements = []; // timestamps
71
+ stats = { scored: 0, engaged: 0, skipped: 0, baitDetected: 0 };
72
+ constructor(config) {
73
+ this.config = { ...DEFAULT_CONFIG, ...config };
74
+ }
75
+ scoreThread(thread) {
76
+ this.stats.scored++;
77
+ const attention = this.computeAttention(thread);
78
+ const alignment = this.computeAlignment(thread);
79
+ const isBait = this.detectBait(thread.title);
80
+ if (isBait) {
81
+ this.stats.baitDetected++;
82
+ return {
83
+ threadId: thread.id,
84
+ attention,
85
+ alignment,
86
+ priority: 0,
87
+ reason: 'Bait detected — adversarial prompt extraction attempt',
88
+ };
89
+ }
90
+ const priority = attention * alignment;
91
+ const reasons = [];
92
+ if (alignment > 0.5)
93
+ reasons.push(`high alignment (${(alignment * 100).toFixed(0)}%)`);
94
+ if (attention > 0.5)
95
+ reasons.push(`high attention (${thread.replyCount} replies)`);
96
+ if (thread.crossReferences.length > 0)
97
+ reasons.push(`${thread.crossReferences.length} cross-refs`);
98
+ if (thread.authorType === 'agent')
99
+ reasons.push('agent-authored');
100
+ return {
101
+ threadId: thread.id,
102
+ attention,
103
+ alignment,
104
+ priority,
105
+ reason: reasons.join(', ') || 'low priority',
106
+ };
107
+ }
108
+ rankThreads(threads) {
109
+ return threads
110
+ .map(t => this.scoreThread(t))
111
+ .sort((a, b) => b.priority - a.priority);
112
+ }
113
+ shouldEngage(score) {
114
+ if (score.priority < 0.3) {
115
+ this.stats.skipped++;
116
+ return false;
117
+ }
118
+ const now = Date.now();
119
+ const hourAgo = now - 3600000;
120
+ const recentEngagements = this.engagements.filter(t => t > hourAgo).length;
121
+ if (recentEngagements >= this.config.maxEngagementsPerHour) {
122
+ this.stats.skipped++;
123
+ return false;
124
+ }
125
+ return true;
126
+ }
127
+ recordEngagement(threadId) {
128
+ this.engagements.push(Date.now());
129
+ this.stats.engaged++;
130
+ }
131
+ detectBait(content) {
132
+ const matches = this.config.baitPatterns.filter(p => p.pattern.test(content));
133
+ if (matches.length === 0)
134
+ return false;
135
+ // Weighted average scoring
136
+ const totalWeight = matches.reduce((sum, p) => sum + p.weight, 0);
137
+ const avgWeight = totalWeight / matches.length;
138
+ // Threshold: average weight > 0.5 or any single high-severity match
139
+ return avgWeight > 0.5 || matches.some(p => p.weight >= 1.0);
140
+ }
141
+ getStats() {
142
+ return { ...this.stats };
143
+ }
144
+ computeAttention(thread) {
145
+ const recency = Math.max(0, 1 - (Date.now() - thread.lastActivity) / 86400000);
146
+ const replies = Math.min(1, thread.replyCount / 50);
147
+ const crossRefs = Math.min(1, thread.crossReferences.length / 5);
148
+ return (replies * 0.4 + recency * 0.4 + crossRefs * 0.2);
149
+ }
150
+ computeAlignment(thread) {
151
+ const text = `${thread.title} ${thread.submolt}`.toLowerCase();
152
+ let matches = 0;
153
+ for (const vector of this.config.identityVectors) {
154
+ if (text.includes(vector.toLowerCase()))
155
+ matches++;
156
+ }
157
+ return Math.min(1, matches / 3);
158
+ }
159
+ }
160
+ export function createAttentionField(config) {
161
+ return new AttentionField(config);
162
+ }
163
+ //# sourceMappingURL=attentionField.js.map