@toloka-platform/sdk 0.2.0-preview.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -6
- package/dist/cli/toloka.js +3 -3
- package/dist/cli/toloka.js.jsc +0 -0
- package/dist/cli/toloka.js.jsc.sha256 +1 -1
- package/dist/cli/toloka.js.sha256 +1 -1
- package/docs/cli.md +3 -3
- package/docs/getting-started.md +4 -2
- package/docs/limitations.md +2 -2
- package/package.json +2 -2
- package/skills/catalog.json +10 -10
- package/skills/toloka-build/SKILL.md +1 -1
- package/skills/toloka-build/references/workflow-and-cli.md +2 -2
- package/skills/toloka-fine-tuning/SKILL.md +1 -1
- package/skills/toloka-get-started/SKILL.md +3 -2
- package/skills/toloka-gisting/SKILL.md +2 -2
- package/skills/toloka-report-issue/references/report-template.md +1 -1
- package/src/cli/program.ts +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Build and operate Toloka pipeline projects as TypeScript source.
|
|
4
4
|
|
|
5
|
-
> **
|
|
5
|
+
> **Stable 0.2.0.** The current supported release is published on `latest`. Because the SDK is still `0.x`, the authoring API, CLI surface, and generated source layout can change between minor releases. Use `latest` to stay current, or pin `@toloka-platform/sdk@0.2.0` for reproducible installs. Read [limitations](./docs/limitations.md).
|
|
6
6
|
|
|
7
7
|
A pipeline project is a graph of nodes that moves items from a dataset through deterministic code and human work and back into the dataset. This package lets you write that project as TypeScript, keep it in version control, and reconcile it onto the platform with one command.
|
|
8
8
|
|
|
@@ -43,7 +43,7 @@ toloka init
|
|
|
43
43
|
|
|
44
44
|
## Install
|
|
45
45
|
|
|
46
|
-
Install the bytecode-cached CLI and add the
|
|
46
|
+
Install the bytecode-cached CLI and add the stable SDK to the project:
|
|
47
47
|
|
|
48
48
|
```sh
|
|
49
49
|
curl -fsSL https://platform.toloka.ai/cli/install.sh | sh
|
|
@@ -52,11 +52,10 @@ bun add @toloka-platform/sdk@latest
|
|
|
52
52
|
|
|
53
53
|
The installer requires Bun 1.4.0 or newer, installs `@toloka-platform/sdk` globally, and exposes `toloka` through Bun's global binary directory. The project install makes SDK imports resolvable.
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
`latest` currently resolves to stable `0.2.0`. It includes Training (`toloka training`), the agent runbooks, and their bundled skills. For a reproducible project install, pin the current stable version:
|
|
56
56
|
|
|
57
57
|
```sh
|
|
58
|
-
|
|
59
|
-
bun add @toloka-platform/sdk@preview
|
|
58
|
+
bun add @toloka-platform/sdk@0.2.0
|
|
60
59
|
```
|
|
61
60
|
|
|
62
61
|
For a guided first run, start a fresh coding-agent session and ask it to follow the [Toloka agent bootstrap](https://platform.toloka.ai/agents/SKILL.md). It routes to the data-labeling, fine-tuning, or gisting runbook and the matching packaged skill.
|
|
@@ -72,7 +71,7 @@ For a guided first run, start a fresh coding-agent session and ask it to follow
|
|
|
72
71
|
| [Datasets](./docs/datasets.md) | columns, immutable schemas, loading rows, what plan refuses |
|
|
73
72
|
| [CLI](./docs/cli.md) | every command, flag, exit code, and the reconcile loop |
|
|
74
73
|
| [Troubleshooting](./docs/troubleshooting.md) | the failures you will actually hit, and what to do about each |
|
|
75
|
-
| [Limitations](./docs/limitations.md) |
|
|
74
|
+
| [Limitations](./docs/limitations.md) | current constraints and `0.x` compatibility expectations |
|
|
76
75
|
|
|
77
76
|
## Examples
|
|
78
77
|
|
package/dist/cli/toloka.js
CHANGED
|
@@ -36,7 +36,7 @@ Expecting one of '${i.join("', '")}'`);let n=`${e}Help`;return this.on(n,(r)=>{l
|
|
|
36
36
|
`);for(let s=n;s<o.length;s++){let a=o[s];if(a.length>1024)continue;let g=Gc.test(a)?a.replace(Gc,"$1"):a;if(!g.match(/\S*Error: /)){for(let l of t){let I=l(g,e);if(I){r.push(I);break}}if(r.length>=wc)break}}return Fc(r)}}class vc{match(e){return this.isDOMException(e)||this.isDOMError(e)}coerce(e,t){let i=Vt(e.stack);return{type:this.getType(e),value:this.getValue(e),stack:i?e.stack:void 0,cause:e.cause?t.next(e.cause):void 0,synthetic:!1}}getType(e){return this.isDOMError(e)?"DOMError":"DOMException"}getValue(e){let t=e.name||(this.isDOMError(e)?"DOMError":"DOMException");return e.message?`${t}: ${e.message}`:t}isDOMException(e){return ni(e,"DOMException")}isDOMError(e){return ni(e,"DOMError")}}class po{match(e){return Ld(e)}coerce(e,t){return{type:this.getType(e),value:this.getMessage(e,t),stack:this.getStack(e),cause:e.cause?t.next(e.cause):void 0,synthetic:!1}}getType(e){return e.name||e.constructor.name}getMessage(e,t){let i=e.message;if(i.error&&typeof i.error.message=="string")return String(i.error.message);return String(i)}getStack(e){return e.stacktrace||e.stack||void 0}}class kc{constructor(){}match(e){return Md(e)&&e.error!=null}coerce(e,t){let i=t.apply(e.error);if(!i)return{type:"ErrorEvent",value:e.message,stack:t.syntheticException?.stack,synthetic:!0};return i}}var oV=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;class Ao{match(e){return typeof e=="string"}coerce(e,t){let[i,n]=this.getInfos(e);return{type:i??"Error",value:n??e,stack:t.syntheticException?.stack,synthetic:!0}}getInfos(e){let t="Error",i=e,n=e.match(oV);if(n)t=n[1],i=n[2];return[t,i]}}var Pc=["fatal","error","warning","log","info","debug"];function bo(e,t=40){let i=Object.keys(e);if(i.sort(),!i.length)return"[object has no keys]";for(let n=i.length;n>0;n--){let r=i.slice(0,n).join(", ");if(!(r.length>t)){if(n===i.length)return r;return r.length<=t?r:`${r.slice(0,t)}...`}}return""}class Zo{match(e){return typeof e=="object"&&e!==null}coerce(e,t){let i=this.getErrorPropertyFromObject(e);if(i)return t.apply(i);return{type:this.getType(e),value:this.getValue(e),stack:t.syntheticException?.stack,level:this.isSeverityLevel(e.level)?e.level:"error",synthetic:!0}}getType(e){return Yi(e)?e.constructor.name:"Error"}getValue(e){if("name"in e&&typeof e.name=="string"){let n=`'${e.name}' captured as exception`;if("message"in e&&typeof e.message=="string")n+=` with message: '${e.message}'`;return n}if("message"in e&&typeof e.message=="string")return e.message;let t=this.getObjectClassName(e),i=bo(e);return`${t&&t!=="Object"?`'${t}'`:"Object"} captured as exception with keys: ${i}`}isSeverityLevel(e){return Vt(e)&&!_d(e)&&Pc.indexOf(e)>=0}getErrorPropertyFromObject(e){for(let t in e)if(Object.prototype.hasOwnProperty.call(e,t)){let i=e[t];if(Ac(i))return i}}getObjectClassName(e){try{let t=Object.getPrototypeOf(e);return t?t.constructor.name:void 0}catch(t){return}}}class Nc{match(e){return Yi(e)}coerce(e,t){let i=e.constructor.name;return{type:i,value:`${i} captured as exception with keys: ${bo(e)}`,stack:t.syntheticException?.stack,synthetic:!0}}}class ho{match(e){return no(e)}coerce(e,t){return{type:"Error",value:`Primitive value captured as exception: ${String(e)}`,stack:t.syntheticException?.stack,synthetic:!0}}}class Yc{match(e){return ni(e,"PromiseRejectionEvent")||this.isCustomEventWrappingRejection(e)}isCustomEventWrappingRejection(e){if(!Yi(e))return!1;try{let t=e.detail;return t!=null&&typeof t=="object"&&"reason"in t}catch{return!1}}coerce(e,t){let i=this.getUnhandledRejectionReason(e);if(no(i))return{type:"UnhandledRejection",value:`Non-Error promise rejection captured with value: ${String(i)}`,stack:t.syntheticException?.stack,synthetic:!0};return t.apply(i)}getUnhandledRejectionReason(e){try{if("reason"in e)return e.reason;if("detail"in e&&e.detail!=null&&typeof e.detail=="object"&&"reason"in e.detail)return e.detail.reason}catch{}return e}}class xc{constructor(e){this._maxSize=e,this._cache=new Map}get(e){let t=this._cache.get(e);if(t===void 0)return;return this._cache.delete(e),this._cache.set(e,t),t}set(e,t){this._cache.set(e,t)}reduce(){while(this._cache.size>=this._maxSize){let e=this._cache.keys().next().value;if(e)this._cache.delete(e)}}}var zn={MESSAGE:"$message",TIMESTAMP:"$timestamp"},sV=new Set([zn.MESSAGE,zn.TIMESTAMP]),fo={enabled:!0,max_bytes:32768};function ba(e){if(!e)return{...fo};return{enabled:e.enabled??fo.enabled,max_bytes:gV(e.max_bytes,fo.max_bytes)}}function aV(e){if(!e)return{sanitizedProperties:{},droppedKeys:[]};let t=[];return{sanitizedProperties:Object.keys(e).reduce((n,r)=>{if(sV.has(r))return t.push(r),n;return n[r]=e[r],n},{}),droppedKeys:t}}class Sc{constructor(e){this._entries=[],this._totalBytes=0,this._config=ba(e)}setConfig(e){this._config=ba(e),this._trimToMaxBytes()}add(e){let t=lV(e);if(!t)return;let i=Xc(t.json);if(i>this._config.max_bytes)return;this._entries.push({step:t.step,bytes:i}),this._totalBytes+=i,this._trimToMaxBytes()}getAttachable(){return this._entries.map((e)=>e.step)}clear(){this._entries=[],this._totalBytes=0}size(){return this._entries.length}_trimToMaxBytes(){while(this._totalBytes>this._config.max_bytes&&this._entries.length>0){let e=this._entries.shift();if(e)this._totalBytes-=e.bytes}}}function gV(e,t){if(!En(e)||e===1/0||e===-1/0)return t;let i=Math.floor(e);if(i<0)return t;return i}function lV(e){let t;try{t=Ni(e)}catch{return}try{let i=JSON.parse(t);if(!Xn(i))return;let n=i,r=n[zn.MESSAGE],o=n[zn.TIMESTAMP];if(!Vt(r)||r.trim().length===0)return;if(!Vt(o)&&!En(o))return;return{step:n,json:t}}catch{return}}function Xc(e){if(typeof TextEncoder<"u")return new TextEncoder().encode(e).length;let t=encodeURIComponent(e),i=0;for(let n=0;n<t.length;n++)if(t[n]==="%")i+=1,n+=2;else i+=1;return i}class Nt extends Error{constructor(e,t){super("HTTP error while fetching PostHog: status="+e.status+", reqByteLength="+t),this.response=e,this.reqByteLength=t,this.name="PostHogFetchHttpError"}get status(){return this.response.status}get text(){return this.response.text()}get json(){return this.response.json()}}class oi extends Error{constructor(e){super("Network error while fetching PostHog",e instanceof Error?{cause:e}:{}),this.error=e,this.name="PostHogFetchNetworkError"}}var Tc=(e,t)=>{for(let i of Object.keys(t))if(i.startsWith("$feature/")||i==="$active_feature_flags")e[i]=t[i]};async function Ec(e){if(e instanceof Nt){let t="";try{t=await e.text}catch{}console.error(`Error while flushing PostHog: message=${e.message}, response body=${t}`,e)}else console.error("Error while flushing PostHog",e);return Promise.resolve()}function IV(e){return typeof e=="object"&&(e instanceof Nt||Uc(e))}function Uc(e){return e instanceof oi}function dV(e){if(e instanceof Nt)return e.status===502||e.status===504;if(!(e instanceof oi))return!1;let t=e.error;return(t?.code??t?.cause?.code)!=="ECONNREFUSED"}function Xi(e){return typeof e=="object"&&e instanceof Nt&&e.status===413}function jn(e){if(e instanceof Nt)return e.status===408||e.status===429||e.status>=500;return Uc(e)}function Jc(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Za="default";class Wo{getErrorPropertiesBuilder(){if(!this._errorPropertiesBuilder)this._errorPropertiesBuilder=this.createErrorPropertiesBuilder();return this._errorPropertiesBuilder}createErrorPropertiesBuilder(){return new Co([new po,new Zo,new Ao,new ho],Aa())}constructor(e,t={}){this.flushPromise=null,this.pendingFlushPromise=null,this.flushPromises=new Set,this._dequeuedMessagesCount=0,this.shutdownPromise=null,this.promiseQueue=new ta,this._events=new Ca,this._isInitialized=!1;let i=typeof e=="string"?e.trim():"",n=typeof t.host=="string"?t.host.trim():"",r=!i;if(this._logger=nc("[PostHog]",this.logMsgIfDebug.bind(this)),r)this._logger.error("You must pass your PostHog project's api key. The client will be disabled.");if(this.apiKey=i,this.host=mc(n||"https://us.i.posthog.com"),this.flushAt=t.flushAt?Math.max(t.flushAt,1):20,this.maxBatchSize=Math.max(this.flushAt,t.maxBatchSize??100),this.maxQueueSize=Math.max(this.flushAt,t.maxQueueSize??1000),this.flushInterval=t.flushInterval??1e4,this.preloadFeatureFlags=t.preloadFeatureFlags??!0,this.defaultOptIn=t.defaultOptIn??!0,this.disableSurveys=t.disableSurveys??!1,this._retryOptions={retryCount:t.fetchRetryCount??3,retryDelay:t.fetchRetryDelay??3000,retryCheck:jn},this.requestTimeout=t.requestTimeout??1e4,this.featureFlagsRequestTimeoutMs=t.featureFlagsRequestTimeoutMs??3000,this.featureFlagsRequestMaxRetries=t.featureFlagsRequestMaxRetries??1,this.remoteConfigRequestTimeoutMs=t.remoteConfigRequestTimeoutMs??3000,this.disableGeoip=t.disableGeoip??!0,this.disabled=(t.disabled??!1)||r,this.historicalMigration=t?.historicalMigration??!1,this._initPromise=Promise.resolve(),this._isInitialized=!0,this.evaluationContexts=t?.evaluationContexts??t?.evaluationEnvironments,t?.evaluationEnvironments&&!t?.evaluationContexts)this._logger.warn("evaluationEnvironments is deprecated. Use evaluationContexts instead. This property will be removed in a future version.");this.disableCompression=!qs()||(t?.disableCompression??!1)}logMsgIfDebug(e){if(this.isDebug)e()}wrap(e){if(this.disabled)return void this._logger.warn("The client is disabled");if(this._isInitialized)return e();this._initPromise.then(()=>e())}getCommonEventProperties(){return{$lib:this.getLibraryId(),$lib_version:this.getLibraryVersion()}}get optedOut(){return this.getPersistedProperty(xe.OptedOut)??!this.defaultOptIn}async optIn(){this.wrap(()=>{this.setPersistedProperty(xe.OptedOut,!1)})}async optOut(){this.wrap(()=>{this.setPersistedProperty(xe.OptedOut,!0)})}on(e,t){return this._events.on(e,t)}debug(e=!0){if(this.removeDebugCallback?.(),e){let t=this.on("*",(i,n)=>this._logger.info(i,n));this.removeDebugCallback=()=>{t(),this.removeDebugCallback=void 0}}}get isDebug(){return!!this.removeDebugCallback}get isDisabled(){return this.disabled}buildPayload(e){let t=e.properties||{},i={...t,...this.getCommonEventProperties()};if(Tc(i,t),e.event==="$feature_flag_called"&&i.$feature_flag_has_experiment===!1&&this.isMinimalFlagCalledEventsEnabled())i=xn(i);return{distinct_id:e.distinct_id,event:e.event,properties:i}}isMinimalFlagCalledEventsEnabled(){return!1}addPendingPromise(e){return this.promiseQueue.add(e)}identifyStateless(e,t,i){this.wrap(()=>{let n={...this.buildPayload({distinct_id:e,event:"$identify",properties:t})};this.enqueue("identify",n,i)})}async identifyStatelessImmediate(e,t,i){let n={...this.buildPayload({distinct_id:e,event:"$identify",properties:t})};await this.sendImmediate("identify",n,i)}captureStateless(e,t,i,n){this.wrap(()=>{let r=this.buildPayload({distinct_id:e,event:t,properties:i});this.enqueue("capture",r,n)})}async captureStatelessImmediate(e,t,i,n){let r=this.buildPayload({distinct_id:e,event:t,properties:i});await this.sendImmediate("capture",r,n)}aliasStateless(e,t,i,n){this.wrap(()=>{let r=this.buildPayload({event:"$create_alias",distinct_id:t,properties:{...i||{},distinct_id:t,alias:e}});this.enqueue("alias",r,n)})}async aliasStatelessImmediate(e,t,i,n){let r=this.buildPayload({event:"$create_alias",distinct_id:t,properties:{...i||{},distinct_id:t,alias:e}});await this.sendImmediate("alias",r,n)}groupIdentifyStateless(e,t,i,n,r,o){this.wrap(()=>{let s=this.buildPayload({distinct_id:r||`$${e}_${t}`,event:"$groupidentify",properties:{$group_type:e,$group_key:t,$group_set:i||{},...o||{}}});this.enqueue("capture",s,n)})}async groupIdentifyStatelessImmediate(e,t,i,n,r,o){let s=this.buildPayload({distinct_id:r||`$${e}_${t}`,event:"$groupidentify",properties:{$group_type:e,$group_key:t,$group_set:i||{},...o||{}}});await this.sendImmediate("capture",s,n)}async getRemoteConfig(){await this._initPromise;let e=this.host;if(e==="https://us.i.posthog.com")e="https://us-assets.i.posthog.com";else if(e==="https://eu.i.posthog.com")e="https://eu-assets.i.posthog.com";let t=`${e}/array/${this.apiKey}/config`,i={method:"GET",headers:{...this.getCustomHeaders(),"Content-Type":"application/json"}};return this.fetchWithRetry(t,i,{retryCount:0},this.remoteConfigRequestTimeoutMs).then((n)=>n.json()).catch((n)=>{this._logger.error("Remote config could not be loaded",n),this._events.emit("error",n)})}async getFlags(e,t={},i={},n={},r={},o=!1){await this._initPromise;let s=o?"&config=true":"",a=`${this.host}/flags/?v=2${s}`,g={token:this.apiKey,distinct_id:e,groups:t,person_properties:i,group_properties:n,...r};if(i.$device_id)g.$device_id=i.$device_id;if(this.evaluationContexts&&this.evaluationContexts.length>0)g.evaluation_contexts=this.evaluationContexts;let l={method:"POST",headers:{...this.getCustomHeaders(),"Content-Type":"application/json"},body:JSON.stringify(g)};return this._logger.info("Flags URL",a),this.fetchWithRetry(a,l,{retryCount:this.featureFlagsRequestMaxRetries,retryCheck:dV},this.featureFlagsRequestTimeoutMs).then((I)=>I.json()).then((I)=>({success:!0,response:$s(I)})).catch((I)=>(this._events.emit("error",I),{success:!1,error:this.categorizeRequestError(I)}))}categorizeRequestError(e){if(e instanceof Nt)return{type:"api_error",statusCode:e.status};if(e instanceof oi){let t=e.error;if(t instanceof Error&&(t.name==="AbortError"||t.name==="TimeoutError"))return{type:"timeout"};return{type:"connection_error"}}return{type:"unknown_error"}}async getFeatureFlagStateless(e,t,i={},n={},r={},o){await this._initPromise;let s=await this.getFeatureFlagDetailStateless(e,t,i,n,r,o);if(s===void 0)return{response:void 0,requestId:void 0};let a=Yn(s.response);if(a===void 0)a=!1;return{response:a,requestId:s.requestId}}async getFeatureFlagDetailStateless(e,t,i={},n={},r={},o){await this._initPromise;let s=await this.getFeatureFlagDetailsStateless(t,i,n,r,o,[e]);if(s===void 0)return;return{response:s.flags[e],requestId:s.requestId,evaluatedAt:s.evaluatedAt}}async getFeatureFlagPayloadStateless(e,t,i={},n={},r={},o){await this._initPromise;let s=await this.getFeatureFlagPayloadsStateless(t,i,n,r,o,[e]);if(!s)return;let a=s[e];if(a===void 0)return null;return a}async getFeatureFlagPayloadsStateless(e,t={},i={},n={},r,o){return await this._initPromise,(await this.getFeatureFlagsAndPayloadsStateless(e,t,i,n,r,o)).payloads}async getFeatureFlagsStateless(e,t={},i={},n={},r,o){return await this._initPromise,await this.getFeatureFlagsAndPayloadsStateless(e,t,i,n,r,o)}async getFeatureFlagsAndPayloadsStateless(e,t={},i={},n={},r,o){await this._initPromise;let s=await this.getFeatureFlagDetailsStateless(e,t,i,n,r,o);if(!s)return{flags:void 0,payloads:void 0,requestId:void 0};return{flags:s.featureFlags,payloads:s.featureFlagPayloads,requestId:s.requestId}}async getFeatureFlagDetailsStateless(e,t={},i={},n={},r,o){await this._initPromise;let s={geoip_disable:r??this.disableGeoip};if(o)s.flag_keys_to_evaluate=o;let a=await this.getFlags(e,t,i,n,s);if(!a.success)return;let g=a.response;if(g.errorsWhileComputingFlags)console.error("[FEATURE FLAGS] Error while computing feature flags, some flags may be missing or incorrect. Learn more at https://posthog.com/docs/feature-flags/best-practices");if(g.quotaLimited?.includes("feature_flags"))return console.warn("[FEATURE FLAGS] Feature flags quota limit exceeded - feature flags unavailable. Learn more about billing limits at https://posthog.com/docs/billing/limits-alerts"),{flags:{},featureFlags:{},featureFlagPayloads:{},requestId:g?.requestId,quotaLimited:g.quotaLimited};return g}async getSurveysStateless(){if(await this._initPromise,this.disabled)return[];if(this.disableSurveys===!0)return this._logger.info("Loading surveys is disabled."),[];let e=`${this.host}/api/surveys/?token=${this.apiKey}`,t={method:"GET",headers:{...this.getCustomHeaders(),"Content-Type":"application/json"}},n=(await this.fetchWithRetry(e,t).then((r)=>{if(r.status!==200||!r.json){let o=`Surveys API could not be loaded: ${r.status}`,s=Error(o);this._logger.error(s),this._events.emit("error",Error(o));return}return r.json()}).catch((r)=>{this._logger.error("Surveys API could not be loaded",r),this._events.emit("error",r)}))?.surveys;if(n)this._logger.info("Surveys fetched from API: ",JSON.stringify(n));return n??[]}get props(){if(!this._props)this._props=this.getPersistedProperty(xe.Props);return this._props||{}}set props(e){this._props=e}async register(e){this.wrap(()=>{this.props={...this.props,...e},this.setPersistedProperty(xe.Props,this.props)})}async unregister(e){this.wrap(()=>{delete this.props[e],this.setPersistedProperty(xe.Props,this.props)})}processBeforeEnqueue(e){return e}async flushStorage(){}getQueueRouteKey(e){return Za}persistedQueueKeyForRoute(e){return xe.Queue}getActiveQueueRoutes(){return[Za]}getRouteQueue(e){return this.getPersistedProperty(this.persistedQueueKeyForRoute(e))||[]}enqueue(e,t,i){this.wrap(()=>{if(this.optedOut)return void this._events.emit(e,"Library is disabled. Not sending event. To re-enable, call posthog.optIn()");let n=this.prepareMessage(t,i);if(n=this.processBeforeEnqueue(n),n===null)return;n=this.normalizeMessage(n);let r=this.persistedQueueKeyForRoute(this.getQueueRouteKey(n)),o=this.getPersistedProperty(r)||[];if(o.length>=this.maxQueueSize)o.shift(),this._logger.warn("Queue is full, the oldest event is dropped.");if(o.push({message:n}),this.setPersistedProperty(r,o),this._events.emit(e,n),o.length>=this.flushAt)this.flushBackground();if(this.flushInterval&&!this._flushTimer)this._flushTimer=pe(()=>this.flushBackground(),this.flushInterval)})}async sendImmediate(e,t,i){if(this.disabled)return void this._logger.warn("The client is disabled");if(!this._isInitialized)await this._initPromise;if(this.optedOut)return void this._events.emit(e,"Library is disabled. Not sending event. To re-enable, call posthog.optIn()");let n=this.prepareMessage(t,i);if(n=this.processBeforeEnqueue(n),n===null)return;n=this.normalizeMessage(n);try{await this.sendBatch([n],void 0,this.getQueueRouteKey(n))}catch(r){this._events.emit("error",r)}}normalizeMessage(e){let{type:t,library:i,library_version:n,...r}=e,o=Jc(r.properties)?r.properties:void 0;if(i!==void 0&&o?.$lib===void 0)o={...o||{},$lib:i};if(n!==void 0&&o?.$lib_version===void 0)o={...o||{},$lib_version:n};if(o)r.properties=o;return r.uuid=go(r.uuid,Se),r}prepareMessage(e,t){let i={...e,timestamp:t?.timestamp?t?.timestamp:aa(),uuid:go(t?.uuid,Se)};if(t?.disableGeoip??this.disableGeoip){if(!Jc(i.properties))i.properties={};i.properties.$geoip_disable=!0}if(i.distinctId)i.distinct_id=i.distinctId,delete i.distinctId;return i}clearFlushTimer(){if(this._flushTimer)clearTimeout(this._flushTimer),this._flushTimer=void 0}flushBackground(){if(this.pendingFlushPromise)return;this.flush().catch(async(e)=>{await Ec(e)})}async waitForPendingPromises(e,t=[]){let i=t.filter((r)=>!!r),n=0;while(!0){let r=this.promiseQueue.getPromises([...i,...this.flushPromises],e);if(r.length===0)return;if(n>0)this._logger.debug(`flush() re-checking ${r.length} pending promise(s) before flushing`);await Promise.all(r.map((o)=>o.catch(()=>{}))),n++}}flushWithPendingPromises(){return this.flushInternal(!0)}flush(){return this.flushInternal(!1)}flushInternal(e){if(this.disabled)return Promise.resolve();if(!e&&this.pendingFlushPromise)return this.pendingFlushPromise;let t=this.flushPromise,i=this.promiseQueue.maxId,n=Promise.resolve().then(()=>{if(e)return this.waitForPendingPromises(i,[t,n])}).then(()=>ga([t])).then(()=>{if(this.pendingFlushPromise===n)this.pendingFlushPromise=null;return this._flush()});return this.pendingFlushPromise=n,this.flushPromise=n,this.flushPromises.add(n),this.addPendingPromise(n),ga([n]).then(()=>{if(this.flushPromises.delete(n),this.pendingFlushPromise===n)this.pendingFlushPromise=null;if(this.flushPromise===n)this.flushPromise=null}),n}getCustomHeaders(){let e=this.getCustomUserAgent(),t={};if(e&&e!=="")t["User-Agent"]=e;return t}async sendBatch(e,t,i=Za){let n={api_key:this.apiKey,batch:e,sent_at:aa()};if(this.historicalMigration)n.historical_migration=!0;let r=Ni(n),o=`${this.host}/batch/`,s=this.disableCompression?null:await ti(r,this.isDebug),a={method:"POST",headers:{...this.getCustomHeaders(),"Content-Type":"application/json",...s!==null&&{"Content-Encoding":"gzip"}},body:s||r};await(await this.fetchWithRetry(o,a,t)).body?.cancel()?.catch(()=>{})}async _flush(){this.clearFlushTimer(),await this._initPromise;let e=this.getActiveQueueRoutes();if(!e.some((n)=>this.getRouteQueue(n).length>0))return;let t=[],i;for(let n of e)try{await this._flushRoute(n,t)}catch(r){if(i===void 0)i=r}if(i!==void 0)throw i;this._events.emit("flush",t)}async _flushRoute(e,t){let i=this.persistedQueueKeyForRoute(e),n=this.getPersistedProperty(i)||[];if(!n.length)return;let r=n.length,o=0;while(n.length>0&&o<r){let s=n.slice(0,this.maxBatchSize),a=s.map((I)=>I.message===void 0?I.message:this.normalizeMessage(I.message)),g=async()=>{let d=(this.getPersistedProperty(i)||[]).slice(s.length);this.setPersistedProperty(i,d),n=d,this._dequeuedMessagesCount+=s.length,await this.flushStorage()},l={retryCheck:(I)=>{if(Xi(I))return!1;return jn(I)}};try{await this.sendBatch(a,l,e)}catch(I){if(Xi(I)&&a.length>1){this.maxBatchSize=Math.max(1,Math.floor(a.length/2)),this._logger.warn(`Received 413 when sending batch of size ${a.length}, reducing batch size to ${this.maxBatchSize}`);continue}if(!(I instanceof oi))await g();throw this._events.emit("error",I),I}await g(),t.push(...a),o+=a.length}}async _sendLogsBatch(e){if(this.disabled)return{kind:"fatal",error:Error("The client is disabled")};let t=JSON.stringify(e),i=`${this.host}/i/v1/logs?token=${encodeURIComponent(this.apiKey)}`,n=this.disableCompression?null:await ti(t,this.isDebug),r={method:"POST",headers:{...this.getCustomHeaders(),"Content-Type":"application/json",...n!==null&&{"Content-Encoding":"gzip"}},body:n||t};try{return await this.fetchWithRetry(i,r,{retryCheck:(o)=>{if(Xi(o))return!1;return jn(o)}}),{kind:"ok"}}catch(o){if(Xi(o))return{kind:"too-large"};if(o instanceof oi)return{kind:"retry-later",error:o};return{kind:"fatal",error:o}}}async _sendMetricsBatch(e){if(this.disabled)return{kind:"fatal",error:Error("The client is disabled")};let t=JSON.stringify(e),i=`${this.host}/i/v1/metrics?token=${encodeURIComponent(this.apiKey)}`,n=this.disableCompression?null:await ti(t,this.isDebug),r={method:"POST",headers:{...this.getCustomHeaders(),"Content-Type":"application/json",...n!==null&&{"Content-Encoding":"gzip"}},body:n||t};try{return await this.fetchWithRetry(i,r,{retryCheck:(o)=>{if(Xi(o))return!1;return jn(o)}}),{kind:"ok"}}catch(o){if(Xi(o))return{kind:"too-large"};if(jn(o))return{kind:"retry-later",error:o};return{kind:"fatal",error:o}}}async fetchWithRetry(e,t,i,n){let r=t.body?t.body:"",o=-1;try{o=r instanceof Blob?r.size:Buffer.byteLength(r,Cc)}catch{if(r instanceof Blob)o=r.size;else o=new TextEncoder().encode(r).length}return await pc(async()=>{let s=new AbortController,a=n??this.requestTimeout,g=pe(()=>s.abort(),a),l=null;try{l=await this.fetch(e,{signal:s.signal,...t})}catch(d){throw new oi(d)}finally{clearTimeout(g)}if(t.mode!=="no-cors"&&(l.status<200||l.status>=400))throw new Nt(l,o);return l},{...this._retryOptions,...i})}async _shutdown(e=30000){await this._initPromise;let t=!1;if(this.clearFlushTimer(),this.disabled)return;let i=async()=>{try{await this.promiseQueue.join();while(!0){if(!this.getActiveQueueRoutes().some((s)=>this.getRouteQueue(s).length>0))break;let o=this._dequeuedMessagesCount;if(await this.flush(),t)break;if(this._dequeuedMessagesCount===o){this._logger.warn("Shutdown flush completed but did not send any queued events. Stopping drain to avoid a loop.");break}}}catch(r){if(!IV(r))throw r;await Ec(r)}},n;try{return await Promise.race([new Promise((r,o)=>{n=pe(()=>{this._logger.error("Timed out while shutting down PostHog"),t=!0,o("Timeout while shutting down PostHog. Some events may not have been sent.")},e)}),i()])}finally{clearTimeout(n)}}async shutdown(e=30000){if(this.shutdownPromise)this._logger.warn("shutdown() called while already shutting down. shutdown() is meant to be called once before process exit - use flush() for per-request cleanup");else this.shutdownPromise=this._shutdown(e).finally(()=>{this.shutdownPromise=null});return this.shutdownPromise}}var jc=require("fs"),Dc=require("readline"),yo=new He.ReduceableCache(25),_c=new He.ReduceableCache(20),ha=7,pV=1000,AV=1e4;async function Qc(e){let t={};for(let r=e.length-1;r>=0;r--){let o=e[r],s=o?.filename;if(!o||typeof s!="string"||typeof o.lineno!="number"||fV(s)||WV(o))continue;if(!t[s])t[s]=[];t[s].push(o.lineno)}let i=Object.keys(t);if(i.length==0)return e;let n=[];for(let r of i){if(_c.get(r))continue;let o=t[r];if(!o)continue;o.sort((g,l)=>g-l);let s=VV(o);if(s.every((g)=>yV(r,g)))continue;let a=BV(yo,r,{});n.push(bV(r,s,a))}if(await Promise.all(n).catch(()=>{}),e&&e.length>0)ZV(e,yo);return yo.reduce(),e}function bV(e,t,i){return new Promise((n)=>{let r=jc.createReadStream(e),o=Dc.createInterface({input:r});function s(){r.destroy(),n()}let a=0,g=0,l=t[g];if(l===void 0)return void s();let I=l[0],d=l[1];function C(){_c.set(e,1),o.close(),o.removeAllListeners(),s()}r.on("error",C),o.on("error",C),o.on("close",s),o.on("line",(m)=>{if(a++,a<I)return;if(i[a]=RV(m,0),a>=d){if(g===t.length-1){o.close(),o.removeAllListeners();return}g++;let c=t[g];if(c===void 0){o.close(),o.removeAllListeners();return}I=c[0],d=c[1]}})})}function ZV(e,t){for(let i of e)if(i.filename&&i.context_line===void 0&&typeof i.lineno=="number"){let n=t.get(i.filename);if(n===void 0)continue;hV(i.lineno,i,n)}}function hV(e,t,i){if(t.lineno===void 0||i===void 0)return;t.pre_context=[];for(let r=Kc(e);r<e;r++){let o=i[r];if(o===void 0)return void Oc(t);t.pre_context.push(o)}if(i[e]===void 0)return void Oc(t);t.context_line=i[e];let n=Lc(e);t.post_context=[];for(let r=e+1;r<=n;r++){let o=i[r];if(o===void 0)break;t.post_context.push(o)}}function Oc(e){delete e.pre_context,delete e.context_line,delete e.post_context}function fV(e){return e.startsWith("node:")||e.endsWith(".min.js")||e.endsWith(".min.cjs")||e.endsWith(".min.mjs")||e.startsWith("data:")}function WV(e){if(e.lineno!==void 0&&e.lineno>AV)return!0;if(e.colno!==void 0&&e.colno>pV)return!0;return!1}function yV(e,t){let i=yo.get(e);if(i===void 0)return!1;for(let n=t[0];n<=t[1];n++)if(i[n]===void 0)return!1;return!0}function VV(e){if(!e.length)return[];let t=0,i=e[0];if(typeof i!="number")return[];let n=zc(i),r=[];while(!0){if(t===e.length-1){r.push(n);break}let o=e[t+1];if(typeof o!="number")break;if(o<=n[1])n[1]=o+ha;else r.push(n),n=zc(o);t++}return r}function zc(e){return[Kc(e),Lc(e)]}function Kc(e){return Math.max(1,e-ha)}function Lc(e){return e+ha}function BV(e,t,i){let n=e.get(t);if(n===void 0)return e.set(t,i),i;return n}function RV(e,t){let i=e,n=i.length;if(n<=150)return i;if(t>n)t=n;let r=Math.max(t-60,0);if(r<5)r=0;let o=Math.min(r+140,n);if(o>n-5)o=n;if(o===n)r=Math.max(o-140,0);if(i=i.slice(r,o),r>0)i=`...${i}`;if(o<n)i+="...";return i}var Ei=require("path");function Mc(e=process.cwd()){let t=Ei.sep==="\\",i=(r)=>t?r.replace(/\\/g,"/"):r,n=i(e);return async(r)=>{for(let o of r)if(!(!o.filename||o.filename.startsWith("node:")||o.filename.startsWith("data:"))){if(Ei.isAbsolute(o.filename))o.filename=i(Ei.relative(n,i(o.filename)))}return r}}var $c="5.46.1";var Bt={ERRORS_WHILE_COMPUTING:"errors_while_computing_flags",FLAG_MISSING:"flag_missing",QUOTA_LIMITED:"quota_limited",UNKNOWN_ERROR:"unknown_error"};class si{constructor(e){this._host=e.host,this._distinctId=e.distinctId,this._groups=e.groups,this._disableGeoip=e.disableGeoip,this._flags=e.flags,this._requestId=e.requestId,this._evaluatedAt=e.evaluatedAt,this._flagDefinitionsLoadedAt=e.flagDefinitionsLoadedAt,this._errorsWhileComputing=e.errorsWhileComputing??!1,this._quotaLimited=e.quotaLimited??!1,this._accessed=e.accessed??new Set,this._isSlice=e.isSlice??!1}isEnabled(e){let t=this._flags[e];return this._recordAccess(e),t?.enabled??!1}getFlag(e){let t=this._flags[e];if(this._recordAccess(e),!t)return;if(!t.enabled)return!1;return t.variant??!0}getFlagPayload(e){return this._flags[e]?.payload}onlyAccessed(){let e={};for(let t of this._accessed){let i=this._flags[t];if(i)e[t]=i}return this._cloneWith(e)}only(e){let t={},i=[];for(let n of e){let r=this._flags[n];if(r)t[n]=r;else i.push(n)}if(i.length>0)this._host.logWarning(`FeatureFlagEvaluations.only() was called with flag keys that are not in the evaluation set and will be dropped: ${i.join(", ")}`);return this._cloneWith(t)}get keys(){return Object.keys(this._flags)}_getEventProperties(){let e={},t=[];for(let[i,n]of Object.entries(this._flags)){let r=n.enabled===!1?!1:n.variant??!0;if(e[`$feature/${i}`]=r,n.enabled)t.push(i)}if(t.length>0)t.sort(),e.$active_feature_flags=t;return e}_cloneWith(e){return new si({host:this._host,distinctId:this._distinctId,groups:this._groups,disableGeoip:this._disableGeoip,flags:e,requestId:this._requestId,evaluatedAt:this._evaluatedAt,flagDefinitionsLoadedAt:this._flagDefinitionsLoadedAt,errorsWhileComputing:this._errorsWhileComputing,quotaLimited:this._quotaLimited,accessed:new Set(this._accessed),isSlice:!0})}_recordAccess(e){if(this._accessed.add(e),this._distinctId==="")return;if(this._isSlice&&!(e in this._flags))return;let t=this._flags[e],i=t===void 0?void 0:t.enabled===!1?!1:t.variant??!0,n={$feature_flag:e,$feature_flag_response:i,$feature_flag_id:t?.id,$feature_flag_version:t?.version,$feature_flag_reason:t?.reason,locally_evaluated:t?.locallyEvaluated??!1,[`$feature/${e}`]:i,$feature_flag_request_id:this._requestId,$feature_flag_evaluated_at:t?.locallyEvaluated?Date.now():this._evaluatedAt};if(t?.hasExperiment!==void 0)n.$feature_flag_has_experiment=t.hasExperiment;if(t?.locallyEvaluated&&this._flagDefinitionsLoadedAt!==void 0)n.$feature_flag_definitions_loaded_at=this._flagDefinitionsLoadedAt;let r=[];if(this._errorsWhileComputing)r.push(Bt.ERRORS_WHILE_COMPUTING);if(this._quotaLimited)r.push(Bt.QUOTA_LIMITED);if(t===void 0)r.push(Bt.FLAG_MISSING);if(r.length>0)n.$feature_flag_error=r.join(",");this._host.captureFlagCalledEventIfNeeded({distinctId:this._distinctId,key:e,response:i,groups:this._groups,disableGeoip:this._disableGeoip,properties:n})}}async function qc(e){let t=globalThis.crypto?.subtle;if(!t)throw Error("SubtleCrypto API not available");let i=await t.digest("SHA-1",new TextEncoder().encode(e));return Array.from(new Uint8Array(i)).map((r)=>r.toString(16).padStart(2,"0")).join("")}var GV=60000,wV=1152921504606847000,FV=["is_not","is_set"];class Ji extends Error{constructor(e){super();Error.captureStackTrace(this,this.constructor),this.name="ClientError",this.message=e,Object.setPrototypeOf(this,Ji.prototype)}}function nu(e,t){e.name=t.name,Error.captureStackTrace(e,t),Object.setPrototypeOf(e,t.prototype)}class U extends Error{constructor(e){super(e);nu(this,U)}}class ct extends Error{constructor(e){super(e);nu(this,ct)}}class fa{constructor({pollingInterval:e,personalApiKey:t,projectApiKey:i,timeout:n,host:r,customHeaders:o,...s}){this.debugMode=!1,this.shouldBeginExponentialBackoff=!1,this.backOffCount=0,this.pollingInterval=e,this.personalApiKey=t,this.featureFlags=[],this.featureFlagsByKey={},this.groupTypeMapping={},this.cohorts={},this.loadedSuccessfullyOnce=!1,this.timeout=n,this.projectApiKey=i,this.host=r,this.poller=void 0,this.fetch=s.fetch||fetch,this.onError=s.onError,this.customHeaders=o,this.onLoad=s.onLoad,this.onMinimalFlagCalledEvents=s.onMinimalFlagCalledEvents,this.cacheProvider=s.cacheProvider,this.strictLocalEvaluation=s.strictLocalEvaluation??!1,this.loadFeatureFlags()}debug(e=!0){this.debugMode=e}logMsgIfDebug(e){if(this.debugMode)e()}createEvaluationContext(e,t={},i={},n={},r={}){return{distinctId:e,groups:t,personProperties:i,groupProperties:n,evaluationCache:r}}async getFeatureFlag(e,t,i={},n={},r={}){await this.loadFeatureFlags();let o,s;if(!this.loadedSuccessfullyOnce)return o;if(s=this.featureFlagsByKey[e],s!==void 0){let a=this.createEvaluationContext(t,i,n,r);try{o=(await this.computeFlagAndPayloadLocally(s,a)).value,this.logMsgIfDebug(()=>console.debug(`Successfully computed flag locally: ${e} -> ${o}`))}catch(g){if(g instanceof ct||g instanceof U)this.logMsgIfDebug(()=>console.debug(`${g.name} when computing flag locally: ${e}: ${g.message}`));else if(g instanceof Error)this.onError?.(Error(`Error computing flag locally: ${e}: ${g}`))}}return o}async getAllFlagsAndPayloads(e,t){await this.loadFeatureFlags();let i={},n={},r=this.featureFlags.length==0,o=t?t.map((a)=>this.featureFlagsByKey[a]).filter(Boolean):this.featureFlags,s={...e,evaluationCache:e.evaluationCache??{}};return await Promise.all(o.map(async(a)=>{try{let{value:g,payload:l}=await this.computeFlagAndPayloadLocally(a,s);if(i[a.key]=g,l)n[a.key]=l}catch(g){if(g instanceof ct||g instanceof U)this.logMsgIfDebug(()=>console.debug(`${g.name} when computing flag locally: ${a.key}: ${g.message}`));else if(g instanceof Error)this.onError?.(Error(`Error computing flag locally: ${a.key}: ${g}`));r=!0}})),{response:i,payloads:n,fallbackToFlags:r}}async computeFlagAndPayloadLocally(e,t,i={}){let{matchValue:n,skipLoadCheck:r=!1}=i;if(!r)await this.loadFeatureFlags();if(!this.loadedSuccessfullyOnce)return{value:!1,payload:null};let o;o=n!==void 0?n:await this.computeFlagValueLocally(e,t);let s=this.getFeatureFlagPayload(e.key,o);return{value:o,payload:s}}async computeFlagValueLocally(e,t){let{distinctId:i,groups:n,personProperties:r,groupProperties:o}=t;if(!e.active)return!1;if(e.ensure_experience_continuity)throw new U("Flag has experience continuity enabled");let a=(e.filters||{}).aggregation_group_type_index;if(a!=null){let g=this.groupTypeMapping[String(a)];if(!g)throw this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Unknown group type index ${a} for feature flag ${e.key}`)),new U("Flag has unknown group type index");if(!(g in n))return this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Can't compute group feature flag: ${e.key} without group names passed in`)),!1;if(e.bucketing_identifier==="device_id"&&(r?.$device_id===void 0||r?.$device_id===null||r?.$device_id===""))this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Ignoring bucketing_identifier for group flag: ${e.key}`));let l=o[g];return await this.matchFeatureFlagProperties(e,n[g],l,t)}{let g=this.getBucketingValueForFlag(e,i,r);if(g===void 0)throw this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Can't compute feature flag: ${e.key} without $device_id, falling back to server evaluation`)),new U(`Can't compute feature flag: ${e.key} without $device_id`);return await this.matchFeatureFlagProperties(e,g,r,t)}}getBucketingValueForFlag(e,t,i){if(e.filters?.aggregation_group_type_index!=null)return t;if(e.bucketing_identifier==="device_id"){let n=i?.$device_id;if(n==null||n==="")return;return n}return t}getFeatureFlagPayload(e,t){let i=null;if(t!==!1&&t!=null){if(typeof t=="boolean")i=this.featureFlagsByKey?.[e]?.filters?.payloads?.[t.toString()]||null;else if(typeof t=="string")i=this.featureFlagsByKey?.[e]?.filters?.payloads?.[t]||null;if(i!=null){if(typeof i=="object")return i;if(typeof i=="string")try{return JSON.parse(i)}catch{}return i}}return null}async evaluateFlagDependency(e,t,i){let{evaluationCache:n}=i,r=e.key;if(!this.featureFlagsByKey)throw new U("Feature flags not available for dependency evaluation");if(!("dependency_chain"in e))throw new U(`Flag dependency property for '${r}' is missing required 'dependency_chain' field`);let o=e.dependency_chain;if(!Array.isArray(o))throw new U(`Flag dependency property for '${r}' has an invalid 'dependency_chain' (expected array, got ${typeof o})`);if(o.length===0)throw new U(`Circular dependency detected for flag '${r}' (empty dependency chain)`);for(let a of o){if(!(a in n)){let l=this.featureFlagsByKey[a];if(l)if(l.active)try{let I=await this.computeFlagValueLocally(l,i);n[a]=I}catch(I){throw new U(`Error evaluating flag dependency '${a}' for flag '${r}': ${I}`)}else n[a]=!1;else throw new U(`Missing flag dependency '${a}' for flag '${r}'`)}if(n[a]==null)throw new U(`Dependency '${a}' could not be evaluated`)}let s=n[r];return this.flagEvaluatesToExpectedValue(e.value,s)}flagEvaluatesToExpectedValue(e,t){if(typeof e=="boolean")return e===t||typeof t=="string"&&t!==""&&e===!0;if(typeof e=="string")return t===e;return!1}async matchFeatureFlagProperties(e,t,i,n){let r=e.filters||{},o=r.groups||[],s=r.aggregation_group_type_index,a=r.early_exit??!1,{groups:g,groupProperties:l}=n,I=!1,d;for(let C of o)try{let m=C.aggregation_group_type_index!==void 0?C.aggregation_group_type_index:s,c=i,u=t;if(m!==s){if(m!=null){let A=this.groupTypeMapping[String(m)];if(!A||!(A in g)){this.logMsgIfDebug(()=>console.debug(`[FEATURE FLAGS] Skipping group condition for flag '${e.key}': group type index ${m} not available`));continue}if(!(A in l)){I=!0;continue}c=l[A],u=g[A]}}let p=await this.isConditionMatch(e,u,C,c,n);if(p==="match"){let A=C.variant,Z=r.multivariate?.variants||[];d=A&&Z.some((f)=>f.key===A)?A:await this.getMatchingVariant(e,u)||!0;break}if(a&&p==="out_of_rollout_bound")return!1}catch(m){if(m instanceof ct)throw m;if(m instanceof U)I=!0;else throw m}if(d!==void 0)return d;if(I)throw new U("Can't determine if feature flag is enabled or not with given properties");return!1}async isConditionMatch(e,t,i,n,r){let o=i.rollout_percentage,s=(a)=>{this.logMsgIfDebug(()=>console.warn(a))};if((i.properties||[]).length>0){for(let a of i.properties){let g=a.type,l=!1;if(g==="cohort"){let I=await ou(a,n,this.cohorts,this.debugMode,(d)=>this.evaluateFlagDependency(d,n,r));l=a.operator==="not_in"?!I:I}else l=g==="flag"?await this.evaluateFlagDependency(a,n,r):ru(a,n,s);if(!l)return"no_match"}if(o==null)return"match"}if(o!=null&&await eu(e.key,t)>o/100)return"out_of_rollout_bound";return"match"}async getMatchingVariant(e,t){let i=await eu(e.key,t,"variant"),n=this.variantLookupTable(e).find((r)=>i>=r.valueMin&&i<r.valueMax);if(n)return n.key}variantLookupTable(e){let t=[],i=0,n=0;return((e.filters||{}).multivariate?.variants||[]).forEach((s)=>{n=i+s.rollout_percentage/100,t.push({valueMin:i,valueMax:n,key:s.key}),i=n}),t}updateFlagState(e){this.featureFlags=e.flags,this.featureFlagsByKey=e.flags.reduce((t,i)=>(t[i.key]=i,t),{}),this.groupTypeMapping=e.groupTypeMapping,this.cohorts=e.cohorts,this.loadedSuccessfullyOnce=!0,this.onMinimalFlagCalledEvents?.(e.minimalFlagCalledEvents===!0)}warnAboutExperienceContinuityFlags(e){if(this.strictLocalEvaluation)return;let t=e.filter((i)=>i.ensure_experience_continuity);if(t.length>0)console.warn(`[PostHog] You are using local evaluation but ${t.length} flag(s) have experience continuity enabled: ${t.map((i)=>i.key).join(", ")}. Experience continuity is incompatible with local evaluation and will cause a server request on every flag evaluation, negating local evaluation cost savings. To avoid server requests and unexpected costs, either disable experience continuity on these flags in PostHog, use strictLocalEvaluation: true in client init, or pass onlyEvaluateLocally: true per flag call (flags that cannot be evaluated locally will return undefined).`)}async loadFromCache(e){if(!this.cacheProvider)return!1;try{let t=await this.cacheProvider.getFlagDefinitions();if(t)return this.updateFlagState(t),this.logMsgIfDebug(()=>console.debug(`[FEATURE FLAGS] ${e} (${t.flags.length} flags)`)),this.onLoad?.(this.featureFlags.length),this.warnAboutExperienceContinuityFlags(t.flags),!0;return!1}catch(t){return this.onError?.(Error(`Failed to load from cache: ${t}`)),!1}}async loadFeatureFlags(e=!1){if(this.loadedSuccessfullyOnce&&!e)return;if(!e&&this.nextFetchAllowedAt&&Date.now()<this.nextFetchAllowedAt)return void this.logMsgIfDebug(()=>console.debug("[FEATURE FLAGS] Skipping fetch, in backoff period"));if(!this.loadingPromise)this.loadingPromise=this._loadFeatureFlags().catch((t)=>this.logMsgIfDebug(()=>console.debug(`[FEATURE FLAGS] Failed to load feature flags: ${t}`))).finally(()=>{this.loadingPromise=void 0});return this.loadingPromise}isLocalEvaluationReady(){return(this.loadedSuccessfullyOnce??!1)&&(this.featureFlags?.length??0)>0}getFlagDefinitionsLoadedAt(){return this.flagDefinitionsLoadedAt}getPollingInterval(){if(!this.shouldBeginExponentialBackoff)return this.pollingInterval;return Math.min(GV,this.pollingInterval*2**this.backOffCount)}beginBackoff(){this.shouldBeginExponentialBackoff=!0,this.backOffCount+=1,this.nextFetchAllowedAt=Date.now()+this.getPollingInterval()}clearBackoff(){this.shouldBeginExponentialBackoff=!1,this.backOffCount=0,this.nextFetchAllowedAt=void 0}async _loadFeatureFlags(){if(this.poller)clearTimeout(this.poller),this.poller=void 0;this.poller=setTimeout(()=>this.loadFeatureFlags(!0),this.getPollingInterval());try{let e=!0;if(this.cacheProvider)try{e=await this.cacheProvider.shouldFetchFlagDefinitions()}catch(i){this.onError?.(Error(`Error in shouldFetchFlagDefinitions: ${i}`))}if(!e){if(await this.loadFromCache("Loaded flags from cache (skipped fetch)"))return;if(this.loadedSuccessfullyOnce)return}let t=await this._requestFeatureFlagDefinitions();if(!t)return;switch(t.status){case 304:this.logMsgIfDebug(()=>console.debug("[FEATURE FLAGS] Flags not modified (304), using cached data")),this.flagsEtag=t.headers?.get("ETag")??this.flagsEtag,this.loadedSuccessfullyOnce=!0,this.clearBackoff();return;case 401:throw this.beginBackoff(),new Ji(`Your project key or secret key is invalid. Setting next polling interval to ${this.getPollingInterval()}ms. More information: https://posthog.com/docs/api#rate-limiting`);case 402:console.warn("[FEATURE FLAGS] Feature flags quota limit exceeded - unsetting all local flags. Learn more about billing limits at https://posthog.com/docs/billing/limits-alerts"),this.featureFlags=[],this.featureFlagsByKey={},this.groupTypeMapping={},this.cohorts={},this.onMinimalFlagCalledEvents?.(!1);return;case 403:throw this.beginBackoff(),new Ji(`Your secret key does not have permission to fetch feature flag definitions for local evaluation. Setting next polling interval to ${this.getPollingInterval()}ms. Are you sure you're using the correct secret and Project API key pair? More information: https://posthog.com/docs/api/overview`);case 429:throw this.beginBackoff(),new Ji(`You are being rate limited. Setting next polling interval to ${this.getPollingInterval()}ms. More information: https://posthog.com/docs/api#rate-limiting`);case 200:{let i=await t.json()??{};if(!("flags"in i))return void this.onError?.(Error(`Invalid response when getting feature flags: ${JSON.stringify(i)}`));this.flagsEtag=t.headers?.get("ETag")??void 0;let n={flags:i.flags??[],groupTypeMapping:i.group_type_mapping||{},cohorts:i.cohorts||{},minimalFlagCalledEvents:i.minimal_flag_called_events===!0};if(this.updateFlagState(n),this.flagDefinitionsLoadedAt=Date.now(),this.clearBackoff(),this.cacheProvider&&e)try{await this.cacheProvider.onFlagDefinitionsReceived(n)}catch(r){this.onError?.(Error(`Failed to store in cache: ${r}`))}this.onLoad?.(this.featureFlags.length),this.warnAboutExperienceContinuityFlags(n.flags);break}default:return}}catch(e){if(e instanceof Ji)this.onError?.(e)}}getPersonalApiKeyRequestOptions(e="GET",t){let i={...this.customHeaders,"Content-Type":"application/json",Authorization:`Bearer ${this.personalApiKey}`};if(t)i["If-None-Match"]=t;return{method:e,headers:i}}_requestFeatureFlagDefinitions(){let e=`${this.host}/flags/definitions?token=${this.projectApiKey}&send_cohorts`,t=this.getPersonalApiKeyRequestOptions("GET",this.flagsEtag),i=null;if(this.timeout&&typeof this.timeout=="number"){let n=new AbortController;i=pe(()=>{n.abort()},this.timeout),t.signal=n.signal}try{let n=this.fetch;return n(e,t)}finally{clearTimeout(i)}}async stopPoller(e=30000){if(clearTimeout(this.poller),this.cacheProvider)try{let t=this.cacheProvider.shutdown();if(t instanceof Promise)await Promise.race([t,new Promise((i,n)=>setTimeout(()=>n(Error(`Cache shutdown timeout after ${e}ms`)),e))])}catch(t){this.onError?.(Error(`Error during cache shutdown: ${t}`))}}}async function eu(e,t,i=""){let n=await qc(`${e}.${t}${i}`);return parseInt(n.slice(0,15),16)/wV}function ru(e,t,i){let{key:n,value:r}=e,o=e.operator||"exact";if(n in t){if(o==="is_not_set")return!1}else{if(o==="is_not_set")return!0;throw new U(`Property ${n} not found in propertyValues`)}let s=t[n];if(s==null&&!FV.includes(o)){if(i)i(`Property ${n} cannot have a value of null/undefined with the ${o} operator`);return!1}function a(l,I){if(Array.isArray(l))return l.map((d)=>String(d).toLowerCase()).includes(String(I).toLowerCase());return String(l).toLowerCase()===String(I).toLowerCase()}function g(l,I,d){if(d==="gt")return l>I;if(d==="gte")return l>=I;if(d==="lt")return l<I;if(d==="lte")return l<=I;throw Error(`Invalid operator: ${d}`)}switch(o){case"exact":return a(r,s);case"is_not":return!a(r,s);case"is_set":return n in t;case"icontains":return String(s).toLowerCase().includes(String(r).toLowerCase());case"not_icontains":return!String(s).toLowerCase().includes(String(r).toLowerCase());case"regex":return tu(String(r))&&String(s).match(String(r))!==null;case"not_regex":return tu(String(r))&&String(s).match(String(r))===null;case"gt":case"gte":case"lt":case"lte":{let l=typeof r=="number"?r:parseFloat(String(r)),I;if(I=typeof s=="number"?s:s!=null?parseFloat(String(s)):NaN,Number.isFinite(l)&&Number.isFinite(I))return g(I,l,o);return g(String(s),String(r),o)}case"is_date_after":case"is_date_before":{if(typeof r=="boolean")throw new U("Date operations cannot be performed on boolean values");let l=NV(String(r));if(l==null)l=iu(r);if(l==null)throw new U(`Invalid date: ${r}`);let I=iu(s);if(["is_date_before"].includes(o))return I<l;return I>l}case"semver_eq":return Te(Ie(String(s)),Ie(String(r)))===0;case"semver_neq":return Te(Ie(String(s)),Ie(String(r)))!==0;case"semver_gt":return Te(Ie(String(s)),Ie(String(r)))>0;case"semver_gte":return Te(Ie(String(s)),Ie(String(r)))>=0;case"semver_lt":return Te(Ie(String(s)),Ie(String(r)))<0;case"semver_lte":return Te(Ie(String(s)),Ie(String(r)))<=0;case"semver_tilde":{let l=Ie(String(s)),{lower:I,upper:d}=vV(String(r));return Te(l,I)>=0&&Te(l,d)<0}case"semver_caret":{let l=Ie(String(s)),{lower:I,upper:d}=kV(String(r));return Te(l,I)>=0&&Te(l,d)<0}case"semver_wildcard":{let l=Ie(String(s)),{lower:I,upper:d}=PV(String(r));return Te(l,I)>=0&&Te(l,d)<0}default:throw new U(`Unknown operator: ${o}`)}}function HV(e,t){if(!(e in t))throw new ct(`cohort ${e} not found in local cohorts - likely a static cohort that requires server evaluation`)}async function ou(e,t,i,n=!1,r){let o=String(e.value);HV(o,i);let s=i[o];return su(s,t,i,n,r)}async function su(e,t,i,n=!1,r){if(!e)return!0;let{type:o,values:s}=e;if(!s||s.length===0)return!0;let a=!1;if("values"in s[0]){for(let g of s)try{let l=await su(g,t,i,n,r);if(o==="AND"){if(!l)return!1}else if(l)return!0}catch(l){if(l instanceof ct)throw l;if(l instanceof U){if(n)console.debug(`Failed to compute property ${g} locally: ${l}`);a=!0}else throw l}if(a)throw new U("Can't match cohort without a given cohort property value");return o==="AND"}for(let g of s)try{let l;if(g.type==="cohort")l=await ou(g,t,i,n,r);else if(g.type==="flag"){if(!r)throw new U(`Flag dependency '${g.key||"unknown"}' cannot be evaluated without a flag dependency evaluator`);l=await r(g)}else l=ru(g,t);let I=g.negation||!1;if(o==="AND"){if(!l&&!I)return!1;if(l&&I)return!1}else{if(l&&!I)return!0;if(!l&&I)return!0}}catch(l){if(l instanceof ct)throw l;if(l instanceof U){if(n)console.debug(`Failed to compute property ${g} locally: ${l}`);a=!0}else throw l}if(a)throw new U("can't match cohort without a given cohort property value");return o==="AND"}function tu(e){try{return new RegExp(e),!0}catch(t){return!1}}function au(e,t){if(!/^\d+$/.test(e))throw new U(`Invalid semver: ${t}`);if(e.length>1&&e[0]==="0")throw new U(`Invalid semver: ${t}`);return parseInt(e,10)}function Ie(e){let i=String(e).trim().replace(/^[vV]/,"").split("-")[0].split("+")[0];if(!i||i.startsWith("."))throw new U(`Invalid semver: ${e}`);let n=i.split("."),r=(g)=>{if(g===void 0||g==="")return 0;return au(g,e)},o=r(n[0]),s=r(n[1]),a=r(n[2]);return[o,s,a]}function Te(e,t){for(let i=0;i<3;i++){if(e[i]<t[i])return-1;if(e[i]>t[i])return 1}return 0}function vV(e){let t=Ie(e),i=[t[0],t[1],t[2]],n=[t[0],t[1]+1,0];return{lower:i,upper:n}}function kV(e){let t=Ie(e),[i,n,r]=t,o=[i,n,r],s;return s=i>0?[i+1,0,0]:n>0?[0,n+1,0]:[0,0,r+1],{lower:o,upper:s}}function PV(e){let i=String(e).trim().replace(/^[vV]/,"").replace(/\.\*$/,"").replace(/\*$/,"");if(!i)throw new U(`Invalid wildcard semver: ${e}`);let n=i.split("."),r=(g)=>{try{return au(g,e)}catch{throw new U(`Invalid wildcard semver: ${e}`)}},o=r(n[0]),s,a;if(n.length===1)s=[o,0,0],a=[o+1,0,0];else{let g=r(n[1]);s=[o,g,0],a=[o,g+1,0]}return{lower:s,upper:a}}function iu(e){if(e instanceof Date)return e;if(typeof e=="string"||typeof e=="number"){let t=new Date(e);if(!isNaN(t.valueOf()))return t;throw new U(`${e} is in an invalid date format`)}throw new U(`The date provided ${e} must be a string, number, or date object`)}function NV(e){let t=/^-?(?<number>[0-9]+)(?<interval>[a-z])$/,i=e.match(t),n=new Date(new Date().toISOString());if(!i)return null;{if(!i.groups)return null;let r=parseInt(i.groups.number);if(r>=1e4)return null;let o=i.groups.interval;if(o=="h")n.setUTCHours(n.getUTCHours()-r);else if(o=="d")n.setUTCDate(n.getUTCDate()-r);else if(o=="w")n.setUTCDate(n.getUTCDate()-7*r);else if(o=="m")n.setUTCMonth(n.getUTCMonth()-r);else{if(o!="y")return null;n.setUTCFullYear(n.getUTCFullYear()-r)}return n}}function YV(e,t){let i=!1;return Object.assign((n)=>{let o=global.process.listeners("uncaughtException").filter((s)=>s.name!=="domainUncaughtExceptionClear"&&s._posthogErrorHandler!==!0).length===0;if(e(n,{mechanism:{type:"onuncaughtexception",handled:!1}}),!i&&o)i=!0,t(n)},{_posthogErrorHandler:!0})}function gu(e,t){globalThis.process?.on("uncaughtException",YV(e,t))}function lu(e){globalThis.process?.on("unhandledRejection",(t)=>e(t,{mechanism:{type:"onunhandledrejection",handled:!1}}))}var xV=2000;class ut{constructor(e,t,i){this.client=e,this._exceptionAutocaptureEnabled=t.enableExceptionAutocapture||!1,this._logger=i,this._rateLimiter=new ea({...qd(t),refillInterval:1e4,_logger:this._logger}),this.startAutocaptureIfEnabled()}static isPreviouslyCapturedError(e){return Xn(e)&&"__posthog_previously_captured_error"in e&&e.__posthog_previously_captured_error===!0}static async buildEventMessage(e,t,i,n,r){let o={...r},s=e.buildFromUnknown(t,i);return s.$exception_list=await e.modifyFrames(s.$exception_list),{event:"$exception",distinctId:n,properties:{...s,...o},_originatedFromCaptureException:!0}}startAutocaptureIfEnabled(){if(this.isEnabled())gu(this.onException.bind(this),this.onFatalError.bind(this)),lu(this.onException.bind(this))}onException(e,t){this.client.addPendingPromise((async()=>{if(!ut.isPreviouslyCapturedError(e)){let i=await ut.buildEventMessage(this.client.getErrorPropertiesBuilder(),e,t),r=i.properties?.$exception_list[0]?.type??"Exception";if(this._rateLimiter.consumeRateLimit(r))return void this._logger.info("Skipping exception capture because of client rate limiting.",{exception:r});return this.client._capturePreparedEvent(i,!1)}})())}async onFatalError(e){console.error(e),await this.client.shutdown(xV),globalThis.process.exit(1)}isEnabled(){return!this.client.isDisabled&&this._exceptionAutocaptureEnabled}shutdown(){this._rateLimiter.stop()}}class Wa{getProperty(e){return this._memoryStorage[e]}setProperty(e,t){this._memoryStorage[e]=t!==null?t:void 0}constructor(){this._memoryStorage={}}}function SV(e){return e==="v0"||e==="v1"}function Iu(){let e=typeof process<"u"?process.env?.POSTHOG_CAPTURE_MODE:void 0;return SV(e)?e:"v0"}var Dn="analytics",_n="ai";function du(e){return typeof e.event=="string"&&e.event.startsWith("$ai_")}class Ti extends Error{constructor({requestId:e,drops:t,retryExhausted:i,cause:n}){super(Ti.buildMessage(e,t,i,n)),this.name="CaptureV1Error",this.requestId=e,this.drops=t,this.retryExhausted=i,this.cause=n}static buildMessage(e,t,i,n){let r=`Capture V1 batch ${e} did not fully deliver: ${t.length} dropped, ${i.length} undelivered`;if(n instanceof Error)r+=` (${n.message})`;return r}}function ya(e){if(typeof e=="boolean")return e;if(typeof e=="number")return e!==0;if(typeof e=="string"){let t=e.trim().toLowerCase();if(t==="true"||t==="1")return!0;if(t==="false"||t==="0")return!1}}function XV(e){return typeof e=="string"?e:void 0}var EV=[{property:"$cookieless_mode",optionKey:"cookieless_mode",coerce:ya},{property:"$ignore_sent_at",optionKey:"disable_skew_correction",coerce:ya},{property:"$process_person_profile",optionKey:"process_person_profile",coerce:ya},{property:"$product_tour_id",optionKey:"product_tour_id",coerce:XV}],JV=[{property:"$session_id",field:"session_id"},{property:"$window_id",field:"window_id"}];function TV(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function UV(e){if(typeof e=="string"){let i=new Date(e);return Number.isNaN(i.getTime())?new Date().toISOString():e}if(e instanceof Date)return Number.isNaN(e.getTime())?new Date().toISOString():e.toISOString();let t=e==null?new Date:new Date(e);return Number.isNaN(t.getTime())?new Date().toISOString():t.toISOString()}function cu(e,t,i){if(i!==void 0&&!(t in e))e[t]=i}function OV(e){let i={...TV(e.properties)?e.properties:{}},n={};for(let{property:o,optionKey:s,coerce:a}of EV)if(o in i){let g=a(i[o]);if(g!==void 0)n[s]=g;delete i[o]}let r={};for(let{property:o,field:s}of JV)if(o in i){let a=i[o];if(typeof a=="string")r[s]=a;delete i[o]}return delete i.$lib,delete i.$lib_version,cu(i,"$set",e.$set),cu(i,"$set_once",e.$set_once),{event:String(e.event??""),uuid:String(e.uuid??""),distinct_id:String(e.distinct_id??""),timestamp:UV(e.timestamp),...r,options:n,properties:i}}function uu(e,{createdAt:t,historicalMigration:i}){let n={created_at:t,batch:e.map(OV)};if(i)n.historical_migration=!0;return n}var zV="/i/v1/analytics/events",jV=30000,DV=new Set([408,500,502,503,504]);class Va{constructor(e,t){this.config=e,this.maxBackoffMs=e.maxBackoffMs??jV,this.fetchFn=t.fetch,this.onError=t.onError,this.now=t.now??Date.now,this.sleep=t.sleep??((i)=>new Promise((n)=>pe(n,i))),this.generateRequestId=t.generateRequestId??Se,this.compress=t.compress??ti}async sendV1Batch(e){if(e.length===0)return;let t=this.generateRequestId(),i=new Date(this.now()).toISOString(),{batch:n}=uu(e,{createdAt:i,historicalMigration:this.config.historicalMigration}),r=`${this.config.host}${zV}`,o=[],s=n,a=Math.max(1,this.config.maxAttempts);for(let g=1;g<=a;g++){let l=g===a,I=Ni({created_at:i,...this.config.historicalMigration?{historical_migration:!0}:{},batch:s}),d;try{d=await this.sendOnce(r,I,g,t)}catch(p){if(l)return this.surfaceBatchFailure(t,o,s,p);await this.sleep(this.backoffDelay(g));continue}let{status:C}=d;if(C<200||C>=300){if(!l&&DV.has(C)){let A=this.parseRetryAfter(d);await this.cancelBody(d),await this.sleep(this.backoffDelay(g,A));continue}let p=await this.buildHttpError(d,C);return this.surfaceBatchFailure(t,o,s,p)}let m;try{m=await this.parseResponse(d)}catch{return this.surfaceBatchFailure(t,o,s,Error(`Capture V1 returned an unparseable ${C} response body`))}let c=this.classify(s,m,o);if(c.length===0)return this.surfacePartialDrops(t,o);if(l)return void this.onError(new Ti({requestId:t,drops:o,retryExhausted:c.map((p)=>p.uuid)}));s=c;let u=this.parseRetryAfter(d);await this.sleep(this.backoffDelay(g,u))}}async sendOnce(e,t,i,n){let r=this.buildHeaders(i,n),o=t;if(this.config.compressionEnabled){let g=await this.compress(t,this.config.isDebug);if(g!==null)o=g,r["Content-Encoding"]="gzip"}let s=new AbortController,a=pe(()=>s.abort(),this.config.requestTimeoutMs);try{return await this.fetchFn(e,{method:"POST",headers:r,body:o,signal:s.signal})}finally{clearTimeout(a)}}buildHeaders(e,t){let i=`${this.config.libraryId}/${this.config.libraryVersion}`,n={"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,"PostHog-Sdk-Info":i,"PostHog-Attempt":String(e),"PostHog-Request-Id":t,"PostHog-Request-Timestamp":new Date(this.now()).toISOString()};if(this.config.userAgent)n["User-Agent"]=this.config.userAgent;return n}classify(e,t,i){let n=t.results??{},r=[];for(let o of e){let s=n[o.uuid];if(s){if(s.result==="drop")i.push({uuid:o.uuid,details:s.details??void 0});else if(s.result==="retry")r.push(o)}}return r}backoffDelay(e,t){let i=Math.min(this.config.initialRetryDelayMs*2**(e-1),this.maxBackoffMs);if(t===void 0)return i;return Math.max(i,Math.min(t,this.maxBackoffMs))}parseRetryAfter(e){let t=e.headers?.get("Retry-After");if(!t)return;let i=t.trim();if(/^\d+$/.test(i)){let o=parseInt(i,10);return Number.isFinite(o)&&o>0?1000*o:void 0}let n=Date.parse(i);if(Number.isNaN(n))return;let r=n-this.now();return r>0?r:void 0}async parseResponse(e){let t=await e.text(),i=JSON.parse(t);if(typeof i!="object"||i===null||Array.isArray(i))throw Error("unexpected response shape");let n=i.results;if(n!==void 0&&(typeof n!="object"||n===null||Array.isArray(n)))throw Error("unexpected results shape");return{results:n??{}}}async buildHttpError(e,t){let i="";try{i=(await e.text()).slice(0,512)}catch{}let n=i?`: ${i}`:"";return Error(`Capture V1 request failed with HTTP ${t}${n}`)}surfaceBatchFailure(e,t,i,n){this.onError(new Ti({requestId:e,drops:t,retryExhausted:i.map((r)=>r.uuid),cause:n}))}surfacePartialDrops(e,t){if(t.length>0)this.onError(new Ti({requestId:e,drops:t,retryExhausted:[]}))}async cancelBody(e){await e.body?.cancel()?.catch(()=>{})}}var _V=100,Cu=30000,QV=50000,KV=50,LV=500,MV="https://us.i.posthog.com",mu=new Set;function Vo(e,t){if(mu.has(e))return;mu.add(e),console.warn(`[PostHog] ${t}`)}function $V(e){return typeof e=="string"?e.trim():""}function qV(e){return(typeof e=="string"?e.trim():"")||void 0}function eB(e){return(typeof e=="string"?e.trim():"")||MV}function tB(e){return(Array.isArray(e)?e:[e]).filter((i)=>typeof i=="string"&&i.trim().length>0)}function iB(e){if(!e)return{};let t={};for(let[n,r]of Object.entries(e))t[`$feature/${n}`]=r;let i=Object.keys(e).filter((n)=>e[n]!==!1).sort();if(i.length>0)t.$active_feature_flags=i;return t}class Ba extends Wo{constructor(e,t={}){let i=$V(e),n={...t,maxQueueSize:t.maxQueueSize??1e4,flushInterval:t.flushInterval??5000,host:eB(t.host),personalApiKey:qV(t.secretKey??t.personalApiKey)};if(super(i,n),this._memoryStorage=new Wa,this._minimalFlagCalledEvents=!1,this.options=n,this.captureMode=Iu(),this.context=this.initializeContext(),this.options.featureFlagsPollingInterval=typeof n.featureFlagsPollingInterval=="number"?Math.max(n.featureFlagsPollingInterval,_V):Cu,typeof n.waitUntilDebounceMs=="number")this.options.waitUntilDebounceMs=Math.max(n.waitUntilDebounceMs,0);if(typeof n.waitUntilMaxWaitMs=="number")this.options.waitUntilMaxWaitMs=Math.max(n.waitUntilMaxWaitMs,0);if(!this.disabled&&n.personalApiKey){if(n.personalApiKey.includes("phc_"))throw Error('Your Personal API key is invalid. These keys are prefixed with "phx_" and can be created in PostHog project settings.');if(n.enableLocalEvaluation!==!1)this.featureFlagsPoller=new fa({pollingInterval:this.options.featureFlagsPollingInterval,personalApiKey:n.personalApiKey,projectApiKey:i,timeout:n.requestTimeout??1e4,host:this.host,fetch:n.fetch,onError:(o)=>{this._events.emit("error",o)},onLoad:(o)=>{this._events.emit("localEvaluationFlagsLoaded",o)},onMinimalFlagCalledEvents:(o)=>{this._minimalFlagCalledEvents=o},customHeaders:this.getCustomHeaders(),cacheProvider:n.flagDefinitionCacheProvider,strictLocalEvaluation:n.strictLocalEvaluation})}this.errorTracking=new ut(this,n,this._logger),this.distinctIdHasSentFlagCalls={},this.maxCacheSize=n.maxCacheSize||QV}enqueue(e,t,i){super.enqueue(e,t,i),this.scheduleDebouncedFlush()}async flush(){let e=this.flushWithPendingPromises(),t=this.options.waitUntil;if(t&&!this._waitUntilCycle)try{t(e.catch(()=>{}))}catch{}return e}scheduleDebouncedFlush(){let e=this.options.waitUntil;if(!e)return;if(this.disabled||this.optedOut)return;if(!this._waitUntilCycle){let o,s=new Promise((a)=>{o=a});try{e(s)}catch{return}this._waitUntilCycle={resolve:o,startedAt:Date.now(),timer:void 0}}let t=Date.now()-this._waitUntilCycle.startedAt,i=this.options.waitUntilMaxWaitMs??LV,n=t>=i;if(this._waitUntilCycle.timer!==void 0)clearTimeout(this._waitUntilCycle.timer);if(n)return void this.resolveWaitUntilFlush();let r=this.options.waitUntilDebounceMs??KV;this._waitUntilCycle.timer=pe(()=>{this.resolveWaitUntilFlush()},r)}_consumeWaitUntilCycle(){let e=this._waitUntilCycle;if(e)clearTimeout(e.timer),this._waitUntilCycle=void 0;return e?.resolve}async resolveWaitUntilFlush(){let e=this._consumeWaitUntilCycle();try{await this.flushWithPendingPromises()}catch{}finally{e?.()}}getPersistedProperty(e){return this._memoryStorage.getProperty(e)}setPersistedProperty(e,t){return this._memoryStorage.setProperty(e,t)}fetch(e,t){return this.options.fetch?this.options.fetch(e,t):fetch(e,t)}getQueueRouteKey(e){return this.captureMode==="v1"&&du(e)?_n:Dn}persistedQueueKeyForRoute(e){return e===_n?xe.AiQueue:xe.Queue}getActiveQueueRoutes(){return this.captureMode==="v1"?[Dn,_n]:[Dn]}async sendBatch(e,t,i=Dn){if(this.captureMode!=="v1"||i===_n)return super.sendBatch(e,t,i);let n=e.filter((r)=>r!==void 0);await this.getV1Sender().sendV1Batch(n)}getV1Sender(){if(!this._v1Sender)this._v1Sender=new Va({host:this.host,apiKey:this.apiKey,libraryId:this.getLibraryId(),libraryVersion:this.getLibraryVersion(),userAgent:this.getCustomUserAgent()||void 0,historicalMigration:this.historicalMigration,compressionEnabled:!this.disableCompression,requestTimeoutMs:this.requestTimeout,maxAttempts:(this.options.fetchRetryCount??3)+1,initialRetryDelayMs:this.options.fetchRetryDelay??3000,isDebug:this.isDebug},{fetch:(e,t)=>this.fetch(e,t),onError:(e)=>this._events.emit("error",e)});return this._v1Sender}getLibraryVersion(){return $c}get metrics(){if(!this._metrics)this._metrics=new Io(this,lo(this.options.metrics),this._logger);return this._metrics}getCustomUserAgent(){return`${this.getLibraryId()}/${this.getLibraryVersion()}`}getCommonEventProperties(){let e=super.getCommonEventProperties();if(this.options.isServer??!0)e.$is_server=!0;return e}enable(){return super.optIn()}disable(){return super.optOut()}debug(e=!0){super.debug(e),this.featureFlagsPoller?.debug(e)}_warnIfInvalidCapture(e,t,i){if(typeof e=="string")this._logger.warn(t);if(e.event==="$exception"&&!e._originatedFromCaptureException)this._logger.warn(i)}_sendPreparedEvent(e,t,i,n){return this.addPendingPromise(this._prepareEventMessage(t,n).then(({distinctId:r,event:o,properties:s,options:a})=>{let g={timestamp:a.timestamp,disableGeoip:a.disableGeoip,uuid:a.uuid},l={distinctId:r,event:o,properties:{...s,...this.getCommonEventProperties()}};return i?this.sendImmediate(e,l,g):this.enqueue(e,l,g)}).catch((r)=>{if(r)console.error(r)}))}_capturePreparedEvent(e,t){return this._sendPreparedEvent("capture",e,t)}capture(e){this._warnIfInvalidCapture(e,"Called capture() with a string as the first argument when an object was expected.","Using `posthog.capture('$exception')` is unreliable because it does not attach required metadata. Use `posthog.captureException(error)` instead, which attaches required metadata automatically."),this._capturePreparedEvent(e,!1)}async captureImmediate(e){return this._warnIfInvalidCapture(e,"Called captureImmediate() with a string as the first argument when an object was expected.","Capturing a `$exception` event via `posthog.captureImmediate('$exception')` is unreliable because it does not attach required metadata. Use `posthog.captureExceptionImmediate(error)` instead, which attaches this metadata by default."),this._capturePreparedEvent(e,!0)}identify({distinctId:e,properties:t={},disableGeoip:i}){let{$set:n,$set_once:r,$anon_distinct_id:o,...s}=t,l={$set:n||s,$set_once:r||{},$anon_distinct_id:o??void 0};this._sendPreparedEvent("identify",{distinctId:e,event:"$identify",properties:l,disableGeoip:i},!1,{includeContextProperties:!1})}async identifyImmediate({distinctId:e,properties:t={},disableGeoip:i}){let{$set:n,$set_once:r,$anon_distinct_id:o,...s}=t,l={$set:n||s,$set_once:r||{},$anon_distinct_id:o??void 0};await this._sendPreparedEvent("identify",{distinctId:e,event:"$identify",properties:l,disableGeoip:i},!0,{includeContextProperties:!1})}setPersonProperties({distinctId:e,properties:t={},propertiesOnce:i={}}){if(Object.keys(t).length===0&&Object.keys(i).length===0)return;let n={};if(Object.keys(t).length>0)n.$set=t;if(Object.keys(i).length>0)n.$set_once=i;this.capture({distinctId:e,event:"$set",properties:n})}unsetPersonProperties({distinctId:e,properties:t}){let i=tB(t);if(i.length===0)return;this.capture({distinctId:e,event:"$set",properties:{$unset:i}})}alias(e){this._sendPreparedEvent("alias",{distinctId:e.distinctId,event:"$create_alias",properties:{distinct_id:e.distinctId,alias:e.alias},disableGeoip:e.disableGeoip},!1,{includeContextProperties:!1})}async aliasImmediate(e){await this._sendPreparedEvent("alias",{distinctId:e.distinctId,event:"$create_alias",properties:{distinct_id:e.distinctId,alias:e.alias},disableGeoip:e.disableGeoip},!0,{includeContextProperties:!1})}isLocalEvaluationReady(){return this.featureFlagsPoller?.isLocalEvaluationReady()??!1}async waitForLocalEvaluationReady(e=Cu){if(this.isLocalEvaluationReady())return!0;if(this.featureFlagsPoller===void 0)return!1;return new Promise((t)=>{let i=setTimeout(()=>{n(),t(!1)},e),n=this._events.on("localEvaluationFlagsLoaded",(r)=>{clearTimeout(i),n(),t(r>0)})})}_resolveDistinctId(e,t){if(typeof e=="string")return{distinctId:e,options:t};return{distinctId:this.context?.get()?.distinctId,options:e}}async _getFeatureFlagResult(e,t,i={},n){if(this.disabled)return void this._logger.warn("The client is disabled");let r=i.sendFeatureFlagEvents??!0;if(this._flagOverrides!==void 0&&e in this._flagOverrides){let y=this._flagOverrides[e];if(y===void 0)return;let w=this._payloadOverrides?.[e];return{key:e,enabled:y!==!1,variant:typeof y=="string"?y:void 0,payload:w}}let{groups:o,disableGeoip:s}=i,{onlyEvaluateLocally:a,personProperties:g,groupProperties:l}=i,I=this.addLocalPersonAndGroupProperties(t,o,g,l);g=I.allPersonProperties,l=I.allGroupProperties;let d=this.createFeatureFlagEvaluationContext(t,o,this.personPropertiesForLocalEvaluation(t,g),l);if(a==null)a=this.options.strictLocalEvaluation??!1;let C,m=!1,c,u,p,A,Z,f,W;if(this.featureFlagsPoller!==void 0){await this.featureFlagsPoller?.loadFeatureFlags();let y=this.featureFlagsPoller?.featureFlagsByKey[e];if(y)try{let w=await this.featureFlagsPoller?.computeFlagAndPayloadLocally(y,d,{matchValue:n});if(w){m=!0;let Y=w.value;A=y.id,f="Evaluated locally",W=y.has_experiment,C={key:e,enabled:Y!==!1,variant:typeof Y=="string"?Y:void 0,payload:w.payload??void 0}}}catch(w){if(w instanceof ct||w instanceof U)this._logger?.info(`${w.name} when computing flag locally: ${e}: ${w.message}`);else throw w}}if(!m&&!a){let y=await super.getFeatureFlagDetailsStateless(d.distinctId,d.groups,g,l,s,[e]);if(y===void 0)p=Bt.UNKNOWN_ERROR;else{this._minimalFlagCalledEvents=y.minimalFlagCalledEvents===!0,c=y.requestId,u=y.evaluatedAt;let w=[];if(y.errorsWhileComputingFlags)w.push(Bt.ERRORS_WHILE_COMPUTING);if(y.quotaLimited?.includes("feature_flags"))w.push(Bt.QUOTA_LIMITED);let Y=y.flags[e];if(Y===void 0)w.push(Bt.FLAG_MISSING);else{A=Y.metadata?.id,Z=Y.metadata?.version,f=Y.reason?.description??Y.reason?.code,W=Y.metadata?.has_experiment;let H;if(Y.metadata?.payload!==void 0)try{H=JSON.parse(Y.metadata.payload)}catch{H=Y.metadata.payload}C={key:e,enabled:Y.enabled,variant:Y.variant,payload:H}}if(w.length>0)p=w.join(",")}}if(r){let y=C===void 0?void 0:C.enabled===!1?!1:C.variant??!0,w={$feature_flag:e,$feature_flag_response:y,$feature_flag_id:A,$feature_flag_version:Z,$feature_flag_reason:f,locally_evaluated:m,[`$feature/${e}`]:y,$feature_flag_request_id:c,$feature_flag_evaluated_at:m?Date.now():u};if(W!==void 0)w.$feature_flag_has_experiment=W;if(m&&this.featureFlagsPoller){let Y=this.featureFlagsPoller.getFlagDefinitionsLoadedAt();if(Y!==void 0)w.$feature_flag_definitions_loaded_at=Y}if(p)w.$feature_flag_error=p;this._captureFlagCalledEventIfNeeded({distinctId:t,key:e,response:y,groups:o,disableGeoip:s,properties:w})}if(C!==void 0&&this._payloadOverrides!==void 0&&e in this._payloadOverrides)C={...C,payload:this._payloadOverrides[e]};return C}async getFeatureFlag(e,t,i){Vo("getFeatureFlag","`getFeatureFlag` is deprecated and will be removed in a future major version. Use `posthog.evaluateFlags(distinctId, ...)` and call `flags.getFlag(key)` instead \u2014 this consolidates flag evaluation into a single `/flags` request per incoming request.");let n=await this._getFeatureFlagResult(e,t,{...i,sendFeatureFlagEvents:i?.sendFeatureFlagEvents??this.options.sendFeatureFlagEvent??!0});if(n===void 0)return;if(n.enabled===!1)return!1;return n.variant??!0}async getFeatureFlagPayload(e,t,i,n){if(Vo("getFeatureFlagPayload","`getFeatureFlagPayload` is deprecated and will be removed in a future major version. Use `posthog.evaluateFlags(distinctId, ...)` and call `flags.getFlagPayload(key)` instead \u2014 this consolidates flag evaluation into a single `/flags` request per incoming request."),this._payloadOverrides!==void 0&&e in this._payloadOverrides)return this._payloadOverrides[e];let r=await this._getFeatureFlagResult(e,t,{...n,sendFeatureFlagEvents:!1},i);if(r===void 0)return;return r.payload??null}async getFeatureFlagResult(e,t,i){let{distinctId:n,options:r}=this._resolveDistinctId(t,i);if(!n)return void this._logger.warn("[PostHog] distinctId is required \u2014 pass it explicitly or use withContext()");return this._getFeatureFlagResult(e,n,{...r,sendFeatureFlagEvents:r?.sendFeatureFlagEvents??this.options.sendFeatureFlagEvent??!0})}async getRemoteConfigPayload(e){if(this.disabled)return void this._logger.warn("The client is disabled");if(!this.options.personalApiKey)throw Error("Personal API key is required for remote config payload decryption");let t=await this._requestRemoteConfigPayload(e);if(!t)return;let i=await t.json();if(typeof i=="string")try{return JSON.parse(i)}catch(n){}return i}async isFeatureEnabled(e,t,i){Vo("isFeatureEnabled","`isFeatureEnabled` is deprecated and will be removed in a future major version. Use `posthog.evaluateFlags(distinctId, ...)` and call `flags.isEnabled(key)` instead \u2014 this consolidates flag evaluation into a single `/flags` request per incoming request.");let n=await this._getFeatureFlagResult(e,t,{...i,sendFeatureFlagEvents:i?.sendFeatureFlagEvents??this.options.sendFeatureFlagEvent??!0});if(n===void 0)return;if(n.enabled===!1)return!1;return!!(n.variant??!0)||!1}async getAllFlags(e,t){let{distinctId:i,options:n}=this._resolveDistinctId(e,t);if(!i)return this._logger.warn("[PostHog] distinctId is required to get feature flags \u2014 pass it explicitly or use withContext()"),{};return(await this.getAllFlagsAndPayloads(i,n)).featureFlags||{}}async getAllFlagsAndPayloads(e,t){let{distinctId:i,options:n}=this._resolveDistinctId(e,t);if(!i)return this._logger.warn("[PostHog] distinctId is required to get feature flags and payloads \u2014 pass it explicitly or use withContext()"),{featureFlags:{},featureFlagPayloads:{}};if(this.disabled)return this._logger.warn("The client is disabled"),{featureFlags:{},featureFlagPayloads:{}};let{groups:r,disableGeoip:o,flagKeys:s}=n||{},{onlyEvaluateLocally:a,personProperties:g,groupProperties:l}=n||{},I=this.addLocalPersonAndGroupProperties(i,r,g,l);g=I.allPersonProperties,l=I.allGroupProperties;let d=this.createFeatureFlagEvaluationContext(i,r,this.personPropertiesForLocalEvaluation(i,g),l);if(a==null)a=this.options.strictLocalEvaluation??!1;let C=await this.featureFlagsPoller?.getAllFlagsAndPayloads(d,s),m={},c={},u=!0;if(C)m=C.response,c=C.payloads,u=C.fallbackToFlags;if(u&&!a){let p=await super.getFeatureFlagsAndPayloadsStateless(d.distinctId,d.groups,g,l,o,s);m={...m,...p.flags||{}},c={...c,...p.payloads||{}}}if(this._flagOverrides!==void 0)m={...m,...this._flagOverrides};if(this._payloadOverrides!==void 0)c={...c,...this._payloadOverrides};return{featureFlags:m,featureFlagPayloads:c}}async evaluateFlags(e,t){let{distinctId:i,options:n}=this._resolveDistinctId(e,t);if(!i)return this._logger.warn("[PostHog] distinctId is required to evaluate feature flags \u2014 pass it explicitly or use withContext()"),new si({host:this._getFeatureFlagEvaluationsHost(),distinctId:"",flags:{}});if(this.disabled)return this._logger.warn("The client is disabled"),new si({host:this._getFeatureFlagEvaluationsHost(),distinctId:i,flags:{}});let{groups:r,disableGeoip:o,flagKeys:s}=n||{},{onlyEvaluateLocally:a,personProperties:g,groupProperties:l}=n||{},I=this.addLocalPersonAndGroupProperties(i,r,g,l);g=I.allPersonProperties,l=I.allGroupProperties;let d=this.createFeatureFlagEvaluationContext(i,r,this.personPropertiesForLocalEvaluation(i,g),l);if(a==null)a=this.options.strictLocalEvaluation??!1;let C={},m,c,u=!1,p=!1,A=await this.featureFlagsPoller?.getAllFlagsAndPayloads(d,s),Z=new Set;if(A)for(let[W,V]of Object.entries(A.response)){let y=this.featureFlagsPoller?.featureFlagsByKey[W];C[W]={key:W,enabled:V!==!1,variant:typeof V=="string"?V:void 0,payload:A.payloads[W],id:y?.id,version:void 0,reason:"Evaluated locally",locallyEvaluated:!0,hasExperiment:y?.has_experiment},Z.add(W)}if((A?A.fallbackToFlags:!0)&&!a){let W=await super.getFeatureFlagDetailsStateless(d.distinctId,d.groups,g,l,o,s);if(W){this._minimalFlagCalledEvents=W.minimalFlagCalledEvents===!0,m=W.requestId,c=W.evaluatedAt,u=Boolean(W.errorsWhileComputingFlags),p=Array.isArray(W.quotaLimited)&&W.quotaLimited.includes("feature_flags");for(let[V,y]of Object.entries(W.flags)){if(Z.has(V))continue;let w;if(y.metadata?.payload!==void 0)try{w=JSON.parse(y.metadata.payload)}catch{w=y.metadata.payload}C[V]={key:V,enabled:y.enabled,variant:y.variant,payload:w,id:y.metadata?.id,version:y.metadata?.version,reason:y.reason?.description??y.reason?.code,locallyEvaluated:!1,hasExperiment:y.metadata?.has_experiment}}}}if(this._flagOverrides!==void 0)for(let[W,V]of Object.entries(this._flagOverrides)){if(V===void 0){delete C[W];continue}let y=C[W];C[W]={key:W,enabled:V!==!1,variant:typeof V=="string"?V:void 0,payload:y?.payload,id:y?.id,version:y?.version,reason:y?.reason,locallyEvaluated:y?.locallyEvaluated??!1,hasExperiment:y?.hasExperiment}}if(this._payloadOverrides!==void 0)for(let[W,V]of Object.entries(this._payloadOverrides)){let y=C[W];if(y)C[W]={...y,payload:V}}return new si({host:this._getFeatureFlagEvaluationsHost(),distinctId:i,groups:r,disableGeoip:o,flags:C,requestId:m,evaluatedAt:c,flagDefinitionsLoadedAt:this.featureFlagsPoller?.getFlagDefinitionsLoadedAt(),errorsWhileComputing:u,quotaLimited:p})}_shouldSendMinimalFlagCalledEvent(e,t){return e==="$feature_flag_called"&&this._minimalFlagCalledEvents&&t.$feature_flag_has_experiment===!1}_captureFlagCalledEventIfNeeded(e){let{distinctId:t,key:i,response:n,groups:r,disableGeoip:o,properties:s}=e,a=r&&Object.keys(r).length>0?`_${JSON.stringify(Object.entries(r).sort(([l],[I])=>l<I?-1:l>I?1:0))}`:"",g=`${i}_${n}${a}`;if(t in this.distinctIdHasSentFlagCalls&&this.distinctIdHasSentFlagCalls[t].has(g))return;if(Object.keys(this.distinctIdHasSentFlagCalls).length>=this.maxCacheSize)this.distinctIdHasSentFlagCalls={};if(this.distinctIdHasSentFlagCalls[t]instanceof Set)this.distinctIdHasSentFlagCalls[t].add(g);else this.distinctIdHasSentFlagCalls[t]=new Set([g]);this.capture({distinctId:t,event:"$feature_flag_called",properties:s,groups:r,disableGeoip:o})}_getFeatureFlagEvaluationsHost(){if(!this._featureFlagEvaluationsHost)this._featureFlagEvaluationsHost={captureFlagCalledEventIfNeeded:(e)=>this._captureFlagCalledEventIfNeeded(e),logWarning:(e)=>{if(this.options.featureFlagsLogWarnings!==!1)console.warn(`[PostHog] ${e}`)}};return this._featureFlagEvaluationsHost}groupIdentify({groupType:e,groupKey:t,properties:i,distinctId:n,disableGeoip:r}){this._sendPreparedEvent("capture",{distinctId:n||`$${e}_${t}`,event:"$groupidentify",properties:{$group_type:e,$group_key:t,$group_set:i||{}},disableGeoip:r},!1,{includeContextProperties:!1})}async groupIdentifyImmediate({groupType:e,groupKey:t,properties:i,distinctId:n,disableGeoip:r}){await this._sendPreparedEvent("capture",{distinctId:n||`$${e}_${t}`,event:"$groupidentify",properties:{$group_type:e,$group_key:t,$group_set:i||{}},disableGeoip:r},!0,{includeContextProperties:!1})}async reloadFeatureFlags(){await this.featureFlagsPoller?.loadFeatureFlags(!0)}overrideFeatureFlags(e){let t=(i)=>Object.fromEntries(i.map((n)=>[n,!0]));if(e===!1){this._flagOverrides=void 0,this._payloadOverrides=void 0;return}if(Array.isArray(e)){this._flagOverrides=t(e);return}if(this._isFeatureFlagOverrideOptions(e)){if("flags"in e){if(e.flags===!1)this._flagOverrides=void 0;else if(Array.isArray(e.flags))this._flagOverrides=t(e.flags);else if(e.flags!==void 0)this._flagOverrides={...e.flags}}if("payloads"in e){if(e.payloads===!1)this._payloadOverrides=void 0;else if(e.payloads!==void 0)this._payloadOverrides={...e.payloads}}return}this._flagOverrides={...e}}_isFeatureFlagOverrideOptions(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if("flags"in t){let i=t.flags;if(i===!1||Array.isArray(i)||typeof i=="object"&&i!==null)return!0}if("payloads"in t){let i=t.payloads;if(i===!1||typeof i=="object"&&i!==null)return!0}return!1}withContext(e,t,i){if(!this.context)return t();return this.context.run(e,t,i)}getContext(){return this.context?.get()}enterContext(e,t){this.context?.enter(e,t)}async _shutdown(e){let t=Date.now()+(e??30000),i=this._consumeWaitUntilCycle();if(await this.featureFlagsPoller?.stopPoller(e),this.errorTracking.shutdown(),this._metrics)await Promise.race([this._metrics.flush().catch(()=>{}),new Promise((n)=>pe(n,Math.max(0,t-Date.now())))]),this._metrics.reset();try{return await super._shutdown(Math.max(0,t-Date.now()))}finally{this.distinctIdHasSentFlagCalls={},i?.()}}async _requestRemoteConfigPayload(e){if(this.disabled||!this.apiKey||!this.options.personalApiKey)return;let t=`${this.host}/api/projects/@current/feature_flags/${e}/remote_config?token=${encodeURIComponent(this.apiKey)}`,i={method:"GET",headers:{...this.getCustomHeaders(),"Content-Type":"application/json",Authorization:`Bearer ${this.options.personalApiKey}`}},n=null;if(this.options.requestTimeout&&typeof this.options.requestTimeout=="number"){let r=new AbortController;n=pe(()=>{r.abort()},this.options.requestTimeout),i.signal=r.signal}try{return await this.fetch(t,i)}catch(r){this._events.emit("error",r);return}finally{if(n)clearTimeout(n)}}extractPropertiesFromEvent(e,t){if(!e)return{personProperties:{},groupProperties:{}};let i={},n={};for(let[r,o]of Object.entries(e))if($d(o)&&t&&r in t){let s={};for(let[a,g]of Object.entries(o))s[String(a)]=String(g);n[String(r)]=s}else i[String(r)]=String(o);return{personProperties:i,groupProperties:n}}async getFeatureFlagsForEvent(e,t,i,n){if(this.disabled||!this.apiKey)return void this._logger.warn("The client is disabled");let r=n?.personProperties||{},o=n?.groupProperties||{},s=n?.flagKeys;if(n?.onlyEvaluateLocally??this.options.strictLocalEvaluation??!1)if(!((this.featureFlagsPoller?.featureFlags?.length||0)>0))return{};else{let g={};for(let[l,I]of Object.entries(t||{}))g[l]=String(I);return await this.getAllFlags(e,{groups:g,personProperties:r,groupProperties:o,disableGeoip:i,onlyEvaluateLocally:!0,flagKeys:s})}if((this.featureFlagsPoller?.featureFlags?.length||0)>0){let g={};for(let[l,I]of Object.entries(t||{}))g[l]=String(I);return await this.getAllFlags(e,{groups:g,personProperties:r,groupProperties:o,disableGeoip:i,onlyEvaluateLocally:!0,flagKeys:s})}return(await super.getFeatureFlagsStateless(e,t,r,o,i)).flags}addLocalPersonAndGroupProperties(e,t,i,n){let r={...i||{}},o={};if(t)for(let s of Object.keys(t))o[s]={$group_key:t[s],...n?.[s]||{}};return{allPersonProperties:r,allGroupProperties:o}}personPropertiesForLocalEvaluation(e,t){return{distinct_id:e,...t||{}}}createFeatureFlagEvaluationContext(e,t,i,n){return{distinctId:e,groups:t||{},personProperties:i||{},groupProperties:n||{},evaluationCache:{}}}captureException(e,t,i,n,r){if(!ut.isPreviouslyCapturedError(e)){let o=Error("PostHog syntheticException");this.addPendingPromise(ut.buildEventMessage(this.getErrorPropertiesBuilder(),e,{syntheticException:o},t,i).then((s)=>this._capturePreparedEvent({...s,uuid:n,flags:r},!1)))}}async captureExceptionImmediate(e,t,i,n){if(!ut.isPreviouslyCapturedError(e)){let r=Error("PostHog syntheticException");return this.addPendingPromise(ut.buildEventMessage(this.getErrorPropertiesBuilder(),e,{syntheticException:r},t,i).then((o)=>this.captureImmediate({...o,flags:n})))}}async prepareEventMessage(e){return this._prepareEventMessage(e)}async _prepareEventMessage(e,t={}){let{distinctId:i,event:n,properties:r,groups:o,flags:s,sendFeatureFlags:a,timestamp:g,disableGeoip:l,uuid:I}=e,d=this.context?.get(),C=t.includeContextProperties??!0,m=i||d?.distinctId,c=C?{...this.props,...d?.properties||{},...r||{}}:{...r||{}};if(!m)m=Se(),c.$process_person_profile=!1;if(C&&d?.sessionId&&!c.$session_id)c.$session_id=d.sessionId;let u=this._shouldSendMinimalFlagCalledEvent(n,c)?xn(c):c,p=this._runBeforeSend({distinctId:m,event:n,properties:u,groups:o,flags:s,sendFeatureFlags:a,timestamp:g,disableGeoip:l,uuid:I});if(!p)return Promise.reject(null);let A=await Promise.resolve().then(async()=>{if(s){if(a)console.warn("[PostHog] Both `flags` and `sendFeatureFlags` were passed to capture(); using `flags` and ignoring `sendFeatureFlags`.");return s._getEventProperties()}if(a){Vo("sendFeatureFlags","`sendFeatureFlags` is deprecated and will be removed in a future major version. Pass a `flags` snapshot from `posthog.evaluateFlags(...)` instead \u2014 it avoids a second `/flags` request per capture and guarantees the event carries the exact flag values your code branched on.");let Z=typeof a=="object"?a:void 0,f=await this.getFeatureFlagsForEvent(p.distinctId,o,l,Z);return iB(f)}return{}}).catch(()=>({})).then((Z)=>{let f=p.groups||o;return{...Z,...p.properties||{},...f!==void 0&&Object.keys(f).length>0?{$groups:f}:{}}});if(p.event==="$pageview"&&this.options.__preview_capture_bot_pageviews&&typeof A.$raw_user_agent=="string"){if(jd(A.$raw_user_agent,this.options.custom_blocked_useragents||[]))p.event="$bot_pageview",A.$browser_type="bot"}return{distinctId:p.distinctId,event:p.event,properties:A,options:{timestamp:p.timestamp,disableGeoip:p.disableGeoip,uuid:p.uuid}}}_runBeforeSend(e){let t=this.options.before_send;if(!t)return e;let i=Array.isArray(t)?t:[t],n=e;for(let r of i){if(n=r(n),!n)return this._logger.info(`Event '${e.event}' was rejected in beforeSend function`),null;if(!n.properties||Object.keys(n.properties).length===0){let o=`Event '${n.event}' has no properties after beforeSend function, this is likely an error.`;this._logger.warn(o)}}return n}}var pu=require("async_hooks");class Ra{constructor(){this.storage=new pu.AsyncLocalStorage}get(){return this.storage.getStore()}run(e,t,i){return this.storage.run(this.resolve(e,i),t)}enter(e,t){this.storage.enterWith(this.resolve(e,t))}resolve(e,t){if(t?.fresh===!0)return e;let i=this.get()||{};return{distinctId:e.distinctId??i.distinctId,sessionId:e.sessionId??i.sessionId,properties:{...i.properties||{},...e.properties||{}}}}}function nB(e,{organization:t,projectId:i,prefix:n,severityAllowList:r=["error"],sendExceptionsToPostHog:o=!0}={}){return(s)=>{if(!(r==="*"||r.includes(s.level)))return s;if(!s.tags)s.tags={};let g=s.tags[Au.POSTHOG_ID_TAG];if(g===void 0)return s;let l=e.options.host??"https://us.i.posthog.com",I=new URL(`/project/${e.apiKey}/person/${g}`,l).toString();s.tags["PostHog Person URL"]=I;let d=s.exception?.values||[],C=d.map((c)=>({...c,stacktrace:c.stacktrace?{...c.stacktrace,type:"raw",frames:(c.stacktrace.frames||[]).map((u)=>({...u,platform:"node:javascript"}))}:void 0})),m={$exception_message:d[0]?.value||s.message,$exception_type:d[0]?.type,$exception_level:s.level,$exception_list:C,$sentry_event_id:s.event_id,$sentry_exception:s.exception,$sentry_exception_message:d[0]?.value||s.message,$sentry_exception_type:d[0]?.type,$sentry_tags:s.tags};if(t&&i)m.$sentry_url=(n||"https://sentry.io/organizations/")+t+"/issues/?project="+i+"&query="+s.event_id;if(o)e.capture({event:"$exception",distinctId:g,properties:m});return s}}class Au{static#i=this.POSTHOG_ID_TAG="posthog_distinct_id";constructor(e,t,i,n,r){this.name="posthog-node",this.name="posthog-node",this.setupOnce=function(o,s){let a=s()?.getClient()?.getDsn()?.projectId;o(nB(e,{organization:t,projectId:a,prefix:i,severityAllowList:n,sendExceptionsToPostHog:r??!0}))}}}class Ga extends Ba{getLibraryId(){return"posthog-node"}initializeContext(){return new Ra}createErrorPropertiesBuilder(){return new He.ErrorPropertiesBuilder([new He.EventCoercer,new He.ErrorCoercer,new He.ObjectCoercer,new He.StringCoercer,new He.PrimitiveCoercer],He.createStackParser("node:javascript",He.nodeStackLineParser),[Ud(),Qc,Mc()])}}class ee extends Error{code;status;body;requestId;constructor(e,t,i,n,r){super(e);this.name="PotatoApiError",this.code=t,this.status=i,this.body=n,this.requestId=r}static fromResponse(e,t,i){let n=i===void 0?"":` (request id: ${i})`;return new ee(`Potato API request failed with status ${e}${n}`,"http",e,t,i)}static waitTimeout(e){return new ee(`Potato API job did not reach a terminal status within ${e} ms`,"wait_timeout",void 0,{timeoutMs:e})}}class Ui extends Error{code="invalid_pipeline_graph";issues;constructor(e,t){super(e);this.name="PipelineGraphValidationError",this.issues=t}static fromIssues(e){let t=e.map(({path:i,reason:n})=>`- ${i}: ${n}`).join(`
|
|
37
37
|
`);return new Ui(`Pipeline graph validation failed
|
|
38
38
|
${t}`,e)}}var We=require("fs/promises"),fu=require("os"),ai=require("path");class E extends Error{hint;constructor(e,t){super(e,t.cause===void 0?void 0:{cause:t.cause});this.name="TolokaCliError",this.hint=t.hint}}function b(e,t,i){if(!e)throw new E(t,i)}var bu=(e)=>("disabled"in e)?void 0:`Hint: ${e.description}`,k={description:"This looks like a defect in the CLI or the platform. Write a report as the toloka-report-issue skill describes, then send it with toloka report <report.md>."},Yt={description:"Retry the command; if it keeps failing, write a report as the toloka-report-issue skill describes and send it with toloka report <report.md>."},de={description:"Reinstall @toloka-platform/sdk to restore the bundled files."};class Qn extends E{constructor(e,t){super(e,t);this.name="CredentialsError"}}var Wu=(e)=>e.HOME??fu.homedir(),rB=(e)=>e.XDG_CONFIG_HOME??ai.join(Wu(e),".config"),Ue=(e=process.env)=>e.TOLOKA_CREDENTIALS_FILE??ai.join(rB(e),"toloka","credentials.json"),yu=(e=process.env)=>ai.join(Wu(e),".toloka","credentials.json"),Go=(e=process.env)=>ai.dirname(Ue(e)),Zu=(e)=>{let t=e.length;while(t>0&&e.charCodeAt(t-1)===47)t-=1;return t===e.length?e:e.slice(0,t)},Rt=(e)=>{let t=Zu(e.trim());try{let i=new URL(t);return i.hash="",i.search="",Zu(i.toString())}catch{return t}},Bo=(e,t)=>typeof e==="object"&&e!==null?Reflect.get(e,t):void 0,oB=(e)=>{if(typeof e!=="object"||e===null)return;let t=Reflect.get(e,"id");if(typeof t!=="string"||t.length===0)return;let i=Reflect.get(e,"name");if(i!==void 0&&typeof i!=="string")return;return i===void 0?{id:t}:{id:t,name:i}},sB=(e)=>{if(e===void 0||typeof e!=="object"||e===null||Array.isArray(e))return;let t=Object.create(null);for(let[i,n]of Object.entries(e)){if(i.length===0)return;let r=oB(n);if(r===void 0)return;Object.defineProperty(t,i,{value:r,writable:!0,enumerable:!0,configurable:!0})}return t},aB=(e,t)=>{let i=sB(e);if(i===void 0)return;if(typeof t==="string"){if(t.length===0||!Object.hasOwn(i,t))return;return{current:t,projects:i}}if(t!==void 0)return;return Object.keys(i).length===0?{}:{projects:i}},gB=(e)=>{let t=Bo(e,"baseUrl"),i=Bo(e,"apiKey");if(typeof t!=="string"||t.length===0)return;if(typeof i!=="string"||i.length===0)return;let n=Bo(e,"current"),r=Bo(e,"projects");if(n===void 0&&r===void 0)return{baseUrl:t,apiKey:i};let o=aB(r,n);if(o===void 0)return;return{baseUrl:t,apiKey:i,...o}};async function Ro(e){let t;try{t=await We.readFile(e,"utf8")}catch(i){if(i instanceof Error&&"code"in i&&i.code==="ENOENT")return"missing";return"invalid"}try{let i=gB(JSON.parse(t));return i===void 0?"invalid":{credentials:i}}catch{return"invalid"}}async function wa(e=process.env){let t=Ue(e),i=await Ro(t);if(i!=="missing"){if(i==="invalid")throw new Qn(`Invalid credentials file at ${t}. Run toloka logout, then toloka login.`,{hint:{disabled:!0}});return{credentials:i.credentials,path:t,legacy:!1}}if(e.TOLOKA_CREDENTIALS_FILE!==void 0)return;let n=yu(e),r=await Ro(n);if(r==="missing")return;if(r==="invalid")throw new Qn(`Invalid credentials file at ${n}. Run toloka logout, then toloka login.`,{hint:{disabled:!0}});return{credentials:r.credentials,path:n,legacy:!0}}async function Oi(e,t){try{return{found:await wa(e)}}catch(i){if(!(i instanceof Qn)||t===void 0)throw i;return{found:void 0,warning:i.message}}}async function Vu(e=process.env){return(await wa(e))?.credentials}async function xt(e=process.env){let t=await wa(e);if(t!==void 0)return t;throw new Qn(`No stored credentials found at ${Ue(e)}. Run toloka login.`,{hint:{disabled:!0}})}var lB=(e)=>{let t=e.projects,i=t!==void 0&&Object.keys(t).length>0;return{baseUrl:e.baseUrl,apiKey:e.apiKey,...e.current===void 0?{}:{current:e.current},...i?{projects:t}:{}}},hu=async(e)=>{try{let t=await We.lstat(e);b(!t.isSymbolicLink(),`Refusing to write through symbolic link ${e}.`,{hint:{description:"Replace the symbolic link with a regular file or directory, then retry."}})}catch(t){if(t instanceof Error&&"code"in t&&t.code==="ENOENT")return;throw t}};async function gi(e){let t=ai.dirname(e);await hu(t),await hu(e),await We.mkdir(t,{recursive:!0,mode:448}),await We.chmod(t,448)}async function wo(e,t=process.env){let i=Ue(t);return await gi(i),await We.writeFile(i,`${JSON.stringify(lB(e),null,2)}
|
|
39
|
-
`,{mode:384}),await We.chmod(i,384),i}var IB=async(e)=>{try{return await We.stat(e),!0}catch(t){if(t instanceof Error&&"code"in t&&t.code==="ENOENT")return!1;throw t}};async function Bu(e=process.env){let t=[],i=[Ue(e),...e.TOLOKA_CREDENTIALS_FILE===void 0?[yu(e)]:[]];for(let n of i){if(!await IB(n))continue;await We.rm(n,{force:!0}),t.push(n)}return t}var dB=16,Ru=(e)=>e.length>dB?`${e.slice(0,4)}${"*".repeat(e.length-8)}${e.slice(-4)}`:"*".repeat(e.length);var Oe=(e)=>{if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"},zi=(e)=>{if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"};var Fa={name:"@toloka-platform/sdk",version:"0.2.0
|
|
39
|
+
`,{mode:384}),await We.chmod(i,384),i}var IB=async(e)=>{try{return await We.stat(e),!0}catch(t){if(t instanceof Error&&"code"in t&&t.code==="ENOENT")return!1;throw t}};async function Bu(e=process.env){let t=[],i=[Ue(e),...e.TOLOKA_CREDENTIALS_FILE===void 0?[yu(e)]:[]];for(let n of i){if(!await IB(n))continue;await We.rm(n,{force:!0}),t.push(n)}return t}var dB=16,Ru=(e)=>e.length>dB?`${e.slice(0,4)}${"*".repeat(e.length-8)}${e.slice(-4)}`:"*".repeat(e.length);var Oe=(e)=>{if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"},zi=(e)=>{if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="0"||t==="false"||t==="no"||t==="off"};var Fa={name:"@toloka-platform/sdk",version:"0.2.0",private:!1,description:"Build, inspect, and operate Toloka pipeline projects as TypeScript source. The public API may change between minor versions before 1.0.",license:"Apache-2.0",bin:{toloka:"bin/toloka.js"},files:["README.md","bin","docs","dist","examples","openapi/gen","skills","src"],type:"module",main:"./src/index.ts",exports:{".":"./src/index.ts","./testing":"./src/testing/index.ts","./checks":"./src/checks/index.ts","./examples/face-image-collection":"./examples/face-image-collection/pipeline.ts"},publishConfig:{access:"public",registry:"https://registry.npmjs.org/",tag:"latest"},scripts:{build:"bun ./scripts/build-cli.ts ./dist/cli",generate:"orval --config ./openapi/orval.config.js",prepack:"bun run build","sync-skill-catalog":"bun ./scripts/sync-skill-catalog.ts","sync-task-ui-declarations":"bun ./scripts/sync-task-ui-declarations.ts",test:"vitest run","test:browser":"vitest run --config vitest.browser.config.ts",typecheck:"tsc --noEmit"},dependencies:{"@inquirer/select":"5.2.1","@typescript/vfs":"1.6.2",ajv:"8.17.1","ajv-formats":"3.0.1",commander:"15.0.0","es-toolkit":"1.42.0","jsonpath-rfc9535":"1.3.0","oxc-parser":"0.138.0","posthog-node":"5.46.1","typescript-api":"npm:typescript@6.0.3"},devDependencies:{"@types/node":"24.10.1",orval:"7.17.0",playwright:"1.56.1",typescript:"7.0.2",vitest:"4.1.0",yaml:"2.9.0"},peerDependencies:{playwright:">=1.56.1 <2",vitest:">=4.1.0 <5"},peerDependenciesMeta:{playwright:{optional:!0},vitest:{optional:!0}},engines:{bun:">=1.4.0"}};var re=Fa.name,ie=Fa.version,Ha=(e)=>{let t=/^(\d+)\.(\d+)\.(\d+)(?:-preview\.(\d+))?$/u.exec(e);if(t===null)return;let[,i,n,r,o]=t;return[Number(i),Number(n),Number(r),o===void 0?Number.POSITIVE_INFINITY:Number(o)]},Fo=(e)=>{let t=Ha(e);if(t===void 0)return;return t[3]===Number.POSITIVE_INFINITY?"latest":"preview"},va=(e,t)=>{let i=Ha(e),n=Ha(t);if(i===void 0||n===void 0)return;let r=Math.max(i.length,n.length);for(let o=0;o<r;o+=1){let s=i[o]??0,a=n[o]??0;if(s<a)return-1;if(s>a)return 1}return 0};var Kn=(e)=>{let t=typeof e.body==="string"?e.body:e.body===void 0?void 0:JSON.stringify(e.body);return t===void 0||t.length===0?void 0:t},uB=(e)=>{if(e.code==="wait_timeout")return"Hint: The job is still running. Check it later with its status command; commands that accept --timeout can wait longer.";if(e.status===401||e.status===403)return"Hint: Run toloka whoami to see which key and platform are in use; toloka login stores a new key.";if(e.status===404)return"Hint: Check the id against toloka project current and the matching list command; ids belong to one project on one platform.";if(e.status===429)return"Hint: The platform is rate limiting this key; wait a moment and retry.";if(e.status!==void 0&&e.status>=500)return"Hint: The platform failed to handle the request. Retry; if it keeps failing, write a report as the toloka-report-issue skill describes and send it with toloka report <report.md>.";return},Gu=(e)=>e.filter((t)=>t!==void 0&&t.length>0).join(`
|
|
40
40
|
`),ji=(e)=>{if(e instanceof ee)return e;if(e instanceof AggregateError)for(let t of e.errors){let i=ji(t);if(i!==void 0)return i}return e instanceof Error?ji(e.cause):void 0},li=(e)=>{if(e instanceof E){let t=ji(e.cause),i=t===void 0?[]:t.message===e.message?[Kn(t)]:[t.message,Kn(t)];return Gu([e.message,...i,bu(e.hint)])}if(e instanceof ee)return Gu([e.message,Kn(e),uB(e)]);return e instanceof Error?e.message:String(e)};var CB="phc_kqHt0f53B5MVqURyzWpW1aNlbOmYt1YbUYza0JPcg19",mB="https://eu.posthog.com",pB={"--source-root":!0,"--api-key":!0,"--base-url":!0,"--project-id":!0};function AB(e){let t=e.TOLOKA_TELEMETRY??process.env.TOLOKA_TELEMETRY;if(zi(t))return!1;if(Oe(t))return!0;if(Oe(e.DO_NOT_TRACK??process.env.DO_NOT_TRACK))return!1;if(Oe(e.CI??process.env.CI))return!1;if(Oe(process.env.VITEST))return!1;return!0}var bB={project:{list:!0,add:!0,switch:!0,current:!0,remove:!0,create:!0},pipeline:{list:!0,run:!0,status:!0,runs:!0,cost:!0,cancel:!0,results:!0},dataset:{list:!0,create:!0,fields:!0,load:!0,upload:!0},"delivery-order":{list:!0},training:{list:!0,get:!0,create:!0,update:!0,cost:!0,run:!0,runs:!0,status:!0,resume:!0,cancel:!0,metrics:!0,logs:!0},"base-model":{list:!0,get:!0},model:{list:!0,get:!0,versions:!0,create:!0,archive:!0,version:{download:!0}},secret:{set:!0},skill:{list:!0,search:!0,install:!0},config:{get:!0,set:!0}},ZB={apply:!0,check:!0,"auth-status":!0,config:!0,help:!0,import:!0,init:!0,login:!0,logout:!0,plan:!0,status:!0,validate:!0,report:!0,version:!0,whoami:!0},Fu=(e)=>{let t=e[0];if(t===void 0)return"help";let i=bB[t];if(i===void 0)return ZB[t]===!0?t:"unknown";let n=e[1],r=n===void 0?void 0:i[n];if(r===void 0)return t;if(r===!0)return`${t} ${n}`;let o=e[2];return o!==void 0&&r[o]===!0?`${t} ${n} ${o}`:`${t} ${n}`};function vo(e){if(e.includes("-v")||e.includes("--version"))return"version";let t=[];for(let i=0;i<e.length;i+=1){let n=e[i];if(n===void 0)continue;if(n==="--help"||n==="-h")break;if(n.startsWith("-")){if(pB[n]===!0)i+=1;continue}t.push(n)}return Fu(t)}function hB(e){if(e===void 0)return{error_code:"command_failed"};let t=ji(e);if(t!==void 0)return{error_code:t.code};if(e instanceof Ui)return{error_code:e.code};return{error_code:e instanceof Error?"error":"unknown"}}var fB=(e)=>{let t=ji(e);return t===void 0?{}:{status_code:t.status,request_id:t.requestId}},WB=(e)=>Ho.join(Ho.dirname(Ue(e)),"anonymous-id"),yB=async(e)=>{let t=WB(e);await gi(t);try{let n=(await Ii.readFile(t,"utf8")).trim();if(n.length>0)return await Ii.chmod(t,384),n}catch(n){if(!(n instanceof Error&&("code"in n)&&n.code==="ENOENT"))throw n}let i=wu.randomUUID();return await Ii.writeFile(t,`${i}
|
|
41
41
|
`,{mode:384}),await Ii.chmod(t,384),i},VB=()=>({shouldIdentify:!1,issueReportingEnabled:!1,identifyCurrentUser(){},captureCommand(){},async submitIssueReport(){b(!1,"Issue reporting is disabled. Re-run with TOLOKA_TELEMETRY=1.",{hint:{disabled:!0}})},async shutdown(){}});function Hu(e){let{environment:t}=e;if(e.client===void 0&&!AB(t))return VB();let{client:i,distinctId:n}=e,r,o=[],s=(I)=>{o.push(I)};i?.on?.("error",s);let a=async()=>{if(i!==void 0&&n!==void 0)return;if(i===void 0){let I=new Ga(CB,{host:mB,flushAt:1,flushInterval:0});I.on("error",s),i=I}n??=await yB(t)},g=()=>({sdk_version:ie,bun_version:typeof process.versions.bun==="string"?process.versions.bun:void 0,actor:"user",channel:"cli"}),l=a().catch(()=>{});return{issueReportingEnabled:!0,shouldIdentify:!0,identifyCurrentUser(I){l=l.then(()=>{if(i===void 0||n===void 0)return;if(r===I.id)return;if(r=I.id,n!==I.id)i.alias({distinctId:I.id,alias:n});n=I.id}).catch(()=>{})},captureCommand(I){l=l.then(()=>{if(i===void 0||n===void 0)return;let d=g(),C=Fu(I.command.split(" "));if(I.outcome==="failed"){let m=hB(I.error),c=fB(I.error);if(I.error!==void 0){let u=new E(`CLI command failed: ${m.error_code}`,{hint:{disabled:!0}});u.name="PotatoCliError",i.captureException(u,n,{...d,command:C,duration_ms:I.durationMs,exit_code:I.exitCode,$process_person_profile:!1,$geoip_disable:!0,...m,...c})}i.capture({distinctId:n,event:"sdk_cli_command_failed",disableGeoip:!0,properties:{...d,command:C,duration_ms:I.durationMs,exit_code:I.exitCode,...m,...c}});return}i.capture({distinctId:n,event:"sdk_cli_command_completed",disableGeoip:!0,properties:{...d,command:C,duration_ms:I.durationMs,exit_code:I.exitCode,outcome:I.outcome}})}).catch(()=>{})},submitIssueReport(I){let d=l.then(async()=>{b(i&&n,"PostHog issue reporting could not be initialized.",{hint:{description:"Set TOLOKA_TELEMETRY=1 and check that this machine can reach PostHog, then retry."}}),o.length=0,i.capture({distinctId:n,event:"sdk_cli_issue_report_submitted",disableGeoip:!0,properties:{...g(),report_id:I.reportId,report_text:I.reportText,report_length_bytes:new TextEncoder().encode(I.reportText).length,authored_by:I.authoredBy,platform:I.platform,$process_person_profile:!1}}),await i.flush();let C=o[0];if(o.length=0,C!==void 0)throw C});return l=d.catch(()=>{}),d},async shutdown(){try{await l,await i?.shutdown(2000)}catch{}}}}var sI=require("child_process"),hs=require("events"),MA=require("fs"),bn=require("fs/promises"),An=require("path");var Mn=require("fs"),di=require("path");var vu=di.join("bin","toloka.js"),ku=(e)=>{try{return Mn.realpathSync(e)}catch{return e}},Ln=(e)=>{let t=di.join(e,vu);if(Mn.existsSync(t))return t;let i=di.dirname(e);return i===e?void 0:Ln(i)},Pu=(e=process.argv[1])=>(e===void 0?void 0:Ln(di.dirname(ku(e))))??Ln(process.cwd()),Nu=(e=process.argv[1])=>{let t=e===void 0?void 0:ku(e);if(t!==void 0&&Mn.existsSync(t)&&Ln(di.dirname(t))!==void 0)return t;let i=Ln(process.cwd());return b(i!==void 0,`Cannot locate the toloka CLI entry point. An installed @toloka-platform/sdk ships ${vu} in a directory above its runtime entry, but none exists above ${e??"the unset process.argv[1]"} or above ${process.cwd()}. Reinstall @toloka-platform/sdk.`,{hint:{disabled:!0}}),i};var _i=require("fs/promises"),Yu=require("path");var Di="auto-update",xu={autoUpdate:!0};class ko extends E{constructor(e,t){super(e,t);this.name="SettingsError"}}var Su=(e=process.env)=>Yu.join(Go(e),"settings.json"),BB=(e)=>{let t=typeof e==="object"&&e!==null?Reflect.get(e,"autoUpdate"):void 0;if(typeof t!=="boolean")return xu;return{autoUpdate:t}};async function $n(e=process.env){try{return BB(JSON.parse(await _i.readFile(Su(e),"utf8")))}catch{return xu}}async function RB(e,t=process.env){let i=Su(t);return await gi(i),await _i.writeFile(i,`${JSON.stringify({autoUpdate:e.autoUpdate},null,2)}
|
|
42
42
|
`,{mode:384}),await _i.chmod(i,384),i}var GB=(e)=>{if(Oe(e))return!0;if(zi(e))return!1;throw new ko(`Expected a boolean (true or false), got ${JSON.stringify(e)}.`,{hint:{description:"Run toloka config set auto-update true or false."}})},wB=(e)=>`${Di}=${e.autoUpdate}`,ka=(e,t)=>{if(t===void 0||t.length===0)return{output:wB(e)};if(t!==Di)throw new ko(`Unknown setting "${t}". Known settings: ${Di}.`,{hint:{disabled:!0}});return{output:String(e.autoUpdate)}};async function Xu(e,t,i){if(t!==Di)throw new ko(`Unknown setting "${t}". Known settings: ${Di}.`,{hint:{disabled:!0}});let n={autoUpdate:GB(i)};return await RB(n,e),{settings:n,output:`Set ${Di} to ${n.autoUpdate}.`}}var UA=require("fs"),OA=require("child_process"),zA=require("module"),jA=require("events"),Kt=require("fs/promises"),eI=require("os"),Qt=require("path");var Tu=require("oxc-parser");var Eu=require("oxc-parser"),Pa=(e,t,i)=>{let n=Eu.parseSync(e,t,{lang:i,preserveParens:!1});return n.errors.some((r)=>r.severity==="Error")?null:n.program},Ju=(e)=>{let t=e?.value;if(!t)return null;if(t.type==="Literal")return typeof t.value==="string"?t.value:null;if(t.type==="JSXExpressionContainer"){let i=t.expression;if(i.type==="Literal"&&typeof i.value==="string")return i.value;if(i.type==="TemplateLiteral"&&i.expressions.length===0)return i.quasis[0]?.value.cooked??null}return null};var Na=(e)=>{let t=HB(e.postprocess);if(!t||t.size===0)return[];let i=FB(e.code);if(!i||i.size===0)return[];return[...i].filter(([n])=>t.has(n)).sort(([n],[r])=>n.localeCompare(r)).map(([n,r])=>{let o=r===n?`path="${r}"`:`path="${r}" \u2014 a dotted path binds its top-level key "${n}"`;return{severity:"error",text:`Postprocess returns the key "${n}", but a Field component is bound to it (${o}). Every submission of this interface fails at runtime with: Postprocess cannot write key '${n}' because a component is bound to it. Fix: bind the Field to a raw key (e.g. path="raw_${n}") and derive "${n}" in postprocess, or remove "${n}" from the postprocess return.`}})},FB=(e)=>{let t=Pa("code.tsx",`(
|
|
@@ -266,8 +266,8 @@ More metrics exist than the server returns.`:i},mX=(e)=>{let t=ei([["Metric",e.k
|
|
|
266
266
|
|
|
267
267
|
Not every recorded point is shown: the series is thinned to fit --resolution, and a very long run keeps only its most recent points.`:"";return`${t}
|
|
268
268
|
|
|
269
|
-
${i}${n}`},yW=async(e,t,i)=>{let n=await e.trainings.getRunMetrics({trainingRunId:t.trainingRunId});qe(i,t.json,n,CX(n))},VW=async(e,t,i)=>{let n=await e.trainings.getRunMetricHistory({trainingRunId:t.trainingRunId,metricKey:t.metricKey,resolution:t.resolution});qe(i,t.json,n,mX(n))};var BW=(e,t)=>{let{context:i,globals:n}=t,r=e.command("training").description("manage project Training drafts");r.command("list").option("--json","print JSON",!1).description("list active Trainings owned by the selected project").action(async(o)=>{let{client:s,projectId:a}=await F(n(),i);J(a),await IW(s,{projectId:a,json:o.json},i.io)}),r.command("get").argument("<name-or-id>","Training name or ID").option("--json","print JSON",!1).description("show one Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await dW(a,{projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("create").argument("<name>","new Training name").option("--method <method>","Training method",yZ,"sft").option("--base-model <id>","catalog Base Model source",fn).option("--model-version <id>","exact Model Version source").requiredOption("--dataset <id>","required training Dataset ID").option("--validation-dataset <id>","optional validation Dataset ID").option("--train-filter <field=value>","training Dataset field equality filter").option("--validation-filter <field=value>","validation Dataset field equality filter").option("--lora-rank <rank>","SFT LoRA adapter rank: 8, 16, or 32 (default 16)",FI).option("--gist-tokens <count>","gisting soft tokens: 8, 32, or 64 (default 32)",HI).option("--epochs <count>","training epochs, 1 through 5 (default 3)",vI).option("--learning-rate <rate>","optimizer learning rate (default 0.00015 for SFT, 0.03 for gisting)",kI).option("--batch-size <count>","sequences per optimizer step: 8, 16, 32, or 64 (default 8)",PI).option("--max-sequence-length <tokens>","token budget per example, 64 through 16384 (default 12288 for SFT, 3072 for gisting)",NI).option("--prompt-file <path>","gisting prompt text file").option("--json","print JSON",!1).description("create a normalized Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await cW(a,{...YI(s),projectId:g,name:o,json:s.json},i.io)}),r.command("update").argument("<name-or-id>","Training name or ID").option("--base-model <id>","catalog Base Model source",fn).option("--model-version <id>","exact Model Version source").option("--dataset <id>","required training Dataset ID").option("--validation-dataset <id>","replacement validation Dataset ID").option("--train-filter <field=value>","replacement training Dataset field equality filter").option("--validation-filter <field=value>","replacement validation Dataset field equality filter").option("--lora-rank <rank>","SFT LoRA adapter rank: 8, 16, or 32 (default 16)",FI).option("--gist-tokens <count>","gisting soft tokens: 8, 32, or 64 (default 32)",HI).option("--epochs <count>","training epochs, 1 through 5 (default 3)",vI).option("--learning-rate <rate>","optimizer learning rate (default 0.00015 for SFT, 0.03 for gisting)",kI).option("--batch-size <count>","sequences per optimizer step: 8, 16, 32, or 64 (default 8)",PI).option("--max-sequence-length <tokens>","token budget per example, 64 through 16384 (default 12288 for SFT, 3072 for gisting)",NI).option("--prompt-file <path>","replacement gisting prompt text file").option("--json","print JSON",!1).description("replace the complete Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await uW(a,{...YI(s),projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("cost").argument("<name-or-id>","Training name or ID").option("--idempotency-key <key>","reuse one Cost Estimate input preparation").option("--json","print JSON",!1).description("validate Training inputs and calculate the maximum charge").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await mW(a,{projectId:g,nameOrId:o,idempotencyKey:s.idempotencyKey,json:s.json},i.io)}),r.command("run").argument("<name-or-id>","Training name or ID").option("--estimate-file <path>","ready Training Cost Estimate JSON").option("--version-name <name>","unique Model Version name for this run").option("--idempotency-key <key>","reuse one Training Run creation").option("--json","print JSON",!1).description("calculate a ready Cost Estimate and create one queued Training Run").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await pW(a,{projectId:g,nameOrId:o,...s},i.io)}),r.command("runs").argument("<name-or-id>","Training name or ID").option("--json","print JSON",!1).description("list Training Run history").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await AW(a,{projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("status").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("show one Training Run").action(async(o,s)=>{let{client:a}=await F(n(),i);await bW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("resume").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("resume a Training Run blocked on funds or payment").action(async(o,s)=>{let{client:a}=await F(n(),i);await ZW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("cancel").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("cancel a Training Run before provider work completes").action(async(o,s)=>{let{client:a}=await F(n(),i);await hW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("metrics").argument("<training-run-id>","Training Run ID").option("--key <metric>","read the point history of one metric instead of the summary").option("--resolution <count>","history points to return, 2 to 500 (default 200)",Ee).option("--json","print JSON",!1).description("read Training Run metrics").action(async(o,s)=>{let{client:a}=await F(n(),i);if(s.key===void 0){await yW(a,{trainingRunId:o,json:s.json},i.io);return}await VW(a,{trainingRunId:o,metricKey:s.key,resolution:s.resolution,json:s.json},i.io)}),r.command("logs").argument("<training-run-id>","Training Run ID").option("--follow","wait for new log entries until complete",!1).description("read sanitized Training Run logs").action(async(o,s)=>{let{client:a}=await F(n(),i);await fW(a,{trainingRunId:o,follow:s.follow},i.io)})};var RW=require("fs"),GW=require("os"),we=require("path");var pX=`${we.sep}install${we.sep}global${we.sep}`,Pd=(e)=>{try{return RW.realpathSync(e)}catch{return e}},AX=(e,t,i,n)=>{if(Pd(e).includes(pX))return"global-registry";if(Pd(n)===t)return"linked";if(we.dirname(we.resolve(e))===we.resolve(i))return"linked";return"project-local"},wW=(e=process.argv[1],t={})=>{b(e,"CLI entry path is unavailable",{hint:k});let i=t.globalBinDirectory??we.resolve(process.env.BUN_INSTALL??we.join(GW.homedir(),".bun"),"bin"),n=t.globalPackageDirectory??we.resolve(i,"..","install","global","node_modules","@toloka-platform","sdk"),r=we.resolve(we.dirname(Pd(e)),".."),o=AX(e,r,i,n);return{version:ie,commit:"
|
|
269
|
+
${i}${n}`},yW=async(e,t,i)=>{let n=await e.trainings.getRunMetrics({trainingRunId:t.trainingRunId});qe(i,t.json,n,CX(n))},VW=async(e,t,i)=>{let n=await e.trainings.getRunMetricHistory({trainingRunId:t.trainingRunId,metricKey:t.metricKey,resolution:t.resolution});qe(i,t.json,n,mX(n))};var BW=(e,t)=>{let{context:i,globals:n}=t,r=e.command("training").description("manage project Training drafts");r.command("list").option("--json","print JSON",!1).description("list active Trainings owned by the selected project").action(async(o)=>{let{client:s,projectId:a}=await F(n(),i);J(a),await IW(s,{projectId:a,json:o.json},i.io)}),r.command("get").argument("<name-or-id>","Training name or ID").option("--json","print JSON",!1).description("show one Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await dW(a,{projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("create").argument("<name>","new Training name").option("--method <method>","Training method",yZ,"sft").option("--base-model <id>","catalog Base Model source",fn).option("--model-version <id>","exact Model Version source").requiredOption("--dataset <id>","required training Dataset ID").option("--validation-dataset <id>","optional validation Dataset ID").option("--train-filter <field=value>","training Dataset field equality filter").option("--validation-filter <field=value>","validation Dataset field equality filter").option("--lora-rank <rank>","SFT LoRA adapter rank: 8, 16, or 32 (default 16)",FI).option("--gist-tokens <count>","gisting soft tokens: 8, 32, or 64 (default 32)",HI).option("--epochs <count>","training epochs, 1 through 5 (default 3)",vI).option("--learning-rate <rate>","optimizer learning rate (default 0.00015 for SFT, 0.03 for gisting)",kI).option("--batch-size <count>","sequences per optimizer step: 8, 16, 32, or 64 (default 8)",PI).option("--max-sequence-length <tokens>","token budget per example, 64 through 16384 (default 12288 for SFT, 3072 for gisting)",NI).option("--prompt-file <path>","gisting prompt text file").option("--json","print JSON",!1).description("create a normalized Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await cW(a,{...YI(s),projectId:g,name:o,json:s.json},i.io)}),r.command("update").argument("<name-or-id>","Training name or ID").option("--base-model <id>","catalog Base Model source",fn).option("--model-version <id>","exact Model Version source").option("--dataset <id>","required training Dataset ID").option("--validation-dataset <id>","replacement validation Dataset ID").option("--train-filter <field=value>","replacement training Dataset field equality filter").option("--validation-filter <field=value>","replacement validation Dataset field equality filter").option("--lora-rank <rank>","SFT LoRA adapter rank: 8, 16, or 32 (default 16)",FI).option("--gist-tokens <count>","gisting soft tokens: 8, 32, or 64 (default 32)",HI).option("--epochs <count>","training epochs, 1 through 5 (default 3)",vI).option("--learning-rate <rate>","optimizer learning rate (default 0.00015 for SFT, 0.03 for gisting)",kI).option("--batch-size <count>","sequences per optimizer step: 8, 16, 32, or 64 (default 8)",PI).option("--max-sequence-length <tokens>","token budget per example, 64 through 16384 (default 12288 for SFT, 3072 for gisting)",NI).option("--prompt-file <path>","replacement gisting prompt text file").option("--json","print JSON",!1).description("replace the complete Training draft").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await uW(a,{...YI(s),projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("cost").argument("<name-or-id>","Training name or ID").option("--idempotency-key <key>","reuse one Cost Estimate input preparation").option("--json","print JSON",!1).description("validate Training inputs and calculate the maximum charge").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await mW(a,{projectId:g,nameOrId:o,idempotencyKey:s.idempotencyKey,json:s.json},i.io)}),r.command("run").argument("<name-or-id>","Training name or ID").option("--estimate-file <path>","ready Training Cost Estimate JSON").option("--version-name <name>","unique Model Version name for this run").option("--idempotency-key <key>","reuse one Training Run creation").option("--json","print JSON",!1).description("calculate a ready Cost Estimate and create one queued Training Run").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await pW(a,{projectId:g,nameOrId:o,...s},i.io)}),r.command("runs").argument("<name-or-id>","Training name or ID").option("--json","print JSON",!1).description("list Training Run history").action(async(o,s)=>{let{client:a,projectId:g}=await F(n(),i);J(g),await AW(a,{projectId:g,nameOrId:o,json:s.json},i.io)}),r.command("status").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("show one Training Run").action(async(o,s)=>{let{client:a}=await F(n(),i);await bW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("resume").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("resume a Training Run blocked on funds or payment").action(async(o,s)=>{let{client:a}=await F(n(),i);await ZW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("cancel").argument("<training-run-id>","Training Run ID").option("--json","print JSON",!1).description("cancel a Training Run before provider work completes").action(async(o,s)=>{let{client:a}=await F(n(),i);await hW(a,{trainingRunId:o,json:s.json},i.io)}),r.command("metrics").argument("<training-run-id>","Training Run ID").option("--key <metric>","read the point history of one metric instead of the summary").option("--resolution <count>","history points to return, 2 to 500 (default 200)",Ee).option("--json","print JSON",!1).description("read Training Run metrics").action(async(o,s)=>{let{client:a}=await F(n(),i);if(s.key===void 0){await yW(a,{trainingRunId:o,json:s.json},i.io);return}await VW(a,{trainingRunId:o,metricKey:s.key,resolution:s.resolution,json:s.json},i.io)}),r.command("logs").argument("<training-run-id>","Training Run ID").option("--follow","wait for new log entries until complete",!1).description("read sanitized Training Run logs").action(async(o,s)=>{let{client:a}=await F(n(),i);await fW(a,{trainingRunId:o,follow:s.follow},i.io)})};var RW=require("fs"),GW=require("os"),we=require("path");var pX=`${we.sep}install${we.sep}global${we.sep}`,Pd=(e)=>{try{return RW.realpathSync(e)}catch{return e}},AX=(e,t,i,n)=>{if(Pd(e).includes(pX))return"global-registry";if(Pd(n)===t)return"linked";if(we.dirname(we.resolve(e))===we.resolve(i))return"linked";return"project-local"},wW=(e=process.argv[1],t={})=>{b(e,"CLI entry path is unavailable",{hint:k});let i=t.globalBinDirectory??we.resolve(process.env.BUN_INSTALL??we.join(GW.homedir(),".bun"),"bin"),n=t.globalPackageDirectory??we.resolve(i,"..","install","global","node_modules","@toloka-platform","sdk"),r=we.resolve(we.dirname(Pd(e)),".."),o=AX(e,r,i,n);return{version:ie,commit:"7c93d9baea01",channel:o,...o==="linked"?{path:r}:{}}};var FW=(e,t)=>{e.command("version").option("--json","print version and build provenance as JSON",!1).description("print the current CLI version").action((i)=>t.context.io.stdout(i.json?JSON.stringify(wW()):ie))};var vW=require("readline/promises");var HW=()=>new E("Standard input closed before an API key was entered.",{hint:{description:"Run toloka login in an interactive terminal, or pipe the key with toloka login --api-key-stdin."}}),bX=async()=>{process.stdin.setEncoding("utf8");let e=[];for await(let t of process.stdin)e.push(String(t));return e.join("")},ZX=async(e)=>{process.stdout.write(e);let t=process.stdin.isRaw;process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let{promise:i,resolve:n,reject:r}=Promise.withResolvers(),o="",s=()=>{process.stdin.off("data",I),process.stdin.off("end",g),process.stdin.off("error",l),process.stdin.setRawMode(t),process.stdin.pause()},a=()=>{s(),process.stdout.write(`
|
|
270
270
|
`)},g=()=>{a(),r(HW())},l=(d)=>{a(),r(d)},I=(d)=>{for(let C of d){if(C==="\r"||C===`
|
|
271
|
-
`){a(),n(o);return}if(C==="\x03"||C==="\x04"){a(),r(C==="\x03"?new E("Canceled.",{hint:{disabled:!0}}):HW());return}if(C==="\x7F"||C==="\b"){if(o.length>0)o=o.slice(0,-1),process.stdout.write("\b \b");continue}o+=C,process.stdout.write("*")}};process.stdin.on("data",I),process.stdin.once("end",g),process.stdin.once("error",l);try{return await i}finally{s()}},hX=async(e,t={})=>{if(t.mask===!0)return ZX(e);let i=vW.createInterface({input:process.stdin,output:process.stdout,terminal:!0});try{return await i.question(e)}finally{i.close()}},Nd=()=>({stdout:(e)=>console.log(e),stderr:(e)=>console.error(e),readStdin:bX,...process.stdin.isTTY?{prompt:hX,select:uf}:{}});function fX(e){let t=new ki("toloka"),i={value:0},n=!1;t.description("
|
|
271
|
+
`){a(),n(o);return}if(C==="\x03"||C==="\x04"){a(),r(C==="\x03"?new E("Canceled.",{hint:{disabled:!0}}):HW());return}if(C==="\x7F"||C==="\b"){if(o.length>0)o=o.slice(0,-1),process.stdout.write("\b \b");continue}o+=C,process.stdout.write("*")}};process.stdin.on("data",I),process.stdin.once("end",g),process.stdin.once("error",l);try{return await i}finally{s()}},hX=async(e,t={})=>{if(t.mask===!0)return ZX(e);let i=vW.createInterface({input:process.stdin,output:process.stdout,terminal:!0});try{return await i.question(e)}finally{i.close()}},Nd=()=>({stdout:(e)=>console.log(e),stderr:(e)=>console.error(e),readStdin:bX,...process.stdin.isTTY?{prompt:hX,select:uf}:{}});function fX(e){let t=new ki("toloka"),i={value:0},n=!1;t.description("Build and operate Toloka pipeline projects from TypeScript source. The public API may change between minor versions before 1.0.").version(ie,"-v, --version","output the current version").option("--source-root <directory>","project root; discovered from the working directory when omitted").option("--api-key <key>","API key for this command only").option("--base-url <url>","platform base URL for this command only").option("--project-id <id>","target project; overrides toloka.json").addHelpText("after",`
|
|
272
272
|
${fZ}`).configureOutput({writeOut:(s)=>e.io.stdout(s.replace(/\n$/u,"")),writeErr:(s)=>e.io.stderr(s.replace(/\n$/u,""))}).exitOverride();let r=()=>t.opts(),o={context:e,exitCode:i,globals:r};return t.hook("postAction",async(s,a)=>{if(n)return;let g=[];for(let d=a;d!==null;d=d.parent)g.push(d.name());if(g.includes("init")||g.includes("help")||g.includes("report")||g.includes("url")||g.includes("version")||g.includes("config"))return;let l=await he(r(),e.io),I=await eW(l).catch(()=>{return});if(I===void 0)return;n=!0,e.io.stderr(I)}),FW(t,o),BZ(t,o),VZ(t,o),Rf(t,o),oh(t,o),nW(t,o),Hf(t,o),ph(t,o),BW(t,o),nh(t,o),Bf(t,o),rW(t,o),Ff(t,o),Df(t,o),{program:t,exitCode:i}}var WX=(e,t)=>{for(let i=0;i<t.length;i+=1){let n=t[i];if(n===void 0)return;if(n==="--")return t[i+1];if(!n.startsWith("-"))return n;let r=e.options.find((o)=>o.short===n||o.long===n);if(r!==void 0&&(r.required||r.optional)&&!n.includes("="))i+=1}return},yX=(e,t)=>{let i=WX(e,t);if(i===void 0||i==="help")return;return e.commands.some((r)=>r.name()===i||r.aliases().includes(i))?void 0:i},VX=async(e,t,i,n)=>{let r=yX(e,i);if(r!==void 0)return n.stderr(`error: unknown command '${r}'
|
|
273
273
|
toloka ${ie} does not have it. Run toloka --help to list its commands; a runbook that uses it may need a newer release.`),{code:1,outcome:"usage_error"};try{await e.parseAsync([...i],{from:"user"});let o=t.value;return{code:o,outcome:o===0?"succeeded":"failed"}}catch(o){if(o instanceof yt){let s=o.exitCode===0?0:1;return{code:s,outcome:s===0?"succeeded":"usage_error",error:o}}return n.stderr(li(o)),{code:1,outcome:"failed",error:o}}},kW=async({analytics:e,argv:t,startedAt:i,result:n})=>{if(e===void 0)return;try{e.captureCommand({command:vo(t),durationMs:Date.now()-i,exitCode:n.code,outcome:n.outcome,...n.error===void 0?{}:{error:n.error}}),await e.shutdown()}catch{}};async function PW(e,t=process.env,i=Nd(),n,r,o,s){let{environment:a,warnings:g}=tC(t);for(let u of g)i.stderr(u);let l=await eb({argv:e,environment:a,io:i,...s===void 0?{}:{hooks:s}});if(l.status==="reexec")return l.exitCode;let I=a[Lt]===void 0?r??Hu({environment:a}):void 0,d={environment:a,io:i,...I===void 0?{}:{analytics:I},...n===void 0?{}:{injectedClient:n},...o===void 0?{}:{runChecks:o}},{program:C,exitCode:m}=fX(d),c=Date.now();try{let u=await VX(C,m,e,i);return await kW({analytics:I,argv:e,startedAt:c,result:u}),u.code}catch(u){throw await kW({analytics:I,argv:e,startedAt:c,result:{code:1,outcome:"failed",error:u}}),u}}PW(process.argv.slice(2)).then((e)=>{process.exitCode=e},(e)=>{console.error(e),process.exitCode=1});})
|
package/dist/cli/toloka.js.jsc
CHANGED
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
ef3e378cf44fae35729752064f23960c37016cb6fd231756a974fc8e239c89ff toloka.js.jsc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
f411e3d6a2289108ed93862aedb96f9628cef1a7ee21ec197aa4cf1bb9390ce3 toloka.js
|
package/docs/cli.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The `toloka` CLI reads TypeScript source as the desired state, compares it with the live platform state, and reconciles the two.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`toloka` `0.2.0` is the current stable CLI on the `latest` channel. Because it ships as part of the `0.x` SDK, commands, flags, and output can change between minor releases.
|
|
6
6
|
|
|
7
7
|
`toloka` requires Bun 1.4.0 or newer. The published package ships CLI bytecode built with Bun 1.4.0; another Bun version runs the same bundled JavaScript without that cache and starts slower. The launcher falls back to TypeScript source in a development checkout when the bytecode is absent.
|
|
8
8
|
|
|
@@ -30,7 +30,7 @@ Credentials and the platform base URL resolve from the same precedence order, hi
|
|
|
30
30
|
| 3 | `projectId` in `toloka.json` |
|
|
31
31
|
| 4 (lowest) | `current` alias in the credentials file |
|
|
32
32
|
|
|
33
|
-
Earlier releases named these variables `POTATO_API_KEY`, `POTATO_BASE_URL`, and `POTATO_PROJECT_ID`. The CLI still reads each legacy name when its `TOLOKA_*` counterpart is unset, prefers the `TOLOKA_*` value when both are set, and prints `POTATO_API_KEY is deprecated and will stop being read; set TOLOKA_API_KEY instead.` (and the same line for the other two) on stderr once per command. The
|
|
33
|
+
Earlier releases named these variables `POTATO_API_KEY`, `POTATO_BASE_URL`, and `POTATO_PROJECT_ID`. The CLI still reads each legacy name when its `TOLOKA_*` counterpart is unset, prefers the `TOLOKA_*` value when both are set, and prints `POTATO_API_KEY is deprecated and will stop being read; set TOLOKA_API_KEY instead.` (and the same line for the other two) on stderr once per command. The aliases remain supported for compatibility; rename them to silence the warning and use the current names in new automation.
|
|
34
34
|
|
|
35
35
|
`toloka login` verifies the key against the platform before saving anything. It writes `$XDG_CONFIG_HOME/toloka/credentials.json`, which defaults to `~/.config/toloka/credentials.json`, with file mode `0600` and a parent directory with mode `0700`. The file may also store local project aliases. The legacy `~/.toloka/credentials.json` is still read when the new path has no file. `toloka logout` deletes the stored file but does not revoke the key.
|
|
36
36
|
|
|
@@ -362,7 +362,7 @@ toloka skill install <skillId> [--force]
|
|
|
362
362
|
|
|
363
363
|
After an SDK upgrade `list` reports installed skills whose catalog digest changed as `stale` until they are refreshed with `install --force`. Local edits to an installed skill also make it `stale`; `list` and `search` never modify local files.
|
|
364
364
|
|
|
365
|
-
The catalog is bound to the installed package version, so a skill that a newer release ships is simply absent from an older CLI. `install` then exits 1
|
|
365
|
+
The catalog is bound to the installed package version, so a skill that a newer release ships is simply absent from an older CLI. `install` then exits 1, names the missing skill and installed package version, and creates nothing. Run `toloka skill list` to see the available skills. To get the current supported catalog, update with `bun add --global @toloka-platform/sdk@latest` and retry.
|
|
366
366
|
|
|
367
367
|
## Exit codes
|
|
368
368
|
|
package/docs/getting-started.md
CHANGED
|
@@ -4,7 +4,7 @@ Install the SDK, sign in, and get a pipeline project reconciling from source in
|
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
Install the bytecode-cached CLI globally and declare the
|
|
7
|
+
Install the bytecode-cached CLI globally and declare the stable SDK in the project:
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
curl -fsSL https://platform.toloka.ai/cli/install.sh | sh
|
|
@@ -13,6 +13,8 @@ bun add @toloka-platform/sdk@latest
|
|
|
13
13
|
|
|
14
14
|
The installer requires Bun 1.4.0 or newer, installs `@toloka-platform/sdk` globally, and exposes `toloka` through Bun's global binary directory. The published CLI includes bytecode built with Bun 1.4.0; another Bun version runs the same bundled JavaScript without that cache and starts slower. The project install makes SDK imports resolvable.
|
|
15
15
|
|
|
16
|
+
`latest` currently installs stable `0.2.0`, including Training commands and the bundled agent runbooks and skills. Use `bun add @toloka-platform/sdk@0.2.0` when you need an exact, reproducible project dependency.
|
|
17
|
+
|
|
16
18
|
## Sign in
|
|
17
19
|
|
|
18
20
|
```sh
|
|
@@ -140,4 +142,4 @@ Exit code `0` means the run reached a successful terminal state, `1` a failed on
|
|
|
140
142
|
- [Nodes](./nodes.md) — which node to reach for, and the pricing floors you must clear
|
|
141
143
|
- [CLI](./cli.md) — every command and flag
|
|
142
144
|
- [Troubleshooting](./troubleshooting.md) — the failures you will hit
|
|
143
|
-
- [Limitations](./limitations.md) —
|
|
145
|
+
- [Limitations](./limitations.md) — current constraints and `0.x` compatibility expectations
|
package/docs/limitations.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Limitations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Current constraints of the stable SDK, stated plainly so you can decide what to depend on.
|
|
4
4
|
|
|
5
|
-
`@toloka-platform/sdk`
|
|
5
|
+
`@toloka-platform/sdk` `0.2.0` is the current stable release on `latest`. Because it is a `0.x` release, the authoring API, CLI surface, and generated source layout can change between minor versions. Use `latest` for the current supported release, or pin `@toloka-platform/sdk@0.2.0` for reproducible installs.
|
|
6
6
|
|
|
7
7
|
## Local checks do not certify deployability
|
|
8
8
|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toloka-platform/sdk",
|
|
3
|
-
"version": "0.2.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Build, inspect, and operate Toloka pipeline projects as TypeScript source. The public API may change between minor versions before 1.0.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"bin": {
|
|
8
8
|
"toloka": "bin/toloka.js"
|
package/skills/catalog.json
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
"testing",
|
|
12
12
|
"checks"
|
|
13
13
|
],
|
|
14
|
-
"version": "0.2.0
|
|
15
|
-
"digest": "
|
|
14
|
+
"version": "0.2.0",
|
|
15
|
+
"digest": "d1475f85dad9f81a8a0321778466ca21e2c93f04094f402a4ad83ac92641b99c",
|
|
16
16
|
"files": [
|
|
17
17
|
"SKILL.md",
|
|
18
18
|
"references/node-semantics.md",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"bug",
|
|
30
30
|
"report"
|
|
31
31
|
],
|
|
32
|
-
"version": "0.2.0
|
|
33
|
-
"digest": "
|
|
32
|
+
"version": "0.2.0",
|
|
33
|
+
"digest": "56a0c283649052c85ba882f05d4a996bd98bf1bc011bc7a70af234b3664057d6",
|
|
34
34
|
"files": [
|
|
35
35
|
"SKILL.md",
|
|
36
36
|
"references/report-template.md"
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"getting-started",
|
|
47
47
|
"agent"
|
|
48
48
|
],
|
|
49
|
-
"version": "0.2.0
|
|
50
|
-
"digest": "
|
|
49
|
+
"version": "0.2.0",
|
|
50
|
+
"digest": "61a3cf60f0b7d00e48c9663ed6e0e3d77fd3923e528cee52e16ef6e2ccebae69",
|
|
51
51
|
"files": [
|
|
52
52
|
"SKILL.md"
|
|
53
53
|
]
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
"sft",
|
|
64
64
|
"models"
|
|
65
65
|
],
|
|
66
|
-
"version": "0.2.0
|
|
67
|
-
"digest": "
|
|
66
|
+
"version": "0.2.0",
|
|
67
|
+
"digest": "ee961e8daea643998b00918055214316e27ab99b43c1015c0af24f86deb97502",
|
|
68
68
|
"files": [
|
|
69
69
|
"SKILL.md"
|
|
70
70
|
]
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"prompt",
|
|
81
81
|
"models"
|
|
82
82
|
],
|
|
83
|
-
"version": "0.2.0
|
|
84
|
-
"digest": "
|
|
83
|
+
"version": "0.2.0",
|
|
84
|
+
"digest": "2dd5dc9aef29c7f2840b1047ac2c03d4f096bfdba62db72e848c4051b5481bed",
|
|
85
85
|
"files": [
|
|
86
86
|
"SKILL.md"
|
|
87
87
|
]
|
|
@@ -5,7 +5,7 @@ description: Build, test, inspect, or change Toloka platform pipeline projects a
|
|
|
5
5
|
|
|
6
6
|
# Build Toloka pipelines as code
|
|
7
7
|
|
|
8
|
-
This SDK
|
|
8
|
+
This SDK follows `0.x` versioning, so the authoring API, the CLI, and generated source can change between releases. Use the API and commands exposed by the installed package; do not invent helpers or flags.
|
|
9
9
|
|
|
10
10
|
Help the user get a working pipeline that fits their task: understand the data and desired output, choose a suitable design, verify it, and apply or run it when requested. Work in the project source tree; TypeScript is the pipeline's desired state, not a transcription of direct platform API calls.
|
|
11
11
|
|
|
@@ -31,7 +31,7 @@ For a first-time guided session, consult `https://platform.toloka.ai/agents/data
|
|
|
31
31
|
Install the SDK before invoking project commands:
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
bun add --dev @toloka-platform/sdk
|
|
34
|
+
bun add --dev @toloka-platform/sdk@latest
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Select or create the intended platform project before `toloka init` when the checkout should be bound immediately; follow the adoption or scratch recipe below. Running `init` without explicit or checkout-local project identity installs only the agent entry points and never adopts the machine registry's current project.
|
|
@@ -164,7 +164,7 @@ The global Base Model Catalog is read-only and uses `toloka base-model`. `base-m
|
|
|
164
164
|
|
|
165
165
|
## Train a model
|
|
166
166
|
|
|
167
|
-
`toloka training create` requires one source (`--base-model` or `--model-version`) and a training Dataset.
|
|
167
|
+
`toloka training create` requires one source (`--base-model` or `--model-version`) and a training Dataset. A `--model-version` source must be a LoRA adapter Model Version (one produced by fine-tuning) and works for both methods — SFT continues the adapter, gisting merges it and trains gist tokens over it; a full-weights version is rejected with "Training from a Model Version requires a LoRA adapter source". The first Training Run creates a new output Model named after the Training; a source Model Version is only the training parent, never the output binding.
|
|
168
168
|
|
|
169
169
|
Hyperparameters are optional flags on `training create` and `training update`: `--epochs 1..5` (default 3), `--learning-rate` (SFT 0.00001–0.001, default 0.00015; gisting 0.001–0.3, default 0.03), `--batch-size 8|16|32|64` (default 8; sequences per optimizer step across all GPUs) and `--max-sequence-length 64..16384` (default 12288 for SFT, 3072 for gisting) apply to both methods; `--lora-rank 8|16|32` (default 16) is SFT-only and `--gist-tokens 8|32|64` (default 32) is gisting-only — passing one to the other method fails before any request. `--regime` and `--eval-steps` no longer exist. `training update` has no `--method` flag: the method stays as created, and every flag you omit keeps its current value. `training cost` is blocked when the longest example exceeds `--max-sequence-length` or when the training selection leaves fewer rows than `--batch-size` after the 10% holdout.
|
|
170
170
|
|
|
@@ -83,7 +83,7 @@ toloka model versions <model-id> --json
|
|
|
83
83
|
|
|
84
84
|
For a Base Model, compare upstream documentation, user-provided benchmarks, and prior results for task and language fit, data volume, quality, training budget, and serving latency or deployment constraints. Model size alone is not a quality decision; a smaller model is a useful cost and latency baseline when the task permits it, not a mandatory default. Use `base-model get` only to verify the selected catalog ID, upstream model, and pinned revision; it does not establish those broader capabilities.
|
|
85
85
|
|
|
86
|
-
For a Model Version, verify the exact ID and revision under its project-owned Model, and record the owning Model's Base Model and the Version's runtime base from JSON. If those identities conflict, report the conflict rather than guessing or substituting. Use `--model-version` only for that existing version. The ready cost estimate is the concrete final check that the source type, underlying Base Model, method, and data are supported together.
|
|
86
|
+
For a Model Version, verify the exact ID and revision under its project-owned Model, and record the owning Model's Base Model and the Version's runtime base from JSON. If those identities conflict, report the conflict rather than guessing or substituting. Use `--model-version` only for that existing version, and only for a LoRA adapter Model Version (one produced by fine-tuning) — a full-weights version is rejected with "Training from a Model Version requires a LoRA adapter source". The ready cost estimate is the concrete final check that the source type, underlying Base Model, method, and data are supported together.
|
|
87
87
|
|
|
88
88
|
### 4. Reuse or create the draft
|
|
89
89
|
|
|
@@ -24,12 +24,13 @@ Check the runtime or CLI only when its state is not already known:
|
|
|
24
24
|
```sh
|
|
25
25
|
bun --version
|
|
26
26
|
toloka --version
|
|
27
|
+
toloka dataset --help
|
|
27
28
|
```
|
|
28
29
|
|
|
29
|
-
The runbooks
|
|
30
|
+
The runbooks require a stable Toloka CLI release at version `0.2.0` or newer: `toloka --version` must print `0.2.0` or a newer version with no prerelease suffix, and `toloka dataset --help` must list `create`. If either command is unavailable, the version is older or prerelease, or the capability check fails, install the latest stable version:
|
|
30
31
|
|
|
31
32
|
```sh
|
|
32
|
-
curl -fsSL https://platform.toloka.ai/cli/install.sh |
|
|
33
|
+
curl -fsSL https://platform.toloka.ai/cli/install.sh | sh
|
|
33
34
|
```
|
|
34
35
|
|
|
35
36
|
Never request an API key in chat. Inspect the active identity with:
|
|
@@ -90,7 +90,7 @@ toloka model versions <model-id> --json
|
|
|
90
90
|
|
|
91
91
|
For a Base Model, compare available evidence about prompt and language fit, prior quality, data volume, desired compression fidelity, training budget, and serving latency or deployment constraints. Model size alone is not a quality decision; a smaller model is a useful cost and latency baseline when the task permits it, not a mandatory default. Verify the selected catalog ID, upstream model, and pinned revision with `base-model get`, and consult upstream documentation or user-provided evidence for capabilities the catalog does not expose.
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
Gisting starts either from a catalog Base Model or, to compress a prompt for a model you already fine-tuned, from that model's LoRA adapter Model Version via `--model-version` (the adapter is merged into the base and the gist tokens are trained over the fine-tuned weights). Because gisting publishes a full model, it is limited to the qwen3-4b and qwen3-8b tiers, and a `--model-version` source must be a LoRA adapter version (a full-weights version is rejected).
|
|
94
94
|
|
|
95
95
|
### 4. Reuse or create the draft
|
|
96
96
|
|
|
@@ -113,7 +113,7 @@ toloka training create "<training-name>" \
|
|
|
113
113
|
--json
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
-
Omit `--validation-dataset` when no separate validation selection exists so the provider uses its 10% holdout. For disjoint selections in a Dataset with top-level fields, add `--train-filter <field>=<value>` and `--validation-filter <field>=<value>`.
|
|
116
|
+
Omit `--validation-dataset` when no separate validation selection exists so the provider uses its 10% holdout. For disjoint selections in a Dataset with top-level fields, add `--train-filter <field>=<value>` and `--validation-filter <field>=<value>`.
|
|
117
117
|
|
|
118
118
|
Preserve requested hyperparameters. The current CLI uses `--gist-tokens 8|32|64` (default 32), `--epochs 1..5` (default 3), `--learning-rate` within 0.001–0.3 (default 0.03), `--batch-size 8|16|32|64` (default 8), and `--max-sequence-length 64..16384` (default 3072), rather than `regime`. Use defaults when suitable; 8 gist tokens favor compression for simple prompts, while 64 may help when 32 loses holdout accuracy. Choose sequence length from actual examples within the supported limit. `--lora-rank` is rejected for gisting. `training update <name-or-id>` takes the same flags except `--method`; omitted flags retain current values.
|
|
119
119
|
|
|
@@ -26,7 +26,7 @@ The CLI exits 1 with `Potato API request failed with status 500`. The same comma
|
|
|
26
26
|
|
|
27
27
|
## Environment
|
|
28
28
|
|
|
29
|
-
- toloka CLI 0.2.0
|
|
29
|
+
- toloka CLI 0.2.0 (`toloka --version`), Bun 1.4.0, macOS 15
|
|
30
30
|
- Platform: https://platform.toloka.ai
|
|
31
31
|
|
|
32
32
|
## Redactions
|
package/src/cli/program.ts
CHANGED
|
@@ -44,7 +44,7 @@ export function createProgram(context: ProgramContext): CreatedProgram {
|
|
|
44
44
|
|
|
45
45
|
program
|
|
46
46
|
.description(
|
|
47
|
-
"
|
|
47
|
+
"Build and operate Toloka pipeline projects from TypeScript source. The public API may change between minor versions before 1.0.",
|
|
48
48
|
)
|
|
49
49
|
.version(SDK_VERSION, "-v, --version", "output the current version")
|
|
50
50
|
.option(
|