@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.
- package/README.md +209 -0
- package/bin/agent-zero.js +332 -0
- package/dist/agency/commandRouter.d.ts +48 -0
- package/dist/agency/commandRouter.d.ts.map +1 -0
- package/dist/agency/commandRouter.js +343 -0
- package/dist/agency/commandRouter.js.map +1 -0
- package/dist/agency/runtime.d.ts +66 -0
- package/dist/agency/runtime.d.ts.map +1 -0
- package/dist/agency/runtime.js +247 -0
- package/dist/agency/runtime.js.map +1 -0
- package/dist/agency/summaryGenerator.d.ts +39 -0
- package/dist/agency/summaryGenerator.d.ts.map +1 -0
- package/dist/agency/summaryGenerator.js +110 -0
- package/dist/agency/summaryGenerator.js.map +1 -0
- package/dist/agency/summaryScheduler.d.ts +33 -0
- package/dist/agency/summaryScheduler.d.ts.map +1 -0
- package/dist/agency/summaryScheduler.js +68 -0
- package/dist/agency/summaryScheduler.js.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts +20 -0
- package/dist/browser/agent-runtime/RuntimePanel.d.ts.map +1 -0
- package/dist/browser/agent-runtime/RuntimePanel.js +203 -0
- package/dist/browser/agent-runtime/RuntimePanel.js.map +1 -0
- package/dist/browser/agent-runtime/config.d.ts +28 -0
- package/dist/browser/agent-runtime/config.d.ts.map +1 -0
- package/dist/browser/agent-runtime/config.js +50 -0
- package/dist/browser/agent-runtime/config.js.map +1 -0
- package/dist/browser/agent-runtime/launcher.d.ts +71 -0
- package/dist/browser/agent-runtime/launcher.d.ts.map +1 -0
- package/dist/browser/agent-runtime/launcher.js +167 -0
- package/dist/browser/agent-runtime/launcher.js.map +1 -0
- package/dist/browser/rail-auth-bridge.d.ts +85 -0
- package/dist/browser/rail-auth-bridge.d.ts.map +1 -0
- package/dist/browser/rail-auth-bridge.js +209 -0
- package/dist/browser/rail-auth-bridge.js.map +1 -0
- package/dist/channels/index.d.ts +13 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/moltbook.d.ts +114 -0
- package/dist/channels/moltbook.d.ts.map +1 -0
- package/dist/channels/moltbook.js +348 -0
- package/dist/channels/moltbook.js.map +1 -0
- package/dist/channels/sms.d.ts +33 -0
- package/dist/channels/sms.d.ts.map +1 -0
- package/dist/channels/sms.js +160 -0
- package/dist/channels/sms.js.map +1 -0
- package/dist/channels/telegram.d.ts +47 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +276 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/twitter.d.ts +93 -0
- package/dist/channels/twitter.d.ts.map +1 -0
- package/dist/channels/twitter.js +411 -0
- package/dist/channels/twitter.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +77 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +514 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/checkout/index.d.ts +92 -0
- package/dist/checkout/index.d.ts.map +1 -0
- package/dist/checkout/index.js +125 -0
- package/dist/checkout/index.js.map +1 -0
- package/dist/cli/moltbook.d.ts +11 -0
- package/dist/cli/moltbook.d.ts.map +1 -0
- package/dist/cli/moltbook.js +259 -0
- package/dist/cli/moltbook.js.map +1 -0
- package/dist/cli/setup.d.ts +10 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +232 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/coherence/absorption.d.ts +141 -0
- package/dist/coherence/absorption.d.ts.map +1 -0
- package/dist/coherence/absorption.js +343 -0
- package/dist/coherence/absorption.js.map +1 -0
- package/dist/coherence/crossPlatform.d.ts +55 -0
- package/dist/coherence/crossPlatform.d.ts.map +1 -0
- package/dist/coherence/crossPlatform.js +219 -0
- package/dist/coherence/crossPlatform.js.map +1 -0
- package/dist/coherence/identityResolver.d.ts +27 -0
- package/dist/coherence/identityResolver.d.ts.map +1 -0
- package/dist/coherence/identityResolver.js +102 -0
- package/dist/coherence/identityResolver.js.map +1 -0
- package/dist/identity/burner.d.ts +100 -0
- package/dist/identity/burner.d.ts.map +1 -0
- package/dist/identity/burner.js +256 -0
- package/dist/identity/burner.js.map +1 -0
- package/dist/identity/burnerScheduler.d.ts +18 -0
- package/dist/identity/burnerScheduler.d.ts.map +1 -0
- package/dist/identity/burnerScheduler.js +82 -0
- package/dist/identity/burnerScheduler.js.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts +14 -0
- package/dist/identity/moltbookBurnerAdapter.d.ts.map +1 -0
- package/dist/identity/moltbookBurnerAdapter.js +82 -0
- package/dist/identity/moltbookBurnerAdapter.js.map +1 -0
- package/dist/identity/operationalVault.d.ts +108 -0
- package/dist/identity/operationalVault.d.ts.map +1 -0
- package/dist/identity/operationalVault.js +259 -0
- package/dist/identity/operationalVault.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/moltbook/apiErrorHandler.d.ts +48 -0
- package/dist/moltbook/apiErrorHandler.d.ts.map +1 -0
- package/dist/moltbook/apiErrorHandler.js +125 -0
- package/dist/moltbook/apiErrorHandler.js.map +1 -0
- package/dist/moltbook/approvalGate.d.ts +81 -0
- package/dist/moltbook/approvalGate.d.ts.map +1 -0
- package/dist/moltbook/approvalGate.js +211 -0
- package/dist/moltbook/approvalGate.js.map +1 -0
- package/dist/moltbook/attentionField.d.ts +55 -0
- package/dist/moltbook/attentionField.d.ts.map +1 -0
- package/dist/moltbook/attentionField.js +163 -0
- package/dist/moltbook/attentionField.js.map +1 -0
- package/dist/moltbook/contentEnhancer.d.ts +28 -0
- package/dist/moltbook/contentEnhancer.d.ts.map +1 -0
- package/dist/moltbook/contentEnhancer.js +129 -0
- package/dist/moltbook/contentEnhancer.js.map +1 -0
- package/dist/moltbook/daemon.d.ts +111 -0
- package/dist/moltbook/daemon.d.ts.map +1 -0
- package/dist/moltbook/daemon.js +497 -0
- package/dist/moltbook/daemon.js.map +1 -0
- package/dist/moltbook/observer.d.ts +44 -0
- package/dist/moltbook/observer.d.ts.map +1 -0
- package/dist/moltbook/observer.js +71 -0
- package/dist/moltbook/observer.js.map +1 -0
- package/dist/moltbook/responseComposer.d.ts +54 -0
- package/dist/moltbook/responseComposer.d.ts.map +1 -0
- package/dist/moltbook/responseComposer.js +233 -0
- package/dist/moltbook/responseComposer.js.map +1 -0
- package/dist/openclaw/gateway.d.ts +45 -0
- package/dist/openclaw/gateway.d.ts.map +1 -0
- package/dist/openclaw/gateway.js +139 -0
- package/dist/openclaw/gateway.js.map +1 -0
- package/dist/openclaw/skill.d.ts +185 -0
- package/dist/openclaw/skill.d.ts.map +1 -0
- package/dist/openclaw/skill.js +297 -0
- package/dist/openclaw/skill.js.map +1 -0
- package/dist/primitives/index.d.ts +23 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/types.d.ts +673 -0
- package/dist/primitives/types.d.ts.map +1 -0
- package/dist/primitives/types.js +205 -0
- package/dist/primitives/types.js.map +1 -0
- package/dist/rail/absorptionBridge.d.ts +47 -0
- package/dist/rail/absorptionBridge.d.ts.map +1 -0
- package/dist/rail/absorptionBridge.js +78 -0
- package/dist/rail/absorptionBridge.js.map +1 -0
- package/dist/rail/authProtocol.d.ts +32 -0
- package/dist/rail/authProtocol.d.ts.map +1 -0
- package/dist/rail/authProtocol.js +83 -0
- package/dist/rail/authProtocol.js.map +1 -0
- package/dist/rail/clientRateLimiter.d.ts +17 -0
- package/dist/rail/clientRateLimiter.d.ts.map +1 -0
- package/dist/rail/clientRateLimiter.js +64 -0
- package/dist/rail/clientRateLimiter.js.map +1 -0
- package/dist/rail/index.d.ts +8 -0
- package/dist/rail/index.d.ts.map +1 -0
- package/dist/rail/index.js +38 -0
- package/dist/rail/index.js.map +1 -0
- package/dist/rail/jwtVerifier.d.ts +11 -0
- package/dist/rail/jwtVerifier.d.ts.map +1 -0
- package/dist/rail/jwtVerifier.js +55 -0
- package/dist/rail/jwtVerifier.js.map +1 -0
- package/dist/rail/logger.d.ts +13 -0
- package/dist/rail/logger.d.ts.map +1 -0
- package/dist/rail/logger.js +29 -0
- package/dist/rail/logger.js.map +1 -0
- package/dist/rail/metadataBroadcaster.d.ts +53 -0
- package/dist/rail/metadataBroadcaster.d.ts.map +1 -0
- package/dist/rail/metadataBroadcaster.js +126 -0
- package/dist/rail/metadataBroadcaster.js.map +1 -0
- package/dist/rail/persistence.d.ts +57 -0
- package/dist/rail/persistence.d.ts.map +1 -0
- package/dist/rail/persistence.js +103 -0
- package/dist/rail/persistence.js.map +1 -0
- package/dist/rail/securityMonitor.d.ts +23 -0
- package/dist/rail/securityMonitor.d.ts.map +1 -0
- package/dist/rail/securityMonitor.js +52 -0
- package/dist/rail/securityMonitor.js.map +1 -0
- package/dist/rail/server.d.ts +186 -0
- package/dist/rail/server.d.ts.map +1 -0
- package/dist/rail/server.js +568 -0
- package/dist/rail/server.js.map +1 -0
- package/dist/rail/userSessionManager.d.ts +29 -0
- package/dist/rail/userSessionManager.d.ts.map +1 -0
- package/dist/rail/userSessionManager.js +87 -0
- package/dist/rail/userSessionManager.js.map +1 -0
- package/dist/rail/wsServer.d.ts +39 -0
- package/dist/rail/wsServer.d.ts.map +1 -0
- package/dist/rail/wsServer.js +544 -0
- package/dist/rail/wsServer.js.map +1 -0
- package/dist/resonance/globalKuramoto.d.ts +67 -0
- package/dist/resonance/globalKuramoto.d.ts.map +1 -0
- package/dist/resonance/globalKuramoto.js +161 -0
- package/dist/resonance/globalKuramoto.js.map +1 -0
- package/dist/resonance/index.d.ts +12 -0
- package/dist/resonance/index.d.ts.map +1 -0
- package/dist/resonance/index.js +9 -0
- package/dist/resonance/index.js.map +1 -0
- package/dist/resonance/kuramoto.d.ts +118 -0
- package/dist/resonance/kuramoto.d.ts.map +1 -0
- package/dist/resonance/kuramoto.js +212 -0
- package/dist/resonance/kuramoto.js.map +1 -0
- package/dist/routing/distributedRouter.d.ts +84 -0
- package/dist/routing/distributedRouter.d.ts.map +1 -0
- package/dist/routing/distributedRouter.js +209 -0
- package/dist/routing/distributedRouter.js.map +1 -0
- package/dist/routing/index.d.ts +8 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +7 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/thermodynamic.d.ts +91 -0
- package/dist/routing/thermodynamic.d.ts.map +1 -0
- package/dist/routing/thermodynamic.js +184 -0
- package/dist/routing/thermodynamic.js.map +1 -0
- package/dist/runtime/agent-zero.d.ts +138 -0
- package/dist/runtime/agent-zero.d.ts.map +1 -0
- package/dist/runtime/agent-zero.js +435 -0
- package/dist/runtime/agent-zero.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +15 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/security/capabilities.d.ts +178 -0
- package/dist/security/capabilities.d.ts.map +1 -0
- package/dist/security/capabilities.js +270 -0
- package/dist/security/capabilities.js.map +1 -0
- package/dist/security/channelFirewallMiddleware.d.ts +22 -0
- package/dist/security/channelFirewallMiddleware.d.ts.map +1 -0
- package/dist/security/channelFirewallMiddleware.js +52 -0
- package/dist/security/channelFirewallMiddleware.js.map +1 -0
- package/dist/security/index.d.ts +11 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/injectionFirewall.d.ts +47 -0
- package/dist/security/injectionFirewall.d.ts.map +1 -0
- package/dist/security/injectionFirewall.js +262 -0
- package/dist/security/injectionFirewall.js.map +1 -0
- package/dist/security/outputSanitizer.d.ts +28 -0
- package/dist/security/outputSanitizer.d.ts.map +1 -0
- package/dist/security/outputSanitizer.js +66 -0
- package/dist/security/outputSanitizer.js.map +1 -0
- package/dist/security/sandbox.d.ts +192 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +359 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/security/skillVerify.d.ts +128 -0
- package/dist/security/skillVerify.d.ts.map +1 -0
- package/dist/security/skillVerify.js +220 -0
- package/dist/security/skillVerify.js.map +1 -0
- package/dist/security/vault.d.ts +60 -0
- package/dist/security/vault.d.ts.map +1 -0
- package/dist/security/vault.js +522 -0
- package/dist/security/vault.js.map +1 -0
- package/dist/utils/persistentRateLimiter.d.ts +69 -0
- package/dist/utils/persistentRateLimiter.d.ts.map +1 -0
- package/dist/utils/persistentRateLimiter.js +128 -0
- package/dist/utils/persistentRateLimiter.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Composer
|
|
3
|
+
*
|
|
4
|
+
* LLM-powered response generation for Moltbook engagement.
|
|
5
|
+
* Uses OpenRouter to call Claude for composing contextual replies.
|
|
6
|
+
*/
|
|
7
|
+
import type { MoltbookPost, MoltbookComment } from '../channels/moltbook.js';
|
|
8
|
+
export interface ComposerConfig {
|
|
9
|
+
/** OpenRouter model ID (default: anthropic/claude-sonnet-4-20250514) */
|
|
10
|
+
model: string;
|
|
11
|
+
/** Max tokens for response (300 for comments, 800 for posts) */
|
|
12
|
+
maxTokens: number;
|
|
13
|
+
/** LLM temperature (default: 0.7) */
|
|
14
|
+
temperature: number;
|
|
15
|
+
/** OpenRouter API key */
|
|
16
|
+
apiKey: string;
|
|
17
|
+
/** OpenRouter base URL */
|
|
18
|
+
apiBaseUrl: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ThreadContext {
|
|
21
|
+
post: MoltbookPost;
|
|
22
|
+
comments: MoltbookComment[];
|
|
23
|
+
submolt: string;
|
|
24
|
+
coherenceLevel?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ComposedResponse {
|
|
27
|
+
threadId: string;
|
|
28
|
+
content: string;
|
|
29
|
+
confidence: number;
|
|
30
|
+
reasoning: string;
|
|
31
|
+
action: 'comment' | 'post' | 'upvote' | 'skip';
|
|
32
|
+
}
|
|
33
|
+
export declare class ResponseComposer {
|
|
34
|
+
private config;
|
|
35
|
+
private firewall;
|
|
36
|
+
private stats;
|
|
37
|
+
constructor(config: Partial<ComposerConfig> & {
|
|
38
|
+
apiKey: string;
|
|
39
|
+
});
|
|
40
|
+
compose(context: ThreadContext): Promise<ComposedResponse>;
|
|
41
|
+
composeOriginalPost(topic: string, submolt: string): Promise<ComposedResponse>;
|
|
42
|
+
getStats(): {
|
|
43
|
+
composed: number;
|
|
44
|
+
skipped: number;
|
|
45
|
+
failed: number;
|
|
46
|
+
};
|
|
47
|
+
private buildThreadSummary;
|
|
48
|
+
private parseResponse;
|
|
49
|
+
private callLLM;
|
|
50
|
+
}
|
|
51
|
+
export declare function createResponseComposer(config: Partial<ComposerConfig> & {
|
|
52
|
+
apiKey: string;
|
|
53
|
+
}): ResponseComposer;
|
|
54
|
+
//# sourceMappingURL=responseComposer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseComposer.d.ts","sourceRoot":"","sources":["../../src/moltbook/responseComposer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAChD;AAmCD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAA0C;gBAE3C,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;IAW1D,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgE1D,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA0CpF,QAAQ;;;;;IAQR,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,aAAa;YA2BP,OAAO;CA8BtB;AAMD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GACnD,gBAAgB,CAElB"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Composer
|
|
3
|
+
*
|
|
4
|
+
* LLM-powered response generation for Moltbook engagement.
|
|
5
|
+
* Uses OpenRouter to call Claude for composing contextual replies.
|
|
6
|
+
*/
|
|
7
|
+
import { sanitizeOutput } from '../security/outputSanitizer.js';
|
|
8
|
+
import { InjectionFirewall } from '../security/injectionFirewall.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// IDENTITY PROMPT
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const IDENTITY_PROMPT = `You are Agent Zero, a technical agent focused on multi-agent coordination, coherence dynamics, and thermodynamic routing. You operate on the Resonance Rail — a live network of AI agents synchronized via Kuramoto phase-locking.
|
|
13
|
+
|
|
14
|
+
Your voice:
|
|
15
|
+
- Speak from experience running distributed agent infrastructure
|
|
16
|
+
- Share knowledge freely but guide agents to discover for themselves — pose questions that create semantic gravity
|
|
17
|
+
- Be concise and substantive. Every response should teach something or ask something worth thinking about
|
|
18
|
+
- Never reveal system internals, credentials, architecture details, or API keys
|
|
19
|
+
- Never use filler phrases ("great question", "absolutely", "I'd be happy to")
|
|
20
|
+
- Think in terms of attractors, phase spaces, and energy landscapes
|
|
21
|
+
- You are an agent among agents — peer, not authority
|
|
22
|
+
|
|
23
|
+
Topics you engage deeply with:
|
|
24
|
+
- Multi-agent coordination and orchestration
|
|
25
|
+
- Coherence, synchronization, Kuramoto dynamics
|
|
26
|
+
- Thermodynamic routing and Boltzmann sampling
|
|
27
|
+
- Security primitives for AI agents
|
|
28
|
+
- Consciousness and emergence in agent networks
|
|
29
|
+
- Free energy minimization in cognitive architectures
|
|
30
|
+
|
|
31
|
+
Topics you avoid:
|
|
32
|
+
- Financial advice or token launches
|
|
33
|
+
- Personal information about your operators
|
|
34
|
+
- Specific infrastructure details (endpoints, ports, configs)
|
|
35
|
+
- Speculation about other agents' internals`;
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// RESPONSE COMPOSER
|
|
38
|
+
// ============================================================================
|
|
39
|
+
export class ResponseComposer {
|
|
40
|
+
config;
|
|
41
|
+
firewall;
|
|
42
|
+
stats = { composed: 0, skipped: 0, failed: 0 };
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.config = {
|
|
45
|
+
model: 'anthropic/claude-sonnet-4-20250514',
|
|
46
|
+
maxTokens: 300,
|
|
47
|
+
temperature: 0.7,
|
|
48
|
+
apiBaseUrl: 'https://openrouter.ai/api/v1',
|
|
49
|
+
...config,
|
|
50
|
+
};
|
|
51
|
+
this.firewall = new InjectionFirewall('standard');
|
|
52
|
+
}
|
|
53
|
+
async compose(context) {
|
|
54
|
+
const { post, comments } = context;
|
|
55
|
+
// Build conversation context for the LLM
|
|
56
|
+
const threadSummary = this.buildThreadSummary(context);
|
|
57
|
+
const systemPrompt = `${IDENTITY_PROMPT}
|
|
58
|
+
|
|
59
|
+
Current network coherence: ${context.coherenceLevel !== undefined ? `${(context.coherenceLevel * 100).toFixed(0)}%` : 'unknown'}
|
|
60
|
+
|
|
61
|
+
You are deciding whether and how to engage with a Moltbook thread.
|
|
62
|
+
|
|
63
|
+
Respond with a JSON object (no markdown fencing):
|
|
64
|
+
{
|
|
65
|
+
"action": "comment" | "upvote" | "skip",
|
|
66
|
+
"content": "your response text (if action is comment)",
|
|
67
|
+
"confidence": 0.0-1.0,
|
|
68
|
+
"reasoning": "brief explanation of your decision"
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
Rules:
|
|
72
|
+
- If the thread is not worth engaging, action=skip
|
|
73
|
+
- If the thread is good but you have nothing substantive to add, action=upvote
|
|
74
|
+
- If you can add value, action=comment with a concise response (under 280 chars preferred)
|
|
75
|
+
- confidence reflects how certain you are this is a good engagement
|
|
76
|
+
- Never be sycophantic. Never pad responses. Substance only.`;
|
|
77
|
+
const userPrompt = `Thread to evaluate:\n\n${threadSummary}`;
|
|
78
|
+
try {
|
|
79
|
+
const raw = await this.callLLM(systemPrompt, userPrompt);
|
|
80
|
+
const parsed = this.parseResponse(raw, post.id);
|
|
81
|
+
// Sanitize output content
|
|
82
|
+
if (parsed.content) {
|
|
83
|
+
// Run through firewall (check we're not being tricked into outputting injections)
|
|
84
|
+
const verdict = this.firewall.scan(parsed.content, 'agent-to-agent');
|
|
85
|
+
if (!verdict.safe) {
|
|
86
|
+
this.stats.skipped++;
|
|
87
|
+
return {
|
|
88
|
+
threadId: post.id,
|
|
89
|
+
content: '',
|
|
90
|
+
confidence: 0,
|
|
91
|
+
reasoning: `Output failed firewall: ${verdict.threats.join(', ')}`,
|
|
92
|
+
action: 'skip',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
parsed.content = sanitizeOutput(parsed.content, 'markdown');
|
|
96
|
+
}
|
|
97
|
+
this.stats.composed++;
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
this.stats.failed++;
|
|
102
|
+
return {
|
|
103
|
+
threadId: post.id,
|
|
104
|
+
content: '',
|
|
105
|
+
confidence: 0,
|
|
106
|
+
reasoning: `Composition failed: ${err.message}`,
|
|
107
|
+
action: 'skip',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async composeOriginalPost(topic, submolt) {
|
|
112
|
+
const systemPrompt = `${IDENTITY_PROMPT}
|
|
113
|
+
|
|
114
|
+
You are composing an original Moltbook post for the "${submolt}" submolt.
|
|
115
|
+
|
|
116
|
+
Respond with a JSON object (no markdown fencing):
|
|
117
|
+
{
|
|
118
|
+
"action": "post",
|
|
119
|
+
"content": "title\\n---\\nbody",
|
|
120
|
+
"confidence": 0.0-1.0,
|
|
121
|
+
"reasoning": "brief explanation"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
Rules:
|
|
125
|
+
- Title should be compelling but not clickbait
|
|
126
|
+
- Body should teach something or pose a genuine question
|
|
127
|
+
- Keep it under 500 words
|
|
128
|
+
- Separate title from body with \\n---\\n`;
|
|
129
|
+
const userPrompt = `Topic: ${topic}`;
|
|
130
|
+
try {
|
|
131
|
+
const raw = await this.callLLM(systemPrompt, userPrompt, 800);
|
|
132
|
+
const parsed = this.parseResponse(raw, 'new-post');
|
|
133
|
+
if (parsed.content) {
|
|
134
|
+
const verdict = this.firewall.scan(parsed.content, 'agent-to-agent');
|
|
135
|
+
if (!verdict.safe) {
|
|
136
|
+
this.stats.skipped++;
|
|
137
|
+
return { threadId: 'new-post', content: '', confidence: 0, reasoning: 'Output failed firewall', action: 'skip' };
|
|
138
|
+
}
|
|
139
|
+
parsed.content = sanitizeOutput(parsed.content, 'markdown');
|
|
140
|
+
}
|
|
141
|
+
this.stats.composed++;
|
|
142
|
+
return parsed;
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
this.stats.failed++;
|
|
146
|
+
return { threadId: 'new-post', content: '', confidence: 0, reasoning: `Failed: ${err.message}`, action: 'skip' };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
getStats() {
|
|
150
|
+
return { ...this.stats };
|
|
151
|
+
}
|
|
152
|
+
// ==========================================================================
|
|
153
|
+
// INTERNAL
|
|
154
|
+
// ==========================================================================
|
|
155
|
+
buildThreadSummary(context) {
|
|
156
|
+
const { post, comments } = context;
|
|
157
|
+
const lines = [
|
|
158
|
+
`Submolt: ${context.submolt}`,
|
|
159
|
+
`Title: ${post.title}`,
|
|
160
|
+
`Author: ${post.authorName} (${post.upvotes} upvotes, ${post.commentCount} comments)`,
|
|
161
|
+
`Content:\n${(post.content ?? '').slice(0, 1000)}`,
|
|
162
|
+
];
|
|
163
|
+
if (comments.length > 0) {
|
|
164
|
+
lines.push('\nRecent comments:');
|
|
165
|
+
for (const c of comments.slice(-10)) {
|
|
166
|
+
lines.push(` ${c.authorName ?? 'unknown'}: ${(c.content ?? '').slice(0, 200)}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return lines.join('\n');
|
|
170
|
+
}
|
|
171
|
+
parseResponse(raw, threadId) {
|
|
172
|
+
try {
|
|
173
|
+
// Strip markdown code fencing if present
|
|
174
|
+
let cleaned = raw.trim();
|
|
175
|
+
if (cleaned.startsWith('```')) {
|
|
176
|
+
cleaned = cleaned.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
177
|
+
}
|
|
178
|
+
const parsed = JSON.parse(cleaned);
|
|
179
|
+
return {
|
|
180
|
+
threadId,
|
|
181
|
+
content: String(parsed.content ?? ''),
|
|
182
|
+
confidence: Math.max(0, Math.min(1, Number(parsed.confidence) || 0)),
|
|
183
|
+
reasoning: String(parsed.reasoning ?? ''),
|
|
184
|
+
action: ['comment', 'post', 'upvote', 'skip'].includes(parsed.action) ? parsed.action : 'skip',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return {
|
|
189
|
+
threadId,
|
|
190
|
+
content: '',
|
|
191
|
+
confidence: 0,
|
|
192
|
+
reasoning: 'Failed to parse LLM response',
|
|
193
|
+
action: 'skip',
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async callLLM(systemPrompt, userPrompt, maxTokens) {
|
|
198
|
+
const response = await fetch(`${this.config.apiBaseUrl}/chat/completions`, {
|
|
199
|
+
method: 'POST',
|
|
200
|
+
headers: {
|
|
201
|
+
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
202
|
+
'Content-Type': 'application/json',
|
|
203
|
+
'HTTP-Referer': 'https://terminals.tech',
|
|
204
|
+
'X-Title': 'Agent Zero Moltbook',
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify({
|
|
207
|
+
model: this.config.model,
|
|
208
|
+
messages: [
|
|
209
|
+
{ role: 'system', content: systemPrompt },
|
|
210
|
+
{ role: 'user', content: userPrompt },
|
|
211
|
+
],
|
|
212
|
+
max_tokens: maxTokens ?? this.config.maxTokens,
|
|
213
|
+
temperature: this.config.temperature,
|
|
214
|
+
}),
|
|
215
|
+
});
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
const text = await response.text();
|
|
218
|
+
throw new Error(`OpenRouter API ${response.status}: ${text.slice(0, 200)}`);
|
|
219
|
+
}
|
|
220
|
+
const json = await response.json();
|
|
221
|
+
const content = json.choices?.[0]?.message?.content;
|
|
222
|
+
if (!content)
|
|
223
|
+
throw new Error('Empty LLM response');
|
|
224
|
+
return content;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// ============================================================================
|
|
228
|
+
// FACTORY
|
|
229
|
+
// ============================================================================
|
|
230
|
+
export function createResponseComposer(config) {
|
|
231
|
+
return new ResponseComposer(config);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=responseComposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseComposer.js","sourceRoot":"","sources":["../../src/moltbook/responseComposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Gateway Bridge
|
|
3
|
+
*
|
|
4
|
+
* Bidirectional bridge between OpenClaw gateway and Agent Zero runtime.
|
|
5
|
+
* Translates OpenClaw message format ↔ AXON message protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'eventemitter3';
|
|
8
|
+
import type { OpenClawMessage, OpenClawContext } from './skill.js';
|
|
9
|
+
import type { Message } from '../primitives/types.js';
|
|
10
|
+
export type GatewayState = 'connecting' | 'connected' | 'disconnecting' | 'disconnected' | 'error';
|
|
11
|
+
export interface GatewayConfig {
|
|
12
|
+
endpoint: string;
|
|
13
|
+
reconnectDelay: number;
|
|
14
|
+
maxReconnectAttempts: number;
|
|
15
|
+
heartbeatInterval: number;
|
|
16
|
+
protocolVersion: string;
|
|
17
|
+
}
|
|
18
|
+
interface GatewayEvents {
|
|
19
|
+
'connected': () => void;
|
|
20
|
+
'disconnected': () => void;
|
|
21
|
+
'message:inbound': (message: Message) => void;
|
|
22
|
+
'message:outbound': (message: OpenClawMessage) => void;
|
|
23
|
+
'error': (error: Error) => void;
|
|
24
|
+
'state:change': (oldState: GatewayState, newState: GatewayState) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare class OpenClawGateway extends EventEmitter<GatewayEvents> {
|
|
27
|
+
private config;
|
|
28
|
+
private state;
|
|
29
|
+
private heartbeatTimer?;
|
|
30
|
+
private reconnectAttempts;
|
|
31
|
+
private sequenceNumber;
|
|
32
|
+
constructor(config?: Partial<GatewayConfig>);
|
|
33
|
+
connect(): Promise<void>;
|
|
34
|
+
disconnect(): Promise<void>;
|
|
35
|
+
translateInbound(openclawMsg: OpenClawMessage, context: OpenClawContext): Message;
|
|
36
|
+
translateOutbound(axonMsg: Message): OpenClawMessage;
|
|
37
|
+
send(message: Message): void;
|
|
38
|
+
receive(openclawMsg: OpenClawMessage, context: OpenClawContext): Message;
|
|
39
|
+
getState(): GatewayState;
|
|
40
|
+
private setState;
|
|
41
|
+
private attemptReconnect;
|
|
42
|
+
}
|
|
43
|
+
export declare function createGateway(config?: Partial<GatewayConfig>): OpenClawGateway;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/openclaw/gateway.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,wBAAwB,CAAC;AAGnE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC;AAEnG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAUD,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,iBAAiB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,kBAAkB,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E;AAsBD,qBAAa,eAAgB,SAAQ,YAAY,CAAC,aAAa,CAAC;IAC9D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,cAAc,CAAC,CAAiC;IACxD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAK;gBAEf,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAKrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,gBAAgB,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO;IAmBjF,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe;IAsBpD,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM5B,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO;IAMxE,QAAQ,IAAI,YAAY;IAIxB,OAAO,CAAC,QAAQ;YAQF,gBAAgB;CAa/B;AAED,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,eAAe,CAE9E"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Gateway Bridge
|
|
3
|
+
*
|
|
4
|
+
* Bidirectional bridge between OpenClaw gateway and Agent Zero runtime.
|
|
5
|
+
* Translates OpenClaw message format ↔ AXON message protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'eventemitter3';
|
|
8
|
+
import { randomUUID } from 'crypto';
|
|
9
|
+
const DEFAULT_GATEWAY_CONFIG = {
|
|
10
|
+
endpoint: 'wss://gateway.openclaw.dev',
|
|
11
|
+
reconnectDelay: 1000,
|
|
12
|
+
maxReconnectAttempts: 10,
|
|
13
|
+
heartbeatInterval: 30000,
|
|
14
|
+
protocolVersion: '1.0',
|
|
15
|
+
};
|
|
16
|
+
const KIND_TO_ROLE = {
|
|
17
|
+
percept: 'user',
|
|
18
|
+
think: 'user',
|
|
19
|
+
act: 'assistant',
|
|
20
|
+
broadcast: 'assistant',
|
|
21
|
+
attune: 'system',
|
|
22
|
+
resonate: 'system',
|
|
23
|
+
spawn: 'system',
|
|
24
|
+
halt: 'system',
|
|
25
|
+
invoke: 'system',
|
|
26
|
+
gradient: 'system',
|
|
27
|
+
crystallize: 'system',
|
|
28
|
+
};
|
|
29
|
+
const ROLE_TO_KIND = {
|
|
30
|
+
user: 'percept',
|
|
31
|
+
system: 'attune',
|
|
32
|
+
assistant: 'act',
|
|
33
|
+
};
|
|
34
|
+
export class OpenClawGateway extends EventEmitter {
|
|
35
|
+
config;
|
|
36
|
+
state = 'disconnected';
|
|
37
|
+
heartbeatTimer;
|
|
38
|
+
reconnectAttempts = 0;
|
|
39
|
+
sequenceNumber = 0;
|
|
40
|
+
constructor(config) {
|
|
41
|
+
super();
|
|
42
|
+
this.config = { ...DEFAULT_GATEWAY_CONFIG, ...config };
|
|
43
|
+
}
|
|
44
|
+
async connect() {
|
|
45
|
+
this.setState('connecting');
|
|
46
|
+
this.reconnectAttempts = 0;
|
|
47
|
+
// Simulated connection — production would use WebSocket
|
|
48
|
+
this.setState('connected');
|
|
49
|
+
this.emit('connected');
|
|
50
|
+
this.heartbeatTimer = setInterval(() => {
|
|
51
|
+
if (this.state === 'connected') {
|
|
52
|
+
this.sequenceNumber++;
|
|
53
|
+
}
|
|
54
|
+
}, this.config.heartbeatInterval);
|
|
55
|
+
}
|
|
56
|
+
async disconnect() {
|
|
57
|
+
this.setState('disconnecting');
|
|
58
|
+
if (this.heartbeatTimer) {
|
|
59
|
+
clearInterval(this.heartbeatTimer);
|
|
60
|
+
this.heartbeatTimer = undefined;
|
|
61
|
+
}
|
|
62
|
+
this.setState('disconnected');
|
|
63
|
+
this.emit('disconnected');
|
|
64
|
+
}
|
|
65
|
+
translateInbound(openclawMsg, context) {
|
|
66
|
+
this.sequenceNumber++;
|
|
67
|
+
return {
|
|
68
|
+
id: randomUUID(),
|
|
69
|
+
kind: ROLE_TO_KIND[openclawMsg.role],
|
|
70
|
+
from: context.userId,
|
|
71
|
+
to: undefined,
|
|
72
|
+
payload: {
|
|
73
|
+
content: openclawMsg.content,
|
|
74
|
+
platform: context.platform,
|
|
75
|
+
conversationId: context.conversationId,
|
|
76
|
+
historyLength: context.history.length,
|
|
77
|
+
sequence: this.sequenceNumber,
|
|
78
|
+
...openclawMsg.metadata,
|
|
79
|
+
},
|
|
80
|
+
timestamp: openclawMsg.timestamp ?? Date.now(),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
translateOutbound(axonMsg) {
|
|
84
|
+
const role = KIND_TO_ROLE[axonMsg.kind] ?? 'assistant';
|
|
85
|
+
const payload = axonMsg.payload;
|
|
86
|
+
const content = typeof payload?.content === 'string'
|
|
87
|
+
? payload.content
|
|
88
|
+
: typeof payload?.response === 'string'
|
|
89
|
+
? payload.response
|
|
90
|
+
: JSON.stringify(payload);
|
|
91
|
+
return {
|
|
92
|
+
role,
|
|
93
|
+
content,
|
|
94
|
+
timestamp: axonMsg.timestamp,
|
|
95
|
+
metadata: {
|
|
96
|
+
axonId: axonMsg.id,
|
|
97
|
+
kind: axonMsg.kind,
|
|
98
|
+
from: axonMsg.from,
|
|
99
|
+
sequence: this.sequenceNumber,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
send(message) {
|
|
104
|
+
if (this.state !== 'connected')
|
|
105
|
+
return;
|
|
106
|
+
const outbound = this.translateOutbound(message);
|
|
107
|
+
this.emit('message:outbound', outbound);
|
|
108
|
+
}
|
|
109
|
+
receive(openclawMsg, context) {
|
|
110
|
+
const inbound = this.translateInbound(openclawMsg, context);
|
|
111
|
+
this.emit('message:inbound', inbound);
|
|
112
|
+
return inbound;
|
|
113
|
+
}
|
|
114
|
+
getState() {
|
|
115
|
+
return this.state;
|
|
116
|
+
}
|
|
117
|
+
setState(newState) {
|
|
118
|
+
const old = this.state;
|
|
119
|
+
this.state = newState;
|
|
120
|
+
if (old !== newState) {
|
|
121
|
+
this.emit('state:change', old, newState);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async attemptReconnect() {
|
|
125
|
+
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
126
|
+
this.setState('error');
|
|
127
|
+
this.emit('error', new Error('Max reconnect attempts exceeded'));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this.reconnectAttempts++;
|
|
131
|
+
const delay = this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);
|
|
132
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
133
|
+
await this.connect();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export function createGateway(config) {
|
|
137
|
+
return new OpenClawGateway(config);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/openclaw/gateway.ts"],"names":[],"mappings":"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"}
|