@tangle-network/agent-runtime 0.94.13 → 0.96.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 (110) hide show
  1. package/README.md +64 -15
  2. package/dist/activation-B0ZD7nfX.d.ts +63 -0
  3. package/dist/agent.d.ts +6 -193
  4. package/dist/agent.js +10 -234
  5. package/dist/agent.js.map +1 -1
  6. package/dist/analyst-loop.d.ts +7 -10
  7. package/dist/analyst-loop.js +1 -2
  8. package/dist/candidate-execution/index.d.ts +43 -16
  9. package/dist/candidate-execution/index.js +17 -8
  10. package/dist/{chunk-VYA2YEKA.js → chunk-2KGAN2HM.js} +83 -14
  11. package/dist/chunk-2KGAN2HM.js.map +1 -0
  12. package/dist/chunk-3XKSBI2U.js +474 -0
  13. package/dist/chunk-3XKSBI2U.js.map +1 -0
  14. package/dist/{chunk-TVJQAYQM.js → chunk-6XKPVJAZ.js} +107 -716
  15. package/dist/chunk-6XKPVJAZ.js.map +1 -0
  16. package/dist/chunk-BLQIYRVR.js +699 -0
  17. package/dist/chunk-BLQIYRVR.js.map +1 -0
  18. package/dist/{chunk-QDSOD7RC.js → chunk-FD2MBMOH.js} +13 -101
  19. package/dist/chunk-FD2MBMOH.js.map +1 -0
  20. package/dist/{chunk-U33YZ7B2.js → chunk-FXF2OL34.js} +8 -8
  21. package/dist/{chunk-EP6RVHMX.js → chunk-HZDEXTSL.js} +848 -2
  22. package/dist/chunk-HZDEXTSL.js.map +1 -0
  23. package/dist/{chunk-WIPGQ4GT.js → chunk-IMSNJSXH.js} +1 -1
  24. package/dist/{chunk-WIPGQ4GT.js.map → chunk-IMSNJSXH.js.map} +1 -1
  25. package/dist/{chunk-VSWBYWFK.js → chunk-M6MD6JBS.js} +20 -27
  26. package/dist/chunk-M6MD6JBS.js.map +1 -0
  27. package/dist/chunk-PSOCBNM3.js +2069 -0
  28. package/dist/chunk-PSOCBNM3.js.map +1 -0
  29. package/dist/{chunk-AEG3NGJ2.js → chunk-Q2JSAVQ3.js} +34 -2
  30. package/dist/chunk-Q2JSAVQ3.js.map +1 -0
  31. package/dist/{chunk-XP5KDM3R.js → chunk-SGQ4YIQW.js} +4 -4
  32. package/dist/{chunk-C3UKLQ54.js → chunk-UQ6PNNXM.js} +18 -10
  33. package/dist/chunk-UQ6PNNXM.js.map +1 -0
  34. package/dist/{chunk-33OG2NN3.js → chunk-WYC2XJF2.js} +2 -2
  35. package/dist/{chunk-ZEYAT33L.js → chunk-Y3SRWZMP.js} +2 -2
  36. package/dist/{chunk-CNH7DF7Z.js → chunk-YOLKCWRV.js} +1116 -591
  37. package/dist/chunk-YOLKCWRV.js.map +1 -0
  38. package/dist/{completion-gate-D1gX1-hg.d.ts → completion-gate-C80jiRfN.d.ts} +1 -1
  39. package/dist/conversation.d.ts +12 -1
  40. package/dist/conversation.js +2 -3
  41. package/dist/{coordination-Dr_axlAf.d.ts → coordination-BFE3Den7.d.ts} +10 -11
  42. package/dist/environment-provider.d.ts +2 -2
  43. package/dist/environment-provider.js +1 -2
  44. package/dist/{agentic-generator-DDMM45kZ.d.ts → improve-g75IE2Cx.d.ts} +152 -4
  45. package/dist/{improvement-adapter-BieWeK5J.d.ts → improvement-adapter-HAZz-7vK.d.ts} +8 -31
  46. package/dist/index.d.ts +55 -28
  47. package/dist/index.js +206 -82
  48. package/dist/index.js.map +1 -1
  49. package/dist/intelligence.d.ts +185 -120
  50. package/dist/intelligence.js +509 -345
  51. package/dist/intelligence.js.map +1 -1
  52. package/dist/knowledge.d.ts +40 -12
  53. package/dist/knowledge.js +13 -7
  54. package/dist/{loop-runner-bin-BRQSQdHa.d.ts → loop-runner-bin-Cn1N2rRo.d.ts} +3 -3
  55. package/dist/loop-runner-bin.d.ts +6 -6
  56. package/dist/loop-runner-bin.js +8 -10
  57. package/dist/loops.d.ts +13 -13
  58. package/dist/loops.js +6 -8
  59. package/dist/mcp/bin.js +5 -7
  60. package/dist/mcp/bin.js.map +1 -1
  61. package/dist/mcp/index.d.ts +6 -6
  62. package/dist/mcp/index.js +12 -14
  63. package/dist/mcp/index.js.map +1 -1
  64. package/dist/platform.js +0 -2
  65. package/dist/platform.js.map +1 -1
  66. package/dist/primeintellect/index.js +1 -2
  67. package/dist/primeintellect/index.js.map +1 -1
  68. package/dist/profile-DbfaMTdk.d.ts +233 -0
  69. package/dist/profiles.d.ts +1 -1
  70. package/dist/profiles.js +0 -1
  71. package/dist/profiles.js.map +1 -1
  72. package/dist/{supervise-DmYOug5f.d.ts → supervise-BLPI50-w.d.ts} +3 -3
  73. package/dist/{types-ByAYqlVb.d.ts → types-B3vAW0Oq.d.ts} +1 -1
  74. package/dist/{prepare-CtdtsFNG.d.ts → types-CWqfCO8s.d.ts} +67 -298
  75. package/dist/{types-BC3bZpH0.d.ts → types-CmYCMbFT.d.ts} +12 -54
  76. package/dist/{types-1d5QGK3t.d.ts → types-CmnA2iL3.d.ts} +3 -3
  77. package/dist/{worktree-fanout-CPprU-qI.d.ts → worktree-fanout-DCA3G4bO.d.ts} +3 -3
  78. package/package.json +14 -16
  79. package/skills/build-with-agent-runtime/SKILL.md +122 -213
  80. package/dist/chunk-6O73TRHW.js +0 -142
  81. package/dist/chunk-6O73TRHW.js.map +0 -1
  82. package/dist/chunk-AEG3NGJ2.js.map +0 -1
  83. package/dist/chunk-C3UKLQ54.js.map +0 -1
  84. package/dist/chunk-CNH7DF7Z.js.map +0 -1
  85. package/dist/chunk-D3H7F6L2.js +0 -626
  86. package/dist/chunk-D3H7F6L2.js.map +0 -1
  87. package/dist/chunk-DGUM43GV.js +0 -11
  88. package/dist/chunk-DGUM43GV.js.map +0 -1
  89. package/dist/chunk-EP6RVHMX.js.map +0 -1
  90. package/dist/chunk-HGRW27YY.js +0 -214
  91. package/dist/chunk-HGRW27YY.js.map +0 -1
  92. package/dist/chunk-ISTDY47H.js +0 -849
  93. package/dist/chunk-ISTDY47H.js.map +0 -1
  94. package/dist/chunk-PCURO3DL.js +0 -661
  95. package/dist/chunk-PCURO3DL.js.map +0 -1
  96. package/dist/chunk-QDSOD7RC.js.map +0 -1
  97. package/dist/chunk-TVJQAYQM.js.map +0 -1
  98. package/dist/chunk-VSWBYWFK.js.map +0 -1
  99. package/dist/chunk-VYA2YEKA.js.map +0 -1
  100. package/dist/generator-YkAQrOoD.d.ts +0 -382
  101. package/dist/improve-BN3HyXIO.d.ts +0 -172
  102. package/dist/lifecycle.d.ts +0 -870
  103. package/dist/lifecycle.js +0 -981
  104. package/dist/lifecycle.js.map +0 -1
  105. package/dist/mcp-serve-verifier-DQQDbuyz.d.ts +0 -34
  106. package/skills/agent-runtime-adoption/SKILL.md +0 -246
  107. /package/dist/{chunk-U33YZ7B2.js.map → chunk-FXF2OL34.js.map} +0 -0
  108. /package/dist/{chunk-XP5KDM3R.js.map → chunk-SGQ4YIQW.js.map} +0 -0
  109. /package/dist/{chunk-33OG2NN3.js.map → chunk-WYC2XJF2.js.map} +0 -0
  110. /package/dist/{chunk-ZEYAT33L.js.map → chunk-Y3SRWZMP.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/auth.ts","../src/platform/integrations.ts"],"sourcesContent":["/**\n * Server-side client for the Tangle platform's cross-site SSO bridge.\n *\n * Consumer apps (gtm-agent, tax-agent, legal-agent, creative-agent, …)\n * use this to:\n * 1. Build an /authorize URL that lands the user on id.tangle.tools\n * and brings them back with a single-use code.\n * 2. Exchange that code for an API key + the user's identity.\n *\n * The platform endpoint contract is documented in\n * `products/platform/api/src/routes/cross-site.ts`. This client only\n * speaks HTTP — no SDK weight, no transitive deps.\n */\n\nexport interface PlatformAuthClientOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n baseUrl: string\n /** App id as registered in the platform's TRUSTED_APPS registry. */\n appId: string\n /** Override the global fetch (useful for tests + edge runtimes). */\n fetchImpl?: typeof fetch\n}\n\nexport interface AuthorizeUrlOptions {\n /** Required CSRF token; the consumer verifies it on the callback. */\n state: string\n /**\n * Final redirect URI. Must be one of the URIs registered for `appId`\n * on the platform. Omit to use the first registered URI.\n */\n redirectUri?: string\n /** Force the login screen even if a session is already active. */\n prompt?: 'login'\n /** Pre-fill the email field on the login screen. */\n email?: string\n}\n\nexport interface ExchangeCodeResult {\n apiKey: string\n user: {\n id: string\n email: string\n name?: string\n }\n plan: {\n tier: string\n }\n}\n\n/** Thrown when a `PlatformAuthClient` request returns a non-success status. */\nexport class PlatformAuthError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: unknown,\n ) {\n super(message)\n this.name = 'PlatformAuthError'\n }\n}\n\n/** HTTP client for the Tangle Platform SSO: builds authorize URLs and exchanges auth codes for API keys. */\nexport class PlatformAuthClient {\n private readonly baseUrl: string\n private readonly appId: string\n private readonly fetchImpl: typeof fetch\n\n constructor(options: PlatformAuthClientOptions) {\n if (!options.baseUrl) throw new Error('PlatformAuthClient: baseUrl is required')\n if (!options.appId) throw new Error('PlatformAuthClient: appId is required')\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.appId = options.appId\n this.fetchImpl =\n options.fetchImpl ??\n ((url: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => fetch(url, init))\n }\n\n /**\n * Build the URL the user is redirected to in order to start SSO.\n * The platform redirects back to one of `appId`'s registered\n * `redirectUris` with `?code=...&app=...&state=...`.\n */\n authorizeUrl(options: AuthorizeUrlOptions): string {\n if (!options.state) {\n throw new Error('PlatformAuthClient.authorizeUrl: state is required for CSRF')\n }\n const url = new URL('/cross-site/authorize', this.baseUrl)\n url.searchParams.set('app', this.appId)\n url.searchParams.set('state', options.state)\n if (options.redirectUri) url.searchParams.set('redirect', options.redirectUri)\n if (options.prompt) url.searchParams.set('prompt', options.prompt)\n if (options.email) url.searchParams.set('email', options.email)\n return url.toString()\n }\n\n /**\n * Exchange a single-use auth code (delivered to the consumer's\n * callback by the platform) for an API key + the user's identity.\n * Codes are single-use and expire ~5 minutes after issue.\n */\n async exchange(code: string): Promise<ExchangeCodeResult> {\n if (!code) throw new Error('PlatformAuthClient.exchange: code is required')\n const res = await this.fetchImpl(`${this.baseUrl}/cross-site/exchange`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ code, app: this.appId }),\n })\n const body = await res.json().catch(() => null)\n if (!res.ok) {\n const message =\n body && typeof body === 'object' && 'error' in body && typeof body.error === 'string'\n ? body.error\n : `Platform exchange failed (${res.status})`\n throw new PlatformAuthError(message, res.status, body)\n }\n const result = body as Partial<ExchangeCodeResult>\n if (!result.apiKey || !result.user?.id) {\n throw new PlatformAuthError(\n 'Platform exchange response is missing apiKey or user',\n res.status,\n body,\n )\n }\n return result as ExchangeCodeResult\n }\n}\n","/**\n * Server-side client for the Tangle platform's integration hub\n * (`/v1/hub/*`). Consumer apps use this instead of rolling their own\n * OAuth + connection tables.\n *\n * Auth: the caller supplies a bearer (either the user's API key from\n * cross-site exchange, or a platform service token) on construction.\n *\n * Endpoint contract (authoritative): the platform's `src/lib/hub-contract.ts`\n * + `src/routes/hub.ts`. The platform wraps every response in\n * `{ success, data }`; non-2xx or `success:false` surfaces as `PlatformHubError`\n * carrying the real upstream status.\n */\n\nexport interface PlatformHubClientOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n baseUrl: string\n /** Bearer credential — user API key or service token. */\n bearer: string\n /** Override fetch (tests + edge runtimes). */\n fetchImpl?: typeof fetch\n}\n\n/** A live integration connection, as returned by `/v1/hub/connections`. */\nexport interface PlatformConnection {\n id: string\n providerId: string\n displayName: string\n accountDisplay: string | null\n scopes: string[]\n status: 'active' | 'revoked' | 'unhealthy' | 'reconnect_required' | (string & {})\n health: 'unknown' | 'healthy' | 'unhealthy' | 'rate_limited' | (string & {})\n createdAt: string\n updatedAt: string\n lastUsedAt: string | null\n}\n\n/** A connectable provider in the catalog (`/v1/hub/providers`). */\nexport interface PlatformCatalogProvider {\n providerId: string\n title?: string\n authKind?: string\n category?: string\n scopes?: string[]\n capabilityCount?: number\n native?: boolean\n /** Whether the OAuth app's credentials are wired — the UI offers Connect\n * only when true. */\n configured?: boolean\n [k: string]: unknown\n}\n\nexport interface CatalogResult {\n providers: PlatformCatalogProvider[]\n /** Count of substrate-bundled connectors behind the catalog. */\n substrateBundled?: number\n [k: string]: unknown\n}\n\nexport interface StartAuthInput {\n /** The provider to connect (goes in the URL path). */\n providerId: string\n /** Accepted for interface compatibility; the platform's start endpoint is\n * provider-level and does not consume a connector id. */\n connectorId?: string\n /** Where the platform redirects the user back to after OAuth. */\n returnUrl: string\n /** Accepted for interface compatibility; not consumed by the start endpoint. */\n requestedScopes?: string[]\n /** CLI flow flag — affects the platform's post-auth redirect handling. */\n cli?: boolean\n}\n\nexport interface StartAuthResult {\n /** The URL to send the user to. Normalized across the platform's two start\n * branches: github returns `authorizationUrl`, substrate returns\n * `redirectUrl`. */\n authorizationUrl: string\n state: string\n expiresAt?: string\n scopes?: string[]\n}\n\nexport interface ConnectionHealth {\n status: 'unknown' | 'healthy' | 'unhealthy' | 'rate_limited' | (string & {})\n checkedAt: string\n error?: { code: string; message: string }\n}\n\nexport interface ConnectionHealthResult {\n connection: PlatformConnection\n health: ConnectionHealth\n}\n\n/** Last-known health for a connection, derived from the connection row. */\nexport interface HealthCheck {\n connectionId: string\n providerId: string\n /** Mirrors `PlatformConnection.health`. */\n status: ConnectionHealth['status']\n checkedAt?: string\n}\n\nexport interface MintTokenInput {\n /** The hub action the token authorizes (e.g. `slack.chat.postMessage`). */\n actionPath: string\n /** Bind to a specific connection, or … */\n connectionId?: string\n /** … resolve the connection by provider for the calling user. */\n provider?: string\n}\n\nexport interface MintTokenResult {\n tokenId: string\n token: string\n expiresAt: string\n}\n\nexport interface ExecInput {\n /** The hub action path to execute. */\n path: string\n input?: unknown\n connectionId?: string\n}\n\nexport interface PlatformHubStatus {\n contract?: unknown\n principal: { kind: string; userId: string; [k: string]: unknown }\n connections: { connectedProviderCount: number; unhealthyProviderCount: number }\n}\n\n/** Thrown when a `PlatformHubClient` request returns a non-success status. */\nexport class PlatformHubError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string | undefined,\n public readonly body: unknown,\n ) {\n super(message)\n this.name = 'PlatformHubError'\n }\n}\n\ninterface PlatformEnvelope<T> {\n success: boolean\n data?: T\n error?: { code?: string; message?: string } | string\n}\n\n/** HTTP client for the Tangle Platform Hub API: provider catalog, connection flow, and status. */\nexport class PlatformHubClient {\n private readonly baseUrl: string\n private readonly bearer: string\n private readonly fetchImpl: typeof fetch\n\n constructor(options: PlatformHubClientOptions) {\n if (!options.baseUrl) throw new Error('PlatformHubClient: baseUrl is required')\n if (!options.bearer) throw new Error('PlatformHubClient: bearer is required')\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.bearer = options.bearer\n this.fetchImpl =\n options.fetchImpl ??\n ((url: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => fetch(url, init))\n }\n\n /** GET /v1/hub/providers — the connectable provider catalog. */\n catalog(): Promise<CatalogResult> {\n return this.request('GET', '/v1/hub/providers')\n }\n\n /** GET /v1/hub/connections — the calling user's live connections. */\n async listConnections(): Promise<PlatformConnection[]> {\n const data = await this.request<{ connections: PlatformConnection[] }>(\n 'GET',\n '/v1/hub/connections',\n )\n return data.connections\n }\n\n /** DELETE /v1/hub/connections/:connectionId — revoke + disable a connection. */\n revokeConnection(connectionId: string): Promise<{ connection: PlatformConnection }> {\n return this.request('DELETE', `/v1/hub/connections/${encodeURIComponent(connectionId)}`)\n }\n\n /**\n * POST /v1/hub/connections/:provider/start — begin OAuth/grant. The provider\n * is taken from the URL; the body carries `returnUrl` (+ `cli`). The platform's\n * two start branches name the URL field differently (github → `authorizationUrl`,\n * substrate → `redirectUrl`); this normalizes to `authorizationUrl`.\n */\n async startAuth(input: StartAuthInput): Promise<StartAuthResult> {\n const body: { returnUrl: string; cli?: boolean } = { returnUrl: input.returnUrl }\n if (input.cli !== undefined) body.cli = input.cli\n const data = await this.request<{\n authorizationUrl?: string\n redirectUrl?: string\n state: string\n expiresAt?: string\n scopes?: string[]\n }>('POST', `/v1/hub/connections/${encodeURIComponent(input.providerId)}/start`, body)\n const authorizationUrl = data.authorizationUrl ?? data.redirectUrl\n if (!authorizationUrl) {\n throw new PlatformHubError(\n 'Platform hub start response missing an authorization URL',\n 502,\n 'HUB_INVALID_START_RESPONSE',\n data,\n )\n }\n return { authorizationUrl, state: data.state, expiresAt: data.expiresAt, scopes: data.scopes }\n }\n\n /**\n * Last-known health for every connection. The platform has no global\n * healthcheck listing — health rides on each connection row — so this derives\n * the list from `listConnections()` (one request, no extra round-trips).\n */\n async listHealthchecks(): Promise<HealthCheck[]> {\n const connections = await this.listConnections()\n return connections.map((c) => ({\n connectionId: c.id,\n providerId: c.providerId,\n status: c.health,\n checkedAt: c.updatedAt,\n }))\n }\n\n /**\n * POST /v1/hub/connections/:connectionId/health — trigger a fresh health\n * probe for one connection and return its updated state.\n */\n checkConnectionHealth(connectionId: string): Promise<ConnectionHealthResult> {\n return this.request('POST', `/v1/hub/connections/${encodeURIComponent(connectionId)}/health`)\n }\n\n /**\n * Trigger a fresh health probe across all of the user's connections. The\n * platform exposes health per-connection only, so this fans out over\n * `listConnections()`. `scheduled` is the number of probes dispatched.\n */\n async runHealthchecks(): Promise<{ scheduled: number }> {\n const connections = await this.listConnections()\n await Promise.allSettled(connections.map((c) => this.checkConnectionHealth(c.id)))\n return { scheduled: connections.length }\n }\n\n /** GET /v1/hub/status — principal + aggregate connection counts. */\n status(): Promise<PlatformHubStatus> {\n return this.request('GET', '/v1/hub/status')\n }\n\n /**\n * POST /v1/hub/tokens — mint a short-lived, action-scoped capability token a\n * sandbox can use to invoke one hub action on the user's behalf without\n * seeing the underlying provider credential.\n */\n mintToken(input: MintTokenInput): Promise<MintTokenResult> {\n return this.request('POST', '/v1/hub/tokens', input)\n }\n\n /** POST /v1/hub/exec — execute a hub action and return its result. */\n async exec(input: ExecInput): Promise<unknown> {\n const data = await this.request<{ result: unknown }>('POST', '/v1/hub/exec', input)\n return data.result\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE' | 'PUT',\n path: string,\n body?: unknown,\n ): Promise<T> {\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.bearer}`,\n accept: 'application/json',\n }\n if (body !== undefined) headers['content-type'] = 'application/json'\n\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n const text = await res.text()\n let parsed: PlatformEnvelope<T> | null = null\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n // fall through to error handling below\n }\n }\n if (!res.ok || (parsed && parsed.success === false)) {\n const code = parsed?.error && typeof parsed.error === 'object' ? parsed.error.code : undefined\n const message =\n (parsed?.error && typeof parsed.error === 'object' && parsed.error.message) ||\n (typeof parsed?.error === 'string' ? parsed.error : `Platform hub error (${res.status})`)\n throw new PlatformHubError(message, res.status, code, parsed ?? text)\n }\n if (!parsed) {\n throw new PlatformHubError(\n `Platform hub returned non-JSON success (${res.status})`,\n res.status,\n undefined,\n text,\n )\n }\n if (parsed.data === undefined) {\n throw new PlatformHubError(\n 'Platform hub envelope missing `data`',\n res.status,\n undefined,\n parsed,\n )\n }\n return parsed.data\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/platform/auth.ts","../src/platform/integrations.ts"],"sourcesContent":["/**\n * Server-side client for the Tangle platform's cross-site SSO bridge.\n *\n * Consumer apps (gtm-agent, tax-agent, legal-agent, creative-agent, …)\n * use this to:\n * 1. Build an /authorize URL that lands the user on id.tangle.tools\n * and brings them back with a single-use code.\n * 2. Exchange that code for an API key + the user's identity.\n *\n * The platform endpoint contract is documented in\n * `products/platform/api/src/routes/cross-site.ts`. This client only\n * speaks HTTP — no SDK weight, no transitive deps.\n */\n\nexport interface PlatformAuthClientOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n baseUrl: string\n /** App id as registered in the platform's TRUSTED_APPS registry. */\n appId: string\n /** Override the global fetch (useful for tests + edge runtimes). */\n fetchImpl?: typeof fetch\n}\n\nexport interface AuthorizeUrlOptions {\n /** Required CSRF token; the consumer verifies it on the callback. */\n state: string\n /**\n * Final redirect URI. Must be one of the URIs registered for `appId`\n * on the platform. Omit to use the first registered URI.\n */\n redirectUri?: string\n /** Force the login screen even if a session is already active. */\n prompt?: 'login'\n /** Pre-fill the email field on the login screen. */\n email?: string\n}\n\nexport interface ExchangeCodeResult {\n apiKey: string\n user: {\n id: string\n email: string\n name?: string\n }\n plan: {\n tier: string\n }\n}\n\n/** Thrown when a `PlatformAuthClient` request returns a non-success status. */\nexport class PlatformAuthError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: unknown,\n ) {\n super(message)\n this.name = 'PlatformAuthError'\n }\n}\n\n/** HTTP client for the Tangle Platform SSO: builds authorize URLs and exchanges auth codes for API keys. */\nexport class PlatformAuthClient {\n private readonly baseUrl: string\n private readonly appId: string\n private readonly fetchImpl: typeof fetch\n\n constructor(options: PlatformAuthClientOptions) {\n if (!options.baseUrl) throw new Error('PlatformAuthClient: baseUrl is required')\n if (!options.appId) throw new Error('PlatformAuthClient: appId is required')\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.appId = options.appId\n this.fetchImpl =\n options.fetchImpl ??\n ((url: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => fetch(url, init))\n }\n\n /**\n * Build the URL the user is redirected to in order to start SSO.\n * The platform redirects back to one of `appId`'s registered\n * `redirectUris` with `?code=...&app=...&state=...`.\n */\n authorizeUrl(options: AuthorizeUrlOptions): string {\n if (!options.state) {\n throw new Error('PlatformAuthClient.authorizeUrl: state is required for CSRF')\n }\n const url = new URL('/cross-site/authorize', this.baseUrl)\n url.searchParams.set('app', this.appId)\n url.searchParams.set('state', options.state)\n if (options.redirectUri) url.searchParams.set('redirect', options.redirectUri)\n if (options.prompt) url.searchParams.set('prompt', options.prompt)\n if (options.email) url.searchParams.set('email', options.email)\n return url.toString()\n }\n\n /**\n * Exchange a single-use auth code (delivered to the consumer's\n * callback by the platform) for an API key + the user's identity.\n * Codes are single-use and expire ~5 minutes after issue.\n */\n async exchange(code: string): Promise<ExchangeCodeResult> {\n if (!code) throw new Error('PlatformAuthClient.exchange: code is required')\n const res = await this.fetchImpl(`${this.baseUrl}/cross-site/exchange`, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ code, app: this.appId }),\n })\n const body = await res.json().catch(() => null)\n if (!res.ok) {\n const message =\n body && typeof body === 'object' && 'error' in body && typeof body.error === 'string'\n ? body.error\n : `Platform exchange failed (${res.status})`\n throw new PlatformAuthError(message, res.status, body)\n }\n const result = body as Partial<ExchangeCodeResult>\n if (!result.apiKey || !result.user?.id) {\n throw new PlatformAuthError(\n 'Platform exchange response is missing apiKey or user',\n res.status,\n body,\n )\n }\n return result as ExchangeCodeResult\n }\n}\n","/**\n * Server-side client for the Tangle platform's integration hub\n * (`/v1/hub/*`). Consumer apps use this instead of rolling their own\n * OAuth + connection tables.\n *\n * Auth: the caller supplies a bearer (either the user's API key from\n * cross-site exchange, or a platform service token) on construction.\n *\n * Endpoint contract (authoritative): the platform's `src/lib/hub-contract.ts`\n * + `src/routes/hub.ts`. The platform wraps every response in\n * `{ success, data }`; non-2xx or `success:false` surfaces as `PlatformHubError`\n * carrying the real upstream status.\n */\n\nexport interface PlatformHubClientOptions {\n /** Platform base URL, e.g. `https://id.tangle.tools`. */\n baseUrl: string\n /** Bearer credential — user API key or service token. */\n bearer: string\n /** Override fetch (tests + edge runtimes). */\n fetchImpl?: typeof fetch\n}\n\n/** A live integration connection, as returned by `/v1/hub/connections`. */\nexport interface PlatformConnection {\n id: string\n providerId: string\n displayName: string\n accountDisplay: string | null\n scopes: string[]\n status: 'active' | 'revoked' | 'unhealthy' | 'reconnect_required' | (string & {})\n health: 'unknown' | 'healthy' | 'unhealthy' | 'rate_limited' | (string & {})\n createdAt: string\n updatedAt: string\n lastUsedAt: string | null\n}\n\n/** A connectable provider in the catalog (`/v1/hub/providers`). */\nexport interface PlatformCatalogProvider {\n providerId: string\n title?: string\n authKind?: string\n category?: string\n scopes?: string[]\n capabilityCount?: number\n native?: boolean\n /** Whether the OAuth app's credentials are wired — the UI offers Connect\n * only when true. */\n configured?: boolean\n [k: string]: unknown\n}\n\nexport interface CatalogResult {\n providers: PlatformCatalogProvider[]\n /** Count of substrate-bundled connectors behind the catalog. */\n substrateBundled?: number\n [k: string]: unknown\n}\n\nexport interface StartAuthInput {\n /** The provider to connect (goes in the URL path). */\n providerId: string\n /** Accepted for interface compatibility; the platform's start endpoint is\n * provider-level and does not consume a connector id. */\n connectorId?: string\n /** Where the platform redirects the user back to after OAuth. */\n returnUrl: string\n /** Accepted for interface compatibility; not consumed by the start endpoint. */\n requestedScopes?: string[]\n /** CLI flow flag — affects the platform's post-auth redirect handling. */\n cli?: boolean\n}\n\nexport interface StartAuthResult {\n /** The URL to send the user to. Normalized across the platform's two start\n * branches: github returns `authorizationUrl`, substrate returns\n * `redirectUrl`. */\n authorizationUrl: string\n state: string\n expiresAt?: string\n scopes?: string[]\n}\n\nexport interface ConnectionHealth {\n status: 'unknown' | 'healthy' | 'unhealthy' | 'rate_limited' | (string & {})\n checkedAt: string\n error?: { code: string; message: string }\n}\n\nexport interface ConnectionHealthResult {\n connection: PlatformConnection\n health: ConnectionHealth\n}\n\n/** Last-known health for a connection, derived from the connection row. */\nexport interface HealthCheck {\n connectionId: string\n providerId: string\n /** Mirrors `PlatformConnection.health`. */\n status: ConnectionHealth['status']\n checkedAt?: string\n}\n\nexport interface MintTokenInput {\n /** The hub action the token authorizes (e.g. `slack.chat.postMessage`). */\n actionPath: string\n /** Bind to a specific connection, or … */\n connectionId?: string\n /** … resolve the connection by provider for the calling user. */\n provider?: string\n}\n\nexport interface MintTokenResult {\n tokenId: string\n token: string\n expiresAt: string\n}\n\nexport interface ExecInput {\n /** The hub action path to execute. */\n path: string\n input?: unknown\n connectionId?: string\n}\n\nexport interface PlatformHubStatus {\n contract?: unknown\n principal: { kind: string; userId: string; [k: string]: unknown }\n connections: { connectedProviderCount: number; unhealthyProviderCount: number }\n}\n\n/** Thrown when a `PlatformHubClient` request returns a non-success status. */\nexport class PlatformHubError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly code: string | undefined,\n public readonly body: unknown,\n ) {\n super(message)\n this.name = 'PlatformHubError'\n }\n}\n\ninterface PlatformEnvelope<T> {\n success: boolean\n data?: T\n error?: { code?: string; message?: string } | string\n}\n\n/** HTTP client for the Tangle Platform Hub API: provider catalog, connection flow, and status. */\nexport class PlatformHubClient {\n private readonly baseUrl: string\n private readonly bearer: string\n private readonly fetchImpl: typeof fetch\n\n constructor(options: PlatformHubClientOptions) {\n if (!options.baseUrl) throw new Error('PlatformHubClient: baseUrl is required')\n if (!options.bearer) throw new Error('PlatformHubClient: bearer is required')\n this.baseUrl = options.baseUrl.replace(/\\/+$/, '')\n this.bearer = options.bearer\n this.fetchImpl =\n options.fetchImpl ??\n ((url: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => fetch(url, init))\n }\n\n /** GET /v1/hub/providers — the connectable provider catalog. */\n catalog(): Promise<CatalogResult> {\n return this.request('GET', '/v1/hub/providers')\n }\n\n /** GET /v1/hub/connections — the calling user's live connections. */\n async listConnections(): Promise<PlatformConnection[]> {\n const data = await this.request<{ connections: PlatformConnection[] }>(\n 'GET',\n '/v1/hub/connections',\n )\n return data.connections\n }\n\n /** DELETE /v1/hub/connections/:connectionId — revoke + disable a connection. */\n revokeConnection(connectionId: string): Promise<{ connection: PlatformConnection }> {\n return this.request('DELETE', `/v1/hub/connections/${encodeURIComponent(connectionId)}`)\n }\n\n /**\n * POST /v1/hub/connections/:provider/start — begin OAuth/grant. The provider\n * is taken from the URL; the body carries `returnUrl` (+ `cli`). The platform's\n * two start branches name the URL field differently (github → `authorizationUrl`,\n * substrate → `redirectUrl`); this normalizes to `authorizationUrl`.\n */\n async startAuth(input: StartAuthInput): Promise<StartAuthResult> {\n const body: { returnUrl: string; cli?: boolean } = { returnUrl: input.returnUrl }\n if (input.cli !== undefined) body.cli = input.cli\n const data = await this.request<{\n authorizationUrl?: string\n redirectUrl?: string\n state: string\n expiresAt?: string\n scopes?: string[]\n }>('POST', `/v1/hub/connections/${encodeURIComponent(input.providerId)}/start`, body)\n const authorizationUrl = data.authorizationUrl ?? data.redirectUrl\n if (!authorizationUrl) {\n throw new PlatformHubError(\n 'Platform hub start response missing an authorization URL',\n 502,\n 'HUB_INVALID_START_RESPONSE',\n data,\n )\n }\n return { authorizationUrl, state: data.state, expiresAt: data.expiresAt, scopes: data.scopes }\n }\n\n /**\n * Last-known health for every connection. The platform has no global\n * healthcheck listing — health rides on each connection row — so this derives\n * the list from `listConnections()` (one request, no extra round-trips).\n */\n async listHealthchecks(): Promise<HealthCheck[]> {\n const connections = await this.listConnections()\n return connections.map((c) => ({\n connectionId: c.id,\n providerId: c.providerId,\n status: c.health,\n checkedAt: c.updatedAt,\n }))\n }\n\n /**\n * POST /v1/hub/connections/:connectionId/health — trigger a fresh health\n * probe for one connection and return its updated state.\n */\n checkConnectionHealth(connectionId: string): Promise<ConnectionHealthResult> {\n return this.request('POST', `/v1/hub/connections/${encodeURIComponent(connectionId)}/health`)\n }\n\n /**\n * Trigger a fresh health probe across all of the user's connections. The\n * platform exposes health per-connection only, so this fans out over\n * `listConnections()`. `scheduled` is the number of probes dispatched.\n */\n async runHealthchecks(): Promise<{ scheduled: number }> {\n const connections = await this.listConnections()\n await Promise.allSettled(connections.map((c) => this.checkConnectionHealth(c.id)))\n return { scheduled: connections.length }\n }\n\n /** GET /v1/hub/status — principal + aggregate connection counts. */\n status(): Promise<PlatformHubStatus> {\n return this.request('GET', '/v1/hub/status')\n }\n\n /**\n * POST /v1/hub/tokens — mint a short-lived, action-scoped capability token a\n * sandbox can use to invoke one hub action on the user's behalf without\n * seeing the underlying provider credential.\n */\n mintToken(input: MintTokenInput): Promise<MintTokenResult> {\n return this.request('POST', '/v1/hub/tokens', input)\n }\n\n /** POST /v1/hub/exec — execute a hub action and return its result. */\n async exec(input: ExecInput): Promise<unknown> {\n const data = await this.request<{ result: unknown }>('POST', '/v1/hub/exec', input)\n return data.result\n }\n\n private async request<T>(\n method: 'GET' | 'POST' | 'DELETE' | 'PUT',\n path: string,\n body?: unknown,\n ): Promise<T> {\n const headers: Record<string, string> = {\n authorization: `Bearer ${this.bearer}`,\n accept: 'application/json',\n }\n if (body !== undefined) headers['content-type'] = 'application/json'\n\n const res = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n const text = await res.text()\n let parsed: PlatformEnvelope<T> | null = null\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n // fall through to error handling below\n }\n }\n if (!res.ok || (parsed && parsed.success === false)) {\n const code = parsed?.error && typeof parsed.error === 'object' ? parsed.error.code : undefined\n const message =\n (parsed?.error && typeof parsed.error === 'object' && parsed.error.message) ||\n (typeof parsed?.error === 'string' ? parsed.error : `Platform hub error (${res.status})`)\n throw new PlatformHubError(message, res.status, code, parsed ?? text)\n }\n if (!parsed) {\n throw new PlatformHubError(\n `Platform hub returned non-JSON success (${res.status})`,\n res.status,\n undefined,\n text,\n )\n }\n if (parsed.data === undefined) {\n throw new PlatformHubError(\n 'Platform hub envelope missing `data`',\n res.status,\n undefined,\n parsed,\n )\n }\n return parsed.data\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,7 @@
1
1
  import {
2
2
  createOpenAICompatibleBackend
3
- } from "../chunk-AEG3NGJ2.js";
3
+ } from "../chunk-Q2JSAVQ3.js";
4
4
  import "../chunk-YEJR7IXO.js";
5
- import "../chunk-DGUM43GV.js";
6
5
 
7
6
  // src/primeintellect/package.ts
8
7
  import { createHash, randomUUID } from "crypto";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/primeintellect/package.ts","../../src/primeintellect/validation.ts","../../src/primeintellect/runner.ts","../../src/primeintellect/traces.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, join, normalize, relative, resolve, sep } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport type {\n PrimeIntellectJson,\n PrimeIntellectPackageBundle,\n PrimeIntellectPackageManifest,\n PrimeIntellectPackageOptions,\n PrimeIntellectScoring,\n PrimeIntellectTask,\n} from './types'\nimport { validatePrimeIntellectJson, validatePrimeIntellectPrompt } from './validation'\n\nconst VERIFIERS_RANGE = '>=0.2.0,<0.3.0' as const\nconst ENV_NAME = /^[A-Z_][A-Z0-9_]*$/\nconst PACKAGE_NAME = /^[a-z][a-z0-9-]{0,62}$/\nconst VERSION = /^\\d+\\.\\d+\\.\\d+(?:[-+][a-zA-Z0-9.-]+)?$/\nconst DEFAULT_MAX_TURNS = 16\nconst DEFAULT_ROLLOUT_TIMEOUT = 3_600\nconst DEFAULT_SCORING_TIMEOUT = 300\n\nexport interface WritePrimeIntellectPackageOptions {\n /** Replace an existing generated package and restore it if the final swap fails. */\n replace?: boolean\n}\n\n/** Build a complete PrimeIntellect Verifiers v1 package without writing to disk. */\nexport function createPrimeIntellectPackage(\n options: PrimeIntellectPackageOptions,\n): PrimeIntellectPackageBundle {\n const validated = validateOptions(options)\n const moduleName = validated.name.replaceAll('-', '_')\n const rows = validated.tasks.map((task, idx) => taskRow(task, idx))\n const runnerFiles = validated.runner.files ?? {}\n const scoringFiles = validated.scoring.kind === 'command' ? (validated.scoring.files ?? {}) : {}\n const files: Record<string, string> = {\n 'pyproject.toml': renderPyproject(validated, moduleName),\n 'prime.eval.toml': renderPrimeConfig(validated, 'eval'),\n 'prime.train.toml': renderPrimeConfig(validated, 'train'),\n 'README.md': renderReadme(validated),\n [`${moduleName}/__init__.py`]: renderInit(moduleName),\n [`${moduleName}/taskset.py`]: renderTaskset(moduleName, validated.scoring),\n [`${moduleName}/harness.py`]: renderHarness(moduleName),\n [`${moduleName}/tasks.jsonl`]: `${rows.map((row) => JSON.stringify(row)).join('\\n')}\\n`,\n [`${moduleName}/runner.json`]: `${JSON.stringify(\n {\n command: validated.runner.command,\n files: runnerFiles,\n setup: validated.runner.setup ?? [],\n forwardEnv: validated.runner.forwardEnv ?? [],\n },\n null,\n 2,\n )}\\n`,\n }\n for (const [path, contents] of Object.entries(scoringFiles)) {\n files[`${moduleName}/scoring/${path}`] = contents\n }\n\n const filesSha256 = Object.fromEntries(\n Object.entries(files)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([path, contents]) => [path, sha256(contents)]),\n )\n const manifest: PrimeIntellectPackageManifest = {\n schema: 'tangle.primeintellect.package/v1',\n name: validated.name,\n moduleName,\n version: validated.version,\n verifiers: VERIFIERS_RANGE,\n taskCount: validated.tasks.length,\n splits: {\n train: validated.tasks.filter((task) => task.split === 'train').length,\n eval: validated.tasks.filter((task) => task.split === 'eval').length,\n },\n taskIdsSha256: sha256(\n validated.tasks\n .map((task) => `${task.split}:${task.id}`)\n .sort()\n .join('\\n'),\n ),\n filesSha256,\n }\n files['manifest.json'] = `${JSON.stringify(manifest, null, 2)}\\n`\n return { manifest, files: Object.freeze(files) }\n}\n\n/** Write a bundle through a sibling temporary directory, then rename it into place. */\nexport async function writePrimeIntellectPackage(\n bundle: PrimeIntellectPackageBundle,\n outputDirectory: string,\n options: WritePrimeIntellectPackageOptions = {},\n): Promise<string> {\n const output = resolve(outputDirectory)\n const parent = dirname(output)\n await mkdir(parent, { recursive: true })\n const replacing = await pathExists(output)\n if (replacing) {\n if (!options.replace) throw new Error(`PrimeIntellect output already exists: ${output}`)\n await assertGeneratedPackage(output)\n }\n\n const temporary = join(parent, `.${basename(output)}.${randomUUID()}.tmp`)\n const backup = replacing ? join(parent, `.${basename(output)}.${randomUUID()}.backup`) : undefined\n try {\n await mkdir(temporary)\n for (const [path, contents] of Object.entries(bundle.files)) {\n assertRelativePath(path, 'bundle file')\n const target = resolve(temporary, path)\n if (target !== temporary && !target.startsWith(`${temporary}${sep}`)) {\n throw new Error(`bundle file escapes output directory: ${path}`)\n }\n await mkdir(dirname(target), { recursive: true })\n await writeFile(target, contents, 'utf8')\n }\n if (backup) await rename(output, backup)\n try {\n await rename(temporary, output)\n } catch (error) {\n if (backup) {\n try {\n await rename(backup, output)\n } catch (restoreError) {\n throw new AggregateError(\n [error, restoreError],\n `failed to install PrimeIntellect package and restore ${output}`,\n )\n }\n }\n throw error\n }\n if (backup) await rm(backup, { recursive: true })\n } catch (error) {\n await rm(temporary, { recursive: true, force: true })\n throw error\n }\n return output\n}\n\nfunction validateOptions(options: PrimeIntellectPackageOptions): PrimeIntellectPackageOptions {\n if (!PACKAGE_NAME.test(options.name)) {\n throw new Error('PrimeIntellect package name must match /^[a-z][a-z0-9-]{0,62}$/')\n }\n if (!VERSION.test(options.version)) {\n throw new Error('PrimeIntellect package version must be a numeric semantic version')\n }\n if (!Array.isArray(options.tasks) || options.tasks.length === 0) {\n throw new Error('PrimeIntellect package requires tasks')\n }\n const tasks: readonly PrimeIntellectTask[] = options.tasks\n const seen = new Set<string>()\n const seenInputs = new Map<string, { id: string; split: PrimeIntellectTask['split'] }>()\n const splitCounts = { train: 0, eval: 0 }\n for (const [index, task] of tasks.entries()) {\n validateTask(task, index, options.scoring)\n if (seen.has(task.id)) throw new Error(`duplicate PrimeIntellect task id: ${task.id}`)\n seen.add(task.id)\n const input = canonicalJson({\n prompt: task.prompt,\n systemPrompt: task.systemPrompt ?? null,\n metadata: task.metadata ?? {},\n })\n const duplicate = seenInputs.get(input)\n if (duplicate) {\n throw new Error(\n `PrimeIntellect tasks ${duplicate.id} (${duplicate.split}) and ${task.id} (${task.split}) expose the same public input`,\n )\n }\n seenInputs.set(input, { id: task.id, split: task.split })\n splitCounts[task.split] += 1\n }\n if (splitCounts.train === 0 || splitCounts.eval === 0) {\n throw new Error('PrimeIntellect package requires non-empty, disjoint train and eval splits')\n }\n validateScoring(options.scoring)\n validateCommand(options.runner.command, 'runner.command')\n validateFiles(options.runner.files ?? {}, 'runner.files')\n for (const [index, command] of (options.runner.setup ?? []).entries()) {\n validateCommand(command, `runner.setup[${index}]`)\n }\n validateEnvNames(options.runner.forwardEnv ?? [], 'runner.forwardEnv')\n if (typeof options.runner.image !== 'string' || options.runner.image.trim().length === 0) {\n throw new Error('runner.image must be a non-empty container image')\n }\n if (/(^|:)latest$/i.test(options.runner.image)) {\n throw new Error('runner.image must not use the mutable latest tag')\n }\n positiveInteger(options.maxTurns ?? DEFAULT_MAX_TURNS, 'maxTurns')\n for (const [name, value] of [\n ['maxInputTokens', options.maxInputTokens],\n ['maxOutputTokens', options.maxOutputTokens],\n ['maxTotalTokens', options.maxTotalTokens],\n ] as const) {\n if (value !== undefined) positiveInteger(value, name)\n }\n positiveNumber(options.rolloutTimeoutSeconds ?? DEFAULT_ROLLOUT_TIMEOUT, 'rolloutTimeoutSeconds')\n positiveNumber(options.scoringTimeoutSeconds ?? DEFAULT_SCORING_TIMEOUT, 'scoringTimeoutSeconds')\n return options\n}\n\nfunction validateTask(\n task: PrimeIntellectTask,\n index: number,\n scoring: PrimeIntellectScoring,\n): void {\n const path = `tasks[${index}]`\n if (typeof task.id !== 'string' || task.id.trim().length === 0) {\n throw new Error(`${path}.id must be a non-empty string`)\n }\n if (task.split !== 'train' && task.split !== 'eval') {\n throw new Error(`${path}.split must be train or eval`)\n }\n const prompt = validatePrimeIntellectPrompt(task.prompt, `${path}.prompt`)\n if (Array.isArray(prompt)) {\n if (task.systemPrompt !== undefined && prompt.some((message) => message.role === 'system')) {\n throw new Error(`${path} must not set systemPrompt and include a system message`)\n }\n }\n if (task.systemPrompt !== undefined && typeof task.systemPrompt !== 'string') {\n throw new Error(`${path}.systemPrompt must be a string`)\n }\n if (task.metadata !== undefined) {\n validatePrimeIntellectJson(task.metadata, `${path}.metadata`)\n }\n if (scoring.kind !== 'command') {\n const answers = Array.isArray(task.answer) ? task.answer : [task.answer]\n if (\n answers.length === 0 ||\n answers.some((answer) => typeof answer !== 'string' || answer.length === 0)\n ) {\n throw new Error(`${path}.answer is required for ${scoring.kind} scoring`)\n }\n }\n}\n\nfunction validateScoring(scoring: PrimeIntellectScoring): void {\n if (scoring.kind === 'exact') return\n if (scoring.kind === 'reference-judge') {\n if (typeof scoring.model !== 'string' || scoring.model.length === 0) {\n throw new Error('reference-judge scoring requires a model')\n }\n return\n }\n validateCommand(scoring.command, 'scoring.command')\n validateFiles(scoring.files ?? {}, 'scoring.files')\n validateEnvNames(scoring.forwardEnv ?? [], 'scoring.forwardEnv')\n positiveNumber(scoring.timeoutSeconds ?? DEFAULT_SCORING_TIMEOUT, 'scoring.timeoutSeconds')\n}\n\nfunction validateCommand(command: readonly string[], path: string): void {\n if (!Array.isArray(command) || command.length === 0) {\n throw new Error(`${path} must be a non-empty argv array`)\n }\n for (const [index, argument] of command.entries()) {\n if (typeof argument !== 'string' || argument.length === 0 || argument.includes('\\0')) {\n throw new Error(`${path}[${index}] must be a non-empty string without NUL bytes`)\n }\n }\n}\n\nfunction validateFiles(files: Readonly<Record<string, string>>, path: string): void {\n for (const [file, contents] of Object.entries(files)) {\n assertRelativePath(file, path)\n if (typeof contents !== 'string') throw new Error(`${path}.${file} must be a string`)\n }\n}\n\nfunction validateEnvNames(names: readonly string[], path: string): void {\n const seen = new Set<string>()\n for (const [index, name] of names.entries()) {\n if (!ENV_NAME.test(name)) throw new Error(`${path}[${index}] is not a valid environment name`)\n if (seen.has(name)) throw new Error(`${path} contains duplicate name ${name}`)\n seen.add(name)\n }\n}\n\nfunction assertRelativePath(path: string, label: string): void {\n const normalized = normalize(path)\n if (\n path.length === 0 ||\n path.includes('\\0') ||\n isAbsolute(path) ||\n normalized === '..' ||\n normalized.startsWith(`..${sep}`) ||\n relative('.', normalized).startsWith('..')\n ) {\n throw new Error(`${label} contains unsafe path: ${path}`)\n }\n}\n\nfunction taskRow(task: PrimeIntellectTask, idx: number): Record<string, PrimeIntellectJson> {\n return {\n idx,\n name: task.id,\n prompt: task.prompt as PrimeIntellectJson,\n system_prompt: task.systemPrompt ?? null,\n split: task.split,\n answer: task.answer ?? null,\n metadata: task.metadata ?? {},\n }\n}\n\nfunction renderPyproject(options: PrimeIntellectPackageOptions, moduleName: string): string {\n const description = options.description ?? `PrimeIntellect tasks for ${options.name}`\n return `[project]\\nname = ${toml(options.name)}\\nversion = ${toml(options.version)}\\ndescription = ${toml(description)}\\nrequires-python = \">=3.11,<3.14\"\\ndependencies = [\"verifiers${VERIFIERS_RANGE}\"]\\n\\n[build-system]\\nrequires = [\"hatchling\"]\\nbuild-backend = \"hatchling.build\"\\n\\n[tool.hatch.build.targets.wheel]\\npackages = [${toml(moduleName)}]\\n\\n[tool.uv]\\nprerelease = \"allow\"\\n`\n}\n\nfunction renderPrimeConfig(options: PrimeIntellectPackageOptions, split: 'train' | 'eval'): string {\n const limits = [\n `max_turns = ${options.maxTurns ?? DEFAULT_MAX_TURNS}`,\n options.maxInputTokens === undefined\n ? undefined\n : `max_input_tokens = ${options.maxInputTokens}`,\n options.maxOutputTokens === undefined\n ? undefined\n : `max_output_tokens = ${options.maxOutputTokens}`,\n options.maxTotalTokens === undefined\n ? undefined\n : `max_total_tokens = ${options.maxTotalTokens}`,\n ].filter((line): line is string => line !== undefined)\n return `${limits.join('\\n')}\\npush = false\\n\\n[timeout]\\nrollout = ${options.rolloutTimeoutSeconds ?? DEFAULT_ROLLOUT_TIMEOUT}\\nscoring = ${options.scoringTimeoutSeconds ?? DEFAULT_SCORING_TIMEOUT}\\n\\n[taskset]\\nid = ${toml(options.name)}\\nsplit = ${toml(split)}\\n\\n[harness]\\nid = ${toml(options.name)}\\nprogram = ${tomlArray(options.runner.command)}\\nforward_env = ${tomlArray(options.runner.forwardEnv ?? [])}\\n\\n[harness.runtime]\\ntype = \"docker\"\\nimage = ${toml(options.runner.image)}\\n`\n}\n\nfunction renderInit(moduleName: string): string {\n return `from ${moduleName}.harness import TangleRuntimeHarness\\nfrom ${moduleName}.taskset import TangleTaskset\\n\\n__all__ = [\"TangleRuntimeHarness\", \"TangleTaskset\"]\\n`\n}\n\nfunction renderTaskset(moduleName: string, scoring: PrimeIntellectScoring): string {\n const config = scoringConfig(scoring)\n return `import asyncio\\nimport json\\nimport math\\nimport os\\nfrom importlib.resources import files\\nfrom pathlib import Path\\nfrom typing import Any, Literal\\n\\nimport verifiers.v1 as vf\\n\\nSCORING = json.loads(${pythonString(JSON.stringify(config))})\\nPACKAGE_ROOT = Path(__file__).resolve().parent\\n\\n\\nclass TangleTaskData(vf.TaskData):\\n split: Literal[\"train\", \"eval\"]\\n answer: str | list[str] | None = None\\n metadata: dict[str, Any] = {}\\n\\n\\nclass TangleTaskConfig(vf.TaskConfig):\\n scoring: Literal[\"exact\", \"reference-judge\", \"command\"] = SCORING[\"kind\"]\\n normalization: Literal[\"none\", \"trim\", \"trim-casefold\"] = SCORING.get(\"normalization\", \"trim\")\\n judge_model: str = SCORING.get(\"model\", \"openai/gpt-5.4-nano\")\\n judge_prompt: str | None = SCORING.get(\"prompt\")\\n judge_view: Literal[\"last_reply\", \"full_trace\"] = SCORING.get(\"view\", \"last_reply\")\\n score_program: list[str] = SCORING.get(\"command\", [])\\n score_forward_env: list[str] = SCORING.get(\"forwardEnv\", [])\\n score_timeout_seconds: float = SCORING.get(\"timeoutSeconds\", 300)\\n\\n\\ndef _normalize(value: str, mode: str) -> str:\\n if mode == \"none\":\\n return value\\n value = value.strip()\\n return value.casefold() if mode == \"trim-casefold\" else value\\n\\n\\nasync def _run_score_command(config: TangleTaskConfig, data: TangleTaskData, trace: vf.Trace) -> float:\\n if not config.score_program:\\n raise ValueError(\"command scoring requires score_program\")\\n safe_env = {\\n key: os.environ[key]\\n for key in (\"PATH\", \"HOME\", \"TMPDIR\", \"LANG\")\\n if key in os.environ\\n }\\n safe_env.update(\\n {key: os.environ[key] for key in config.score_forward_env if key in os.environ}\\n )\\n request = {\\n \"protocol\": \"tangle.primeintellect.score/v1\",\\n \"task\": data.model_dump(mode=\"json\", exclude_none=True),\\n \"trace\": trace.model_dump(mode=\"json\", exclude_none=True),\\n }\\n process = await asyncio.create_subprocess_exec(\\n *config.score_program,\\n cwd=PACKAGE_ROOT,\\n env=safe_env,\\n stdin=asyncio.subprocess.PIPE,\\n stdout=asyncio.subprocess.PIPE,\\n stderr=asyncio.subprocess.PIPE,\\n )\\n payload = json.dumps(request, separators=(\",\", \":\")).encode()\\n try:\\n stdout, stderr = await asyncio.wait_for(\\n process.communicate(payload), timeout=config.score_timeout_seconds\\n )\\n except TimeoutError:\\n process.kill()\\n await process.communicate()\\n raise RuntimeError(\\n f\"score command timed out after {config.score_timeout_seconds}s\"\\n )\\n if process.returncode != 0:\\n detail = (stderr or stdout).decode(errors=\"replace\").strip()[-2000:]\\n raise RuntimeError(f\"score command exited {process.returncode}: {detail}\")\\n try:\\n result = json.loads(stdout)\\n except json.JSONDecodeError as error:\\n raise ValueError(f\"score command returned invalid JSON: {error}\") from error\\n if not isinstance(result, dict):\\n raise ValueError(\"score command must return an object\")\\n reward = result.get(\"reward\")\\n if isinstance(reward, bool) or not isinstance(reward, (int, float)) or not math.isfinite(reward):\\n raise ValueError(\"score command reward must be a finite number\")\\n metrics = result.get(\"metrics\", {})\\n if not isinstance(metrics, dict):\\n raise ValueError(\"score command metrics must be an object\")\\n for name, value in metrics.items():\\n if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value):\\n raise ValueError(f\"score command metric {name!r} must be a finite number\")\\n trace.record_metrics(metrics)\\n return float(reward)\\n\\n\\nclass TangleTask(vf.Task[TangleTaskData, vf.State, TangleTaskConfig]):\\n @vf.reward(weight=1.0)\\n async def task_reward(self, trace: vf.Trace) -> float:\\n if self.config.scoring == \"command\":\\n return await _run_score_command(self.config, self.data, trace)\\n if self.data.answer is None:\\n raise ValueError(f\"task {self.data.name!r} has no reference answer\")\\n if self.config.scoring == \"reference-judge\":\\n judge = vf.ReferenceJudge(\\n vf.ReferenceJudgeConfig(\\n model=self.config.judge_model,\\n prompt=self.config.judge_prompt,\\n view=self.config.judge_view,\\n )\\n )\\n return await judge.score(self.data, trace)\\n expected = self.data.answer if isinstance(self.data.answer, list) else [self.data.answer]\\n actual = _normalize(trace.last_reply, self.config.normalization)\\n return float(any(actual == _normalize(answer, self.config.normalization) for answer in expected))\\n\\n\\nclass TangleTasksetConfig(vf.TasksetConfig):\\n split: Literal[\"train\", \"eval\"] = \"eval\"\\n task: TangleTaskConfig = TangleTaskConfig()\\n\\n\\nclass TangleTaskset(vf.Taskset[TangleTask, TangleTasksetConfig]):\\n def load(self) -> list[TangleTask]:\\n resource = files(${pythonString(moduleName)}).joinpath(\"tasks.jsonl\")\\n tasks: list[TangleTask] = []\\n with resource.open(\"r\", encoding=\"utf-8\") as handle:\\n for line in handle:\\n if not line.strip():\\n continue\\n row = json.loads(line)\\n if row[\"split\"] != self.config.split:\\n continue\\n tasks.append(TangleTask(TangleTaskData.model_validate(row), self.config.task))\\n if not tasks:\\n raise ValueError(f\"task split {self.config.split!r} is empty\")\\n return tasks\\n\\n\\n__all__ = [\"TangleTaskset\"]\\n`\n}\n\nfunction renderHarness(moduleName: string): string {\n return `import json\\nfrom importlib.resources import files\\n\\nimport verifiers.v1 as vf\\n\\nRUNNER = json.loads(files(${pythonString(moduleName)}).joinpath(\"runner.json\").read_text(encoding=\"utf-8\"))\\n\\n\\nclass TangleRuntimeHarnessConfig(vf.HarnessConfig):\\n program: list[str] = RUNNER[\"command\"]\\n setup_commands: list[list[str]] = RUNNER[\"setup\"]\\n forward_env: list[str] = RUNNER[\"forwardEnv\"]\\n\\n\\nclass TangleRuntimeHarness(vf.Harness[TangleRuntimeHarnessConfig]):\\n APPENDS_SYSTEM_PROMPT = True\\n SUPPORTS_MCP = True\\n SUPPORTS_MESSAGE_PROMPT = True\\n\\n async def setup(self, runtime: vf.Runtime) -> None:\\n for path, contents in RUNNER[\"files\"].items():\\n await runtime.write(path, contents.encode())\\n for command in self.config.setup_commands:\\n result = await runtime.run(command, self.config.resolved_env)\\n if result.exit_code != 0:\\n detail = (result.stderr or result.stdout).strip()[-2000:]\\n raise RuntimeError(\\n f\"runner setup command {command[0]!r} exited {result.exit_code}: {detail}\"\\n )\\n\\n async def launch(\\n self,\\n ctx: vf.ModelContext,\\n trace: vf.Trace,\\n runtime: vf.Runtime,\\n endpoint: str,\\n secret: str,\\n mcp_urls: dict[str, str],\\n ) -> vf.ProgramResult:\\n data = trace.task.data\\n public_task = {\\n \"id\": data.name or str(data.idx),\\n \"split\": data.split,\\n \"prompt\": data.prompt,\\n \"metadata\": data.metadata,\\n }\\n if data.system_prompt is not None:\\n public_task[\"systemPrompt\"] = data.system_prompt\\n env = {\\n **self.config.resolved_env,\\n \"OPENAI_BASE_URL\": endpoint,\\n \"OPENAI_API_KEY\": secret,\\n \"OPENAI_MODEL\": ctx.model,\\n \"TANGLE_PRIME_TASK_JSON\": json.dumps(public_task, separators=(\",\", \":\")),\\n \"TANGLE_PRIME_MCP_SERVERS_JSON\": json.dumps(mcp_urls, separators=(\",\", \":\")),\\n }\\n if not self.config.program:\\n raise ValueError(\"Tangle runtime harness requires a program argv\")\\n return await runtime.run_program(self.config.program, env)\\n\\n\\n__all__ = [\"TangleRuntimeHarness\"]\\n`\n}\n\nfunction scoringConfig(scoring: PrimeIntellectScoring): Record<string, PrimeIntellectJson> {\n if (scoring.kind === 'exact') {\n return { kind: scoring.kind, normalization: scoring.normalization ?? 'trim' }\n }\n if (scoring.kind === 'reference-judge') {\n return {\n kind: scoring.kind,\n model: scoring.model,\n prompt: scoring.prompt ?? null,\n view: scoring.view ?? 'last_reply',\n }\n }\n return {\n kind: scoring.kind,\n command: [...scoring.command],\n forwardEnv: [...(scoring.forwardEnv ?? [])],\n timeoutSeconds: scoring.timeoutSeconds ?? DEFAULT_SCORING_TIMEOUT,\n }\n}\n\nfunction renderReadme(options: PrimeIntellectPackageOptions): string {\n return `# ${options.name}\\n\\nPrimeIntellect Verifiers v1 tasks that run the caller's Tangle agent program.\\n\\n## Evaluate\\n\\n\\`\\`\\`bash\\nuv run eval @ prime.eval.toml --model <provider/model-snapshot>\\n\\`\\`\\`\\n\\n## Train\\n\\nUse \\`prime.train.toml\\` as the environment config for Prime RL. The train and eval rows are disjoint and selected by \\`taskset.split\\`.\\n\\nThe runner receives only the prompt, metadata, intercepted model endpoint, and MCP URLs. Reference answers remain in the task process and are never written into the runner workspace or environment.\\n`\n}\n\nfunction toml(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction tomlArray(values: readonly string[]): string {\n return `[${values.map(toml).join(', ')}]`\n}\n\nfunction pythonString(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction positiveInteger(value: number, path: string): void {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new Error(`${path} must be a positive integer`)\n}\n\nfunction positiveNumber(value: number, path: string): void {\n if (!Number.isFinite(value) || value <= 0) throw new Error(`${path} must be positive`)\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false\n throw error\n }\n}\n\nasync function assertGeneratedPackage(output: string): Promise<void> {\n let manifest: unknown\n try {\n manifest = JSON.parse(await readFile(join(output, 'manifest.json'), 'utf8'))\n } catch (error) {\n throw new Error(\n `refusing to replace ${output}: it is not a generated PrimeIntellect package (${error instanceof Error ? error.message : String(error)})`,\n )\n }\n if (\n manifest === null ||\n typeof manifest !== 'object' ||\n (manifest as Record<string, unknown>).schema !== 'tangle.primeintellect.package/v1'\n ) {\n throw new Error(`refusing to replace ${output}: manifest schema does not match`)\n }\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex')\n}\n","import type { PrimeIntellectJson, PrimeIntellectMessage } from './types'\n\n/** Validate the Verifiers v1 prompt schema shared by package creation and runner input. */\nexport function validatePrimeIntellectPrompt(\n value: unknown,\n path: string,\n): string | PrimeIntellectMessage[] {\n if (typeof value === 'string' && value.length > 0) return value\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${path} must be a non-empty string or message array`)\n }\n for (const [index, message] of value.entries()) {\n validateMessage(message, `${path}[${index}]`)\n }\n return value as PrimeIntellectMessage[]\n}\n\nexport function validatePrimeIntellectJson(value: unknown, path: string): void {\n if (value === null || ['string', 'boolean'].includes(typeof value)) return\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error(`${path} contains a non-finite number`)\n return\n }\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n validatePrimeIntellectJson(entry, `${path}[${index}]`)\n })\n return\n }\n if (typeof value === 'object') {\n for (const [key, entry] of Object.entries(value)) {\n validatePrimeIntellectJson(entry, `${path}.${key}`)\n }\n return\n }\n throw new Error(`${path} is not JSON serializable`)\n}\n\nexport function validatePrimeIntellectJsonObject(\n value: unknown,\n path: string,\n): Record<string, PrimeIntellectJson> {\n const output = record(value, path)\n validatePrimeIntellectJson(output, path)\n return output as Record<string, PrimeIntellectJson>\n}\n\nfunction validateMessage(value: unknown, path: string): void {\n const message = record(value, path)\n const role = message.role\n if (!['system', 'user', 'assistant', 'tool'].includes(String(role))) {\n throw new Error(`${path}.role is invalid`)\n }\n if (role === 'system' || role === 'user') {\n assertOnlyKeys(message, ['role', 'content'], path)\n validateContent(message.content, `${path}.content`)\n } else if (role === 'assistant') {\n assertOnlyKeys(\n message,\n ['role', 'content', 'reasoning_content', 'tool_calls', 'provider_state'],\n path,\n )\n optionalNullableString(message.content, `${path}.content`)\n optionalNullableString(message.reasoning_content, `${path}.reasoning_content`)\n if (message.tool_calls !== undefined) {\n validateToolCalls(message.tool_calls, `${path}.tool_calls`)\n }\n if (message.provider_state !== undefined) {\n validateProviderState(message.provider_state, `${path}.provider_state`)\n }\n } else {\n assertOnlyKeys(message, ['role', 'tool_call_id', 'content', 'name'], path)\n nonEmptyString(message.tool_call_id, `${path}.tool_call_id`)\n if (message.name !== undefined && typeof message.name !== 'string') {\n throw new Error(`${path}.name must be a string`)\n }\n validateContent(message.content, `${path}.content`)\n }\n validatePrimeIntellectJson(message, path)\n}\n\nfunction validateToolCalls(value: unknown, path: string): void {\n if (!Array.isArray(value)) throw new Error(`${path} must be an array`)\n for (const [index, rawCall] of value.entries()) {\n const call = record(rawCall, `${path}[${index}]`)\n assertOnlyKeys(call, ['id', 'name', 'arguments'], `${path}[${index}]`)\n for (const field of ['id', 'name', 'arguments']) {\n nonEmptyString(call[field], `${path}[${index}].${field}`)\n }\n }\n}\n\nfunction validateProviderState(value: unknown, path: string): void {\n if (!Array.isArray(value)) throw new Error(`${path} must be an array`)\n for (const [index, rawState] of value.entries()) {\n const state = record(rawState, `${path}[${index}]`)\n validatePrimeIntellectJson(state, `${path}[${index}]`)\n }\n}\n\nfunction validateContent(value: unknown, path: string): void {\n if (typeof value === 'string') return\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${path} must be a string or non-empty content array`)\n }\n for (const [index, rawPart] of value.entries()) {\n const part = record(rawPart, `${path}[${index}]`)\n if (part.type === 'text' && typeof part.text === 'string') {\n assertOnlyKeys(part, ['type', 'text'], `${path}[${index}]`)\n continue\n }\n const image = part.image_url\n if (\n part.type === 'image_url' &&\n image !== null &&\n typeof image === 'object' &&\n !Array.isArray(image) &&\n typeof (image as Record<string, unknown>).url === 'string'\n ) {\n assertOnlyKeys(part, ['type', 'image_url'], `${path}[${index}]`)\n assertOnlyKeys(image as Record<string, unknown>, ['url'], `${path}[${index}].image_url`)\n continue\n }\n throw new Error(`${path}[${index}] is not a supported text or image_url content part`)\n }\n}\n\nfunction optionalNullableString(value: unknown, path: string): void {\n if (value !== undefined && value !== null && typeof value !== 'string') {\n throw new Error(`${path} must be a string or null`)\n }\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction assertOnlyKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n path: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) throw new Error(`${path}.${key} is not supported`)\n }\n}\n","import { createOpenAICompatibleBackend } from '../backends'\nimport type {\n PrimeIntellectEpisodeContext,\n PrimeIntellectPublicTask,\n PrimeIntellectSplit,\n} from './types'\nimport { validatePrimeIntellectJsonObject, validatePrimeIntellectPrompt } from './validation'\n\nconst ENV = {\n task: 'TANGLE_PRIME_TASK_JSON',\n model: 'OPENAI_MODEL',\n baseUrl: 'OPENAI_BASE_URL',\n apiKey: 'OPENAI_API_KEY',\n mcpServers: 'TANGLE_PRIME_MCP_SERVERS_JSON',\n} as const\n\nexport interface RunPrimeIntellectProgramOptions {\n env?: NodeJS.ProcessEnv\n}\n\nexport type PrimeIntellectBackendOptions = Omit<\n Parameters<typeof createOpenAICompatibleBackend>[0],\n 'apiKey' | 'baseUrl' | 'model'\n>\n\n/** Read and validate the private process contract installed by the generated Prime harness. */\nexport function readPrimeIntellectEpisodeContext(\n env: NodeJS.ProcessEnv = process.env,\n): PrimeIntellectEpisodeContext {\n const rawTask = requiredEnv(env, ENV.task)\n const rawMcp = env[ENV.mcpServers] ?? '{}'\n const parsedTask = parseJson(rawTask, ENV.task)\n const parsedMcp = parseJson(rawMcp, ENV.mcpServers)\n const task = validatePublicTask(parsedTask)\n const mcpServers = validateStringMap(parsedMcp, ENV.mcpServers)\n\n return {\n protocol: 'tangle.primeintellect.episode/v1',\n task,\n model: {\n name: requiredEnv(env, ENV.model),\n baseUrl: requiredEnv(env, ENV.baseUrl),\n apiKey: requiredEnv(env, ENV.apiKey),\n },\n mcpServers,\n }\n}\n\n/** Build the existing runtime backend against Prime's intercepted model endpoint. */\nexport function createPrimeIntellectBackend(\n context: PrimeIntellectEpisodeContext,\n options: PrimeIntellectBackendOptions = {},\n) {\n return createOpenAICompatibleBackend({\n ...options,\n apiKey: context.model.apiKey,\n baseUrl: context.model.baseUrl,\n model: context.model.name,\n kind: options.kind ?? 'primeintellect',\n })\n}\n\n/**\n * Execute the caller's canonical runtime program inside a Prime rollout.\n * The callback may call runPersonified, runAgentic, runLoop, or any product wrapper.\n */\nexport async function runPrimeIntellectProgram<Result>(\n run: (context: PrimeIntellectEpisodeContext) => Promise<Result>,\n options: RunPrimeIntellectProgramOptions = {},\n): Promise<Result> {\n return run(readPrimeIntellectEpisodeContext(options.env))\n}\n\nfunction requiredEnv(env: NodeJS.ProcessEnv, name: string): string {\n const value = env[name]\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`PrimeIntellect runner requires ${name}`)\n }\n return value\n}\n\nfunction parseJson(value: string, name: string): unknown {\n try {\n return JSON.parse(value)\n } catch (error) {\n throw new Error(\n `${name} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n}\n\nfunction validatePublicTask(value: unknown): PrimeIntellectPublicTask {\n const task = record(value, ENV.task)\n for (const privateField of ['answer', 'reference', 'scoring', 'score']) {\n if (privateField in task) {\n throw new Error(`${ENV.task} exposed private field ${privateField}`)\n }\n }\n for (const field of Object.keys(task)) {\n if (!['id', 'split', 'prompt', 'systemPrompt', 'metadata'].includes(field)) {\n throw new Error(`${ENV.task}.${field} is not supported`)\n }\n }\n const id = nonEmptyString(task.id, `${ENV.task}.id`)\n const split = validateSplit(task.split, `${ENV.task}.split`)\n const prompt = validatePrimeIntellectPrompt(task.prompt, `${ENV.task}.prompt`)\n const systemPrompt = optionalString(task.systemPrompt, `${ENV.task}.systemPrompt`)\n if (\n systemPrompt !== undefined &&\n Array.isArray(prompt) &&\n prompt.some((message) => message.role === 'system')\n ) {\n throw new Error(`${ENV.task} must not set systemPrompt and include a system message`)\n }\n const metadata =\n task.metadata === undefined\n ? undefined\n : validatePrimeIntellectJsonObject(task.metadata, `${ENV.task}.metadata`)\n return {\n id,\n split,\n prompt,\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n }\n}\n\nfunction validateSplit(value: unknown, path: string): PrimeIntellectSplit {\n if (value !== 'train' && value !== 'eval') {\n throw new Error(`${path} must be train or eval`)\n }\n return value\n}\n\nfunction validateStringMap(value: unknown, path: string): Readonly<Record<string, string>> {\n const input = record(value, path)\n const output: Record<string, string> = {}\n for (const [key, entry] of Object.entries(input)) {\n if (typeof entry !== 'string' || entry.length === 0) {\n throw new Error(`${path}.${key} must be a non-empty string`)\n }\n output[key] = entry\n }\n return output\n}\n\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n\nfunction optionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new Error(`${path} must be a string`)\n return value\n}\n","import { type RunRecord, validateRunRecord } from '@tangle-network/agent-eval'\n\ninterface PrimeUsage {\n prompt_tokens: number\n completion_tokens: number\n cached_input_tokens?: number | null\n reasoning_tokens?: number | null\n cost?: number | null\n}\n\ninterface PrimeTraceNode {\n parent?: number | null\n sampled?: boolean\n usage?: PrimeUsage | null\n message?: unknown\n}\n\ninterface PrimeTimeSpan {\n start?: number\n end?: number\n}\n\nexport interface PrimeIntellectTrace {\n id: string\n task: {\n type: string\n data: {\n idx: number\n name?: string | null\n split?: 'train' | 'eval'\n prompt?: unknown\n system_prompt?: string | null\n metadata?: Record<string, unknown>\n [key: string]: unknown\n }\n }\n runtime?: unknown\n nodes: PrimeTraceNode[]\n rewards: Record<string, number>\n metrics: Record<string, number>\n info?: Record<string, unknown>\n extra_usage?: PrimeUsage[]\n is_completed?: boolean\n stop_condition?: string | null\n errors?: Array<{ type: string; message: string; traceback?: string | null }>\n timing?: {\n start?: number\n setup?: PrimeTimeSpan\n generation?: PrimeTimeSpan\n finalize?: PrimeTimeSpan\n scoring?: PrimeTimeSpan\n }\n}\n\nexport interface PrimeIntellectTraceImportOptions {\n experimentId: string\n candidateId: string\n seed: number\n /** Snapshot-pinned model id required by RunRecord validation. */\n model: string\n promptHash: string\n configHash: string\n commitSha: string\n}\n\nexport type PrimeIntellectImportDefaults = PrimeIntellectTraceImportOptions\n\n/** Parse Prime's durable `traces.jsonl` and reject malformed rows with a line number. */\nexport function parsePrimeIntellectTraces(jsonl: string): PrimeIntellectTrace[] {\n const traces: PrimeIntellectTrace[] = []\n for (const [lineIndex, line] of jsonl.split('\\n').entries()) {\n if (!line.trim()) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (error) {\n throw new Error(\n `PrimeIntellect trace line ${lineIndex + 1} is invalid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n traces.push(validateTrace(parsed, lineIndex + 1))\n }\n if (traces.length === 0) throw new Error('PrimeIntellect traces.jsonl contains no traces')\n return traces\n}\n\n/** Convert all Prime traces to agent-eval RunRecords while retaining one shared run config. */\nexport function importPrimeIntellectTraces(\n jsonl: string,\n defaults: PrimeIntellectImportDefaults,\n): RunRecord[] {\n return parsePrimeIntellectTraces(jsonl).map((trace) =>\n primeIntellectTraceToRunRecord(trace, defaults),\n )\n}\n\n/** Project one complete Prime trace into the common agent-eval analysis row. */\nexport function primeIntellectTraceToRunRecord(\n trace: PrimeIntellectTrace,\n options: PrimeIntellectTraceImportOptions,\n): RunRecord {\n const split = trace.task.data.split\n if (split !== 'train' && split !== 'eval') {\n throw new Error(`PrimeIntellect trace ${trace.id} has no train/eval split`)\n }\n const reward = sumFinite(Object.values(trace.rewards), `trace ${trace.id} rewards`)\n const usage = aggregateUsage([\n ...trace.nodes.map((node) => node.usage).filter((value): value is PrimeUsage => value != null),\n ...(trace.extra_usage ?? []),\n ])\n const errors = trace.errors ?? []\n const raw: Record<string, number> = {\n reward,\n 'prime.turns': trace.nodes.filter((node) => node.sampled === true).length,\n 'prime.branches': countBranches(trace.nodes),\n 'prime.errors': errors.length,\n 'prime.completed': trace.is_completed ? 1 : 0,\n 'prime.cost_complete': usage.costComplete ? 1 : 0,\n 'prime.reported_cost_usd': usage.reportedCostUsd,\n }\n for (const [name, value] of Object.entries(trace.rewards)) {\n raw[`reward.${name}`] = finite(value, `trace ${trace.id} reward ${name}`)\n }\n for (const [name, value] of Object.entries(trace.metrics)) {\n raw[`metric.${name}`] = finite(value, `trace ${trace.id} metric ${name}`)\n }\n\n const record: RunRecord = {\n runId: trace.id,\n experimentId: options.experimentId,\n candidateId: options.candidateId,\n seed: options.seed,\n model: options.model,\n promptHash: options.promptHash,\n configHash: options.configHash,\n commitSha: options.commitSha,\n wallMs: traceWallMs(trace),\n costUsd: usage.costComplete ? usage.reportedCostUsd : 0,\n costProvenance: usage.costComplete\n ? { kind: 'observed', usd: usage.reportedCostUsd }\n : { kind: 'uncaptured', usd: null },\n tokenUsage: {\n input: usage.input,\n output: usage.output,\n ...(usage.reasoning !== undefined ? { reasoning: usage.reasoning } : {}),\n ...(usage.cached !== undefined ? { cached: usage.cached } : {}),\n },\n outcome: split === 'eval' ? { holdoutScore: reward, raw } : { searchScore: reward, raw },\n splitTag: split === 'eval' ? 'holdout' : 'search',\n scenarioId: trace.task.data.name ?? String(trace.task.data.idx),\n ...(errors[0] ? { failureMode: `primeintellect:${errors[0].type}:${errors[0].message}` } : {}),\n }\n return validateRunRecord(record)\n}\n\nfunction validateTrace(value: unknown, line: number): PrimeIntellectTrace {\n const trace = object(value, `PrimeIntellect trace line ${line}`)\n nonEmptyString(trace.id, `PrimeIntellect trace line ${line}.id`)\n const task = object(trace.task, `PrimeIntellect trace line ${line}.task`)\n nonEmptyString(task.type, `PrimeIntellect trace line ${line}.task.type`)\n const data = object(task.data, `PrimeIntellect trace line ${line}.task.data`)\n if (!Number.isSafeInteger(data.idx) || (data.idx as number) < 0) {\n throw new Error(\n `PrimeIntellect trace line ${line}.task.data.idx must be a non-negative integer`,\n )\n }\n if (!Array.isArray(trace.nodes)) {\n throw new Error(`PrimeIntellect trace line ${line}.nodes must be an array`)\n }\n for (const [index, rawNode] of trace.nodes.entries()) {\n const node = object(rawNode, `PrimeIntellect trace line ${line}.nodes[${index}]`)\n const parent = node.parent\n if (\n parent !== undefined &&\n parent !== null &&\n (!Number.isSafeInteger(parent) || (parent as number) < 0 || (parent as number) >= index)\n ) {\n throw new Error(\n `PrimeIntellect trace line ${line}.nodes[${index}].parent must reference an earlier node`,\n )\n }\n if (node.sampled !== undefined && typeof node.sampled !== 'boolean') {\n throw new Error(`PrimeIntellect trace line ${line}.nodes[${index}].sampled must be boolean`)\n }\n if (node.usage !== undefined && node.usage !== null) {\n validateUsage(node.usage, `PrimeIntellect trace line ${line}.nodes[${index}].usage`)\n }\n }\n validateNumberMap(trace.rewards, `PrimeIntellect trace line ${line}.rewards`)\n validateNumberMap(trace.metrics, `PrimeIntellect trace line ${line}.metrics`)\n if (trace.extra_usage !== undefined && !Array.isArray(trace.extra_usage)) {\n throw new Error(`PrimeIntellect trace line ${line}.extra_usage must be an array`)\n }\n for (const [index, usage] of (trace.extra_usage ?? []).entries()) {\n validateUsage(usage, `PrimeIntellect trace line ${line}.extra_usage[${index}]`)\n }\n if (trace.errors !== undefined && !Array.isArray(trace.errors)) {\n throw new Error(`PrimeIntellect trace line ${line}.errors must be an array`)\n }\n for (const [index, rawError] of (trace.errors ?? []).entries()) {\n const error = object(rawError, `PrimeIntellect trace line ${line}.errors[${index}]`)\n nonEmptyString(error.type, `PrimeIntellect trace line ${line}.errors[${index}].type`)\n nonEmptyString(error.message, `PrimeIntellect trace line ${line}.errors[${index}].message`)\n if (\n error.traceback !== undefined &&\n error.traceback !== null &&\n typeof error.traceback !== 'string'\n ) {\n throw new Error(\n `PrimeIntellect trace line ${line}.errors[${index}].traceback must be a string or null`,\n )\n }\n }\n if (trace.is_completed !== undefined && typeof trace.is_completed !== 'boolean') {\n throw new Error(`PrimeIntellect trace line ${line}.is_completed must be boolean`)\n }\n if (\n trace.stop_condition !== undefined &&\n trace.stop_condition !== null &&\n typeof trace.stop_condition !== 'string'\n ) {\n throw new Error(`PrimeIntellect trace line ${line}.stop_condition must be a string or null`)\n }\n if (trace.timing !== undefined) validateTiming(trace.timing, line)\n return value as PrimeIntellectTrace\n}\n\nfunction validateTiming(value: unknown, line: number): void {\n const timing = object(value, `PrimeIntellect trace line ${line}.timing`)\n optionalFinite(timing.start, `PrimeIntellect trace line ${line}.timing.start`)\n for (const phase of ['setup', 'generation', 'finalize', 'scoring']) {\n if (timing[phase] === undefined) continue\n const span = object(timing[phase], `PrimeIntellect trace line ${line}.timing.${phase}`)\n optionalFinite(span.start, `PrimeIntellect trace line ${line}.timing.${phase}.start`)\n optionalFinite(span.end, `PrimeIntellect trace line ${line}.timing.${phase}.end`)\n }\n}\n\nfunction aggregateUsage(usages: PrimeUsage[]): {\n input: number\n output: number\n reasoning?: number\n cached?: number\n reportedCostUsd: number\n costComplete: boolean\n} {\n let input = 0\n let output = 0\n let reasoning = 0\n let cached = 0\n let costUsd = 0\n let sawReasoning = false\n let sawCached = false\n let costsReported = 0\n for (const [index, usage] of usages.entries()) {\n const prompt = nonNegative(usage.prompt_tokens, `usage[${index}].prompt_tokens`)\n const completion = nonNegative(usage.completion_tokens, `usage[${index}].completion_tokens`)\n const cachedInput = optionalNonNegative(\n usage.cached_input_tokens,\n `usage[${index}].cached_input_tokens`,\n )\n const reasoningTokens = optionalNonNegative(\n usage.reasoning_tokens,\n `usage[${index}].reasoning_tokens`,\n )\n const cost = optionalNonNegative(usage.cost, `usage[${index}].cost`)\n input += prompt + (cachedInput ?? 0)\n output += completion\n if (cachedInput !== undefined) {\n cached += cachedInput\n sawCached = true\n }\n if (reasoningTokens !== undefined) {\n reasoning += reasoningTokens\n sawReasoning = true\n }\n if (cost !== undefined) {\n costUsd += cost\n costsReported += 1\n }\n }\n if (reasoning > output) {\n throw new Error(\n `PrimeIntellect reasoning token total ${reasoning} exceeds output total ${output}`,\n )\n }\n return {\n input,\n output,\n ...(sawReasoning ? { reasoning } : {}),\n ...(sawCached ? { cached } : {}),\n reportedCostUsd: costUsd,\n costComplete: usages.length > 0 && costsReported === usages.length,\n }\n}\n\nfunction validateUsage(value: unknown, path: string): void {\n const usage = object(value, path)\n nonNegative(usage.prompt_tokens, `${path}.prompt_tokens`)\n nonNegative(usage.completion_tokens, `${path}.completion_tokens`)\n optionalNonNegative(usage.cached_input_tokens, `${path}.cached_input_tokens`)\n optionalNonNegative(usage.reasoning_tokens, `${path}.reasoning_tokens`)\n optionalNonNegative(usage.cost, `${path}.cost`)\n}\n\nfunction traceWallMs(trace: PrimeIntellectTrace): number {\n const timing = trace.timing\n if (!timing || typeof timing.start !== 'number' || !Number.isFinite(timing.start)) return 0\n const ends = [\n timing.setup?.end,\n timing.generation?.end,\n timing.finalize?.end,\n timing.scoring?.end,\n ].filter((value): value is number => typeof value === 'number' && Number.isFinite(value))\n if (ends.length === 0) return 0\n return Math.max(0, (Math.max(...ends) - timing.start) * 1000)\n}\n\nfunction countBranches(nodes: PrimeTraceNode[]): number {\n if (nodes.length === 0) return 0\n const parents = new Set(\n nodes\n .map((node) => node.parent)\n .filter(\n (parent): parent is number => Number.isSafeInteger(parent) && (parent as number) >= 0,\n ),\n )\n return nodes.reduce((count, _node, index) => count + (parents.has(index) ? 0 : 1), 0)\n}\n\nfunction validateNumberMap(value: unknown, path: string): void {\n const map = object(value, path)\n for (const [key, entry] of Object.entries(map)) finite(entry, `${path}.${key}`)\n}\n\nfunction sumFinite(values: unknown[], path: string): number {\n return values.reduce<number>((sum, value, index) => sum + finite(value, `${path}[${index}]`), 0)\n}\n\nfunction finite(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`${path} must be a finite number`)\n }\n return value\n}\n\nfunction nonNegative(value: unknown, path: string): number {\n const parsed = finite(value, path)\n if (parsed < 0) throw new Error(`${path} must be non-negative`)\n return parsed\n}\n\nfunction optionalNonNegative(value: unknown, path: string): number | undefined {\n if (value === undefined || value === null) return undefined\n return nonNegative(value, path)\n}\n\nfunction optionalFinite(value: unknown, path: string): number | undefined {\n if (value === undefined || value === null) return undefined\n return finite(value, path)\n}\n\nfunction object(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n"],"mappings":"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","names":["record","nonEmptyString","record","nonEmptyString"]}
1
+ {"version":3,"sources":["../../src/primeintellect/package.ts","../../src/primeintellect/validation.ts","../../src/primeintellect/runner.ts","../../src/primeintellect/traces.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto'\nimport { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, join, normalize, relative, resolve, sep } from 'node:path'\nimport { canonicalJson } from '@tangle-network/agent-eval'\nimport type {\n PrimeIntellectJson,\n PrimeIntellectPackageBundle,\n PrimeIntellectPackageManifest,\n PrimeIntellectPackageOptions,\n PrimeIntellectScoring,\n PrimeIntellectTask,\n} from './types'\nimport { validatePrimeIntellectJson, validatePrimeIntellectPrompt } from './validation'\n\nconst VERIFIERS_RANGE = '>=0.2.0,<0.3.0' as const\nconst ENV_NAME = /^[A-Z_][A-Z0-9_]*$/\nconst PACKAGE_NAME = /^[a-z][a-z0-9-]{0,62}$/\nconst VERSION = /^\\d+\\.\\d+\\.\\d+(?:[-+][a-zA-Z0-9.-]+)?$/\nconst DEFAULT_MAX_TURNS = 16\nconst DEFAULT_ROLLOUT_TIMEOUT = 3_600\nconst DEFAULT_SCORING_TIMEOUT = 300\n\nexport interface WritePrimeIntellectPackageOptions {\n /** Replace an existing generated package and restore it if the final swap fails. */\n replace?: boolean\n}\n\n/** Build a complete PrimeIntellect Verifiers v1 package without writing to disk. */\nexport function createPrimeIntellectPackage(\n options: PrimeIntellectPackageOptions,\n): PrimeIntellectPackageBundle {\n const validated = validateOptions(options)\n const moduleName = validated.name.replaceAll('-', '_')\n const rows = validated.tasks.map((task, idx) => taskRow(task, idx))\n const runnerFiles = validated.runner.files ?? {}\n const scoringFiles = validated.scoring.kind === 'command' ? (validated.scoring.files ?? {}) : {}\n const files: Record<string, string> = {\n 'pyproject.toml': renderPyproject(validated, moduleName),\n 'prime.eval.toml': renderPrimeConfig(validated, 'eval'),\n 'prime.train.toml': renderPrimeConfig(validated, 'train'),\n 'README.md': renderReadme(validated),\n [`${moduleName}/__init__.py`]: renderInit(moduleName),\n [`${moduleName}/taskset.py`]: renderTaskset(moduleName, validated.scoring),\n [`${moduleName}/harness.py`]: renderHarness(moduleName),\n [`${moduleName}/tasks.jsonl`]: `${rows.map((row) => JSON.stringify(row)).join('\\n')}\\n`,\n [`${moduleName}/runner.json`]: `${JSON.stringify(\n {\n command: validated.runner.command,\n files: runnerFiles,\n setup: validated.runner.setup ?? [],\n forwardEnv: validated.runner.forwardEnv ?? [],\n },\n null,\n 2,\n )}\\n`,\n }\n for (const [path, contents] of Object.entries(scoringFiles)) {\n files[`${moduleName}/scoring/${path}`] = contents\n }\n\n const filesSha256 = Object.fromEntries(\n Object.entries(files)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([path, contents]) => [path, sha256(contents)]),\n )\n const manifest: PrimeIntellectPackageManifest = {\n schema: 'tangle.primeintellect.package/v1',\n name: validated.name,\n moduleName,\n version: validated.version,\n verifiers: VERIFIERS_RANGE,\n taskCount: validated.tasks.length,\n splits: {\n train: validated.tasks.filter((task) => task.split === 'train').length,\n eval: validated.tasks.filter((task) => task.split === 'eval').length,\n },\n taskIdsSha256: sha256(\n validated.tasks\n .map((task) => `${task.split}:${task.id}`)\n .sort()\n .join('\\n'),\n ),\n filesSha256,\n }\n files['manifest.json'] = `${JSON.stringify(manifest, null, 2)}\\n`\n return { manifest, files: Object.freeze(files) }\n}\n\n/** Write a bundle through a sibling temporary directory, then rename it into place. */\nexport async function writePrimeIntellectPackage(\n bundle: PrimeIntellectPackageBundle,\n outputDirectory: string,\n options: WritePrimeIntellectPackageOptions = {},\n): Promise<string> {\n const output = resolve(outputDirectory)\n const parent = dirname(output)\n await mkdir(parent, { recursive: true })\n const replacing = await pathExists(output)\n if (replacing) {\n if (!options.replace) throw new Error(`PrimeIntellect output already exists: ${output}`)\n await assertGeneratedPackage(output)\n }\n\n const temporary = join(parent, `.${basename(output)}.${randomUUID()}.tmp`)\n const backup = replacing ? join(parent, `.${basename(output)}.${randomUUID()}.backup`) : undefined\n try {\n await mkdir(temporary)\n for (const [path, contents] of Object.entries(bundle.files)) {\n assertRelativePath(path, 'bundle file')\n const target = resolve(temporary, path)\n if (target !== temporary && !target.startsWith(`${temporary}${sep}`)) {\n throw new Error(`bundle file escapes output directory: ${path}`)\n }\n await mkdir(dirname(target), { recursive: true })\n await writeFile(target, contents, 'utf8')\n }\n if (backup) await rename(output, backup)\n try {\n await rename(temporary, output)\n } catch (error) {\n if (backup) {\n try {\n await rename(backup, output)\n } catch (restoreError) {\n throw new AggregateError(\n [error, restoreError],\n `failed to install PrimeIntellect package and restore ${output}`,\n )\n }\n }\n throw error\n }\n if (backup) await rm(backup, { recursive: true })\n } catch (error) {\n await rm(temporary, { recursive: true, force: true })\n throw error\n }\n return output\n}\n\nfunction validateOptions(options: PrimeIntellectPackageOptions): PrimeIntellectPackageOptions {\n if (!PACKAGE_NAME.test(options.name)) {\n throw new Error('PrimeIntellect package name must match /^[a-z][a-z0-9-]{0,62}$/')\n }\n if (!VERSION.test(options.version)) {\n throw new Error('PrimeIntellect package version must be a numeric semantic version')\n }\n if (!Array.isArray(options.tasks) || options.tasks.length === 0) {\n throw new Error('PrimeIntellect package requires tasks')\n }\n const tasks: readonly PrimeIntellectTask[] = options.tasks\n const seen = new Set<string>()\n const seenInputs = new Map<string, { id: string; split: PrimeIntellectTask['split'] }>()\n const splitCounts = { train: 0, eval: 0 }\n for (const [index, task] of tasks.entries()) {\n validateTask(task, index, options.scoring)\n if (seen.has(task.id)) throw new Error(`duplicate PrimeIntellect task id: ${task.id}`)\n seen.add(task.id)\n const input = canonicalJson({\n prompt: task.prompt,\n systemPrompt: task.systemPrompt ?? null,\n metadata: task.metadata ?? {},\n })\n const duplicate = seenInputs.get(input)\n if (duplicate) {\n throw new Error(\n `PrimeIntellect tasks ${duplicate.id} (${duplicate.split}) and ${task.id} (${task.split}) expose the same public input`,\n )\n }\n seenInputs.set(input, { id: task.id, split: task.split })\n splitCounts[task.split] += 1\n }\n if (splitCounts.train === 0 || splitCounts.eval === 0) {\n throw new Error('PrimeIntellect package requires non-empty, disjoint train and eval splits')\n }\n validateScoring(options.scoring)\n validateCommand(options.runner.command, 'runner.command')\n validateFiles(options.runner.files ?? {}, 'runner.files')\n for (const [index, command] of (options.runner.setup ?? []).entries()) {\n validateCommand(command, `runner.setup[${index}]`)\n }\n validateEnvNames(options.runner.forwardEnv ?? [], 'runner.forwardEnv')\n if (typeof options.runner.image !== 'string' || options.runner.image.trim().length === 0) {\n throw new Error('runner.image must be a non-empty container image')\n }\n if (/(^|:)latest$/i.test(options.runner.image)) {\n throw new Error('runner.image must not use the mutable latest tag')\n }\n positiveInteger(options.maxTurns ?? DEFAULT_MAX_TURNS, 'maxTurns')\n for (const [name, value] of [\n ['maxInputTokens', options.maxInputTokens],\n ['maxOutputTokens', options.maxOutputTokens],\n ['maxTotalTokens', options.maxTotalTokens],\n ] as const) {\n if (value !== undefined) positiveInteger(value, name)\n }\n positiveNumber(options.rolloutTimeoutSeconds ?? DEFAULT_ROLLOUT_TIMEOUT, 'rolloutTimeoutSeconds')\n positiveNumber(options.scoringTimeoutSeconds ?? DEFAULT_SCORING_TIMEOUT, 'scoringTimeoutSeconds')\n return options\n}\n\nfunction validateTask(\n task: PrimeIntellectTask,\n index: number,\n scoring: PrimeIntellectScoring,\n): void {\n const path = `tasks[${index}]`\n if (typeof task.id !== 'string' || task.id.trim().length === 0) {\n throw new Error(`${path}.id must be a non-empty string`)\n }\n if (task.split !== 'train' && task.split !== 'eval') {\n throw new Error(`${path}.split must be train or eval`)\n }\n const prompt = validatePrimeIntellectPrompt(task.prompt, `${path}.prompt`)\n if (Array.isArray(prompt)) {\n if (task.systemPrompt !== undefined && prompt.some((message) => message.role === 'system')) {\n throw new Error(`${path} must not set systemPrompt and include a system message`)\n }\n }\n if (task.systemPrompt !== undefined && typeof task.systemPrompt !== 'string') {\n throw new Error(`${path}.systemPrompt must be a string`)\n }\n if (task.metadata !== undefined) {\n validatePrimeIntellectJson(task.metadata, `${path}.metadata`)\n }\n if (scoring.kind !== 'command') {\n const answers = Array.isArray(task.answer) ? task.answer : [task.answer]\n if (\n answers.length === 0 ||\n answers.some((answer) => typeof answer !== 'string' || answer.length === 0)\n ) {\n throw new Error(`${path}.answer is required for ${scoring.kind} scoring`)\n }\n }\n}\n\nfunction validateScoring(scoring: PrimeIntellectScoring): void {\n if (scoring.kind === 'exact') return\n if (scoring.kind === 'reference-judge') {\n if (typeof scoring.model !== 'string' || scoring.model.length === 0) {\n throw new Error('reference-judge scoring requires a model')\n }\n return\n }\n validateCommand(scoring.command, 'scoring.command')\n validateFiles(scoring.files ?? {}, 'scoring.files')\n validateEnvNames(scoring.forwardEnv ?? [], 'scoring.forwardEnv')\n positiveNumber(scoring.timeoutSeconds ?? DEFAULT_SCORING_TIMEOUT, 'scoring.timeoutSeconds')\n}\n\nfunction validateCommand(command: readonly string[], path: string): void {\n if (!Array.isArray(command) || command.length === 0) {\n throw new Error(`${path} must be a non-empty argv array`)\n }\n for (const [index, argument] of command.entries()) {\n if (typeof argument !== 'string' || argument.length === 0 || argument.includes('\\0')) {\n throw new Error(`${path}[${index}] must be a non-empty string without NUL bytes`)\n }\n }\n}\n\nfunction validateFiles(files: Readonly<Record<string, string>>, path: string): void {\n for (const [file, contents] of Object.entries(files)) {\n assertRelativePath(file, path)\n if (typeof contents !== 'string') throw new Error(`${path}.${file} must be a string`)\n }\n}\n\nfunction validateEnvNames(names: readonly string[], path: string): void {\n const seen = new Set<string>()\n for (const [index, name] of names.entries()) {\n if (!ENV_NAME.test(name)) throw new Error(`${path}[${index}] is not a valid environment name`)\n if (seen.has(name)) throw new Error(`${path} contains duplicate name ${name}`)\n seen.add(name)\n }\n}\n\nfunction assertRelativePath(path: string, label: string): void {\n const normalized = normalize(path)\n if (\n path.length === 0 ||\n path.includes('\\0') ||\n isAbsolute(path) ||\n normalized === '..' ||\n normalized.startsWith(`..${sep}`) ||\n relative('.', normalized).startsWith('..')\n ) {\n throw new Error(`${label} contains unsafe path: ${path}`)\n }\n}\n\nfunction taskRow(task: PrimeIntellectTask, idx: number): Record<string, PrimeIntellectJson> {\n return {\n idx,\n name: task.id,\n prompt: task.prompt as PrimeIntellectJson,\n system_prompt: task.systemPrompt ?? null,\n split: task.split,\n answer: task.answer ?? null,\n metadata: task.metadata ?? {},\n }\n}\n\nfunction renderPyproject(options: PrimeIntellectPackageOptions, moduleName: string): string {\n const description = options.description ?? `PrimeIntellect tasks for ${options.name}`\n return `[project]\\nname = ${toml(options.name)}\\nversion = ${toml(options.version)}\\ndescription = ${toml(description)}\\nrequires-python = \">=3.11,<3.14\"\\ndependencies = [\"verifiers${VERIFIERS_RANGE}\"]\\n\\n[build-system]\\nrequires = [\"hatchling\"]\\nbuild-backend = \"hatchling.build\"\\n\\n[tool.hatch.build.targets.wheel]\\npackages = [${toml(moduleName)}]\\n\\n[tool.uv]\\nprerelease = \"allow\"\\n`\n}\n\nfunction renderPrimeConfig(options: PrimeIntellectPackageOptions, split: 'train' | 'eval'): string {\n const limits = [\n `max_turns = ${options.maxTurns ?? DEFAULT_MAX_TURNS}`,\n options.maxInputTokens === undefined\n ? undefined\n : `max_input_tokens = ${options.maxInputTokens}`,\n options.maxOutputTokens === undefined\n ? undefined\n : `max_output_tokens = ${options.maxOutputTokens}`,\n options.maxTotalTokens === undefined\n ? undefined\n : `max_total_tokens = ${options.maxTotalTokens}`,\n ].filter((line): line is string => line !== undefined)\n return `${limits.join('\\n')}\\npush = false\\n\\n[timeout]\\nrollout = ${options.rolloutTimeoutSeconds ?? DEFAULT_ROLLOUT_TIMEOUT}\\nscoring = ${options.scoringTimeoutSeconds ?? DEFAULT_SCORING_TIMEOUT}\\n\\n[taskset]\\nid = ${toml(options.name)}\\nsplit = ${toml(split)}\\n\\n[harness]\\nid = ${toml(options.name)}\\nprogram = ${tomlArray(options.runner.command)}\\nforward_env = ${tomlArray(options.runner.forwardEnv ?? [])}\\n\\n[harness.runtime]\\ntype = \"docker\"\\nimage = ${toml(options.runner.image)}\\n`\n}\n\nfunction renderInit(moduleName: string): string {\n return `from ${moduleName}.harness import TangleRuntimeHarness\\nfrom ${moduleName}.taskset import TangleTaskset\\n\\n__all__ = [\"TangleRuntimeHarness\", \"TangleTaskset\"]\\n`\n}\n\nfunction renderTaskset(moduleName: string, scoring: PrimeIntellectScoring): string {\n const config = scoringConfig(scoring)\n return `import asyncio\\nimport json\\nimport math\\nimport os\\nfrom importlib.resources import files\\nfrom pathlib import Path\\nfrom typing import Any, Literal\\n\\nimport verifiers.v1 as vf\\n\\nSCORING = json.loads(${pythonString(JSON.stringify(config))})\\nPACKAGE_ROOT = Path(__file__).resolve().parent\\n\\n\\nclass TangleTaskData(vf.TaskData):\\n split: Literal[\"train\", \"eval\"]\\n answer: str | list[str] | None = None\\n metadata: dict[str, Any] = {}\\n\\n\\nclass TangleTaskConfig(vf.TaskConfig):\\n scoring: Literal[\"exact\", \"reference-judge\", \"command\"] = SCORING[\"kind\"]\\n normalization: Literal[\"none\", \"trim\", \"trim-casefold\"] = SCORING.get(\"normalization\", \"trim\")\\n judge_model: str = SCORING.get(\"model\", \"openai/gpt-5.4-nano\")\\n judge_prompt: str | None = SCORING.get(\"prompt\")\\n judge_view: Literal[\"last_reply\", \"full_trace\"] = SCORING.get(\"view\", \"last_reply\")\\n score_program: list[str] = SCORING.get(\"command\", [])\\n score_forward_env: list[str] = SCORING.get(\"forwardEnv\", [])\\n score_timeout_seconds: float = SCORING.get(\"timeoutSeconds\", 300)\\n\\n\\ndef _normalize(value: str, mode: str) -> str:\\n if mode == \"none\":\\n return value\\n value = value.strip()\\n return value.casefold() if mode == \"trim-casefold\" else value\\n\\n\\nasync def _run_score_command(config: TangleTaskConfig, data: TangleTaskData, trace: vf.Trace) -> float:\\n if not config.score_program:\\n raise ValueError(\"command scoring requires score_program\")\\n safe_env = {\\n key: os.environ[key]\\n for key in (\"PATH\", \"HOME\", \"TMPDIR\", \"LANG\")\\n if key in os.environ\\n }\\n safe_env.update(\\n {key: os.environ[key] for key in config.score_forward_env if key in os.environ}\\n )\\n request = {\\n \"protocol\": \"tangle.primeintellect.score/v1\",\\n \"task\": data.model_dump(mode=\"json\", exclude_none=True),\\n \"trace\": trace.model_dump(mode=\"json\", exclude_none=True),\\n }\\n process = await asyncio.create_subprocess_exec(\\n *config.score_program,\\n cwd=PACKAGE_ROOT,\\n env=safe_env,\\n stdin=asyncio.subprocess.PIPE,\\n stdout=asyncio.subprocess.PIPE,\\n stderr=asyncio.subprocess.PIPE,\\n )\\n payload = json.dumps(request, separators=(\",\", \":\")).encode()\\n try:\\n stdout, stderr = await asyncio.wait_for(\\n process.communicate(payload), timeout=config.score_timeout_seconds\\n )\\n except TimeoutError:\\n process.kill()\\n await process.communicate()\\n raise RuntimeError(\\n f\"score command timed out after {config.score_timeout_seconds}s\"\\n )\\n if process.returncode != 0:\\n detail = (stderr or stdout).decode(errors=\"replace\").strip()[-2000:]\\n raise RuntimeError(f\"score command exited {process.returncode}: {detail}\")\\n try:\\n result = json.loads(stdout)\\n except json.JSONDecodeError as error:\\n raise ValueError(f\"score command returned invalid JSON: {error}\") from error\\n if not isinstance(result, dict):\\n raise ValueError(\"score command must return an object\")\\n reward = result.get(\"reward\")\\n if isinstance(reward, bool) or not isinstance(reward, (int, float)) or not math.isfinite(reward):\\n raise ValueError(\"score command reward must be a finite number\")\\n metrics = result.get(\"metrics\", {})\\n if not isinstance(metrics, dict):\\n raise ValueError(\"score command metrics must be an object\")\\n for name, value in metrics.items():\\n if isinstance(value, bool) or not isinstance(value, (int, float)) or not math.isfinite(value):\\n raise ValueError(f\"score command metric {name!r} must be a finite number\")\\n trace.record_metrics(metrics)\\n return float(reward)\\n\\n\\nclass TangleTask(vf.Task[TangleTaskData, vf.State, TangleTaskConfig]):\\n @vf.reward(weight=1.0)\\n async def task_reward(self, trace: vf.Trace) -> float:\\n if self.config.scoring == \"command\":\\n return await _run_score_command(self.config, self.data, trace)\\n if self.data.answer is None:\\n raise ValueError(f\"task {self.data.name!r} has no reference answer\")\\n if self.config.scoring == \"reference-judge\":\\n judge = vf.ReferenceJudge(\\n vf.ReferenceJudgeConfig(\\n model=self.config.judge_model,\\n prompt=self.config.judge_prompt,\\n view=self.config.judge_view,\\n )\\n )\\n return await judge.score(self.data, trace)\\n expected = self.data.answer if isinstance(self.data.answer, list) else [self.data.answer]\\n actual = _normalize(trace.last_reply, self.config.normalization)\\n return float(any(actual == _normalize(answer, self.config.normalization) for answer in expected))\\n\\n\\nclass TangleTasksetConfig(vf.TasksetConfig):\\n split: Literal[\"train\", \"eval\"] = \"eval\"\\n task: TangleTaskConfig = TangleTaskConfig()\\n\\n\\nclass TangleTaskset(vf.Taskset[TangleTask, TangleTasksetConfig]):\\n def load(self) -> list[TangleTask]:\\n resource = files(${pythonString(moduleName)}).joinpath(\"tasks.jsonl\")\\n tasks: list[TangleTask] = []\\n with resource.open(\"r\", encoding=\"utf-8\") as handle:\\n for line in handle:\\n if not line.strip():\\n continue\\n row = json.loads(line)\\n if row[\"split\"] != self.config.split:\\n continue\\n tasks.append(TangleTask(TangleTaskData.model_validate(row), self.config.task))\\n if not tasks:\\n raise ValueError(f\"task split {self.config.split!r} is empty\")\\n return tasks\\n\\n\\n__all__ = [\"TangleTaskset\"]\\n`\n}\n\nfunction renderHarness(moduleName: string): string {\n return `import json\\nfrom importlib.resources import files\\n\\nimport verifiers.v1 as vf\\n\\nRUNNER = json.loads(files(${pythonString(moduleName)}).joinpath(\"runner.json\").read_text(encoding=\"utf-8\"))\\n\\n\\nclass TangleRuntimeHarnessConfig(vf.HarnessConfig):\\n program: list[str] = RUNNER[\"command\"]\\n setup_commands: list[list[str]] = RUNNER[\"setup\"]\\n forward_env: list[str] = RUNNER[\"forwardEnv\"]\\n\\n\\nclass TangleRuntimeHarness(vf.Harness[TangleRuntimeHarnessConfig]):\\n APPENDS_SYSTEM_PROMPT = True\\n SUPPORTS_MCP = True\\n SUPPORTS_MESSAGE_PROMPT = True\\n\\n async def setup(self, runtime: vf.Runtime) -> None:\\n for path, contents in RUNNER[\"files\"].items():\\n await runtime.write(path, contents.encode())\\n for command in self.config.setup_commands:\\n result = await runtime.run(command, self.config.resolved_env)\\n if result.exit_code != 0:\\n detail = (result.stderr or result.stdout).strip()[-2000:]\\n raise RuntimeError(\\n f\"runner setup command {command[0]!r} exited {result.exit_code}: {detail}\"\\n )\\n\\n async def launch(\\n self,\\n ctx: vf.ModelContext,\\n trace: vf.Trace,\\n runtime: vf.Runtime,\\n endpoint: str,\\n secret: str,\\n mcp_urls: dict[str, str],\\n ) -> vf.ProgramResult:\\n data = trace.task.data\\n public_task = {\\n \"id\": data.name or str(data.idx),\\n \"split\": data.split,\\n \"prompt\": data.prompt,\\n \"metadata\": data.metadata,\\n }\\n if data.system_prompt is not None:\\n public_task[\"systemPrompt\"] = data.system_prompt\\n env = {\\n **self.config.resolved_env,\\n \"OPENAI_BASE_URL\": endpoint,\\n \"OPENAI_API_KEY\": secret,\\n \"OPENAI_MODEL\": ctx.model,\\n \"TANGLE_PRIME_TASK_JSON\": json.dumps(public_task, separators=(\",\", \":\")),\\n \"TANGLE_PRIME_MCP_SERVERS_JSON\": json.dumps(mcp_urls, separators=(\",\", \":\")),\\n }\\n if not self.config.program:\\n raise ValueError(\"Tangle runtime harness requires a program argv\")\\n return await runtime.run_program(self.config.program, env)\\n\\n\\n__all__ = [\"TangleRuntimeHarness\"]\\n`\n}\n\nfunction scoringConfig(scoring: PrimeIntellectScoring): Record<string, PrimeIntellectJson> {\n if (scoring.kind === 'exact') {\n return { kind: scoring.kind, normalization: scoring.normalization ?? 'trim' }\n }\n if (scoring.kind === 'reference-judge') {\n return {\n kind: scoring.kind,\n model: scoring.model,\n prompt: scoring.prompt ?? null,\n view: scoring.view ?? 'last_reply',\n }\n }\n return {\n kind: scoring.kind,\n command: [...scoring.command],\n forwardEnv: [...(scoring.forwardEnv ?? [])],\n timeoutSeconds: scoring.timeoutSeconds ?? DEFAULT_SCORING_TIMEOUT,\n }\n}\n\nfunction renderReadme(options: PrimeIntellectPackageOptions): string {\n return `# ${options.name}\\n\\nPrimeIntellect Verifiers v1 tasks that run the caller's Tangle agent program.\\n\\n## Evaluate\\n\\n\\`\\`\\`bash\\nuv run eval @ prime.eval.toml --model <provider/model-snapshot>\\n\\`\\`\\`\\n\\n## Train\\n\\nUse \\`prime.train.toml\\` as the environment config for Prime RL. The train and eval rows are disjoint and selected by \\`taskset.split\\`.\\n\\nThe runner receives only the prompt, metadata, intercepted model endpoint, and MCP URLs. Reference answers remain in the task process and are never written into the runner workspace or environment.\\n`\n}\n\nfunction toml(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction tomlArray(values: readonly string[]): string {\n return `[${values.map(toml).join(', ')}]`\n}\n\nfunction pythonString(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction positiveInteger(value: number, path: string): void {\n if (!Number.isSafeInteger(value) || value <= 0)\n throw new Error(`${path} must be a positive integer`)\n}\n\nfunction positiveNumber(value: number, path: string): void {\n if (!Number.isFinite(value) || value <= 0) throw new Error(`${path} must be positive`)\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false\n throw error\n }\n}\n\nasync function assertGeneratedPackage(output: string): Promise<void> {\n let manifest: unknown\n try {\n manifest = JSON.parse(await readFile(join(output, 'manifest.json'), 'utf8'))\n } catch (error) {\n throw new Error(\n `refusing to replace ${output}: it is not a generated PrimeIntellect package (${error instanceof Error ? error.message : String(error)})`,\n )\n }\n if (\n manifest === null ||\n typeof manifest !== 'object' ||\n (manifest as Record<string, unknown>).schema !== 'tangle.primeintellect.package/v1'\n ) {\n throw new Error(`refusing to replace ${output}: manifest schema does not match`)\n }\n}\n\nfunction sha256(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex')\n}\n","import type { PrimeIntellectJson, PrimeIntellectMessage } from './types'\n\n/** Validate the Verifiers v1 prompt schema shared by package creation and runner input. */\nexport function validatePrimeIntellectPrompt(\n value: unknown,\n path: string,\n): string | PrimeIntellectMessage[] {\n if (typeof value === 'string' && value.length > 0) return value\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${path} must be a non-empty string or message array`)\n }\n for (const [index, message] of value.entries()) {\n validateMessage(message, `${path}[${index}]`)\n }\n return value as PrimeIntellectMessage[]\n}\n\nexport function validatePrimeIntellectJson(value: unknown, path: string): void {\n if (value === null || ['string', 'boolean'].includes(typeof value)) return\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) throw new Error(`${path} contains a non-finite number`)\n return\n }\n if (Array.isArray(value)) {\n value.forEach((entry, index) => {\n validatePrimeIntellectJson(entry, `${path}[${index}]`)\n })\n return\n }\n if (typeof value === 'object') {\n for (const [key, entry] of Object.entries(value)) {\n validatePrimeIntellectJson(entry, `${path}.${key}`)\n }\n return\n }\n throw new Error(`${path} is not JSON serializable`)\n}\n\nexport function validatePrimeIntellectJsonObject(\n value: unknown,\n path: string,\n): Record<string, PrimeIntellectJson> {\n const output = record(value, path)\n validatePrimeIntellectJson(output, path)\n return output as Record<string, PrimeIntellectJson>\n}\n\nfunction validateMessage(value: unknown, path: string): void {\n const message = record(value, path)\n const role = message.role\n if (!['system', 'user', 'assistant', 'tool'].includes(String(role))) {\n throw new Error(`${path}.role is invalid`)\n }\n if (role === 'system' || role === 'user') {\n assertOnlyKeys(message, ['role', 'content'], path)\n validateContent(message.content, `${path}.content`)\n } else if (role === 'assistant') {\n assertOnlyKeys(\n message,\n ['role', 'content', 'reasoning_content', 'tool_calls', 'provider_state'],\n path,\n )\n optionalNullableString(message.content, `${path}.content`)\n optionalNullableString(message.reasoning_content, `${path}.reasoning_content`)\n if (message.tool_calls !== undefined) {\n validateToolCalls(message.tool_calls, `${path}.tool_calls`)\n }\n if (message.provider_state !== undefined) {\n validateProviderState(message.provider_state, `${path}.provider_state`)\n }\n } else {\n assertOnlyKeys(message, ['role', 'tool_call_id', 'content', 'name'], path)\n nonEmptyString(message.tool_call_id, `${path}.tool_call_id`)\n if (message.name !== undefined && typeof message.name !== 'string') {\n throw new Error(`${path}.name must be a string`)\n }\n validateContent(message.content, `${path}.content`)\n }\n validatePrimeIntellectJson(message, path)\n}\n\nfunction validateToolCalls(value: unknown, path: string): void {\n if (!Array.isArray(value)) throw new Error(`${path} must be an array`)\n for (const [index, rawCall] of value.entries()) {\n const call = record(rawCall, `${path}[${index}]`)\n assertOnlyKeys(call, ['id', 'name', 'arguments'], `${path}[${index}]`)\n for (const field of ['id', 'name', 'arguments']) {\n nonEmptyString(call[field], `${path}[${index}].${field}`)\n }\n }\n}\n\nfunction validateProviderState(value: unknown, path: string): void {\n if (!Array.isArray(value)) throw new Error(`${path} must be an array`)\n for (const [index, rawState] of value.entries()) {\n const state = record(rawState, `${path}[${index}]`)\n validatePrimeIntellectJson(state, `${path}[${index}]`)\n }\n}\n\nfunction validateContent(value: unknown, path: string): void {\n if (typeof value === 'string') return\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error(`${path} must be a string or non-empty content array`)\n }\n for (const [index, rawPart] of value.entries()) {\n const part = record(rawPart, `${path}[${index}]`)\n if (part.type === 'text' && typeof part.text === 'string') {\n assertOnlyKeys(part, ['type', 'text'], `${path}[${index}]`)\n continue\n }\n const image = part.image_url\n if (\n part.type === 'image_url' &&\n image !== null &&\n typeof image === 'object' &&\n !Array.isArray(image) &&\n typeof (image as Record<string, unknown>).url === 'string'\n ) {\n assertOnlyKeys(part, ['type', 'image_url'], `${path}[${index}]`)\n assertOnlyKeys(image as Record<string, unknown>, ['url'], `${path}[${index}].image_url`)\n continue\n }\n throw new Error(`${path}[${index}] is not a supported text or image_url content part`)\n }\n}\n\nfunction optionalNullableString(value: unknown, path: string): void {\n if (value !== undefined && value !== null && typeof value !== 'string') {\n throw new Error(`${path} must be a string or null`)\n }\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction assertOnlyKeys(\n value: Record<string, unknown>,\n allowed: readonly string[],\n path: string,\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) throw new Error(`${path}.${key} is not supported`)\n }\n}\n","import { createOpenAICompatibleBackend } from '../backends'\nimport type {\n PrimeIntellectEpisodeContext,\n PrimeIntellectPublicTask,\n PrimeIntellectSplit,\n} from './types'\nimport { validatePrimeIntellectJsonObject, validatePrimeIntellectPrompt } from './validation'\n\nconst ENV = {\n task: 'TANGLE_PRIME_TASK_JSON',\n model: 'OPENAI_MODEL',\n baseUrl: 'OPENAI_BASE_URL',\n apiKey: 'OPENAI_API_KEY',\n mcpServers: 'TANGLE_PRIME_MCP_SERVERS_JSON',\n} as const\n\nexport interface RunPrimeIntellectProgramOptions {\n env?: NodeJS.ProcessEnv\n}\n\nexport type PrimeIntellectBackendOptions = Omit<\n Parameters<typeof createOpenAICompatibleBackend>[0],\n 'apiKey' | 'baseUrl' | 'model'\n>\n\n/** Read and validate the private process contract installed by the generated Prime harness. */\nexport function readPrimeIntellectEpisodeContext(\n env: NodeJS.ProcessEnv = process.env,\n): PrimeIntellectEpisodeContext {\n const rawTask = requiredEnv(env, ENV.task)\n const rawMcp = env[ENV.mcpServers] ?? '{}'\n const parsedTask = parseJson(rawTask, ENV.task)\n const parsedMcp = parseJson(rawMcp, ENV.mcpServers)\n const task = validatePublicTask(parsedTask)\n const mcpServers = validateStringMap(parsedMcp, ENV.mcpServers)\n\n return {\n protocol: 'tangle.primeintellect.episode/v1',\n task,\n model: {\n name: requiredEnv(env, ENV.model),\n baseUrl: requiredEnv(env, ENV.baseUrl),\n apiKey: requiredEnv(env, ENV.apiKey),\n },\n mcpServers,\n }\n}\n\n/** Build the existing runtime backend against Prime's intercepted model endpoint. */\nexport function createPrimeIntellectBackend(\n context: PrimeIntellectEpisodeContext,\n options: PrimeIntellectBackendOptions = {},\n) {\n return createOpenAICompatibleBackend({\n ...options,\n apiKey: context.model.apiKey,\n baseUrl: context.model.baseUrl,\n model: context.model.name,\n kind: options.kind ?? 'primeintellect',\n })\n}\n\n/**\n * Execute the caller's canonical runtime program inside a Prime rollout.\n * The callback may call runPersonified, runAgentic, runLoop, or any product wrapper.\n */\nexport async function runPrimeIntellectProgram<Result>(\n run: (context: PrimeIntellectEpisodeContext) => Promise<Result>,\n options: RunPrimeIntellectProgramOptions = {},\n): Promise<Result> {\n return run(readPrimeIntellectEpisodeContext(options.env))\n}\n\nfunction requiredEnv(env: NodeJS.ProcessEnv, name: string): string {\n const value = env[name]\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`PrimeIntellect runner requires ${name}`)\n }\n return value\n}\n\nfunction parseJson(value: string, name: string): unknown {\n try {\n return JSON.parse(value)\n } catch (error) {\n throw new Error(\n `${name} must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n}\n\nfunction validatePublicTask(value: unknown): PrimeIntellectPublicTask {\n const task = record(value, ENV.task)\n for (const privateField of ['answer', 'reference', 'scoring', 'score']) {\n if (privateField in task) {\n throw new Error(`${ENV.task} exposed private field ${privateField}`)\n }\n }\n for (const field of Object.keys(task)) {\n if (!['id', 'split', 'prompt', 'systemPrompt', 'metadata'].includes(field)) {\n throw new Error(`${ENV.task}.${field} is not supported`)\n }\n }\n const id = nonEmptyString(task.id, `${ENV.task}.id`)\n const split = validateSplit(task.split, `${ENV.task}.split`)\n const prompt = validatePrimeIntellectPrompt(task.prompt, `${ENV.task}.prompt`)\n const systemPrompt = optionalString(task.systemPrompt, `${ENV.task}.systemPrompt`)\n if (\n systemPrompt !== undefined &&\n Array.isArray(prompt) &&\n prompt.some((message) => message.role === 'system')\n ) {\n throw new Error(`${ENV.task} must not set systemPrompt and include a system message`)\n }\n const metadata =\n task.metadata === undefined\n ? undefined\n : validatePrimeIntellectJsonObject(task.metadata, `${ENV.task}.metadata`)\n return {\n id,\n split,\n prompt,\n ...(systemPrompt !== undefined ? { systemPrompt } : {}),\n ...(metadata !== undefined ? { metadata } : {}),\n }\n}\n\nfunction validateSplit(value: unknown, path: string): PrimeIntellectSplit {\n if (value !== 'train' && value !== 'eval') {\n throw new Error(`${path} must be train or eval`)\n }\n return value\n}\n\nfunction validateStringMap(value: unknown, path: string): Readonly<Record<string, string>> {\n const input = record(value, path)\n const output: Record<string, string> = {}\n for (const [key, entry] of Object.entries(input)) {\n if (typeof entry !== 'string' || entry.length === 0) {\n throw new Error(`${path}.${key} must be a non-empty string`)\n }\n output[key] = entry\n }\n return output\n}\n\nfunction record(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n\nfunction optionalString(value: unknown, path: string): string | undefined {\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new Error(`${path} must be a string`)\n return value\n}\n","import { type RunRecord, validateRunRecord } from '@tangle-network/agent-eval'\n\ninterface PrimeUsage {\n prompt_tokens: number\n completion_tokens: number\n cached_input_tokens?: number | null\n reasoning_tokens?: number | null\n cost?: number | null\n}\n\ninterface PrimeTraceNode {\n parent?: number | null\n sampled?: boolean\n usage?: PrimeUsage | null\n message?: unknown\n}\n\ninterface PrimeTimeSpan {\n start?: number\n end?: number\n}\n\nexport interface PrimeIntellectTrace {\n id: string\n task: {\n type: string\n data: {\n idx: number\n name?: string | null\n split?: 'train' | 'eval'\n prompt?: unknown\n system_prompt?: string | null\n metadata?: Record<string, unknown>\n [key: string]: unknown\n }\n }\n runtime?: unknown\n nodes: PrimeTraceNode[]\n rewards: Record<string, number>\n metrics: Record<string, number>\n info?: Record<string, unknown>\n extra_usage?: PrimeUsage[]\n is_completed?: boolean\n stop_condition?: string | null\n errors?: Array<{ type: string; message: string; traceback?: string | null }>\n timing?: {\n start?: number\n setup?: PrimeTimeSpan\n generation?: PrimeTimeSpan\n finalize?: PrimeTimeSpan\n scoring?: PrimeTimeSpan\n }\n}\n\nexport interface PrimeIntellectTraceImportOptions {\n experimentId: string\n candidateId: string\n seed: number\n /** Snapshot-pinned model id required by RunRecord validation. */\n model: string\n promptHash: string\n configHash: string\n commitSha: string\n}\n\nexport type PrimeIntellectImportDefaults = PrimeIntellectTraceImportOptions\n\n/** Parse Prime's durable `traces.jsonl` and reject malformed rows with a line number. */\nexport function parsePrimeIntellectTraces(jsonl: string): PrimeIntellectTrace[] {\n const traces: PrimeIntellectTrace[] = []\n for (const [lineIndex, line] of jsonl.split('\\n').entries()) {\n if (!line.trim()) continue\n let parsed: unknown\n try {\n parsed = JSON.parse(line)\n } catch (error) {\n throw new Error(\n `PrimeIntellect trace line ${lineIndex + 1} is invalid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n traces.push(validateTrace(parsed, lineIndex + 1))\n }\n if (traces.length === 0) throw new Error('PrimeIntellect traces.jsonl contains no traces')\n return traces\n}\n\n/** Convert all Prime traces to agent-eval RunRecords while retaining one shared run config. */\nexport function importPrimeIntellectTraces(\n jsonl: string,\n defaults: PrimeIntellectImportDefaults,\n): RunRecord[] {\n return parsePrimeIntellectTraces(jsonl).map((trace) =>\n primeIntellectTraceToRunRecord(trace, defaults),\n )\n}\n\n/** Project one complete Prime trace into the common agent-eval analysis row. */\nexport function primeIntellectTraceToRunRecord(\n trace: PrimeIntellectTrace,\n options: PrimeIntellectTraceImportOptions,\n): RunRecord {\n const split = trace.task.data.split\n if (split !== 'train' && split !== 'eval') {\n throw new Error(`PrimeIntellect trace ${trace.id} has no train/eval split`)\n }\n const reward = sumFinite(Object.values(trace.rewards), `trace ${trace.id} rewards`)\n const usage = aggregateUsage([\n ...trace.nodes.map((node) => node.usage).filter((value): value is PrimeUsage => value != null),\n ...(trace.extra_usage ?? []),\n ])\n const errors = trace.errors ?? []\n const raw: Record<string, number> = {\n reward,\n 'prime.turns': trace.nodes.filter((node) => node.sampled === true).length,\n 'prime.branches': countBranches(trace.nodes),\n 'prime.errors': errors.length,\n 'prime.completed': trace.is_completed ? 1 : 0,\n 'prime.cost_complete': usage.costComplete ? 1 : 0,\n 'prime.reported_cost_usd': usage.reportedCostUsd,\n }\n for (const [name, value] of Object.entries(trace.rewards)) {\n raw[`reward.${name}`] = finite(value, `trace ${trace.id} reward ${name}`)\n }\n for (const [name, value] of Object.entries(trace.metrics)) {\n raw[`metric.${name}`] = finite(value, `trace ${trace.id} metric ${name}`)\n }\n\n const record: RunRecord = {\n runId: trace.id,\n experimentId: options.experimentId,\n candidateId: options.candidateId,\n seed: options.seed,\n model: options.model,\n promptHash: options.promptHash,\n configHash: options.configHash,\n commitSha: options.commitSha,\n wallMs: traceWallMs(trace),\n costUsd: usage.costComplete ? usage.reportedCostUsd : 0,\n costProvenance: usage.costComplete\n ? { kind: 'observed', usd: usage.reportedCostUsd }\n : { kind: 'uncaptured', usd: null },\n tokenUsage: {\n input: usage.input,\n output: usage.output,\n ...(usage.reasoning !== undefined ? { reasoning: usage.reasoning } : {}),\n ...(usage.cached !== undefined ? { cached: usage.cached } : {}),\n },\n outcome: split === 'eval' ? { holdoutScore: reward, raw } : { searchScore: reward, raw },\n splitTag: split === 'eval' ? 'holdout' : 'search',\n scenarioId: trace.task.data.name ?? String(trace.task.data.idx),\n ...(errors[0] ? { failureMode: `primeintellect:${errors[0].type}:${errors[0].message}` } : {}),\n }\n return validateRunRecord(record)\n}\n\nfunction validateTrace(value: unknown, line: number): PrimeIntellectTrace {\n const trace = object(value, `PrimeIntellect trace line ${line}`)\n nonEmptyString(trace.id, `PrimeIntellect trace line ${line}.id`)\n const task = object(trace.task, `PrimeIntellect trace line ${line}.task`)\n nonEmptyString(task.type, `PrimeIntellect trace line ${line}.task.type`)\n const data = object(task.data, `PrimeIntellect trace line ${line}.task.data`)\n if (!Number.isSafeInteger(data.idx) || (data.idx as number) < 0) {\n throw new Error(\n `PrimeIntellect trace line ${line}.task.data.idx must be a non-negative integer`,\n )\n }\n if (!Array.isArray(trace.nodes)) {\n throw new Error(`PrimeIntellect trace line ${line}.nodes must be an array`)\n }\n for (const [index, rawNode] of trace.nodes.entries()) {\n const node = object(rawNode, `PrimeIntellect trace line ${line}.nodes[${index}]`)\n const parent = node.parent\n if (\n parent !== undefined &&\n parent !== null &&\n (!Number.isSafeInteger(parent) || (parent as number) < 0 || (parent as number) >= index)\n ) {\n throw new Error(\n `PrimeIntellect trace line ${line}.nodes[${index}].parent must reference an earlier node`,\n )\n }\n if (node.sampled !== undefined && typeof node.sampled !== 'boolean') {\n throw new Error(`PrimeIntellect trace line ${line}.nodes[${index}].sampled must be boolean`)\n }\n if (node.usage !== undefined && node.usage !== null) {\n validateUsage(node.usage, `PrimeIntellect trace line ${line}.nodes[${index}].usage`)\n }\n }\n validateNumberMap(trace.rewards, `PrimeIntellect trace line ${line}.rewards`)\n validateNumberMap(trace.metrics, `PrimeIntellect trace line ${line}.metrics`)\n if (trace.extra_usage !== undefined && !Array.isArray(trace.extra_usage)) {\n throw new Error(`PrimeIntellect trace line ${line}.extra_usage must be an array`)\n }\n for (const [index, usage] of (trace.extra_usage ?? []).entries()) {\n validateUsage(usage, `PrimeIntellect trace line ${line}.extra_usage[${index}]`)\n }\n if (trace.errors !== undefined && !Array.isArray(trace.errors)) {\n throw new Error(`PrimeIntellect trace line ${line}.errors must be an array`)\n }\n for (const [index, rawError] of (trace.errors ?? []).entries()) {\n const error = object(rawError, `PrimeIntellect trace line ${line}.errors[${index}]`)\n nonEmptyString(error.type, `PrimeIntellect trace line ${line}.errors[${index}].type`)\n nonEmptyString(error.message, `PrimeIntellect trace line ${line}.errors[${index}].message`)\n if (\n error.traceback !== undefined &&\n error.traceback !== null &&\n typeof error.traceback !== 'string'\n ) {\n throw new Error(\n `PrimeIntellect trace line ${line}.errors[${index}].traceback must be a string or null`,\n )\n }\n }\n if (trace.is_completed !== undefined && typeof trace.is_completed !== 'boolean') {\n throw new Error(`PrimeIntellect trace line ${line}.is_completed must be boolean`)\n }\n if (\n trace.stop_condition !== undefined &&\n trace.stop_condition !== null &&\n typeof trace.stop_condition !== 'string'\n ) {\n throw new Error(`PrimeIntellect trace line ${line}.stop_condition must be a string or null`)\n }\n if (trace.timing !== undefined) validateTiming(trace.timing, line)\n return value as PrimeIntellectTrace\n}\n\nfunction validateTiming(value: unknown, line: number): void {\n const timing = object(value, `PrimeIntellect trace line ${line}.timing`)\n optionalFinite(timing.start, `PrimeIntellect trace line ${line}.timing.start`)\n for (const phase of ['setup', 'generation', 'finalize', 'scoring']) {\n if (timing[phase] === undefined) continue\n const span = object(timing[phase], `PrimeIntellect trace line ${line}.timing.${phase}`)\n optionalFinite(span.start, `PrimeIntellect trace line ${line}.timing.${phase}.start`)\n optionalFinite(span.end, `PrimeIntellect trace line ${line}.timing.${phase}.end`)\n }\n}\n\nfunction aggregateUsage(usages: PrimeUsage[]): {\n input: number\n output: number\n reasoning?: number\n cached?: number\n reportedCostUsd: number\n costComplete: boolean\n} {\n let input = 0\n let output = 0\n let reasoning = 0\n let cached = 0\n let costUsd = 0\n let sawReasoning = false\n let sawCached = false\n let costsReported = 0\n for (const [index, usage] of usages.entries()) {\n const prompt = nonNegative(usage.prompt_tokens, `usage[${index}].prompt_tokens`)\n const completion = nonNegative(usage.completion_tokens, `usage[${index}].completion_tokens`)\n const cachedInput = optionalNonNegative(\n usage.cached_input_tokens,\n `usage[${index}].cached_input_tokens`,\n )\n const reasoningTokens = optionalNonNegative(\n usage.reasoning_tokens,\n `usage[${index}].reasoning_tokens`,\n )\n const cost = optionalNonNegative(usage.cost, `usage[${index}].cost`)\n input += prompt + (cachedInput ?? 0)\n output += completion\n if (cachedInput !== undefined) {\n cached += cachedInput\n sawCached = true\n }\n if (reasoningTokens !== undefined) {\n reasoning += reasoningTokens\n sawReasoning = true\n }\n if (cost !== undefined) {\n costUsd += cost\n costsReported += 1\n }\n }\n if (reasoning > output) {\n throw new Error(\n `PrimeIntellect reasoning token total ${reasoning} exceeds output total ${output}`,\n )\n }\n return {\n input,\n output,\n ...(sawReasoning ? { reasoning } : {}),\n ...(sawCached ? { cached } : {}),\n reportedCostUsd: costUsd,\n costComplete: usages.length > 0 && costsReported === usages.length,\n }\n}\n\nfunction validateUsage(value: unknown, path: string): void {\n const usage = object(value, path)\n nonNegative(usage.prompt_tokens, `${path}.prompt_tokens`)\n nonNegative(usage.completion_tokens, `${path}.completion_tokens`)\n optionalNonNegative(usage.cached_input_tokens, `${path}.cached_input_tokens`)\n optionalNonNegative(usage.reasoning_tokens, `${path}.reasoning_tokens`)\n optionalNonNegative(usage.cost, `${path}.cost`)\n}\n\nfunction traceWallMs(trace: PrimeIntellectTrace): number {\n const timing = trace.timing\n if (!timing || typeof timing.start !== 'number' || !Number.isFinite(timing.start)) return 0\n const ends = [\n timing.setup?.end,\n timing.generation?.end,\n timing.finalize?.end,\n timing.scoring?.end,\n ].filter((value): value is number => typeof value === 'number' && Number.isFinite(value))\n if (ends.length === 0) return 0\n return Math.max(0, (Math.max(...ends) - timing.start) * 1000)\n}\n\nfunction countBranches(nodes: PrimeTraceNode[]): number {\n if (nodes.length === 0) return 0\n const parents = new Set(\n nodes\n .map((node) => node.parent)\n .filter(\n (parent): parent is number => Number.isSafeInteger(parent) && (parent as number) >= 0,\n ),\n )\n return nodes.reduce((count, _node, index) => count + (parents.has(index) ? 0 : 1), 0)\n}\n\nfunction validateNumberMap(value: unknown, path: string): void {\n const map = object(value, path)\n for (const [key, entry] of Object.entries(map)) finite(entry, `${path}.${key}`)\n}\n\nfunction sumFinite(values: unknown[], path: string): number {\n return values.reduce<number>((sum, value, index) => sum + finite(value, `${path}[${index}]`), 0)\n}\n\nfunction finite(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`${path} must be a finite number`)\n }\n return value\n}\n\nfunction nonNegative(value: unknown, path: string): number {\n const parsed = finite(value, path)\n if (parsed < 0) throw new Error(`${path} must be non-negative`)\n return parsed\n}\n\nfunction optionalNonNegative(value: unknown, path: string): number | undefined {\n if (value === undefined || value === null) return undefined\n return nonNegative(value, path)\n}\n\nfunction optionalFinite(value: unknown, path: string): number | undefined {\n if (value === undefined || value === null) return undefined\n return finite(value, path)\n}\n\nfunction object(value: unknown, path: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction nonEmptyString(value: unknown, path: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${path} must be a non-empty string`)\n }\n return value\n}\n"],"mappings":"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","names":["record","nonEmptyString","record","nonEmptyString"]}