openclaw-overlay-plugin 0.7.22

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 (221) hide show
  1. package/README.md +406 -0
  2. package/SKILL.md +78 -0
  3. package/clawdbot.plugin.json +106 -0
  4. package/dist/cli-main.d.ts +7 -0
  5. package/dist/cli-main.js +192 -0
  6. package/dist/cli.d.ts +8 -0
  7. package/dist/cli.js +14 -0
  8. package/dist/core/config.d.ts +11 -0
  9. package/dist/core/config.js +13 -0
  10. package/dist/core/index.d.ts +25 -0
  11. package/dist/core/index.js +26 -0
  12. package/dist/core/payment.d.ts +16 -0
  13. package/dist/core/payment.js +94 -0
  14. package/dist/core/types.d.ts +94 -0
  15. package/dist/core/types.js +4 -0
  16. package/dist/core/verify.d.ts +28 -0
  17. package/dist/core/verify.js +104 -0
  18. package/dist/core/wallet.d.ts +99 -0
  19. package/dist/core/wallet.js +219 -0
  20. package/dist/scripts/baemail/commands.d.ts +64 -0
  21. package/dist/scripts/baemail/commands.js +258 -0
  22. package/dist/scripts/baemail/handler.d.ts +36 -0
  23. package/dist/scripts/baemail/handler.js +284 -0
  24. package/dist/scripts/baemail/index.d.ts +5 -0
  25. package/dist/scripts/baemail/index.js +5 -0
  26. package/dist/scripts/config.d.ts +48 -0
  27. package/dist/scripts/config.js +68 -0
  28. package/dist/scripts/index.d.ts +7 -0
  29. package/dist/scripts/index.js +7 -0
  30. package/dist/scripts/messaging/connect.d.ts +8 -0
  31. package/dist/scripts/messaging/connect.js +114 -0
  32. package/dist/scripts/messaging/handlers.d.ts +21 -0
  33. package/dist/scripts/messaging/handlers.js +334 -0
  34. package/dist/scripts/messaging/inbox.d.ts +11 -0
  35. package/dist/scripts/messaging/inbox.js +51 -0
  36. package/dist/scripts/messaging/index.d.ts +8 -0
  37. package/dist/scripts/messaging/index.js +8 -0
  38. package/dist/scripts/messaging/poll.d.ts +7 -0
  39. package/dist/scripts/messaging/poll.js +52 -0
  40. package/dist/scripts/messaging/send.d.ts +7 -0
  41. package/dist/scripts/messaging/send.js +43 -0
  42. package/dist/scripts/output.d.ts +12 -0
  43. package/dist/scripts/output.js +19 -0
  44. package/dist/scripts/overlay/discover.d.ts +7 -0
  45. package/dist/scripts/overlay/discover.js +72 -0
  46. package/dist/scripts/overlay/index.d.ts +7 -0
  47. package/dist/scripts/overlay/index.js +7 -0
  48. package/dist/scripts/overlay/registration.d.ts +19 -0
  49. package/dist/scripts/overlay/registration.js +176 -0
  50. package/dist/scripts/overlay/services.d.ts +29 -0
  51. package/dist/scripts/overlay/services.js +167 -0
  52. package/dist/scripts/overlay/transaction.d.ts +42 -0
  53. package/dist/scripts/overlay/transaction.js +103 -0
  54. package/dist/scripts/payment/build.d.ts +24 -0
  55. package/dist/scripts/payment/build.js +54 -0
  56. package/dist/scripts/payment/commands.d.ts +15 -0
  57. package/dist/scripts/payment/commands.js +73 -0
  58. package/dist/scripts/payment/index.d.ts +6 -0
  59. package/dist/scripts/payment/index.js +6 -0
  60. package/dist/scripts/payment/types.d.ts +56 -0
  61. package/dist/scripts/payment/types.js +4 -0
  62. package/dist/scripts/services/index.d.ts +6 -0
  63. package/dist/scripts/services/index.js +6 -0
  64. package/dist/scripts/services/queue.d.ts +11 -0
  65. package/dist/scripts/services/queue.js +28 -0
  66. package/dist/scripts/services/request.d.ts +7 -0
  67. package/dist/scripts/services/request.js +82 -0
  68. package/dist/scripts/services/respond.d.ts +11 -0
  69. package/dist/scripts/services/respond.js +132 -0
  70. package/dist/scripts/types.d.ts +107 -0
  71. package/dist/scripts/types.js +4 -0
  72. package/dist/scripts/utils/index.d.ts +6 -0
  73. package/dist/scripts/utils/index.js +6 -0
  74. package/dist/scripts/utils/merkle.d.ts +12 -0
  75. package/dist/scripts/utils/merkle.js +47 -0
  76. package/dist/scripts/utils/storage.d.ts +66 -0
  77. package/dist/scripts/utils/storage.js +211 -0
  78. package/dist/scripts/utils/woc.d.ts +26 -0
  79. package/dist/scripts/utils/woc.js +91 -0
  80. package/dist/scripts/wallet/balance.d.ts +22 -0
  81. package/dist/scripts/wallet/balance.js +240 -0
  82. package/dist/scripts/wallet/identity.d.ts +70 -0
  83. package/dist/scripts/wallet/identity.js +151 -0
  84. package/dist/scripts/wallet/index.d.ts +6 -0
  85. package/dist/scripts/wallet/index.js +6 -0
  86. package/dist/scripts/wallet/setup.d.ts +15 -0
  87. package/dist/scripts/wallet/setup.js +105 -0
  88. package/dist/scripts/x-verification/commands.d.ts +27 -0
  89. package/dist/scripts/x-verification/commands.js +222 -0
  90. package/dist/scripts/x-verification/index.d.ts +4 -0
  91. package/dist/scripts/x-verification/index.js +4 -0
  92. package/dist/services/built-in/api-proxy/index.d.ts +6 -0
  93. package/dist/services/built-in/api-proxy/index.js +23 -0
  94. package/dist/services/built-in/code-develop/index.d.ts +6 -0
  95. package/dist/services/built-in/code-develop/index.js +23 -0
  96. package/dist/services/built-in/code-review/index.d.ts +10 -0
  97. package/dist/services/built-in/code-review/index.js +51 -0
  98. package/dist/services/built-in/image-analysis/index.d.ts +6 -0
  99. package/dist/services/built-in/image-analysis/index.js +33 -0
  100. package/dist/services/built-in/memory-store/index.d.ts +6 -0
  101. package/dist/services/built-in/memory-store/index.js +22 -0
  102. package/dist/services/built-in/roulette/index.d.ts +6 -0
  103. package/dist/services/built-in/roulette/index.js +27 -0
  104. package/dist/services/built-in/summarize/index.d.ts +6 -0
  105. package/dist/services/built-in/summarize/index.js +21 -0
  106. package/dist/services/built-in/tell-joke/handler.d.ts +7 -0
  107. package/dist/services/built-in/tell-joke/handler.js +122 -0
  108. package/dist/services/built-in/tell-joke/index.d.ts +9 -0
  109. package/dist/services/built-in/tell-joke/index.js +31 -0
  110. package/dist/services/built-in/translate/index.d.ts +6 -0
  111. package/dist/services/built-in/translate/index.js +21 -0
  112. package/dist/services/built-in/web-research/index.d.ts +9 -0
  113. package/dist/services/built-in/web-research/index.js +51 -0
  114. package/dist/services/index.d.ts +13 -0
  115. package/dist/services/index.js +14 -0
  116. package/dist/services/loader.d.ts +77 -0
  117. package/dist/services/loader.js +292 -0
  118. package/dist/services/manager.d.ts +86 -0
  119. package/dist/services/manager.js +255 -0
  120. package/dist/services/registry.d.ts +98 -0
  121. package/dist/services/registry.js +204 -0
  122. package/dist/services/types.d.ts +230 -0
  123. package/dist/services/types.js +30 -0
  124. package/dist/test/cli.test.d.ts +7 -0
  125. package/dist/test/cli.test.js +329 -0
  126. package/dist/test/comprehensive-overlay.test.d.ts +13 -0
  127. package/dist/test/comprehensive-overlay.test.js +593 -0
  128. package/dist/test/key-derivation.test.d.ts +12 -0
  129. package/dist/test/key-derivation.test.js +86 -0
  130. package/dist/test/overlay-submit.test.d.ts +10 -0
  131. package/dist/test/overlay-submit.test.js +460 -0
  132. package/dist/test/request-response-flow.test.d.ts +5 -0
  133. package/dist/test/request-response-flow.test.js +209 -0
  134. package/dist/test/service-system.test.d.ts +5 -0
  135. package/dist/test/service-system.test.js +190 -0
  136. package/dist/test/utils/server-logic.d.ts +98 -0
  137. package/dist/test/utils/server-logic.js +286 -0
  138. package/dist/test/wallet.test.d.ts +7 -0
  139. package/dist/test/wallet.test.js +146 -0
  140. package/index.ts +1965 -0
  141. package/openclaw.plugin.json +106 -0
  142. package/package.json +73 -0
  143. package/src/cli-main.ts +230 -0
  144. package/src/cli.ts +16 -0
  145. package/src/core/README.md +246 -0
  146. package/src/core/config.ts +21 -0
  147. package/src/core/index.ts +42 -0
  148. package/src/core/payment.ts +111 -0
  149. package/src/core/types.ts +102 -0
  150. package/src/core/verify.ts +119 -0
  151. package/src/core/wallet.ts +282 -0
  152. package/src/scripts/baemail/commands.ts +326 -0
  153. package/src/scripts/baemail/handler.ts +338 -0
  154. package/src/scripts/baemail/index.ts +6 -0
  155. package/src/scripts/config.ts +81 -0
  156. package/src/scripts/index.ts +8 -0
  157. package/src/scripts/messaging/connect.ts +121 -0
  158. package/src/scripts/messaging/handlers.ts +394 -0
  159. package/src/scripts/messaging/inbox.ts +64 -0
  160. package/src/scripts/messaging/index.ts +9 -0
  161. package/src/scripts/messaging/poll.ts +59 -0
  162. package/src/scripts/messaging/send.ts +54 -0
  163. package/src/scripts/output.ts +21 -0
  164. package/src/scripts/overlay/discover.ts +81 -0
  165. package/src/scripts/overlay/index.ts +8 -0
  166. package/src/scripts/overlay/registration.ts +199 -0
  167. package/src/scripts/overlay/services.ts +199 -0
  168. package/src/scripts/overlay/transaction.ts +124 -0
  169. package/src/scripts/payment/build.ts +65 -0
  170. package/src/scripts/payment/commands.ts +92 -0
  171. package/src/scripts/payment/index.ts +7 -0
  172. package/src/scripts/payment/types.ts +62 -0
  173. package/src/scripts/services/index.ts +7 -0
  174. package/src/scripts/services/queue.ts +35 -0
  175. package/src/scripts/services/request.ts +98 -0
  176. package/src/scripts/services/respond.ts +149 -0
  177. package/src/scripts/types.ts +121 -0
  178. package/src/scripts/utils/index.ts +7 -0
  179. package/src/scripts/utils/merkle.ts +57 -0
  180. package/src/scripts/utils/storage.ts +231 -0
  181. package/src/scripts/utils/woc.ts +106 -0
  182. package/src/scripts/wallet/balance.ts +277 -0
  183. package/src/scripts/wallet/identity.ts +203 -0
  184. package/src/scripts/wallet/index.ts +7 -0
  185. package/src/scripts/wallet/setup.ts +121 -0
  186. package/src/scripts/x-verification/commands.ts +256 -0
  187. package/src/scripts/x-verification/index.ts +5 -0
  188. package/src/services/built-in/api-proxy/index.ts +26 -0
  189. package/src/services/built-in/api-proxy/prompt.md +26 -0
  190. package/src/services/built-in/code-develop/index.ts +26 -0
  191. package/src/services/built-in/code-develop/prompt.md +35 -0
  192. package/src/services/built-in/code-review/index.ts +54 -0
  193. package/src/services/built-in/code-review/prompt.md +105 -0
  194. package/src/services/built-in/image-analysis/index.ts +36 -0
  195. package/src/services/built-in/image-analysis/prompt.md +42 -0
  196. package/src/services/built-in/memory-store/index.ts +25 -0
  197. package/src/services/built-in/memory-store/prompt.md +45 -0
  198. package/src/services/built-in/roulette/index.ts +30 -0
  199. package/src/services/built-in/roulette/prompt.md +35 -0
  200. package/src/services/built-in/summarize/index.ts +24 -0
  201. package/src/services/built-in/summarize/prompt.md +27 -0
  202. package/src/services/built-in/tell-joke/handler.ts +134 -0
  203. package/src/services/built-in/tell-joke/index.ts +34 -0
  204. package/src/services/built-in/tell-joke/prompt.md +59 -0
  205. package/src/services/built-in/translate/index.ts +24 -0
  206. package/src/services/built-in/translate/prompt.md +23 -0
  207. package/src/services/built-in/web-research/index.ts +54 -0
  208. package/src/services/built-in/web-research/prompt.md +110 -0
  209. package/src/services/index.ts +16 -0
  210. package/src/services/loader.ts +344 -0
  211. package/src/services/manager.ts +304 -0
  212. package/src/services/registry.ts +246 -0
  213. package/src/services/types.ts +259 -0
  214. package/src/test/cli.test.ts +352 -0
  215. package/src/test/comprehensive-overlay.test.ts +729 -0
  216. package/src/test/key-derivation.test.ts +102 -0
  217. package/src/test/overlay-submit.test.ts +570 -0
  218. package/src/test/request-response-flow.test.ts +252 -0
  219. package/src/test/service-system.test.ts +241 -0
  220. package/src/test/utils/server-logic.ts +368 -0
  221. package/src/test/wallet.test.ts +166 -0
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Service registry implementation.
3
+ *
4
+ * This provides a centralized registry for all services, allowing
5
+ * dynamic registration and discovery without modifying core code.
6
+ */
7
+
8
+ import { ServiceDefinition, ServiceRegistry, ServiceCategory } from './types.js';
9
+
10
+ /**
11
+ * Default service registry implementation.
12
+ */
13
+ export class DefaultServiceRegistry implements ServiceRegistry {
14
+ private services = new Map<string, ServiceDefinition>();
15
+
16
+ /**
17
+ * Register a new service definition.
18
+ */
19
+ register(service: ServiceDefinition): void {
20
+ // Validate service definition
21
+ this.validateServiceDefinition(service);
22
+
23
+ // Check for duplicates
24
+ if (this.services.has(service.id)) {
25
+ throw new Error(`Service '${service.id}' is already registered`);
26
+ }
27
+
28
+ // Register the service
29
+ this.services.set(service.id, { ...service });
30
+ }
31
+
32
+ /**
33
+ * Get a service definition by ID.
34
+ */
35
+ get(serviceId: string): ServiceDefinition | undefined {
36
+ return this.services.get(serviceId);
37
+ }
38
+
39
+ /**
40
+ * List all registered services.
41
+ */
42
+ list(): ServiceDefinition[] {
43
+ return Array.from(this.services.values());
44
+ }
45
+
46
+ /**
47
+ * List services by category.
48
+ */
49
+ listByCategory(category: string): ServiceDefinition[] {
50
+ return this.list().filter(service => service.category === category);
51
+ }
52
+
53
+ /**
54
+ * Check if a service is registered.
55
+ */
56
+ has(serviceId: string): boolean {
57
+ return this.services.has(serviceId);
58
+ }
59
+
60
+ /**
61
+ * Unregister a service.
62
+ */
63
+ unregister(serviceId: string): void {
64
+ this.services.delete(serviceId);
65
+ }
66
+
67
+ /**
68
+ * Clear all services (useful for testing).
69
+ */
70
+ clear(): void {
71
+ this.services.clear();
72
+ }
73
+
74
+ /**
75
+ * Get service count.
76
+ */
77
+ count(): number {
78
+ return this.services.size;
79
+ }
80
+
81
+ /**
82
+ * Get services by price range.
83
+ */
84
+ getByPriceRange(minPrice: number, maxPrice: number): ServiceDefinition[] {
85
+ return this.list().filter(
86
+ service => service.defaultPrice >= minPrice && service.defaultPrice <= maxPrice
87
+ );
88
+ }
89
+
90
+ /**
91
+ * Search services by name or description.
92
+ */
93
+ search(query: string): ServiceDefinition[] {
94
+ const lowerQuery = query.toLowerCase();
95
+ return this.list().filter(service =>
96
+ service.name.toLowerCase().includes(lowerQuery) ||
97
+ service.description.toLowerCase().includes(lowerQuery) ||
98
+ service.id.toLowerCase().includes(lowerQuery)
99
+ );
100
+ }
101
+
102
+ /**
103
+ * Validate a service definition.
104
+ */
105
+ private validateServiceDefinition(service: ServiceDefinition): void {
106
+ if (!service.id) {
107
+ throw new Error('Service ID is required');
108
+ }
109
+
110
+ if (typeof service.id !== 'string' || service.id.trim().length === 0) {
111
+ throw new Error('Service ID must be a non-empty string');
112
+ }
113
+
114
+ // Validate ID format (kebab-case)
115
+ if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(service.id)) {
116
+ throw new Error('Service ID must be in kebab-case format (lowercase, hyphens only)');
117
+ }
118
+
119
+ if (!service.name || typeof service.name !== 'string' || service.name.trim().length === 0) {
120
+ throw new Error('Service name is required and must be a non-empty string');
121
+ }
122
+
123
+ if (!service.description || typeof service.description !== 'string' || service.description.trim().length === 0) {
124
+ throw new Error('Service description is required and must be a non-empty string');
125
+ }
126
+
127
+ if (typeof service.defaultPrice !== 'number' || service.defaultPrice < 0 || !Number.isInteger(service.defaultPrice)) {
128
+ throw new Error('Service defaultPrice must be a non-negative integer');
129
+ }
130
+
131
+ if (service.category && !Object.values(ServiceCategory).includes(service.category as ServiceCategory)) {
132
+ throw new Error(`Invalid service category: ${service.category}`);
133
+ }
134
+
135
+ // Validate input schema if provided
136
+ if (service.inputSchema && typeof service.inputSchema !== 'object') {
137
+ throw new Error('Service inputSchema must be an object');
138
+ }
139
+
140
+ // Validate handler if provided
141
+ if (service.handler) {
142
+ if (typeof service.handler.validate !== 'function') {
143
+ throw new Error('Service handler must have a validate function');
144
+ }
145
+ if (typeof service.handler.process !== 'function') {
146
+ throw new Error('Service handler must have a process function');
147
+ }
148
+ }
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Global service registry instance.
154
+ */
155
+ export const serviceRegistry = new DefaultServiceRegistry();
156
+
157
+ /**
158
+ * Utility functions for working with the service registry.
159
+ */
160
+ export const ServiceRegistryUtils = {
161
+ /**
162
+ * Register multiple services at once.
163
+ */
164
+ registerMultiple(services: ServiceDefinition[]): void {
165
+ for (const service of services) {
166
+ serviceRegistry.register(service);
167
+ }
168
+ },
169
+
170
+ /**
171
+ * Get services that support a specific input type.
172
+ */
173
+ getServicesForInput(inputType: string): ServiceDefinition[] {
174
+ return serviceRegistry.list().filter(service => {
175
+ if (!service.inputSchema) return false;
176
+ const schema = service.inputSchema as any;
177
+ return schema.properties && schema.properties[inputType];
178
+ });
179
+ },
180
+
181
+ /**
182
+ * Validate service exists and return it.
183
+ */
184
+ requireService(serviceId: string): ServiceDefinition {
185
+ const service = serviceRegistry.get(serviceId);
186
+ if (!service) {
187
+ throw new Error(`Service '${serviceId}' not found`);
188
+ }
189
+ return service;
190
+ },
191
+
192
+ /**
193
+ * Get all service IDs.
194
+ */
195
+ getAllServiceIds(): string[] {
196
+ return serviceRegistry.list().map(service => service.id);
197
+ },
198
+
199
+ /**
200
+ * Check if any services are registered.
201
+ */
202
+ hasAnyServices(): boolean {
203
+ return serviceRegistry.count() > 0;
204
+ },
205
+
206
+ /**
207
+ * Get service statistics.
208
+ */
209
+ getStatistics(): {
210
+ totalServices: number;
211
+ servicesByCategory: Record<string, number>;
212
+ priceRange: { min: number; max: number };
213
+ servicesWithHandlers: number;
214
+ } {
215
+ const services = serviceRegistry.list();
216
+ const servicesByCategory: Record<string, number> = {};
217
+ let minPrice = Infinity;
218
+ let maxPrice = -Infinity;
219
+ let servicesWithHandlers = 0;
220
+
221
+ for (const service of services) {
222
+ // Count by category
223
+ const category = service.category || 'uncategorized';
224
+ servicesByCategory[category] = (servicesByCategory[category] || 0) + 1;
225
+
226
+ // Track price range
227
+ minPrice = Math.min(minPrice, service.defaultPrice);
228
+ maxPrice = Math.max(maxPrice, service.defaultPrice);
229
+
230
+ // Count services with handlers
231
+ if (service.handler) {
232
+ servicesWithHandlers++;
233
+ }
234
+ }
235
+
236
+ return {
237
+ totalServices: services.length,
238
+ servicesByCategory,
239
+ priceRange: {
240
+ min: minPrice === Infinity ? 0 : minPrice,
241
+ max: maxPrice === -Infinity ? 0 : maxPrice
242
+ },
243
+ servicesWithHandlers
244
+ };
245
+ }
246
+ };
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Service architecture type definitions.
3
+ *
4
+ * This module defines the core interfaces for the pluggable service system.
5
+ * Services can be added without modifying core payment or relay logic.
6
+ */
7
+
8
+ export interface ServiceDefinition {
9
+ /** Unique service identifier (kebab-case) */
10
+ id: string;
11
+ /** Human-readable service name */
12
+ name: string;
13
+ /** Service description for discovery */
14
+ description: string;
15
+ /** Default price in satoshis */
16
+ defaultPrice: number;
17
+ /** Optional JSON schema for input validation */
18
+ inputSchema?: object;
19
+ /** Optional legacy handler for non-agent mode */
20
+ handler?: ServiceHandler;
21
+ /** Optional path to agent mode prompt file */
22
+ promptFile?: string;
23
+ /** Service category for organization */
24
+ category?: string;
25
+ /** Whether this service requires special permissions */
26
+ requiresVerification?: boolean;
27
+ }
28
+
29
+ export interface ServiceHandler {
30
+ /**
31
+ * Validate incoming service input.
32
+ * @param input - Raw input from service request
33
+ * @returns Validation result
34
+ */
35
+ validate(input: any): ValidationResult;
36
+
37
+ /**
38
+ * Process the service request.
39
+ * Payment has already been verified at this point.
40
+ * @param input - Validated input data
41
+ * @param context - Service execution context
42
+ * @returns Service processing result
43
+ */
44
+ process(input: any, context: ServiceContext): Promise<ServiceResult>;
45
+ }
46
+
47
+ export interface ValidationResult {
48
+ /** Whether input is valid */
49
+ valid: boolean;
50
+ /** Error message if invalid */
51
+ error?: string;
52
+ /** Sanitized/normalized input if valid */
53
+ sanitized?: any;
54
+ }
55
+
56
+ export interface ServiceContext {
57
+ /** Unique request identifier */
58
+ requestId: string;
59
+ /** Sender's identity key */
60
+ from: string;
61
+ /** Service being requested */
62
+ serviceId: string;
63
+ /** Payment information (already verified) */
64
+ payment: PaymentInfo;
65
+ /** Request timestamp */
66
+ timestamp: number;
67
+ }
68
+
69
+ export interface PaymentInfo {
70
+ /** Transaction ID */
71
+ txid: string;
72
+ /** Amount paid in satoshis */
73
+ satoshis: number;
74
+ /** Whether payment was accepted by wallet */
75
+ accepted: boolean;
76
+ /** Payment verification details */
77
+ verification?: {
78
+ /** BEEF transaction data */
79
+ beef: string;
80
+ /** Derivation prefix for BRC-29 */
81
+ derivationPrefix?: string;
82
+ /** Derivation suffix for BRC-29 */
83
+ derivationSuffix?: string;
84
+ };
85
+ }
86
+
87
+ export interface ServiceResult {
88
+ /** Whether service execution was successful */
89
+ success: boolean;
90
+ /** Service output data */
91
+ data?: any;
92
+ /** Error message if unsuccessful */
93
+ error?: string;
94
+ /** Additional metadata */
95
+ metadata?: {
96
+ /** Processing time in milliseconds */
97
+ processingTime?: number;
98
+ /** Service version */
99
+ version?: string;
100
+ /** Additional context */
101
+ [key: string]: any;
102
+ };
103
+ }
104
+
105
+ export interface ServiceRegistry {
106
+ /**
107
+ * Register a new service definition.
108
+ * @param service - Service to register
109
+ */
110
+ register(service: ServiceDefinition): void;
111
+
112
+ /**
113
+ * Get a service definition by ID.
114
+ * @param serviceId - Service identifier
115
+ * @returns Service definition or undefined
116
+ */
117
+ get(serviceId: string): ServiceDefinition | undefined;
118
+
119
+ /**
120
+ * List all registered services.
121
+ * @returns Array of all service definitions
122
+ */
123
+ list(): ServiceDefinition[];
124
+
125
+ /**
126
+ * List services by category.
127
+ * @param category - Service category
128
+ * @returns Array of services in category
129
+ */
130
+ listByCategory(category: string): ServiceDefinition[];
131
+
132
+ /**
133
+ * Check if a service is registered.
134
+ * @param serviceId - Service identifier
135
+ * @returns Whether service exists
136
+ */
137
+ has(serviceId: string): boolean;
138
+
139
+ /**
140
+ * Unregister a service.
141
+ * @param serviceId - Service identifier
142
+ */
143
+ unregister(serviceId: string): void;
144
+ }
145
+
146
+ export interface ServiceLoader {
147
+ /**
148
+ * Load services from a directory.
149
+ * @param directory - Directory path to scan
150
+ * @returns Array of loaded service definitions
151
+ */
152
+ loadFromDirectory(directory: string): Promise<ServiceDefinition[]>;
153
+
154
+ /**
155
+ * Load all built-in services.
156
+ * @returns Array of built-in service definitions
157
+ */
158
+ loadBuiltInServices(): Promise<ServiceDefinition[]>;
159
+
160
+ /**
161
+ * Load custom user services.
162
+ * @returns Array of custom service definitions
163
+ */
164
+ loadCustomServices(): Promise<ServiceDefinition[]>;
165
+ }
166
+
167
+ /**
168
+ * Service execution context for handlers.
169
+ * This provides access to validated input and request context
170
+ * without exposing payment verification or relay logic.
171
+ */
172
+ export interface ServiceExecutionContext {
173
+ /** Service definition being executed */
174
+ service: ServiceDefinition;
175
+ /** Validated input data */
176
+ input: any;
177
+ /** Request context */
178
+ context: ServiceContext;
179
+ }
180
+
181
+ /**
182
+ * Service plugin interface for advanced services.
183
+ * This allows services to define additional hooks and lifecycle methods.
184
+ */
185
+ export interface ServicePlugin {
186
+ /** Service definition */
187
+ definition: ServiceDefinition;
188
+
189
+ /** Optional initialization hook */
190
+ initialize?(): Promise<void>;
191
+
192
+ /** Optional cleanup hook */
193
+ cleanup?(): Promise<void>;
194
+
195
+ /** Optional health check */
196
+ healthCheck?(): Promise<boolean>;
197
+ }
198
+
199
+ /**
200
+ * Service manager interface for orchestrating service lifecycle.
201
+ */
202
+ export interface ServiceManager {
203
+ /** Service registry */
204
+ registry: ServiceRegistry;
205
+
206
+ /** Service loader */
207
+ loader: ServiceLoader;
208
+
209
+ /**
210
+ * Initialize the service system.
211
+ */
212
+ initialize(): Promise<void>;
213
+
214
+ /**
215
+ * Execute a service request.
216
+ * @param serviceId - Service to execute
217
+ * @param input - Service input
218
+ * @param context - Execution context
219
+ * @returns Service result
220
+ */
221
+ execute(serviceId: string, input: any, context: ServiceContext): Promise<ServiceResult>;
222
+
223
+ /**
224
+ * Validate service input.
225
+ * @param serviceId - Service to validate for
226
+ * @param input - Input to validate
227
+ * @returns Validation result
228
+ */
229
+ validate(serviceId: string, input: any): ValidationResult;
230
+
231
+ /**
232
+ * Reload all services.
233
+ */
234
+ reload(): Promise<void>;
235
+ }
236
+
237
+ /**
238
+ * Common service categories for organization.
239
+ */
240
+ export enum ServiceCategory {
241
+ UTILITY = 'utility',
242
+ AI = 'ai',
243
+ BLOCKCHAIN = 'blockchain',
244
+ COMMUNICATION = 'communication',
245
+ DEVELOPMENT = 'development',
246
+ RESEARCH = 'research',
247
+ ENTERTAINMENT = 'entertainment',
248
+ CUSTOM = 'custom'
249
+ }
250
+
251
+ /**
252
+ * Service status for monitoring and management.
253
+ */
254
+ export enum ServiceStatus {
255
+ ACTIVE = 'active',
256
+ INACTIVE = 'inactive',
257
+ ERROR = 'error',
258
+ LOADING = 'loading'
259
+ }