@virtualkitchenco/multiverse-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/adapters/langchain.d.ts +65 -0
  2. package/dist/adapters/langchain.d.ts.map +1 -0
  3. package/dist/adapters/langchain.js +80 -0
  4. package/dist/adapters/langchain.js.map +1 -0
  5. package/dist/ci.d.ts +31 -0
  6. package/dist/ci.d.ts.map +1 -0
  7. package/dist/ci.js +105 -0
  8. package/dist/ci.js.map +1 -0
  9. package/dist/client.d.ts +136 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +92 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/github.d.ts +35 -0
  14. package/dist/github.d.ts.map +1 -0
  15. package/dist/github.js +113 -0
  16. package/dist/github.js.map +1 -0
  17. package/dist/index.d.ts +19 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +19 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/llm/anthropic.d.ts +18 -0
  22. package/dist/llm/anthropic.d.ts.map +1 -0
  23. package/dist/llm/anthropic.js +91 -0
  24. package/dist/llm/anthropic.js.map +1 -0
  25. package/dist/llm/google.d.ts +18 -0
  26. package/dist/llm/google.d.ts.map +1 -0
  27. package/dist/llm/google.js +97 -0
  28. package/dist/llm/google.js.map +1 -0
  29. package/dist/llm/index.d.ts +14 -0
  30. package/dist/llm/index.d.ts.map +1 -0
  31. package/dist/llm/index.js +29 -0
  32. package/dist/llm/index.js.map +1 -0
  33. package/dist/llm/openai.d.ts +18 -0
  34. package/dist/llm/openai.d.ts.map +1 -0
  35. package/dist/llm/openai.js +78 -0
  36. package/dist/llm/openai.js.map +1 -0
  37. package/dist/llm/provider.d.ts +42 -0
  38. package/dist/llm/provider.d.ts.map +1 -0
  39. package/dist/llm/provider.js +7 -0
  40. package/dist/llm/provider.js.map +1 -0
  41. package/dist/multiverse.d.ts +105 -0
  42. package/dist/multiverse.d.ts.map +1 -0
  43. package/dist/multiverse.js +449 -0
  44. package/dist/multiverse.js.map +1 -0
  45. package/dist/report.d.ts +30 -0
  46. package/dist/report.d.ts.map +1 -0
  47. package/dist/report.js +128 -0
  48. package/dist/report.js.map +1 -0
  49. package/dist/simulate.d.ts +49 -0
  50. package/dist/simulate.d.ts.map +1 -0
  51. package/dist/simulate.js +476 -0
  52. package/dist/simulate.js.map +1 -0
  53. package/package.json +68 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * LangChain Adapter
