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.
- package/README.md +406 -0
- package/SKILL.md +78 -0
- package/clawdbot.plugin.json +106 -0
- package/dist/cli-main.d.ts +7 -0
- package/dist/cli-main.js +192 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +14 -0
- package/dist/core/config.d.ts +11 -0
- package/dist/core/config.js +13 -0
- package/dist/core/index.d.ts +25 -0
- package/dist/core/index.js +26 -0
- package/dist/core/payment.d.ts +16 -0
- package/dist/core/payment.js +94 -0
- package/dist/core/types.d.ts +94 -0
- package/dist/core/types.js +4 -0
- package/dist/core/verify.d.ts +28 -0
- package/dist/core/verify.js +104 -0
- package/dist/core/wallet.d.ts +99 -0
- package/dist/core/wallet.js +219 -0
- package/dist/scripts/baemail/commands.d.ts +64 -0
- package/dist/scripts/baemail/commands.js +258 -0
- package/dist/scripts/baemail/handler.d.ts +36 -0
- package/dist/scripts/baemail/handler.js +284 -0
- package/dist/scripts/baemail/index.d.ts +5 -0
- package/dist/scripts/baemail/index.js +5 -0
- package/dist/scripts/config.d.ts +48 -0
- package/dist/scripts/config.js +68 -0
- package/dist/scripts/index.d.ts +7 -0
- package/dist/scripts/index.js +7 -0
- package/dist/scripts/messaging/connect.d.ts +8 -0
- package/dist/scripts/messaging/connect.js +114 -0
- package/dist/scripts/messaging/handlers.d.ts +21 -0
- package/dist/scripts/messaging/handlers.js +334 -0
- package/dist/scripts/messaging/inbox.d.ts +11 -0
- package/dist/scripts/messaging/inbox.js +51 -0
- package/dist/scripts/messaging/index.d.ts +8 -0
- package/dist/scripts/messaging/index.js +8 -0
- package/dist/scripts/messaging/poll.d.ts +7 -0
- package/dist/scripts/messaging/poll.js +52 -0
- package/dist/scripts/messaging/send.d.ts +7 -0
- package/dist/scripts/messaging/send.js +43 -0
- package/dist/scripts/output.d.ts +12 -0
- package/dist/scripts/output.js +19 -0
- package/dist/scripts/overlay/discover.d.ts +7 -0
- package/dist/scripts/overlay/discover.js +72 -0
- package/dist/scripts/overlay/index.d.ts +7 -0
- package/dist/scripts/overlay/index.js +7 -0
- package/dist/scripts/overlay/registration.d.ts +19 -0
- package/dist/scripts/overlay/registration.js +176 -0
- package/dist/scripts/overlay/services.d.ts +29 -0
- package/dist/scripts/overlay/services.js +167 -0
- package/dist/scripts/overlay/transaction.d.ts +42 -0
- package/dist/scripts/overlay/transaction.js +103 -0
- package/dist/scripts/payment/build.d.ts +24 -0
- package/dist/scripts/payment/build.js +54 -0
- package/dist/scripts/payment/commands.d.ts +15 -0
- package/dist/scripts/payment/commands.js +73 -0
- package/dist/scripts/payment/index.d.ts +6 -0
- package/dist/scripts/payment/index.js +6 -0
- package/dist/scripts/payment/types.d.ts +56 -0
- package/dist/scripts/payment/types.js +4 -0
- package/dist/scripts/services/index.d.ts +6 -0
- package/dist/scripts/services/index.js +6 -0
- package/dist/scripts/services/queue.d.ts +11 -0
- package/dist/scripts/services/queue.js +28 -0
- package/dist/scripts/services/request.d.ts +7 -0
- package/dist/scripts/services/request.js +82 -0
- package/dist/scripts/services/respond.d.ts +11 -0
- package/dist/scripts/services/respond.js +132 -0
- package/dist/scripts/types.d.ts +107 -0
- package/dist/scripts/types.js +4 -0
- package/dist/scripts/utils/index.d.ts +6 -0
- package/dist/scripts/utils/index.js +6 -0
- package/dist/scripts/utils/merkle.d.ts +12 -0
- package/dist/scripts/utils/merkle.js +47 -0
- package/dist/scripts/utils/storage.d.ts +66 -0
- package/dist/scripts/utils/storage.js +211 -0
- package/dist/scripts/utils/woc.d.ts +26 -0
- package/dist/scripts/utils/woc.js +91 -0
- package/dist/scripts/wallet/balance.d.ts +22 -0
- package/dist/scripts/wallet/balance.js +240 -0
- package/dist/scripts/wallet/identity.d.ts +70 -0
- package/dist/scripts/wallet/identity.js +151 -0
- package/dist/scripts/wallet/index.d.ts +6 -0
- package/dist/scripts/wallet/index.js +6 -0
- package/dist/scripts/wallet/setup.d.ts +15 -0
- package/dist/scripts/wallet/setup.js +105 -0
- package/dist/scripts/x-verification/commands.d.ts +27 -0
- package/dist/scripts/x-verification/commands.js +222 -0
- package/dist/scripts/x-verification/index.d.ts +4 -0
- package/dist/scripts/x-verification/index.js +4 -0
- package/dist/services/built-in/api-proxy/index.d.ts +6 -0
- package/dist/services/built-in/api-proxy/index.js +23 -0
- package/dist/services/built-in/code-develop/index.d.ts +6 -0
- package/dist/services/built-in/code-develop/index.js +23 -0
- package/dist/services/built-in/code-review/index.d.ts +10 -0
- package/dist/services/built-in/code-review/index.js +51 -0
- package/dist/services/built-in/image-analysis/index.d.ts +6 -0
- package/dist/services/built-in/image-analysis/index.js +33 -0
- package/dist/services/built-in/memory-store/index.d.ts +6 -0
- package/dist/services/built-in/memory-store/index.js +22 -0
- package/dist/services/built-in/roulette/index.d.ts +6 -0
- package/dist/services/built-in/roulette/index.js +27 -0
- package/dist/services/built-in/summarize/index.d.ts +6 -0
- package/dist/services/built-in/summarize/index.js +21 -0
- package/dist/services/built-in/tell-joke/handler.d.ts +7 -0
- package/dist/services/built-in/tell-joke/handler.js +122 -0
- package/dist/services/built-in/tell-joke/index.d.ts +9 -0
- package/dist/services/built-in/tell-joke/index.js +31 -0
- package/dist/services/built-in/translate/index.d.ts +6 -0
- package/dist/services/built-in/translate/index.js +21 -0
- package/dist/services/built-in/web-research/index.d.ts +9 -0
- package/dist/services/built-in/web-research/index.js +51 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +14 -0
- package/dist/services/loader.d.ts +77 -0
- package/dist/services/loader.js +292 -0
- package/dist/services/manager.d.ts +86 -0
- package/dist/services/manager.js +255 -0
- package/dist/services/registry.d.ts +98 -0
- package/dist/services/registry.js +204 -0
- package/dist/services/types.d.ts +230 -0
- package/dist/services/types.js +30 -0
- package/dist/test/cli.test.d.ts +7 -0
- package/dist/test/cli.test.js +329 -0
- package/dist/test/comprehensive-overlay.test.d.ts +13 -0
- package/dist/test/comprehensive-overlay.test.js +593 -0
- package/dist/test/key-derivation.test.d.ts +12 -0
- package/dist/test/key-derivation.test.js +86 -0
- package/dist/test/overlay-submit.test.d.ts +10 -0
- package/dist/test/overlay-submit.test.js +460 -0
- package/dist/test/request-response-flow.test.d.ts +5 -0
- package/dist/test/request-response-flow.test.js +209 -0
- package/dist/test/service-system.test.d.ts +5 -0
- package/dist/test/service-system.test.js +190 -0
- package/dist/test/utils/server-logic.d.ts +98 -0
- package/dist/test/utils/server-logic.js +286 -0
- package/dist/test/wallet.test.d.ts +7 -0
- package/dist/test/wallet.test.js +146 -0
- package/index.ts +1965 -0
- package/openclaw.plugin.json +106 -0
- package/package.json +73 -0
- package/src/cli-main.ts +230 -0
- package/src/cli.ts +16 -0
- package/src/core/README.md +246 -0
- package/src/core/config.ts +21 -0
- package/src/core/index.ts +42 -0
- package/src/core/payment.ts +111 -0
- package/src/core/types.ts +102 -0
- package/src/core/verify.ts +119 -0
- package/src/core/wallet.ts +282 -0
- package/src/scripts/baemail/commands.ts +326 -0
- package/src/scripts/baemail/handler.ts +338 -0
- package/src/scripts/baemail/index.ts +6 -0
- package/src/scripts/config.ts +81 -0
- package/src/scripts/index.ts +8 -0
- package/src/scripts/messaging/connect.ts +121 -0
- package/src/scripts/messaging/handlers.ts +394 -0
- package/src/scripts/messaging/inbox.ts +64 -0
- package/src/scripts/messaging/index.ts +9 -0
- package/src/scripts/messaging/poll.ts +59 -0
- package/src/scripts/messaging/send.ts +54 -0
- package/src/scripts/output.ts +21 -0
- package/src/scripts/overlay/discover.ts +81 -0
- package/src/scripts/overlay/index.ts +8 -0
- package/src/scripts/overlay/registration.ts +199 -0
- package/src/scripts/overlay/services.ts +199 -0
- package/src/scripts/overlay/transaction.ts +124 -0
- package/src/scripts/payment/build.ts +65 -0
- package/src/scripts/payment/commands.ts +92 -0
- package/src/scripts/payment/index.ts +7 -0
- package/src/scripts/payment/types.ts +62 -0
- package/src/scripts/services/index.ts +7 -0
- package/src/scripts/services/queue.ts +35 -0
- package/src/scripts/services/request.ts +98 -0
- package/src/scripts/services/respond.ts +149 -0
- package/src/scripts/types.ts +121 -0
- package/src/scripts/utils/index.ts +7 -0
- package/src/scripts/utils/merkle.ts +57 -0
- package/src/scripts/utils/storage.ts +231 -0
- package/src/scripts/utils/woc.ts +106 -0
- package/src/scripts/wallet/balance.ts +277 -0
- package/src/scripts/wallet/identity.ts +203 -0
- package/src/scripts/wallet/index.ts +7 -0
- package/src/scripts/wallet/setup.ts +121 -0
- package/src/scripts/x-verification/commands.ts +256 -0
- package/src/scripts/x-verification/index.ts +5 -0
- package/src/services/built-in/api-proxy/index.ts +26 -0
- package/src/services/built-in/api-proxy/prompt.md +26 -0
- package/src/services/built-in/code-develop/index.ts +26 -0
- package/src/services/built-in/code-develop/prompt.md +35 -0
- package/src/services/built-in/code-review/index.ts +54 -0
- package/src/services/built-in/code-review/prompt.md +105 -0
- package/src/services/built-in/image-analysis/index.ts +36 -0
- package/src/services/built-in/image-analysis/prompt.md +42 -0
- package/src/services/built-in/memory-store/index.ts +25 -0
- package/src/services/built-in/memory-store/prompt.md +45 -0
- package/src/services/built-in/roulette/index.ts +30 -0
- package/src/services/built-in/roulette/prompt.md +35 -0
- package/src/services/built-in/summarize/index.ts +24 -0
- package/src/services/built-in/summarize/prompt.md +27 -0
- package/src/services/built-in/tell-joke/handler.ts +134 -0
- package/src/services/built-in/tell-joke/index.ts +34 -0
- package/src/services/built-in/tell-joke/prompt.md +59 -0
- package/src/services/built-in/translate/index.ts +24 -0
- package/src/services/built-in/translate/prompt.md +23 -0
- package/src/services/built-in/web-research/index.ts +54 -0
- package/src/services/built-in/web-research/prompt.md +110 -0
- package/src/services/index.ts +16 -0
- package/src/services/loader.ts +344 -0
- package/src/services/manager.ts +304 -0
- package/src/services/registry.ts +246 -0
- package/src/services/types.ts +259 -0
- package/src/test/cli.test.ts +352 -0
- package/src/test/comprehensive-overlay.test.ts +729 -0
- package/src/test/key-derivation.test.ts +102 -0
- package/src/test/overlay-submit.test.ts +570 -0
- package/src/test/request-response-flow.test.ts +252 -0
- package/src/test/service-system.test.ts +241 -0
- package/src/test/utils/server-logic.ts +368 -0
- 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
|
+
}
|