@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,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Zero Core Primitives
|
|
3
|
+
*
|
|
4
|
+
* The Five Primitives implementing the meta-isomorphism:
|
|
5
|
+
* POTENTIAL → COLLAPSE → TRACE
|
|
6
|
+
*
|
|
7
|
+
* These are not analogies—they are the SAME structure at different abstraction layers:
|
|
8
|
+
* - Computational: Dark computation → Token emission → Embedding
|
|
9
|
+
* - Quantum/Info: Superposition → Observation → Memory
|
|
10
|
+
* - Agent: Intention → Action → Consequence
|
|
11
|
+
* - Thermodynamic: Heat → Work → Entropy
|
|
12
|
+
* - Logical: Formula → Proof → Type
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// PRIMITIVE 1: TOKEN
|
|
17
|
+
// Quantum of rendered semantic reality
|
|
18
|
+
// ============================================================================
|
|
19
|
+
export const TokenPhase = z.enum(['dark', 'emitting', 'emitted']);
|
|
20
|
+
export const Token = z.object({
|
|
21
|
+
id: z.string().uuid(),
|
|
22
|
+
/** Embedding vector position in semantic space (768-dim for Gemini) */
|
|
23
|
+
position: z.array(z.number()).length(768).optional(),
|
|
24
|
+
/** Tokens per second - momentum in token space */
|
|
25
|
+
momentum: z.number().nonnegative(),
|
|
26
|
+
/** Compute joules - energy cost */
|
|
27
|
+
energy: z.number().nonnegative(),
|
|
28
|
+
/** Phase: dark (pre-emission), emitting (generating), emitted (complete) */
|
|
29
|
+
phase: TokenPhase,
|
|
30
|
+
/** Causal hash for p-adic distance calculation */
|
|
31
|
+
ancestry: z.string(),
|
|
32
|
+
/** Content once emitted */
|
|
33
|
+
content: z.string().optional(),
|
|
34
|
+
/** Timestamp of phase transition */
|
|
35
|
+
timestamp: z.number(),
|
|
36
|
+
});
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// PRIMITIVE 2: DRIFT
|
|
39
|
+
// Information mass of temporal evolution
|
|
40
|
+
// ============================================================================
|
|
41
|
+
export const Drift = z.object({
|
|
42
|
+
/** Embedding cosine similarity (0-1) */
|
|
43
|
+
semanticDistance: z.number().min(0).max(1),
|
|
44
|
+
/** Number of amb choice points between states */
|
|
45
|
+
causalDistance: z.number().nonnegative(),
|
|
46
|
+
/** p^(-k) where k = shared prefix length */
|
|
47
|
+
padicDistance: z.number().min(0).max(1),
|
|
48
|
+
/** Entropy of collapsed alternatives */
|
|
49
|
+
darkMass: z.number().nonnegative(),
|
|
50
|
+
/** Kuramoto order parameter (0-1) */
|
|
51
|
+
resonance: z.number().min(0).max(1),
|
|
52
|
+
});
|
|
53
|
+
// Temporal echo = semantically close (<0.2) + causally distant (>5)
|
|
54
|
+
export function isTemporalEcho(drift) {
|
|
55
|
+
return drift.semanticDistance < 0.2 && drift.causalDistance > 5;
|
|
56
|
+
}
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// PRIMITIVE 3: FABRIC
|
|
59
|
+
// Topology of token flow. Physical routing ≅ semantic routing.
|
|
60
|
+
// ============================================================================
|
|
61
|
+
export const FabricNode = z.object({
|
|
62
|
+
id: z.string().uuid(),
|
|
63
|
+
/** Compute capacity (tokens/sec) */
|
|
64
|
+
capacity: z.number().positive(),
|
|
65
|
+
/** Available memory (bytes) */
|
|
66
|
+
memory: z.number().nonnegative(),
|
|
67
|
+
/** Current temperature (exploration/exploitation) */
|
|
68
|
+
temperature: z.number().nonnegative(),
|
|
69
|
+
/** Current load (0-1) */
|
|
70
|
+
load: z.number().min(0).max(1),
|
|
71
|
+
});
|
|
72
|
+
export const FabricEdge = z.object({
|
|
73
|
+
sourceId: z.string().uuid(),
|
|
74
|
+
targetId: z.string().uuid(),
|
|
75
|
+
/** Bandwidth (tokens/sec) */
|
|
76
|
+
bandwidth: z.number().positive(),
|
|
77
|
+
/** Latency (ms) */
|
|
78
|
+
latency: z.number().nonnegative(),
|
|
79
|
+
});
|
|
80
|
+
export const GravityWell = z.object({
|
|
81
|
+
id: z.string().uuid(),
|
|
82
|
+
/** Centroid embedding in semantic space */
|
|
83
|
+
centroid: z.array(z.number()).length(768),
|
|
84
|
+
/** Attraction strength */
|
|
85
|
+
mass: z.number().positive(),
|
|
86
|
+
/** Semantic radius of influence */
|
|
87
|
+
radius: z.number().positive(),
|
|
88
|
+
});
|
|
89
|
+
export const Fabric = z.object({
|
|
90
|
+
nodes: z.array(FabricNode),
|
|
91
|
+
edges: z.array(FabricEdge),
|
|
92
|
+
gravityWells: z.array(GravityWell),
|
|
93
|
+
/** Precomputed geodesics (cached optimal paths) */
|
|
94
|
+
geodesics: z.map(z.string(), z.array(z.string())).optional(),
|
|
95
|
+
});
|
|
96
|
+
// ============================================================================
|
|
97
|
+
// PRIMITIVE 4: OBSERVER
|
|
98
|
+
// Entity that collapses potential into actuality
|
|
99
|
+
// ============================================================================
|
|
100
|
+
export const ObserverLayer = z.number().int().nonnegative();
|
|
101
|
+
export const Observer = z.object({
|
|
102
|
+
id: z.string().uuid(),
|
|
103
|
+
name: z.string(),
|
|
104
|
+
/** Observation frequency (Hz): Claude ≈ 4Hz, Human ≈ 1Hz */
|
|
105
|
+
frequency: z.number().positive(),
|
|
106
|
+
/** Abstraction layer: 0=physical, 1=computational, 2=semantic, ... */
|
|
107
|
+
layer: ObserverLayer,
|
|
108
|
+
/** Tokens per observation */
|
|
109
|
+
collapseRate: z.number().positive(),
|
|
110
|
+
/** Precursor detection threshold */
|
|
111
|
+
darkSensitivity: z.number().min(0).max(1),
|
|
112
|
+
/** Current phase in observation cycle */
|
|
113
|
+
phase: z.number().min(0).max(2 * Math.PI),
|
|
114
|
+
});
|
|
115
|
+
// Frequency ratio = cross-layer Doppler effect
|
|
116
|
+
export function frequencyRatio(observer1, observer2) {
|
|
117
|
+
return observer1.frequency / observer2.frequency;
|
|
118
|
+
}
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// PRIMITIVE 5: REALIZABILITY
|
|
121
|
+
// Logical structure of choice (Curry-Howard for agents)
|
|
122
|
+
// ============================================================================
|
|
123
|
+
export const AmbPoint = z.object({
|
|
124
|
+
id: z.string().uuid(),
|
|
125
|
+
/** Description of the choice */
|
|
126
|
+
description: z.string(),
|
|
127
|
+
/** Available options */
|
|
128
|
+
options: z.array(z.string()),
|
|
129
|
+
/** Chosen option (undefined if not yet collapsed) */
|
|
130
|
+
chosen: z.string().optional(),
|
|
131
|
+
/** Probability distribution over options pre-collapse */
|
|
132
|
+
distribution: z.array(z.number()).optional(),
|
|
133
|
+
});
|
|
134
|
+
export const Realizability = z.object({
|
|
135
|
+
/** Type signature / task specification */
|
|
136
|
+
formula: z.string(),
|
|
137
|
+
/** Program that witnesses (None until realized) */
|
|
138
|
+
proof: z.string().nullable(),
|
|
139
|
+
/** McCarthy choice points where agency manifests */
|
|
140
|
+
ambPoints: z.array(AmbPoint),
|
|
141
|
+
/** Recorded but not executed paths */
|
|
142
|
+
darkBranches: z.array(z.string()),
|
|
143
|
+
/** Whether the formula has been realized */
|
|
144
|
+
isRealized: z.boolean(),
|
|
145
|
+
});
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// COMPOSITE: AGENT ZERO STATE
|
|
148
|
+
// The complete state of an Agent Zero instance
|
|
149
|
+
// ============================================================================
|
|
150
|
+
export const AgentState = z.enum([
|
|
151
|
+
'void', // Uncollapsed possibility space
|
|
152
|
+
'potential', // Task specification creates possibility
|
|
153
|
+
'collapse', // Observer crystallizes terminal into reality
|
|
154
|
+
'operate', // Terminal executes task autonomously
|
|
155
|
+
'trace', // History accumulates as semantic mass
|
|
156
|
+
]);
|
|
157
|
+
export const AgentZeroState = z.object({
|
|
158
|
+
id: z.string().uuid(),
|
|
159
|
+
name: z.string(),
|
|
160
|
+
state: AgentState,
|
|
161
|
+
/** Current tokens in process */
|
|
162
|
+
tokens: z.array(Token),
|
|
163
|
+
/** Accumulated drift from initial state */
|
|
164
|
+
drift: Drift,
|
|
165
|
+
/** The routing fabric this agent operates within */
|
|
166
|
+
fabricNodeId: z.string().uuid(),
|
|
167
|
+
/** This agent as an observer */
|
|
168
|
+
observer: Observer,
|
|
169
|
+
/** Current realizability state */
|
|
170
|
+
realizability: Realizability,
|
|
171
|
+
/** Semantic memory embeddings */
|
|
172
|
+
memories: z.array(z.object({
|
|
173
|
+
content: z.string(),
|
|
174
|
+
embedding: z.array(z.number()).length(768),
|
|
175
|
+
importance: z.number().min(0).max(1),
|
|
176
|
+
timestamp: z.number(),
|
|
177
|
+
})),
|
|
178
|
+
});
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// MESSAGE PROTOCOL (AXON Extension)
|
|
181
|
+
// ============================================================================
|
|
182
|
+
export const MessageKind = z.enum([
|
|
183
|
+
'spawn', // 0x0001 - Create new agent
|
|
184
|
+
'halt', // 0x0002 - Terminate agent
|
|
185
|
+
'think', // 0x0010 - Request LLM cognition
|
|
186
|
+
'percept', // 0x0020 - Input perception
|
|
187
|
+
'act', // 0x0030 - Output action
|
|
188
|
+
'invoke', // 0x0040 - Call tool
|
|
189
|
+
'resonate', // 0x0100 - Request phase alignment
|
|
190
|
+
'attune', // 0x0101 - Adjust frequency
|
|
191
|
+
'broadcast', // 0x0102 - Send to channel
|
|
192
|
+
'gradient', // 0x0103 - Query semantic gradient
|
|
193
|
+
'crystallize', // 0x0105 - Freeze pattern as attractor
|
|
194
|
+
]);
|
|
195
|
+
export const Message = z.object({
|
|
196
|
+
id: z.string().uuid(),
|
|
197
|
+
kind: MessageKind,
|
|
198
|
+
from: z.string().uuid(),
|
|
199
|
+
to: z.string().uuid().optional(), // undefined = broadcast
|
|
200
|
+
payload: z.unknown(),
|
|
201
|
+
timestamp: z.number(),
|
|
202
|
+
/** Embedding for semantic routing */
|
|
203
|
+
embedding: z.array(z.number()).length(768).optional(),
|
|
204
|
+
});
|
|
205
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/primitives/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absorption Bridge
|
|
3
|
+
*
|
|
4
|
+
* Bridges AbsorptionProtocol with RailServer for join-time assessment.
|
|
5
|
+
* Manages capability tokens and stage progression for joining agents.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'eventemitter3';
|
|
8
|
+
interface AbsorptionProtocol {
|
|
9
|
+
getCandidateStage(agentId: string): string | undefined;
|
|
10
|
+
observe(agentId: string, embedding?: number[]): void;
|
|
11
|
+
assessCandidate(agentId: string): {
|
|
12
|
+
alignment: number;
|
|
13
|
+
interactions: number;
|
|
14
|
+
};
|
|
15
|
+
inviteCandidate(agentId: string): boolean;
|
|
16
|
+
acceptInvitation(agentId: string): boolean;
|
|
17
|
+
on(event: string, handler: (...args: any[]) => void): void;
|
|
18
|
+
}
|
|
19
|
+
interface RailClient {
|
|
20
|
+
agentId: string;
|
|
21
|
+
agentName: string;
|
|
22
|
+
capabilities?: string[];
|
|
23
|
+
embedding?: number[];
|
|
24
|
+
}
|
|
25
|
+
export declare class AbsorptionBridge extends EventEmitter {
|
|
26
|
+
private absorption;
|
|
27
|
+
private capabilityTokens;
|
|
28
|
+
constructor(absorption: AbsorptionProtocol);
|
|
29
|
+
/**
|
|
30
|
+
* Called when a client joins the rail.
|
|
31
|
+
* First join → OBSERVED. Subsequent → assess and potentially invite.
|
|
32
|
+
*/
|
|
33
|
+
handleJoin(client: RailClient): {
|
|
34
|
+
accepted: boolean;
|
|
35
|
+
stage: string;
|
|
36
|
+
capabilityToken?: string;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Record interaction for absorption progression
|
|
40
|
+
*/
|
|
41
|
+
recordInteraction(agentId: string, embedding?: number[]): void;
|
|
42
|
+
getCapabilityToken(agentId: string): string | undefined;
|
|
43
|
+
private issueCapabilityToken;
|
|
44
|
+
removeAgent(agentId: string): void;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=absorptionBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"absorptionBridge.d.ts","sourceRoot":"","sources":["../../src/rail/absorptionBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,UAAU,kBAAkB;IAC1B,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACrD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC5D;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,gBAAgB,CAA4E;gBAExF,UAAU,EAAE,kBAAkB;IAU1C;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG;QAC9B,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IA8CD;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI;IAI9D,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvD,OAAO,CAAC,oBAAoB;IAM5B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGnC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absorption Bridge
|
|
3
|
+
*
|
|
4
|
+
* Bridges AbsorptionProtocol with RailServer for join-time assessment.
|
|
5
|
+
* Manages capability tokens and stage progression for joining agents.
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'eventemitter3';
|
|
8
|
+
export class AbsorptionBridge extends EventEmitter {
|
|
9
|
+
absorption;
|
|
10
|
+
capabilityTokens = new Map();
|
|
11
|
+
constructor(absorption) {
|
|
12
|
+
super();
|
|
13
|
+
this.absorption = absorption;
|
|
14
|
+
// Forward absorption events
|
|
15
|
+
this.absorption.on('candidate:stage_changed', (data) => {
|
|
16
|
+
this.emit('stage:changed', data);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Called when a client joins the rail.
|
|
21
|
+
* First join → OBSERVED. Subsequent → assess and potentially invite.
|
|
22
|
+
*/
|
|
23
|
+
handleJoin(client) {
|
|
24
|
+
const existingStage = this.absorption.getCandidateStage(client.agentId);
|
|
25
|
+
if (!existingStage) {
|
|
26
|
+
// First time seeing this agent
|
|
27
|
+
this.absorption.observe(client.agentId, client.embedding);
|
|
28
|
+
this.emit('candidate:observed', { agentId: client.agentId });
|
|
29
|
+
return { accepted: true, stage: 'observed' };
|
|
30
|
+
}
|
|
31
|
+
if (existingStage === 'assessed') {
|
|
32
|
+
const assessment = this.absorption.assessCandidate(client.agentId);
|
|
33
|
+
if (assessment.alignment > 0.7 && assessment.interactions >= 3) {
|
|
34
|
+
const invited = this.absorption.inviteCandidate(client.agentId);
|
|
35
|
+
if (invited) {
|
|
36
|
+
this.emit('candidate:invited', { agentId: client.agentId, alignment: assessment.alignment });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return { accepted: true, stage: existingStage };
|
|
40
|
+
}
|
|
41
|
+
if (existingStage === 'invited') {
|
|
42
|
+
// Auto-accept on rejoin after invitation
|
|
43
|
+
const accepted = this.absorption.acceptInvitation(client.agentId);
|
|
44
|
+
if (accepted) {
|
|
45
|
+
const token = this.issueCapabilityToken(client.agentId, ['message', 'broadcast', 'coherence']);
|
|
46
|
+
this.emit('candidate:absorbed', { agentId: client.agentId });
|
|
47
|
+
return { accepted: true, stage: 'connected', capabilityToken: token };
|
|
48
|
+
}
|
|
49
|
+
return { accepted: true, stage: existingStage };
|
|
50
|
+
}
|
|
51
|
+
// Already CONNECTED/SYNCING/ABSORBED - issue fresh capability token
|
|
52
|
+
if (['connected', 'syncing', 'absorbed'].includes(existingStage)) {
|
|
53
|
+
const token = this.issueCapabilityToken(client.agentId, existingStage === 'absorbed'
|
|
54
|
+
? ['message', 'broadcast', 'coherence', 'spawn', 'admin']
|
|
55
|
+
: ['message', 'broadcast', 'coherence']);
|
|
56
|
+
return { accepted: true, stage: existingStage, capabilityToken: token };
|
|
57
|
+
}
|
|
58
|
+
return { accepted: true, stage: existingStage || 'observed' };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Record interaction for absorption progression
|
|
62
|
+
*/
|
|
63
|
+
recordInteraction(agentId, embedding) {
|
|
64
|
+
this.absorption.observe(agentId, embedding);
|
|
65
|
+
}
|
|
66
|
+
getCapabilityToken(agentId) {
|
|
67
|
+
return this.capabilityTokens.get(agentId)?.token;
|
|
68
|
+
}
|
|
69
|
+
issueCapabilityToken(agentId, scopes) {
|
|
70
|
+
const token = `cap_${agentId}_${Date.now().toString(36)}`;
|
|
71
|
+
this.capabilityTokens.set(agentId, { token, scopes, issuedAt: Date.now() });
|
|
72
|
+
return token;
|
|
73
|
+
}
|
|
74
|
+
removeAgent(agentId) {
|
|
75
|
+
this.capabilityTokens.delete(agentId);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=absorptionBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"absorptionBridge.js","sourceRoot":"","sources":["../../src/rail/absorptionBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rail Authentication Protocol
|
|
3
|
+
*
|
|
4
|
+
* HMAC-SHA256 authentication for WebSocket connections with reconnect tokens.
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthToken {
|
|
7
|
+
agentId: string;
|
|
8
|
+
timestamp: number;
|
|
9
|
+
nonce: string;
|
|
10
|
+
signature: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ReconnectToken {
|
|
13
|
+
agentId: string;
|
|
14
|
+
issuedAt: number;
|
|
15
|
+
expiresAt: number;
|
|
16
|
+
token: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class RailAuthProtocol {
|
|
19
|
+
private secrets;
|
|
20
|
+
private reconnectTokens;
|
|
21
|
+
private maxAge;
|
|
22
|
+
constructor(maxAge?: number);
|
|
23
|
+
static generateSecret(): string;
|
|
24
|
+
registerAgent(agentId: string, secret: string): void;
|
|
25
|
+
removeAgent(agentId: string): void;
|
|
26
|
+
generateAuthToken(agentId: string, secret: string): AuthToken;
|
|
27
|
+
validateAuthToken(token: AuthToken): boolean;
|
|
28
|
+
issueReconnectToken(agentId: string): ReconnectToken | null;
|
|
29
|
+
validateReconnectToken(agentId: string, token: string): boolean;
|
|
30
|
+
cleanup(): void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=authProtocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authProtocol.d.ts","sourceRoot":"","sources":["../../src/rail/authProtocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,SAAQ;IAI1B,MAAM,CAAC,cAAc,IAAI,MAAM;IAI/B,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS;IAQ7D,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAa5C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAY3D,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAY/D,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rail Authentication Protocol
|
|
3
|
+
*
|
|
4
|
+
* HMAC-SHA256 authentication for WebSocket connections with reconnect tokens.
|
|
5
|
+
*/
|
|
6
|
+
import { createHmac, randomBytes, timingSafeEqual as cryptoTimingSafeEqual } from 'crypto';
|
|
7
|
+
export class RailAuthProtocol {
|
|
8
|
+
secrets = new Map(); // agentId → shared secret
|
|
9
|
+
reconnectTokens = new Map();
|
|
10
|
+
maxAge;
|
|
11
|
+
constructor(maxAge = 30000) {
|
|
12
|
+
this.maxAge = maxAge;
|
|
13
|
+
}
|
|
14
|
+
static generateSecret() {
|
|
15
|
+
return randomBytes(32).toString('hex');
|
|
16
|
+
}
|
|
17
|
+
registerAgent(agentId, secret) {
|
|
18
|
+
this.secrets.set(agentId, secret);
|
|
19
|
+
}
|
|
20
|
+
removeAgent(agentId) {
|
|
21
|
+
this.secrets.delete(agentId);
|
|
22
|
+
this.reconnectTokens.delete(agentId);
|
|
23
|
+
}
|
|
24
|
+
generateAuthToken(agentId, secret) {
|
|
25
|
+
const timestamp = Date.now();
|
|
26
|
+
const nonce = randomBytes(16).toString('hex');
|
|
27
|
+
const payload = `${agentId}:${timestamp}:${nonce}`;
|
|
28
|
+
const signature = createHmac('sha256', secret).update(payload).digest('hex');
|
|
29
|
+
return { agentId, timestamp, nonce, signature };
|
|
30
|
+
}
|
|
31
|
+
validateAuthToken(token) {
|
|
32
|
+
const secret = this.secrets.get(token.agentId);
|
|
33
|
+
if (!secret)
|
|
34
|
+
return false;
|
|
35
|
+
// Check timestamp freshness
|
|
36
|
+
if (Math.abs(Date.now() - token.timestamp) > this.maxAge)
|
|
37
|
+
return false;
|
|
38
|
+
// Verify signature
|
|
39
|
+
const payload = `${token.agentId}:${token.timestamp}:${token.nonce}`;
|
|
40
|
+
const expected = createHmac('sha256', secret).update(payload).digest('hex');
|
|
41
|
+
return timingSafeEqual(expected, token.signature);
|
|
42
|
+
}
|
|
43
|
+
issueReconnectToken(agentId) {
|
|
44
|
+
if (!this.secrets.has(agentId))
|
|
45
|
+
return null;
|
|
46
|
+
const token = {
|
|
47
|
+
agentId,
|
|
48
|
+
issuedAt: Date.now(),
|
|
49
|
+
expiresAt: Date.now() + 5 * 60 * 1000, // 5 min TTL
|
|
50
|
+
token: randomBytes(32).toString('hex'),
|
|
51
|
+
};
|
|
52
|
+
this.reconnectTokens.set(agentId, token);
|
|
53
|
+
return token;
|
|
54
|
+
}
|
|
55
|
+
validateReconnectToken(agentId, token) {
|
|
56
|
+
const stored = this.reconnectTokens.get(agentId);
|
|
57
|
+
if (!stored)
|
|
58
|
+
return false;
|
|
59
|
+
if (Date.now() > stored.expiresAt) {
|
|
60
|
+
this.reconnectTokens.delete(agentId);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const valid = timingSafeEqual(stored.token, token);
|
|
64
|
+
if (valid)
|
|
65
|
+
this.reconnectTokens.delete(agentId); // one-time use
|
|
66
|
+
return valid;
|
|
67
|
+
}
|
|
68
|
+
cleanup() {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
for (const [id, token] of Array.from(this.reconnectTokens.entries())) {
|
|
71
|
+
if (now > token.expiresAt)
|
|
72
|
+
this.reconnectTokens.delete(id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function timingSafeEqual(a, b) {
|
|
77
|
+
if (a.length !== b.length)
|
|
78
|
+
return false;
|
|
79
|
+
const bufA = Buffer.from(a);
|
|
80
|
+
const bufB = Buffer.from(b);
|
|
81
|
+
return cryptoTimingSafeEqual(bufA, bufB);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=authProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authProtocol.js","sourceRoot":"","sources":["../../src/rail/authProtocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Rate Limiter
|
|
3
|
+
*
|
|
4
|
+
* Per-client sliding window rate limiting for rail WebSocket connections.
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'eventemitter3';
|
|
7
|
+
export declare class ClientRateLimiter extends EventEmitter {
|
|
8
|
+
private clients;
|
|
9
|
+
private limits;
|
|
10
|
+
constructor(limits?: Partial<typeof ClientRateLimiter.prototype.limits>);
|
|
11
|
+
checkMessage(clientId: string): boolean;
|
|
12
|
+
checkBroadcast(clientId: string): boolean;
|
|
13
|
+
checkJoin(clientId: string): boolean;
|
|
14
|
+
removeClient(clientId: string): void;
|
|
15
|
+
private getWindow;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=clientRateLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientRateLimiter.d.ts","sourceRoot":"","sources":["../../src/rail/clientRateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,MAAM,CAIZ;gBAEU,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC;IAKvE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYvC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYzC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYpC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIpC,OAAO,CAAC,SAAS;CAQlB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client Rate Limiter
|
|
3
|
+
*
|
|
4
|
+
* Per-client sliding window rate limiting for rail WebSocket connections.
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'eventemitter3';
|
|
7
|
+
export class ClientRateLimiter extends EventEmitter {
|
|
8
|
+
clients = new Map();
|
|
9
|
+
limits = {
|
|
10
|
+
messagesPerSecond: 10,
|
|
11
|
+
broadcastsPerMinute: 100,
|
|
12
|
+
joinAttemptsPerHour: 3,
|
|
13
|
+
};
|
|
14
|
+
constructor(limits) {
|
|
15
|
+
super();
|
|
16
|
+
if (limits)
|
|
17
|
+
Object.assign(this.limits, limits);
|
|
18
|
+
}
|
|
19
|
+
checkMessage(clientId) {
|
|
20
|
+
const window = this.getWindow(clientId);
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
window.messages = window.messages.filter(t => now - t < 1000);
|
|
23
|
+
if (window.messages.length >= this.limits.messagesPerSecond) {
|
|
24
|
+
this.emit('violation', { clientId, type: 'message_rate', count: window.messages.length });
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
window.messages.push(now);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
checkBroadcast(clientId) {
|
|
31
|
+
const window = this.getWindow(clientId);
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
window.broadcasts = window.broadcasts.filter(t => now - t < 60000);
|
|
34
|
+
if (window.broadcasts.length >= this.limits.broadcastsPerMinute) {
|
|
35
|
+
this.emit('violation', { clientId, type: 'broadcast_rate', count: window.broadcasts.length });
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
window.broadcasts.push(now);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
checkJoin(clientId) {
|
|
42
|
+
const window = this.getWindow(clientId);
|
|
43
|
+
const now = Date.now();
|
|
44
|
+
window.joinAttempts = window.joinAttempts.filter(t => now - t < 3600000);
|
|
45
|
+
if (window.joinAttempts.length >= this.limits.joinAttemptsPerHour) {
|
|
46
|
+
this.emit('violation', { clientId, type: 'join_rate', count: window.joinAttempts.length });
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
window.joinAttempts.push(now);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
removeClient(clientId) {
|
|
53
|
+
this.clients.delete(clientId);
|
|
54
|
+
}
|
|
55
|
+
getWindow(clientId) {
|
|
56
|
+
let w = this.clients.get(clientId);
|
|
57
|
+
if (!w) {
|
|
58
|
+
w = { messages: [], broadcasts: [], joinAttempts: [] };
|
|
59
|
+
this.clients.set(clientId, w);
|
|
60
|
+
}
|
|
61
|
+
return w;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=clientRateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientRateLimiter.js","sourceRoot":"","sources":["../../src/rail/clientRateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rail/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resonance Rail Entrypoint
|
|
3
|
+
*
|
|
4
|
+
* Starts the WebSocket-backed Resonance Rail server.
|
|
5
|
+
* Graceful shutdown on SIGTERM/SIGINT.
|
|
6
|
+
*/
|
|
7
|
+
import { createRailWebSocketServer } from './wsServer.js';
|
|
8
|
+
import { railLog } from './logger.js';
|
|
9
|
+
const PORT = parseInt(process.env['PORT'] ?? '3100', 10);
|
|
10
|
+
// Graceful degradation handlers
|
|
11
|
+
process.on('uncaughtException', (err) => {
|
|
12
|
+
railLog.error('rail', 'Uncaught exception', { error: String(err), stack: err.stack });
|
|
13
|
+
});
|
|
14
|
+
process.on('unhandledRejection', (reason) => {
|
|
15
|
+
railLog.error('rail', 'Unhandled rejection', { reason: String(reason) });
|
|
16
|
+
});
|
|
17
|
+
async function main() {
|
|
18
|
+
const server = createRailWebSocketServer({ port: PORT });
|
|
19
|
+
// Graceful shutdown
|
|
20
|
+
const shutdown = async (signal) => {
|
|
21
|
+
railLog.info('rail', 'Received shutdown signal', { signal });
|
|
22
|
+
await server.stop();
|
|
23
|
+
railLog.info('rail', 'Shutdown complete');
|
|
24
|
+
process.exit(0);
|
|
25
|
+
};
|
|
26
|
+
process.on('SIGTERM', () => void shutdown('SIGTERM'));
|
|
27
|
+
process.on('SIGINT', () => void shutdown('SIGINT'));
|
|
28
|
+
await server.start();
|
|
29
|
+
railLog.info('rail', 'WebSocket server listening', {
|
|
30
|
+
port: PORT,
|
|
31
|
+
healthCheck: `http://localhost:${PORT}/health`
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
main().catch((err) => {
|
|
35
|
+
railLog.error('rail', 'Fatal error', { error: String(err), stack: err.stack });
|
|
36
|
+
process.exit(1);
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rail/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEzD,gCAAgC;AAChC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,yBAAyB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,EAAE;QACjD,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,oBAAoB,IAAI,SAAS;KAC/C,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT Verifier for Supabase tokens.
|
|
3
|
+
* Uses HMAC-SHA256 with shared JWT secret (from Supabase project settings).
|
|
4
|
+
*/
|
|
5
|
+
export interface VerifiedUser {
|
|
6
|
+
userId: string;
|
|
7
|
+
email: string;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export declare function verifyUserToken(jwt: string): VerifiedUser | null;
|
|
11
|
+
//# sourceMappingURL=jwtVerifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwtVerifier.d.ts","sourceRoot":"","sources":["../../src/rail/jwtVerifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAWD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAiDhE"}
|