3
+ *
4
+ * Provides wrap() integration for LangChain Runnables.
5
+ */
6
+ import type { EffectsFn, Invariant, ZodLikeSchema } from '@virtualkitchenco/multiverse-types';
7
+ /**
8
+ * Registry of tool configurations for simulation
9
+ * Maps tool name -> config with output schema, effects, invariants
10
+ */
11
+ export declare const toolConfigRegistry: Map<string, {
12
+ outputSchema?: ZodLikeSchema;
13
+ effects?: EffectsFn<unknown>;
14
+ invariants?: Invariant[];
15
+ }>;
16
+ /**
17
+ * Configuration for wrapping a Runnable.
18
+ * TOutput is inferred from the Runnable being wrapped.
19
+ */
20
+ export interface WrapConfig<TOutput = unknown> {
21
+ /** Name for the runnable (used in traces and simulation) */
22
+ name: string;
23
+ /** Description of what this runnable does */
24
+ description: string;
25
+ /** Zod-like schema for the output (helps simulation generate valid responses) */
26
+ outputSchema?: ZodLikeSchema;
27
+ /** Function to derive world state mutations from output */
28
+ effects?: EffectsFn<TOutput>;
29
+ /** Invariants to check after mutations */
30
+ invariants?: Invariant[];
31
+ }
32
+ /**
33
+ * Wrap any LangChain Runnable (tool, retriever, chain, etc.) for Multiverse simulation.
34
+ *
35
+ * During tests, calls are intercepted and simulated based on world state.
36
+ * In production, calls pass through to the real implementation.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { wrap } from 'multiverse';
41
+ *
42
+ * // Wrap a retriever
43
+ * const wrappedRetriever = wrap(vectorStore.asRetriever(), {
44
+ * name: 'documentRetriever',
45
+ * description: 'Retrieves relevant documents from the knowledge base',
46
+ * });
47
+ *
48
+ * // Wrap a tool with effects
49
+ * const wrappedSearch = wrap(searchFlights, {
50
+ * name: 'searchFlights',
51
+ * description: 'Search for available flights',
52
+ * outputSchema: SearchResultSchema,
53
+ * effects: (output) => output.flights.map(f => ({
54
+ * operation: 'create',
55
+ * collection: 'flights',
56
+ * id: f.id,
57
+ * data: f,
58
+ * })),
59
+ * });
60
+ * ```
61
+ */
62
+ export declare function wrap<R extends {
63
+ invoke(input: unknown, ...rest: unknown[]): Promise<unknown>;
64
+ }, TOutput = unknown>(runnable: R, config: WrapConfig<TOutput>): R;
65
+ //# sourceMappingURL=langchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/adapters/langchain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAG9F;;;GAGG;AACH,eAAO,MAAM,kBAAkB;mBACd,aAAa;cAClB,SAAS,CAAC,OAAO,CAAC;iBACf,SAAS,EAAE;EACtB,CAAC;AAEL;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,OAAO,GAAG,OAAO;IAC3C,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,IAAI,CAClB,CAAC,SAAS;IAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAC1E,OAAO,GAAG,OAAO,EAEjB,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAC1B,CAAC,CA4CH"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * LangChain Adapter
3
+ *
4
+ * Provides wrap() integration for LangChain Runnables.
5
+ */
6
+ import { tool, registeredTools } from '../multiverse.js';
7
+ /**
8
+ * Registry of tool configurations for simulation
9
+ * Maps tool name -> config with output schema, effects, invariants
10
+ */
11
+ export const toolConfigRegistry = new Map();
12
+ /**
13
+ * Wrap any LangChain Runnable (tool, retriever, chain, etc.) for Multiverse simulation.
14
+ *
15
+ * During tests, calls are intercepted and simulated based on world state.
16
+ * In production, calls pass through to the real implementation.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { wrap } from 'multiverse';
21
+ *
22
+ * // Wrap a retriever
23
+ * const wrappedRetriever = wrap(vectorStore.asRetriever(), {
24
+ * name: 'documentRetriever',
25
+ * description: 'Retrieves relevant documents from the knowledge base',
26
+ * });
27
+ *
28
+ * // Wrap a tool with effects
29
+ * const wrappedSearch = wrap(searchFlights, {
30
+ * name: 'searchFlights',
31
+ * description: 'Search for available flights',
32
+ * outputSchema: SearchResultSchema,
33
+ * effects: (output) => output.flights.map(f => ({
34
+ * operation: 'create',
35
+ * collection: 'flights',
36
+ * id: f.id,
37
+ * data: f,
38
+ * })),
39
+ * });
40
+ * ```
41
+ */
42
+ export function wrap(runnable, config) {
43
+ const { name, description, outputSchema, effects, invariants } = config;
44
+ // Store in registry for simulation to access
45
+ if (outputSchema || effects) {
46
+ toolConfigRegistry.set(name, {
47
+ outputSchema,
48
+ effects: effects,
49
+ invariants,
50
+ });
51
+ }
52
+ // Create the wrapped invoke function using the core tool() infrastructure
53
+ const wrappedInvoke = tool(async (input) => runnable.invoke(input), {
54
+ name,
55
+ description,
56
+ outputSchema,
57
+ effects: effects,
58
+ invariants,
59
+ });
60
+ // Register the tool so it appears in getTools() and scenario generation
61
+ registeredTools.set(name, {
62
+ name,
63
+ description,
64
+ fn: wrappedInvoke,
65
+ outputSchema,
66
+ effects: effects,
67
+ invariants,
68
+ });
69
+ // Create a proxy that intercepts invoke() but preserves everything else
70
+ return new Proxy(runnable, {
71
+ get(target, prop, receiver) {
72
+ if (prop === 'invoke') {
73
+ return wrappedInvoke;
74
+ }
75
+ // Preserve all other properties/methods
76
+ return Reflect.get(target, prop, receiver);
77
+ },
78
+ });
79
+ }
80
+ //# sourceMappingURL=langchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/adapters/langchain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAIrC,CAAC;AAmBL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,IAAI,CAIlB,QAAW,EACX,MAA2B;IAE3B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAExE,6CAA6C;IAC7C,IAAI,YAAY,IAAI,OAAO,EAAE,CAAC;QAC5B,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE;YAC3B,YAAY;YACZ,OAAO,EAAE,OAA6B;YACtC,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,MAAM,aAAa,GAAG,IAAI,CACxB,KAAK,EAAE,KAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD;QACE,IAAI;QACJ,WAAW;QACX,YAAY;QACZ,OAAO,EAAE,OAA6B;QACtC,UAAU;KACX,CACF,CAAC;IAEF,wEAAwE;IACxE,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;QACxB,IAAI;QACJ,WAAW;QACX,EAAE,EAAE,aAAqD;QACzD,YAAY;QACZ,OAAO,EAAE,OAA6B;QACtC,UAAU;KACX,CAAC,CAAC;IAEH,wEAAwE;IACxE,OAAO,IAAI,KAAK,CAAC,QAAkB,EAAE;QACnC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,wCAAwC;YACxC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAM,CAAC;AACV,CAAC"}
package/dist/ci.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CI Environment Detection
3
+ *
4
+ * Detects CI environment (CircleCI, GitHub Actions, etc.)
5
+ * and extracts PR/repo information.
6
+ */
7
+ export interface CIContext {
8
+ provider: 'circleci' | 'github-actions' | 'unknown';
9
+ isCI: boolean;
10
+ isPR: boolean;
11
+ prNumber: number | null;
12
+ repo: {
13
+ owner: string;
14
+ name: string;
15
+ } | null;
16
+ branch: string | null;
17
+ sha: string | null;
18
+ }
19
+ /**
20
+ * Detect CI environment and extract context
21
+ */
22
+ export declare function detectCI(): CIContext;
23
+ /**
24
+ * Check if GitHub token is available
25
+ */
26
+ export declare function hasGitHubToken(): boolean;
27
+ /**
28
+ * Get GitHub token
29
+ */
30
+ export declare function getGitHubToken(): string | null;
31
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CA2CpC;AAiDD;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAE9C"}
package/dist/ci.js ADDED
@@ -0,0 +1,105 @@
1
+ /**
2
+ * CI Environment Detection
3
+ *
4
+ * Detects CI environment (CircleCI, GitHub Actions, etc.)
5
+ * and extracts PR/repo information.
6
+ */
7
+ /**
8
+ * Detect CI environment and extract context
9
+ */
10
+ export function detectCI() {
11
+ // CircleCI
12
+ if (process.env.CIRCLECI === 'true') {
13
+ return {
14
+ provider: 'circleci',
15
+ isCI: true,
16
+ isPR: !!process.env.CIRCLE_PULL_REQUEST,
17
+ prNumber: extractCircleCIPRNumber(),
18
+ repo: extractCircleCIRepo(),
19
+ branch: process.env.CIRCLE_BRANCH || null,
20
+ sha: process.env.CIRCLE_SHA1 || null,
21
+ };
22
+ }
23
+ // GitHub Actions
24
+ if (process.env.GITHUB_ACTIONS === 'true') {
25
+ return {
26
+ provider: 'github-actions',
27
+ isCI: true,
28
+ isPR: process.env.GITHUB_EVENT_NAME === 'pull_request',
29
+ prNumber: extractGitHubActionsPRNumber(),
30
+ repo: extractGitHubActionsRepo(),
31
+ branch: process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME || null,
32
+ sha: process.env.GITHUB_SHA || null,
33
+ };
34
+ }
35
+ // Generic CI detection
36
+ const isCI = !!(process.env.CI ||
37
+ process.env.CONTINUOUS_INTEGRATION ||
38
+ process.env.BUILD_NUMBER);
39
+ return {
40
+ provider: 'unknown',
41
+ isCI,
42
+ isPR: false,
43
+ prNumber: null,
44
+ repo: null,
45
+ branch: null,
46
+ sha: null,
47
+ };
48
+ }
49
+ /**
50
+ * Extract PR number from CircleCI environment
51
+ */
52
+ function extractCircleCIPRNumber() {
53
+ const prUrl = process.env.CIRCLE_PULL_REQUEST;
54
+ if (!prUrl)
55
+ return null;
56
+ const match = prUrl.match(/\/pull\/(\d+)$/);
57
+ return match ? parseInt(match[1], 10) : null;
58
+ }
59
+ /**
60
+ * Extract repo info from CircleCI environment
61
+ */
62
+ function extractCircleCIRepo() {
63
+ const owner = process.env.CIRCLE_PROJECT_USERNAME;
64
+ const name = process.env.CIRCLE_PROJECT_REPONAME;
65
+ if (!owner || !name)
66
+ return null;
67
+ return { owner, name };
68
+ }
69
+ /**
70
+ * Extract PR number from GitHub Actions environment
71
+ */
72
+ function extractGitHubActionsPRNumber() {
73
+ // GITHUB_REF format for PRs: refs/pull/123/merge
74
+ const ref = process.env.GITHUB_REF;
75
+ if (!ref)
76
+ return null;
77
+ const match = ref.match(/^refs\/pull\/(\d+)\/merge$/);
78
+ return match ? parseInt(match[1], 10) : null;
79
+ }
80
+ /**
81
+ * Extract repo info from GitHub Actions environment
82
+ */
83
+ function extractGitHubActionsRepo() {
84
+ // GITHUB_REPOSITORY format: owner/repo
85
+ const repo = process.env.GITHUB_REPOSITORY;
86
+ if (!repo)
87
+ return null;
88
+ const [owner, name] = repo.split('/');
89
+ if (!owner || !name)
90
+ return null;
91
+ return { owner, name };
92
+ }
93
+ /**
94
+ * Check if GitHub token is available
95
+ */
96
+ export function hasGitHubToken() {
97
+ return !!process.env.GITHUB_TOKEN;
98
+ }
99
+ /**
100
+ * Get GitHub token
101
+ */
102
+ export function getGitHubToken() {
103
+ return process.env.GITHUB_TOKEN || null;
104
+ }
105
+ //# sourceMappingURL=ci.js.map
package/dist/ci.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Multiverse API Client
3
+ *
4
+ * Thin client that calls the Multiverse API for all simulation logic.
5
+ */
6
+ import type { Scenario, Trace, QualityResult } from '@virtualkitchenco/multiverse-types';
7
+ export interface APIClientConfig {
8
+ baseUrl: string;
9
+ apiKey?: string;
10
+ }
11
+ export interface CreateSessionRequest {
12
+ task: string;
13
+ tools: Array<{
14
+ name: string;
15
+ description: string;
16
+ }>;
17
+ scenarioConfig?: {
18
+ count?: number;
19
+ };
20
+ seed?: Record<string, Record<string, unknown>>;
21
+ llmConfig: {
22
+ provider: string;
23
+ model?: string;
24
+ };
25
+ }
26
+ export interface SimulateRequest {
27
+ tool: string;
28
+ input: unknown;
29
+ description: string;
30
+ outputSchema?: unknown;
31
+ /** If true, client will compute effects - server should not apply LLM mutations */
32
+ hasClientEffects?: boolean;
33
+ }
34
+ export interface SimulateResponse {
35
+ output: unknown;
36
+ mutations: Array<{
37
+ operation: string;
38
+ collection: string;
39
+ id: string;
40
+ data?: Record<string, unknown>;
41
+ }>;
42
+ worldState: Record<string, unknown>;
43
+ analysis?: {
44
+ action: string;
45
+ matches: string[];
46
+ gaps: string[];
47
+ reasoning: string;
48
+ };
49
+ }
50
+ /**
51
+ * Multiverse API Client
52
+ */
53
+ export declare class MultiverseClient {
54
+ private baseUrl;
55
+ private apiKey?;
56
+ constructor(config: APIClientConfig);
57
+ private request;
58
+ /**
59
+ * Create a new test session
60
+ */
61
+ createSession(request: CreateSessionRequest): Promise<{
62
+ sessionId: string;
63
+ scenarios: Scenario[];
64
+ }>;
65
+ /**
66
+ * Start a new run
67
+ */
68
+ createRun(sessionId: string, scenarioId: string, runIndex?: number): Promise<{
69
+ runId: string;
70
+ initialUserMessage: string;
71
+ worldState: Record<string, unknown>;
72
+ }>;
73
+ /**
74
+ * Simulate a tool call
75
+ */
76
+ simulate(sessionId: string, runId: string, request: SimulateRequest): Promise<SimulateResponse>;
77
+ /**
78
+ * Record a trace entry
79
+ */
80
+ recordTrace(sessionId: string, runId: string, type: 'user' | 'agent', message: string): Promise<void>;
81
+ /**
82
+ * Get user response (multi-turn)
83
+ */
84
+ getUserResponse(sessionId: string, runId: string, agentMessage: string): Promise<{
85
+ userMessage: string;
86
+ conversationComplete: boolean;
87
+ mood: number;
88
+ }>;
89
+ /**
90
+ * Get run state
91
+ */
92
+ getState(sessionId: string, runId: string): Promise<{
93
+ worldState: Record<string, unknown>;
94
+ trace: Trace;
95
+ }>;
96
+ /**
97
+ * Judge a run
98
+ */
99
+ judge(sessionId: string, runId: string, taskCompleted: boolean): Promise<QualityResult>;
100
+ /**
101
+ * Apply mutations to world state
102
+ */
103
+ applyMutations(sessionId: string, runId: string, mutations: Array<{
104
+ operation: 'create' | 'update' | 'delete';
105
+ collection: string;
106
+ id: string;
107
+ data?: Record<string, unknown>;
108
+ }>, tool?: string): Promise<void>;
109
+ /**
110
+ * Sync test results to server for dashboard
111
+ */
112
+ sync(results: {
113
+ id: string;
114
+ runs: Array<{
115
+ id: string;
116
+ runId: string;
117
+ testId: string;
118
+ scenario: Scenario;
119
+ trace: Trace;
120
+ taskCompleted: boolean;
121
+ quality: QualityResult;
122
+ passed: boolean;
123
+ duration: number;
124
+ }>;
125
+ passRate: number;
126
+ weakSpots: Array<{
127
+ scenario: string;
128
+ passRate: number;
129
+ }>;
130
+ duration: number;
131
+ }): Promise<{
132
+ success: boolean;
133
+ url: string;
134
+ }>;
135
+ }
136
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Multiverse API Client
3
+ *
4
+ * Thin client that calls the Multiverse API for all simulation logic.
5
+ */
6
+ /**
7
+ * Multiverse API Client
8
+ */
9
+ export class MultiverseClient {
10
+ baseUrl;
11
+ apiKey;
12
+ constructor(config) {
13
+ this.baseUrl = config.baseUrl.replace(/\/$/, ''); // Remove trailing slash
14
+ this.apiKey = config.apiKey;
15
+ }
16
+ async request(method, path, body) {
17
+ const headers = {
18
+ 'Content-Type': 'application/json',
19
+ };
20
+ if (this.apiKey) {
21
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
22
+ }
23
+ const response = await fetch(`${this.baseUrl}${path}`, {
24
+ method,
25
+ headers,
26
+ body: body ? JSON.stringify(body) : undefined,
27
+ });
28
+ if (!response.ok) {
29
+ const error = await response.text();
30
+ throw new Error(`API error ${response.status}: ${error}`);
31
+ }
32
+ return response.json();
33
+ }
34
+ /**
35
+ * Create a new test session
36
+ */
37
+ async createSession(request) {
38
+ return this.request('POST', '/api/sessions', request);
39
+ }
40
+ /**
41
+ * Start a new run
42
+ */
43
+ async createRun(sessionId, scenarioId, runIndex = 0) {
44
+ return this.request('POST', `/api/sessions/${sessionId}/runs`, {
45
+ scenarioId,
46
+ runIndex,
47
+ });
48
+ }
49
+ /**
50
+ * Simulate a tool call
51
+ */
52
+ async simulate(sessionId, runId, request) {
53
+ return this.request('POST', `/api/sessions/${sessionId}/runs/${runId}/simulate`, request);
54
+ }
55
+ /**
56
+ * Record a trace entry
57
+ */
58
+ async recordTrace(sessionId, runId, type, message) {
59
+ await this.request('POST', `/api/sessions/${sessionId}/runs/${runId}/trace`, { type, message });
60
+ }
61
+ /**
62
+ * Get user response (multi-turn)
63
+ */
64
+ async getUserResponse(sessionId, runId, agentMessage) {
65
+ return this.request('POST', `/api/sessions/${sessionId}/runs/${runId}/user-respond`, { agentMessage });
66
+ }
67
+ /**
68
+ * Get run state
69
+ */
70
+ async getState(sessionId, runId) {
71
+ return this.request('GET', `/api/sessions/${sessionId}/runs/${runId}/state`);
72
+ }
73
+ /**
74
+ * Judge a run
75
+ */
76
+ async judge(sessionId, runId, taskCompleted) {
77
+ return this.request('POST', `/api/sessions/${sessionId}/runs/${runId}/judge`, { taskCompleted });
78
+ }
79
+ /**
80
+ * Apply mutations to world state
81
+ */
82
+ async applyMutations(sessionId, runId, mutations, tool) {
83
+ await this.request('POST', `/api/sessions/${sessionId}/runs/${runId}/mutations`, { mutations, tool });
84
+ }
85
+ /**
86
+ * Sync test results to server for dashboard
87
+ */
88
+ async sync(results) {
89
+ return this.request('POST', '/api/sync', results);
90
+ }
91
+ }
92
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * GitHub PR Integration
3
+ *
4
+ * Posts report cards to GitHub PRs via the GitHub API.
5
+ */
6
+ import type { CIContext } from './ci.js';
7
+ export interface GitHubOptions {
8
+ token: string;
9
+ owner: string;
10
+ repo: string;
11
+ prNumber: number;
12
+ }
13
+ /**
14
+ * Post or update a comment on a GitHub PR
15
+ *
16
+ * Uses a marker comment to find and update existing comments
17
+ * instead of creating duplicates on each run.
18
+ */
19
+ export declare function postToPR(markdown: string, options: GitHubOptions): Promise<{
20
+ commentId: number;
21
+ url: string;
22
+ }>;
23
+ /**
24
+ * Build GitHub options from CI context
25
+ */
26
+ export declare function buildGitHubOptions(ci: CIContext, token: string): GitHubOptions | null;
27
+ /**
28
+ * Post report to PR if running in CI with appropriate context
29
+ */
30
+ export declare function postReportToPR(markdown: string, ci: CIContext): Promise<{
31
+ posted: boolean;
32
+ url?: string;
33
+ error?: string;
34
+ }>;
35
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAuD7C;AAsCD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,GACZ,aAAa,GAAG,IAAI,CAWtB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB5D"}