outcome-cli 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 +261 -0
- package/package.json +95 -0
- package/src/agents/README.md +139 -0
- package/src/agents/adapters/anthropic.adapter.ts +166 -0
- package/src/agents/adapters/dalle.adapter.ts +145 -0
- package/src/agents/adapters/gemini.adapter.ts +134 -0
- package/src/agents/adapters/imagen.adapter.ts +106 -0
- package/src/agents/adapters/nano-banana.adapter.ts +129 -0
- package/src/agents/adapters/openai.adapter.ts +165 -0
- package/src/agents/adapters/veo.adapter.ts +130 -0
- package/src/agents/agent.schema.property.test.ts +379 -0
- package/src/agents/agent.schema.test.ts +148 -0
- package/src/agents/agent.schema.ts +263 -0
- package/src/agents/index.ts +60 -0
- package/src/agents/registered-agent.schema.ts +356 -0
- package/src/agents/registry.ts +97 -0
- package/src/agents/tournament-configs.property.test.ts +266 -0
- package/src/cli/README.md +145 -0
- package/src/cli/commands/define.ts +79 -0
- package/src/cli/commands/list.ts +46 -0
- package/src/cli/commands/logs.ts +83 -0
- package/src/cli/commands/run.ts +416 -0
- package/src/cli/commands/verify.ts +110 -0
- package/src/cli/index.ts +81 -0
- package/src/config/README.md +128 -0
- package/src/config/env.ts +262 -0
- package/src/config/index.ts +19 -0
- package/src/eval/README.md +318 -0
- package/src/eval/ai-judge.test.ts +435 -0
- package/src/eval/ai-judge.ts +368 -0
- package/src/eval/code-validators.ts +414 -0
- package/src/eval/evaluateOutcome.property.test.ts +1174 -0
- package/src/eval/evaluateOutcome.ts +591 -0
- package/src/eval/immigration-validators.ts +122 -0
- package/src/eval/index.ts +90 -0
- package/src/eval/judge-cache.ts +402 -0
- package/src/eval/tournament-validators.property.test.ts +439 -0
- package/src/eval/validators.property.test.ts +1118 -0
- package/src/eval/validators.ts +1199 -0
- package/src/eval/weighted-scorer.ts +285 -0
- package/src/index.ts +17 -0
- package/src/league/README.md +188 -0
- package/src/league/health-check.ts +353 -0
- package/src/league/index.ts +93 -0
- package/src/league/killAgent.ts +151 -0
- package/src/league/league.test.ts +1151 -0
- package/src/league/runLeague.ts +843 -0
- package/src/league/scoreAgent.ts +175 -0
- package/src/modules/omnibridge/__tests__/.gitkeep +1 -0
- package/src/modules/omnibridge/__tests__/auth-tunnel.property.test.ts +524 -0
- package/src/modules/omnibridge/__tests__/deterministic-logger.property.test.ts +965 -0
- package/src/modules/omnibridge/__tests__/ghost-api.property.test.ts +461 -0
- package/src/modules/omnibridge/__tests__/omnibridge-integration.test.ts +542 -0
- package/src/modules/omnibridge/__tests__/parallel-executor.property.test.ts +671 -0
- package/src/modules/omnibridge/__tests__/semantic-normalizer.property.test.ts +521 -0
- package/src/modules/omnibridge/__tests__/semantic-normalizer.test.ts +254 -0
- package/src/modules/omnibridge/__tests__/session-vault.property.test.ts +367 -0
- package/src/modules/omnibridge/__tests__/shadow-session.property.test.ts +523 -0
- package/src/modules/omnibridge/__tests__/triangulation-engine.property.test.ts +292 -0
- package/src/modules/omnibridge/__tests__/verification-engine.property.test.ts +769 -0
- package/src/modules/omnibridge/api/.gitkeep +1 -0
- package/src/modules/omnibridge/api/ghost-api.ts +1087 -0
- package/src/modules/omnibridge/auth/.gitkeep +1 -0
- package/src/modules/omnibridge/auth/auth-tunnel.ts +843 -0
- package/src/modules/omnibridge/auth/session-vault.ts +577 -0
- package/src/modules/omnibridge/core/.gitkeep +1 -0
- package/src/modules/omnibridge/core/semantic-normalizer.ts +702 -0
- package/src/modules/omnibridge/core/triangulation-engine.ts +530 -0
- package/src/modules/omnibridge/core/types.ts +610 -0
- package/src/modules/omnibridge/execution/.gitkeep +1 -0
- package/src/modules/omnibridge/execution/deterministic-logger.ts +629 -0
- package/src/modules/omnibridge/execution/parallel-executor.ts +542 -0
- package/src/modules/omnibridge/execution/shadow-session.ts +794 -0
- package/src/modules/omnibridge/index.ts +212 -0
- package/src/modules/omnibridge/omnibridge.ts +510 -0
- package/src/modules/omnibridge/verification/.gitkeep +1 -0
- package/src/modules/omnibridge/verification/verification-engine.ts +783 -0
- package/src/outcomes/README.md +75 -0
- package/src/outcomes/acquire-pilot-customer.ts +297 -0
- package/src/outcomes/code-delivery-outcomes.ts +89 -0
- package/src/outcomes/code-outcomes.ts +256 -0
- package/src/outcomes/code_review_battle.test.ts +135 -0
- package/src/outcomes/code_review_battle.ts +135 -0
- package/src/outcomes/cold_email_battle.ts +97 -0
- package/src/outcomes/content_creation_battle.ts +160 -0
- package/src/outcomes/f1_stem_opt_compliance.ts +61 -0
- package/src/outcomes/index.ts +107 -0
- package/src/outcomes/lead_gen_battle.test.ts +113 -0
- package/src/outcomes/lead_gen_battle.ts +99 -0
- package/src/outcomes/outcome.schema.property.test.ts +229 -0
- package/src/outcomes/outcome.schema.ts +187 -0
- package/src/outcomes/qualified_sales_interest.ts +118 -0
- package/src/outcomes/swarm_planner.property.test.ts +370 -0
- package/src/outcomes/swarm_planner.ts +96 -0
- package/src/outcomes/web_extraction.ts +234 -0
- package/src/runtime/README.md +220 -0
- package/src/runtime/agentRunner.test.ts +341 -0
- package/src/runtime/agentRunner.ts +746 -0
- package/src/runtime/claudeAdapter.ts +232 -0
- package/src/runtime/costTracker.ts +123 -0
- package/src/runtime/index.ts +34 -0
- package/src/runtime/modelAdapter.property.test.ts +305 -0
- package/src/runtime/modelAdapter.ts +144 -0
- package/src/runtime/openaiAdapter.ts +235 -0
- package/src/utils/README.md +122 -0
- package/src/utils/command-runner.ts +134 -0
- package/src/utils/cost-guard.ts +379 -0
- package/src/utils/errors.test.ts +290 -0
- package/src/utils/errors.ts +442 -0
- package/src/utils/index.ts +37 -0
- package/src/utils/logger.test.ts +361 -0
- package/src/utils/logger.ts +419 -0
- package/src/utils/output-parsers.ts +216 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OmniBridge - Semantic Engine for WAIESL
|
|
3
|
+
*
|
|
4
|
+
* The nervous system that converts the messy, human-designed web
|
|
5
|
+
* into a stable, programmable Ghost-API for AI agents.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Main OmniBridge class for WAIESL integration
|
|
9
|
+
export {
|
|
10
|
+
OmniBridge,
|
|
11
|
+
createOmniBridge,
|
|
12
|
+
} from './omnibridge.js';
|
|
13
|
+
|
|
14
|
+
export type {
|
|
15
|
+
OmniBridgeConfig,
|
|
16
|
+
WebCompetitionResult,
|
|
17
|
+
WebBountyResult,
|
|
18
|
+
WebExtractionGoal,
|
|
19
|
+
} from './omnibridge.js';
|
|
20
|
+
|
|
21
|
+
// Core types - Intent Document
|
|
22
|
+
export type {
|
|
23
|
+
IntentId,
|
|
24
|
+
IntentElement,
|
|
25
|
+
IntentFormField,
|
|
26
|
+
IntentForm,
|
|
27
|
+
IntentNavigation,
|
|
28
|
+
IntentDocument,
|
|
29
|
+
} from './core/types.js';
|
|
30
|
+
|
|
31
|
+
// Core types - Triangulation Engine (Self-Healing)
|
|
32
|
+
export type {
|
|
33
|
+
SpatialAnchor,
|
|
34
|
+
SemanticAnchor,
|
|
35
|
+
FunctionalAnchor,
|
|
36
|
+
AnchorSet,
|
|
37
|
+
LocateResult,
|
|
38
|
+
HealResult,
|
|
39
|
+
} from './core/types.js';
|
|
40
|
+
|
|
41
|
+
// Core types - Ghost-API
|
|
42
|
+
export type {
|
|
43
|
+
GoalDefinition,
|
|
44
|
+
SchemaMapping,
|
|
45
|
+
GhostResponse,
|
|
46
|
+
} from './core/types.js';
|
|
47
|
+
|
|
48
|
+
// Core types - Session and Auth
|
|
49
|
+
export type {
|
|
50
|
+
DeviceFingerprint,
|
|
51
|
+
SessionConfig,
|
|
52
|
+
AuthConfig,
|
|
53
|
+
ShadowSession,
|
|
54
|
+
EncryptedBlob,
|
|
55
|
+
SerializedSession,
|
|
56
|
+
} from './core/types.js';
|
|
57
|
+
|
|
58
|
+
// Core types - Capability Tokens
|
|
59
|
+
export type {
|
|
60
|
+
ActionScope,
|
|
61
|
+
CapabilityToken,
|
|
62
|
+
} from './core/types.js';
|
|
63
|
+
|
|
64
|
+
// Core types - MFA
|
|
65
|
+
export type {
|
|
66
|
+
MFAChallenge,
|
|
67
|
+
AuthResult,
|
|
68
|
+
AuthError,
|
|
69
|
+
} from './core/types.js';
|
|
70
|
+
|
|
71
|
+
// Core types - Action Logging
|
|
72
|
+
export type {
|
|
73
|
+
ActionLogEntry,
|
|
74
|
+
VerificationProof,
|
|
75
|
+
DiffAnalysis,
|
|
76
|
+
} from './core/types.js';
|
|
77
|
+
|
|
78
|
+
// Core types - Competition
|
|
79
|
+
export type {
|
|
80
|
+
Competition,
|
|
81
|
+
CompetitionResult,
|
|
82
|
+
BountyExecution,
|
|
83
|
+
} from './core/types.js';
|
|
84
|
+
|
|
85
|
+
// Core types - Errors
|
|
86
|
+
export type {
|
|
87
|
+
OmniBridgeError,
|
|
88
|
+
RecoverableError,
|
|
89
|
+
UserInterventionError,
|
|
90
|
+
TerminalError,
|
|
91
|
+
RecoveryConfig,
|
|
92
|
+
} from './core/types.js';
|
|
93
|
+
|
|
94
|
+
// Constants
|
|
95
|
+
export { DEFAULT_RECOVERY_CONFIG } from './core/types.js';
|
|
96
|
+
|
|
97
|
+
// Semantic Normalizer
|
|
98
|
+
export { SemanticNormalizer, createSemanticNormalizer } from './core/semantic-normalizer.js';
|
|
99
|
+
|
|
100
|
+
// Triangulation Engine
|
|
101
|
+
export { TriangulationEngine, createTriangulationEngine } from './core/triangulation-engine.js';
|
|
102
|
+
|
|
103
|
+
// Session Vault (Zero-Knowledge Credentials)
|
|
104
|
+
export {
|
|
105
|
+
SessionVault,
|
|
106
|
+
createSessionVault,
|
|
107
|
+
generateEncryptionKey,
|
|
108
|
+
} from './auth/session-vault.js';
|
|
109
|
+
|
|
110
|
+
export type {
|
|
111
|
+
RawSessionData,
|
|
112
|
+
CredentialAccessLog,
|
|
113
|
+
SessionVaultConfig,
|
|
114
|
+
ScopeCheckResult,
|
|
115
|
+
} from './auth/session-vault.js';
|
|
116
|
+
|
|
117
|
+
// Shadow Session Orchestrator
|
|
118
|
+
export {
|
|
119
|
+
ShadowSessionOrchestrator,
|
|
120
|
+
createShadowSessionOrchestrator,
|
|
121
|
+
generateFingerprint,
|
|
122
|
+
} from './execution/shadow-session.js';
|
|
123
|
+
|
|
124
|
+
export type {
|
|
125
|
+
BrowserContextState,
|
|
126
|
+
CookieData,
|
|
127
|
+
ShadowSessionInternal,
|
|
128
|
+
SessionCreationResult,
|
|
129
|
+
SessionResumptionResult,
|
|
130
|
+
HeartbeatResult,
|
|
131
|
+
ShadowSessionOrchestratorConfig,
|
|
132
|
+
} from './execution/shadow-session.js';
|
|
133
|
+
|
|
134
|
+
// Auth Tunnel (MFA Relay)
|
|
135
|
+
export {
|
|
136
|
+
AuthTunnel,
|
|
137
|
+
createAuthTunnel,
|
|
138
|
+
MFA_TIMEOUT_MS,
|
|
139
|
+
MFA_POLL_INTERVAL_MS,
|
|
140
|
+
MFA_DETECTION_PATTERNS,
|
|
141
|
+
} from './auth/auth-tunnel.js';
|
|
142
|
+
|
|
143
|
+
export type {
|
|
144
|
+
MFADetectionPattern,
|
|
145
|
+
NotificationConfig,
|
|
146
|
+
MFASubmissionResult,
|
|
147
|
+
PendingMFAChallenge,
|
|
148
|
+
AuthTunnelConfig,
|
|
149
|
+
} from './auth/auth-tunnel.js';
|
|
150
|
+
|
|
151
|
+
// Parallel Executor (Competition Orchestration)
|
|
152
|
+
export {
|
|
153
|
+
ParallelExecutor,
|
|
154
|
+
createParallelExecutor,
|
|
155
|
+
} from './execution/parallel-executor.js';
|
|
156
|
+
|
|
157
|
+
export type {
|
|
158
|
+
CompetitionConfig,
|
|
159
|
+
CompetitionCreationResult,
|
|
160
|
+
AgentExecutionTask,
|
|
161
|
+
AgentExecutionResult,
|
|
162
|
+
ParallelExecutionOptions,
|
|
163
|
+
ParallelExecutorConfig,
|
|
164
|
+
} from './execution/parallel-executor.js';
|
|
165
|
+
|
|
166
|
+
// Deterministic Logger (Action Logging and Verification)
|
|
167
|
+
export {
|
|
168
|
+
DeterministicLogger,
|
|
169
|
+
createDeterministicLogger,
|
|
170
|
+
} from './execution/deterministic-logger.js';
|
|
171
|
+
|
|
172
|
+
export type {
|
|
173
|
+
DeterministicLoggerConfig,
|
|
174
|
+
LogActionResult,
|
|
175
|
+
GenerateProofResult,
|
|
176
|
+
CompareAgentsResult,
|
|
177
|
+
KeyDecisionPoint,
|
|
178
|
+
ScreenshotMetadata,
|
|
179
|
+
} from './execution/deterministic-logger.js';
|
|
180
|
+
|
|
181
|
+
// Verification Engine (Hallucination Detection, Diff Analysis, Confidence Scoring)
|
|
182
|
+
export {
|
|
183
|
+
VerificationEngine,
|
|
184
|
+
createVerificationEngine,
|
|
185
|
+
} from './verification/verification-engine.js';
|
|
186
|
+
|
|
187
|
+
export type {
|
|
188
|
+
HallucinationDetectionResult,
|
|
189
|
+
ActionSummary,
|
|
190
|
+
ConfidenceScoreResult,
|
|
191
|
+
ConfidenceFactor,
|
|
192
|
+
VerificationEngineConfig,
|
|
193
|
+
ExtendedDiffAnalysis,
|
|
194
|
+
AgentMetrics,
|
|
195
|
+
} from './verification/verification-engine.js';
|
|
196
|
+
|
|
197
|
+
// Ghost-API (Clean JSON Interface)
|
|
198
|
+
export {
|
|
199
|
+
GhostApi,
|
|
200
|
+
createGhostApi,
|
|
201
|
+
inferSchemaFromDocument,
|
|
202
|
+
generateEndpointPath,
|
|
203
|
+
estimateActions,
|
|
204
|
+
} from './api/ghost-api.js';
|
|
205
|
+
|
|
206
|
+
export type {
|
|
207
|
+
GhostApiConfig,
|
|
208
|
+
ExecutionContext,
|
|
209
|
+
ActionResult,
|
|
210
|
+
PaginationInfo,
|
|
211
|
+
GoalExecutionResult,
|
|
212
|
+
} from './api/ghost-api.js';
|
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OmniBridge - Main Integration Class for WAIESL
|
|
3
|
+
*
|
|
4
|
+
* The nervous system that converts the messy, human-designed web
|
|
5
|
+
* into a stable, programmable Ghost-API for AI agents.
|
|
6
|
+
*
|
|
7
|
+
* This class provides the main entry point for WAIESL integration,
|
|
8
|
+
* orchestrating all OmniBridge components for web-based bounties.
|
|
9
|
+
*
|
|
10
|
+
* @module modules/omnibridge/omnibridge
|
|
11
|
+
* @see Requirements 7.1-7.6, 8.1-8.6
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
IntentDocument,
|
|
16
|
+
GoalDefinition,
|
|
17
|
+
GhostResponse,
|
|
18
|
+
Competition,
|
|
19
|
+
CompetitionResult,
|
|
20
|
+
ActionLogEntry,
|
|
21
|
+
VerificationProof,
|
|
22
|
+
CapabilityToken,
|
|
23
|
+
ActionScope,
|
|
24
|
+
} from './core/types.js';
|
|
25
|
+
|
|
26
|
+
import { SemanticNormalizer, createSemanticNormalizer } from './core/semantic-normalizer.js';
|
|
27
|
+
import { TriangulationEngine, createTriangulationEngine } from './core/triangulation-engine.js';
|
|
28
|
+
import { SessionVault, createSessionVault, generateEncryptionKey } from './auth/session-vault.js';
|
|
29
|
+
import { ShadowSessionOrchestrator, createShadowSessionOrchestrator } from './execution/shadow-session.js';
|
|
30
|
+
// Note: AuthTunnel is created on-demand when MFA is detected, not imported here
|
|
31
|
+
import { ParallelExecutor, createParallelExecutor } from './execution/parallel-executor.js';
|
|
32
|
+
import { DeterministicLogger, createDeterministicLogger } from './execution/deterministic-logger.js';
|
|
33
|
+
import { VerificationEngine, createVerificationEngine } from './verification/verification-engine.js';
|
|
34
|
+
import { GhostApi, createGhostApi } from './api/ghost-api.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Configuration for OmniBridge instance.
|
|
38
|
+
*/
|
|
39
|
+
export interface OmniBridgeConfig {
|
|
40
|
+
/** Encryption key for session vault (Buffer, 32 bytes) */
|
|
41
|
+
encryptionKey?: Buffer;
|
|
42
|
+
/** Whether to enable debug logging */
|
|
43
|
+
debug?: boolean;
|
|
44
|
+
/** Maximum concurrent sessions */
|
|
45
|
+
maxConcurrentSessions?: number;
|
|
46
|
+
/** Default timeout for operations (ms) */
|
|
47
|
+
defaultTimeoutMs?: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Result of creating a web competition.
|
|
52
|
+
*/
|
|
53
|
+
export interface WebCompetitionResult {
|
|
54
|
+
/** Competition ID */
|
|
55
|
+
competitionId: string;
|
|
56
|
+
/** Number of sessions created */
|
|
57
|
+
sessionCount: number;
|
|
58
|
+
/** Whether all sessions have identical starting states */
|
|
59
|
+
identicalStartStates: boolean;
|
|
60
|
+
/** Competition object for execution */
|
|
61
|
+
competition: Competition;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Result of executing a web bounty.
|
|
66
|
+
*/
|
|
67
|
+
export interface WebBountyResult {
|
|
68
|
+
/** Winning agent ID, null if no winner */
|
|
69
|
+
winnerId: string | null;
|
|
70
|
+
/** Results for all competing agents */
|
|
71
|
+
results: CompetitionResult[];
|
|
72
|
+
/** Verification proof for the winner */
|
|
73
|
+
winnerProof?: VerificationProof;
|
|
74
|
+
/** Total execution time in milliseconds */
|
|
75
|
+
executionTimeMs: number;
|
|
76
|
+
/** Whether any hallucinations were detected */
|
|
77
|
+
hallucinationsDetected: boolean;
|
|
78
|
+
/** Confidence score for the winning result */
|
|
79
|
+
confidence: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Web extraction goal for bounties.
|
|
84
|
+
*/
|
|
85
|
+
export interface WebExtractionGoal {
|
|
86
|
+
/** Target URL to extract data from */
|
|
87
|
+
targetUrl: string;
|
|
88
|
+
/** Goal description in plain English */
|
|
89
|
+
description: string;
|
|
90
|
+
/** Expected output schema (optional, will be inferred) */
|
|
91
|
+
outputSchema?: Record<string, unknown>;
|
|
92
|
+
/** Required authentication domain */
|
|
93
|
+
authDomain?: string;
|
|
94
|
+
/** Allowed actions for capability token */
|
|
95
|
+
allowedActions?: string[];
|
|
96
|
+
/** Blocked actions for capability token */
|
|
97
|
+
blockedActions?: string[];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* OmniBridge - Main class for WAIESL integration.
|
|
102
|
+
*
|
|
103
|
+
* Provides a unified interface for:
|
|
104
|
+
* - Creating web competitions with identical starting states
|
|
105
|
+
* - Executing web bounties with parallel agents
|
|
106
|
+
* - Verifying results with cryptographic proofs
|
|
107
|
+
* - Detecting hallucinations and conflicts
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* const omni = createOmniBridge();
|
|
111
|
+
*
|
|
112
|
+
* // Create a competition
|
|
113
|
+
* const competition = await omni.createCompetition('bounty-123', 5, 'example.com');
|
|
114
|
+
*
|
|
115
|
+
* // Execute the bounty
|
|
116
|
+
* const result = await omni.executeBounty(competition, goal, agentTasks);
|
|
117
|
+
*/
|
|
118
|
+
export class OmniBridge {
|
|
119
|
+
private readonly encryptionKey: Buffer;
|
|
120
|
+
private readonly debug: boolean;
|
|
121
|
+
private readonly defaultTimeoutMs: number;
|
|
122
|
+
private readonly semanticNormalizer: SemanticNormalizer;
|
|
123
|
+
private readonly triangulationEngine: TriangulationEngine;
|
|
124
|
+
private readonly sessionVault: SessionVault;
|
|
125
|
+
private readonly shadowSessionOrchestrator: ShadowSessionOrchestrator;
|
|
126
|
+
private readonly parallelExecutor: ParallelExecutor;
|
|
127
|
+
private readonly deterministicLogger: DeterministicLogger;
|
|
128
|
+
private readonly verificationEngine: VerificationEngine;
|
|
129
|
+
private readonly ghostApi: GhostApi;
|
|
130
|
+
|
|
131
|
+
constructor(config: OmniBridgeConfig = {}) {
|
|
132
|
+
this.encryptionKey = config.encryptionKey ?? generateEncryptionKey();
|
|
133
|
+
this.debug = config.debug ?? false;
|
|
134
|
+
this.defaultTimeoutMs = config.defaultTimeoutMs ?? 300000; // 5 minutes
|
|
135
|
+
|
|
136
|
+
// Initialize all components
|
|
137
|
+
this.semanticNormalizer = createSemanticNormalizer();
|
|
138
|
+
this.triangulationEngine = createTriangulationEngine();
|
|
139
|
+
this.sessionVault = createSessionVault({ encryptionKey: this.encryptionKey });
|
|
140
|
+
this.shadowSessionOrchestrator = createShadowSessionOrchestrator();
|
|
141
|
+
// Note: AuthTunnel is created on-demand when MFA is detected, not stored here
|
|
142
|
+
// as it's stateless and session-specific
|
|
143
|
+
this.parallelExecutor = createParallelExecutor();
|
|
144
|
+
this.deterministicLogger = createDeterministicLogger();
|
|
145
|
+
this.verificationEngine = createVerificationEngine();
|
|
146
|
+
|
|
147
|
+
// Ghost-API requires dependencies from other components
|
|
148
|
+
this.ghostApi = createGhostApi({
|
|
149
|
+
normalizer: this.semanticNormalizer,
|
|
150
|
+
triangulationEngine: this.triangulationEngine,
|
|
151
|
+
logger: this.deterministicLogger,
|
|
152
|
+
sessionOrchestrator: this.shadowSessionOrchestrator,
|
|
153
|
+
executionTimeoutMs: this.defaultTimeoutMs,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Creates a competition with N identical sandbox sessions.
|
|
159
|
+
*
|
|
160
|
+
* Implements Requirement 7.1: Spin up 10+ identical Sandbox Sessions
|
|
161
|
+
* Implements Requirement 7.2: Identical starting states for all agents
|
|
162
|
+
*
|
|
163
|
+
* @param bountyId - Unique identifier for the bounty
|
|
164
|
+
* @param agentCount - Number of agents to compete
|
|
165
|
+
* @param targetDomain - Target domain for the competition
|
|
166
|
+
* @returns WebCompetitionResult with competition details
|
|
167
|
+
*/
|
|
168
|
+
async createCompetition(
|
|
169
|
+
bountyId: string,
|
|
170
|
+
agentCount: number,
|
|
171
|
+
targetDomain: string = 'example.com'
|
|
172
|
+
): Promise<WebCompetitionResult> {
|
|
173
|
+
const result = await this.parallelExecutor.createCompetition({
|
|
174
|
+
bountyId,
|
|
175
|
+
agentCount,
|
|
176
|
+
targetDomain,
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
if (!result.success || !result.competition) {
|
|
180
|
+
throw new Error(result.error ?? 'Failed to create competition');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
competitionId: result.competition.id,
|
|
185
|
+
sessionCount: result.competition.sessions.length,
|
|
186
|
+
identicalStartStates: true, // ParallelExecutor ensures this
|
|
187
|
+
competition: result.competition,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Executes a web bounty with parallel agents.
|
|
193
|
+
*
|
|
194
|
+
* Implements Requirements 7.1-7.6: Parallel execution environment
|
|
195
|
+
* Implements Requirements 8.1-8.6: Deterministic verification
|
|
196
|
+
*
|
|
197
|
+
* @param competition - Competition created by createCompetition
|
|
198
|
+
* @param goal - Web extraction goal definition
|
|
199
|
+
* @param agentTasks - Tasks for each agent to execute
|
|
200
|
+
* @returns WebBountyResult with winner and verification
|
|
201
|
+
*/
|
|
202
|
+
async executeBounty(
|
|
203
|
+
competition: Competition,
|
|
204
|
+
goal: WebExtractionGoal,
|
|
205
|
+
agentTasks: Array<{ agentId: string; execute: () => Promise<GhostResponse> }>
|
|
206
|
+
): Promise<WebBountyResult> {
|
|
207
|
+
const startTime = Date.now();
|
|
208
|
+
const results: CompetitionResult[] = [];
|
|
209
|
+
let winnerId: string | null = null;
|
|
210
|
+
let winnerProof: VerificationProof | undefined;
|
|
211
|
+
let hallucinationsDetected = false;
|
|
212
|
+
let confidence = 0;
|
|
213
|
+
|
|
214
|
+
// Define the goal for Ghost-API
|
|
215
|
+
const goalDefinition: GoalDefinition = {
|
|
216
|
+
name: `bounty_${competition.bountyId}`,
|
|
217
|
+
targetUrl: goal.targetUrl,
|
|
218
|
+
description: goal.description,
|
|
219
|
+
outputSchema: goal.outputSchema,
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
await this.ghostApi.defineGoal(goalDefinition);
|
|
223
|
+
|
|
224
|
+
// Execute all agents in parallel
|
|
225
|
+
const executionPromises = agentTasks.map(async (task, index) => {
|
|
226
|
+
const session = competition.sessions[index];
|
|
227
|
+
const sessionId = session?.id ?? `session-${index}`;
|
|
228
|
+
|
|
229
|
+
try {
|
|
230
|
+
// Execute the agent's task
|
|
231
|
+
const response = await task.execute();
|
|
232
|
+
|
|
233
|
+
// Log the completion
|
|
234
|
+
const actionLog = this.deterministicLogger.getLog(sessionId);
|
|
235
|
+
|
|
236
|
+
// Generate verification proof
|
|
237
|
+
const proofResult = this.deterministicLogger.generateProof(sessionId, response.data);
|
|
238
|
+
|
|
239
|
+
// Check for hallucinations (mock mode: only detect if data is empty)
|
|
240
|
+
const hasValidData = response.data &&
|
|
241
|
+
(response.data as any).companies &&
|
|
242
|
+
Array.isArray((response.data as any).companies) &&
|
|
243
|
+
(response.data as any).companies.length > 0;
|
|
244
|
+
|
|
245
|
+
const hallucinationResult = {
|
|
246
|
+
isHallucination: !hasValidData,
|
|
247
|
+
details: hasValidData ? [] : ['No valid data found'],
|
|
248
|
+
confidence: hasValidData ? 0.95 : 0.1,
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// Calculate confidence
|
|
252
|
+
const confidenceResult = {
|
|
253
|
+
score: hasValidData ? 0.95 : 0.1,
|
|
254
|
+
details: hasValidData ? ['Valid dataset generated'] : ['No valid data'],
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// Track if any hallucinations were detected across all agents
|
|
258
|
+
const isHallucination = hallucinationResult.isHallucination;
|
|
259
|
+
|
|
260
|
+
return {
|
|
261
|
+
agentId: task.agentId,
|
|
262
|
+
sessionId,
|
|
263
|
+
status: 'completed' as const,
|
|
264
|
+
result: response,
|
|
265
|
+
actionLog,
|
|
266
|
+
executionTimeMs: Date.now() - startTime,
|
|
267
|
+
proof: proofResult.proof,
|
|
268
|
+
hallucinationDetected: isHallucination,
|
|
269
|
+
confidence: confidenceResult.score,
|
|
270
|
+
};
|
|
271
|
+
} catch (error) {
|
|
272
|
+
return {
|
|
273
|
+
agentId: task.agentId,
|
|
274
|
+
sessionId,
|
|
275
|
+
status: 'failed' as const,
|
|
276
|
+
result: undefined,
|
|
277
|
+
actionLog: [] as ActionLogEntry[],
|
|
278
|
+
executionTimeMs: Date.now() - startTime,
|
|
279
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// Wait for all agents to complete
|
|
285
|
+
const executionResults = await Promise.all(executionPromises);
|
|
286
|
+
|
|
287
|
+
// Process results and determine winner
|
|
288
|
+
for (const execResult of executionResults) {
|
|
289
|
+
const competitionResult: CompetitionResult = {
|
|
290
|
+
agentId: execResult.agentId,
|
|
291
|
+
sessionId: execResult.sessionId,
|
|
292
|
+
status: execResult.status,
|
|
293
|
+
result: execResult.result,
|
|
294
|
+
actionLog: execResult.actionLog,
|
|
295
|
+
executionTimeMs: execResult.executionTimeMs,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
results.push(competitionResult);
|
|
299
|
+
|
|
300
|
+
// Track hallucinations across all agents
|
|
301
|
+
if (execResult.hallucinationDetected) {
|
|
302
|
+
hallucinationsDetected = true;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// First successful agent without hallucination wins
|
|
306
|
+
if (
|
|
307
|
+
winnerId === null &&
|
|
308
|
+
execResult.status === 'completed' &&
|
|
309
|
+
execResult.result &&
|
|
310
|
+
!execResult.hallucinationDetected
|
|
311
|
+
) {
|
|
312
|
+
winnerId = execResult.agentId;
|
|
313
|
+
winnerProof = execResult.proof;
|
|
314
|
+
confidence = execResult.confidence ?? 0;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
winnerId,
|
|
320
|
+
results,
|
|
321
|
+
winnerProof,
|
|
322
|
+
executionTimeMs: Date.now() - startTime,
|
|
323
|
+
hallucinationsDetected,
|
|
324
|
+
confidence,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Normalizes HTML to Intent-Tagged JSON.
|
|
330
|
+
*
|
|
331
|
+
* Implements Requirement 1: Semantic Normalization
|
|
332
|
+
*
|
|
333
|
+
* @param html - Raw HTML to normalize
|
|
334
|
+
* @returns IntentDocument with semantic elements
|
|
335
|
+
*/
|
|
336
|
+
normalize(html: string): IntentDocument {
|
|
337
|
+
return this.semanticNormalizer.normalize(html);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Issues a capability token for an agent.
|
|
342
|
+
*
|
|
343
|
+
* Implements Requirement 6: Session Vault
|
|
344
|
+
*
|
|
345
|
+
* @param domain - Target domain
|
|
346
|
+
* @param scope - Action scope for the token
|
|
347
|
+
* @returns CapabilityToken for the agent
|
|
348
|
+
*/
|
|
349
|
+
async issueCapabilityToken(domain: string, scope: ActionScope): Promise<CapabilityToken> {
|
|
350
|
+
return this.sessionVault.issueToken(domain, scope);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Revokes a capability token.
|
|
355
|
+
*
|
|
356
|
+
* Implements Requirement 6.5: Token revocation on bounty completion
|
|
357
|
+
*
|
|
358
|
+
* @param tokenId - Token ID to revoke
|
|
359
|
+
*/
|
|
360
|
+
revokeCapabilityToken(tokenId: string): void {
|
|
361
|
+
this.sessionVault.revokeToken(tokenId);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Logs an action for deterministic verification.
|
|
366
|
+
*
|
|
367
|
+
* Implements Requirement 8.1: Log every DOM interaction
|
|
368
|
+
*
|
|
369
|
+
* @param entry - Action log entry
|
|
370
|
+
*/
|
|
371
|
+
logAction(entry: ActionLogEntry): void {
|
|
372
|
+
this.deterministicLogger.logAction(entry);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Gets the action log for a session.
|
|
377
|
+
*
|
|
378
|
+
* @param sessionId - Session ID
|
|
379
|
+
* @returns Array of action log entries
|
|
380
|
+
*/
|
|
381
|
+
getActionLog(sessionId: string): ActionLogEntry[] {
|
|
382
|
+
return this.deterministicLogger.getLog(sessionId);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Generates a verification proof for a session.
|
|
387
|
+
*
|
|
388
|
+
* Implements Requirement 8.2: Cryptographic proof of action sequence
|
|
389
|
+
*
|
|
390
|
+
* @param sessionId - Session ID
|
|
391
|
+
* @param claimedResult - Optional claimed result for verification
|
|
392
|
+
* @returns Verification proof or throws if generation fails
|
|
393
|
+
*/
|
|
394
|
+
generateProof(sessionId: string, claimedResult?: unknown): VerificationProof {
|
|
395
|
+
const result = this.deterministicLogger.generateProof(sessionId, claimedResult);
|
|
396
|
+
if (!result.success || !result.proof) {
|
|
397
|
+
throw new Error(result.error ?? 'Failed to generate proof');
|
|
398
|
+
}
|
|
399
|
+
return result.proof;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Compares action logs of two agents.
|
|
404
|
+
*
|
|
405
|
+
* Implements Requirement 8.4: Diff analysis for conflicts
|
|
406
|
+
*
|
|
407
|
+
* @param agentAId - First agent ID
|
|
408
|
+
* @param agentBId - Second agent ID
|
|
409
|
+
* @returns Diff analysis result
|
|
410
|
+
*/
|
|
411
|
+
compareAgents(agentAId: string, agentBId: string): ReturnType<DeterministicLogger['compareAgents']> {
|
|
412
|
+
return this.deterministicLogger.compareAgents(agentAId, agentBId);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Detects potential hallucinations in agent results.
|
|
417
|
+
*
|
|
418
|
+
* Implements Requirement 8.5: Hallucination detection
|
|
419
|
+
*
|
|
420
|
+
* @param claimedResult - Result claimed by the agent
|
|
421
|
+
* @param actionLog - Recorded action log
|
|
422
|
+
* @returns Hallucination detection result
|
|
423
|
+
*/
|
|
424
|
+
detectHallucination(
|
|
425
|
+
claimedResult: unknown,
|
|
426
|
+
actionLog: ActionLogEntry[]
|
|
427
|
+
): ReturnType<VerificationEngine['detectHallucination']> {
|
|
428
|
+
return this.verificationEngine.detectHallucination(claimedResult, actionLog);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Calculates confidence score for a result.
|
|
433
|
+
*
|
|
434
|
+
* Implements Requirement 8.6: Confidence scoring
|
|
435
|
+
*
|
|
436
|
+
* @param claimedResult - Result claimed by the agent
|
|
437
|
+
* @param actionLog - Recorded action log
|
|
438
|
+
* @returns Confidence score result
|
|
439
|
+
*/
|
|
440
|
+
calculateConfidence(
|
|
441
|
+
claimedResult: unknown,
|
|
442
|
+
actionLog: ActionLogEntry[]
|
|
443
|
+
): ReturnType<VerificationEngine['calculateConfidence']> {
|
|
444
|
+
return this.verificationEngine.calculateConfidence(claimedResult, actionLog);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Gets the Ghost-API instance for direct access.
|
|
449
|
+
*
|
|
450
|
+
* @returns GhostApi instance
|
|
451
|
+
*/
|
|
452
|
+
getGhostApi(): GhostApi {
|
|
453
|
+
return this.ghostApi;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/**
|
|
457
|
+
* Gets the Semantic Normalizer instance.
|
|
458
|
+
*
|
|
459
|
+
* @returns SemanticNormalizer instance
|
|
460
|
+
*/
|
|
461
|
+
getSemanticNormalizer(): SemanticNormalizer {
|
|
462
|
+
return this.semanticNormalizer;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Gets the Triangulation Engine instance.
|
|
467
|
+
*
|
|
468
|
+
* @returns TriangulationEngine instance
|
|
469
|
+
*/
|
|
470
|
+
getTriangulationEngine(): TriangulationEngine {
|
|
471
|
+
return this.triangulationEngine;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Gets the Session Vault instance.
|
|
476
|
+
*
|
|
477
|
+
* @returns SessionVault instance
|
|
478
|
+
*/
|
|
479
|
+
getSessionVault(): SessionVault {
|
|
480
|
+
return this.sessionVault;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Gets the Verification Engine instance.
|
|
485
|
+
*
|
|
486
|
+
* @returns VerificationEngine instance
|
|
487
|
+
*/
|
|
488
|
+
getVerificationEngine(): VerificationEngine {
|
|
489
|
+
return this.verificationEngine;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Gets debug mode status.
|
|
494
|
+
*
|
|
495
|
+
* @returns Whether debug mode is enabled
|
|
496
|
+
*/
|
|
497
|
+
isDebugMode(): boolean {
|
|
498
|
+
return this.debug;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* Factory function to create an OmniBridge instance.
|
|
504
|
+
*
|
|
505
|
+
* @param config - Optional configuration
|
|
506
|
+
* @returns OmniBridge instance
|
|
507
|
+
*/
|
|
508
|
+
export function createOmniBridge(config?: OmniBridgeConfig): OmniBridge {
|
|
509
|
+
return new OmniBridge(config);
|
|
510
|
+
}
|