promptgun 0.6.2 → 0.6.4
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/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var t=Object.create,e=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.getPrototypeOf,i={}.hasOwnProperty,o=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),a=(o,a,h)=>(h=null!=o?t(s(o)):{},((t,s,o,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let o of n(s))!i.call(t,o)&&void 0!==o&&e(t,o,{get:()=>s[o],enumerable:!(a=r(s,o))||a.enumerable});return t})(!a&&o&&o.t?h:e(h,"default",{value:o,enumerable:!0}),o)),h=o((t=>{"use strict";Object.defineProperty(t,"t",{value:!0}),t.Flux=void 0;var e=class t{generator;upstream;handleCancel;i=!1;constructor(t,e,n){let s=this;this.generator=async function*(){try{yield*t}catch(t){throw yield r,t}finally{s.i=!0}}(),this.upstream=e,this.handleCancel=n}[Symbol.asyncIterator](){return this}async next(...t){let e=await this.generator.next(t);return e.value!==r?e:await this.next(t)}return(t){return this.generator.return(t)}throw(t){return this.generator.throw(t)}async cancel(t){if(!this.closed){if(void 0!==this.upstream)return this.upstream.cancel(t);void 0!==this.handleCancel?this.handleCancel(t):await this.throw(t)}}async then(t,e){try{let e=await this.asList();return null!=t?await t(e):e}catch(t){if(null!=e)return e(t);throw t}}async catch(t){try{return this.asList()}catch(e){if(null!=t)return t(e);throw e}}async finally(t){let e=await this.asList();return t?.(),e}get[Symbol.toStringTag](){return"Flux"}subscribe(t){let e=void 0!==t?this.doOnEach(t):this,r=()=>{e.next().then((t=>{t.done||r()})).catch((t=>{console.error(t)}))};return r(),{unsubscribe:()=>this.return()}}filter(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)e(t)&&(yield t)}),this)}untilExcl(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r){if(e(t))break;yield t}}),this)}doOnEach(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)e(t),yield t}),this)}doAfterLast(e){let r=this,n=[];return t.constructFromGeneratorFunction((async function*(){for await(let t of r)n.push(t),yield t;await e(n)}),this)}map(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)yield e(t)}),this)}take(e){let r=this;return t.constructFromGeneratorFunction((async function*(){let t=0;for await(let n of r){if(t>=e){r.cancel();break}t++,yield n}}),this)}flatMap(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r){let r=e(t);if(Array.isArray(r))for(let t of r)yield t;else yield await r}}),this)}transform(e){let r=e(this);return t.constructFromGeneratorFunction((async function*(){for await(let t of r)yield t}),this)}async reduce(t,e){let r=e;for await(let e of this)r=t(r,e);return r}async asList(){let t=[];for await(let e of this)t.push(e);return t}async whenComplete(){for await(let t of this);}static create(e){let r,n=[],s=[],i=!1,o=()=>{for(i=!0;s.length>0;)s.shift().resolve({done:!0,value:void 0})};return e((t=>{if(i)throw Error("Cannot push to a completed generator");s.length>0?s.shift().resolve({done:!1,value:t}):n.push(t)}),o),t.fromGenerator({[Symbol.asyncIterator](){return this},next(...t){if(r){let t=r.value;return r=void 0,Promise.reject(t)}if(n.length>0){let t=n.shift();return Promise.resolve({done:!1,value:t})}return i?Promise.resolve({done:!0,value:void 0}):new Promise(((t,e)=>{s.push({resolve:t,reject:e})}))},return:()=>(o(),Promise.resolve({done:!0,value:void 0})),throw:t=>(r=t,s.length>0&&s.shift()?.reject(),Promise.reject(t))})}static fromArray(e){return t.fromGeneratorFunction((async function*(){for(let t of e)yield t}))}static constructFromGeneratorFunction(e,r,n){return new t(e(),r,n)}static fromGeneratorFunction(e,r){return t.constructFromGeneratorFunction(e,void 0,r)}static fromGenerator(e,r){return new t(e,void 0,r)}static fromReadableStream(e,r){return t.fromGeneratorFunction((async function*(){let t=e.getReader();try{let e;for(;!(e=await t.read()).done;)yield e.value}finally{await t.cancel()}}),r)}get closed(){return this.i}};t.Flux=e;var r={}})),l=o((t=>{"use strict";Object.defineProperty(t,"t",{value:!0}),t.Flux=void 0;var e=h();Object.defineProperty(t,"Flux",{enumerable:!0,get:function(){return e.Flux}})})),u=a(l(),1),c=a(l(),1),p=new TextDecoder,f=class extends Error{data;httpStatus=400;constructor(t,e){let r=t.map((t=>{if(t.expectedProp)return{expectedProp:(t.path+".").replace(/^root\./,"")+t.expectedProp};if(t.expectedType)return{expectedType:t.expectedType.map(A).join(" | "),path:t.path,insteadGot:t.value};if(t.unknownProp)return{unknownProp:(t.path+".").replace(/^root\./,"")+t.unknownProp};throw Error("illegal state")}));super(e??"Value is of the wrong format: "+JSON.stringify(r,null,2)),this.data=r}};function d(t){return new m([],t)}function w(t,e,r,n){let s=e.map((e=>function(t,e,r,n){let{ignoreUnknownProps:s=!0}=n;switch(e.type){case"array":return Array.isArray(t)?0===t.length?[]:w(t[0],e.elementType,r+"[..]",n):[{expectedType:[e],path:r,value:t}];case"boolean":return"boolean"!=typeof t?[{expectedType:[e],path:r,value:t}]:[];case"undefined":return void 0===t?[]:[{expectedType:[e],path:r,value:t}];case"object":{if("object"!=typeof t||null===t)return[{expectedType:[e],path:r,value:t}];let i=[];for(let s in e.props){let o=e.props[s];if(!(s in t)){o.optional||i.push({expectedProp:s,path:r,value:t});continue}let a=o.optional?[...o.type,{type:"undefined"}]:o.type;i.push(...w(t[s],a,r+"."+s,n))}if(!s)for(let n in t)n in e.props||i.push({unknownProp:n,path:r,value:t});return i}case"string":return"string"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"null":return null===t?[]:[{expectedType:[e],path:r,value:t}];case"number":return"number"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"constant":return t!==e.value||Number.isNaN(t)?[{expectedType:[e],path:r,value:t}]:[]}}(t,e,r,n)));if(s.some((t=>0===t.length)))return[];{let e=s.flatMap((t=>t.filter((t=>void 0!==t.expectedType&&t.path===r))));return e.length>0?[{expectedType:e.flatMap((t=>t.expectedType)),path:r,value:t}]:s.flatMap((t=>t))}}var y,m=class t{type;value;constructor(t=[],e){this.type=t,this.value=e}canBeArray(e){let r=e(new t([],this.value)),n=new t([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}canBeObject(e){let r=e(new t([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}hasString(t){return this.hasProperty(t,(t=>t.canBeString()))}canHaveProperty(t,e){return this.hasProperty(t,e,!0)}hasProperty(e,r,n=!1){let s=1===this.type.length?this.type[0]:void 0;if(void 0===s||"object"!==s.type)throw Error("illegal state");let{type:i}=r(new t([],this.value));return new t([{...s,props:{...s.props,[e]:{optional:n,type:i}}}],this.value)}canBeString(){return new t([...this.type,{type:"string"}],this.value)}canBeNumber(){return new t([...this.type,{type:"number"}],this.value)}canBeBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}canBeConstant(e){return new t([...this.type,{type:"constant",value:e}],this.value)}canBeNull(){return new t([...this.type,{type:"null"}],this.value)}canBeUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}andNothingElse(t={}){let e=w(this.value,this.type,"root",t);if(e.length>0)throw new f(e,t.errorMessage);return this.value}orDefaultTo(t,e={}){return w(this.value,this.type,"root",e).length>0?t:this.value}describe(){return v(this.type)}};function v(t,e=0){if(Array.isArray(t))return t.map((t=>v(t,e))).join(" | ");switch(t.type){case"array":return v(t.elementType,e)+"[]";case"boolean":return"boolean";case"undefined":return"undefined";case"object":return"{\n"+Object.keys(t.props).map((r=>`${E(e+1)}${r}: ${v(t.props[r].type,e+1)}`)).join(",\n")+`\n${E(e)}}`;case"string":return"string";case"null":return"null";case"number":return"number";case"constant":return`"${t.value}"`}}function E(t){let e="";for(let r=0;r<t;r++)e+=" ";return e}function A(t){return"constant"===t.type?`'${t.value}'`:t.type}import{config as b}from"dotenv";function g(){if(!y){b();let t=function(){let t="t";t+="ps",t="ht"+t,t+=":",t+="/",t+="/ap",t+="i.pr";let e="i";return e="d.a"+e,e="gri"+e,t+="ompt",t+e}();y=d(t).canBeString().andNothingElse({errorMessage:"PromptGrid API URL invalid: "+t})}return y}var T=class{constructor(t,e,r,n,s=!1){this.type=t,this.source=e,this.value=r,this.fieldName=n,this.maybeIncomplete=s}},U=class t{jsonBuffer="";highestOffsetParsed=-1;static toJsonTokenFlux(e){return(new t).processDataBuffer(e)}processDataBuffer(t){return t.flatMap((t=>this.getExcerpts(t)))}getExcerpts(t){this.jsonBuffer+=t;let e,r=[],n=new N(this.jsonBuffer);for(;e=this.nextToken(n);)n.currentTokenLocation().getCharOffset()>this.highestOffsetParsed&&(r.push({token:e}),this.highestOffsetParsed=n.currentTokenLocation().getCharOffset());return r.push({source:t}),r}nextToken(t){let e=t.nextToken();return"string"!=typeof e?e:void 0}},N=class{constructor(t){this.content=t}position=0;currentTokenType;parentFieldName;currentValue=null;nextToken(){let t=this.position;if(this.position>=this.content.length)return"string-ended";for(;this.position<this.content.length&&/\s/.test(this.content[this.position]);)this.position++;if(this.position>=this.content.length)return"string-ended";let e=t=>{let e=t;for(;e<this.content.length&&/\s/.test(this.content[e]);)e++;return","===this.content[e]?e+1:void 0},r=e=>this.content.substring(t,e),n=this.content[this.position];switch(n){case"{":return this.position++,this.currentTokenType="START_OBJECT",new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);case"}":{this.position++,this.currentTokenType="END_OBJECT",this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);return this.parentFieldName=void 0,t}case"[":return this.position++,this.currentTokenType="START_ARRAY",new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);case"]":{this.position++,this.currentTokenType="END_ARRAY",this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);return this.parentFieldName=void 0,t}case'"':let t=++this.position,s=this.content.indexOf('"',t);for(;s>0&&"\\"===this.content[s-1];)s=this.content.indexOf('"',s+1);if(-1===s)return"token-incomplete";let i=this.content.substring(t,s);this.position=s+1;let o=this.position;for(;o<this.content.length&&/\s/.test(this.content[o]);)o++;if(this.currentTokenType=o<this.content.length&&":"===this.content[o]?"FIELD_NAME":"VALUE_STRING","FIELD_NAME"===this.currentTokenType){this.position=o+1,this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),i,void 0);return this.parentFieldName=i,t}{this.currentValue=i,this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),i,"VALUE_STRING"===this.currentTokenType?this.parentFieldName:void 0);return this.parentFieldName=void 0,t}case"t":{let t=this.content.substring(this.position,this.position+4);if("true"===t)return this.position+=4,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_TRUE",this.currentValue=!0,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<4)return"token-incomplete";break}case"f":{let t=this.content.substring(this.position,this.position+5);if("false"===t)return this.position+=5,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_FALSE",this.currentValue=!1,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<5)return"token-incomplete";break}case"n":{let t=this.content.substring(this.position,this.position+4);if("null"===t)return this.position+=4,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_NULL",this.currentValue=null,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<4)return"token-incomplete";break}default:if(/[0-9-]/.test(n)){let t="",n=!1;for(;this.position<this.content.length&&(/[0-9]/.test(this.content[this.position])||"-"===this.content[this.position]||"."===this.content[this.position]||"e"===this.content[this.position]||"E"===this.content[this.position]||"+"===this.content[this.position]);)"."===this.content[this.position]&&(n=!0),t+=this.content[this.position++];n?(this.currentTokenType="VALUE_NUMBER_FLOAT",this.currentValue=parseFloat(t)):(this.currentTokenType="VALUE_NUMBER_INT",this.currentValue=parseInt(t,10));let s=this.position>=this.content.length;return this.position=e(this.position)??this.position,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName,s)}}throw new L("Invalid JSON at position "+this.position)}currentTokenLocation(){return{getCharOffset:()=>this.position}}},L=class extends Error{constructor(t){super(t),this.name="JsonParseException"}},_=a(l(),1),S=class{receivedJson=[];propertyCallbacks=new Map;onElementCallbacks=new Set;onCompleteCallbacks=new Set;onEachExcerptCallbacks=new Set;currentToken;state=new P;receivedExcerpts=[];onElement(t){return this.onElementCallbacks.add(t),this}onProperty(t,e){return this.propertyCallbacks.has(t)||this.propertyCallbacks.set(t,[]),this.propertyCallbacks.get(t).push(e),this}onJsonStringProperty(t,e){return this.propertyCallbacks.has(t)||this.propertyCallbacks.set(t,[]),this.propertyCallbacks.get(t).push((t=>{let r=new k,n=[],s=new I;t.onEachExcerpt((t=>{void 0!==t.source&&n.push(t.source);let e=n.join(""),i=this.endsOnUnevenNumberOfBackslashes(e)?e.substring(0,e.length-1):e;n.length=0;let o=i.replace(/\\"/g,'"').substring(1),a=null!=t.token?o.substring(0,o.length-1):o;r.getExcerpts(a).forEach((t=>s.push(t)))})),e(s)})),this}onEachExcerpt(t){return this.onEachExcerptCallbacks.add(t),this.receivedExcerpts.forEach(t),this}onComplete(t){this.o(this.toAsync(t),void 0)}o(t,e){this.onCompleteCallbacks.add({consumer:t,expectedTokenType:e})}onCompleteAsync(t){this.o(t,void 0)}onCompleteAs(t){this.onCompleteAsAsync(this.toAsync(t))}onCompleteAsAsync(t){this.o((e=>{let r=JSON.parse(e.replace(/,$/,""));return t(r)}),void 0)}onCompleteAsString(t){this.o(this.toAsync(t),new Set(["VALUE_STRING","VALUE_NULL"]))}onCompleteAsStringAsync(t){this.o(t,new Set(["VALUE_STRING","VALUE_NULL"]))}onCompleteAsInt(t){this.o(this.toAsync(t),new Set(["VALUE_NUMBER_INT","VALUE_NULL"]))}onCompleteAsIntAsync(t){this.o(t,new Set(["VALUE_NUMBER_INT","VALUE_NULL"]))}onCompleteAsNumber(t){this.o(this.toAsync(t),new Set(["VALUE_NUMBER_INT","VALUE_NUMBER_FLOAT","VALUE_NULL"]))}onCompleteAsNumberAsync(t){this.o(t,new Set(["VALUE_NUMBER_INT","VALUE_NUMBER_FLOAT","VALUE_NULL"]))}onCompleteAsBoolean(t){this.o(this.toAsync(t),new Set(["VALUE_TRUE","VALUE_FALSE","VALUE_NULL"]))}onCompleteAsBooleanAsync(t){this.o(t,new Set(["VALUE_TRUE","VALUE_FALSE","VALUE_NULL"]))}whenComplete(){return new Promise((t=>{this.onComplete((e=>t(e)))}))}asJsonFlux(){return _.Flux.create(((t,e)=>{this.onEachExcerpt((e=>{e.source&&t(e.source)})),this.o((async()=>e()))}))}whenCompleteAs(){return new Promise((t=>{this.onCompleteAs(t)}))}async push(t){let e=t.token;if(this.onEachExcerptCallbacks.forEach((e=>e(t))),this.isState(R))return this.state.child.push(t);if(!e)return;let r=e.type;if(this.currentToken=e,this.isState(P))switch(r){case"START_OBJECT":if(this.onElementCallbacks.size>0)throw Error("registered onElement for object");return this.state=new V,void this.receivedJson.push(e.source);case"START_ARRAY":if(this.propertyCallbacks.size>0)throw Error("registered onProperty for array");return this.state=new O,void this.receivedJson.push(e.source);case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":return this.receivedJson.push(e.source),this.end();default:throw new j(e)}else if(this.isState(V))switch(r){case"FIELD_NAME":return void this.receivedJson.push(e.source);case"END_OBJECT":return this.receivedJson.push(e.source),this.end();case"START_OBJECT":case"START_ARRAY":case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":{let r=new I;return r.onComplete((t=>{this.receivedJson.push(t),this.state=new V})),this.state=new B(r),this.propertyCallbacks.get(e.fieldName)?.forEach((t=>t(r))),r.push(t)}default:throw new j(e)}else if(this.isState(O))switch(r){case"END_ARRAY":return this.receivedJson.push(e.source),this.end();case"START_OBJECT":case"START_ARRAY":case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":{let e=new I;return e.onComplete((t=>{this.receivedJson.push(t),this.state=new O})),this.onElementCallbacks.forEach((t=>t(e))),this.state=new C(e),e.push(t)}default:throw new j(e)}throw Error("Unknown state")}async end(){if(void 0===this.currentToken)throw Error("Illegal state");await _.Flux.fromArray([...this.onCompleteCallbacks]).flatMap((async t=>{let e=t.expectedTokenType,r=(()=>{if(void 0===e)return this.receivedJson.join("");if(!e.has(this.currentToken.type))throw Error(`Expected token type ${Array.from(e).join(", ")} but got ${this.currentToken.type}`);return this.currentToken.value})();await t.consumer(r)}))}isState(t){return this.state instanceof t}endsOnUnevenNumberOfBackslashes(t){let e=0;for(let r=t.length-1;r>=0&&"\\"===t[r];r--)e++;return e%2==1}toAsync(t){return async e=>{t(e)}}},x=class{},R=class extends x{constructor(t){super(),this.child=t}},P=class extends x{},O=class extends x{},C=class extends R{constructor(t){super(t)}},V=class extends x{},B=class extends R{constructor(t){super(t)}},j=class extends Error{constructor(t){super("Unexpected token: "+t.type),this.name="UnexpectedTokenException"}},k=class{getExcerpts(t){return[{source:t}]}},I=class extends S{constructor(){super()}},J=a(l(),1),M=class extends S{jsonTokenFlux;constructor(t){super();let e=this;this.jsonTokenFlux=J.Flux.fromGeneratorFunction((async function*(){let r;for await(let n of t)void 0!==n.token&&(r?.token?.maybeIncomplete&&r.token.type===n.token.type&&!n.token.maybeIncomplete&&await e.push(n),r=n.token),(void 0===n.token||!n.token.maybeIncomplete)&&await e.push(n),yield n;r?.token?.maybeIncomplete&&await e.push(r)}))}whenComplete(){return this.jsonTokenFlux.then((()=>this.receivedJson.join("")))}asJsonFlux(){return this.jsonTokenFlux.map((t=>t.source)).filter((t=>void 0!==t))}},F=class{parse(t){return new M(t)}};function $(t){if(""===t.trim())return;let e=[],r=!1,n=t=>e.push(t),s=(...t)=>{let r=e[e.length-1];if(void 0===r||!t.includes(r))throw Error("illegal state");e.pop()},i=()=>Error(`Illegal state (json: ${t})`);for(let o of t){let t=e.length>0?e[e.length-1]:null,a=!1;if('"'===o)if(null===t)n('"value');else if("["===t)n('"value');else if("{"===t)n('"prop');else if('"prop":'===t)s('"prop":'),n('"value');else if('"prop'===t)r||(s('"prop'),n('"prop"'));else{if('"value'!==t)throw i();r||s('"value')}else if("["===o){if(null===t)n("[");else if("["===t)n("[");else if('"prop":'===t)n("[");else if('"prop'!==t&&'"value'!==t)throw i()}else if("{"===o){if(null!==t&&"["!==t&&'"prop":'!==t)throw i();n("{")}else if("\\"===o){if('"prop'!==t&&'"value'!==t)throw i();r||(a=!0)}else if(":"===o){if('"prop"'===t)s('"prop"'),n('"prop":');else if('"prop'!==t&&'"value'!==t)throw i()}else if("n"===o){if('"prop":'===t)s('"prop":'),n("n");else if('"prop'!==t&&'"value'!==t)throw i()}else if("u"===o){if("n"===t)s("n"),n("nu");else if("tr"===t)s("tr"),n("tru");else if('"prop'!==t&&'"value'!==t)throw i()}else if("l"===o){if("nu"===t)s("nu"),n("nul");else if("nul"===t)s("nul");else if("fa"===t)s("fa"),n("fal");else if('"prop'!==t&&'"value'!==t)throw i()}else if("t"===o){if('"prop":'===t)s('"prop":'),n("t");else if('"prop'!==t&&'"value'!==t)throw i()}else if("r"===o){if("t"===t)s("t"),n("tr");else if('"prop'!==t&&'"value'!==t)throw i()}else if("e"===o){if("tru"===t)s("tru");else if("fals"===t)s("fals");else if('"prop'!==t&&'"value'!==t)throw i()}else if("f"===o){if('"prop":'===t)s('"prop":'),n("f");else if('"prop'!==t&&'"value'!==t)throw i()}else if("a"===o){if("f"===t)s("f"),n("fa");else if('"prop'!==t&&'"value'!==t)throw i()}else if("s"===o){if("fal"===t)s("fal"),n("fals");else if('"prop'!==t&&'"value'!==t)throw i()}else if("."===o){if('"prop":'===t)s('"prop":'),n("number.");else if('"prop'!==t&&'"value'!==t)throw i()}else if(o.match(/[0-9]/)){if("number."===t)s("number.");else if('"prop'!==t&&'"value'!==t){if('"prop":'!==t)throw i();s('"prop":')}}else if("}"===o){if("{"===t)s("{");else if('"prop'!==t&&'"value'!==t)throw i()}else if("]"===o)if("["===t)s("[");else if('"prop'!==t&&'"value'!==t)throw i();r=a}let o=e.reverse().map((t=>{switch(t){case"{":return"}";case"[":return"]";case'"prop':return'": null';case'"prop"':return": null";case'"prop":':return" null";case"n":return"ull";case"nu":return"ll";case"nul":return"l";case"t":return"rue";case"tr":return"ue";case"tru":case"fals":return"e";case"f":return"alse";case"fa":return"lse";case"fal":return"se";case'"value':return'"';case"number.":return"0";default:throw i()}})).join(""),a=(r?t.substring(0,t.length-1):t).replace(/( |\n|,)+$/,"")+o;try{return JSON.parse(a)}catch(t){throw Error(`Failed to parse JSON with error '${t.message}'. JSON was: ${a}`)}}function G(t){return null!=t}function D(t){if(void 0===t)throw Error("Value is undefined");return t}var Y=[];for(let t=0;t<256;++t)Y.push((t+256).toString(16).slice(1));import{randomFillSync as H}from"crypto";var K=new Uint8Array(256),z=K.length;import{randomUUID as q}from"crypto";var Q={randomUUID:q},W=function(t,e,r){if(Q.randomUUID&&!e&&!t)return Q.randomUUID();let n=(t=t||{}).random??t.rng?.()??(z>K.length-16&&(H(K),z=0),K.slice(z,z+=16));if(n.length<16)throw Error("Random bytes length must be >= 16");if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,e){if((r=r||0)<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let t=0;t<16;++t)e[r+t]=n[t];return e}return function(t,e=0){return(Y[t[e+0]]+Y[t[e+1]]+Y[t[e+2]]+Y[t[e+3]]+"-"+Y[t[e+4]]+Y[t[e+5]]+"-"+Y[t[e+6]]+Y[t[e+7]]+"-"+Y[t[e+8]]+Y[t[e+9]]+"-"+Y[t[e+10]]+Y[t[e+11]]+Y[t[e+12]]+Y[t[e+13]]+Y[t[e+14]]+Y[t[e+15]]).toLowerCase()}(n)},X=class extends Error{data;httpStatus=400;constructor(t,e){let r=t.map((t=>{if(t.expectedProp)return{expectedProp:(t.path+".").replace(/^root\./,"")+t.expectedProp};if(t.expectedType)return{expectedType:t.expectedType.map(pt).join(" | "),path:t.path,insteadGot:t.value};if(t.unknownProp)return{unknownProp:(t.path+".").replace(/^root\./,"")+t.unknownProp};throw Error("illegal state")}));super(e??"Value is of the wrong format: "+JSON.stringify(r,null,2)),this.data=r}};function Z(t){return new rt([],t)}function tt(t,e,r,n){let s=e.map((e=>function(t,e,r,n){let{ignoreUnknownProps:s=!0}=n;switch(e.type){case"array":return Array.isArray(t)?0===t.length?[]:tt(t[0],e.elementType,r+"[..]",n):[{expectedType:[e],path:r,value:t}];case"boolean":return"boolean"!=typeof t?[{expectedType:[e],path:r,value:t}]:[];case"undefined":return void 0===t?[]:[{expectedType:[e],path:r,value:t}];case"object":{if("object"!=typeof t||null===t)return[{expectedType:[e],path:r,value:t}];let i=[];for(let s in e.props){let o=e.props[s];if(!(s in t)){o.optional||i.push({expectedProp:s,path:r,value:t});continue}let a=o.optional?[...o.type,{type:"undefined"}]:o.type;i.push(...tt(t[s],a,r+"."+s,n))}if(!s)for(let n in t)n in e.props||i.push({unknownProp:n,path:r,value:t});return i}case"string":return"string"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"null":return null===t?[]:[{expectedType:[e],path:r,value:t}];case"number":return"number"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"constant":return t===e.value?[]:[{expectedType:[e],path:r,value:t}]}}(t,e,r,n)));if(s.some((t=>0===t.length)))return[];{let e=s.flatMap((t=>t.filter((t=>void 0!==t.expectedType&&t.path===r))));return e.length>0?[{expectedType:e.flatMap((t=>t.expectedType)),path:r,value:t}]:s.flatMap((t=>t))}}var et=class{constructor(t,e,r=void 0){this.type=t,this.value=e,this.h=r}},rt=class t extends et{array(e){let r=e(new t([],this.value)),n=new nt([{type:"array",elementType:r.type}],this.value);return new nt([...this.type,...n.type],this.value)}object(t){let e=t(new st([{type:"object",props:{}}],this.value));return new nt([...this.type,...e.type],this.value)}string(){return new nt([...this.type,{type:"string"}],this.value)}number(){return new nt([...this.type,{type:"number"}],this.value)}boolean(){return new nt([...this.type,{type:"boolean"}],this.value)}constant(t,...e){return new at([...this.type,{type:"constant",value:t},...(e??[]).map((t=>({type:"constant",value:t})))],this.value)}null(){return new nt([...this.type,{type:"null"}],this.value)}undefined(){return new nt([...this.type,{type:"undefined"}],this.value)}},nt=class t extends et{orArray(e){let r=e(new t([],this.value)),n=new t([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}orObject(e){let r=e(new st([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}orString(){return new t([...this.type,{type:"string"}],this.value)}orNumber(){return new t([...this.type,{type:"number"}],this.value)}orBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}orConstant(t,...e){return new at([...this.type,{type:"constant",value:t},...(e??[]).map((t=>({type:"constant",value:t})))],this.value)}orNull(){return new t([...this.type,{type:"null"}],this.value)}orUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}},st=class t{constructor(t,e){this.type=t,this.value=e}mayHave(t,e,r){return this.has(t,e,!0,r)}canHaveString(t,e){return this.mayHave(t,(t=>t.string()),e)}canHaveNumber(t,e){return this.mayHave(t,(t=>t.number()),e)}canHaveBoolean(t,e){return this.mayHave(t,(t=>t.boolean()),e)}canHaveConstant(t,[e,...r],n){return this.mayHave(t,(t=>t.constant(e,...r)),n)}has(e,r,n=!1,s){let{optional:i,comment:o}="string"==typeof n?{optional:!1,comment:n}:{optional:n,comment:s},a=1===this.type.length?this.type[0]:void 0;if(void 0===a||"object"!==a.type)throw Error("illegal state");let h=r(new ot([],this.value)),l=h.type,u=h.l;return new t([{...a,props:{...a.props,[e]:{optional:i,type:l,comment:(()=>{let t=[...u,...void 0!==o?[o]:[]];return t.length>0?t.join(". "):void 0})()}}}],this.value)}hasString(t,e){return this.has(t,(t=>t.string()),!1,e)}hasNumber(t,e){return this.has(t,(t=>t.number()),!1,e)}hasBoolean(t,e){return this.has(t,(t=>t.boolean()),!1,e)}hasConstant(t,e,r,...n){let{constants:s,comment:i}=Array.isArray(e)?{constants:e,comment:r}:{constants:[e,...void 0!==r?[r]:[],...n],comment:void 0};return this.has(t,(t=>t.constant(...s)),!1,i)}},it=class extends et{constructor(t,e,r=[]){super(t,e),this.l=r}withComment(t){return new at(this.type,this.value,[...this.l,t])}},ot=class extends it{array(t){let e=t(new rt([],this.value)),r=new nt([{type:"array",elementType:e.type}],this.value);return new at([...this.type,...r.type],this.value)}object(t){let e=t(new st([{type:"object",props:{}}],this.value));return new at([...this.type,...e.type],this.value)}string(){return new at([...this.type,{type:"string"}],this.value)}number(){return new at([...this.type,{type:"number"}],this.value)}boolean(){return new at([...this.type,{type:"boolean"}],this.value)}constant(...t){return new at([...this.type,...t.map((t=>({type:"constant",value:t})))],this.value)}null(){return new at([...this.type,{type:"null"}],this.value)}undefined(){return new at([...this.type,{type:"undefined"}],this.value)}},at=class t extends it{orArray(e){let r=e(new nt([],this.value)),n=new nt([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}orObject(e){let r=e(new st([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}orString(){return new t([...this.type,{type:"string"}],this.value)}orNumber(){return new t([...this.type,{type:"number"}],this.value)}orBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}orConstant(...e){return new t([...this.type,...e.map((t=>({type:"constant",value:t})))],this.value)}orNull(){return new t([...this.type,{type:"null"}],this.value)}orUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}};function ht(t,e,r={}){let n=tt(t,e.type,"root",r);if(n.length>0)throw new X(n,r.errorMessage);return t}function lt(t){return ut(t.type)}function ut(t,e=0){if(Array.isArray(t))return t.map((t=>ut(t,e))).join(" | ");switch(t.type){case"array":return ut(t.elementType,e)+"[]";case"boolean":return"boolean";case"undefined":return"undefined";case"object":{let r=Object.keys(t.props);return"{\n"+r.map(((n,s)=>{let i=t.props[n],o=ut(i.type,e+1),a=s<r.length-1?",":"",h=void 0!==i.comment?" // "+i.comment:"";return`${ct(e+1)}${n}: ${o}${a}${h}\n`})).join("")+ct(e)+"}"}case"string":return"string";case"null":return"null";case"number":return"number";case"constant":return`"${t.value}"`}}function ct(t){let e="";for(let r=0;r<t;r++)e+=" ";return e}function pt(t){return"constant"===t.type?`'${t.value}'`:t.type}var ft=class{constructor(t){this.apiKeys=t}chat(t,e,...r){let{toPrompt:n}=(()=>{if("function"==typeof t)return{toPrompt:t,args:e};if("string"==typeof t)return{toPrompt:()=>t,args:void 0};if(Array.isArray(t)){let e=0===t.length?[{user:""}]:t;return{toPrompt:()=>e,args:void 0}}{let n=0===[t,...void 0!==e?[e]:[],...r].length?[{user:""}]:t;return{toPrompt:()=>n,args:void 0}}})();return new Tt(this,n,e,Rt(),void 0,void 0,void 0)}},dt=new ft(void 0);function wt(t){dt.apiKeys=vt(mt(t))}function yt(t){return new ft(vt(mt(t)))}function mt(t){return{promptGridApiKey:(()=>{let e="string"==typeof t?t:t.promptGridApiKey;return ht(e,Z(e).string().orUndefined(),{errorMessage:"Please provide a valid API key; got "+e})})(),apiKeys:"object"==typeof t&&null!==t?t.apiKeys:void 0}}function vt(t){let e=t.promptGridApiKey,r=t.apiKeys,n=void 0!==e?(async()=>{let t=await(async()=>{try{return await fetch(g()+"/handshake",{method:"POST",headers:{"Content-Type":"application/json","User-Agent":"promptgun",Authorization:"Bearer "+e}})}catch{throw Error("HTTP called failed when doing handshake")}})();if(200!==t.status){let e=await t.text();throw Error(`Handshake failed with status ${t.status}, body: ${e}`)}return await t.json()})():void 0;return{promptgrid:e,openai:(async()=>r?.openai??(await n)?.apiKeys.openai)()}}var Et=new Map;function At(t,e,r,n){if(void 0===dt)throw Error("No LLM set up. Call setupLLM first: ```import { setupPromptGun } from 'promptgun';\n\nsetupPromptGun({openAI: \"YOUR_OPENAI_API_KEY\"});\n```");return function(t,e,r,n,s){let i="object"!=typeof n&&(n??!1),o="object"==typeof n?n:s??{model:"gpt-4o"},a=u.Flux.fromGeneratorFunction((async function*(){console.log("args",JSON.stringify(e)),console.log("promptSupplier",""+r);let{model:n}=o,s=r(e);if("gpt-4o"!==n)throw new xt(`Model ${n} not supported`);yield*await Lt(t,n,s,i,void 0,void 0,void 0,Rt())}));if(!i)return a;let h=U.toJsonTokenFlux(a);return(new F).parse(h)}(dt,t,e,r,n)}function bt(t){let e=t??dt;if(void 0===e.apiKeys)throw Error("No LLM set up. Call setupPromptGun first: ```import { setupPromptGun } from 'promptgun';\n\nsetupPromptGun({openAI: \"YOUR_OPENAI_API_KEY\"});\n```");return new gt(e,Rt())}var gt=class{constructor(t,e){this.aiClient=t,this.callingCodeLine=e}completeChat(t,e){return new Tt(this.aiClient,t,e,Rt(),void 0,void 0,void 0)}},Tt=class{constructor(t,e,r,n,s,i,o){this.aiClient=t,this.promptSupplier=e,this.promptSupplierArgs=r,this.callingCodeLine=n,this.u=s,this.p=i,this.m=o;let a=this;this.generator=async function*(){yield*await Lt(a.aiClient,o,a.promptSupplier(a.promptSupplierArgs),!1,a.promptName,s,i,n)}()}generator;promptName;name(t){return this.promptName=t,this}model(t){return this.m=t,this}temperature(t){return this.u=t,this}topP(t){return this.p=t,this}next(...[t]){return this.generator.next(t)}return(t){return this.generator.return(t)}throw(t){return this.generator.throw(t)}[Symbol.asyncIterator](){return this}async then(t,e){try{let e=await this.getResponseAsString();return G(t)?await t(e):e}catch(t){if(G(e))return await e(t);throw t}}async catch(t){try{return await this.getResponseAsString()}catch(e){if(G(t))return t(e);throw e}}async finally(t){try{return await this.getResponseAsString()}finally{t?.()}}get[Symbol.toStringTag](){return"BasicPrompt"}to(t){return new Ut(this.aiClient,this.promptSupplier,this.promptSupplierArgs,t,Rt(),this.promptName,this.u,this.p,this.m)}toJson(){return new Ut(this.aiClient,this.promptSupplier,this.promptSupplierArgs,void 0,Rt(),this.promptName,this.u,this.p,this.m)}async getResponseAsString(){let t="";for await(let e of this)t+=e;return t}},Ut=class extends I{constructor(t,e,r,n,s,i,o,a,h){let l=async function*(){yield*await Lt(t,h,e(r),void 0===n||n(Z(void 0)),i,o,a,s)}(),c=u.Flux.fromGenerator(l),p=(new U).processDataBuffer(c);super(),this.aiClient=t,this.promptSupplier=e,this.promptSupplierArgs=r,this.jsonTypeSupplier=n,this.callingCodeLine=s,this.promptName=i,this.u=o,this.p=a,this.m=h;let f=this,d=(new F).parse(p);void 0!==n?d.onProperty("result",(t=>t.onEachExcerpt((t=>{void 0!==t.token&&this.push(t)})))):d.onEachExcerpt((t=>{void 0!==t.token&&this.push(t)})),this.stringGenerator=async function*(){for await(let t of p)void 0!==t.token?d.push(t):void 0!==t.source&&(yield t.source)}(),this.partialJsonGenerator=async function*(){let t="";for await(let e of f.stringGenerator){t+=e;let r=$(t);yield void 0!==n?r.result:r}}()}stringGenerator;partialJsonGenerator;next(...[t]){return this.partialJsonGenerator.next(t)}return(t){return this.partialJsonGenerator.return(t)}throw(t){return this.partialJsonGenerator.throw(t)}[Symbol.asyncIterator](){return this.partialJsonGenerator}async then(t,e){try{let e=await this.getResponse();return G(t)?await t(e):e}catch(t){if(G(e))return await e(t);throw t}}async catch(t){try{return await this.getResponse()}catch(e){if(G(t))return t(e);throw e}}async finally(t){try{return await this.getResponse()}finally{t?.()}}get[Symbol.toStringTag](){return"BasicPrompt"}name(t){return this.promptName=t,this}model(t){return this.m=t,this}temperature(t){return this.u=t,this}topP(t){return this.p=t,this}async getResponse(){let t=await this.getResponseAsString(),e=this.jsonTypeSupplier,r=JSON.parse(t),n=void 0!==e?r?.result:r;return void 0===e?n:ht(n,e(Z(n)))}async getResponseAsString(){let t="";for await(let e of this.stringGenerator)t+=e;return t}};function Nt(t){return t??"gpt-4o"}async function*Lt(t,e,r,n,s,i,o,a){let h=d(await t.apiKeys.openai).canBeString().andNothingElse({errorMessage:"No OpenAI access token set"}),l=function(t){let e=t=>({role:void 0!==t.user?"user":void 0!==t.system?"system":"assistant",content:D(t.user??t.system??t.assistant)});return"string"==typeof t?[{role:"user",content:t}]:Array.isArray(t)?t.map(e):[e(t)]}(r),u=n?[...l,{role:"system",content:_t(0,n)}]:l,{fileName:f,lineNumber:w}=a;if(f&&void 0!==w&&Array.from(Et.keys()).filter((t=>t.startsWith(f+":"))).map((t=>parseInt(t.split(":")[1],10))).length>1&&!s)throw Error(`Multiple prompts found in ${f}. Please specify a name using .name() method.`);let y={id:s,callingCodeLine:a},m=W(),v=e=>{(async function(t,e){try{if(void 0===e)return;let r=await fetch(g()+"/api/conversations",{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e},body:JSON.stringify(t)});if(!r.ok)throw Error(`Got ${r.status} when attempting to save conversation, with body: ${await r.text()}`)}catch(t){console.error("Error saving conversation",t)}})(e,t.apiKeys.promptgrid).then()};v({conversationUuid:m,prompt:y,messages:u.map((t=>({messageUuid:W(),role:t.role,content:t.content||""})))});let E=W();v({conversationUuid:m,prompt:y,messages:[{messageUuid:E,role:"assistant",content:""}]});let A=function({model:t,prompt:e,apiToken:r,temperature:n,topP:s,requireJsonResponse:i}){return c.Flux.fromGeneratorFunction((async function*(){let o=new AbortController,a=await fetch("https://api.openai.com/v1/chat/completions",{headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:"Bearer "+r},method:"POST",signal:o.signal,body:JSON.stringify({model:t,messages:e,stream:!0,temperature:n,top_p:s,response_format:i?{type:"json_object"}:void 0})});if(a.status<200||a.status>=300){let t=function(t){try{return JSON.parse(t).error.message}catch{return t}}(await a.text());throw Error("OpenAPI reported: "+t)}if(null===a.body)throw Error("illegal state");let h="";yield*c.Flux.fromReadableStream(a.body,(()=>o.abort())).map((t=>p.decode(t,{stream:!0}))).flatMap((t=>t.replaceAll("data: [DONE]","").replace(/^data: /,"").split("data: "))).map((t=>t.replace(/[\n ]*$/,"").trim())).flatMap((t=>{h+=t;try{let t=JSON.parse(h);return h="",[t]}catch{return console.error("Received partial json chunk: "+t),[]}})).map((t=>t.choices[0])).untilExcl((t=>null!=t.finish_reason)).map((t=>t.delta.content)).filter((t=>void 0!==t))}))}({model:Nt(e),prompt:u,apiToken:h,temperature:i,topP:o,requireJsonResponse:!1!==n}),b="";yield*A.doOnEach((t=>{b+=t,v({conversationUuid:m,prompt:y,messages:[{messageUuid:E,role:"assistant",content:b}]})}))}function _t(t,e){{if(!0===e)return"Respond with JSON";let t=e;return"Respond with JSON matching the following type spec (note: everything is nonnullable unless explicitly stated otherwise):\n"+lt(new rt([],void 0).object((e=>e.has("result",(()=>new at(t.type,t.value))))))}}var St=class extends Error{},xt=class extends Error{};function Rt(){let t=(Error().stack??"").split("\n").map((t=>t.trim())).filter((t=>t.startsWith("at ")))[2],e=t.match(/[^(]+\([^)]+\)/),{functionName:r,fileName:n,lineNumber:s}=e?t.match("at (?<functionName>[^(]*) ((?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+))").groups:t.match("at (?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)").groups;return{stacktraceFrame:d(t).canBeString().andNothingElse(),fileName:d(n).canBeString().andNothingElse(),lineNumber:d(parseInt(s)).canBeNumber().andNothingElse(),functionName:d(r).canBeString().canBeUndefined().andNothingElse()}}export{ft as AIClient,Tt as BasicPrompt,ot as EmptyPropTypeSpec,rt as EmptyTypeSpec,at as FullPropTypeSpec,nt as FullTypeSpec,Ut as JsonPrompt,xt as ModelNotSupportedError,St as NoAiCredientialsError,gt as PromptBase,it as PropTypeSpec,I as StreamedJsonChildElement,M as StreamedJsonRootElement,st as TypeMemberSpec,et as TypeSpec,dt as ai,Rt as getCallerFileNameAndLineNumber,yt as newAIClient,vt as obtainAiClientData,bt as promptAI,At as promptLLM,wt as setupAI};
|
|
1
|
+
var t=Object.create,e=Object.defineProperty,r=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.getPrototypeOf,i={}.hasOwnProperty,o=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),a=(o,a,h)=>(h=null!=o?t(s(o)):{},((t,s,o,a)=>{if(s&&"object"==typeof s||"function"==typeof s)for(let o of n(s))!i.call(t,o)&&void 0!==o&&e(t,o,{get:()=>s[o],enumerable:!(a=r(s,o))||a.enumerable});return t})(!a&&o&&o.t?h:e(h,"default",{value:o,enumerable:!0}),o)),h=o((t=>{"use strict";Object.defineProperty(t,"t",{value:!0}),t.Flux=void 0;var e=class t{generator;upstream;handleCancel;i=!1;constructor(t,e,n){let s=this;this.generator=async function*(){try{yield*t}catch(t){throw yield r,t}finally{s.i=!0}}(),this.upstream=e,this.handleCancel=n}[Symbol.asyncIterator](){return this}async next(...t){let e=await this.generator.next(t);return e.value!==r?e:await this.next(t)}return(t){return this.generator.return(t)}throw(t){return this.generator.throw(t)}async cancel(t){if(!this.closed){if(void 0!==this.upstream)return this.upstream.cancel(t);void 0!==this.handleCancel?this.handleCancel(t):await this.throw(t)}}async then(t,e){try{let e=await this.asList();return null!=t?await t(e):e}catch(t){if(null!=e)return e(t);throw t}}async catch(t){try{return this.asList()}catch(e){if(null!=t)return t(e);throw e}}async finally(t){let e=await this.asList();return t?.(),e}get[Symbol.toStringTag](){return"Flux"}subscribe(t){let e=void 0!==t?this.doOnEach(t):this,r=()=>{e.next().then((t=>{t.done||r()})).catch((t=>{console.error(t)}))};return r(),{unsubscribe:()=>this.return()}}filter(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)e(t)&&(yield t)}),this)}untilExcl(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r){if(e(t))break;yield t}}),this)}doOnEach(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)e(t),yield t}),this)}doAfterLast(e){let r=this,n=[];return t.constructFromGeneratorFunction((async function*(){for await(let t of r)n.push(t),yield t;await e(n)}),this)}map(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r)yield e(t)}),this)}take(e){let r=this;return t.constructFromGeneratorFunction((async function*(){let t=0;for await(let n of r){if(t>=e){r.cancel();break}t++,yield n}}),this)}flatMap(e){let r=this;return t.constructFromGeneratorFunction((async function*(){for await(let t of r){let r=e(t);if(Array.isArray(r))for(let t of r)yield t;else yield await r}}),this)}transform(e){let r=e(this);return t.constructFromGeneratorFunction((async function*(){for await(let t of r)yield t}),this)}async reduce(t,e){let r=e;for await(let e of this)r=t(r,e);return r}async asList(){let t=[];for await(let e of this)t.push(e);return t}async whenComplete(){for await(let t of this);}static create(e){let r,n=[],s=[],i=!1,o=()=>{for(i=!0;s.length>0;)s.shift().resolve({done:!0,value:void 0})};return e((t=>{if(i)throw Error("Cannot push to a completed generator");s.length>0?s.shift().resolve({done:!1,value:t}):n.push(t)}),o),t.fromGenerator({[Symbol.asyncIterator](){return this},next(...t){if(r){let t=r.value;return r=void 0,Promise.reject(t)}if(n.length>0){let t=n.shift();return Promise.resolve({done:!1,value:t})}return i?Promise.resolve({done:!0,value:void 0}):new Promise(((t,e)=>{s.push({resolve:t,reject:e})}))},return:()=>(o(),Promise.resolve({done:!0,value:void 0})),throw:t=>(r=t,s.length>0&&s.shift()?.reject(),Promise.reject(t))})}static fromArray(e){return t.fromGeneratorFunction((async function*(){for(let t of e)yield t}))}static constructFromGeneratorFunction(e,r,n){return new t(e(),r,n)}static fromGeneratorFunction(e,r){return t.constructFromGeneratorFunction(e,void 0,r)}static fromGenerator(e,r){return new t(e,void 0,r)}static fromReadableStream(e,r){return t.fromGeneratorFunction((async function*(){let t=e.getReader();try{let e;for(;!(e=await t.read()).done;)yield e.value}finally{await t.cancel()}}),r)}get closed(){return this.i}};t.Flux=e;var r={}})),l=o((t=>{"use strict";Object.defineProperty(t,"t",{value:!0}),t.Flux=void 0;var e=h();Object.defineProperty(t,"Flux",{enumerable:!0,get:function(){return e.Flux}})})),u=a(l(),1),c=a(l(),1),p=new TextDecoder,f=class extends Error{data;httpStatus=400;constructor(t,e){let r=t.map((t=>{if(t.expectedProp)return{expectedProp:(t.path+".").replace(/^root\./,"")+t.expectedProp};if(t.expectedType)return{expectedType:t.expectedType.map(A).join(" | "),path:t.path,insteadGot:t.value};if(t.unknownProp)return{unknownProp:(t.path+".").replace(/^root\./,"")+t.unknownProp};throw Error("illegal state")}));super(e??"Value is of the wrong format: "+JSON.stringify(r,null,2)),this.data=r}};function d(t){return new m([],t)}function w(t,e,r,n){let s=e.map((e=>function(t,e,r,n){let{ignoreUnknownProps:s=!0}=n;switch(e.type){case"array":return Array.isArray(t)?0===t.length?[]:w(t[0],e.elementType,r+"[..]",n):[{expectedType:[e],path:r,value:t}];case"boolean":return"boolean"!=typeof t?[{expectedType:[e],path:r,value:t}]:[];case"undefined":return void 0===t?[]:[{expectedType:[e],path:r,value:t}];case"object":{if("object"!=typeof t||null===t)return[{expectedType:[e],path:r,value:t}];let i=[];for(let s in e.props){let o=e.props[s];if(!(s in t)){o.optional||i.push({expectedProp:s,path:r,value:t});continue}let a=o.optional?[...o.type,{type:"undefined"}]:o.type;i.push(...w(t[s],a,r+"."+s,n))}if(!s)for(let n in t)n in e.props||i.push({unknownProp:n,path:r,value:t});return i}case"string":return"string"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"null":return null===t?[]:[{expectedType:[e],path:r,value:t}];case"number":return"number"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"constant":return t!==e.value||Number.isNaN(t)?[{expectedType:[e],path:r,value:t}]:[]}}(t,e,r,n)));if(s.some((t=>0===t.length)))return[];{let e=s.flatMap((t=>t.filter((t=>void 0!==t.expectedType&&t.path===r))));return e.length>0?[{expectedType:e.flatMap((t=>t.expectedType)),path:r,value:t}]:s.flatMap((t=>t))}}var y,m=class t{type;value;constructor(t=[],e){this.type=t,this.value=e}canBeArray(e){let r=e(new t([],this.value)),n=new t([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}canBeObject(e){let r=e(new t([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}hasString(t){return this.hasProperty(t,(t=>t.canBeString()))}canHaveProperty(t,e){return this.hasProperty(t,e,!0)}hasProperty(e,r,n=!1){let s=1===this.type.length?this.type[0]:void 0;if(void 0===s||"object"!==s.type)throw Error("illegal state");let{type:i}=r(new t([],this.value));return new t([{...s,props:{...s.props,[e]:{optional:n,type:i}}}],this.value)}canBeString(){return new t([...this.type,{type:"string"}],this.value)}canBeNumber(){return new t([...this.type,{type:"number"}],this.value)}canBeBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}canBeConstant(e){return new t([...this.type,{type:"constant",value:e}],this.value)}canBeNull(){return new t([...this.type,{type:"null"}],this.value)}canBeUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}andNothingElse(t={}){let e=w(this.value,this.type,"root",t);if(e.length>0)throw new f(e,t.errorMessage);return this.value}orDefaultTo(t,e={}){return w(this.value,this.type,"root",e).length>0?t:this.value}describe(){return v(this.type)}};function v(t,e=0){if(Array.isArray(t))return t.map((t=>v(t,e))).join(" | ");switch(t.type){case"array":return v(t.elementType,e)+"[]";case"boolean":return"boolean";case"undefined":return"undefined";case"object":return"{\n"+Object.keys(t.props).map((r=>`${E(e+1)}${r}: ${v(t.props[r].type,e+1)}`)).join(",\n")+`\n${E(e)}}`;case"string":return"string";case"null":return"null";case"number":return"number";case"constant":return`"${t.value}"`}}function E(t){let e="";for(let r=0;r<t;r++)e+=" ";return e}function A(t){return"constant"===t.type?`'${t.value}'`:t.type}import{config as b}from"dotenv";function g(){if(!y){b();let t=function(){let t="t";t+="ps",t="ht"+t,t+=":",t+="/",t+="/ap",t+="i.pr";let e="i";return e="d.a"+e,e="gri"+e,t+="ompt",t+e}();y=d(t).canBeString().andNothingElse({errorMessage:"PromptGrid API URL invalid: "+t})}return y}var T=class{constructor(t,e,r,n,s=!1){this.type=t,this.source=e,this.value=r,this.fieldName=n,this.maybeIncomplete=s}},U=class t{jsonBuffer="";highestOffsetParsed=-1;static toJsonTokenFlux(e){return(new t).processDataBuffer(e)}processDataBuffer(t){return t.flatMap((t=>this.getExcerpts(t)))}getExcerpts(t){this.jsonBuffer+=t;let e,r=[],n=new N(this.jsonBuffer);for(;e=this.nextToken(n);)n.currentTokenLocation().getCharOffset()>this.highestOffsetParsed&&(r.push({token:e}),this.highestOffsetParsed=n.currentTokenLocation().getCharOffset());return r.push({source:t}),r}nextToken(t){let e=t.nextToken();return"string"!=typeof e?e:void 0}},N=class{constructor(t){this.content=t}position=0;currentTokenType;parentFieldName;currentValue=null;nextToken(){let t=this.position;if(this.position>=this.content.length)return"string-ended";for(;this.position<this.content.length&&/\s/.test(this.content[this.position]);)this.position++;if(this.position>=this.content.length)return"string-ended";let e=t=>{let e=t;for(;e<this.content.length&&/\s/.test(this.content[e]);)e++;return","===this.content[e]?e+1:void 0},r=e=>this.content.substring(t,e),n=this.content[this.position];switch(n){case"{":return this.position++,this.currentTokenType="START_OBJECT",new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);case"}":{this.position++,this.currentTokenType="END_OBJECT",this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);return this.parentFieldName=void 0,t}case"[":return this.position++,this.currentTokenType="START_ARRAY",new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);case"]":{this.position++,this.currentTokenType="END_ARRAY",this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),void 0,this.parentFieldName);return this.parentFieldName=void 0,t}case'"':let t=++this.position,s=this.content.indexOf('"',t);for(;s>0&&"\\"===this.content[s-1];)s=this.content.indexOf('"',s+1);if(-1===s)return"token-incomplete";let i=this.content.substring(t,s);this.position=s+1;let o=this.position;for(;o<this.content.length&&/\s/.test(this.content[o]);)o++;if(this.currentTokenType=o<this.content.length&&":"===this.content[o]?"FIELD_NAME":"VALUE_STRING","FIELD_NAME"===this.currentTokenType){this.position=o+1,this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),i,void 0);return this.parentFieldName=i,t}{this.currentValue=i,this.position=e(this.position)??this.position;let t=new T(this.currentTokenType,r(this.position),i,"VALUE_STRING"===this.currentTokenType?this.parentFieldName:void 0);return this.parentFieldName=void 0,t}case"t":{let t=this.content.substring(this.position,this.position+4);if("true"===t)return this.position+=4,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_TRUE",this.currentValue=!0,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<4)return"token-incomplete";break}case"f":{let t=this.content.substring(this.position,this.position+5);if("false"===t)return this.position+=5,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_FALSE",this.currentValue=!1,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<5)return"token-incomplete";break}case"n":{let t=this.content.substring(this.position,this.position+4);if("null"===t)return this.position+=4,this.position=e(this.position)??this.position,this.currentTokenType="VALUE_NULL",this.currentValue=null,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName);if(t.length<4)return"token-incomplete";break}default:if(/[0-9-]/.test(n)){let t="",n=!1;for(;this.position<this.content.length&&(/[0-9]/.test(this.content[this.position])||"-"===this.content[this.position]||"."===this.content[this.position]||"e"===this.content[this.position]||"E"===this.content[this.position]||"+"===this.content[this.position]);)"."===this.content[this.position]&&(n=!0),t+=this.content[this.position++];n?(this.currentTokenType="VALUE_NUMBER_FLOAT",this.currentValue=parseFloat(t)):(this.currentTokenType="VALUE_NUMBER_INT",this.currentValue=parseInt(t,10));let s=this.position>=this.content.length;return this.position=e(this.position)??this.position,new T(this.currentTokenType,r(this.position),this.currentValue,this.parentFieldName,s)}}throw new L("Invalid JSON at position "+this.position)}currentTokenLocation(){return{getCharOffset:()=>this.position}}},L=class extends Error{constructor(t){super(t),this.name="JsonParseException"}},_=a(l(),1),S=class{receivedJson=[];propertyCallbacks=new Map;onElementCallbacks=new Set;onCompleteCallbacks=new Set;onEachExcerptCallbacks=new Set;currentToken;state=new P;receivedExcerpts=[];onElement(t){return this.onElementCallbacks.add(t),this}onProperty(t,e){return this.propertyCallbacks.has(t)||this.propertyCallbacks.set(t,[]),this.propertyCallbacks.get(t).push(e),this}onJsonStringProperty(t,e){return this.propertyCallbacks.has(t)||this.propertyCallbacks.set(t,[]),this.propertyCallbacks.get(t).push((t=>{let r=new k,n=[],s=new I;t.onEachExcerpt((t=>{void 0!==t.source&&n.push(t.source);let e=n.join(""),i=this.endsOnUnevenNumberOfBackslashes(e)?e.substring(0,e.length-1):e;n.length=0;let o=i.replace(/\\"/g,'"').substring(1),a=null!=t.token?o.substring(0,o.length-1):o;r.getExcerpts(a).forEach((t=>s.push(t)))})),e(s)})),this}onEachExcerpt(t){return this.onEachExcerptCallbacks.add(t),this.receivedExcerpts.forEach(t),this}onComplete(t){this.o(this.toAsync(t),void 0)}o(t,e){this.onCompleteCallbacks.add({consumer:t,expectedTokenType:e})}onCompleteAsync(t){this.o(t,void 0)}onCompleteAs(t){this.onCompleteAsAsync(this.toAsync(t))}onCompleteAsAsync(t){this.o((e=>{let r=JSON.parse(e.replace(/,$/,""));return t(r)}),void 0)}onCompleteAsString(t){this.o(this.toAsync(t),new Set(["VALUE_STRING","VALUE_NULL"]))}onCompleteAsStringAsync(t){this.o(t,new Set(["VALUE_STRING","VALUE_NULL"]))}onCompleteAsInt(t){this.o(this.toAsync(t),new Set(["VALUE_NUMBER_INT","VALUE_NULL"]))}onCompleteAsIntAsync(t){this.o(t,new Set(["VALUE_NUMBER_INT","VALUE_NULL"]))}onCompleteAsNumber(t){this.o(this.toAsync(t),new Set(["VALUE_NUMBER_INT","VALUE_NUMBER_FLOAT","VALUE_NULL"]))}onCompleteAsNumberAsync(t){this.o(t,new Set(["VALUE_NUMBER_INT","VALUE_NUMBER_FLOAT","VALUE_NULL"]))}onCompleteAsBoolean(t){this.o(this.toAsync(t),new Set(["VALUE_TRUE","VALUE_FALSE","VALUE_NULL"]))}onCompleteAsBooleanAsync(t){this.o(t,new Set(["VALUE_TRUE","VALUE_FALSE","VALUE_NULL"]))}whenComplete(){return new Promise((t=>{this.onComplete((e=>t(e)))}))}asJsonFlux(){return _.Flux.create(((t,e)=>{this.onEachExcerpt((e=>{e.source&&t(e.source)})),this.o((async()=>e()))}))}whenCompleteAs(){return new Promise((t=>{this.onCompleteAs(t)}))}async push(t){let e=t.token;if(this.onEachExcerptCallbacks.forEach((e=>e(t))),this.isState(R))return this.state.child.push(t);if(!e)return;let r=e.type;if(this.currentToken=e,this.isState(P))switch(r){case"START_OBJECT":if(this.onElementCallbacks.size>0)throw Error("registered onElement for object");return this.state=new V,void this.receivedJson.push(e.source);case"START_ARRAY":if(this.propertyCallbacks.size>0)throw Error("registered onProperty for array");return this.state=new O,void this.receivedJson.push(e.source);case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":return this.receivedJson.push(e.source),this.end();default:throw new j(e)}else if(this.isState(V))switch(r){case"FIELD_NAME":return void this.receivedJson.push(e.source);case"END_OBJECT":return this.receivedJson.push(e.source),this.end();case"START_OBJECT":case"START_ARRAY":case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":{let r=new I;return r.onComplete((t=>{this.receivedJson.push(t),this.state=new V})),this.state=new B(r),this.propertyCallbacks.get(e.fieldName)?.forEach((t=>t(r))),r.push(t)}default:throw new j(e)}else if(this.isState(O))switch(r){case"END_ARRAY":return this.receivedJson.push(e.source),this.end();case"START_OBJECT":case"START_ARRAY":case"VALUE_STRING":case"VALUE_NUMBER_INT":case"VALUE_NUMBER_FLOAT":case"VALUE_TRUE":case"VALUE_FALSE":case"VALUE_NULL":{let e=new I;return e.onComplete((t=>{this.receivedJson.push(t),this.state=new O})),this.onElementCallbacks.forEach((t=>t(e))),this.state=new C(e),e.push(t)}default:throw new j(e)}throw Error("Unknown state")}async end(){if(void 0===this.currentToken)throw Error("Illegal state");await _.Flux.fromArray([...this.onCompleteCallbacks]).flatMap((async t=>{let e=t.expectedTokenType,r=(()=>{if(void 0===e)return this.receivedJson.join("");if(!e.has(this.currentToken.type))throw Error(`Expected token type ${Array.from(e).join(", ")} but got ${this.currentToken.type}`);return this.currentToken.value})();await t.consumer(r)}))}isState(t){return this.state instanceof t}endsOnUnevenNumberOfBackslashes(t){let e=0;for(let r=t.length-1;r>=0&&"\\"===t[r];r--)e++;return e%2==1}toAsync(t){return async e=>{t(e)}}},x=class{},R=class extends x{constructor(t){super(),this.child=t}},P=class extends x{},O=class extends x{},C=class extends R{constructor(t){super(t)}},V=class extends x{},B=class extends R{constructor(t){super(t)}},j=class extends Error{constructor(t){super("Unexpected token: "+t.type),this.name="UnexpectedTokenException"}},k=class{getExcerpts(t){return[{source:t}]}},I=class extends S{constructor(){super()}},J=a(l(),1),M=class extends S{jsonTokenFlux;constructor(t){super();let e=this;this.jsonTokenFlux=J.Flux.fromGeneratorFunction((async function*(){let r;for await(let n of t)void 0!==n.token&&(r?.token?.maybeIncomplete&&r.token.type===n.token.type&&!n.token.maybeIncomplete&&await e.push(n),r=n.token),(void 0===n.token||!n.token.maybeIncomplete)&&await e.push(n),yield n;r?.token?.maybeIncomplete&&await e.push(r)}))}whenComplete(){return this.jsonTokenFlux.then((()=>this.receivedJson.join("")))}asJsonFlux(){return this.jsonTokenFlux.map((t=>t.source)).filter((t=>void 0!==t))}},F=class{parse(t){return new M(t)}};function $(t){try{return JSON.parse(t)}catch(e){throw Error(`Failed to parse JSON with error '${e.message}'. JSON was: ${t}`)}}function G(t){if(""===t.trim())return;let e=[],r=!1,n=t=>e.push(t),s=(...t)=>{let r=e[e.length-1];if(void 0===r||!t.includes(r))throw Error("illegal state");e.pop()},i=()=>Error(`Illegal state (json: ${t})`);for(let o of t){let t=e.length>0?e[e.length-1]:null,a=!1;if('"'===o)if(null===t)n('"value');else if("["===t)n('"value');else if("{"===t)n('"prop');else if('"prop":'===t)s('"prop":'),n('"value');else if('"prop'===t)r||(s('"prop'),n('"prop"'));else{if('"value'!==t)throw i();r||s('"value')}else if("["===o){if(null===t)n("[");else if("["===t)n("[");else if('"prop":'===t)s('"prop":'),n("[");else if('"prop'!==t&&'"value'!==t)throw i()}else if("{"===o){if(null!==t&&"["!==t&&'"prop":'!==t)throw i();n("{")}else if("\\"===o){if('"prop'!==t&&'"value'!==t)throw i();r||(a=!0)}else if(":"===o){if('"prop"'===t)s('"prop"'),n('"prop":');else if('"prop'!==t&&'"value'!==t)throw i()}else if("n"===o){if('"prop":'===t)s('"prop":'),n("n");else if('"prop'!==t&&'"value'!==t)throw i()}else if("u"===o){if("n"===t)s("n"),n("nu");else if("tr"===t)s("tr"),n("tru");else if('"prop'!==t&&'"value'!==t)throw i()}else if("l"===o){if("nu"===t)s("nu"),n("nul");else if("nul"===t)s("nul");else if("fa"===t)s("fa"),n("fal");else if('"prop'!==t&&'"value'!==t)throw i()}else if("t"===o){if('"prop":'===t)s('"prop":'),n("t");else if('"prop'!==t&&'"value'!==t)throw i()}else if("r"===o){if("t"===t)s("t"),n("tr");else if('"prop'!==t&&'"value'!==t)throw i()}else if("e"===o){if("tru"===t)s("tru");else if("fals"===t)s("fals");else if('"prop'!==t&&'"value'!==t)throw i()}else if("f"===o){if('"prop":'===t)s('"prop":'),n("f");else if('"prop'!==t&&'"value'!==t)throw i()}else if("a"===o){if("f"===t)s("f"),n("fa");else if('"prop'!==t&&'"value'!==t)throw i()}else if("s"===o){if("fal"===t)s("fal"),n("fals");else if('"prop'!==t&&'"value'!==t)throw i()}else if("."===o){if('"prop":'===t)s('"prop":'),n("number.");else if('"prop'!==t&&'"value'!==t)throw i()}else if(o.match(/[0-9]/)){if("number."===t)s("number.");else if('"prop'!==t&&'"value'!==t){if('"prop":'!==t)throw i();s('"prop":')}}else if("}"===o){if("{"===t)s("{");else if('"prop'!==t&&'"value'!==t)throw i()}else if("]"===o)if("["===t)s("[");else if('"prop'!==t&&'"value'!==t)throw i();r=a}let o=e.reverse().map((t=>{switch(t){case"{":return"}";case"[":return"]";case'"prop':return'": null';case'"prop"':return": null";case'"prop":':return" null";case"n":return"ull";case"nu":return"ll";case"nul":return"l";case"t":return"rue";case"tr":return"ue";case"tru":case"fals":return"e";case"f":return"alse";case"fa":return"lse";case"fal":return"se";case'"value':return'"';case"number.":return"0";default:throw i()}})).join("");return $((r?t.substring(0,t.length-1):t).replace(/( |\n|,)+$/,"")+o)}function D(t){return null!=t}function Y(t){if(void 0===t)throw Error("Value is undefined");return t}var H=[];for(let t=0;t<256;++t)H.push((t+256).toString(16).slice(1));import{randomFillSync as K}from"crypto";var z=new Uint8Array(256),q=z.length;import{randomUUID as Q}from"crypto";var W={randomUUID:Q},X=function(t,e,r){if(W.randomUUID&&!e&&!t)return W.randomUUID();let n=(t=t||{}).random??t.rng?.()??(q>z.length-16&&(K(z),q=0),z.slice(q,q+=16));if(n.length<16)throw Error("Random bytes length must be >= 16");if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,e){if((r=r||0)<0||r+16>e.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let t=0;t<16;++t)e[r+t]=n[t];return e}return function(t,e=0){return(H[t[e+0]]+H[t[e+1]]+H[t[e+2]]+H[t[e+3]]+"-"+H[t[e+4]]+H[t[e+5]]+"-"+H[t[e+6]]+H[t[e+7]]+"-"+H[t[e+8]]+H[t[e+9]]+"-"+H[t[e+10]]+H[t[e+11]]+H[t[e+12]]+H[t[e+13]]+H[t[e+14]]+H[t[e+15]]).toLowerCase()}(n)},Z=class extends Error{data;httpStatus=400;constructor(t,e){let r=t.map((t=>{if(t.expectedProp)return{expectedProp:(t.path+".").replace(/^root\./,"")+t.expectedProp};if(t.expectedType)return{expectedType:t.expectedType.map(ft).join(" | "),path:t.path,insteadGot:t.value};if(t.unknownProp)return{unknownProp:(t.path+".").replace(/^root\./,"")+t.unknownProp};throw Error("illegal state")}));super(e??"Value is of the wrong format: "+JSON.stringify(r,null,2)),this.data=r}};function tt(t){return new nt([],t)}function et(t,e,r,n){let s=e.map((e=>function(t,e,r,n){let{ignoreUnknownProps:s=!0}=n;switch(e.type){case"array":return Array.isArray(t)?0===t.length?[]:et(t[0],e.elementType,r+"[..]",n):[{expectedType:[e],path:r,value:t}];case"boolean":return"boolean"!=typeof t?[{expectedType:[e],path:r,value:t}]:[];case"undefined":return void 0===t?[]:[{expectedType:[e],path:r,value:t}];case"object":{if("object"!=typeof t||null===t)return[{expectedType:[e],path:r,value:t}];let i=[];for(let s in e.props){let o=e.props[s];if(!(s in t)){o.optional||i.push({expectedProp:s,path:r,value:t});continue}let a=o.optional?[...o.type,{type:"undefined"}]:o.type;i.push(...et(t[s],a,r+"."+s,n))}if(!s)for(let n in t)n in e.props||i.push({unknownProp:n,path:r,value:t});return i}case"string":return"string"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"null":return null===t?[]:[{expectedType:[e],path:r,value:t}];case"number":return"number"==typeof t?[]:[{expectedType:[e],path:r,value:t}];case"constant":return t===e.value?[]:[{expectedType:[e],path:r,value:t}]}}(t,e,r,n)));if(s.some((t=>0===t.length)))return[];{let e=s.flatMap((t=>t.filter((t=>void 0!==t.expectedType&&t.path===r))));return e.length>0?[{expectedType:e.flatMap((t=>t.expectedType)),path:r,value:t}]:s.flatMap((t=>t))}}var rt=class{constructor(t,e,r=void 0){this.type=t,this.value=e,this.h=r}},nt=class t extends rt{array(e){let r=e(new t([],this.value)),n=new st([{type:"array",elementType:r.type}],this.value);return new st([...this.type,...n.type],this.value)}object(t){let e=t(new it([{type:"object",props:{}}],this.value));return new st([...this.type,...e.type],this.value)}string(){return new st([...this.type,{type:"string"}],this.value)}number(){return new st([...this.type,{type:"number"}],this.value)}boolean(){return new st([...this.type,{type:"boolean"}],this.value)}constant(t,...e){return new ht([...this.type,{type:"constant",value:t},...(e??[]).map((t=>({type:"constant",value:t})))],this.value)}null(){return new st([...this.type,{type:"null"}],this.value)}undefined(){return new st([...this.type,{type:"undefined"}],this.value)}},st=class t extends rt{orArray(e){let r=e(new t([],this.value)),n=new t([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}orObject(e){let r=e(new it([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}orString(){return new t([...this.type,{type:"string"}],this.value)}orNumber(){return new t([...this.type,{type:"number"}],this.value)}orBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}orConstant(t,...e){return new ht([...this.type,{type:"constant",value:t},...(e??[]).map((t=>({type:"constant",value:t})))],this.value)}orNull(){return new t([...this.type,{type:"null"}],this.value)}orUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}},it=class t{constructor(t,e){this.type=t,this.value=e}mayHave(t,e,r){return this.has(t,e,!0,r)}canHaveString(t,e){return this.mayHave(t,(t=>t.string()),e)}canHaveNumber(t,e){return this.mayHave(t,(t=>t.number()),e)}canHaveBoolean(t,e){return this.mayHave(t,(t=>t.boolean()),e)}canHaveConstant(t,[e,...r],n){return this.mayHave(t,(t=>t.constant(e,...r)),n)}has(e,r,n=!1,s){let{optional:i,comment:o}="string"==typeof n?{optional:!1,comment:n}:{optional:n,comment:s},a=1===this.type.length?this.type[0]:void 0;if(void 0===a||"object"!==a.type)throw Error("illegal state");let h=r(new at([],this.value)),l=h.type,u=h.l;return new t([{...a,props:{...a.props,[e]:{optional:i,type:l,comment:(()=>{let t=[...u,...void 0!==o?[o]:[]];return t.length>0?t.join(". "):void 0})()}}}],this.value)}hasString(t,e){return this.has(t,(t=>t.string()),!1,e)}hasNumber(t,e){return this.has(t,(t=>t.number()),!1,e)}hasBoolean(t,e){return this.has(t,(t=>t.boolean()),!1,e)}hasConstant(t,e,r,...n){let{constants:s,comment:i}=Array.isArray(e)?{constants:e,comment:r}:{constants:[e,...void 0!==r?[r]:[],...n],comment:void 0};return this.has(t,(t=>t.constant(...s)),!1,i)}},ot=class extends rt{constructor(t,e,r=[]){super(t,e),this.l=r}withComment(t){return new ht(this.type,this.value,[...this.l,t])}},at=class extends ot{array(t){let e=t(new nt([],this.value)),r=new st([{type:"array",elementType:e.type}],this.value);return new ht([...this.type,...r.type],this.value)}object(t){let e=t(new it([{type:"object",props:{}}],this.value));return new ht([...this.type,...e.type],this.value)}string(){return new ht([...this.type,{type:"string"}],this.value)}number(){return new ht([...this.type,{type:"number"}],this.value)}boolean(){return new ht([...this.type,{type:"boolean"}],this.value)}constant(...t){return new ht([...this.type,...t.map((t=>({type:"constant",value:t})))],this.value)}null(){return new ht([...this.type,{type:"null"}],this.value)}undefined(){return new ht([...this.type,{type:"undefined"}],this.value)}},ht=class t extends ot{orArray(e){let r=e(new st([],this.value)),n=new st([{type:"array",elementType:r.type}],this.value);return new t([...this.type,...n.type],this.value)}orObject(e){let r=e(new it([{type:"object",props:{}}],this.value));return new t([...this.type,...r.type],this.value)}orString(){return new t([...this.type,{type:"string"}],this.value)}orNumber(){return new t([...this.type,{type:"number"}],this.value)}orBoolean(){return new t([...this.type,{type:"boolean"}],this.value)}orConstant(...e){return new t([...this.type,...e.map((t=>({type:"constant",value:t})))],this.value)}orNull(){return new t([...this.type,{type:"null"}],this.value)}orUndefined(){return new t([...this.type,{type:"undefined"}],this.value)}};function lt(t,e,r={}){let n=et(t,e.type,"root",r);if(n.length>0)throw new Z(n,r.errorMessage);return t}function ut(t){return ct(t.type)}function ct(t,e=0){if(Array.isArray(t))return t.map((t=>ct(t,e))).join(" | ");switch(t.type){case"array":return ct(t.elementType,e)+"[]";case"boolean":return"boolean";case"undefined":return"undefined";case"object":{let r=Object.keys(t.props);return"{\n"+r.map(((n,s)=>{let i=t.props[n],o=ct(i.type,e+1),a=s<r.length-1?",":"",h=void 0!==i.comment?" // "+i.comment:"";return`${pt(e+1)}${n}: ${o}${a}${h}\n`})).join("")+pt(e)+"}"}case"string":return"string";case"null":return"null";case"number":return"number";case"constant":return`"${t.value}"`}}function pt(t){let e="";for(let r=0;r<t;r++)e+=" ";return e}function ft(t){return"constant"===t.type?`'${t.value}'`:t.type}var dt=class{constructor(t){this.apiKeys=t}chat(t,e,...r){let{toPrompt:n}=(()=>{if("function"==typeof t)return{toPrompt:t,args:e};if("string"==typeof t)return{toPrompt:()=>t,args:void 0};if(Array.isArray(t)){let e=0===t.length?[{user:""}]:t;return{toPrompt:()=>e,args:void 0}}{let n=0===[t,...void 0!==e?[e]:[],...r].length?[{user:""}]:t;return{toPrompt:()=>n,args:void 0}}})();return new Ut(this,n,e,Pt(),void 0,void 0,void 0)}},wt=new dt(void 0);function yt(t){wt.apiKeys=Et(vt(t))}function mt(t){return new dt(Et(vt(t)))}function vt(t){return{promptGridApiKey:(()=>{let e="string"==typeof t?t:t.promptGridApiKey;return lt(e,tt(e).string().orUndefined(),{errorMessage:"Please provide a valid API key; got "+e})})(),apiKeys:"object"==typeof t&&null!==t?t.apiKeys:void 0}}function Et(t){let e=t.promptGridApiKey,r=t.apiKeys,n=void 0!==e?(async()=>{let t=await(async()=>{try{return await fetch(g()+"/handshake",{method:"POST",headers:{"Content-Type":"application/json","User-Agent":"promptgun",Authorization:"Bearer "+e}})}catch{throw Error("HTTP called failed when doing handshake")}})();if(200!==t.status){let e=await t.text();throw Error(`Handshake failed with status ${t.status}, body: ${e}`)}return await t.json()})():void 0;return{promptgrid:e,openai:(async()=>r?.openai??(await n)?.apiKeys.openai)()}}var At=new Map;function bt(t,e,r,n){if(void 0===wt)throw Error("No LLM set up. Call setupLLM first: ```import { setupPromptGun } from 'promptgun';\n\nsetupPromptGun({openAI: \"YOUR_OPENAI_API_KEY\"});\n```");return function(t,e,r,n,s){let i="object"!=typeof n&&(n??!1),o="object"==typeof n?n:s??{model:"gpt-4o"},a=u.Flux.fromGeneratorFunction((async function*(){console.log("args",JSON.stringify(e)),console.log("promptSupplier",""+r);let{model:n}=o,s=r(e);if("gpt-4o"!==n)throw new Rt(`Model ${n} not supported`);yield*await _t(t,n,s,i,void 0,void 0,void 0,Pt())}));if(!i)return a;let h=U.toJsonTokenFlux(a);return(new F).parse(h)}(wt,t,e,r,n)}function gt(t){let e=t??wt;if(void 0===e.apiKeys)throw Error("No LLM set up. Call setupPromptGun first: ```import { setupPromptGun } from 'promptgun';\n\nsetupPromptGun({openAI: \"YOUR_OPENAI_API_KEY\"});\n```");return new Tt(e,Pt())}var Tt=class{constructor(t,e){this.aiClient=t,this.callingCodeLine=e}completeChat(t,e){return new Ut(this.aiClient,t,e,Pt(),void 0,void 0,void 0)}},Ut=class{constructor(t,e,r,n,s,i,o){this.aiClient=t,this.promptSupplier=e,this.promptSupplierArgs=r,this.callingCodeLine=n,this.u=s,this.p=i,this.m=o;let a=this;this.generator=async function*(){yield*await _t(a.aiClient,o,a.promptSupplier(a.promptSupplierArgs),!1,a.promptName,s,i,n)}()}generator;promptName;name(t){return this.promptName=t,this}model(t){return this.m=t,this}temperature(t){return this.u=t,this}topP(t){return this.p=t,this}next(...[t]){return this.generator.next(t)}return(t){return this.generator.return(t)}throw(t){return this.generator.throw(t)}[Symbol.asyncIterator](){return this}async then(t,e){try{let e=await this.getResponseAsString();return D(t)?await t(e):e}catch(t){if(D(e))return await e(t);throw t}}async catch(t){try{return await this.getResponseAsString()}catch(e){if(D(t))return t(e);throw e}}async finally(t){try{return await this.getResponseAsString()}finally{t?.()}}get[Symbol.toStringTag](){return"BasicPrompt"}to(t){return new Nt(this.aiClient,this.promptSupplier,this.promptSupplierArgs,t,Pt(),this.promptName,this.u,this.p,this.m)}toJson(){return new Nt(this.aiClient,this.promptSupplier,this.promptSupplierArgs,void 0,Pt(),this.promptName,this.u,this.p,this.m)}async getResponseAsString(){let t="";for await(let e of this)t+=e;return t}},Nt=class extends I{constructor(t,e,r,n,s,i,o,a,h){let l=async function*(){yield*await _t(t,h,e(r),void 0===n||n(tt(void 0)),i,o,a,s)}(),c=u.Flux.fromGenerator(l),p=(new U).processDataBuffer(c);super(),this.aiClient=t,this.promptSupplier=e,this.promptSupplierArgs=r,this.jsonTypeSupplier=n,this.callingCodeLine=s,this.promptName=i,this.u=o,this.p=a,this.m=h;let f=this,d=(new F).parse(p);void 0!==n?d.onProperty("result",(t=>t.onEachExcerpt((t=>{void 0!==t.token&&this.push(t)})))):d.onEachExcerpt((t=>{void 0!==t.token&&this.push(t)})),this.stringGenerator=async function*(){for await(let t of p)void 0!==t.token?d.push(t):void 0!==t.source&&(yield t.source)}(),this.partialJsonGenerator=async function*(){let t="";for await(let e of f.stringGenerator){t+=e;let r=G(t);yield void 0!==n?r.result:r}}()}stringGenerator;partialJsonGenerator;next(...[t]){return this.partialJsonGenerator.next(t)}return(t){return this.partialJsonGenerator.return(t)}throw(t){return this.partialJsonGenerator.throw(t)}[Symbol.asyncIterator](){return this.partialJsonGenerator}async then(t,e){try{let e=await this.getResponse();return D(t)?await t(e):e}catch(t){if(D(e))return await e(t);throw t}}async catch(t){try{return await this.getResponse()}catch(e){if(D(t))return t(e);throw e}}async finally(t){try{return await this.getResponse()}finally{t?.()}}get[Symbol.toStringTag](){return"BasicPrompt"}name(t){return this.promptName=t,this}model(t){return this.m=t,this}temperature(t){return this.u=t,this}topP(t){return this.p=t,this}async getResponse(){let t=await this.getResponseAsString(),e=this.jsonTypeSupplier,r=$(t),n=void 0!==e?r?.result:r;return void 0===e?n:lt(n,e(tt(n)))}async getResponseAsString(){let t="";for await(let e of this.stringGenerator)t+=e;return t}};function Lt(t){return t??"gpt-4o"}async function*_t(t,e,r,n,s,i,o,a){let h=d(await t.apiKeys.openai).canBeString().andNothingElse({errorMessage:"No OpenAI access token set"}),l=function(t){let e=t=>({role:void 0!==t.user?"user":void 0!==t.system?"system":"assistant",content:Y(t.user??t.system??t.assistant)});return"string"==typeof t?[{role:"user",content:t}]:Array.isArray(t)?t.map(e):[e(t)]}(r),u=n?[...l,{role:"system",content:St(0,n)}]:l,{fileName:f,lineNumber:w}=a;if(f&&void 0!==w&&Array.from(At.keys()).filter((t=>t.startsWith(f+":"))).map((t=>parseInt(t.split(":")[1],10))).length>1&&!s)throw Error(`Multiple prompts found in ${f}. Please specify a name using .name() method.`);let y={id:s,callingCodeLine:a},m=X(),v=e=>{(async function(t,e){try{if(void 0===e)return;let r=await fetch(g()+"/api/conversations",{method:"PUT",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e},body:JSON.stringify(t)});if(!r.ok)throw Error(`Got ${r.status} when attempting to save conversation, with body: ${await r.text()}`)}catch(t){console.error("Error saving conversation",t)}})(e,t.apiKeys.promptgrid).then()};v({conversationUuid:m,prompt:y,messages:u.map((t=>({messageUuid:X(),role:t.role,content:t.content||""})))});let E=X();v({conversationUuid:m,prompt:y,messages:[{messageUuid:E,role:"assistant",content:""}]});let A=function({model:t,prompt:e,apiToken:r,temperature:n,topP:s,requireJsonResponse:i}){return c.Flux.fromGeneratorFunction((async function*(){let o=new AbortController,a=await fetch("https://api.openai.com/v1/chat/completions",{headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:"Bearer "+r},method:"POST",signal:o.signal,body:JSON.stringify({model:t,messages:e,stream:!0,temperature:n,top_p:s,response_format:i?{type:"json_object"}:void 0})});if(a.status<200||a.status>=300){let t=function(t){try{return JSON.parse(t).error.message}catch{return t}}(await a.text());throw Error("OpenAPI reported: "+t)}if(null===a.body)throw Error("illegal state");let h="";yield*c.Flux.fromReadableStream(a.body,(()=>o.abort())).map((t=>p.decode(t,{stream:!0}))).flatMap((t=>t.replaceAll("data: [DONE]","").replace(/^data: /,"").split("data: "))).map((t=>t.replace(/[\n ]*$/,"").trim())).flatMap((t=>{h+=t;try{let t=JSON.parse(h);return h="",[t]}catch{return console.error("Received partial json chunk: "+t),[]}})).map((t=>t.choices[0])).untilExcl((t=>null!=t.finish_reason)).map((t=>t.delta.content)).filter((t=>void 0!==t))}))}({model:Lt(e),prompt:u,apiToken:h,temperature:i,topP:o,requireJsonResponse:!1!==n}),b="";yield*A.doOnEach((t=>{b+=t,v({conversationUuid:m,prompt:y,messages:[{messageUuid:E,role:"assistant",content:b}]})}))}function St(t,e){{if(!0===e)return"Respond with JSON";let t=e;return"Respond with JSON matching the following type spec (note: everything is nonnullable unless explicitly stated otherwise):\n"+ut(new nt([],void 0).object((e=>e.has("result",(()=>new ht(t.type,t.value))))))}}var xt=class extends Error{},Rt=class extends Error{};function Pt(){let t=(Error().stack??"").split("\n").map((t=>t.trim())).filter((t=>t.startsWith("at ")))[2],e=t.match(/[^(]+\([^)]+\)/),{functionName:r,fileName:n,lineNumber:s}=e?t.match("at (?<functionName>[^(]*) ((?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+))").groups:t.match("at (?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)").groups;return{stacktraceFrame:d(t).canBeString().andNothingElse(),fileName:d(n).canBeString().andNothingElse(),lineNumber:d(parseInt(s)).canBeNumber().andNothingElse(),functionName:d(r).canBeString().canBeUndefined().andNothingElse()}}export{dt as AIClient,Ut as BasicPrompt,at as EmptyPropTypeSpec,nt as EmptyTypeSpec,ht as FullPropTypeSpec,st as FullTypeSpec,Nt as JsonPrompt,Rt as ModelNotSupportedError,xt as NoAiCredientialsError,Tt as PromptBase,ot as PropTypeSpec,I as StreamedJsonChildElement,M as StreamedJsonRootElement,it as TypeMemberSpec,rt as TypeSpec,wt as ai,Pt as getCallerFileNameAndLineNumber,mt as newAIClient,Et as obtainAiClientData,gt as promptAI,bt as promptLLM,yt as setupAI};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"{\"version\":3,\"names\":[\"Flux\",\"_Flux\",\"generator\",\"upstream\",\"handleCancel\",\"_closed\",\"constructor\",\"thiss\",\"this\",\"async\",\"e\",\"ignorableValue\",\"Symbol\",\"asyncIterator\",\"next\",\"args\",\"value\",\"return\",\"throw\",\"cancel\",\"closed\",\"then\",\"onfulfilled\",\"onrejected\",\"result\",\"asList\",\"onfinally\",\"promise\",\"toStringTag\",\"subscribe\",\"callback\",\"flux\",\"doOnEach\",\"recur\",\"done\",\"catch\",\"err\",\"console\",\"error\",\"unsubscribe\",\"filter\",\"predicate\",\"constructFromGeneratorFunction\",\"untilExcl\",\"doAfterLast\",\"events\",\"push\",\"map\",\"mapper\",\"take\",\"n\",\"i\",\"flatMap\",\"Array\",\"isArray\",\"r\",\"transform\",\"defineGenerator\",\"definedGenerator\",\"reduce\",\"reducer\",\"initialValue\",\"reduction\",\"whenComplete\",\"ignored\",\"create\",\"creator\",\"values\",\"resolvers\",\"isDone\",\"complete\",\"length\",\"shift\",\"resolve\",\"Error\",\"fromGenerator\",\"Promise\",\"reject\",\"fromArray\",\"array\",\"fromGeneratorFunction\",\"fn\",\"fromReadableStream\",\"stream\",\"reader\",\"getReader\",\"excerpt\",\"read\",\"exports\",\"L\",\"Ce\",\"D\",\"Object\",\"defineProperty\",\"Flux_1\",\"Ne\",\"enumerable\",\"get\",\"import_monoflux\",\"G\",\"textDecoder\",\"TextDecoder\",\"ComplexTypeError\",\"data\",\"httpStatus\",\"problems\",\"message\",\"problem\",\"expectedProp\",\"path\",\"replace\",\"expectedType\",\"typeToString\",\"join\",\"insteadGot\",\"unknownProp\",\"super\",\"JSON\",\"stringify\",\"requireThat\",\"TypeSpec\",\"checkIsOneOf\",\"types\",\"opts\",\"problemsPerType\",\"type\",\"ignoreUnknownProps\",\"elementType\",\"key\",\"props\",\"prop\",\"optional\",\"typeAccountingOptionality\",\"Number\",\"isNaN\",\"checkIs\",\"some\",\"list\",\"typeProblemsOnThisPath\",\"t\",\"promptGridApiUrl\",\"_TypeSpec\",\"canBeArray\",\"assertTypeOfArray\",\"elementSpec\",\"arraySpec\",\"canBeObject\",\"assertTypeOfObject\",\"objectSpec\",\"hasString\",\"propertyName\",\"hasProperty\",\"canBeString\",\"canHaveProperty\",\"assertTypeOfProperty\",\"old\",\"propertyType\",\"canBeNumber\",\"canBeBoolean\",\"canBeConstant\",\"canBeNull\",\"canBeUndefined\",\"andNothingElse\",\"errorMessage\",\"orDefaultTo\",\"describe\",\"indentLevel\",\"keys\",\"indent\",\"depth\",\"config\",\"getPromptGridApiUrl\",\"rawValue\",\"url\",\"url2\",\"backendUrlNotTriviallyIdentifiableInMinifiedCode\",\"Token\",\"source\",\"fieldName\",\"maybeIncomplete\",\"JsonTokenProcessor\",\"_JsonTokenProcessor\",\"jsonBuffer\",\"highestOffsetParsed\",\"toJsonTokenFlux\",\"dataBufferFlux\",\"processDataBuffer\",\"deltaContentFlux\",\"content\",\"getExcerpts\",\"token\",\"excerpts\",\"jsonParser\",\"JsonParser\",\"nextToken\",\"currentTokenLocation\",\"getCharOffset\",\"position\",\"currentTokenType\",\"parentFieldName\",\"currentValue\",\"startPosition\",\"test\",\"positionAfterSucceedingCommaIfPresent\",\"tempPos\",\"substring\",\"char\",\"startPos\",\"endPos\",\"indexOf\",\"nextFourChars\",\"nextFiveChars\",\"numStr\",\"hasDecimal\",\"parseFloat\",\"parseInt\",\"mayBeIncomplete\",\"JsonParseException\",\"name\",\"StreamedJsonElement\",\"receivedJson\",\"propertyCallbacks\",\"Map\",\"onElementCallbacks\",\"Set\",\"onCompleteCallbacks\",\"onEachExcerptCallbacks\",\"currentToken\",\"state\",\"Begin\",\"receivedExcerpts\",\"onElement\",\"add\",\"onProperty\",\"has\",\"set\",\"onJsonStringProperty\",\"processor\",\"stringBuffer\",\"jsonElement\",\"StreamedJsonChildElement\",\"onEachExcerpt\",\"jsonStringExcerpt\",\"allData\",\"excerptWithHoleEscapeTokens\",\"endsOnUnevenNumberOfBackslashes\",\"unescapedExcerptWithoutOpeningQuote\",\"unescapedExcerptWithoutClosingQuote\",\"forEach\",\"onComplete\",\"_onComplete\",\"toAsync\",\"expectedTokenType\",\"consumer\",\"onCompleteAsync\",\"onCompleteAs\",\"onCompleteAsAsync\",\"jsonStringValue\",\"deserializedValue\",\"parse\",\"onCompleteAsString\",\"onCompleteAsStringAsync\",\"onCompleteAsInt\",\"onCompleteAsIntAsync\",\"onCompleteAsNumber\",\"onCompleteAsNumberAsync\",\"onCompleteAsBoolean\",\"onCompleteAsBooleanAsync\",\"asJsonFlux\",\"ye\",\"whenCompleteAs\",\"isState\",\"InNested\",\"child\",\"tokenType\",\"size\",\"InObject\",\"InArray\",\"end\",\"UnexpectedTokenException\",\"resultingJson\",\"InPropertyValue\",\"InArrayElement\",\"subscription\",\"completeValue\",\"from\",\"stateClass\",\"count\",\"State\",\"StreamedJsonRootElement\",\"jsonTokenFlux\",\"Ue\",\"lastTokenExcerpt\",\"StreamedJsonParser\",\"parsePartialJson\",\"partialJson\",\"trim\",\"opened\",\"escaped\",\"pushScope\",\"scope\",\"popScope\",\"expect\",\"lastOpened\",\"includes\",\"pop\",\"illegalState\",\"nextEscapedValue\",\"match\",\"closeEverything\",\"reverse\",\"opener\",\"completedJson\",\"nonNullish\",\"requireDefined\",\"byteToHex\",\"toString\",\"slice\",\"randomFillSync\",\"rnds8Pool\",\"Uint8Array\",\"poolPtr\",\"randomUUID\",\"native_default\",\"v4_default\",\"options\",\"buf\",\"offset\",\"rnds\",\"random\",\"rng\",\"RangeError\",\"arr\",\"toLowerCase\",\"unsafeStringify\",\"specType\",\"EmptyTypeSpec\",\"_\",\"_EmptyTypeSpec\",\"element\",\"FullTypeSpec\",\"object\",\"properties\",\"TypeMemberSpec\",\"string\",\"number\",\"boolean\",\"constant\",\"otherValues\",\"FullPropTypeSpec\",\"undefined\",\"_FullTypeSpec\",\"orArray\",\"orObject\",\"orString\",\"orNumber\",\"orBoolean\",\"orConstant\",\"orNull\",\"orUndefined\",\"_TypeMemberSpec\",\"mayHave\",\"hint\",\"canHaveString\",\"canHaveNumber\",\"canHaveBoolean\",\"canHaveConstant\",\"firstConstant\",\"otherConstants\",\"arg3\",\"arg4\",\"comment\",\"propertyTypeSpec\",\"EmptyPropTypeSpec\",\"commentsFromPropTypeSpec\",\"_comments\",\"comments\",\"hasNumber\",\"hasBoolean\",\"hasConstant\",\"arg2\",\"otherArgs\",\"constants\",\"PropTypeSpec\",\"withComment\",\"_FullPropTypeSpec\",\"assertType\",\"typeSpec\",\"describeType\",\"propSpec\",\"comma\",\"AIClient\",\"apiKeys\",\"chat\",\"arg1\",\"toPrompt\",\"effectiveMessages\",\"user\",\"BasicPrompt\",\"getCallerFileNameAndLineNumber\",\"ai\",\"setupAI\",\"arg\",\"obtainAiClientData\",\"effectivePromptGunConfig\",\"newAIClient\",\"promptGridApiKey\",\"raw\",\"handshakeData\",\"response\",\"fetch\",\"method\",\"headers\",\"Authorization\",\"status\",\"body\",\"text\",\"json\",\"promptgrid\",\"openai\",\"promptMappings\",\"promptLLM\",\"aiClient\",\"model\",\"Ee\",\"log\",\"prompt\",\"ModelNotSupportedError\",\"executeLlmCall\",\"doPromptLLM\",\"promptAI\",\"client\",\"effectiveClient\",\"PromptBase\",\"callingCodeLine\",\"completeChat\",\"promptSupplier\",\"promptSupplierArgs\",\"_temperature\",\"_topP\",\"_model\",\"self\",\"promptName\",\"temperature\",\"topP\",\"getResponseAsString\",\"to\",\"JsonPrompt\",\"toJson\",\"chunk\",\"jsonTypeSupplier\",\"streamingJsonRootElement\",\"stringGenerator\",\"jsonExcerpt\",\"partialJsonGenerator\",\"accumulatedJson\",\"getResponse\",\"stringResult\",\"uncheckedPackedResult\",\"uncheckedResult\",\"pickModel\",\"modelId\",\"apiToken\",\"genericPrompt\",\"toOpenAiMessage\",\"msg\",\"role\",\"system\",\"assistant\",\"toGenericPrompt\",\"genericPromptWithJsonSpec\",\"jsonSpec\",\"fileName\",\"promptFilename\",\"lineNumber\",\"promptLineNumber\",\"startsWith\",\"split\",\"promptProfile\",\"id\",\"conversationUuid\",\"saveConv\",\"conversationData\",\"apiKey\",\"ok\",\"saveConversation\",\"messages\",\"messageUuid\",\"responseMessageId\",\"requireJsonResponse\",\"ie\",\"abortController\",\"AbortController\",\"Accept\",\"signal\",\"top_p\",\"response_format\",\"bodyText\",\"abort\",\"decode\",\"replaceAll\",\"choices\",\"choice\",\"finish_reason\",\"delta\",\"segment\",\"promptOpenai\",\"accumulatedContent\",\"o\",\"NoAiCredientialsError\",\"frame\",\"stack\",\"l\",\"hasFunctionNameInFrameWithFileNameInParenthesis\",\"functionName\",\"groups\",\"stacktraceFrame\",\"ee\",\"ne\",\"X\",\"S\",\"m\",\"h\",\"re\",\"Ae\",\"Fe\",\"ve\",\"K\",\"A\",\"I\",\"P\",\"te\",\"R\",\"pn\",\"Ie\",\"cn\",\"un\",\"an\"],\"sources\":[\"../node_modules/monoflux/src/Flux.ts\",\"../node_modules/monoflux/src/index.ts\",\"../src/index.ts\",\"../src/ai-inference/openai/promptOpenai.ts\",\"../src/require-that/requireThat.ts\",\"../src/env-vars.ts\",\"../src/json-streaming/types.ts\",\"../src/json-streaming/JsonTokenProcessor.ts\",\"../src/json-streaming/StreamedJsonElement.ts\",\"../src/json-streaming/StreamedJsonRootElement.ts\",\"../src/json-streaming/StreamedJsonParser.ts\",\"../src/parse-partial-json/parsePartialJson.ts\",\"../src/util/nonNullish.ts\",\"../src/util/requireDefined.ts\",\"../node_modules/uuid/dist/esm/stringify.js\",\"../node_modules/uuid/dist/esm/rng.js\",\"../node_modules/uuid/dist/esm/native.js\",\"../node_modules/uuid/dist/esm/v4.js\",\"../src/type-spec/type-spec.ts\"],\"sourcesContent\":[null,null,\"import {Flux} from 'monoflux'\\nimport {AiModelId} from './ai-inference/AiModelId.js'\\nimport {GenericPrompt, PromptMessage} from './ai-inference/model.js'\\nimport {promptOpenai} from './ai-inference/openai/promptOpenai.js'\\nimport {getPromptGridApiUrl} from './env-vars.js'\\nimport {JsonTokenProcessor} from './json-streaming/JsonTokenProcessor.js'\\nimport {StreamedJsonChildElement} from './json-streaming/StreamedJsonElement.js'\\nimport {StreamedJsonParser} from './json-streaming/StreamedJsonParser.js'\\nimport {StreamedJsonRootElement} from './json-streaming/StreamedJsonRootElement.js'\\nimport {parsePartialJson} from './parse-partial-json/parsePartialJson.js'\\nimport {nonNullish} from './util/nonNullish.js'\\nimport {requireDefined} from './util/requireDefined.js'\\nimport {randomUuid} from './util/randomUuid.ts'\\nimport {assertType, describeType, EmptyTypeSpec, FullPropTypeSpec, specType, TypeSpec} from './type-spec/type-spec.js'\\nimport {requireThat} from './require-that/requireThat.js'\\n\\ntype SystemMessage = {system: string, user?: undefined, assistant?: undefined}\\ntype UserMessage = {system?: undefined, user: string, assistant?: undefined}\\ntype AssistantMessage = {system?: undefined, user?: undefined, assistant: string}\\n\\ntype Message = SystemMessage | UserMessage | AssistantMessage\\n\\ntype Prompt = string | Message | Message[]\\n\\ntype ApiKeys = {\\n\\topenai?: string | undefined\\n}\\n\\ntype Opts = {\\n\\tmodel?: 'gpt-4o'\\n}\\n\\ntype HandshakeData = {\\n\\tapiKeys: ApiKeys\\n\\twithinQuotum: boolean\\n}\\n\\nclass AIClient {\\n\\tconstructor(\\n\\t\\tprivate apiKeys: {\\n\\t\\t\\tpromptgrid: string | undefined\\n\\t\\t\\topenai: Promise<string | undefined>\\n\\t\\t} | undefined,\\n\\t) {}\\n\\n\\tchat<T extends undefined>(userMessage: string): BasicPrompt<T>\\n\\tchat<T extends undefined>(...messages: Message[]): BasicPrompt<T>\\n\\tchat<T extends undefined>(messages: Message[]): BasicPrompt<T>\\n\\tchat<T extends undefined>(toPrompt: (args?: T) => Prompt): BasicPrompt<T>\\n\\tchat<T>(toPrompt: (args: T) => Prompt, args: T): BasicPrompt<T>\\n\\tchat<T = undefined>(toPrompt: (args?: T) => Prompt, args?: T): BasicPrompt<T>\\n\\tchat<T = undefined>(\\n\\t\\targ1: Message | Message[] | ((args?: T) => Prompt) | string,\\n\\t\\targ2?: Message | T,\\n\\t\\t...arg3: Message[]\\n\\t): BasicPrompt<T> {\\n\\t\\tconst {\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targs,\\n\\t\\t} = (() => {\\n\\t\\t\\tif (typeof arg1 === 'function') {\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: arg1,\\n\\t\\t\\t\\t\\targs: arg2,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (typeof arg1 === 'string') {\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => arg1,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (Array.isArray(arg1)) {\\n\\t\\t\\t\\tconst effectiveMessages = arg1.length === 0\\n\\t\\t\\t\\t\\t? [{user: ''}]\\n\\t\\t\\t\\t\\t: arg1\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => effectiveMessages,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tconst messages: Message[] = [\\n\\t\\t\\t\\t\\targ1,\\n\\t\\t\\t\\t\\t...(arg2 !== undefined ? [arg2 as Message] : []),\\n\\t\\t\\t\\t\\t...arg3,\\n\\t\\t\\t\\t]\\n\\t\\t\\t\\tconst effectiveMessages = messages.length === 0\\n\\t\\t\\t\\t\\t? [{user: ''}]\\n\\t\\t\\t\\t\\t: arg1\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => effectiveMessages,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\treturn new BasicPrompt<T>(\\n\\t\\t\\tthis,\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targ2 as T,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t)\\n\\t}\\n\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, opts?: Opts): Flux<string>\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json: true, opts?: Opts): StreamedJsonRootElement\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json?: boolean, opts?: Opts): Flux<string> | StreamedJsonRootElement\\n\\t// promptLLM<T>(\\n\\t// \\targs: T,\\n\\t// \\ttoPrompt: (args: T) => Prompt,\\n\\t// \\targ3?: boolean | Opts,\\n\\t// \\targ4?: Opts,\\n\\t// ): Flux<string> | StreamedJsonRootElement {\\n\\t// \\treturn doPromptLLM(this, args, toPrompt, arg3, arg4)\\n\\t// }\\n}\\n\\nexport let ai = new AIClient(undefined);\\n\\nexport type PromptGunConfig = {\\n\\tpromptGridApiKey?: string\\n\\tapiKeys?: ApiKeys\\n}\\n\\nexport function setupAI(arg: string | PromptGunConfig) {\\n\\tai['apiKeys'] = obtainAiClientData(\\n\\t\\teffectivePromptGunConfig(\\n\\t\\t\\targ\\n\\t\\t)\\n\\t)\\n}\\n\\nexport function newAIClient(promptGridApiKey: string): AIClient\\nexport function newAIClient(config: PromptGunConfig): AIClient\\nexport function newAIClient(arg: string | PromptGunConfig): AIClient {\\n\\treturn new AIClient(\\n\\t\\tobtainAiClientData(\\n\\t\\t\\teffectivePromptGunConfig(arg)\\n\\t\\t)\\n\\t)\\n}\\n\\nfunction effectivePromptGunConfig(arg: string | PromptGunConfig): PromptGunConfig {\\n\\treturn {\\n\\t\\tpromptGridApiKey: (() => {\\n\\t\\t\\tconst raw = typeof arg === 'string' ? arg : arg.promptGridApiKey\\n\\t\\t\\treturn assertType(\\n\\t\\t\\t\\traw,\\n\\t\\t\\t\\tspecType(raw)\\n\\t\\t\\t\\t\\t.string()\\n\\t\\t\\t\\t\\t.orUndefined(),\\n\\t\\t\\t\\t{errorMessage: `Please provide a valid API key; got ${raw}`}\\n\\t\\t\\t)\\n\\t\\t})(),\\n\\t\\tapiKeys: typeof arg === 'object' && arg !== null ? arg.apiKeys : undefined\\n\\t}\\n}\\n\\nexport function obtainAiClientData(config: PromptGunConfig) {\\n\\tconst promptGridApiKey = config.promptGridApiKey\\n\\tconst apiKeys = config.apiKeys\\n\\tconst handshakeData = promptGridApiKey !== undefined ? (async () => {\\n\\t\\tconst response = await (async () => {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\treturn await fetch(\\n\\t\\t\\t\\t\\t`${getPromptGridApiUrl()}/handshake`,\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tmethod: 'POST',\\n\\t\\t\\t\\t\\t\\theaders: {\\n\\t\\t\\t\\t\\t\\t\\t'Content-Type': 'application/json',\\n\\t\\t\\t\\t\\t\\t\\t'User-Agent': 'promptgun',\\n\\t\\t\\t\\t\\t\\t\\t'Authorization': `Bearer ${promptGridApiKey}`,\\n\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t)\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\tthrow new Error('HTTP called failed when doing handshake')\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\tif (response.status !== 200) {\\n\\t\\t\\tconst body = await response.text()\\n\\t\\t\\tthrow new Error(`Handshake failed with status ${response.status}, body: ${body}`)\\n\\t\\t}\\n\\t\\treturn await response.json() as HandshakeData\\n\\t})() : undefined\\n\\n\\treturn {\\n\\t\\tpromptgrid: promptGridApiKey,\\n\\t\\topenai: (async () => apiKeys?.openai ?? (await handshakeData)?.apiKeys.openai)()\\n\\t}\\n}\\n\\n// Create a map to store resolved prompt UUIDs\\nconst promptMappings = new Map<string, string>();\\n\\n// Function to generate a key for the promptMappings map\\nfunction createPromptMappingKey(filename: string, lineNumber: number): string {\\n\\treturn `${filename}:${lineNumber}`;\\n}\\n\\n// Function to safely generate the key, handling undefined values\\nfunction safeCreateMappingKey(filename: string | undefined, lineNumber: number | undefined): string | null {\\n\\tif (filename && lineNumber !== undefined) {\\n\\t\\treturn createPromptMappingKey(filename, lineNumber);\\n\\t}\\n\\treturn null;\\n}\\n\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt): Flux<string>\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json: true): StreamedJsonRootElement\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json?: boolean): Flux<string> | StreamedJsonRootElement\\nexport function promptLLM<T>(\\n\\targs: T,\\n\\ttoPrompt: (args: T) => Prompt,\\n\\targ3?: boolean | Opts,\\n\\targ4?: Opts,\\n): Flux<string> | StreamedJsonRootElement {\\n\\tif (ai === undefined) {\\n\\t\\tthrow new Error('No LLM set up. Call setupLLM first: ```import { setupPromptGun } from \\\\'promptgun\\\\';\\\\n\\\\nsetupPromptGun({openAI: \\\"YOUR_OPENAI_API_KEY\\\"});\\\\n```')\\n\\t}\\n\\treturn doPromptLLM(ai, args, toPrompt, arg3, arg4)\\n}\\n\\nexport function promptAI(client?: AIClient): PromptBase {\\n\\tconst effectiveClient = client ?? ai\\n\\tif (effectiveClient['apiKeys'] === undefined) {\\n\\t\\tthrow new Error('No LLM set up. Call setupPromptGun first: ```import { setupPromptGun } from \\\\'promptgun\\\\';\\\\n\\\\nsetupPromptGun({openAI: \\\"YOUR_OPENAI_API_KEY\\\"});\\\\n```')\\n\\t}\\n\\treturn new PromptBase(effectiveClient, getCallerFileNameAndLineNumber())\\n}\\n\\nclass PromptBase {\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t) {}\\n\\n\\tcompleteChat<T extends undefined>(toPrompt: (args?: T) => Prompt): BasicPrompt<T>\\n\\tcompleteChat<T>(toPrompt: (args: T) => Prompt, args: T): BasicPrompt<T>\\n\\tcompleteChat<T = undefined>(toPrompt: (args?: T) => Prompt, args?: T): BasicPrompt<T>\\n\\tcompleteChat<T = undefined>(\\n\\t\\ttoPrompt: (args?: T) => Prompt,\\n\\t\\targs?: T,\\n\\t): BasicPrompt<T> {\\n\\t\\treturn new BasicPrompt<T>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targs as T,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t)\\n\\t}\\n}\\n\\nclass BasicPrompt<PSArgs> implements AsyncGenerator<string>, Promise<string> {\\n\\tprivate readonly generator: AsyncGenerator<string>\\n\\tprivate promptName?: string;\\n\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate promptSupplier: (args: PSArgs) => Prompt,\\n\\t\\tprivate promptSupplierArgs: PSArgs,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t\\tprivate _temperature: number | undefined,\\n\\t\\tprivate _topP: number | undefined,\\n\\t\\tprivate _model: AiModelId | undefined,\\n\\t) {\\n\\t\\tconst self = this;\\n\\t\\tthis.generator = (async function* () {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\tself.aiClient,\\n\\t\\t\\t\\t_model,\\n\\t\\t\\t\\tself.promptSupplier(self.promptSupplierArgs),\\n\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\tself.promptName,\\n\\t\\t\\t\\t_temperature,\\n\\t\\t\\t\\t_topP,\\n\\t\\t\\t\\tcallingCodeLine,\\n\\t\\t\\t)\\n\\t\\t})()\\n\\t}\\n\\n\\tpublic name(name: string): this {\\n\\t\\tthis.promptName = name;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tpublic model(model: AiModelId): this {\\n\\t\\tthis._model = model;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * What sampling temperature to use, between 0 and 2.\\n\\t * Higher values like 0.8 will make the output more random,\\n\\t * while lower values like 0.2 will make it more focused\\n\\t * and deterministic.\\n\\t * We generally recommend altering this or <b>topP</b> but not both.\\n\\t */\\n\\tpublic temperature(temperature: number): this {\\n\\t\\tthis._temperature = temperature;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * An alternative to sampling with temperature, called nucleus\\n\\t * sampling, where the model considers the results of the\\n\\t * tokens with top_p probability mass.\\n\\t * So 0.1 means only the tokens comprising the top 10%\\n\\t * probability mass are considered.\\n\\t *\\n\\t * We generally recommend altering this or <b>temperature</b>\\n\\t * but not both.\\n\\t */\\n\\tpublic topP(topP: number): this {\\n\\t\\tthis._topP = topP;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t// Methods for the generator interface\\n\\n\\tnext(...[value]: [] | [any]): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.next(value)\\n\\t}\\n\\n\\treturn(value: any): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.return(value)\\n\\t}\\n\\n\\tthrow(e: any): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.throw(e)\\n\\t}\\n\\n\\t[Symbol.asyncIterator](): AsyncGenerator<string, any, any> {\\n\\t\\treturn this\\n\\t}\\n\\n\\t// Methods for the Promise interface\\n\\n\\tasync then<TResult1 = string, TResult2 = never>(\\n\\t\\tonfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null | undefined,\\n\\t\\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined\\n\\t): Promise<TResult1 | TResult2> {\\n\\t\\ttry {\\n\\t\\t\\tconst result = await this.getResponseAsString()\\n\\t\\t\\treturn nonNullish(onfulfilled)\\n\\t\\t\\t\\t? await onfulfilled(result)\\n\\t\\t\\t\\t: result as TResult1\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn await onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync catch<TResult = never>(\\n\\t\\tonrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined\\n\\t): Promise<string | TResult> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponseAsString()\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync finally(onfinally?: (() => void) | null | undefined): Promise<string> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponseAsString()\\n\\t\\t} finally {\\n\\t\\t\\tonfinally?.()\\n\\t\\t}\\n\\t}\\n\\n\\tget [Symbol.toStringTag](): string {\\n\\t\\treturn 'BasicPrompt'\\n\\t}\\n\\n\\t// Other methods\\n\\tpublic to<Json extends AnyJson = AnyJson>(type: (value: EmptyTypeSpec<unknown>) => TypeSpec<Json>) {\\n\\t\\treturn new JsonPrompt<PSArgs, Json>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\tthis.promptSupplier,\\n\\t\\t\\tthis.promptSupplierArgs,\\n\\t\\t\\ttype,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tthis.promptName,\\n\\t\\t\\tthis._temperature,\\n\\t\\t\\tthis._topP,\\n\\t\\t\\tthis._model,\\n\\t\\t)\\n\\t}\\n\\n\\tpublic toJson() {\\n\\t\\treturn new JsonPrompt<PSArgs, AnyJson>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\tthis.promptSupplier,\\n\\t\\t\\tthis.promptSupplierArgs,\\n\\t\\t\\tundefined,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tthis.promptName,\\n\\t\\t\\tthis._temperature,\\n\\t\\t\\tthis._topP,\\n\\t\\t\\tthis._model,\\n\\t\\t)\\n\\t}\\n\\n\\tprivate async getResponseAsString(): Promise<string> {\\n\\t\\tlet result = ''\\n\\t\\tfor await (const chunk of this) {\\n\\t\\t\\tresult += chunk\\n\\t\\t}\\n\\t\\treturn result\\n\\t}\\n}\\n\\ntype JsonObject = {[key: string]: AnyJson}\\n\\ntype JsonArray = AnyJson[]\\n\\ntype AnyJson = string | null | boolean | number | JsonArray | JsonObject\\n\\nclass JsonPrompt<PSArgs, Json extends AnyJson = AnyJson> extends StreamedJsonChildElement implements AsyncGenerator<AnyJson>, Promise<Json> {\\n\\tprivate readonly stringGenerator: AsyncGenerator<string>\\n\\tprivate readonly partialJsonGenerator: AsyncGenerator<AnyJson>\\n\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate promptSupplier: (args: PSArgs) => Prompt,\\n\\t\\tprivate promptSupplierArgs: PSArgs,\\n\\t\\tprivate jsonTypeSupplier: ((value: EmptyTypeSpec<unknown>) => TypeSpec<Json>) | undefined,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t\\tprivate promptName: string | undefined,\\n\\t\\tprivate _temperature: number | undefined,\\n\\t\\tprivate _topP: number | undefined,\\n\\t\\tprivate _model: AiModelId | undefined,\\n\\t) {\\n\\t\\tconst generator = (async function*() {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\taiClient,\\n\\t\\t\\t\\t_model,\\n\\t\\t\\t\\tpromptSupplier(promptSupplierArgs),\\n\\t\\t\\t\\tjsonTypeSupplier !== undefined\\n\\t\\t\\t\\t\\t? jsonTypeSupplier(specType(undefined as unknown))\\n\\t\\t\\t\\t\\t: true,\\n\\t\\t\\t\\tpromptName,\\n\\t\\t\\t\\t_temperature,\\n\\t\\t\\t\\t_topP,\\n\\t\\t\\t\\tcallingCodeLine,\\n\\t\\t\\t)\\n\\t\\t})()\\n\\t\\tconst flux = Flux.fromGenerator(generator)\\n\\t\\tconst jsonTokenFlux = new JsonTokenProcessor().processDataBuffer(flux)\\n\\t\\tsuper()\\n\\t\\tconst thiss = this\\n\\t\\tconst streamingJsonRootElement = new StreamedJsonParser().parse(jsonTokenFlux)\\n\\t\\tif (jsonTypeSupplier !== undefined) {\\n\\t\\t\\tstreamingJsonRootElement\\n\\t\\t\\t\\t.onProperty(\\\"result\\\", result => result\\n\\t\\t\\t\\t\\t.onEachExcerpt(e => {\\n\\t\\t\\t\\t\\t\\tif (e.token !== undefined) {\\n\\t\\t\\t\\t\\t\\t\\tthis.push(e)\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t)\\n\\t\\t} else {\\n\\t\\t\\tstreamingJsonRootElement\\n\\t\\t\\t\\t.onEachExcerpt(e => {\\n\\t\\t\\t\\t\\tif (e.token !== undefined) {\\n\\t\\t\\t\\t\\t\\tthis.push(e)\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t}\\n\\t\\tthis.stringGenerator = (async function*() {\\n\\t\\t\\tfor await (const jsonExcerpt of jsonTokenFlux) {\\n\\t\\t\\t\\tif (jsonExcerpt.token !== undefined) {\\n\\t\\t\\t\\t\\tstreamingJsonRootElement.push(jsonExcerpt)\\n\\t\\t\\t\\t} else if (jsonExcerpt.source !== undefined) {\\n\\t\\t\\t\\t\\tyield jsonExcerpt.source\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\tthis.partialJsonGenerator = (async function*() {\\n\\t\\t\\tlet accumulatedJson = ''\\n\\t\\t\\tfor await (const chunk of thiss.stringGenerator) {\\n\\t\\t\\t\\taccumulatedJson += chunk\\n\\t\\t\\t\\tconst partialJson = parsePartialJson<any>(accumulatedJson)\\n\\t\\t\\t\\tyield jsonTypeSupplier !== undefined\\n\\t\\t\\t\\t\\t? (partialJson as any)['result']\\n\\t\\t\\t\\t\\t: partialJson\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t}\\n\\n\\t// Methods for the generator interface\\n\\n\\tnext(...[value]: [] | [any]): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.next(value)\\n\\t}\\n\\n\\treturn(value: any): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.return(value)\\n\\t}\\n\\n\\tthrow(e: any): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.throw(e)\\n\\t}\\n\\n\\t[Symbol.asyncIterator](): AsyncGenerator<AnyJson, any, any> {\\n\\t\\treturn this.partialJsonGenerator\\n\\t}\\n\\n\\t// Methods for the Promise interface\\n\\n\\tasync then<TResult1 = Json, TResult2 = never>(\\n\\t\\tonfulfilled?: ((value: Json) => TResult1 | PromiseLike<TResult1>) | null | undefined,\\n\\t\\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined\\n\\t): Promise<TResult1 | TResult2> {\\n\\t\\ttry {\\n\\t\\t\\tconst result = await this.getResponse()\\n\\t\\t\\treturn nonNullish(onfulfilled)\\n\\t\\t\\t\\t? await onfulfilled(result)\\n\\t\\t\\t\\t: result as unknown as TResult1\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn await onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync catch<TResult = never>(\\n\\t\\tonrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined\\n\\t): Promise<Json | TResult> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponse()\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync finally(onfinally?: (() => void) | null | undefined): Promise<Json> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponse()\\n\\t\\t} finally {\\n\\t\\t\\tonfinally?.()\\n\\t\\t}\\n\\t}\\n\\n\\tget [Symbol.toStringTag](): string {\\n\\t\\treturn 'BasicPrompt'\\n\\t}\\n\\n\\t// Other methods\\n\\n\\tpublic name(name: string): this {\\n\\t\\tthis.promptName = name;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tpublic model(model: AiModelId): this {\\n\\t\\tthis._model = model;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * What sampling temperature to use, between 0 and 2.\\n\\t * Higher values like 0.8 will make the output more random,\\n\\t * while lower values like 0.2 will make it more focused\\n\\t * and deterministic.\\n\\t * We generally recommend altering this or <b>topP</b> but not both.\\n\\t */\\n\\tpublic temperature(temperature: number): this {\\n\\t\\tthis._temperature = temperature;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * An alternative to sampling with temperature, called nucleus\\n\\t * sampling, where the model considers the results of the\\n\\t * tokens with top_p probability mass.\\n\\t * So 0.1 means only the tokens comprising the top 10%\\n\\t * probability mass are considered.\\n\\t *\\n\\t * We generally recommend altering this or <b>temperature</b>\\n\\t * but not both.\\n\\t */\\n\\tpublic topP(topP: number): this {\\n\\t\\tthis._topP = topP;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tprivate async getResponse(): Promise<Json> {\\n\\t\\tconst stringResult = await this.getResponseAsString()\\n\\t\\tconst jsonTypeSupplier = this.jsonTypeSupplier\\n\\t\\tconst uncheckedPackedResult = JSON.parse(stringResult)\\n\\t\\tconst uncheckedResult = jsonTypeSupplier !== undefined\\n\\t\\t\\t? uncheckedPackedResult?.result\\n\\t\\t\\t: uncheckedPackedResult\\n\\t\\tif (jsonTypeSupplier === undefined) {\\n\\t\\t\\treturn uncheckedResult as Json\\n\\t\\t}\\n\\t\\treturn assertType(\\n\\t\\t\\tuncheckedResult,\\n\\t\\t\\tjsonTypeSupplier(specType(uncheckedResult))\\n\\t\\t)\\n\\t}\\n\\n\\tprivate async getResponseAsString(): Promise<string> {\\n\\t\\tlet result = ''\\n\\t\\tfor await (const chunk of this.stringGenerator) {\\n\\t\\t\\tresult += chunk\\n\\t\\t}\\n\\t\\treturn result\\n\\t}\\n}\\n\\nfunction pickModel(modelId?: AiModelId): AiModelId {\\n\\treturn modelId ?? 'gpt-4o'\\n}\\n\\nfunction toGenericPrompt(prompt: string | Message | Message[]): GenericPrompt {\\n\\tconst toOpenAiMessage = (msg: Message): PromptMessage => ({\\n\\t\\trole: msg.user !== undefined ? 'user' : (msg.system !== undefined ? 'system' : 'assistant'),\\n\\t\\tcontent: requireDefined(msg.user ?? msg.system ?? msg.assistant),\\n\\t})\\n\\tif (typeof prompt === 'string') {\\n\\t\\treturn [{role: 'user' as const, content: prompt}]\\n\\t} else if (!Array.isArray(prompt)) {\\n\\t\\treturn [toOpenAiMessage(prompt)]\\n\\t} else {\\n\\t\\treturn prompt.map(toOpenAiMessage)\\n\\t}\\n}\\n\\nasync function* executeLlmCall(\\n\\taiClient: AIClient,\\n\\tmodel: AiModelId | undefined,\\n\\tprompt: Prompt,\\n\\tjson: boolean | TypeSpec<any>,\\n\\tpromptName: string | undefined,\\n\\ttemperature: number | undefined,\\n\\ttopP: number | undefined,\\n\\tcallingCodeLine: CodeLine,\\n) {\\n\\tconst apiToken = requireThat(await aiClient['apiKeys']!.openai).canBeString().andNothingElse({errorMessage: 'No OpenAI access token set'})\\n\\tconst genericPrompt = toGenericPrompt(prompt)\\n\\tconst genericPromptWithJsonSpec = (() => {\\n\\t\\tif (!json) {\\n\\t\\t\\treturn genericPrompt\\n\\t\\t}\\n\\t\\treturn [\\n\\t\\t\\t...genericPrompt,\\n\\t\\t\\t{\\n\\t\\t\\t\\trole: 'system' as const,\\n\\t\\t\\t\\tcontent: jsonSpec(model, json)\\n\\t\\t\\t}\\n\\t\\t]\\n\\t})()\\n\\n\\t// Find the relevant call in the stack trace (we need to skip internal calls)\\n\\t// Typically this would be the first line after the executeLlmCall and other internal functions\\n\\tconst {\\n\\t\\tfileName: promptFilename,\\n\\t\\tlineNumber: promptLineNumber,\\n\\t} = callingCodeLine\\n\\n\\t// Check if multiple promptLineNumbers exist for this filename\\n\\tif (promptFilename && promptLineNumber !== undefined) {\\n\\t\\tconst matchingPrompts = Array.from(promptMappings.keys())\\n\\t\\t\\t.filter(key => key.startsWith(`${promptFilename}:`))\\n\\t\\t\\t.map(key => parseInt(key.split(':')![1]!, 10));\\n\\n\\t\\t// If there are multiple prompts for the same file, throw an error\\n\\t\\tif (matchingPrompts.length > 1 && !promptName) {\\n\\t\\t\\tthrow new Error(`Multiple prompts found in ${promptFilename}. Please specify a name using .name() method.`);\\n\\t\\t}\\n\\t}\\n\\n\\tconst promptProfile = {id: promptName, callingCodeLine}\\n\\n\\t// Create a unique conversation ID\\n\\tconst conversationUuid = randomUuid()\\n\\n\\tconst saveConv = (conversationData: ConversationData) => {\\n\\t\\tsaveConversation(\\n\\t\\t\\tconversationData,\\n\\t\\t\\taiClient['apiKeys']!.promptgrid\\n\\t\\t).then()\\n\\t}\\n\\n\\t// Send the conversation start and messages to PromptGrid\\n\\tsaveConv({\\n\\t\\tconversationUuid,\\n\\t\\tprompt: promptProfile,\\n\\t\\tmessages: genericPromptWithJsonSpec\\n\\t\\t\\t.map(message => ({\\n\\t\\t\\t\\tmessageUuid: randomUuid(),\\n\\t\\t\\t\\trole: message.role,\\n\\t\\t\\t\\tcontent: message.content || \\\"\\\"\\n\\t\\t\\t})),\\n\\t});\\n\\n\\t// Now add an 'assistant' message that will be updated as the response streams in\\n\\tconst responseMessageId = randomUuid()\\n\\tsaveConv({\\n\\t\\tconversationUuid: conversationUuid,\\n\\t\\tprompt: promptProfile,\\n\\t\\tmessages: [\\n\\t\\t\\t{\\n\\t\\t\\t\\tmessageUuid: responseMessageId,\\n\\t\\t\\t\\trole: 'assistant',\\n\\t\\t\\t\\tcontent: '' // Start with empty content that will be updated\\n\\t\\t\\t}\\n\\t\\t]\\n\\t});\\n\\n\\t// Get the response stream\\n\\tconst flux = promptOpenai(\\n\\t\\t{\\n\\t\\t\\tmodel: pickModel(model),\\n\\t\\t\\tprompt: genericPromptWithJsonSpec,\\n\\t\\t\\tapiToken,\\n\\t\\t\\ttemperature,\\n\\t\\t\\ttopP,\\n\\t\\t\\trequireJsonResponse: json !== false\\n\\t\\t}\\n\\t)\\n\\n\\t// Accumulate the response for sending updates\\n\\tlet accumulatedContent = \\\"\\\";\\n\\n\\tyield* flux\\n\\t\\t.doOnEach(chunk => {\\n\\t\\t\\t// Update the accumulated response\\n\\t\\t\\taccumulatedContent += chunk\\n\\n\\t\\t\\t// Send the updated content to PromptGrid\\n\\t\\t\\tsaveConv({\\n\\t\\t\\t\\tconversationUuid,\\n\\t\\t\\t\\tprompt: promptProfile,\\n\\t\\t\\t\\tmessages: [{\\n\\t\\t\\t\\t\\tmessageUuid: responseMessageId,\\n\\t\\t\\t\\t\\trole: 'assistant',\\n\\t\\t\\t\\t\\tcontent: accumulatedContent,\\n\\t\\t\\t\\t}]\\n\\t\\t\\t})\\n\\t\\t})\\n}\\n\\nfunction jsonSpec(\\n\\tmodel: AiModelId | undefined,\\n\\tjson: true | TypeSpec<any>,\\n): string {\\n\\tswitch (model) {\\n\\t\\tdefault: {\\n\\t\\t\\tif (json === true) {\\n\\t\\t\\t\\treturn 'Respond with JSON'\\n\\t\\t\\t}\\n\\t\\t\\tconst propSpec = (json as TypeSpec<any>)\\n\\t\\t\\tconst jsonInPrompt = new EmptyTypeSpec([], undefined as unknown)\\n\\t\\t\\t\\t.object(o => o\\n\\t\\t\\t\\t\\t.has('result', () => new FullPropTypeSpec(propSpec['type'], propSpec['value']))\\n\\t\\t\\t\\t)\\n\\t\\t\\treturn `Respond with JSON matching the following type spec (note: everything is nonnullable unless explicitly stated otherwise):\\\\n${describeType(jsonInPrompt)}`\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction doPromptLLM<T>(\\n\\taiClient: AIClient,\\n\\targs: T,\\n\\ttoPrompt: (args: T) => Prompt,\\n\\targ3?: boolean | Opts,\\n\\targ4?: Opts,\\n): Flux<string> | StreamedJsonRootElement {\\n\\tconst json = typeof arg3 === 'object' ? false : (arg3 ?? false)\\n\\tconst opts = typeof arg3 === 'object' ? arg3 : (arg4 ?? {model: 'gpt-4o'})\\n\\tconst flux = Flux.fromGeneratorFunction(async function* () {\\n\\t\\tconsole.log('args', JSON.stringify(args))\\n\\t\\tconsole.log('promptSupplier', toPrompt.toString())\\n\\t\\tconst {model} = opts\\n\\t\\tconst prompt = toPrompt(args)\\n\\t\\tif (model === 'gpt-4o') {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\taiClient,\\n\\t\\t\\t\\tmodel,\\n\\t\\t\\t\\tprompt,\\n\\t\\t\\t\\tjson,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\t)\\n\\t\\t} else {\\n\\t\\t\\tthrow new ModelNotSupportedError(`Model ${model} not supported`)\\n\\t\\t}\\n\\t})\\n\\tif (!json) {\\n\\t\\treturn flux\\n\\t}\\n\\tconst jsonTokenFlux = JsonTokenProcessor.toJsonTokenFlux(flux)\\n\\treturn new StreamedJsonParser().parse(jsonTokenFlux)\\n}\\n\\nexport class NoAiCredientialsError extends Error {}\\n\\nexport class ModelNotSupportedError extends Error {}\\n\\nexport type { JsonExcerpt } from './json-streaming/JsonExcerpt.js'\\nexport type { StreamedJsonElement } from './json-streaming/StreamedJsonElement.js'\\nexport type { Token, TokenType } from './json-streaming/types.js'\\nexport {\\n\\tBaseType,\\n\\tTypeType,\\n\\tNullType,\\n\\tBooleanType,\\n\\tStringType,\\n\\tNumberType,\\n\\tObjectType,\\n\\tArrayType,\\n\\tConstantType,\\n\\tEmptyTypeSpec,\\n\\tTypeSpec,\\n\\tFullTypeSpec,\\n\\tCombine,\\n\\tTypeMemberSpec,\\n\\tFullPropTypeSpec,\\n\\tType,\\n\\tEmptyPropTypeSpec,\\n\\tPropTypeSpec,\\n\\tUndefinedType,\\n} from './type-spec/type-spec.js'\\nexport { AIClient, BasicPrompt, JsonPrompt, PromptBase, StreamedJsonChildElement, StreamedJsonRootElement }\\nexport type { ApiKeys as AccessTokens, AnyJson, AssistantMessage, HandshakeData, JsonArray, JsonObject, Message, Opts, Prompt, SystemMessage, UserMessage }\\nexport { AiModelId } from './ai-inference/AiModelId.js'\\n\\nexport type CodeLine = {\\n\\tstacktraceFrame: string\\n\\tfileName: string\\n\\tlineNumber: number\\n\\tfunctionName?: string\\n}\\n\\nexport function getCallerFileNameAndLineNumber(): CodeLine {\\n\\tconst error = new Error()\\n\\tconst stacktrace = error.stack ?? ''\\n\\tconst stack = stacktrace\\n\\t\\t.split('\\\\n')\\n\\t\\t.map(l => l.trim())\\n\\t\\t.filter(l => l.startsWith('at '))\\n\\tconst frame = stack[2]!\\n\\tconst hasFunctionNameInFrameWithFileNameInParenthesis = frame.match(/[^(]+\\\\([^)]+\\\\)/)\\n\\tconst {\\n\\t\\tfunctionName,\\n\\t\\tfileName,\\n\\t\\tlineNumber,\\n\\t} = hasFunctionNameInFrameWithFileNameInParenthesis\\n\\t\\t? frame.match('at (?<functionName>[^(]*) \\\\((?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)\\\\)')!.groups!\\n\\t\\t: frame.match('at (?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)')!.groups!\\n\\treturn {\\n\\t\\tstacktraceFrame: requireThat(frame).canBeString().andNothingElse(),\\n\\t\\tfileName: requireThat(fileName).canBeString().andNothingElse(),\\n\\t\\tlineNumber: requireThat(parseInt(lineNumber!)).canBeNumber().andNothingElse(),\\n\\t\\tfunctionName: requireThat(functionName).canBeString().canBeUndefined().andNothingElse(),\\n\\t}\\n}\\n\\n// Define a type for conversation data\\ninterface ConversationData {\\n\\tconversationUuid: string\\n\\tprompt: {\\n\\t\\tid: string | undefined\\n\\t\\tcallingCodeLine: CodeLine\\n\\t}\\n\\tmessages: Array<{\\n\\t\\tmessageUuid: string\\n\\t\\trole: string\\n\\t\\tcontent: string\\n\\t}>\\n}\\n\\n// Function to save conversation using HTTP PUT\\nasync function saveConversation(\\n\\tconversationData: ConversationData,\\n\\tapiKey: string | undefined,\\n) {\\n\\ttry {\\n\\t\\tif (apiKey === undefined) {\\n\\t\\t\\treturn\\n\\t\\t}\\n\\t\\tconst response = await fetch(`${getPromptGridApiUrl()}/api/conversations`, {\\n\\t\\t\\tmethod: 'PUT',\\n\\t\\t\\theaders: {\\n\\t\\t\\t\\t'Content-Type': 'application/json',\\n\\t\\t\\t\\t'Authorization': `Bearer ${apiKey}`\\n\\t\\t\\t},\\n\\t\\t\\tbody: JSON.stringify(conversationData),\\n\\t\\t});\\n\\n\\t\\tif (!response.ok) {\\n\\t\\t\\tthrow new Error(`Got ${response.status} when attempting to save conversation, with body: ${await response.text()}`);\\n\\t\\t}\\n\\t} catch (error) {\\n\\t\\tconsole.error('Error saving conversation', error);\\n\\t}\\n}\\n\\n\",\"import {PlatformSpecificPromptRequest} from '../model.js'\\nimport {Flux} from 'monoflux'\\n\\nfunction errorMessage(bodyText: string) {\\n try {\\n const body = JSON.parse(bodyText) as {error: {message: string}}\\n return body.error.message\\n } catch (e) {\\n return bodyText\\n }\\n}\\n\\nexport function promptOpenai(\\n {\\n model,\\n prompt,\\n apiToken,\\n temperature,\\n topP,\\n requireJsonResponse,\\n }: PlatformSpecificPromptRequest<boolean>\\n): Flux<string> {\\n return Flux.fromGeneratorFunction(async function* () {\\n const abortController = new AbortController()\\n const response = await fetch(\\n `https://api.openai.com/v1/chat/completions`,\\n {\\n headers: {\\n 'Content-Type': 'application/json',\\n 'Accept': 'application/json',\\n 'Authorization': `Bearer ${apiToken}`\\n },\\n method: 'POST',\\n signal: abortController.signal,\\n body: JSON.stringify({\\n model,\\n messages: prompt,\\n stream: true,\\n temperature,\\n top_p: topP,\\n response_format: requireJsonResponse ? {\\n type: 'json_object'\\n } : undefined,\\n } satisfies OpenAiRequestBody),\\n }\\n )\\n if (response.status < 200 || response.status >= 300) {\\n const message = errorMessage(await response.text())\\n throw new Error(`OpenAPI reported: ${message}`)\\n }\\n if (response.body === null) {\\n throw new Error('illegal state')\\n }\\n let jsonBuffer = ''\\n yield* Flux\\n .fromReadableStream(response.body, () => abortController.abort())\\n .map(value => textDecoder.decode(value, {stream: true}))\\n .flatMap(value =>\\n value\\n .replaceAll('data: [DONE]', '')\\n .replace(/^data: / , '')\\n .split('data: ')\\n )\\n .map(\\n value => value\\n .replace(/[\\\\n ]*$/, '')\\n .trim()\\n )\\n .flatMap(value => {\\n jsonBuffer += value\\n try {\\n const json = JSON.parse(jsonBuffer) as ChatCompletionChunk\\n jsonBuffer = ''\\n return [json]\\n } catch (e) {\\n console.error(`Received partial json chunk: ${value}`)\\n return [] as ChatCompletionChunk[]\\n }\\n })\\n .map(chunk => chunk.choices[0]!)\\n .untilExcl(choice => choice.finish_reason !== null && choice.finish_reason !== undefined)\\n .map(choice => choice.delta.content)\\n .filter<string>(segment => segment !== undefined)\\n })\\n}\\n\\nconst textDecoder = new TextDecoder()\\n\\ntype OpenAiRequestBody = {\\n model: 'gpt-4o' | 'o3'\\n messages: {\\n role: 'developer' | 'system' | 'user' | 'assistant' | 'tool'\\n content: string | string[]\\n }[]\\n stream: boolean\\n temperature?: number\\n top_p?: number\\n response_format?: {\\n type: 'json_object' | 'text'\\n }\\n}\\n\\ntype ChatCompletionChunk = {\\n id: string\\n choices: {\\n id: number\\n delta: {\\n refusal?: string\\n content?: string\\n role?: string\\n }\\n finish_reason?: string\\n }[]\\n}\\n\",\"export type Combine<Current, New> = unknown extends Current\\n ? New\\n : (Current & New) extends never\\n ? Current | New\\n : (Current & New)\\n\\ntype Simplify<T> = {\\n [K in keyof T]: Simplify<T[K]>\\n}\\n\\nexport type Opts = {\\n ignoreUnknownProps?: boolean\\n logValueIfWrong?: boolean\\n errorMessage?: string\\n}\\n\\ntype Problem = {\\n path: string\\n expectedType?: Type[]\\n expectedProp?: string\\n value: unknown\\n unknownProp?: string\\n}\\n\\nclass ComplexTypeError extends Error {\\n public readonly data: any\\n public readonly httpStatus = 400\\n\\n constructor(problems: Problem[], message?: string) {\\n const data = problems\\n .map(problem => {\\n if (problem.expectedProp) {\\n return {\\n expectedProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.expectedProp\\n }\\n } else if (problem.expectedType) {\\n return {\\n expectedType: problem.expectedType.map(typeToString).join(' | '),\\n path: problem.path,\\n insteadGot: problem.value\\n }\\n } else if (problem.unknownProp) {\\n return {\\n unknownProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.unknownProp\\n }\\n } else {\\n throw new Error('illegal state')\\n }\\n })\\n super(message ?? `Value is of the wrong format: ${JSON.stringify(data, null, 2)}`)\\n this.data = data\\n }\\n}\\n\\n/**\\n * Way to assert the shape of a type both in runtime and in the\\n * type system.\\n *\\n * Usage example:\\n *\\n * ```typescript\\n * const inputValue = ['foo', 'bar'] as unknown\\n *\\n * assert(\\n * inputValue,\\n * t => t\\n * .canBeArray(t => t\\n * .canBeObject(t => t\\n * .canHaveString('foo')\\n * .canHaveString('bar')\\n * )\\n * )\\n * )\\n *\\n * let safeInputvalue = inputValue\\n *\\n * safeInputvalue = [{}] // typescript disapproves\\n * safeInputvalue = [{foo: 'bla', bar: 'bla'}] // typescript approves\\n * ```\\n */\\nexport function requireThat(\\n value: unknown\\n): TypeSpec<unknown> {\\n return new TypeSpec<unknown>([], value)\\n}\\n\\nfunction checkIsOneOf(value: unknown, types: Type[], path: string, opts: Opts): Problem[] {\\n const problemsPerType = types\\n .map(type => checkIs(value, type, path, opts))\\n if (problemsPerType.some(list => list.length === 0)) {\\n return []\\n } else {\\n const typeProblemsOnThisPath = problemsPerType\\n .flatMap(list => list.filter(t => t.expectedType !== undefined && t.path === path))\\n if (typeProblemsOnThisPath.length > 0) {\\n return [{\\n expectedType: typeProblemsOnThisPath\\n .flatMap(problem => problem.expectedType!),\\n path,\\n value\\n }]\\n }\\n return problemsPerType.flatMap(list => list)\\n }\\n}\\n\\nfunction checkIs(value: unknown, type: Type, path: string, opts: Opts): Problem[] {\\n const {ignoreUnknownProps = true} = opts\\n switch (type.type) {\\n case 'array': {\\n if (!Array.isArray(value)) {\\n return [{expectedType: [type], path, value}]\\n }\\n if (value.length === 0) {\\n return []\\n }\\n return checkIsOneOf(value[0], type.elementType, path + '[..]', opts)\\n }\\n case 'boolean': {\\n if (typeof value !== 'boolean') {\\n return [{expectedType: [type], path, value}]\\n }\\n return []\\n }\\n case 'undefined': {\\n return value === undefined\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'object': {\\n if (typeof value !== 'object' || value === null) {\\n return [{expectedType: [type], path, value}]\\n }\\n const problems: Problem[] = []\\n for (const key in type.props) {\\n const prop = type.props[key]!\\n if (!(key in value)) {\\n if (!prop.optional) {\\n problems.push({expectedProp: key, path, value})\\n }\\n continue\\n }\\n const typeAccountingOptionality: Type[] = prop.optional\\n ? [...prop.type, {type: 'undefined'}]\\n : prop.type\\n problems.push(...checkIsOneOf(value[key as keyof typeof value], typeAccountingOptionality, path + `.${key}`, opts))\\n }\\n if (!ignoreUnknownProps) {\\n for (const key in value) {\\n if (!(key in type.props)) {\\n problems.push({unknownProp: key, path, value})\\n }\\n }\\n }\\n return problems\\n }\\n case 'string': {\\n return typeof value === 'string'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'null': {\\n return value === null\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'number': {\\n return typeof value === 'number'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'constant': {\\n return value === type.value && !Number.isNaN(value)\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n }\\n}\\n\\nexport class TypeSpec<T> {\\n public readonly type: Type[]\\n private readonly value: unknown\\n\\n constructor(type: Type[] = [], value: unknown) {\\n this.type = type\\n this.value = value\\n }\\n\\n canBeArray<T_arr = unknown>(assertTypeOfArray: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = assertTypeOfArray(new TypeSpec<unknown>([], this.value))\\n const arraySpec = new TypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec.type}],\\n this.value\\n )\\n return new TypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec.type], this.value)\\n }\\n\\n canBeObject<T_obj extends {}>(assertTypeOfObject: (arg: TypeSpec<{}>) => TypeSpec<T_obj>) {\\n const objectSpec = assertTypeOfObject(new TypeSpec([{type: 'object', props: {}}], this.value))\\n return new TypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec.type], this.value)\\n }\\n\\n hasString<Key extends string>(propertyName: Key): TypeSpec<Combine<T, Record<Key, string>>> {\\n return this.hasProperty(\\n propertyName,\\n type => type.canBeString()\\n )\\n }\\n\\n canHaveProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop | undefined>\\n ): TypeSpec<Combine<T, Partial<Record<Key, T_prop>>>> {\\n return this.hasProperty(propertyName, assertTypeOfProperty, true)\\n }\\n\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional: false\\n ): TypeSpec<Combine<T, Partial<Record<Key, T_prop>>>>\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional?: boolean\\n ): TypeSpec<Combine<T, Record<Key, T_prop>>>\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional = false\\n ): TypeSpec<Combine<T, Record<Key, T_prop> | Partial<Record<Key, T_prop>>>> {\\n const old = this.type.length === 1\\n ? this.type[0]!\\n : undefined\\n if (old === undefined || old.type !== 'object') {\\n throw new Error('illegal state')\\n }\\n const {type: propertyType} = assertTypeOfProperty(new TypeSpec([], this.value))\\n return new TypeSpec<Combine<T, Record<Key, T_prop>>>([{\\n ...old,\\n props: {\\n ...old.props,\\n [propertyName]: {\\n optional,\\n type: propertyType\\n }\\n }\\n }], this.value)\\n }\\n\\n canBeString() {\\n return new TypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n canBeNumber() {\\n return new TypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n canBeBoolean() {\\n return new TypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n canBeConstant<Value extends (string | number | boolean)>(value: Value) {\\n return new TypeSpec<Combine<T, Value>>([...this.type, {type: 'constant', value}], this.value)\\n }\\n\\n canBeNull(): TypeSpec<Combine<T, null>> {\\n return new TypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n canBeUndefined(): TypeSpec<Combine<T, undefined>> {\\n return new TypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n\\n public andNothingElse(\\n opts: Opts = {}\\n ): T {\\n const problems = checkIsOneOf(this.value, this.type, 'root', opts)\\n if (problems.length > 0) {\\n throw new ComplexTypeError(problems, opts.errorMessage)\\n }\\n return this.value as T\\n }\\n\\n public orDefaultTo<Value>(\\n value: Value,\\n opts: Opts = {}\\n ): T | Value {\\n const problems = checkIsOneOf(this.value, this.type, 'root', opts)\\n if (problems.length > 0) {\\n return value\\n }\\n return this.value as T\\n }\\n\\n public describe(): string {\\n return describe(this.type)\\n }\\n}\\n\\nfunction describe(type: Type | Type[], indentLevel = 0): string {\\n if (Array.isArray(type)) {\\n return type.map(t => describe(t, indentLevel)).join(' | ')\\n }\\n switch (type.type) {\\n case 'array': {\\n return `${describe(type.elementType, indentLevel)}[]`\\n }\\n case 'boolean': {\\n return 'boolean'\\n }\\n case 'undefined': {\\n return 'undefined'\\n }\\n case 'object': {\\n return `{\\\\n`\\n +\\n Object.keys(type.props).map(\\n key => `${indent(indentLevel + 1)}${key}: ${describe(type.props[key]!.type, indentLevel + 1)}`\\n ).join(',\\\\n')\\n + `\\\\n${indent(indentLevel)}}`\\n }\\n case 'string': {\\n return 'string'\\n }\\n case 'null': {\\n return 'null'\\n }\\n case 'number': {\\n return 'number'\\n }\\n case 'constant': {\\n return `\\\"${type.value}\\\"`\\n }\\n }\\n}\\n\\nfunction indent(depth: number) {\\n let indent = ''\\n for (let i = 0; i < depth; i++) {\\n indent += ' '\\n }\\n return indent\\n}\\n\\nexport type TypeType = 'undefined' | 'null' | 'boolean' | 'string' | 'number' | 'object' | 'array' | 'constant'\\n\\nexport type BaseType<TT extends TypeType> = {\\n type: TT\\n}\\n\\nexport type UndefinedType = BaseType<'undefined'>\\nexport type NullType = BaseType<'null'>\\nexport type BooleanType = BaseType<'boolean'>\\nexport type StringType = BaseType<'string'>\\nexport type NumberType = BaseType<'number'>\\nexport type ObjectType = BaseType<'object'> & {\\n props: Record<string, {\\n optional: boolean\\n type: Type[]\\n }>\\n}\\nexport type ArrayType = BaseType<'array'> & {\\n elementType: Type[]\\n}\\nexport type ConstantType<Value extends (string | number | boolean)> = BaseType<'constant'> & {\\n value: Value\\n}\\n\\nexport type Type =\\n UndefinedType\\n | NullType\\n | BooleanType\\n | StringType\\n | NumberType\\n | ObjectType\\n | ArrayType\\n | ConstantType<any>\\n\\nfunction typeToString(type: Type) {\\n return type.type === 'constant'\\n ? `'${type.value}'`\\n : type.type\\n}\\n\",\"import { requireThat } from \\\"./require-that/requireThat.js\\\";\\nimport {config} from 'dotenv'\\n\\nlet promptGridApiKey: string;\\nexport function getPromptGridApiKey() {\\n if (!promptGridApiKey) {\\n config()\\n const rawValue = process.env['PROMPTGRID_API_KEY']\\n promptGridApiKey = requireThat(rawValue)\\n .canBeString()\\n .andNothingElse({errorMessage: `PromptGrid API key invalid: ${rawValue}`})\\n }\\n return promptGridApiKey;\\n}\\n\\nlet promptGridApiUrl: string;\\n\\nexport function getPromptGridApiUrl() {\\n if (!promptGridApiUrl) {\\n config()\\n let url = backendUrlNotTriviallyIdentifiableInMinifiedCode()\\n const rawValue = process.env['PROMPTGRID_API_URL'] ?? url\\n promptGridApiUrl = requireThat(rawValue)\\n .canBeString()\\n .andNothingElse({errorMessage: `PromptGrid API URL invalid: ${rawValue}`})\\n }\\n return promptGridApiUrl;\\n}\\n\\n/**\\n * @returns https://api.promptgrid.ai\\n */\\nfunction backendUrlNotTriviallyIdentifiableInMinifiedCode() {\\n let url = 't'\\n url = url + 'ps'\\n url = 'ht' + url\\n url = url + ':'\\n url = url + '/'\\n url = url + '/ap'\\n url = url + 'i.pr'\\n let url2 = 'i'\\n url2 = 'd.a' + url2\\n url2 = 'gri' + url2\\n url = url + 'ompt'\\n return url + url2\\n}\\n\",\"export enum TokenType {\\n START_OBJECT = 'START_OBJECT',\\n END_OBJECT = 'END_OBJECT',\\n START_ARRAY = 'START_ARRAY',\\n END_ARRAY = 'END_ARRAY',\\n FIELD_NAME = 'FIELD_NAME',\\n VALUE_STRING = 'VALUE_STRING',\\n VALUE_NUMBER_INT = 'VALUE_NUMBER_INT',\\n VALUE_NUMBER_FLOAT = 'VALUE_NUMBER_FLOAT',\\n VALUE_TRUE = 'VALUE_TRUE',\\n VALUE_FALSE = 'VALUE_FALSE',\\n VALUE_NULL = 'VALUE_NULL',\\n}\\n\\nexport class Token {\\n constructor(\\n public type: TokenType,\\n public source: string,\\n public value?: string | number,\\n public fieldName?: string,\\n public maybeIncomplete: boolean = false\\n ) {}\\n}\\n\",\"import {Token, TokenType} from './types.js'\\nimport {JsonExcerpt} from './JsonExcerpt.js'\\nimport {Flux} from 'monoflux'\\n\\n\\nexport class JsonTokenProcessor {\\n private jsonBuffer: string = ''\\n private highestOffsetParsed: number = -1\\n\\n public static toJsonTokenFlux(\\n dataBufferFlux: Flux<string>\\n ): Flux<JsonExcerpt> {\\n return new JsonTokenProcessor().processDataBuffer(dataBufferFlux)\\n }\\n\\n public processDataBuffer(deltaContentFlux: Flux<string>): Flux<JsonExcerpt> {\\n return deltaContentFlux.flatMap(content => this.getExcerpts(content))\\n }\\n\\n public getExcerpts(source: string): JsonExcerpt[] {\\n this.jsonBuffer += source\\n\\n const excerpts: JsonExcerpt[] = []\\n\\n const jsonParser = new JsonParser(this.jsonBuffer)\\n\\n let token: Token | undefined\\n while ((token = this.nextToken(jsonParser))) {\\n if (jsonParser.currentTokenLocation().getCharOffset() > this.highestOffsetParsed) {\\n excerpts.push({token})\\n this.highestOffsetParsed = jsonParser\\n .currentTokenLocation()\\n .getCharOffset()\\n }\\n }\\n\\n excerpts.push({source})\\n\\n return excerpts\\n }\\n\\n private nextToken(jsonParser: JsonParser): Token | undefined {\\n const result = jsonParser.nextToken()\\n return typeof result !== 'string' ? result : undefined\\n }\\n}\\n\\nclass JsonParser {\\n private position: number = 0\\n private currentTokenType: TokenType | undefined\\n private parentFieldName: string | undefined\\n private currentValue: any = null\\n\\n constructor(private readonly content: string) {}\\n\\n nextToken(): Token | 'token-incomplete' | 'string-ended' {\\n const startPosition = this.position\\n\\n if (this.position >= this.content.length) {\\n return 'string-ended'\\n }\\n\\n // Skip whitespace\\n while (\\n this.position < this.content.length &&\\n /\\\\s/.test(this.content[this.position]!)\\n ) {\\n this.position++\\n }\\n\\n if (this.position >= this.content.length) {\\n return 'string-ended'\\n }\\n\\n const positionAfterSucceedingCommaIfPresent = (position: number) => {\\n let tempPos = position\\n while (tempPos < this.content.length && /\\\\s/.test(this.content[tempPos]!)) {\\n tempPos++\\n }\\n return this.content[tempPos] === ','\\n ? tempPos + 1\\n : undefined\\n }\\n\\n const source = (position: number) =>\\n this.content.substring(startPosition, position)\\n\\n const char = this.content[this.position]!\\n\\n switch (char) {\\n case '{':\\n this.position++\\n this.currentTokenType = TokenType.START_OBJECT\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n undefined,\\n this.parentFieldName,\\n )\\n case '}': {\\n this.position++\\n this.currentTokenType = TokenType.END_OBJECT\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n this.parentFieldName = undefined\\n return token\\n }\\n case '[':\\n this.position++\\n this.currentTokenType = TokenType.START_ARRAY\\n return new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n case ']': {\\n this.position++\\n this.currentTokenType = TokenType.END_ARRAY\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n this.parentFieldName = undefined\\n return token\\n }\\n case '\\\"':\\n // Parse string\\n let startPos = ++this.position\\n let endPos = this.content.indexOf('\\\"', startPos)\\n while (endPos > 0 && this.content[endPos - 1] === '\\\\\\\\') {\\n endPos = this.content.indexOf('\\\"', endPos + 1)\\n }\\n\\n if (endPos === -1) {\\n return 'token-incomplete'\\n }\\n\\n const value = this.content.substring(startPos, endPos)\\n this.position = endPos + 1\\n\\n // Check if this is a field name (followed by colon)\\n let tempPos = this.position\\n while (\\n tempPos < this.content.length &&\\n /\\\\s/.test(this.content[tempPos]!)\\n ) {\\n tempPos++\\n }\\n\\n this.currentTokenType =\\n tempPos < this.content.length && this.content[tempPos] === ':'\\n ? TokenType.FIELD_NAME\\n : TokenType.VALUE_STRING\\n\\n if (this.currentTokenType === TokenType.FIELD_NAME) {\\n this.position = tempPos + 1\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(\\n this.currentTokenType,\\n source(this.position),\\n value,\\n undefined\\n )\\n this.parentFieldName = value\\n return token\\n } else {\\n this.currentValue = value\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(\\n this.currentTokenType,\\n source(this.position),\\n value,\\n this.currentTokenType === TokenType.VALUE_STRING\\n ? this.parentFieldName\\n : undefined\\n )\\n this.parentFieldName = undefined;\\n return token\\n }\\n case 't': {\\n const nextFourChars = this.content.substring(\\n this.position,\\n this.position + 4\\n )\\n if (nextFourChars === 'true') {\\n this.position += 4\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_TRUE\\n this.currentValue = true\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFourChars.length < 4) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n case 'f': {\\n const nextFiveChars = this.content.substring(\\n this.position,\\n this.position + 5\\n )\\n if (nextFiveChars === 'false') {\\n this.position += 5\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_FALSE\\n this.currentValue = false\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFiveChars.length < 5) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n case 'n': {\\n const nextFourChars = this.content.substring(\\n this.position,\\n this.position + 4\\n )\\n if (nextFourChars === 'null') {\\n this.position += 4\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_NULL\\n this.currentValue = null\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFourChars.length < 4) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n default:\\n if (/[0-9-]/.test(char)) {\\n // Parse number\\n let numStr = ''\\n let hasDecimal = false\\n\\n while (\\n this.position < this.content.length &&\\n (/[0-9]/.test(this.content[this.position]!) ||\\n this.content[this.position] === '-' ||\\n this.content[this.position] === '.' ||\\n this.content[this.position] === 'e' ||\\n this.content[this.position] === 'E' ||\\n this.content[this.position] === '+')\\n ) {\\n if (this.content[this.position] === '.') {\\n hasDecimal = true\\n }\\n numStr += this.content[this.position++]\\n }\\n\\n if (hasDecimal) {\\n this.currentTokenType = TokenType.VALUE_NUMBER_FLOAT\\n this.currentValue = parseFloat(numStr)\\n } else {\\n this.currentTokenType = TokenType.VALUE_NUMBER_INT\\n this.currentValue = parseInt(numStr, 10)\\n }\\n const mayBeIncomplete = this.position >= this.content.length\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName,\\n // cannot tell from number itself whether the number token is incomplete\\n mayBeIncomplete\\n )\\n }\\n }\\n\\n throw new JsonParseException('Invalid JSON at position ' + this.position)\\n }\\n\\n currentTokenLocation(): { getCharOffset: () => number } {\\n return {\\n getCharOffset: () => this.position\\n }\\n }\\n}\\n\\nclass JsonParseException extends Error {\\n constructor(message: string) {\\n super(message)\\n this.name = 'JsonParseException'\\n }\\n}\\n\",\"import {Token, TokenType} from './types.js';\\nimport {JsonExcerpt} from './JsonExcerpt.js';\\nimport {Flux} from \\\"monoflux\\\";\\n\\ntype MultiMap<K, V> = Map<K, V[]>;\\nexport type Consumer<T> = (value: T) => void;\\n\\ninterface CompletetionSubscription {\\n consumer: (value: any) => (void | Promise<void>);\\n expectedTokenType?: Set<TokenType> | undefined;\\n}\\n\\nexport abstract class StreamedJsonElement {\\n protected readonly receivedJson: string[] = [];\\n private readonly propertyCallbacks: MultiMap<string, (value: StreamedJsonElement) => void> = new Map();\\n private onElementCallbacks: Set<(value: StreamedJsonElement) => void> = new Set();\\n private onCompleteCallbacks: Set<CompletetionSubscription> = new Set();\\n private onEachExcerptCallbacks: Set<(value: JsonExcerpt) => void> = new Set();\\n private currentToken?: Token;\\n private state: State = new Begin();\\n private receivedExcerpts: JsonExcerpt[] = [];\\n\\n public onElement(callback: (value: StreamedJsonElement) => void): this {\\n this.onElementCallbacks.add(callback);\\n return this;\\n }\\n\\n public onProperty(propertyName: string, callback: (element: StreamedJsonElement) => void): this {\\n if (!this.propertyCallbacks.has(propertyName)) {\\n this.propertyCallbacks.set(propertyName, []);\\n }\\n this.propertyCallbacks.get(propertyName)!.push(callback);\\n return this;\\n }\\n\\n /**\\n * @deprecated Does not work right now because FIELD_NAME\\n * token comes after string value is already streaming\\n */\\n public onJsonStringProperty(propertyName: string, callback: (element :StreamedJsonElement) => void): this {\\n if (!this.propertyCallbacks.has(propertyName)) {\\n this.propertyCallbacks.set(propertyName, []);\\n }\\n\\n this.propertyCallbacks.get(propertyName)!.push(content => {\\n const processor = new JsonTokenProcessor();\\n let seenFirst = false;\\n const stringBuffer: string[] = [];\\n const jsonElement = new StreamedJsonChildElement();\\n\\n content.onEachExcerpt(jsonStringExcerpt => {\\n if (jsonStringExcerpt.source !== undefined) {\\n stringBuffer.push(jsonStringExcerpt.source);\\n }\\n const allData = stringBuffer.join('');\\n const excerptWithHoleEscapeTokens = this.endsOnUnevenNumberOfBackslashes(allData)\\n ? allData.substring(0, allData.length - 1)\\n : allData;\\n\\n stringBuffer.length = 0;\\n const unescapedExcerpt = excerptWithHoleEscapeTokens.replace(/\\\\\\\\\\\"/g, '\\\"');\\n const unescapedExcerptWithoutOpeningQuote = seenFirst\\n ? unescapedExcerpt\\n : unescapedExcerpt.substring(1);\\n\\n const isLastOfJsonString = jsonStringExcerpt.token != null;\\n const unescapedExcerptWithoutClosingQuote = isLastOfJsonString\\n ? unescapedExcerptWithoutOpeningQuote.substring(0, unescapedExcerptWithoutOpeningQuote.length - 1)\\n : unescapedExcerptWithoutOpeningQuote;\\n\\n const jsonExcerpts = processor.getExcerpts(unescapedExcerptWithoutClosingQuote);\\n jsonExcerpts.forEach(excerpt => jsonElement.push(excerpt));\\n });\\n\\n callback(jsonElement);\\n });\\n\\n return this;\\n }\\n\\n public onEachExcerpt(callback: (value: JsonExcerpt) => void): this {\\n this.onEachExcerptCallbacks.add(callback);\\n this.receivedExcerpts.forEach(callback);\\n return this;\\n }\\n\\n /**\\n * @param onComplete - a callback that will receive the complete JSON\\n * string for this element once it's done streaming\\n */\\n public onComplete(onComplete: (value: string) => void): void {\\n this._onComplete(this.toAsync(onComplete), undefined);\\n }\\n\\n private _onComplete(onComplete: (value: any) => void, expectedTokenType?: Set<TokenType>): void {\\n this.onCompleteCallbacks.add({\\n consumer: onComplete,\\n expectedTokenType\\n });\\n }\\n\\n public onCompleteAsync(onComplete: (value: string) => Promise<void>): void {\\n this._onComplete(onComplete, undefined);\\n }\\n\\n public onCompleteAs<T>(onComplete: (value: T) => void): void {\\n this.onCompleteAsAsync(this.toAsync(onComplete));\\n }\\n\\n public onCompleteAsAsync<T>(\\n onComplete: (value: T) => Promise<void>\\n ): void {\\n this._onComplete(\\n (jsonStringValue: string) => {\\n const deserializedValue = JSON.parse(jsonStringValue.replace(/,$/, ''));\\n return onComplete(deserializedValue);\\n },\\n undefined\\n );\\n }\\n\\n public onCompleteAsString(onComplete: (value: string) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_STRING, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsStringAsync(onComplete: (value: string) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_STRING, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsInt(onComplete: (value: number) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsIntAsync(onComplete: (value: number) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsNumber(onComplete: (value: number) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NUMBER_FLOAT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsNumberAsync(onComplete: (value: number) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NUMBER_FLOAT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsBoolean(onComplete: (value: boolean) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_TRUE, TokenType.VALUE_FALSE, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsBooleanAsync(onComplete: (value: boolean) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_TRUE, TokenType.VALUE_FALSE, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public whenComplete(): Promise<string> {\\n return new Promise<string>(resolve => {\\n this.onComplete(value => resolve(value));\\n });\\n }\\n\\n public asJsonFlux(): Flux<string> {\\n return Flux.create<string>((push, complete) => {\\n this.onEachExcerpt(excerpt => {\\n if (excerpt.source) {\\n push(excerpt.source);\\n }\\n });\\n this._onComplete(async () => complete());\\n });\\n }\\n\\n public whenCompleteAs<T>(): Promise<T> {\\n return new Promise<T>(resolve => {\\n this.onCompleteAs(resolve);\\n });\\n }\\n\\n public async push(excerpt: JsonExcerpt): Promise<void> {\\n const token = excerpt.token;\\n\\n this.onEachExcerptCallbacks.forEach(callback => callback(excerpt));\\n\\n if (this.isState(InNested)) {\\n return (this.state as InNested).child.push(excerpt);\\n }\\n\\n if (!token) {\\n return;\\n }\\n\\n const tokenType = token.type;\\n this.currentToken = token;\\n\\n if (this.isState(Begin)) {\\n switch (tokenType) {\\n case TokenType.START_OBJECT: {\\n if (this.onElementCallbacks.size > 0) {\\n throw new Error(\\\"registered onElement for object\\\");\\n }\\n this.state = new InObject();\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.START_ARRAY: {\\n if (this.propertyCallbacks.size > 0) {\\n throw new Error(\\\"registered onProperty for array\\\");\\n }\\n this.state = new InArray();\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL:\\n this.receivedJson.push(token.source);\\n return this.end();\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n } else if (this.isState(InObject)) {\\n switch (tokenType) {\\n case TokenType.FIELD_NAME: {\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.END_OBJECT: {\\n this.receivedJson.push(token.source);\\n return this.end();\\n }\\n\\n case TokenType.START_OBJECT:\\n case TokenType.START_ARRAY:\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL: {\\n const child = new StreamedJsonChildElement();\\n child.onComplete(resultingJson => {\\n this.receivedJson.push(resultingJson);\\n this.state = new InObject();\\n })\\n this.state = new InPropertyValue(child);\\n this.propertyCallbacks.get(token.fieldName!)\\n ?.forEach(callback => callback(child));\\n return child.push(excerpt);\\n }\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n } else if (this.isState(InArray)) {\\n switch (tokenType) {\\n case TokenType.END_ARRAY: {\\n this.receivedJson.push(token.source);\\n return this.end();\\n }\\n\\n case TokenType.START_OBJECT:\\n case TokenType.START_ARRAY:\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL: {\\n const child = new StreamedJsonChildElement();\\n child.onComplete(resultingJson => {\\n this.receivedJson.push(resultingJson);\\n this.state = new InArray();\\n })\\n this.onElementCallbacks.forEach(callback => callback(child));\\n this.state = new InArrayElement(child);\\n return child.push(excerpt);\\n }\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n }\\n\\n throw new Error(\\\"Unknown state\\\");\\n }\\n\\n protected async end(): Promise<void> {\\n if (this.currentToken === undefined) {\\n throw new Error('Illegal state')\\n }\\n\\n await Flux.fromArray([...this.onCompleteCallbacks]).flatMap(async subscription => {\\n const expectedTokenType = subscription.expectedTokenType;\\n const completeValue = (() => {\\n if (expectedTokenType === undefined) {\\n return this.receivedJson.join('');\\n }\\n if (!expectedTokenType.has(this.currentToken!.type)) {\\n throw new Error(`Expected token type ${Array.from(expectedTokenType).join(', ')} but got ${this.currentToken!.type}`);\\n }\\n return this.currentToken!.value\\n })()\\n await subscription.consumer(completeValue);\\n });\\n }\\n\\n private isState(stateClass: typeof Begin | typeof InArray | typeof InObject | typeof InNested): boolean {\\n return this.state instanceof stateClass;\\n }\\n\\n private endsOnUnevenNumberOfBackslashes(data: string): boolean {\\n let count = 0;\\n for (let i = data.length - 1; i >= 0; i--) {\\n if (data[i] === '\\\\\\\\') {\\n count++;\\n } else {\\n break;\\n }\\n }\\n return count % 2 === 1;\\n }\\n\\n private toAsync<T>(consumer: (value: T) => void): (value: T) => Promise<void> {\\n return async (value: T) => {\\n consumer(value);\\n };\\n }\\n}\\n\\n// State classes\\nabstract class State {\\n}\\n\\nclass InNested extends State {\\n constructor(public readonly child: StreamedJsonChildElement) {\\n super();\\n }\\n}\\n\\nclass Begin extends State {\\n}\\n\\nclass InArray extends State {\\n}\\n\\nclass InArrayElement extends InNested {\\n constructor(child: StreamedJsonChildElement) {\\n super(child);\\n }\\n}\\n\\nclass InObject extends State {\\n}\\n\\nclass InPropertyValue extends InNested {\\n constructor(child: StreamedJsonChildElement) {\\n super(child);\\n }\\n}\\n\\nclass UnexpectedTokenException extends Error {\\n constructor(token: Token) {\\n super(`Unexpected token: ${token.type}`);\\n this.name = \\\"UnexpectedTokenException\\\";\\n }\\n}\\n\\n// Mock JsonTokenProcessor for onJsonStringProperty\\nclass JsonTokenProcessor {\\n getExcerpts(data: string): JsonExcerpt[] {\\n return [{source: data}];\\n }\\n}\\n\\nexport class StreamedJsonChildElement extends StreamedJsonElement {\\n constructor() {\\n super();\\n }\\n}\\n\",\"import {JsonExcerpt} from './JsonExcerpt.js';\\nimport {StreamedJsonElement} from './StreamedJsonElement.js';\\nimport {Flux} from \\\"monoflux\\\";\\n\\nexport class StreamedJsonRootElement extends StreamedJsonElement {\\n protected readonly jsonTokenFlux: Flux<JsonExcerpt>\\n constructor(jsonTokenFlux: Flux<JsonExcerpt>) {\\n super();\\n const thiss = this\\n this.jsonTokenFlux = Flux.fromGeneratorFunction(async function* () {\\n let lastTokenExcerpt: JsonExcerpt | undefined = undefined;\\n for await (const excerpt of jsonTokenFlux) {\\n if (excerpt.token !== undefined) {\\n if (lastTokenExcerpt?.token?.maybeIncomplete && lastTokenExcerpt.token.type === excerpt.token.type && !excerpt.token.maybeIncomplete) {\\n await thiss.push(excerpt)\\n }\\n lastTokenExcerpt = excerpt.token;\\n }\\n if (excerpt.token === undefined || !excerpt.token.maybeIncomplete) {\\n await thiss.push(excerpt)\\n }\\n yield excerpt;\\n }\\n if (lastTokenExcerpt?.token?.maybeIncomplete) {\\n await thiss.push(lastTokenExcerpt)\\n }\\n })\\n }\\n\\n override whenComplete(): Promise<string> {\\n return this.jsonTokenFlux\\n .then(() => this.receivedJson.join(''));\\n }\\n\\n override asJsonFlux(): Flux<string> {\\n return this.jsonTokenFlux\\n .map(excerpt => excerpt.source)\\n .filter(source => source !== undefined)\\n }\\n}\\n\",\"import { JsonExcerpt } from './JsonExcerpt.js'\\nimport { StreamedJsonRootElement } from './StreamedJsonRootElement.js'\\nimport {Flux} from \\\"monoflux\\\";\\n\\nexport class StreamedJsonParser {\\n parse(jsonTokenFlux: Flux<JsonExcerpt>): StreamedJsonRootElement {\\n return new StreamedJsonRootElement(jsonTokenFlux)\\n }\\n}\\n\",\"type Scope = '{' | '['\\n | '\\\"prop' | '\\\"prop\\\"' | '\\\"prop\\\":'\\n | 'n' | 'nu' | 'nul'\\n | 't' | 'tr' | 'tru'\\n | 'f' | 'fa' | 'fal' | 'fals'\\n | '\\\"value'\\n | 'number.'\\n\\nexport type DeepPartial<T> = T extends object ? {\\n [P in keyof T]?: DeepPartial<T[P]>;\\n} : T;\\n\\nexport function parsePartialJson<T>(partialJson: string): DeepPartial<T> | undefined {\\n if (partialJson.trim() === '') {\\n return undefined\\n }\\n const opened: Scope[] = []\\n let escaped = false\\n const pushScope = (scope: Scope) => opened.push(scope)\\n const popScope = (...expect: Scope[]) => {\\n const lastOpened = opened[opened.length - 1]\\n if (lastOpened === undefined || !expect.includes(lastOpened)) {\\n throw new Error('illegal state')\\n }\\n opened.pop()\\n }\\n const illegalState = () => {\\n return new Error(`Illegal state (json: ${partialJson})`)\\n }\\n for (const char of partialJson) {\\n const scope = opened.length > 0 ? opened[opened.length - 1]! : null\\n let nextEscapedValue = false\\n if (char === '\\\"') {\\n if (scope === null) {\\n pushScope('\\\"value')\\n } else if (scope === '[') {\\n pushScope('\\\"value')\\n } else if (scope === '{') {\\n pushScope('\\\"prop')\\n } else if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('\\\"value')\\n } else if (scope === '\\\"prop') {\\n if (!escaped) {\\n popScope('\\\"prop')\\n pushScope('\\\"prop\\\"')\\n }\\n } else if (scope === '\\\"value') {\\n if (!escaped) {\\n popScope('\\\"value')\\n }\\n } else throw illegalState()\\n } else if (char === '[') {\\n if (scope === null) {\\n pushScope('[')\\n } else if (scope === '[') {\\n pushScope('[')\\n } else if (scope === '\\\"prop\\\":') {\\n pushScope('[')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === '{') {\\n if (scope === null || scope === '[' || scope === '\\\"prop\\\":') {\\n pushScope('{')\\n } else throw illegalState()\\n } else if (char === '\\\\\\\\') {\\n if (scope === '\\\"prop' || scope === '\\\"value') {\\n if (!escaped) {\\n nextEscapedValue = true\\n }\\n } else throw illegalState()\\n } else if (char === ':') {\\n if (scope === '\\\"prop\\\"') {\\n popScope('\\\"prop\\\"')\\n pushScope('\\\"prop\\\":')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'n') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('n')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'u') {\\n if (scope === 'n') {\\n popScope('n')\\n pushScope('nu')\\n } else if (scope === 'tr') {\\n popScope('tr')\\n pushScope('tru')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'l') {\\n if (scope === 'nu') {\\n popScope('nu')\\n pushScope('nul')\\n } else if (scope === 'nul') {\\n popScope('nul')\\n } else if (scope === 'fa') {\\n popScope('fa')\\n pushScope('fal')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 't') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('t')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'r') {\\n if (scope === 't') {\\n popScope('t')\\n pushScope('tr')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'e') {\\n if (scope === 'tru') {\\n popScope('tru')\\n } else if (scope === 'fals') {\\n popScope('fals')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'f') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('f')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'a') {\\n if (scope === 'f') {\\n popScope('f')\\n pushScope('fa')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 's') {\\n if (scope === 'fal') {\\n popScope('fal')\\n pushScope('fals')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === '.') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('number.')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char.match(/[0-9]/)) {\\n if (scope === 'number.') {\\n popScope('number.')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n } else throw illegalState()\\n } else if (char === '}') {\\n if (scope === '{') {\\n popScope('{')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === ']') {\\n if (scope === '[') {\\n popScope('[')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n }\\n escaped = nextEscapedValue\\n }\\n const closeEverything = opened\\n .reverse()\\n .map(opener => {\\n switch (opener) {\\n case '{': return '}'\\n case '[': return ']'\\n case '\\\"prop': return '\\\": null'\\n case '\\\"prop\\\"': return ': null'\\n case '\\\"prop\\\":': return ' null'\\n case 'n': return 'ull'\\n case 'nu': return 'll'\\n case 'nul': return 'l'\\n case 't': return 'rue'\\n case 'tr': return 'ue'\\n case 'tru': return 'e'\\n case 'f': return 'alse'\\n case 'fa': return 'lse'\\n case 'fal': return 'se'\\n case 'fals': return 'e'\\n case '\\\"value': return '\\\"'\\n case 'number.': return '0'\\n default: throw illegalState()\\n }\\n })\\n .join('')\\n const partialJsonWithoutEndingOnEscapeSign = escaped\\n ? partialJson.substring(0, partialJson.length - 1)\\n : partialJson\\n const partialJsonWithoutEndingComma = partialJsonWithoutEndingOnEscapeSign\\n .replace(/( |\\\\n|,)+$/, '')\\n const completedJson = partialJsonWithoutEndingComma + closeEverything\\n try {\\n return JSON.parse(completedJson)\\n } catch (e) {\\n throw new Error(`Failed to parse JSON with error '${(e as Error).message}'. JSON was: ${completedJson}`)\\n }\\n}\",\"export function nonNullish<T>(value: T | undefined | null): value is T\\n{\\n return value !== undefined && value !== null;\\n}\",\"export function requireDefined<T>(value: T | undefined): T {\\n if (value === undefined) {\\n throw new Error('Value is undefined');\\n }\\n return value;\\n}\",\"import validate from './validate.js';\\nconst byteToHex = [];\\nfor (let i = 0; i < 256; ++i) {\\n byteToHex.push((i + 0x100).toString(16).slice(1));\\n}\\nexport function unsafeStringify(arr, offset = 0) {\\n return (byteToHex[arr[offset + 0]] +\\n byteToHex[arr[offset + 1]] +\\n byteToHex[arr[offset + 2]] +\\n byteToHex[arr[offset + 3]] +\\n '-' +\\n byteToHex[arr[offset + 4]] +\\n byteToHex[arr[offset + 5]] +\\n '-' +\\n byteToHex[arr[offset + 6]] +\\n byteToHex[arr[offset + 7]] +\\n '-' +\\n byteToHex[arr[offset + 8]] +\\n byteToHex[arr[offset + 9]] +\\n '-' +\\n byteToHex[arr[offset + 10]] +\\n byteToHex[arr[offset + 11]] +\\n byteToHex[arr[offset + 12]] +\\n byteToHex[arr[offset + 13]] +\\n byteToHex[arr[offset + 14]] +\\n byteToHex[arr[offset + 15]]).toLowerCase();\\n}\\nfunction stringify(arr, offset = 0) {\\n const uuid = unsafeStringify(arr, offset);\\n if (!validate(uuid)) {\\n throw TypeError('Stringified UUID is invalid');\\n }\\n return uuid;\\n}\\nexport default stringify;\\n\",\"import { randomFillSync } from 'crypto';\\nconst rnds8Pool = new Uint8Array(256);\\nlet poolPtr = rnds8Pool.length;\\nexport default function rng() {\\n if (poolPtr > rnds8Pool.length - 16) {\\n randomFillSync(rnds8Pool);\\n poolPtr = 0;\\n }\\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\\n}\\n\",\"import { randomUUID } from 'crypto';\\nexport default { randomUUID };\\n\",\"import native from './native.js';\\nimport rng from './rng.js';\\nimport { unsafeStringify } from './stringify.js';\\nfunction v4(options, buf, offset) {\\n if (native.randomUUID && !buf && !options) {\\n return native.randomUUID();\\n }\\n options = options || {};\\n const rnds = options.random ?? options.rng?.() ?? rng();\\n if (rnds.length < 16) {\\n throw new Error('Random bytes length must be >= 16');\\n }\\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\\n if (buf) {\\n offset = offset || 0;\\n if (offset < 0 || offset + 16 > buf.length) {\\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\\n }\\n for (let i = 0; i < 16; ++i) {\\n buf[offset + i] = rnds[i];\\n }\\n return buf;\\n }\\n return unsafeStringify(rnds);\\n}\\nexport default v4;\\n\",\"export type Combine<Current, New> = unknown extends Current\\n ? New\\n : (Current & New) extends never\\n ? Current | New\\n : (Current & New)\\n\\n\\ntype Test = {foo: string} extends unknown ? true : false\\n\\ntype Bla = Combine<{foo: string}, {bar: string}>\\n\\ntype Simplify<T> = {\\n [K in keyof T]: Simplify<T[K]>\\n}\\n\\nexport type Opts = {\\n ignoreUnknownProps?: boolean\\n logValueIfWrong?: boolean\\n errorMessage?: string\\n}\\n\\ntype Problem = {\\n path: string\\n expectedType?: Type[]\\n expectedProp?: string\\n value: unknown\\n unknownProp?: string\\n}\\n\\nclass ComplexTypeError extends Error {\\n public readonly data: any\\n public readonly httpStatus = 400\\n constructor(problems: Problem[], message?: string) {\\n const data = problems\\n .map(problem => {\\n if (problem.expectedProp) {\\n return {\\n expectedProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.expectedProp\\n }\\n } else if (problem.expectedType) {\\n return {\\n expectedType: problem.expectedType.map(typeToString).join(' | '),\\n path: problem.path,\\n insteadGot: problem.value,\\n }\\n } else if (problem.unknownProp) {\\n return {\\n unknownProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.unknownProp\\n }\\n } else {\\n throw new Error('illegal state')\\n }\\n })\\n super(message ?? `Value is of the wrong format: ${JSON.stringify(data, null, 2)}`)\\n this.data = data\\n }\\n}\\n\\n/**\\n * Way to assert the shape of a type both in runtime and in the\\n * type system.\\n *\\n * Usage example:\\n *\\n * ```typescript\\n * const inputValue = ['foo', 'bar'] as unknown\\n *\\n * assert(\\n * inputValue,\\n * t => t\\n * .canBeArray(t => t\\n * .canBeObject(t => t\\n * .canHaveString('foo')\\n * .canHaveString('bar')\\n * )\\n * )\\n * )\\n *\\n * let safeInputvalue = inputValue\\n *\\n * safeInputvalue = [{}] // typescript disapproves\\n * safeInputvalue = [{foo: 'bla', bar: 'bla'}] // typescript approves\\n * ```\\n */\\nexport function specType(\\n value: unknown,\\n): EmptyTypeSpec<unknown> {\\n return new EmptyTypeSpec<unknown>([], value)\\n}\\n\\nfunction checkIsOneOf(value: unknown, types: Type[], path: string, opts: Opts): Problem[] {\\n const problemsPerType = types\\n .map(type => checkIs(value, type, path, opts))\\n if (problemsPerType.some(list => list.length === 0)) {\\n return []\\n } else {\\n const typeProblemsOnThisPath = problemsPerType\\n .flatMap(list => list.filter(t => t.expectedType !== undefined && t.path === path))\\n if (typeProblemsOnThisPath.length > 0) {\\n return [{\\n expectedType: typeProblemsOnThisPath\\n .flatMap(problem => problem.expectedType!),\\n path,\\n value\\n }]\\n }\\n return problemsPerType.flatMap(list => list)\\n }\\n}\\n\\nfunction checkIs(value: unknown, type: Type, path: string, opts: Opts): Problem[] {\\n const {ignoreUnknownProps = true} = opts\\n switch (type.type) {\\n case \\\"array\\\": {\\n if (!Array.isArray(value)) {\\n return [{expectedType: [type], path, value}]\\n }\\n if (value.length === 0) {\\n return []\\n }\\n return checkIsOneOf(value[0], type.elementType, path + '[..]', opts)\\n }\\n case \\\"boolean\\\": {\\n if (typeof value !== 'boolean') {\\n return [{expectedType: [type], path, value}]\\n }\\n return []\\n }\\n case \\\"undefined\\\": {\\n return value === undefined\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"object\\\": {\\n if (typeof value !== 'object' || value === null) {\\n return [{expectedType: [type], path, value}]\\n }\\n const problems: Problem[] = []\\n for (const key in type.props) {\\n const prop = type.props[key]!\\n if (!(key in value)) {\\n if (!prop.optional) {\\n problems.push({expectedProp: key, path, value})\\n }\\n continue\\n }\\n const typeAccountingOptionality: Type[] = prop.optional\\n ? [...prop.type, {type: 'undefined'}]\\n : prop.type\\n problems.push(...checkIsOneOf(value[key as keyof typeof value], typeAccountingOptionality, path + `.${key}`, opts))\\n }\\n if (!ignoreUnknownProps) {\\n for (const key in value) {\\n if (!(key in type.props)) {\\n problems.push({unknownProp: key, path, value})\\n }\\n }\\n }\\n return problems\\n }\\n case \\\"string\\\": {\\n return typeof value === 'string'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"null\\\": {\\n return value === null\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"number\\\": {\\n return typeof value === 'number'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'constant': {\\n return value === type.value\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n }\\n}\\n\\nexport abstract class TypeSpec<T> {\\n constructor(\\n protected readonly type: Type[],\\n protected readonly value: unknown,\\n private readonly _: T = undefined as T// type holder\\n ) {}\\n}\\n\\nexport class EmptyTypeSpec<T> extends TypeSpec<T> {\\n array<T_arr = unknown>(element: (arg: EmptyTypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new EmptyTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n object<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n string() {\\n return new FullTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n number() {\\n return new FullTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n boolean() {\\n return new FullTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n constant<Value extends (string | number | boolean)>(value: Value, ...otherValues: Value[]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n {type: 'constant', value},\\n ...(otherValues ?? []).map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n null() {\\n return new FullTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n undefined() {\\n return new FullTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class FullTypeSpec<T> extends TypeSpec<T> {\\n orArray<T_arr = unknown>(element: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new FullTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec.type], this.value)\\n }\\n\\n orObject<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n orString() {\\n return new FullTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n orNumber() {\\n return new FullTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n orBoolean() {\\n return new FullTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n orConstant<Value extends (string | number | boolean)>(value: Value, ...otherValues: Value[]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n {type: 'constant', value},\\n ...(otherValues ?? []).map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n orNull() {\\n return new FullTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n orUndefined() {\\n return new FullTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class TypeMemberSpec<T> {\\n constructor(\\n protected readonly type: Type[],\\n private readonly value: unknown\\n ) {}\\n\\n mayHave<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n hint?: string,\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, T_prop>>>> {\\n return this.has(propertyName, assertTypeOfProperty, true, hint)\\n }\\n\\n canHaveString<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, string>>>> {\\n return this.mayHave(propertyName, type => type.string(), hint)\\n }\\n\\n canHaveNumber<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, number>>>> {\\n return this.mayHave(propertyName, type => type.number(), hint)\\n }\\n\\n canHaveBoolean<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, boolean>>>> {\\n return this.mayHave(propertyName, type => type.boolean(), hint)\\n }\\n\\n canHaveConstant<Key extends string, Value extends (string | number | boolean)>(\\n propertyName: Key,\\n [firstConstant, ...otherConstants]: [Value, ...Value[]],\\n hint?: string\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, Value>>>> {\\n return this.mayHave(\\n propertyName,\\n type => type.constant(firstConstant, ...otherConstants),\\n hint,\\n )\\n }\\n\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n optional: false,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n optional?: boolean,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, T_prop>>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n arg3: boolean | string = false,\\n arg4?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop> | Partial<Record<Key, T_prop>>>> {\\n const {\\n optional,\\n comment,\\n }: {optional: boolean, comment: string | undefined} = (() => {\\n if (typeof arg3 === 'string') {\\n return {\\n optional: false,\\n comment: arg3,\\n }\\n } else {\\n return {\\n optional: arg3,\\n comment: arg4,\\n }\\n }\\n })()\\n const old = this.type.length === 1\\n ? this.type[0]!\\n : undefined\\n if (old === undefined || old.type !== 'object') {\\n throw new Error('illegal state')\\n }\\n const propertyTypeSpec = assertTypeOfProperty(new EmptyPropTypeSpec([], this.value))\\n const propertyType = propertyTypeSpec['type']\\n const commentsFromPropTypeSpec = propertyTypeSpec['_comments']\\n return new TypeMemberSpec<Combine<T, Record<Key, T_prop>>>([{\\n ...old,\\n props: {\\n ...old.props,\\n [propertyName]: {\\n optional,\\n type: propertyType,\\n comment: (() => {\\n const comments = [\\n ...commentsFromPropTypeSpec,\\n ...(comment !== undefined ? [comment] : []),\\n ]\\n return comments.length > 0\\n ? comments.join('. ')\\n : undefined\\n })(),\\n }\\n }\\n }], this.value)\\n }\\n\\n hasString<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, string>>> {\\n return this.has(\\n propertyName,\\n type => type.string(),\\n false,\\n comment,\\n )\\n }\\n\\n hasNumber<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, number>>> {\\n return this.has(\\n propertyName,\\n type => type.number(),\\n false,\\n comment,\\n )\\n }\\n\\n hasBoolean<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, boolean>>> {\\n return this.has(\\n propertyName,\\n type => type.boolean(),\\n false,\\n comment,\\n )\\n }\\n\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(propertyName: Key, ...constants: [Value, ...Value[]]): TypeMemberSpec<Combine<T, Record<Key, Value>>>\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(propertyName: Key, [firstConstant, ...otherConstants]: [Value, ...Value[]], comment?: string): TypeMemberSpec<Combine<T, Record<Key, Value>>>\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(\\n propertyName: Key,\\n arg2: Value | [Value, ...Value[]],\\n arg3?: Value | string,\\n ...otherArgs: Value[]\\n ): TypeMemberSpec<Combine<T, Record<Key, Value>>> {\\n const {\\n constants,\\n comment,\\n }: {constants: [Value, ...Value[]], comment?: string} = (() => {\\n if (Array.isArray(arg2)) {\\n return {\\n constants: arg2,\\n comment: arg3 as string | undefined,\\n }\\n } else {\\n return {\\n constants: [\\n arg2,\\n ...(arg3 !== undefined ? [arg3 as Value] : []),\\n ...otherArgs\\n ],\\n comment: undefined,\\n }\\n }\\n })()\\n return this.has(\\n propertyName,\\n type => type.constant(...constants),\\n false,\\n comment,\\n )\\n }\\n}\\n\\nexport abstract class PropTypeSpec<T> extends TypeSpec<T> {\\n constructor(\\n type: Type[],\\n value: unknown,\\n private _comments: string[] = [],\\n ) {\\n super(type, value)\\n }\\n\\n /**\\n * Give a comment to the LLM about this property\\n */\\n withComment(message: string) {\\n return new FullPropTypeSpec<Combine<T, string>>(this.type, this.value, [...this._comments, message])\\n }\\n}\\n\\nexport class EmptyPropTypeSpec<T> extends PropTypeSpec<T> {\\n array<T_arr = unknown>(element: (arg: EmptyTypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new EmptyTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullPropTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n object<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullPropTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n string() {\\n return new FullPropTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n number() {\\n return new FullPropTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n boolean() {\\n return new FullPropTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n constant<Value extends (string | number | boolean)>(...values: [Value, ...Value[]]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n ...values.map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n null() {\\n return new FullPropTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n undefined() {\\n return new FullPropTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class FullPropTypeSpec<T> extends PropTypeSpec<T> {\\n orArray<T_arr = unknown>(element: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new FullTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullPropTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n orObject<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullPropTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n orString() {\\n return new FullPropTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n orNumber() {\\n return new FullPropTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n orBoolean() {\\n return new FullPropTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n orConstant<Value extends (string | number | boolean)>(...values: [Value, ...Value[]]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n ...values.map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n orNull() {\\n return new FullPropTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n orUndefined() {\\n return new FullPropTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport function assertType<T>(\\n value: unknown,\\n typeSpec: TypeSpec<T>,\\n opts: Opts = {}\\n): T {\\n const problems = checkIsOneOf(value, typeSpec['type'], 'root', opts)\\n if (problems.length > 0) {\\n throw new ComplexTypeError(problems, opts.errorMessage)\\n }\\n return value as T\\n}\\n\\nexport function describeType(typeSpec: TypeSpec<any>): string {\\n return describe(typeSpec['type'])\\n}\\n\\nexport function describe(type: Type[] | Type, indentLevel = 0): string {\\n if (Array.isArray(type)) {\\n return type.map(t => describe(t, indentLevel)).join(' | ')\\n }\\n switch (type.type) {\\n case \\\"array\\\": {\\n return `${describe(type.elementType, indentLevel)}[]`\\n }\\n case \\\"boolean\\\": {\\n return 'boolean'\\n }\\n case \\\"undefined\\\": {\\n return 'undefined'\\n }\\n case \\\"object\\\": {\\n const keys = Object.keys(type.props)\\n return `{\\\\n`\\n +\\n keys.map((key, i) => {\\n const propSpec = type.props[key]!\\n const value = describe(propSpec.type, indentLevel + 1)\\n const comma = i < keys.length - 1 ? ',' : ''\\n const comment = propSpec.comment !== undefined ? ` // ${propSpec.comment}` : ''\\n return `${indent(indentLevel + 1)}${key}: ${value}${comma}${comment}\\\\n`\\n }).join('')\\n + `${indent(indentLevel)}}`\\n }\\n case \\\"string\\\": {\\n return 'string'\\n }\\n case \\\"null\\\": {\\n return 'null'\\n }\\n case \\\"number\\\": {\\n return 'number'\\n }\\n case 'constant': {\\n return `\\\"${type.value}\\\"`\\n }\\n }\\n}\\n\\nfunction indent(depth: number) {\\n let indent = ''\\n for (let i = 0; i < depth; i++) {\\n indent += ' '\\n }\\n return indent\\n}\\n\\nexport type TypeType = 'undefined' | 'null' | 'boolean' | 'string' | 'number' | 'object' | 'array' | 'constant'\\n\\nexport type BaseType<TT extends TypeType> = {\\n type: TT\\n}\\n\\nexport type UndefinedType = BaseType<'undefined'>\\nexport type NullType = BaseType<'null'>\\nexport type BooleanType = BaseType<'boolean'>\\nexport type StringType = BaseType<'string'>\\nexport type NumberType = BaseType<'number'>\\nexport type ObjectType = BaseType<'object'> & {\\n props: Record<string, {\\n optional: boolean\\n type: Type[]\\n comment: string | undefined\\n }>\\n}\\nexport type ArrayType = BaseType<'array'> & {\\n elementType: Type[]\\n}\\nexport type ConstantType<Value extends (string | number | boolean)> = BaseType<'constant'> & {\\n value: Value\\n}\\n\\nexport type Type = UndefinedType | NullType | BooleanType | StringType | NumberType | ObjectType | ArrayType | ConstantType<any>\\n\\nfunction typeToString(type: Type) {\\n return type.type === 'constant'\\n ? `'${type.value}'`\\n : type.type\\n}\\n\"],\"mappings\":\"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\",\"ignoreList\":[]}"
|
|
1
|
+
"{\"version\":3,\"names\":[\"Flux\",\"_Flux\",\"generator\",\"upstream\",\"handleCancel\",\"_closed\",\"constructor\",\"thiss\",\"this\",\"async\",\"e\",\"ignorableValue\",\"Symbol\",\"asyncIterator\",\"next\",\"args\",\"value\",\"return\",\"throw\",\"cancel\",\"closed\",\"then\",\"onfulfilled\",\"onrejected\",\"result\",\"asList\",\"onfinally\",\"promise\",\"toStringTag\",\"subscribe\",\"callback\",\"flux\",\"doOnEach\",\"recur\",\"done\",\"catch\",\"err\",\"console\",\"error\",\"unsubscribe\",\"filter\",\"predicate\",\"constructFromGeneratorFunction\",\"untilExcl\",\"doAfterLast\",\"events\",\"push\",\"map\",\"mapper\",\"take\",\"n\",\"i\",\"flatMap\",\"Array\",\"isArray\",\"r\",\"transform\",\"defineGenerator\",\"definedGenerator\",\"reduce\",\"reducer\",\"initialValue\",\"reduction\",\"whenComplete\",\"ignored\",\"create\",\"creator\",\"values\",\"resolvers\",\"isDone\",\"complete\",\"length\",\"shift\",\"resolve\",\"Error\",\"fromGenerator\",\"Promise\",\"reject\",\"fromArray\",\"array\",\"fromGeneratorFunction\",\"fn\",\"fromReadableStream\",\"stream\",\"reader\",\"getReader\",\"excerpt\",\"read\",\"exports\",\"L\",\"ke\",\"D\",\"Object\",\"defineProperty\",\"Flux_1\",\"_e\",\"enumerable\",\"get\",\"import_monoflux\",\"G\",\"textDecoder\",\"TextDecoder\",\"ComplexTypeError\",\"data\",\"httpStatus\",\"problems\",\"message\",\"problem\",\"expectedProp\",\"path\",\"replace\",\"expectedType\",\"typeToString\",\"join\",\"insteadGot\",\"unknownProp\",\"super\",\"JSON\",\"stringify\",\"requireThat\",\"TypeSpec\",\"checkIsOneOf\",\"types\",\"opts\",\"problemsPerType\",\"type\",\"ignoreUnknownProps\",\"elementType\",\"key\",\"props\",\"prop\",\"optional\",\"typeAccountingOptionality\",\"Number\",\"isNaN\",\"checkIs\",\"some\",\"list\",\"typeProblemsOnThisPath\",\"t\",\"promptGridApiUrl\",\"_TypeSpec\",\"canBeArray\",\"assertTypeOfArray\",\"elementSpec\",\"arraySpec\",\"canBeObject\",\"assertTypeOfObject\",\"objectSpec\",\"hasString\",\"propertyName\",\"hasProperty\",\"canBeString\",\"canHaveProperty\",\"assertTypeOfProperty\",\"old\",\"propertyType\",\"canBeNumber\",\"canBeBoolean\",\"canBeConstant\",\"canBeNull\",\"canBeUndefined\",\"andNothingElse\",\"errorMessage\",\"orDefaultTo\",\"describe\",\"indentLevel\",\"keys\",\"indent\",\"depth\",\"config\",\"getPromptGridApiUrl\",\"rawValue\",\"url\",\"url2\",\"backendUrlNotTriviallyIdentifiableInMinifiedCode\",\"Token\",\"source\",\"fieldName\",\"maybeIncomplete\",\"JsonTokenProcessor\",\"_JsonTokenProcessor\",\"jsonBuffer\",\"highestOffsetParsed\",\"toJsonTokenFlux\",\"dataBufferFlux\",\"processDataBuffer\",\"deltaContentFlux\",\"content\",\"getExcerpts\",\"token\",\"excerpts\",\"jsonParser\",\"JsonParser\",\"nextToken\",\"currentTokenLocation\",\"getCharOffset\",\"position\",\"currentTokenType\",\"parentFieldName\",\"currentValue\",\"startPosition\",\"test\",\"positionAfterSucceedingCommaIfPresent\",\"tempPos\",\"substring\",\"char\",\"startPos\",\"endPos\",\"indexOf\",\"nextFourChars\",\"nextFiveChars\",\"numStr\",\"hasDecimal\",\"parseFloat\",\"parseInt\",\"mayBeIncomplete\",\"JsonParseException\",\"name\",\"StreamedJsonElement\",\"receivedJson\",\"propertyCallbacks\",\"Map\",\"onElementCallbacks\",\"Set\",\"onCompleteCallbacks\",\"onEachExcerptCallbacks\",\"currentToken\",\"state\",\"Begin\",\"receivedExcerpts\",\"onElement\",\"add\",\"onProperty\",\"has\",\"set\",\"onJsonStringProperty\",\"processor\",\"stringBuffer\",\"jsonElement\",\"StreamedJsonChildElement\",\"onEachExcerpt\",\"jsonStringExcerpt\",\"allData\",\"excerptWithHoleEscapeTokens\",\"endsOnUnevenNumberOfBackslashes\",\"unescapedExcerptWithoutOpeningQuote\",\"unescapedExcerptWithoutClosingQuote\",\"forEach\",\"onComplete\",\"_onComplete\",\"toAsync\",\"expectedTokenType\",\"consumer\",\"onCompleteAsync\",\"onCompleteAs\",\"onCompleteAsAsync\",\"jsonStringValue\",\"deserializedValue\",\"parse\",\"onCompleteAsString\",\"onCompleteAsStringAsync\",\"onCompleteAsInt\",\"onCompleteAsIntAsync\",\"onCompleteAsNumber\",\"onCompleteAsNumberAsync\",\"onCompleteAsBoolean\",\"onCompleteAsBooleanAsync\",\"asJsonFlux\",\"me\",\"whenCompleteAs\",\"isState\",\"InNested\",\"child\",\"tokenType\",\"size\",\"InObject\",\"InArray\",\"end\",\"UnexpectedTokenException\",\"resultingJson\",\"InPropertyValue\",\"InArrayElement\",\"subscription\",\"completeValue\",\"from\",\"stateClass\",\"count\",\"State\",\"StreamedJsonRootElement\",\"jsonTokenFlux\",\"Le\",\"lastTokenExcerpt\",\"StreamedJsonParser\",\"parseJsonWithUsefulError\",\"completedJson\",\"parsePartialJson\",\"partialJson\",\"trim\",\"opened\",\"escaped\",\"pushScope\",\"scope\",\"popScope\",\"expect\",\"lastOpened\",\"includes\",\"pop\",\"illegalState\",\"nextEscapedValue\",\"match\",\"closeEverything\",\"reverse\",\"opener\",\"nonNullish\",\"requireDefined\",\"byteToHex\",\"toString\",\"slice\",\"randomFillSync\",\"rnds8Pool\",\"Uint8Array\",\"poolPtr\",\"randomUUID\",\"native_default\",\"v4_default\",\"options\",\"buf\",\"offset\",\"rnds\",\"random\",\"rng\",\"RangeError\",\"arr\",\"toLowerCase\",\"unsafeStringify\",\"specType\",\"EmptyTypeSpec\",\"_\",\"_EmptyTypeSpec\",\"element\",\"FullTypeSpec\",\"object\",\"properties\",\"TypeMemberSpec\",\"string\",\"number\",\"boolean\",\"constant\",\"otherValues\",\"FullPropTypeSpec\",\"undefined\",\"_FullTypeSpec\",\"orArray\",\"orObject\",\"orString\",\"orNumber\",\"orBoolean\",\"orConstant\",\"orNull\",\"orUndefined\",\"_TypeMemberSpec\",\"mayHave\",\"hint\",\"canHaveString\",\"canHaveNumber\",\"canHaveBoolean\",\"canHaveConstant\",\"firstConstant\",\"otherConstants\",\"arg3\",\"arg4\",\"comment\",\"propertyTypeSpec\",\"EmptyPropTypeSpec\",\"commentsFromPropTypeSpec\",\"_comments\",\"comments\",\"hasNumber\",\"hasBoolean\",\"hasConstant\",\"arg2\",\"otherArgs\",\"constants\",\"PropTypeSpec\",\"withComment\",\"_FullPropTypeSpec\",\"assertType\",\"typeSpec\",\"describeType\",\"propSpec\",\"comma\",\"AIClient\",\"apiKeys\",\"chat\",\"arg1\",\"toPrompt\",\"effectiveMessages\",\"user\",\"BasicPrompt\",\"getCallerFileNameAndLineNumber\",\"ai\",\"setupAI\",\"arg\",\"obtainAiClientData\",\"effectivePromptGunConfig\",\"newAIClient\",\"promptGridApiKey\",\"raw\",\"handshakeData\",\"response\",\"fetch\",\"method\",\"headers\",\"Authorization\",\"status\",\"body\",\"text\",\"json\",\"promptgrid\",\"openai\",\"promptMappings\",\"promptLLM\",\"aiClient\",\"model\",\"Se\",\"log\",\"prompt\",\"ModelNotSupportedError\",\"executeLlmCall\",\"doPromptLLM\",\"promptAI\",\"client\",\"effectiveClient\",\"PromptBase\",\"callingCodeLine\",\"completeChat\",\"promptSupplier\",\"promptSupplierArgs\",\"_temperature\",\"_topP\",\"_model\",\"self\",\"promptName\",\"temperature\",\"topP\",\"getResponseAsString\",\"to\",\"JsonPrompt\",\"toJson\",\"chunk\",\"jsonTypeSupplier\",\"streamingJsonRootElement\",\"stringGenerator\",\"jsonExcerpt\",\"partialJsonGenerator\",\"accumulatedJson\",\"getResponse\",\"stringResult\",\"uncheckedPackedResult\",\"uncheckedResult\",\"pickModel\",\"modelId\",\"apiToken\",\"genericPrompt\",\"toOpenAiMessage\",\"msg\",\"role\",\"system\",\"assistant\",\"toGenericPrompt\",\"genericPromptWithJsonSpec\",\"jsonSpec\",\"fileName\",\"promptFilename\",\"lineNumber\",\"promptLineNumber\",\"startsWith\",\"split\",\"promptProfile\",\"id\",\"conversationUuid\",\"saveConv\",\"conversationData\",\"apiKey\",\"ok\",\"saveConversation\",\"messages\",\"messageUuid\",\"responseMessageId\",\"requireJsonResponse\",\"ae\",\"abortController\",\"AbortController\",\"Accept\",\"signal\",\"top_p\",\"response_format\",\"bodyText\",\"abort\",\"decode\",\"replaceAll\",\"choices\",\"choice\",\"finish_reason\",\"delta\",\"segment\",\"promptOpenai\",\"accumulatedContent\",\"o\",\"NoAiCredientialsError\",\"frame\",\"stack\",\"l\",\"hasFunctionNameInFrameWithFileNameInParenthesis\",\"functionName\",\"groups\",\"stacktraceFrame\",\"te\",\"re\",\"Z\",\"S\",\"m\",\"h\",\"se\",\"Ee\",\"Be\",\"Ae\",\"K\",\"A\",\"I\",\"P\",\"ne\",\"R\",\"dn\",\"je\",\"mn\",\"yn\",\"ln\"],\"sources\":[\"../node_modules/monoflux/src/Flux.ts\",\"../node_modules/monoflux/src/index.ts\",\"../src/index.ts\",\"../src/ai-inference/openai/promptOpenai.ts\",\"../src/require-that/requireThat.ts\",\"../src/env-vars.ts\",\"../src/json-streaming/types.ts\",\"../src/json-streaming/JsonTokenProcessor.ts\",\"../src/json-streaming/StreamedJsonElement.ts\",\"../src/json-streaming/StreamedJsonRootElement.ts\",\"../src/json-streaming/StreamedJsonParser.ts\",\"../src/util/parseJsonWithUsefulError.ts\",\"../src/parse-partial-json/parsePartialJson.ts\",\"../src/util/nonNullish.ts\",\"../src/util/requireDefined.ts\",\"../node_modules/uuid/dist/esm/stringify.js\",\"../node_modules/uuid/dist/esm/rng.js\",\"../node_modules/uuid/dist/esm/native.js\",\"../node_modules/uuid/dist/esm/v4.js\",\"../src/type-spec/type-spec.ts\"],\"sourcesContent\":[null,null,\"import {Flux} from 'monoflux'\\nimport {AiModelId} from './ai-inference/AiModelId.js'\\nimport {GenericPrompt, PromptMessage} from './ai-inference/model.js'\\nimport {promptOpenai} from './ai-inference/openai/promptOpenai.js'\\nimport {getPromptGridApiUrl} from './env-vars.js'\\nimport {JsonTokenProcessor} from './json-streaming/JsonTokenProcessor.js'\\nimport {StreamedJsonChildElement} from './json-streaming/StreamedJsonElement.js'\\nimport {StreamedJsonParser} from './json-streaming/StreamedJsonParser.js'\\nimport {StreamedJsonRootElement} from './json-streaming/StreamedJsonRootElement.js'\\nimport {parsePartialJson} from './parse-partial-json/parsePartialJson.js'\\nimport {nonNullish} from './util/nonNullish.js'\\nimport {requireDefined} from './util/requireDefined.js'\\nimport {randomUuid} from './util/randomUuid.ts'\\nimport {assertType, describeType, EmptyTypeSpec, FullPropTypeSpec, specType, TypeSpec} from './type-spec/type-spec.js'\\nimport {requireThat} from './require-that/requireThat.js'\\nimport {parseJsonWithUsefulError} from './util/parseJsonWithUsefulError.js'\\n\\ntype SystemMessage = {system: string, user?: undefined, assistant?: undefined}\\ntype UserMessage = {system?: undefined, user: string, assistant?: undefined}\\ntype AssistantMessage = {system?: undefined, user?: undefined, assistant: string}\\n\\ntype Message = SystemMessage | UserMessage | AssistantMessage\\n\\ntype Prompt = string | Message | Message[]\\n\\ntype ApiKeys = {\\n\\topenai?: string | undefined\\n}\\n\\ntype Opts = {\\n\\tmodel?: 'gpt-4o'\\n}\\n\\ntype HandshakeData = {\\n\\tapiKeys: ApiKeys\\n\\twithinQuotum: boolean\\n}\\n\\nclass AIClient {\\n\\tconstructor(\\n\\t\\tprivate apiKeys: {\\n\\t\\t\\tpromptgrid: string | undefined\\n\\t\\t\\topenai: Promise<string | undefined>\\n\\t\\t} | undefined,\\n\\t) {}\\n\\n\\tchat<T extends undefined>(userMessage: string): BasicPrompt<T>\\n\\tchat<T extends undefined>(...messages: Message[]): BasicPrompt<T>\\n\\tchat<T extends undefined>(messages: Message[]): BasicPrompt<T>\\n\\tchat<T extends undefined>(toPrompt: (args?: T) => Prompt): BasicPrompt<T>\\n\\tchat<T>(toPrompt: (args: T) => Prompt, args: T): BasicPrompt<T>\\n\\tchat<T = undefined>(toPrompt: (args?: T) => Prompt, args?: T): BasicPrompt<T>\\n\\tchat<T = undefined>(\\n\\t\\targ1: Message | Message[] | ((args?: T) => Prompt) | string,\\n\\t\\targ2?: Message | T,\\n\\t\\t...arg3: Message[]\\n\\t): BasicPrompt<T> {\\n\\t\\tconst {\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targs,\\n\\t\\t} = (() => {\\n\\t\\t\\tif (typeof arg1 === 'function') {\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: arg1,\\n\\t\\t\\t\\t\\targs: arg2,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (typeof arg1 === 'string') {\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => arg1,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else if (Array.isArray(arg1)) {\\n\\t\\t\\t\\tconst effectiveMessages = arg1.length === 0\\n\\t\\t\\t\\t\\t? [{user: ''}]\\n\\t\\t\\t\\t\\t: arg1\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => effectiveMessages,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tconst messages: Message[] = [\\n\\t\\t\\t\\t\\targ1,\\n\\t\\t\\t\\t\\t...(arg2 !== undefined ? [arg2 as Message] : []),\\n\\t\\t\\t\\t\\t...arg3,\\n\\t\\t\\t\\t]\\n\\t\\t\\t\\tconst effectiveMessages = messages.length === 0\\n\\t\\t\\t\\t\\t? [{user: ''}]\\n\\t\\t\\t\\t\\t: arg1\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\ttoPrompt: () => effectiveMessages,\\n\\t\\t\\t\\t\\targs: undefined,\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\treturn new BasicPrompt<T>(\\n\\t\\t\\tthis,\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targ2 as T,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t)\\n\\t}\\n\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, opts?: Opts): Flux<string>\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json: true, opts?: Opts): StreamedJsonRootElement\\n\\t// promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json?: boolean, opts?: Opts): Flux<string> | StreamedJsonRootElement\\n\\t// promptLLM<T>(\\n\\t// \\targs: T,\\n\\t// \\ttoPrompt: (args: T) => Prompt,\\n\\t// \\targ3?: boolean | Opts,\\n\\t// \\targ4?: Opts,\\n\\t// ): Flux<string> | StreamedJsonRootElement {\\n\\t// \\treturn doPromptLLM(this, args, toPrompt, arg3, arg4)\\n\\t// }\\n}\\n\\nexport let ai = new AIClient(undefined);\\n\\nexport type PromptGunConfig = {\\n\\tpromptGridApiKey?: string\\n\\tapiKeys?: ApiKeys\\n}\\n\\nexport function setupAI(arg: string | PromptGunConfig) {\\n\\tai['apiKeys'] = obtainAiClientData(\\n\\t\\teffectivePromptGunConfig(\\n\\t\\t\\targ\\n\\t\\t)\\n\\t)\\n}\\n\\nexport function newAIClient(promptGridApiKey: string): AIClient\\nexport function newAIClient(config: PromptGunConfig): AIClient\\nexport function newAIClient(arg: string | PromptGunConfig): AIClient {\\n\\treturn new AIClient(\\n\\t\\tobtainAiClientData(\\n\\t\\t\\teffectivePromptGunConfig(arg)\\n\\t\\t)\\n\\t)\\n}\\n\\nfunction effectivePromptGunConfig(arg: string | PromptGunConfig): PromptGunConfig {\\n\\treturn {\\n\\t\\tpromptGridApiKey: (() => {\\n\\t\\t\\tconst raw = typeof arg === 'string' ? arg : arg.promptGridApiKey\\n\\t\\t\\treturn assertType(\\n\\t\\t\\t\\traw,\\n\\t\\t\\t\\tspecType(raw)\\n\\t\\t\\t\\t\\t.string()\\n\\t\\t\\t\\t\\t.orUndefined(),\\n\\t\\t\\t\\t{errorMessage: `Please provide a valid API key; got ${raw}`}\\n\\t\\t\\t)\\n\\t\\t})(),\\n\\t\\tapiKeys: typeof arg === 'object' && arg !== null ? arg.apiKeys : undefined\\n\\t}\\n}\\n\\nexport function obtainAiClientData(config: PromptGunConfig) {\\n\\tconst promptGridApiKey = config.promptGridApiKey\\n\\tconst apiKeys = config.apiKeys\\n\\tconst handshakeData = promptGridApiKey !== undefined ? (async () => {\\n\\t\\tconst response = await (async () => {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\treturn await fetch(\\n\\t\\t\\t\\t\\t`${getPromptGridApiUrl()}/handshake`,\\n\\t\\t\\t\\t\\t{\\n\\t\\t\\t\\t\\t\\tmethod: 'POST',\\n\\t\\t\\t\\t\\t\\theaders: {\\n\\t\\t\\t\\t\\t\\t\\t'Content-Type': 'application/json',\\n\\t\\t\\t\\t\\t\\t\\t'User-Agent': 'promptgun',\\n\\t\\t\\t\\t\\t\\t\\t'Authorization': `Bearer ${promptGridApiKey}`,\\n\\t\\t\\t\\t\\t\\t},\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t)\\n\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\tthrow new Error('HTTP called failed when doing handshake')\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\tif (response.status !== 200) {\\n\\t\\t\\tconst body = await response.text()\\n\\t\\t\\tthrow new Error(`Handshake failed with status ${response.status}, body: ${body}`)\\n\\t\\t}\\n\\t\\treturn await response.json() as HandshakeData\\n\\t})() : undefined\\n\\n\\treturn {\\n\\t\\tpromptgrid: promptGridApiKey,\\n\\t\\topenai: (async () => apiKeys?.openai ?? (await handshakeData)?.apiKeys.openai)()\\n\\t}\\n}\\n\\n// Create a map to store resolved prompt UUIDs\\nconst promptMappings = new Map<string, string>();\\n\\n// Function to generate a key for the promptMappings map\\nfunction createPromptMappingKey(filename: string, lineNumber: number): string {\\n\\treturn `${filename}:${lineNumber}`;\\n}\\n\\n// Function to safely generate the key, handling undefined values\\nfunction safeCreateMappingKey(filename: string | undefined, lineNumber: number | undefined): string | null {\\n\\tif (filename && lineNumber !== undefined) {\\n\\t\\treturn createPromptMappingKey(filename, lineNumber);\\n\\t}\\n\\treturn null;\\n}\\n\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt): Flux<string>\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json: true): StreamedJsonRootElement\\nexport function promptLLM<T>(args: T, toPrompt: (args: T) => Prompt, json?: boolean): Flux<string> | StreamedJsonRootElement\\nexport function promptLLM<T>(\\n\\targs: T,\\n\\ttoPrompt: (args: T) => Prompt,\\n\\targ3?: boolean | Opts,\\n\\targ4?: Opts,\\n): Flux<string> | StreamedJsonRootElement {\\n\\tif (ai === undefined) {\\n\\t\\tthrow new Error('No LLM set up. Call setupLLM first: ```import { setupPromptGun } from \\\\'promptgun\\\\';\\\\n\\\\nsetupPromptGun({openAI: \\\"YOUR_OPENAI_API_KEY\\\"});\\\\n```')\\n\\t}\\n\\treturn doPromptLLM(ai, args, toPrompt, arg3, arg4)\\n}\\n\\nexport function promptAI(client?: AIClient): PromptBase {\\n\\tconst effectiveClient = client ?? ai\\n\\tif (effectiveClient['apiKeys'] === undefined) {\\n\\t\\tthrow new Error('No LLM set up. Call setupPromptGun first: ```import { setupPromptGun } from \\\\'promptgun\\\\';\\\\n\\\\nsetupPromptGun({openAI: \\\"YOUR_OPENAI_API_KEY\\\"});\\\\n```')\\n\\t}\\n\\treturn new PromptBase(effectiveClient, getCallerFileNameAndLineNumber())\\n}\\n\\nclass PromptBase {\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t) {}\\n\\n\\tcompleteChat<T extends undefined>(toPrompt: (args?: T) => Prompt): BasicPrompt<T>\\n\\tcompleteChat<T>(toPrompt: (args: T) => Prompt, args: T): BasicPrompt<T>\\n\\tcompleteChat<T = undefined>(toPrompt: (args?: T) => Prompt, args?: T): BasicPrompt<T>\\n\\tcompleteChat<T = undefined>(\\n\\t\\ttoPrompt: (args?: T) => Prompt,\\n\\t\\targs?: T,\\n\\t): BasicPrompt<T> {\\n\\t\\treturn new BasicPrompt<T>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\ttoPrompt,\\n\\t\\t\\targs as T,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t\\tundefined,\\n\\t\\t)\\n\\t}\\n}\\n\\nclass BasicPrompt<PSArgs> implements AsyncGenerator<string>, Promise<string> {\\n\\tprivate readonly generator: AsyncGenerator<string>\\n\\tprivate promptName?: string;\\n\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate promptSupplier: (args: PSArgs) => Prompt,\\n\\t\\tprivate promptSupplierArgs: PSArgs,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t\\tprivate _temperature: number | undefined,\\n\\t\\tprivate _topP: number | undefined,\\n\\t\\tprivate _model: AiModelId | undefined,\\n\\t) {\\n\\t\\tconst self = this;\\n\\t\\tthis.generator = (async function* () {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\tself.aiClient,\\n\\t\\t\\t\\t_model,\\n\\t\\t\\t\\tself.promptSupplier(self.promptSupplierArgs),\\n\\t\\t\\t\\tfalse,\\n\\t\\t\\t\\tself.promptName,\\n\\t\\t\\t\\t_temperature,\\n\\t\\t\\t\\t_topP,\\n\\t\\t\\t\\tcallingCodeLine,\\n\\t\\t\\t)\\n\\t\\t})()\\n\\t}\\n\\n\\tpublic name(name: string): this {\\n\\t\\tthis.promptName = name;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tpublic model(model: AiModelId): this {\\n\\t\\tthis._model = model;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * What sampling temperature to use, between 0 and 2.\\n\\t * Higher values like 0.8 will make the output more random,\\n\\t * while lower values like 0.2 will make it more focused\\n\\t * and deterministic.\\n\\t * We generally recommend altering this or <b>topP</b> but not both.\\n\\t */\\n\\tpublic temperature(temperature: number): this {\\n\\t\\tthis._temperature = temperature;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * An alternative to sampling with temperature, called nucleus\\n\\t * sampling, where the model considers the results of the\\n\\t * tokens with top_p probability mass.\\n\\t * So 0.1 means only the tokens comprising the top 10%\\n\\t * probability mass are considered.\\n\\t *\\n\\t * We generally recommend altering this or <b>temperature</b>\\n\\t * but not both.\\n\\t */\\n\\tpublic topP(topP: number): this {\\n\\t\\tthis._topP = topP;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t// Methods for the generator interface\\n\\n\\tnext(...[value]: [] | [any]): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.next(value)\\n\\t}\\n\\n\\treturn(value: any): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.return(value)\\n\\t}\\n\\n\\tthrow(e: any): Promise<IteratorResult<string, any>> {\\n\\t\\treturn this.generator.throw(e)\\n\\t}\\n\\n\\t[Symbol.asyncIterator](): AsyncGenerator<string, any, any> {\\n\\t\\treturn this\\n\\t}\\n\\n\\t// Methods for the Promise interface\\n\\n\\tasync then<TResult1 = string, TResult2 = never>(\\n\\t\\tonfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null | undefined,\\n\\t\\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined\\n\\t): Promise<TResult1 | TResult2> {\\n\\t\\ttry {\\n\\t\\t\\tconst result = await this.getResponseAsString()\\n\\t\\t\\treturn nonNullish(onfulfilled)\\n\\t\\t\\t\\t? await onfulfilled(result)\\n\\t\\t\\t\\t: result as TResult1\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn await onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync catch<TResult = never>(\\n\\t\\tonrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined\\n\\t): Promise<string | TResult> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponseAsString()\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync finally(onfinally?: (() => void) | null | undefined): Promise<string> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponseAsString()\\n\\t\\t} finally {\\n\\t\\t\\tonfinally?.()\\n\\t\\t}\\n\\t}\\n\\n\\tget [Symbol.toStringTag](): string {\\n\\t\\treturn 'BasicPrompt'\\n\\t}\\n\\n\\t// Other methods\\n\\tpublic to<Json extends AnyJson = AnyJson>(type: (value: EmptyTypeSpec<unknown>) => TypeSpec<Json>) {\\n\\t\\treturn new JsonPrompt<PSArgs, Json>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\tthis.promptSupplier,\\n\\t\\t\\tthis.promptSupplierArgs,\\n\\t\\t\\ttype,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tthis.promptName,\\n\\t\\t\\tthis._temperature,\\n\\t\\t\\tthis._topP,\\n\\t\\t\\tthis._model,\\n\\t\\t)\\n\\t}\\n\\n\\tpublic toJson() {\\n\\t\\treturn new JsonPrompt<PSArgs, AnyJson>(\\n\\t\\t\\tthis.aiClient,\\n\\t\\t\\tthis.promptSupplier,\\n\\t\\t\\tthis.promptSupplierArgs,\\n\\t\\t\\tundefined,\\n\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\tthis.promptName,\\n\\t\\t\\tthis._temperature,\\n\\t\\t\\tthis._topP,\\n\\t\\t\\tthis._model,\\n\\t\\t)\\n\\t}\\n\\n\\tprivate async getResponseAsString(): Promise<string> {\\n\\t\\tlet result = ''\\n\\t\\tfor await (const chunk of this) {\\n\\t\\t\\tresult += chunk\\n\\t\\t}\\n\\t\\treturn result\\n\\t}\\n}\\n\\ntype JsonObject = {[key: string]: AnyJson}\\n\\ntype JsonArray = AnyJson[]\\n\\ntype AnyJson = string | null | boolean | number | JsonArray | JsonObject\\n\\nclass JsonPrompt<PSArgs, Json extends AnyJson = AnyJson> extends StreamedJsonChildElement implements AsyncGenerator<AnyJson>, Promise<Json> {\\n\\tprivate readonly stringGenerator: AsyncGenerator<string>\\n\\tprivate readonly partialJsonGenerator: AsyncGenerator<AnyJson>\\n\\n\\tconstructor(\\n\\t\\tprivate aiClient: AIClient,\\n\\t\\tprivate promptSupplier: (args: PSArgs) => Prompt,\\n\\t\\tprivate promptSupplierArgs: PSArgs,\\n\\t\\tprivate jsonTypeSupplier: ((value: EmptyTypeSpec<unknown>) => TypeSpec<Json>) | undefined,\\n\\t\\tprivate callingCodeLine: CodeLine,\\n\\t\\tprivate promptName: string | undefined,\\n\\t\\tprivate _temperature: number | undefined,\\n\\t\\tprivate _topP: number | undefined,\\n\\t\\tprivate _model: AiModelId | undefined,\\n\\t) {\\n\\t\\tconst generator = (async function*() {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\taiClient,\\n\\t\\t\\t\\t_model,\\n\\t\\t\\t\\tpromptSupplier(promptSupplierArgs),\\n\\t\\t\\t\\tjsonTypeSupplier !== undefined\\n\\t\\t\\t\\t\\t? jsonTypeSupplier(specType(undefined as unknown))\\n\\t\\t\\t\\t\\t: true,\\n\\t\\t\\t\\tpromptName,\\n\\t\\t\\t\\t_temperature,\\n\\t\\t\\t\\t_topP,\\n\\t\\t\\t\\tcallingCodeLine,\\n\\t\\t\\t)\\n\\t\\t})()\\n\\t\\tconst flux = Flux.fromGenerator(generator)\\n\\t\\tconst jsonTokenFlux = new JsonTokenProcessor().processDataBuffer(flux)\\n\\t\\tsuper()\\n\\t\\tconst thiss = this\\n\\t\\tconst streamingJsonRootElement = new StreamedJsonParser().parse(jsonTokenFlux)\\n\\t\\tif (jsonTypeSupplier !== undefined) {\\n\\t\\t\\tstreamingJsonRootElement\\n\\t\\t\\t\\t.onProperty(\\\"result\\\", result => result\\n\\t\\t\\t\\t\\t.onEachExcerpt(e => {\\n\\t\\t\\t\\t\\t\\tif (e.token !== undefined) {\\n\\t\\t\\t\\t\\t\\t\\tthis.push(e)\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t})\\n\\t\\t\\t\\t)\\n\\t\\t} else {\\n\\t\\t\\tstreamingJsonRootElement\\n\\t\\t\\t\\t.onEachExcerpt(e => {\\n\\t\\t\\t\\t\\tif (e.token !== undefined) {\\n\\t\\t\\t\\t\\t\\tthis.push(e)\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t})\\n\\t\\t}\\n\\t\\tthis.stringGenerator = (async function*() {\\n\\t\\t\\tfor await (const jsonExcerpt of jsonTokenFlux) {\\n\\t\\t\\t\\tif (jsonExcerpt.token !== undefined) {\\n\\t\\t\\t\\t\\tstreamingJsonRootElement.push(jsonExcerpt)\\n\\t\\t\\t\\t} else if (jsonExcerpt.source !== undefined) {\\n\\t\\t\\t\\t\\tyield jsonExcerpt.source\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t\\tthis.partialJsonGenerator = (async function*() {\\n\\t\\t\\tlet accumulatedJson = ''\\n\\t\\t\\tfor await (const chunk of thiss.stringGenerator) {\\n\\t\\t\\t\\taccumulatedJson += chunk\\n\\t\\t\\t\\tconst partialJson = parsePartialJson<any>(accumulatedJson)\\n\\t\\t\\t\\tyield jsonTypeSupplier !== undefined\\n\\t\\t\\t\\t\\t? (partialJson as any)['result']\\n\\t\\t\\t\\t\\t: partialJson\\n\\t\\t\\t}\\n\\t\\t})()\\n\\t}\\n\\n\\t// Methods for the generator interface\\n\\n\\tnext(...[value]: [] | [any]): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.next(value)\\n\\t}\\n\\n\\treturn(value: any): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.return(value)\\n\\t}\\n\\n\\tthrow(e: any): Promise<IteratorResult<AnyJson, any>> {\\n\\t\\treturn this.partialJsonGenerator.throw(e)\\n\\t}\\n\\n\\t[Symbol.asyncIterator](): AsyncGenerator<AnyJson, any, any> {\\n\\t\\treturn this.partialJsonGenerator\\n\\t}\\n\\n\\t// Methods for the Promise interface\\n\\n\\tasync then<TResult1 = Json, TResult2 = never>(\\n\\t\\tonfulfilled?: ((value: Json) => TResult1 | PromiseLike<TResult1>) | null | undefined,\\n\\t\\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined\\n\\t): Promise<TResult1 | TResult2> {\\n\\t\\ttry {\\n\\t\\t\\tconst result = await this.getResponse()\\n\\t\\t\\treturn nonNullish(onfulfilled)\\n\\t\\t\\t\\t? await onfulfilled(result)\\n\\t\\t\\t\\t: result as unknown as TResult1\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn await onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync catch<TResult = never>(\\n\\t\\tonrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined\\n\\t): Promise<Json | TResult> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponse()\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (nonNullish(onrejected)) {\\n\\t\\t\\t\\treturn onrejected(e)\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthrow e\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tasync finally(onfinally?: (() => void) | null | undefined): Promise<Json> {\\n\\t\\ttry {\\n\\t\\t\\treturn await this.getResponse()\\n\\t\\t} finally {\\n\\t\\t\\tonfinally?.()\\n\\t\\t}\\n\\t}\\n\\n\\tget [Symbol.toStringTag](): string {\\n\\t\\treturn 'BasicPrompt'\\n\\t}\\n\\n\\t// Other methods\\n\\n\\tpublic name(name: string): this {\\n\\t\\tthis.promptName = name;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tpublic model(model: AiModelId): this {\\n\\t\\tthis._model = model;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * What sampling temperature to use, between 0 and 2.\\n\\t * Higher values like 0.8 will make the output more random,\\n\\t * while lower values like 0.2 will make it more focused\\n\\t * and deterministic.\\n\\t * We generally recommend altering this or <b>topP</b> but not both.\\n\\t */\\n\\tpublic temperature(temperature: number): this {\\n\\t\\tthis._temperature = temperature;\\n\\t\\treturn this;\\n\\t}\\n\\n\\t/**\\n\\t * An alternative to sampling with temperature, called nucleus\\n\\t * sampling, where the model considers the results of the\\n\\t * tokens with top_p probability mass.\\n\\t * So 0.1 means only the tokens comprising the top 10%\\n\\t * probability mass are considered.\\n\\t *\\n\\t * We generally recommend altering this or <b>temperature</b>\\n\\t * but not both.\\n\\t */\\n\\tpublic topP(topP: number): this {\\n\\t\\tthis._topP = topP;\\n\\t\\treturn this;\\n\\t}\\n\\n\\tprivate async getResponse(): Promise<Json> {\\n\\t\\tconst stringResult = await this.getResponseAsString()\\n\\t\\tconst jsonTypeSupplier = this.jsonTypeSupplier\\n\\t\\tconst uncheckedPackedResult = parseJsonWithUsefulError(stringResult)\\n\\t\\tconst uncheckedResult = jsonTypeSupplier !== undefined\\n\\t\\t\\t? uncheckedPackedResult?.result\\n\\t\\t\\t: uncheckedPackedResult\\n\\t\\tif (jsonTypeSupplier === undefined) {\\n\\t\\t\\treturn uncheckedResult as Json\\n\\t\\t}\\n\\t\\treturn assertType(\\n\\t\\t\\tuncheckedResult,\\n\\t\\t\\tjsonTypeSupplier(specType(uncheckedResult))\\n\\t\\t)\\n\\t}\\n\\n\\tprivate async getResponseAsString(): Promise<string> {\\n\\t\\tlet result = ''\\n\\t\\tfor await (const chunk of this.stringGenerator) {\\n\\t\\t\\tresult += chunk\\n\\t\\t}\\n\\t\\treturn result\\n\\t}\\n}\\n\\nfunction pickModel(modelId?: AiModelId): AiModelId {\\n\\treturn modelId ?? 'gpt-4o'\\n}\\n\\nfunction toGenericPrompt(prompt: string | Message | Message[]): GenericPrompt {\\n\\tconst toOpenAiMessage = (msg: Message): PromptMessage => ({\\n\\t\\trole: msg.user !== undefined ? 'user' : (msg.system !== undefined ? 'system' : 'assistant'),\\n\\t\\tcontent: requireDefined(msg.user ?? msg.system ?? msg.assistant),\\n\\t})\\n\\tif (typeof prompt === 'string') {\\n\\t\\treturn [{role: 'user' as const, content: prompt}]\\n\\t} else if (!Array.isArray(prompt)) {\\n\\t\\treturn [toOpenAiMessage(prompt)]\\n\\t} else {\\n\\t\\treturn prompt.map(toOpenAiMessage)\\n\\t}\\n}\\n\\nasync function* executeLlmCall(\\n\\taiClient: AIClient,\\n\\tmodel: AiModelId | undefined,\\n\\tprompt: Prompt,\\n\\tjson: boolean | TypeSpec<any>,\\n\\tpromptName: string | undefined,\\n\\ttemperature: number | undefined,\\n\\ttopP: number | undefined,\\n\\tcallingCodeLine: CodeLine,\\n) {\\n\\tconst apiToken = requireThat(await aiClient['apiKeys']!.openai).canBeString().andNothingElse({errorMessage: 'No OpenAI access token set'})\\n\\tconst genericPrompt = toGenericPrompt(prompt)\\n\\tconst genericPromptWithJsonSpec = (() => {\\n\\t\\tif (!json) {\\n\\t\\t\\treturn genericPrompt\\n\\t\\t}\\n\\t\\treturn [\\n\\t\\t\\t...genericPrompt,\\n\\t\\t\\t{\\n\\t\\t\\t\\trole: 'system' as const,\\n\\t\\t\\t\\tcontent: jsonSpec(model, json)\\n\\t\\t\\t}\\n\\t\\t]\\n\\t})()\\n\\n\\t// Find the relevant call in the stack trace (we need to skip internal calls)\\n\\t// Typically this would be the first line after the executeLlmCall and other internal functions\\n\\tconst {\\n\\t\\tfileName: promptFilename,\\n\\t\\tlineNumber: promptLineNumber,\\n\\t} = callingCodeLine\\n\\n\\t// Check if multiple promptLineNumbers exist for this filename\\n\\tif (promptFilename && promptLineNumber !== undefined) {\\n\\t\\tconst matchingPrompts = Array.from(promptMappings.keys())\\n\\t\\t\\t.filter(key => key.startsWith(`${promptFilename}:`))\\n\\t\\t\\t.map(key => parseInt(key.split(':')![1]!, 10));\\n\\n\\t\\t// If there are multiple prompts for the same file, throw an error\\n\\t\\tif (matchingPrompts.length > 1 && !promptName) {\\n\\t\\t\\tthrow new Error(`Multiple prompts found in ${promptFilename}. Please specify a name using .name() method.`);\\n\\t\\t}\\n\\t}\\n\\n\\tconst promptProfile = {id: promptName, callingCodeLine}\\n\\n\\t// Create a unique conversation ID\\n\\tconst conversationUuid = randomUuid()\\n\\n\\tconst saveConv = (conversationData: ConversationData) => {\\n\\t\\tsaveConversation(\\n\\t\\t\\tconversationData,\\n\\t\\t\\taiClient['apiKeys']!.promptgrid\\n\\t\\t).then()\\n\\t}\\n\\n\\t// Send the conversation start and messages to PromptGrid\\n\\tsaveConv({\\n\\t\\tconversationUuid,\\n\\t\\tprompt: promptProfile,\\n\\t\\tmessages: genericPromptWithJsonSpec\\n\\t\\t\\t.map(message => ({\\n\\t\\t\\t\\tmessageUuid: randomUuid(),\\n\\t\\t\\t\\trole: message.role,\\n\\t\\t\\t\\tcontent: message.content || \\\"\\\"\\n\\t\\t\\t})),\\n\\t});\\n\\n\\t// Now add an 'assistant' message that will be updated as the response streams in\\n\\tconst responseMessageId = randomUuid()\\n\\tsaveConv({\\n\\t\\tconversationUuid: conversationUuid,\\n\\t\\tprompt: promptProfile,\\n\\t\\tmessages: [\\n\\t\\t\\t{\\n\\t\\t\\t\\tmessageUuid: responseMessageId,\\n\\t\\t\\t\\trole: 'assistant',\\n\\t\\t\\t\\tcontent: '' // Start with empty content that will be updated\\n\\t\\t\\t}\\n\\t\\t]\\n\\t});\\n\\n\\t// Get the response stream\\n\\tconst flux = promptOpenai(\\n\\t\\t{\\n\\t\\t\\tmodel: pickModel(model),\\n\\t\\t\\tprompt: genericPromptWithJsonSpec,\\n\\t\\t\\tapiToken,\\n\\t\\t\\ttemperature,\\n\\t\\t\\ttopP,\\n\\t\\t\\trequireJsonResponse: json !== false\\n\\t\\t}\\n\\t)\\n\\n\\t// Accumulate the response for sending updates\\n\\tlet accumulatedContent = \\\"\\\";\\n\\n\\tyield* flux\\n\\t\\t.doOnEach(chunk => {\\n\\t\\t\\t// Update the accumulated response\\n\\t\\t\\taccumulatedContent += chunk\\n\\n\\t\\t\\t// Send the updated content to PromptGrid\\n\\t\\t\\tsaveConv({\\n\\t\\t\\t\\tconversationUuid,\\n\\t\\t\\t\\tprompt: promptProfile,\\n\\t\\t\\t\\tmessages: [{\\n\\t\\t\\t\\t\\tmessageUuid: responseMessageId,\\n\\t\\t\\t\\t\\trole: 'assistant',\\n\\t\\t\\t\\t\\tcontent: accumulatedContent,\\n\\t\\t\\t\\t}]\\n\\t\\t\\t})\\n\\t\\t})\\n}\\n\\nfunction jsonSpec(\\n\\tmodel: AiModelId | undefined,\\n\\tjson: true | TypeSpec<any>,\\n): string {\\n\\tswitch (model) {\\n\\t\\tdefault: {\\n\\t\\t\\tif (json === true) {\\n\\t\\t\\t\\treturn 'Respond with JSON'\\n\\t\\t\\t}\\n\\t\\t\\tconst propSpec = (json as TypeSpec<any>)\\n\\t\\t\\tconst jsonInPrompt = new EmptyTypeSpec([], undefined as unknown)\\n\\t\\t\\t\\t.object(o => o\\n\\t\\t\\t\\t\\t.has('result', () => new FullPropTypeSpec(propSpec['type'], propSpec['value']))\\n\\t\\t\\t\\t)\\n\\t\\t\\treturn `Respond with JSON matching the following type spec (note: everything is nonnullable unless explicitly stated otherwise):\\\\n${describeType(jsonInPrompt)}`\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction doPromptLLM<T>(\\n\\taiClient: AIClient,\\n\\targs: T,\\n\\ttoPrompt: (args: T) => Prompt,\\n\\targ3?: boolean | Opts,\\n\\targ4?: Opts,\\n): Flux<string> | StreamedJsonRootElement {\\n\\tconst json = typeof arg3 === 'object' ? false : (arg3 ?? false)\\n\\tconst opts = typeof arg3 === 'object' ? arg3 : (arg4 ?? {model: 'gpt-4o'})\\n\\tconst flux = Flux.fromGeneratorFunction(async function* () {\\n\\t\\tconsole.log('args', JSON.stringify(args))\\n\\t\\tconsole.log('promptSupplier', toPrompt.toString())\\n\\t\\tconst {model} = opts\\n\\t\\tconst prompt = toPrompt(args)\\n\\t\\tif (model === 'gpt-4o') {\\n\\t\\t\\tyield* await executeLlmCall(\\n\\t\\t\\t\\taiClient,\\n\\t\\t\\t\\tmodel,\\n\\t\\t\\t\\tprompt,\\n\\t\\t\\t\\tjson,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tundefined,\\n\\t\\t\\t\\tgetCallerFileNameAndLineNumber(),\\n\\t\\t\\t)\\n\\t\\t} else {\\n\\t\\t\\tthrow new ModelNotSupportedError(`Model ${model} not supported`)\\n\\t\\t}\\n\\t})\\n\\tif (!json) {\\n\\t\\treturn flux\\n\\t}\\n\\tconst jsonTokenFlux = JsonTokenProcessor.toJsonTokenFlux(flux)\\n\\treturn new StreamedJsonParser().parse(jsonTokenFlux)\\n}\\n\\nexport class NoAiCredientialsError extends Error {}\\n\\nexport class ModelNotSupportedError extends Error {}\\n\\nexport type { JsonExcerpt } from './json-streaming/JsonExcerpt.js'\\nexport type { StreamedJsonElement } from './json-streaming/StreamedJsonElement.js'\\nexport type { Token, TokenType } from './json-streaming/types.js'\\nexport {\\n\\tBaseType,\\n\\tTypeType,\\n\\tNullType,\\n\\tBooleanType,\\n\\tStringType,\\n\\tNumberType,\\n\\tObjectType,\\n\\tArrayType,\\n\\tConstantType,\\n\\tEmptyTypeSpec,\\n\\tTypeSpec,\\n\\tFullTypeSpec,\\n\\tCombine,\\n\\tTypeMemberSpec,\\n\\tFullPropTypeSpec,\\n\\tType,\\n\\tEmptyPropTypeSpec,\\n\\tPropTypeSpec,\\n\\tUndefinedType,\\n} from './type-spec/type-spec.js'\\nexport { AIClient, BasicPrompt, JsonPrompt, PromptBase, StreamedJsonChildElement, StreamedJsonRootElement }\\nexport type { ApiKeys as AccessTokens, AnyJson, AssistantMessage, HandshakeData, JsonArray, JsonObject, Message, Opts, Prompt, SystemMessage, UserMessage }\\nexport { AiModelId } from './ai-inference/AiModelId.js'\\n\\nexport type CodeLine = {\\n\\tstacktraceFrame: string\\n\\tfileName: string\\n\\tlineNumber: number\\n\\tfunctionName?: string\\n}\\n\\nexport function getCallerFileNameAndLineNumber(): CodeLine {\\n\\tconst error = new Error()\\n\\tconst stacktrace = error.stack ?? ''\\n\\tconst stack = stacktrace\\n\\t\\t.split('\\\\n')\\n\\t\\t.map(l => l.trim())\\n\\t\\t.filter(l => l.startsWith('at '))\\n\\tconst frame = stack[2]!\\n\\tconst hasFunctionNameInFrameWithFileNameInParenthesis = frame.match(/[^(]+\\\\([^)]+\\\\)/)\\n\\tconst {\\n\\t\\tfunctionName,\\n\\t\\tfileName,\\n\\t\\tlineNumber,\\n\\t} = hasFunctionNameInFrameWithFileNameInParenthesis\\n\\t\\t? frame.match('at (?<functionName>[^(]*) \\\\((?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)\\\\)')!.groups!\\n\\t\\t: frame.match('at (?<scheme>.*://)?(?<fileName>[^:]*):(?<lineNumber>[0-9]+):(?<colNumber>[0-9]+)')!.groups!\\n\\treturn {\\n\\t\\tstacktraceFrame: requireThat(frame).canBeString().andNothingElse(),\\n\\t\\tfileName: requireThat(fileName).canBeString().andNothingElse(),\\n\\t\\tlineNumber: requireThat(parseInt(lineNumber!)).canBeNumber().andNothingElse(),\\n\\t\\tfunctionName: requireThat(functionName).canBeString().canBeUndefined().andNothingElse(),\\n\\t}\\n}\\n\\n// Define a type for conversation data\\ninterface ConversationData {\\n\\tconversationUuid: string\\n\\tprompt: {\\n\\t\\tid: string | undefined\\n\\t\\tcallingCodeLine: CodeLine\\n\\t}\\n\\tmessages: Array<{\\n\\t\\tmessageUuid: string\\n\\t\\trole: string\\n\\t\\tcontent: string\\n\\t}>\\n}\\n\\n// Function to save conversation using HTTP PUT\\nasync function saveConversation(\\n\\tconversationData: ConversationData,\\n\\tapiKey: string | undefined,\\n) {\\n\\ttry {\\n\\t\\tif (apiKey === undefined) {\\n\\t\\t\\treturn\\n\\t\\t}\\n\\t\\tconst response = await fetch(`${getPromptGridApiUrl()}/api/conversations`, {\\n\\t\\t\\tmethod: 'PUT',\\n\\t\\t\\theaders: {\\n\\t\\t\\t\\t'Content-Type': 'application/json',\\n\\t\\t\\t\\t'Authorization': `Bearer ${apiKey}`\\n\\t\\t\\t},\\n\\t\\t\\tbody: JSON.stringify(conversationData),\\n\\t\\t});\\n\\n\\t\\tif (!response.ok) {\\n\\t\\t\\tthrow new Error(`Got ${response.status} when attempting to save conversation, with body: ${await response.text()}`);\\n\\t\\t}\\n\\t} catch (error) {\\n\\t\\tconsole.error('Error saving conversation', error);\\n\\t}\\n}\\n\\n\",\"import {PlatformSpecificPromptRequest} from '../model.js'\\nimport {Flux} from 'monoflux'\\n\\nfunction errorMessage(bodyText: string) {\\n try {\\n const body = JSON.parse(bodyText) as {error: {message: string}}\\n return body.error.message\\n } catch (e) {\\n return bodyText\\n }\\n}\\n\\nexport function promptOpenai(\\n {\\n model,\\n prompt,\\n apiToken,\\n temperature,\\n topP,\\n requireJsonResponse,\\n }: PlatformSpecificPromptRequest<boolean>\\n): Flux<string> {\\n return Flux.fromGeneratorFunction(async function* () {\\n const abortController = new AbortController()\\n const response = await fetch(\\n `https://api.openai.com/v1/chat/completions`,\\n {\\n headers: {\\n 'Content-Type': 'application/json',\\n 'Accept': 'application/json',\\n 'Authorization': `Bearer ${apiToken}`\\n },\\n method: 'POST',\\n signal: abortController.signal,\\n body: JSON.stringify({\\n model,\\n messages: prompt,\\n stream: true,\\n temperature,\\n top_p: topP,\\n response_format: requireJsonResponse ? {\\n type: 'json_object'\\n } : undefined,\\n } satisfies OpenAiRequestBody),\\n }\\n )\\n if (response.status < 200 || response.status >= 300) {\\n const message = errorMessage(await response.text())\\n throw new Error(`OpenAPI reported: ${message}`)\\n }\\n if (response.body === null) {\\n throw new Error('illegal state')\\n }\\n let jsonBuffer = ''\\n yield* Flux\\n .fromReadableStream(response.body, () => abortController.abort())\\n .map(value => textDecoder.decode(value, {stream: true}))\\n .flatMap(value =>\\n value\\n .replaceAll('data: [DONE]', '')\\n .replace(/^data: / , '')\\n .split('data: ')\\n )\\n .map(\\n value => value\\n .replace(/[\\\\n ]*$/, '')\\n .trim()\\n )\\n .flatMap(value => {\\n jsonBuffer += value\\n try {\\n const json = JSON.parse(jsonBuffer) as ChatCompletionChunk\\n jsonBuffer = ''\\n return [json]\\n } catch (e) {\\n console.error(`Received partial json chunk: ${value}`)\\n return [] as ChatCompletionChunk[]\\n }\\n })\\n .map(chunk => chunk.choices[0]!)\\n .untilExcl(choice => choice.finish_reason !== null && choice.finish_reason !== undefined)\\n .map(choice => choice.delta.content)\\n .filter<string>(segment => segment !== undefined)\\n })\\n}\\n\\nconst textDecoder = new TextDecoder()\\n\\ntype OpenAiRequestBody = {\\n model: 'gpt-4o' | 'o3'\\n messages: {\\n role: 'developer' | 'system' | 'user' | 'assistant' | 'tool'\\n content: string | string[]\\n }[]\\n stream: boolean\\n temperature?: number\\n top_p?: number\\n response_format?: {\\n type: 'json_object' | 'text'\\n }\\n}\\n\\ntype ChatCompletionChunk = {\\n id: string\\n choices: {\\n id: number\\n delta: {\\n refusal?: string\\n content?: string\\n role?: string\\n }\\n finish_reason?: string\\n }[]\\n}\\n\",\"export type Combine<Current, New> = unknown extends Current\\n ? New\\n : (Current & New) extends never\\n ? Current | New\\n : (Current & New)\\n\\ntype Simplify<T> = {\\n [K in keyof T]: Simplify<T[K]>\\n}\\n\\nexport type Opts = {\\n ignoreUnknownProps?: boolean\\n logValueIfWrong?: boolean\\n errorMessage?: string\\n}\\n\\ntype Problem = {\\n path: string\\n expectedType?: Type[]\\n expectedProp?: string\\n value: unknown\\n unknownProp?: string\\n}\\n\\nclass ComplexTypeError extends Error {\\n public readonly data: any\\n public readonly httpStatus = 400\\n\\n constructor(problems: Problem[], message?: string) {\\n const data = problems\\n .map(problem => {\\n if (problem.expectedProp) {\\n return {\\n expectedProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.expectedProp\\n }\\n } else if (problem.expectedType) {\\n return {\\n expectedType: problem.expectedType.map(typeToString).join(' | '),\\n path: problem.path,\\n insteadGot: problem.value\\n }\\n } else if (problem.unknownProp) {\\n return {\\n unknownProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.unknownProp\\n }\\n } else {\\n throw new Error('illegal state')\\n }\\n })\\n super(message ?? `Value is of the wrong format: ${JSON.stringify(data, null, 2)}`)\\n this.data = data\\n }\\n}\\n\\n/**\\n * Way to assert the shape of a type both in runtime and in the\\n * type system.\\n *\\n * Usage example:\\n *\\n * ```typescript\\n * const inputValue = ['foo', 'bar'] as unknown\\n *\\n * assert(\\n * inputValue,\\n * t => t\\n * .canBeArray(t => t\\n * .canBeObject(t => t\\n * .canHaveString('foo')\\n * .canHaveString('bar')\\n * )\\n * )\\n * )\\n *\\n * let safeInputvalue = inputValue\\n *\\n * safeInputvalue = [{}] // typescript disapproves\\n * safeInputvalue = [{foo: 'bla', bar: 'bla'}] // typescript approves\\n * ```\\n */\\nexport function requireThat(\\n value: unknown\\n): TypeSpec<unknown> {\\n return new TypeSpec<unknown>([], value)\\n}\\n\\nfunction checkIsOneOf(value: unknown, types: Type[], path: string, opts: Opts): Problem[] {\\n const problemsPerType = types\\n .map(type => checkIs(value, type, path, opts))\\n if (problemsPerType.some(list => list.length === 0)) {\\n return []\\n } else {\\n const typeProblemsOnThisPath = problemsPerType\\n .flatMap(list => list.filter(t => t.expectedType !== undefined && t.path === path))\\n if (typeProblemsOnThisPath.length > 0) {\\n return [{\\n expectedType: typeProblemsOnThisPath\\n .flatMap(problem => problem.expectedType!),\\n path,\\n value\\n }]\\n }\\n return problemsPerType.flatMap(list => list)\\n }\\n}\\n\\nfunction checkIs(value: unknown, type: Type, path: string, opts: Opts): Problem[] {\\n const {ignoreUnknownProps = true} = opts\\n switch (type.type) {\\n case 'array': {\\n if (!Array.isArray(value)) {\\n return [{expectedType: [type], path, value}]\\n }\\n if (value.length === 0) {\\n return []\\n }\\n return checkIsOneOf(value[0], type.elementType, path + '[..]', opts)\\n }\\n case 'boolean': {\\n if (typeof value !== 'boolean') {\\n return [{expectedType: [type], path, value}]\\n }\\n return []\\n }\\n case 'undefined': {\\n return value === undefined\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'object': {\\n if (typeof value !== 'object' || value === null) {\\n return [{expectedType: [type], path, value}]\\n }\\n const problems: Problem[] = []\\n for (const key in type.props) {\\n const prop = type.props[key]!\\n if (!(key in value)) {\\n if (!prop.optional) {\\n problems.push({expectedProp: key, path, value})\\n }\\n continue\\n }\\n const typeAccountingOptionality: Type[] = prop.optional\\n ? [...prop.type, {type: 'undefined'}]\\n : prop.type\\n problems.push(...checkIsOneOf(value[key as keyof typeof value], typeAccountingOptionality, path + `.${key}`, opts))\\n }\\n if (!ignoreUnknownProps) {\\n for (const key in value) {\\n if (!(key in type.props)) {\\n problems.push({unknownProp: key, path, value})\\n }\\n }\\n }\\n return problems\\n }\\n case 'string': {\\n return typeof value === 'string'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'null': {\\n return value === null\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'number': {\\n return typeof value === 'number'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'constant': {\\n return value === type.value && !Number.isNaN(value)\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n }\\n}\\n\\nexport class TypeSpec<T> {\\n public readonly type: Type[]\\n private readonly value: unknown\\n\\n constructor(type: Type[] = [], value: unknown) {\\n this.type = type\\n this.value = value\\n }\\n\\n canBeArray<T_arr = unknown>(assertTypeOfArray: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = assertTypeOfArray(new TypeSpec<unknown>([], this.value))\\n const arraySpec = new TypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec.type}],\\n this.value\\n )\\n return new TypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec.type], this.value)\\n }\\n\\n canBeObject<T_obj extends {}>(assertTypeOfObject: (arg: TypeSpec<{}>) => TypeSpec<T_obj>) {\\n const objectSpec = assertTypeOfObject(new TypeSpec([{type: 'object', props: {}}], this.value))\\n return new TypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec.type], this.value)\\n }\\n\\n hasString<Key extends string>(propertyName: Key): TypeSpec<Combine<T, Record<Key, string>>> {\\n return this.hasProperty(\\n propertyName,\\n type => type.canBeString()\\n )\\n }\\n\\n canHaveProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop | undefined>\\n ): TypeSpec<Combine<T, Partial<Record<Key, T_prop>>>> {\\n return this.hasProperty(propertyName, assertTypeOfProperty, true)\\n }\\n\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional: false\\n ): TypeSpec<Combine<T, Partial<Record<Key, T_prop>>>>\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional?: boolean\\n ): TypeSpec<Combine<T, Record<Key, T_prop>>>\\n hasProperty<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: TypeSpec<unknown>) => TypeSpec<T_prop>,\\n optional = false\\n ): TypeSpec<Combine<T, Record<Key, T_prop> | Partial<Record<Key, T_prop>>>> {\\n const old = this.type.length === 1\\n ? this.type[0]!\\n : undefined\\n if (old === undefined || old.type !== 'object') {\\n throw new Error('illegal state')\\n }\\n const {type: propertyType} = assertTypeOfProperty(new TypeSpec([], this.value))\\n return new TypeSpec<Combine<T, Record<Key, T_prop>>>([{\\n ...old,\\n props: {\\n ...old.props,\\n [propertyName]: {\\n optional,\\n type: propertyType\\n }\\n }\\n }], this.value)\\n }\\n\\n canBeString() {\\n return new TypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n canBeNumber() {\\n return new TypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n canBeBoolean() {\\n return new TypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n canBeConstant<Value extends (string | number | boolean)>(value: Value) {\\n return new TypeSpec<Combine<T, Value>>([...this.type, {type: 'constant', value}], this.value)\\n }\\n\\n canBeNull(): TypeSpec<Combine<T, null>> {\\n return new TypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n canBeUndefined(): TypeSpec<Combine<T, undefined>> {\\n return new TypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n\\n public andNothingElse(\\n opts: Opts = {}\\n ): T {\\n const problems = checkIsOneOf(this.value, this.type, 'root', opts)\\n if (problems.length > 0) {\\n throw new ComplexTypeError(problems, opts.errorMessage)\\n }\\n return this.value as T\\n }\\n\\n public orDefaultTo<Value>(\\n value: Value,\\n opts: Opts = {}\\n ): T | Value {\\n const problems = checkIsOneOf(this.value, this.type, 'root', opts)\\n if (problems.length > 0) {\\n return value\\n }\\n return this.value as T\\n }\\n\\n public describe(): string {\\n return describe(this.type)\\n }\\n}\\n\\nfunction describe(type: Type | Type[], indentLevel = 0): string {\\n if (Array.isArray(type)) {\\n return type.map(t => describe(t, indentLevel)).join(' | ')\\n }\\n switch (type.type) {\\n case 'array': {\\n return `${describe(type.elementType, indentLevel)}[]`\\n }\\n case 'boolean': {\\n return 'boolean'\\n }\\n case 'undefined': {\\n return 'undefined'\\n }\\n case 'object': {\\n return `{\\\\n`\\n +\\n Object.keys(type.props).map(\\n key => `${indent(indentLevel + 1)}${key}: ${describe(type.props[key]!.type, indentLevel + 1)}`\\n ).join(',\\\\n')\\n + `\\\\n${indent(indentLevel)}}`\\n }\\n case 'string': {\\n return 'string'\\n }\\n case 'null': {\\n return 'null'\\n }\\n case 'number': {\\n return 'number'\\n }\\n case 'constant': {\\n return `\\\"${type.value}\\\"`\\n }\\n }\\n}\\n\\nfunction indent(depth: number) {\\n let indent = ''\\n for (let i = 0; i < depth; i++) {\\n indent += ' '\\n }\\n return indent\\n}\\n\\nexport type TypeType = 'undefined' | 'null' | 'boolean' | 'string' | 'number' | 'object' | 'array' | 'constant'\\n\\nexport type BaseType<TT extends TypeType> = {\\n type: TT\\n}\\n\\nexport type UndefinedType = BaseType<'undefined'>\\nexport type NullType = BaseType<'null'>\\nexport type BooleanType = BaseType<'boolean'>\\nexport type StringType = BaseType<'string'>\\nexport type NumberType = BaseType<'number'>\\nexport type ObjectType = BaseType<'object'> & {\\n props: Record<string, {\\n optional: boolean\\n type: Type[]\\n }>\\n}\\nexport type ArrayType = BaseType<'array'> & {\\n elementType: Type[]\\n}\\nexport type ConstantType<Value extends (string | number | boolean)> = BaseType<'constant'> & {\\n value: Value\\n}\\n\\nexport type Type =\\n UndefinedType\\n | NullType\\n | BooleanType\\n | StringType\\n | NumberType\\n | ObjectType\\n | ArrayType\\n | ConstantType<any>\\n\\nfunction typeToString(type: Type) {\\n return type.type === 'constant'\\n ? `'${type.value}'`\\n : type.type\\n}\\n\",\"import { requireThat } from \\\"./require-that/requireThat.js\\\";\\nimport {config} from 'dotenv'\\n\\nlet promptGridApiKey: string;\\nexport function getPromptGridApiKey() {\\n if (!promptGridApiKey) {\\n config()\\n const rawValue = process.env['PROMPTGRID_API_KEY']\\n promptGridApiKey = requireThat(rawValue)\\n .canBeString()\\n .andNothingElse({errorMessage: `PromptGrid API key invalid: ${rawValue}`})\\n }\\n return promptGridApiKey;\\n}\\n\\nlet promptGridApiUrl: string;\\n\\nexport function getPromptGridApiUrl() {\\n if (!promptGridApiUrl) {\\n config()\\n let url = backendUrlNotTriviallyIdentifiableInMinifiedCode()\\n const rawValue = process.env['PROMPTGRID_API_URL'] ?? url\\n promptGridApiUrl = requireThat(rawValue)\\n .canBeString()\\n .andNothingElse({errorMessage: `PromptGrid API URL invalid: ${rawValue}`})\\n }\\n return promptGridApiUrl;\\n}\\n\\n/**\\n * @returns https://api.promptgrid.ai\\n */\\nfunction backendUrlNotTriviallyIdentifiableInMinifiedCode() {\\n let url = 't'\\n url = url + 'ps'\\n url = 'ht' + url\\n url = url + ':'\\n url = url + '/'\\n url = url + '/ap'\\n url = url + 'i.pr'\\n let url2 = 'i'\\n url2 = 'd.a' + url2\\n url2 = 'gri' + url2\\n url = url + 'ompt'\\n return url + url2\\n}\\n\",\"export enum TokenType {\\n START_OBJECT = 'START_OBJECT',\\n END_OBJECT = 'END_OBJECT',\\n START_ARRAY = 'START_ARRAY',\\n END_ARRAY = 'END_ARRAY',\\n FIELD_NAME = 'FIELD_NAME',\\n VALUE_STRING = 'VALUE_STRING',\\n VALUE_NUMBER_INT = 'VALUE_NUMBER_INT',\\n VALUE_NUMBER_FLOAT = 'VALUE_NUMBER_FLOAT',\\n VALUE_TRUE = 'VALUE_TRUE',\\n VALUE_FALSE = 'VALUE_FALSE',\\n VALUE_NULL = 'VALUE_NULL',\\n}\\n\\nexport class Token {\\n constructor(\\n public type: TokenType,\\n public source: string,\\n public value?: string | number,\\n public fieldName?: string,\\n public maybeIncomplete: boolean = false\\n ) {}\\n}\\n\",\"import {Token, TokenType} from './types.js'\\nimport {JsonExcerpt} from './JsonExcerpt.js'\\nimport {Flux} from 'monoflux'\\n\\n\\nexport class JsonTokenProcessor {\\n private jsonBuffer: string = ''\\n private highestOffsetParsed: number = -1\\n\\n public static toJsonTokenFlux(\\n dataBufferFlux: Flux<string>\\n ): Flux<JsonExcerpt> {\\n return new JsonTokenProcessor().processDataBuffer(dataBufferFlux)\\n }\\n\\n public processDataBuffer(deltaContentFlux: Flux<string>): Flux<JsonExcerpt> {\\n return deltaContentFlux.flatMap(content => this.getExcerpts(content))\\n }\\n\\n public getExcerpts(source: string): JsonExcerpt[] {\\n this.jsonBuffer += source\\n\\n const excerpts: JsonExcerpt[] = []\\n\\n const jsonParser = new JsonParser(this.jsonBuffer)\\n\\n let token: Token | undefined\\n while ((token = this.nextToken(jsonParser))) {\\n if (jsonParser.currentTokenLocation().getCharOffset() > this.highestOffsetParsed) {\\n excerpts.push({token})\\n this.highestOffsetParsed = jsonParser\\n .currentTokenLocation()\\n .getCharOffset()\\n }\\n }\\n\\n excerpts.push({source})\\n\\n return excerpts\\n }\\n\\n private nextToken(jsonParser: JsonParser): Token | undefined {\\n const result = jsonParser.nextToken()\\n return typeof result !== 'string' ? result : undefined\\n }\\n}\\n\\nclass JsonParser {\\n private position: number = 0\\n private currentTokenType: TokenType | undefined\\n private parentFieldName: string | undefined\\n private currentValue: any = null\\n\\n constructor(private readonly content: string) {}\\n\\n nextToken(): Token | 'token-incomplete' | 'string-ended' {\\n const startPosition = this.position\\n\\n if (this.position >= this.content.length) {\\n return 'string-ended'\\n }\\n\\n // Skip whitespace\\n while (\\n this.position < this.content.length &&\\n /\\\\s/.test(this.content[this.position]!)\\n ) {\\n this.position++\\n }\\n\\n if (this.position >= this.content.length) {\\n return 'string-ended'\\n }\\n\\n const positionAfterSucceedingCommaIfPresent = (position: number) => {\\n let tempPos = position\\n while (tempPos < this.content.length && /\\\\s/.test(this.content[tempPos]!)) {\\n tempPos++\\n }\\n return this.content[tempPos] === ','\\n ? tempPos + 1\\n : undefined\\n }\\n\\n const source = (position: number) =>\\n this.content.substring(startPosition, position)\\n\\n const char = this.content[this.position]!\\n\\n switch (char) {\\n case '{':\\n this.position++\\n this.currentTokenType = TokenType.START_OBJECT\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n undefined,\\n this.parentFieldName,\\n )\\n case '}': {\\n this.position++\\n this.currentTokenType = TokenType.END_OBJECT\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n this.parentFieldName = undefined\\n return token\\n }\\n case '[':\\n this.position++\\n this.currentTokenType = TokenType.START_ARRAY\\n return new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n case ']': {\\n this.position++\\n this.currentTokenType = TokenType.END_ARRAY\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(this.currentTokenType, source(this.position), undefined, this.parentFieldName)\\n this.parentFieldName = undefined\\n return token\\n }\\n case '\\\"':\\n // Parse string\\n let startPos = ++this.position\\n let endPos = this.content.indexOf('\\\"', startPos)\\n while (endPos > 0 && this.content[endPos - 1] === '\\\\\\\\') {\\n endPos = this.content.indexOf('\\\"', endPos + 1)\\n }\\n\\n if (endPos === -1) {\\n return 'token-incomplete'\\n }\\n\\n const value = this.content.substring(startPos, endPos)\\n this.position = endPos + 1\\n\\n // Check if this is a field name (followed by colon)\\n let tempPos = this.position\\n while (\\n tempPos < this.content.length &&\\n /\\\\s/.test(this.content[tempPos]!)\\n ) {\\n tempPos++\\n }\\n\\n this.currentTokenType =\\n tempPos < this.content.length && this.content[tempPos] === ':'\\n ? TokenType.FIELD_NAME\\n : TokenType.VALUE_STRING\\n\\n if (this.currentTokenType === TokenType.FIELD_NAME) {\\n this.position = tempPos + 1\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(\\n this.currentTokenType,\\n source(this.position),\\n value,\\n undefined\\n )\\n this.parentFieldName = value\\n return token\\n } else {\\n this.currentValue = value\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n const token = new Token(\\n this.currentTokenType,\\n source(this.position),\\n value,\\n this.currentTokenType === TokenType.VALUE_STRING\\n ? this.parentFieldName\\n : undefined\\n )\\n this.parentFieldName = undefined;\\n return token\\n }\\n case 't': {\\n const nextFourChars = this.content.substring(\\n this.position,\\n this.position + 4\\n )\\n if (nextFourChars === 'true') {\\n this.position += 4\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_TRUE\\n this.currentValue = true\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFourChars.length < 4) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n case 'f': {\\n const nextFiveChars = this.content.substring(\\n this.position,\\n this.position + 5\\n )\\n if (nextFiveChars === 'false') {\\n this.position += 5\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_FALSE\\n this.currentValue = false\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFiveChars.length < 5) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n case 'n': {\\n const nextFourChars = this.content.substring(\\n this.position,\\n this.position + 4\\n )\\n if (nextFourChars === 'null') {\\n this.position += 4\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n this.currentTokenType = TokenType.VALUE_NULL\\n this.currentValue = null\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName\\n )\\n } else if (nextFourChars.length < 4) {\\n return 'token-incomplete'\\n }\\n break\\n }\\n default:\\n if (/[0-9-]/.test(char)) {\\n // Parse number\\n let numStr = ''\\n let hasDecimal = false\\n\\n while (\\n this.position < this.content.length &&\\n (/[0-9]/.test(this.content[this.position]!) ||\\n this.content[this.position] === '-' ||\\n this.content[this.position] === '.' ||\\n this.content[this.position] === 'e' ||\\n this.content[this.position] === 'E' ||\\n this.content[this.position] === '+')\\n ) {\\n if (this.content[this.position] === '.') {\\n hasDecimal = true\\n }\\n numStr += this.content[this.position++]\\n }\\n\\n if (hasDecimal) {\\n this.currentTokenType = TokenType.VALUE_NUMBER_FLOAT\\n this.currentValue = parseFloat(numStr)\\n } else {\\n this.currentTokenType = TokenType.VALUE_NUMBER_INT\\n this.currentValue = parseInt(numStr, 10)\\n }\\n const mayBeIncomplete = this.position >= this.content.length\\n this.position = positionAfterSucceedingCommaIfPresent(this.position) ?? this.position\\n\\n return new Token(\\n this.currentTokenType,\\n source(this.position),\\n this.currentValue,\\n this.parentFieldName,\\n // cannot tell from number itself whether the number token is incomplete\\n mayBeIncomplete\\n )\\n }\\n }\\n\\n throw new JsonParseException('Invalid JSON at position ' + this.position)\\n }\\n\\n currentTokenLocation(): { getCharOffset: () => number } {\\n return {\\n getCharOffset: () => this.position\\n }\\n }\\n}\\n\\nclass JsonParseException extends Error {\\n constructor(message: string) {\\n super(message)\\n this.name = 'JsonParseException'\\n }\\n}\\n\",\"import {Token, TokenType} from './types.js';\\nimport {JsonExcerpt} from './JsonExcerpt.js';\\nimport {Flux} from \\\"monoflux\\\";\\n\\ntype MultiMap<K, V> = Map<K, V[]>;\\nexport type Consumer<T> = (value: T) => void;\\n\\ninterface CompletetionSubscription {\\n consumer: (value: any) => (void | Promise<void>);\\n expectedTokenType?: Set<TokenType> | undefined;\\n}\\n\\nexport abstract class StreamedJsonElement {\\n protected readonly receivedJson: string[] = [];\\n private readonly propertyCallbacks: MultiMap<string, (value: StreamedJsonElement) => void> = new Map();\\n private onElementCallbacks: Set<(value: StreamedJsonElement) => void> = new Set();\\n private onCompleteCallbacks: Set<CompletetionSubscription> = new Set();\\n private onEachExcerptCallbacks: Set<(value: JsonExcerpt) => void> = new Set();\\n private currentToken?: Token;\\n private state: State = new Begin();\\n private receivedExcerpts: JsonExcerpt[] = [];\\n\\n public onElement(callback: (value: StreamedJsonElement) => void): this {\\n this.onElementCallbacks.add(callback);\\n return this;\\n }\\n\\n public onProperty(propertyName: string, callback: (element: StreamedJsonElement) => void): this {\\n if (!this.propertyCallbacks.has(propertyName)) {\\n this.propertyCallbacks.set(propertyName, []);\\n }\\n this.propertyCallbacks.get(propertyName)!.push(callback);\\n return this;\\n }\\n\\n /**\\n * @deprecated Does not work right now because FIELD_NAME\\n * token comes after string value is already streaming\\n */\\n public onJsonStringProperty(propertyName: string, callback: (element :StreamedJsonElement) => void): this {\\n if (!this.propertyCallbacks.has(propertyName)) {\\n this.propertyCallbacks.set(propertyName, []);\\n }\\n\\n this.propertyCallbacks.get(propertyName)!.push(content => {\\n const processor = new JsonTokenProcessor();\\n let seenFirst = false;\\n const stringBuffer: string[] = [];\\n const jsonElement = new StreamedJsonChildElement();\\n\\n content.onEachExcerpt(jsonStringExcerpt => {\\n if (jsonStringExcerpt.source !== undefined) {\\n stringBuffer.push(jsonStringExcerpt.source);\\n }\\n const allData = stringBuffer.join('');\\n const excerptWithHoleEscapeTokens = this.endsOnUnevenNumberOfBackslashes(allData)\\n ? allData.substring(0, allData.length - 1)\\n : allData;\\n\\n stringBuffer.length = 0;\\n const unescapedExcerpt = excerptWithHoleEscapeTokens.replace(/\\\\\\\\\\\"/g, '\\\"');\\n const unescapedExcerptWithoutOpeningQuote = seenFirst\\n ? unescapedExcerpt\\n : unescapedExcerpt.substring(1);\\n\\n const isLastOfJsonString = jsonStringExcerpt.token != null;\\n const unescapedExcerptWithoutClosingQuote = isLastOfJsonString\\n ? unescapedExcerptWithoutOpeningQuote.substring(0, unescapedExcerptWithoutOpeningQuote.length - 1)\\n : unescapedExcerptWithoutOpeningQuote;\\n\\n const jsonExcerpts = processor.getExcerpts(unescapedExcerptWithoutClosingQuote);\\n jsonExcerpts.forEach(excerpt => jsonElement.push(excerpt));\\n });\\n\\n callback(jsonElement);\\n });\\n\\n return this;\\n }\\n\\n public onEachExcerpt(callback: (value: JsonExcerpt) => void): this {\\n this.onEachExcerptCallbacks.add(callback);\\n this.receivedExcerpts.forEach(callback);\\n return this;\\n }\\n\\n /**\\n * @param onComplete - a callback that will receive the complete JSON\\n * string for this element once it's done streaming\\n */\\n public onComplete(onComplete: (value: string) => void): void {\\n this._onComplete(this.toAsync(onComplete), undefined);\\n }\\n\\n private _onComplete(onComplete: (value: any) => void, expectedTokenType?: Set<TokenType>): void {\\n this.onCompleteCallbacks.add({\\n consumer: onComplete,\\n expectedTokenType\\n });\\n }\\n\\n public onCompleteAsync(onComplete: (value: string) => Promise<void>): void {\\n this._onComplete(onComplete, undefined);\\n }\\n\\n public onCompleteAs<T>(onComplete: (value: T) => void): void {\\n this.onCompleteAsAsync(this.toAsync(onComplete));\\n }\\n\\n public onCompleteAsAsync<T>(\\n onComplete: (value: T) => Promise<void>\\n ): void {\\n this._onComplete(\\n (jsonStringValue: string) => {\\n const deserializedValue = JSON.parse(jsonStringValue.replace(/,$/, ''));\\n return onComplete(deserializedValue);\\n },\\n undefined\\n );\\n }\\n\\n public onCompleteAsString(onComplete: (value: string) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_STRING, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsStringAsync(onComplete: (value: string) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_STRING, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsInt(onComplete: (value: number) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsIntAsync(onComplete: (value: number) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsNumber(onComplete: (value: number) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NUMBER_FLOAT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsNumberAsync(onComplete: (value: number) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_NUMBER_INT, TokenType.VALUE_NUMBER_FLOAT, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsBoolean(onComplete: (value: boolean) => void): void {\\n this._onComplete(\\n this.toAsync(onComplete),\\n new Set([TokenType.VALUE_TRUE, TokenType.VALUE_FALSE, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public onCompleteAsBooleanAsync(onComplete: (value: boolean) => Promise<void>): void {\\n this._onComplete(\\n onComplete,\\n new Set([TokenType.VALUE_TRUE, TokenType.VALUE_FALSE, TokenType.VALUE_NULL])\\n );\\n }\\n\\n public whenComplete(): Promise<string> {\\n return new Promise<string>(resolve => {\\n this.onComplete(value => resolve(value));\\n });\\n }\\n\\n public asJsonFlux(): Flux<string> {\\n return Flux.create<string>((push, complete) => {\\n this.onEachExcerpt(excerpt => {\\n if (excerpt.source) {\\n push(excerpt.source);\\n }\\n });\\n this._onComplete(async () => complete());\\n });\\n }\\n\\n public whenCompleteAs<T>(): Promise<T> {\\n return new Promise<T>(resolve => {\\n this.onCompleteAs(resolve);\\n });\\n }\\n\\n public async push(excerpt: JsonExcerpt): Promise<void> {\\n const token = excerpt.token;\\n\\n this.onEachExcerptCallbacks.forEach(callback => callback(excerpt));\\n\\n if (this.isState(InNested)) {\\n return (this.state as InNested).child.push(excerpt);\\n }\\n\\n if (!token) {\\n return;\\n }\\n\\n const tokenType = token.type;\\n this.currentToken = token;\\n\\n if (this.isState(Begin)) {\\n switch (tokenType) {\\n case TokenType.START_OBJECT: {\\n if (this.onElementCallbacks.size > 0) {\\n throw new Error(\\\"registered onElement for object\\\");\\n }\\n this.state = new InObject();\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.START_ARRAY: {\\n if (this.propertyCallbacks.size > 0) {\\n throw new Error(\\\"registered onProperty for array\\\");\\n }\\n this.state = new InArray();\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL:\\n this.receivedJson.push(token.source);\\n return this.end();\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n } else if (this.isState(InObject)) {\\n switch (tokenType) {\\n case TokenType.FIELD_NAME: {\\n this.receivedJson.push(token.source);\\n return;\\n }\\n\\n case TokenType.END_OBJECT: {\\n this.receivedJson.push(token.source);\\n return this.end();\\n }\\n\\n case TokenType.START_OBJECT:\\n case TokenType.START_ARRAY:\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL: {\\n const child = new StreamedJsonChildElement();\\n child.onComplete(resultingJson => {\\n this.receivedJson.push(resultingJson);\\n this.state = new InObject();\\n })\\n this.state = new InPropertyValue(child);\\n this.propertyCallbacks.get(token.fieldName!)\\n ?.forEach(callback => callback(child));\\n return child.push(excerpt);\\n }\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n } else if (this.isState(InArray)) {\\n switch (tokenType) {\\n case TokenType.END_ARRAY: {\\n this.receivedJson.push(token.source);\\n return this.end();\\n }\\n\\n case TokenType.START_OBJECT:\\n case TokenType.START_ARRAY:\\n case TokenType.VALUE_STRING:\\n case TokenType.VALUE_NUMBER_INT:\\n case TokenType.VALUE_NUMBER_FLOAT:\\n case TokenType.VALUE_TRUE:\\n case TokenType.VALUE_FALSE:\\n case TokenType.VALUE_NULL: {\\n const child = new StreamedJsonChildElement();\\n child.onComplete(resultingJson => {\\n this.receivedJson.push(resultingJson);\\n this.state = new InArray();\\n })\\n this.onElementCallbacks.forEach(callback => callback(child));\\n this.state = new InArrayElement(child);\\n return child.push(excerpt);\\n }\\n\\n default:\\n throw new UnexpectedTokenException(token);\\n }\\n }\\n\\n throw new Error(\\\"Unknown state\\\");\\n }\\n\\n protected async end(): Promise<void> {\\n if (this.currentToken === undefined) {\\n throw new Error('Illegal state')\\n }\\n\\n await Flux.fromArray([...this.onCompleteCallbacks]).flatMap(async subscription => {\\n const expectedTokenType = subscription.expectedTokenType;\\n const completeValue = (() => {\\n if (expectedTokenType === undefined) {\\n return this.receivedJson.join('');\\n }\\n if (!expectedTokenType.has(this.currentToken!.type)) {\\n throw new Error(`Expected token type ${Array.from(expectedTokenType).join(', ')} but got ${this.currentToken!.type}`);\\n }\\n return this.currentToken!.value\\n })()\\n await subscription.consumer(completeValue);\\n });\\n }\\n\\n private isState(stateClass: typeof Begin | typeof InArray | typeof InObject | typeof InNested): boolean {\\n return this.state instanceof stateClass;\\n }\\n\\n private endsOnUnevenNumberOfBackslashes(data: string): boolean {\\n let count = 0;\\n for (let i = data.length - 1; i >= 0; i--) {\\n if (data[i] === '\\\\\\\\') {\\n count++;\\n } else {\\n break;\\n }\\n }\\n return count % 2 === 1;\\n }\\n\\n private toAsync<T>(consumer: (value: T) => void): (value: T) => Promise<void> {\\n return async (value: T) => {\\n consumer(value);\\n };\\n }\\n}\\n\\n// State classes\\nabstract class State {\\n}\\n\\nclass InNested extends State {\\n constructor(public readonly child: StreamedJsonChildElement) {\\n super();\\n }\\n}\\n\\nclass Begin extends State {\\n}\\n\\nclass InArray extends State {\\n}\\n\\nclass InArrayElement extends InNested {\\n constructor(child: StreamedJsonChildElement) {\\n super(child);\\n }\\n}\\n\\nclass InObject extends State {\\n}\\n\\nclass InPropertyValue extends InNested {\\n constructor(child: StreamedJsonChildElement) {\\n super(child);\\n }\\n}\\n\\nclass UnexpectedTokenException extends Error {\\n constructor(token: Token) {\\n super(`Unexpected token: ${token.type}`);\\n this.name = \\\"UnexpectedTokenException\\\";\\n }\\n}\\n\\n// Mock JsonTokenProcessor for onJsonStringProperty\\nclass JsonTokenProcessor {\\n getExcerpts(data: string): JsonExcerpt[] {\\n return [{source: data}];\\n }\\n}\\n\\nexport class StreamedJsonChildElement extends StreamedJsonElement {\\n constructor() {\\n super();\\n }\\n}\\n\",\"import {JsonExcerpt} from './JsonExcerpt.js';\\nimport {StreamedJsonElement} from './StreamedJsonElement.js';\\nimport {Flux} from \\\"monoflux\\\";\\n\\nexport class StreamedJsonRootElement extends StreamedJsonElement {\\n protected readonly jsonTokenFlux: Flux<JsonExcerpt>\\n constructor(jsonTokenFlux: Flux<JsonExcerpt>) {\\n super();\\n const thiss = this\\n this.jsonTokenFlux = Flux.fromGeneratorFunction(async function* () {\\n let lastTokenExcerpt: JsonExcerpt | undefined = undefined;\\n for await (const excerpt of jsonTokenFlux) {\\n if (excerpt.token !== undefined) {\\n if (lastTokenExcerpt?.token?.maybeIncomplete && lastTokenExcerpt.token.type === excerpt.token.type && !excerpt.token.maybeIncomplete) {\\n await thiss.push(excerpt)\\n }\\n lastTokenExcerpt = excerpt.token;\\n }\\n if (excerpt.token === undefined || !excerpt.token.maybeIncomplete) {\\n await thiss.push(excerpt)\\n }\\n yield excerpt;\\n }\\n if (lastTokenExcerpt?.token?.maybeIncomplete) {\\n await thiss.push(lastTokenExcerpt)\\n }\\n })\\n }\\n\\n override whenComplete(): Promise<string> {\\n return this.jsonTokenFlux\\n .then(() => this.receivedJson.join(''));\\n }\\n\\n override asJsonFlux(): Flux<string> {\\n return this.jsonTokenFlux\\n .map(excerpt => excerpt.source)\\n .filter(source => source !== undefined)\\n }\\n}\\n\",\"import { JsonExcerpt } from './JsonExcerpt.js'\\nimport { StreamedJsonRootElement } from './StreamedJsonRootElement.js'\\nimport {Flux} from \\\"monoflux\\\";\\n\\nexport class StreamedJsonParser {\\n parse(jsonTokenFlux: Flux<JsonExcerpt>): StreamedJsonRootElement {\\n return new StreamedJsonRootElement(jsonTokenFlux)\\n }\\n}\\n\",\"export function parseJsonWithUsefulError(completedJson: string) {\\n try {\\n return JSON.parse(completedJson)\\n } catch (e) {\\n throw new Error(`Failed to parse JSON with error '${(e as Error).message}'. JSON was: ${completedJson}`)\\n }\\n}\",\"import {parseJsonWithUsefulError} from '../util/parseJsonWithUsefulError.js'\\n\\ntype Scope = '{' | '['\\n | '\\\"prop' | '\\\"prop\\\"' | '\\\"prop\\\":'\\n | 'n' | 'nu' | 'nul'\\n | 't' | 'tr' | 'tru'\\n | 'f' | 'fa' | 'fal' | 'fals'\\n | '\\\"value'\\n | 'number.'\\n\\nexport type DeepPartial<T> = T extends object ? {\\n [P in keyof T]?: DeepPartial<T[P]>;\\n} : T;\\n\\nexport function parsePartialJson<T>(partialJson: string): DeepPartial<T> | undefined {\\n if (partialJson.trim() === '') {\\n return undefined\\n }\\n const opened: Scope[] = []\\n let escaped = false\\n const pushScope = (scope: Scope) => opened.push(scope)\\n const popScope = (...expect: Scope[]) => {\\n const lastOpened = opened[opened.length - 1]\\n if (lastOpened === undefined || !expect.includes(lastOpened)) {\\n throw new Error('illegal state')\\n }\\n opened.pop()\\n }\\n const illegalState = () => {\\n return new Error(`Illegal state (json: ${partialJson})`)\\n }\\n for (const char of partialJson) {\\n const scope = opened.length > 0 ? opened[opened.length - 1]! : null\\n let nextEscapedValue = false\\n if (char === '\\\"') {\\n if (scope === null) {\\n pushScope('\\\"value')\\n } else if (scope === '[') {\\n pushScope('\\\"value')\\n } else if (scope === '{') {\\n pushScope('\\\"prop')\\n } else if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('\\\"value')\\n } else if (scope === '\\\"prop') {\\n if (!escaped) {\\n popScope('\\\"prop')\\n pushScope('\\\"prop\\\"')\\n }\\n } else if (scope === '\\\"value') {\\n if (!escaped) {\\n popScope('\\\"value')\\n }\\n } else throw illegalState()\\n } else if (char === '[') {\\n if (scope === null) {\\n pushScope('[')\\n } else if (scope === '[') {\\n pushScope('[')\\n } else if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('[')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === '{') {\\n if (scope === null || scope === '[' || scope === '\\\"prop\\\":') {\\n pushScope('{')\\n } else throw illegalState()\\n } else if (char === '\\\\\\\\') {\\n if (scope === '\\\"prop' || scope === '\\\"value') {\\n if (!escaped) {\\n nextEscapedValue = true\\n }\\n } else throw illegalState()\\n } else if (char === ':') {\\n if (scope === '\\\"prop\\\"') {\\n popScope('\\\"prop\\\"')\\n pushScope('\\\"prop\\\":')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'n') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('n')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'u') {\\n if (scope === 'n') {\\n popScope('n')\\n pushScope('nu')\\n } else if (scope === 'tr') {\\n popScope('tr')\\n pushScope('tru')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'l') {\\n if (scope === 'nu') {\\n popScope('nu')\\n pushScope('nul')\\n } else if (scope === 'nul') {\\n popScope('nul')\\n } else if (scope === 'fa') {\\n popScope('fa')\\n pushScope('fal')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 't') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('t')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'r') {\\n if (scope === 't') {\\n popScope('t')\\n pushScope('tr')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'e') {\\n if (scope === 'tru') {\\n popScope('tru')\\n } else if (scope === 'fals') {\\n popScope('fals')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'f') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('f')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 'a') {\\n if (scope === 'f') {\\n popScope('f')\\n pushScope('fa')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === 's') {\\n if (scope === 'fal') {\\n popScope('fal')\\n pushScope('fals')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === '.') {\\n if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n pushScope('number.')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char.match(/[0-9]/)) {\\n if (scope === 'number.') {\\n popScope('number.')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else if (scope === '\\\"prop\\\":') {\\n popScope('\\\"prop\\\":')\\n } else throw illegalState()\\n } else if (char === '}') {\\n if (scope === '{') {\\n popScope('{')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n } else if (char === ']') {\\n if (scope === '[') {\\n popScope('[')\\n } else if (scope === '\\\"prop' || scope === '\\\"value') {\\n // do nothing\\n } else throw illegalState()\\n }\\n escaped = nextEscapedValue\\n }\\n const closeEverything = opened\\n .reverse()\\n .map(opener => {\\n switch (opener) {\\n case '{': return '}'\\n case '[': return ']'\\n case '\\\"prop': return '\\\": null'\\n case '\\\"prop\\\"': return ': null'\\n case '\\\"prop\\\":': return ' null'\\n case 'n': return 'ull'\\n case 'nu': return 'll'\\n case 'nul': return 'l'\\n case 't': return 'rue'\\n case 'tr': return 'ue'\\n case 'tru': return 'e'\\n case 'f': return 'alse'\\n case 'fa': return 'lse'\\n case 'fal': return 'se'\\n case 'fals': return 'e'\\n case '\\\"value': return '\\\"'\\n case 'number.': return '0'\\n default: throw illegalState()\\n }\\n })\\n .join('')\\n const partialJsonWithoutEndingOnEscapeSign = escaped\\n ? partialJson.substring(0, partialJson.length - 1)\\n : partialJson\\n const partialJsonWithoutEndingComma = partialJsonWithoutEndingOnEscapeSign\\n .replace(/( |\\\\n|,)+$/, '')\\n const completedJson = partialJsonWithoutEndingComma + closeEverything\\n return parseJsonWithUsefulError(completedJson)\\n}\",\"export function nonNullish<T>(value: T | undefined | null): value is T\\n{\\n return value !== undefined && value !== null;\\n}\",\"export function requireDefined<T>(value: T | undefined): T {\\n if (value === undefined) {\\n throw new Error('Value is undefined');\\n }\\n return value;\\n}\",\"import validate from './validate.js';\\nconst byteToHex = [];\\nfor (let i = 0; i < 256; ++i) {\\n byteToHex.push((i + 0x100).toString(16).slice(1));\\n}\\nexport function unsafeStringify(arr, offset = 0) {\\n return (byteToHex[arr[offset + 0]] +\\n byteToHex[arr[offset + 1]] +\\n byteToHex[arr[offset + 2]] +\\n byteToHex[arr[offset + 3]] +\\n '-' +\\n byteToHex[arr[offset + 4]] +\\n byteToHex[arr[offset + 5]] +\\n '-' +\\n byteToHex[arr[offset + 6]] +\\n byteToHex[arr[offset + 7]] +\\n '-' +\\n byteToHex[arr[offset + 8]] +\\n byteToHex[arr[offset + 9]] +\\n '-' +\\n byteToHex[arr[offset + 10]] +\\n byteToHex[arr[offset + 11]] +\\n byteToHex[arr[offset + 12]] +\\n byteToHex[arr[offset + 13]] +\\n byteToHex[arr[offset + 14]] +\\n byteToHex[arr[offset + 15]]).toLowerCase();\\n}\\nfunction stringify(arr, offset = 0) {\\n const uuid = unsafeStringify(arr, offset);\\n if (!validate(uuid)) {\\n throw TypeError('Stringified UUID is invalid');\\n }\\n return uuid;\\n}\\nexport default stringify;\\n\",\"import { randomFillSync } from 'crypto';\\nconst rnds8Pool = new Uint8Array(256);\\nlet poolPtr = rnds8Pool.length;\\nexport default function rng() {\\n if (poolPtr > rnds8Pool.length - 16) {\\n randomFillSync(rnds8Pool);\\n poolPtr = 0;\\n }\\n return rnds8Pool.slice(poolPtr, (poolPtr += 16));\\n}\\n\",\"import { randomUUID } from 'crypto';\\nexport default { randomUUID };\\n\",\"import native from './native.js';\\nimport rng from './rng.js';\\nimport { unsafeStringify } from './stringify.js';\\nfunction v4(options, buf, offset) {\\n if (native.randomUUID && !buf && !options) {\\n return native.randomUUID();\\n }\\n options = options || {};\\n const rnds = options.random ?? options.rng?.() ?? rng();\\n if (rnds.length < 16) {\\n throw new Error('Random bytes length must be >= 16');\\n }\\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\\n if (buf) {\\n offset = offset || 0;\\n if (offset < 0 || offset + 16 > buf.length) {\\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\\n }\\n for (let i = 0; i < 16; ++i) {\\n buf[offset + i] = rnds[i];\\n }\\n return buf;\\n }\\n return unsafeStringify(rnds);\\n}\\nexport default v4;\\n\",\"export type Combine<Current, New> = unknown extends Current\\n ? New\\n : (Current & New) extends never\\n ? Current | New\\n : (Current & New)\\n\\n\\ntype Test = {foo: string} extends unknown ? true : false\\n\\ntype Bla = Combine<{foo: string}, {bar: string}>\\n\\ntype Simplify<T> = {\\n [K in keyof T]: Simplify<T[K]>\\n}\\n\\nexport type Opts = {\\n ignoreUnknownProps?: boolean\\n logValueIfWrong?: boolean\\n errorMessage?: string\\n}\\n\\ntype Problem = {\\n path: string\\n expectedType?: Type[]\\n expectedProp?: string\\n value: unknown\\n unknownProp?: string\\n}\\n\\nclass ComplexTypeError extends Error {\\n public readonly data: any\\n public readonly httpStatus = 400\\n constructor(problems: Problem[], message?: string) {\\n const data = problems\\n .map(problem => {\\n if (problem.expectedProp) {\\n return {\\n expectedProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.expectedProp\\n }\\n } else if (problem.expectedType) {\\n return {\\n expectedType: problem.expectedType.map(typeToString).join(' | '),\\n path: problem.path,\\n insteadGot: problem.value,\\n }\\n } else if (problem.unknownProp) {\\n return {\\n unknownProp: (problem.path + '.').replace(/^root\\\\./, '') + problem.unknownProp\\n }\\n } else {\\n throw new Error('illegal state')\\n }\\n })\\n super(message ?? `Value is of the wrong format: ${JSON.stringify(data, null, 2)}`)\\n this.data = data\\n }\\n}\\n\\n/**\\n * Way to assert the shape of a type both in runtime and in the\\n * type system.\\n *\\n * Usage example:\\n *\\n * ```typescript\\n * const inputValue = ['foo', 'bar'] as unknown\\n *\\n * assert(\\n * inputValue,\\n * t => t\\n * .canBeArray(t => t\\n * .canBeObject(t => t\\n * .canHaveString('foo')\\n * .canHaveString('bar')\\n * )\\n * )\\n * )\\n *\\n * let safeInputvalue = inputValue\\n *\\n * safeInputvalue = [{}] // typescript disapproves\\n * safeInputvalue = [{foo: 'bla', bar: 'bla'}] // typescript approves\\n * ```\\n */\\nexport function specType(\\n value: unknown,\\n): EmptyTypeSpec<unknown> {\\n return new EmptyTypeSpec<unknown>([], value)\\n}\\n\\nfunction checkIsOneOf(value: unknown, types: Type[], path: string, opts: Opts): Problem[] {\\n const problemsPerType = types\\n .map(type => checkIs(value, type, path, opts))\\n if (problemsPerType.some(list => list.length === 0)) {\\n return []\\n } else {\\n const typeProblemsOnThisPath = problemsPerType\\n .flatMap(list => list.filter(t => t.expectedType !== undefined && t.path === path))\\n if (typeProblemsOnThisPath.length > 0) {\\n return [{\\n expectedType: typeProblemsOnThisPath\\n .flatMap(problem => problem.expectedType!),\\n path,\\n value\\n }]\\n }\\n return problemsPerType.flatMap(list => list)\\n }\\n}\\n\\nfunction checkIs(value: unknown, type: Type, path: string, opts: Opts): Problem[] {\\n const {ignoreUnknownProps = true} = opts\\n switch (type.type) {\\n case \\\"array\\\": {\\n if (!Array.isArray(value)) {\\n return [{expectedType: [type], path, value}]\\n }\\n if (value.length === 0) {\\n return []\\n }\\n return checkIsOneOf(value[0], type.elementType, path + '[..]', opts)\\n }\\n case \\\"boolean\\\": {\\n if (typeof value !== 'boolean') {\\n return [{expectedType: [type], path, value}]\\n }\\n return []\\n }\\n case \\\"undefined\\\": {\\n return value === undefined\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"object\\\": {\\n if (typeof value !== 'object' || value === null) {\\n return [{expectedType: [type], path, value}]\\n }\\n const problems: Problem[] = []\\n for (const key in type.props) {\\n const prop = type.props[key]!\\n if (!(key in value)) {\\n if (!prop.optional) {\\n problems.push({expectedProp: key, path, value})\\n }\\n continue\\n }\\n const typeAccountingOptionality: Type[] = prop.optional\\n ? [...prop.type, {type: 'undefined'}]\\n : prop.type\\n problems.push(...checkIsOneOf(value[key as keyof typeof value], typeAccountingOptionality, path + `.${key}`, opts))\\n }\\n if (!ignoreUnknownProps) {\\n for (const key in value) {\\n if (!(key in type.props)) {\\n problems.push({unknownProp: key, path, value})\\n }\\n }\\n }\\n return problems\\n }\\n case \\\"string\\\": {\\n return typeof value === 'string'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"null\\\": {\\n return value === null\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case \\\"number\\\": {\\n return typeof value === 'number'\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n case 'constant': {\\n return value === type.value\\n ? []\\n : [{expectedType: [type], path, value}]\\n }\\n }\\n}\\n\\nexport abstract class TypeSpec<T> {\\n constructor(\\n protected readonly type: Type[],\\n protected readonly value: unknown,\\n private readonly _: T = undefined as T// type holder\\n ) {}\\n}\\n\\nexport class EmptyTypeSpec<T> extends TypeSpec<T> {\\n array<T_arr = unknown>(element: (arg: EmptyTypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new EmptyTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n object<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n string() {\\n return new FullTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n number() {\\n return new FullTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n boolean() {\\n return new FullTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n constant<Value extends (string | number | boolean)>(value: Value, ...otherValues: Value[]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n {type: 'constant', value},\\n ...(otherValues ?? []).map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n null() {\\n return new FullTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n undefined() {\\n return new FullTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class FullTypeSpec<T> extends TypeSpec<T> {\\n orArray<T_arr = unknown>(element: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new FullTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec.type], this.value)\\n }\\n\\n orObject<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n orString() {\\n return new FullTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n orNumber() {\\n return new FullTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n orBoolean() {\\n return new FullTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n orConstant<Value extends (string | number | boolean)>(value: Value, ...otherValues: Value[]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n {type: 'constant', value},\\n ...(otherValues ?? []).map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n orNull() {\\n return new FullTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n orUndefined() {\\n return new FullTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class TypeMemberSpec<T> {\\n constructor(\\n protected readonly type: Type[],\\n private readonly value: unknown\\n ) {}\\n\\n mayHave<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n hint?: string,\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, T_prop>>>> {\\n return this.has(propertyName, assertTypeOfProperty, true, hint)\\n }\\n\\n canHaveString<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, string>>>> {\\n return this.mayHave(propertyName, type => type.string(), hint)\\n }\\n\\n canHaveNumber<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, number>>>> {\\n return this.mayHave(propertyName, type => type.number(), hint)\\n }\\n\\n canHaveBoolean<Key extends string>(propertyName: Key, hint?: string): TypeMemberSpec<Combine<T, Partial<Record<Key, boolean>>>> {\\n return this.mayHave(propertyName, type => type.boolean(), hint)\\n }\\n\\n canHaveConstant<Key extends string, Value extends (string | number | boolean)>(\\n propertyName: Key,\\n [firstConstant, ...otherConstants]: [Value, ...Value[]],\\n hint?: string\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, Value>>>> {\\n return this.mayHave(\\n propertyName,\\n type => type.constant(firstConstant, ...otherConstants),\\n hint,\\n )\\n }\\n\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n optional: false,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n optional?: boolean,\\n comment?: string,\\n ): TypeMemberSpec<Combine<T, Partial<Record<Key, T_prop>>>>\\n has<Key extends string, T_prop>(\\n propertyName: Key,\\n assertTypeOfProperty: (arg: EmptyPropTypeSpec<unknown>) => PropTypeSpec<T_prop>,\\n arg3: boolean | string = false,\\n arg4?: string,\\n ): TypeMemberSpec<Combine<T, Record<Key, T_prop> | Partial<Record<Key, T_prop>>>> {\\n const {\\n optional,\\n comment,\\n }: {optional: boolean, comment: string | undefined} = (() => {\\n if (typeof arg3 === 'string') {\\n return {\\n optional: false,\\n comment: arg3,\\n }\\n } else {\\n return {\\n optional: arg3,\\n comment: arg4,\\n }\\n }\\n })()\\n const old = this.type.length === 1\\n ? this.type[0]!\\n : undefined\\n if (old === undefined || old.type !== 'object') {\\n throw new Error('illegal state')\\n }\\n const propertyTypeSpec = assertTypeOfProperty(new EmptyPropTypeSpec([], this.value))\\n const propertyType = propertyTypeSpec['type']\\n const commentsFromPropTypeSpec = propertyTypeSpec['_comments']\\n return new TypeMemberSpec<Combine<T, Record<Key, T_prop>>>([{\\n ...old,\\n props: {\\n ...old.props,\\n [propertyName]: {\\n optional,\\n type: propertyType,\\n comment: (() => {\\n const comments = [\\n ...commentsFromPropTypeSpec,\\n ...(comment !== undefined ? [comment] : []),\\n ]\\n return comments.length > 0\\n ? comments.join('. ')\\n : undefined\\n })(),\\n }\\n }\\n }], this.value)\\n }\\n\\n hasString<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, string>>> {\\n return this.has(\\n propertyName,\\n type => type.string(),\\n false,\\n comment,\\n )\\n }\\n\\n hasNumber<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, number>>> {\\n return this.has(\\n propertyName,\\n type => type.number(),\\n false,\\n comment,\\n )\\n }\\n\\n hasBoolean<Key extends string>(propertyName: Key, comment?: string): TypeMemberSpec<Combine<T, Record<Key, boolean>>> {\\n return this.has(\\n propertyName,\\n type => type.boolean(),\\n false,\\n comment,\\n )\\n }\\n\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(propertyName: Key, ...constants: [Value, ...Value[]]): TypeMemberSpec<Combine<T, Record<Key, Value>>>\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(propertyName: Key, [firstConstant, ...otherConstants]: [Value, ...Value[]], comment?: string): TypeMemberSpec<Combine<T, Record<Key, Value>>>\\n hasConstant<Key extends string, Value extends (string | number | boolean)>(\\n propertyName: Key,\\n arg2: Value | [Value, ...Value[]],\\n arg3?: Value | string,\\n ...otherArgs: Value[]\\n ): TypeMemberSpec<Combine<T, Record<Key, Value>>> {\\n const {\\n constants,\\n comment,\\n }: {constants: [Value, ...Value[]], comment?: string} = (() => {\\n if (Array.isArray(arg2)) {\\n return {\\n constants: arg2,\\n comment: arg3 as string | undefined,\\n }\\n } else {\\n return {\\n constants: [\\n arg2,\\n ...(arg3 !== undefined ? [arg3 as Value] : []),\\n ...otherArgs\\n ],\\n comment: undefined,\\n }\\n }\\n })()\\n return this.has(\\n propertyName,\\n type => type.constant(...constants),\\n false,\\n comment,\\n )\\n }\\n}\\n\\nexport abstract class PropTypeSpec<T> extends TypeSpec<T> {\\n constructor(\\n type: Type[],\\n value: unknown,\\n private _comments: string[] = [],\\n ) {\\n super(type, value)\\n }\\n\\n /**\\n * Give a comment to the LLM about this property\\n */\\n withComment(message: string) {\\n return new FullPropTypeSpec<Combine<T, string>>(this.type, this.value, [...this._comments, message])\\n }\\n}\\n\\nexport class EmptyPropTypeSpec<T> extends PropTypeSpec<T> {\\n array<T_arr = unknown>(element: (arg: EmptyTypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new EmptyTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullPropTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n object<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullPropTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n string() {\\n return new FullPropTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n number() {\\n return new FullPropTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n boolean() {\\n return new FullPropTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n constant<Value extends (string | number | boolean)>(...values: [Value, ...Value[]]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n ...values.map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n null() {\\n return new FullPropTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n undefined() {\\n return new FullPropTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport class FullPropTypeSpec<T> extends PropTypeSpec<T> {\\n orArray<T_arr = unknown>(element: (arg: TypeSpec<unknown>) => TypeSpec<T_arr>) {\\n const elementSpec = element(new FullTypeSpec<unknown>([], this.value))\\n const arraySpec = new FullTypeSpec<unknown>(\\n [{type: 'array', elementType: elementSpec['type']}],\\n this.value\\n )\\n return new FullPropTypeSpec<Combine<T, T_arr[]>>([...this.type, ...arraySpec['type']], this.value)\\n }\\n\\n orObject<T_obj extends {}>(properties: (arg: TypeMemberSpec<{}>) => TypeMemberSpec<T_obj>) {\\n const objectSpec = properties(new TypeMemberSpec<{}>([{type: 'object', props: {}}], this.value))\\n return new FullPropTypeSpec<Combine<T, T_obj>>([...this.type, ...objectSpec['type']], this.value)\\n }\\n\\n orString() {\\n return new FullPropTypeSpec<Combine<T, string>>([...this.type, {type: 'string'}], this.value)\\n }\\n\\n orNumber() {\\n return new FullPropTypeSpec<Combine<T, number>>([...this.type, {type: 'number'}], this.value)\\n }\\n\\n orBoolean() {\\n return new FullPropTypeSpec<Combine<T, boolean>>([...this.type, {type: 'boolean'}], this.value)\\n }\\n\\n orConstant<Value extends (string | number | boolean)>(...values: [Value, ...Value[]]) {\\n return new FullPropTypeSpec<Combine<T, Value>>(\\n [\\n ...this.type,\\n ...values.map(value => ({type: 'constant' as const, value}))\\n ],\\n this.value\\n )\\n }\\n\\n orNull() {\\n return new FullPropTypeSpec<Combine<T, null>>([...this.type, {type: 'null'}], this.value)\\n }\\n\\n orUndefined() {\\n return new FullPropTypeSpec<Combine<T, undefined>>([...this.type, {type: 'undefined'}], this.value)\\n }\\n}\\n\\nexport function assertType<T>(\\n value: unknown,\\n typeSpec: TypeSpec<T>,\\n opts: Opts = {}\\n): T {\\n const problems = checkIsOneOf(value, typeSpec['type'], 'root', opts)\\n if (problems.length > 0) {\\n throw new ComplexTypeError(problems, opts.errorMessage)\\n }\\n return value as T\\n}\\n\\nexport function describeType(typeSpec: TypeSpec<any>): string {\\n return describe(typeSpec['type'])\\n}\\n\\nexport function describe(type: Type[] | Type, indentLevel = 0): string {\\n if (Array.isArray(type)) {\\n return type.map(t => describe(t, indentLevel)).join(' | ')\\n }\\n switch (type.type) {\\n case \\\"array\\\": {\\n return `${describe(type.elementType, indentLevel)}[]`\\n }\\n case \\\"boolean\\\": {\\n return 'boolean'\\n }\\n case \\\"undefined\\\": {\\n return 'undefined'\\n }\\n case \\\"object\\\": {\\n const keys = Object.keys(type.props)\\n return `{\\\\n`\\n +\\n keys.map((key, i) => {\\n const propSpec = type.props[key]!\\n const value = describe(propSpec.type, indentLevel + 1)\\n const comma = i < keys.length - 1 ? ',' : ''\\n const comment = propSpec.comment !== undefined ? ` // ${propSpec.comment}` : ''\\n return `${indent(indentLevel + 1)}${key}: ${value}${comma}${comment}\\\\n`\\n }).join('')\\n + `${indent(indentLevel)}}`\\n }\\n case \\\"string\\\": {\\n return 'string'\\n }\\n case \\\"null\\\": {\\n return 'null'\\n }\\n case \\\"number\\\": {\\n return 'number'\\n }\\n case 'constant': {\\n return `\\\"${type.value}\\\"`\\n }\\n }\\n}\\n\\nfunction indent(depth: number) {\\n let indent = ''\\n for (let i = 0; i < depth; i++) {\\n indent += ' '\\n }\\n return indent\\n}\\n\\nexport type TypeType = 'undefined' | 'null' | 'boolean' | 'string' | 'number' | 'object' | 'array' | 'constant'\\n\\nexport type BaseType<TT extends TypeType> = {\\n type: TT\\n}\\n\\nexport type UndefinedType = BaseType<'undefined'>\\nexport type NullType = BaseType<'null'>\\nexport type BooleanType = BaseType<'boolean'>\\nexport type StringType = BaseType<'string'>\\nexport type NumberType = BaseType<'number'>\\nexport type ObjectType = BaseType<'object'> & {\\n props: Record<string, {\\n optional: boolean\\n type: Type[]\\n comment: string | undefined\\n }>\\n}\\nexport type ArrayType = BaseType<'array'> & {\\n elementType: Type[]\\n}\\nexport type ConstantType<Value extends (string | number | boolean)> = BaseType<'constant'> & {\\n value: Value\\n}\\n\\nexport type Type = UndefinedType | NullType | BooleanType | StringType | NumberType | ObjectType | ArrayType | ConstantType<any>\\n\\nfunction typeToString(type: Type) {\\n return type.type === 'constant'\\n ? `'${type.value}'`\\n : type.type\\n}\\n\"],\"mappings\":\"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\",\"ignoreList\":[]}"
|