@inkeep/open-knowledge 0.8.0-beta.11 → 0.8.0-beta.13
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/dist/assets/skills/discovery/SKILL.md +1 -1
- package/dist/assets/skills/project/SKILL.md +4 -3
- package/dist/cli.mjs +4 -4
- package/dist/constants-3pLYz7Cm.mjs +2 -0
- package/dist/{dist-DJtjdoaK.mjs → dist-B1bXj22d.mjs} +1 -1
- package/dist/{dist-Bhw2LGXq.mjs → dist-lSCD8oz8.mjs} +10 -10
- package/dist/{gh-detect-TH34o242.mjs → gh-detect-CmRIH7je.mjs} +2 -2
- package/dist/index.mjs +1 -1
- package/dist/init-B2oJJQ6d.mjs +1 -0
- package/dist/{init-I_TCE7DN.mjs → init-BNQrk71c.mjs} +4 -4
- package/dist/loader-DMjq2UMI.mjs +1 -0
- package/dist/{loader-DPm_lpGh.mjs → loader-cKgl9-hM.mjs} +2 -2
- package/dist/preview-Bsp1hXwy.mjs +1 -0
- package/dist/{preview-DB0USwj9.mjs → preview-CAhVgGQo.mjs} +2 -2
- package/dist/public/assets/{ActivityModeContent-D3wUpO_d.js → ActivityModeContent-DC0tgfEU.js} +1 -1
- package/dist/public/assets/{DocumentContext-B1Dayb-t.js → DocumentContext-DssYjOIq.js} +11 -11
- package/dist/public/assets/{GraphPanel-CCjwujLq.js → GraphPanel-D1Xe3oYD.js} +2 -2
- package/dist/public/assets/SettingsDialogBody-B1Q7kFlF.js +7 -0
- package/dist/public/assets/{SourceEditor-kpcUT4Dp.js → SourceEditor-DeK54x6f.js} +1 -1
- package/dist/public/assets/config-validation-events-VhnRuCsy.js +12 -0
- package/dist/public/assets/index-DMrNxv7s.js +1914 -0
- package/dist/public/assets/prop-types-6aVTZR_X.js +500 -0
- package/dist/public/assets/{target-navigation-intent-BTP_G6Zb.js → target-navigation-intent-afh2yjUE.js} +1 -1
- package/dist/public/assets/{toggle-group-D-4UzIoe.js → toggle-group-MKl7znyp.js} +1 -1
- package/dist/public/assets/typing-burst-detector-BcVx7LIb.js +2 -0
- package/dist/public/index.html +7 -7
- package/dist/{repair-launch-json-NztuohGM.mjs → repair-launch-json-BoiF16xN.mjs} +2 -2
- package/dist/{repair-mcp-configs--wNjr24F.mjs → repair-mcp-configs-CXh6WSYS.mjs} +2 -2
- package/dist/{repair-skills-CLWUtkEa.mjs → repair-skills-B4l2j5St.mjs} +2 -2
- package/dist/repair-skills-K6DWb3wZ.mjs +1 -0
- package/dist/{src-4NluDTZu.mjs → src-BjRMhwz_.mjs} +2 -2
- package/dist/start-C0s4RRL3.mjs +1 -0
- package/dist/{start-D-VHJP_i.mjs → start-CQ9ydIkL.mjs} +2 -2
- package/dist/{write-project-skill-9i3Dl670.mjs → write-project-skill-BH_iLvg3.mjs} +2 -2
- package/package.json +1 -1
- package/dist/constants-D4G98lCY.mjs +0 -2
- package/dist/init-9nl4LEpl.mjs +0 -1
- package/dist/loader-CII7xq3Y.mjs +0 -1
- package/dist/preview-DJxQ5N2T.mjs +0 -1
- package/dist/public/assets/SettingsDialogBody-BnVDN6G3.js +0 -7
- package/dist/public/assets/config-validation-events-Bo2UZFqI.js +0 -12
- package/dist/public/assets/index-CCtxOU9l.js +0 -1914
- package/dist/public/assets/prop-types-LNfbS2Tc.js +0 -500
- package/dist/public/assets/typing-burst-detector-Bv-klmt5.js +0 -2
- package/dist/repair-skills-CKSKV4oB.mjs +0 -1
- package/dist/start-Cib1T_TA.mjs +0 -1
|
@@ -296,7 +296,7 @@ Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#pl
|
|
|
296
296
|
`,PLUGIN_SECURE_PROXY_MISSING_CHAT_MODEL:`Could not find a chat model defined in the secure proxy plugin configuration.
|
|
297
297
|
Please provide a chat model before proceeding with creating an answer session.
|
|
298
298
|
Read more at https://docs.orama.com/docs/orama-js/plugins/plugin-secure-proxy#plugin-secure-proxy
|
|
299
|
-
`,ANSWER_SESSION_LAST_MESSAGE_IS_NOT_ASSISTANT:`The last message in the session is not an assistant message. Cannot regenerate non-assistant messages.`,PLUGIN_COMPONENT_CONFLICT:`The component "%s" is already defined. The plugin "%s" is trying to redefine it.`};function createError(e,...t){let S=Error(sprintf(errors[e]??`Unsupported Orama Error code: ${e}`,...t));return S.code=e,`captureStackTrace`in Error.prototype&&Error.captureStackTrace(S),S}function formatElapsedTime(e){return{raw:Number(e),formatted:formatNanoseconds(e)}}function getDocumentIndexId(e){if(e.id){if(typeof e.id!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof e.id);return e.id}return uniqueId()}function validateSchema(e,t){for(let[S,w]of Object.entries(t)){let t=e[S];if(t!==void 0&&!(w===`geopoint`&&typeof t==`object`&&typeof t.lon==`number`&&typeof t.lat==`number`)&&!(w===`enum`&&(typeof t==`string`||typeof t==`number`))){if(w===`enum[]`&&Array.isArray(t)){let e=t.length;for(let w=0;w<e;w++)if(typeof t[w]!=`string`&&typeof t[w]!=`number`)return S+`.`+w;continue}if(isVectorType(w)){let e=getVectorSize(w);if(!Array.isArray(t)||t.length!==e)throw createError(`INVALID_INPUT_VECTOR`,S,e,t.length);continue}if(isArrayType(w)){if(!Array.isArray(t))return S;let e=getInnerType(w),E=t.length;for(let w=0;w<E;w++)if(typeof t[w]!==e)return S+`.`+w;continue}if(typeof w==`object`){if(!t||typeof t!=`object`)return S;let e=validateSchema(t,w);if(e)return S+`.`+e;continue}if(typeof t!==w)return S}}}const IS_ARRAY_TYPE={string:!1,number:!1,boolean:!1,enum:!1,geopoint:!1,"string[]":!0,"number[]":!0,"boolean[]":!0,"enum[]":!0},INNER_TYPE={"string[]":`string`,"number[]":`number`,"boolean[]":`boolean`,"enum[]":`enum`};function isGeoPointType(e){return e===`geopoint`}function isVectorType(e){return typeof e==`string`&&/^vector\[\d+\]$/.test(e)}function isArrayType(e){return typeof e==`string`&&IS_ARRAY_TYPE[e]}function getInnerType(e){return INNER_TYPE[e]}function getVectorSize(e){let t=Number(e.slice(7,-1));switch(!0){case isNaN(t):throw createError(`INVALID_VECTOR_VALUE`,e);case t<=0:throw createError(`INVALID_VECTOR_SIZE`,e);default:return t}}function createInternalDocumentIDStore(){return{idToInternalId:new Map,internalIdToId:[],save:save$4,load:load$4}}function save$4(e){return{internalIdToId:e.internalIdToId}}function load$4(e,t){let{internalIdToId:S}=t;e.internalDocumentIDStore.idToInternalId.clear(),e.internalDocumentIDStore.internalIdToId=[];let w=S.length;for(let t=0;t<w;t++){let w=S[t];e.internalDocumentIDStore.idToInternalId.set(w,t+1),e.internalDocumentIDStore.internalIdToId.push(w)}}function getInternalDocumentId(e,t){if(typeof t==`string`){let S=e.idToInternalId.get(t);if(S)return S;let w=e.idToInternalId.size+1;return e.idToInternalId.set(t,w),e.internalIdToId.push(t),w}return t>e.internalIdToId.length?getInternalDocumentId(e,t.toString()):t}function getDocumentIdFromInternalId(e,t){if(e.internalIdToId.length<t)throw Error(`Invalid internalId ${t}`);return e.internalIdToId[t-1]}function create$13(e,t){return{sharedInternalDocumentStore:t,docs:{},count:0}}function get(e,t){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t);return e.docs[S]}function getMultiple(e,t){let S=t.length,w=Array.from({length:S});for(let E=0;E<S;E++){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t[E]);w[E]=e.docs[S]}return w}function getAll(e){return e.docs}function store(e,t,S,w){return e.docs[S]===void 0?(e.docs[S]=w,e.count++,!0):!1}function remove$2(e,t){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t);return e.docs[S]===void 0?!1:(delete e.docs[S],e.count--,!0)}function count$1(e){return e.count}function load$3(e,t){let S=t;return{docs:S.docs,count:S.count,sharedInternalDocumentStore:e}}function save$3(e){return{docs:e.docs,count:e.count}}function createDocumentsStore(){return{create:create$13,get,getMultiple,getAll,store,remove:remove$2,count:count$1,load:load$3,save:save$3}}const AVAILABLE_PLUGIN_HOOKS=[`beforeInsert`,`afterInsert`,`beforeRemove`,`afterRemove`,`beforeUpdate`,`afterUpdate`,`beforeUpsert`,`afterUpsert`,`beforeSearch`,`afterSearch`,`beforeInsertMultiple`,`afterInsertMultiple`,`beforeRemoveMultiple`,`afterRemoveMultiple`,`beforeUpdateMultiple`,`afterUpdateMultiple`,`beforeUpsertMultiple`,`afterUpsertMultiple`,`beforeLoad`,`afterLoad`,`afterCreate`];function getAllPluginsByHook(e,t){let S=[],w=e.plugins?.length;if(!w)return S;for(let E=0;E<w;E++)try{let w=e.plugins[E];typeof w[t]==`function`&&S.push(w[t])}catch(e){throw console.error(`Caught error in getAllPluginsByHook:`,e),createError(`PLUGIN_CRASHED`)}return S}const OBJECT_COMPONENTS=[`tokenizer`,`index`,`documentsStore`,`sorter`,`pinning`],FUNCTION_COMPONENTS=[`validateSchema`,`getDocumentIndexId`,`getDocumentProperties`,`formatElapsedTime`];function runSingleHook(e,t,S,w){if(e.some(isAsyncFunction))return(async()=>{for(let E of e)await E(t,S,w)})();for(let E of e)E(t,S,w)}function runMultipleHook(e,t,S){if(e.some(isAsyncFunction))return(async()=>{for(let w of e)await w(t,S)})();for(let w of e)w(t,S)}function runAfterSearch(e,t,S,w,E){if(e.some(isAsyncFunction))return(async()=>{for(let D of e)await D(t,S,w,E)})();for(let D of e)D(t,S,w,E)}function runBeforeSearch(e,t,S,w){if(e.some(isAsyncFunction))return(async()=>{for(let E of e)await E(t,S,w)})();for(let E of e)E(t,S,w)}function runAfterCreate(e,t){if(e.some(isAsyncFunction))return(async()=>{for(let S of e)await S(t)})();for(let S of e)S(t)}var AVLNode=class e{k;v;l=null;r=null;h=1;constructor(e,t){this.k=e,this.v=new Set(t)}updateHeight(){this.h=Math.max(e.getHeight(this.l),e.getHeight(this.r))+1}static getHeight(e){return e?e.h:0}getBalanceFactor(){return e.getHeight(this.l)-e.getHeight(this.r)}rotateLeft(){let e=this.r;return this.r=e.l,e.l=this,this.updateHeight(),e.updateHeight(),e}rotateRight(){let e=this.l;return this.l=e.r,e.r=this,this.updateHeight(),e.updateHeight(),e}toJSON(){return{k:this.k,v:Array.from(this.v),l:this.l?this.l.toJSON():null,r:this.r?this.r.toJSON():null,h:this.h}}static fromJSON(t){let S=new e(t.k,t.v);return S.l=t.l?e.fromJSON(t.l):null,S.r=t.r?e.fromJSON(t.r):null,S.h=t.h,S}},AVLTree=class e{root=null;insertCount=0;constructor(e,t){e!==void 0&&t!==void 0&&(this.root=new AVLNode(e,t))}insert(e,t,S=1e3){this.root=this.insertNode(this.root,e,t,S)}insertMultiple(e,t,S=1e3){for(let w of t)this.insert(e,w,S)}rebalance(){this.root&&=this.rebalanceNode(this.root)}toJSON(){return{root:this.root?this.root.toJSON():null,insertCount:this.insertCount}}static fromJSON(t){let S=new e;return S.root=t.root?AVLNode.fromJSON(t.root):null,S.insertCount=t.insertCount||0,S}insertNode(e,t,S,w){if(e===null)return new AVLNode(t,[S]);let E=[],D=e,O=null;for(;D!==null;)if(E.push({parent:O,node:D}),t<D.k)if(D.l===null){D.l=new AVLNode(t,[S]),E.push({parent:D,node:D.l});break}else O=D,D=D.l;else if(t>D.k)if(D.r===null){D.r=new AVLNode(t,[S]),E.push({parent:D,node:D.r});break}else O=D,D=D.r;else return D.v.add(S),e;let k=!1;this.insertCount++%w===0&&(k=!0);for(let t=E.length-1;t>=0;t--){let{parent:S,node:w}=E[t];if(w.updateHeight(),k){let t=this.rebalanceNode(w);S?S.l===w?S.l=t:S.r===w&&(S.r=t):e=t}}return e}rebalanceNode(e){let t=e.getBalanceFactor();if(t>1){if(e.l&&e.l.getBalanceFactor()>=0)return e.rotateRight();if(e.l)return e.l=e.l.rotateLeft(),e.rotateRight()}if(t<-1){if(e.r&&e.r.getBalanceFactor()<=0)return e.rotateLeft();if(e.r)return e.r=e.r.rotateRight(),e.rotateLeft()}return e}find(e){let t=this.findNodeByKey(e);return t?t.v:null}contains(e){return this.find(e)!==null}getSize(){let e=0,t=[],S=this.root;for(;S||t.length>0;){for(;S;)t.push(S),S=S.l;S=t.pop(),e++,S=S.r}return e}isBalanced(){if(!this.root)return!0;let e=[this.root];for(;e.length>0;){let t=e.pop(),S=t.getBalanceFactor();if(Math.abs(S)>1)return!1;t.l&&e.push(t.l),t.r&&e.push(t.r)}return!0}remove(e){this.root=this.removeNode(this.root,e)}removeDocument(e,t){let S=this.findNodeByKey(e);S&&(S.v.size===1?this.root=this.removeNode(this.root,e):S.v=new Set([...S.v.values()].filter(e=>e!==t)))}findNodeByKey(e){let t=this.root;for(;t;)if(e<t.k)t=t.l;else if(e>t.k)t=t.r;else return t;return null}removeNode(e,t){if(e===null)return null;let S=[],w=e;for(;w!==null&&w.k!==t;)S.push(w),w=t<w.k?w.l:w.r;if(w===null)return e;if(w.l===null||w.r===null){let t=w.l?w.l:w.r;if(S.length===0)e=t;else{let e=S[S.length-1];e.l===w?e.l=t:e.r=t}}else{let e=w,t=w.r;for(;t.l!==null;)e=t,t=t.l;w.k=t.k,w.v=t.v,e.l===t?e.l=t.r:e.r=t.r,w=e}S.push(w);for(let t=S.length-1;t>=0;t--){let w=S[t];w.updateHeight();let E=this.rebalanceNode(w);if(t>0){let e=S[t-1];e.l===w?e.l=E:e.r===w&&(e.r=E)}else e=E}return e}rangeSearch(e,t){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.l;if(E=w.pop(),E.k>=e&&E.k<=t)for(let e of E.v)S.add(e);if(E.k>t)break;E=E.r}return S}greaterThan(e,t=!1){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.r;if(E=w.pop(),t&&E.k>=e||!t&&E.k>e)for(let e of E.v)S.add(e);else if(E.k<=e)break;E=E.l}return S}lessThan(e,t=!1){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.l;if(E=w.pop(),t&&E.k<=e||!t&&E.k<e)for(let e of E.v)S.add(e);else if(E.k>e)break;E=E.r}return S}},FlatTree=class e{numberToDocumentId;constructor(){this.numberToDocumentId=new Map}insert(e,t){this.numberToDocumentId.has(e)?this.numberToDocumentId.get(e).add(t):this.numberToDocumentId.set(e,new Set([t]))}find(e){let t=this.numberToDocumentId.get(e);return t?Array.from(t):null}remove(e){this.numberToDocumentId.delete(e)}removeDocument(e,t){let S=this.numberToDocumentId.get(t);S&&(S.delete(e),S.size===0&&this.numberToDocumentId.delete(t))}contains(e){return this.numberToDocumentId.has(e)}getSize(){let e=0;for(let t of this.numberToDocumentId.values())e+=t.size;return e}filter(e){let t=Object.keys(e);if(t.length!==1)throw Error(`Invalid operation`);let S=t[0];switch(S){case`eq`:{let t=e[S],w=this.numberToDocumentId.get(t);return w?Array.from(w):[]}case`in`:{let t=e[S],w=new Set;for(let e of t){let t=this.numberToDocumentId.get(e);if(t)for(let e of t)w.add(e)}return Array.from(w)}case`nin`:{let t=new Set(e[S]),w=new Set;for(let[e,S]of this.numberToDocumentId.entries())if(!t.has(e))for(let e of S)w.add(e);return Array.from(w)}default:throw Error(`Invalid operation`)}}filterArr(e){let t=Object.keys(e);if(t.length!==1)throw Error(`Invalid operation`);let S=t[0];switch(S){case`containsAll`:{let t=e[S].map(e=>this.numberToDocumentId.get(e)??new Set);if(t.length===0)return[];let w=t.reduce((e,t)=>new Set([...e].filter(e=>t.has(e))));return Array.from(w)}case`containsAny`:{let t=e[S].map(e=>this.numberToDocumentId.get(e)??new Set);if(t.length===0)return[];let w=t.reduce((e,t)=>new Set([...e,...t]));return Array.from(w)}default:throw Error(`Invalid operation`)}}static fromJSON(t){if(!t.numberToDocumentId)throw Error(`Invalid Flat Tree JSON`);let S=new e;for(let[e,w]of t.numberToDocumentId)S.numberToDocumentId.set(e,new Set(w));return S}toJSON(){return{numberToDocumentId:Array.from(this.numberToDocumentId.entries()).map(([e,t])=>[e,Array.from(t)])}}};function _boundedLevenshtein(e,t,S){if(S<0)return-1;if(e===t)return 0;let w=e.length,E=t.length;if(w===0)return E<=S?E:-1;if(E===0)return w<=S?w:-1;let D=Math.abs(w-E);if(e.startsWith(t))return D<=S?D:-1;if(t.startsWith(e))return 0;if(D>S)return-1;let O=[];for(let e=0;e<=w;e++){O[e]=[e];for(let t=1;t<=E;t++)O[e][t]=e===0?t:0}for(let D=1;D<=w;D++){let w=1/0;for(let S=1;S<=E;S++)e[D-1]===t[S-1]?O[D][S]=O[D-1][S-1]:O[D][S]=Math.min(O[D-1][S]+1,O[D][S-1]+1,O[D-1][S-1]+1),w=Math.min(w,O[D][S]);if(w>S)return-1}return O[w][E]<=S?O[w][E]:-1}function syncBoundedLevenshtein(e,t,S){let w=_boundedLevenshtein(e,t,S);return{distance:w,isBounded:w>=0}}var RadixNode=class e{k;s;c=new Map;d=new Set;e;w=``;constructor(e,t,S){this.k=e,this.s=t,this.e=S}updateParent(e){this.w=e.w+this.s}addDocument(e){this.d.add(e)}removeDocument(e){return this.d.delete(e)}findAllWords(e,t,S,w){let E=[this];for(;E.length>0;){let D=E.pop();if(D.e){let{w:E,d:O}=D;if(S&&E!==t)continue;if(getOwnProperty(e,E)!==null)if(w)if(Math.abs(t.length-E.length)<=w&&syncBoundedLevenshtein(t,E,w).isBounded)e[E]=[];else continue;else e[E]=[];if(getOwnProperty(e,E)!=null&&O.size>0){let t=e[E];for(let e of O)t.includes(e)||t.push(e)}}D.c.size>0&&E.push(...D.c.values())}return e}insert(t,S){let w=this,E=0,D=t.length;for(;E<D;){let O=t[E],k=w.c.get(O);if(k){let O=k.s,j=O.length,F=0;for(;F<j&&E+F<D&&O[F]===t[E+F];)F++;if(F===j){if(w=k,E+=F,E===D){k.e||=!0,k.addDocument(S);return}continue}let L=O.slice(0,F),B=O.slice(F),H=t.slice(E+F),q=new e(L[0],L,!1);if(w.c.set(L[0],q),q.updateParent(w),k.s=B,k.k=B[0],q.c.set(B[0],k),k.updateParent(q),H){let t=new e(H[0],H,!0);t.addDocument(S),q.c.set(H[0],t),t.updateParent(q)}else q.e=!0,q.addDocument(S);return}else{let D=new e(O,t.slice(E),!0);D.addDocument(S),w.c.set(O,D),D.updateParent(w);return}}w.e||=!0,w.addDocument(S)}_findLevenshtein(e,t,S,w,E){let D=[{node:this,index:t,tolerance:S}];for(;D.length>0;){let{node:t,index:S,tolerance:O}=D.pop();if(t.w.startsWith(e)){t.findAllWords(E,e,!1,0);continue}if(O<0)continue;if(t.e){let{w:S,d:D}=t;if(S&&(syncBoundedLevenshtein(e,S,w).isBounded&&(E[S]=[]),getOwnProperty(E,S)!==void 0&&D.size>0)){let e=new Set(E[S]);for(let t of D)e.add(t);E[S]=Array.from(e)}}if(S>=e.length)continue;let k=e[S];if(t.c.has(k)){let e=t.c.get(k);D.push({node:e,index:S+1,tolerance:O})}D.push({node:t,index:S+1,tolerance:O-1});for(let[e,w]of t.c)D.push({node:w,index:S,tolerance:O-1}),e!==k&&D.push({node:w,index:S+1,tolerance:O-1})}}find(e){let{term:t,exact:S,tolerance:w}=e;if(w&&!S){let e={};return this._findLevenshtein(t,0,w,w,e),e}else{let e=this,E=0,D=t.length;for(;E<D;){let O=t[E],k=e.c.get(O);if(k){let O=k.s,j=O.length,F=0;for(;F<j&&E+F<D&&O[F]===t[E+F];)F++;if(F===j)e=k,E+=F;else if(E+F===D)if(F===D-E){if(S)return{};{let e={};return k.findAllWords(e,t,S,w),e}}else return{};else return{}}else return{}}let O={};return e.findAllWords(O,t,S,w),O}}contains(e){let t=this,S=0,w=e.length;for(;S<w;){let E=e[S],D=t.c.get(E);if(D){let E=D.s,O=E.length,k=0;for(;k<O&&S+k<w&&E[k]===e[S+k];)k++;if(k<O)return!1;S+=O,t=D}else return!1}return!0}removeWord(e){if(!e)return!1;let t=this,S=e.length,w=[];for(let E=0;E<S;E++){let S=e[E];if(t.c.has(S)){let e=t.c.get(S);w.push({parent:t,character:S}),E+=e.s.length-1,t=e}else return!1}for(t.d.clear(),t.e=!1;w.length>0&&t.c.size===0&&!t.e&&t.d.size===0;){let{parent:e,character:S}=w.pop();e.c.delete(S),t=e}return!0}removeDocumentByWord(e,t,S=!0){if(!e)return!0;let w=this,E=e.length;for(let D=0;D<E;D++){let E=e[D];if(w.c.has(E)){let O=w.c.get(E);D+=O.s.length-1,w=O,S&&w.w!==e||w.removeDocument(t)}else return!1}return!0}static getCommonPrefix(e,t){let S=Math.min(e.length,t.length),w=0;for(;w<S&&e.charCodeAt(w)===t.charCodeAt(w);)w++;return e.slice(0,w)}toJSON(){return{w:this.w,s:this.s,e:this.e,k:this.k,d:Array.from(this.d),c:Array.from(this.c?.entries())?.map(([e,t])=>[e,t.toJSON()])}}static fromJSON(t){let S=new e(t.k,t.s,t.e);return S.w=t.w,S.d=new Set(t.d),S.c=new Map(t?.c?.map(([t,S])=>[t,e.fromJSON(S)])||[]),S}},RadixTree=class e extends RadixNode{constructor(){super(``,``,!1)}static fromJSON(t){let S=new e;return S.w=t.w,S.s=t.s,S.e=t.e,S.k=t.k,S.d=new Set(t.d),S.c=new Map(t?.c?.map(([e,t])=>[e,RadixNode.fromJSON(t)])||[]),S}toJSON(){return super.toJSON()}};const K$1=2,EARTH_RADIUS=6371e3;var BKDNode=class e{point;docIDs;left;right;parent;constructor(e,t){this.point=e,this.docIDs=new Set(t),this.left=null,this.right=null,this.parent=null}toJSON(){return{point:this.point,docIDs:Array.from(this.docIDs),left:this.left?this.left.toJSON():null,right:this.right?this.right.toJSON():null}}static fromJSON(t,S=null){let w=new e(t.point,t.docIDs);return w.parent=S,t.left&&(w.left=e.fromJSON(t.left,w)),t.right&&(w.right=e.fromJSON(t.right,w)),w}},BKDTree=class e{root;nodeMap;constructor(){this.root=null,this.nodeMap=new Map}getPointKey(e){return`${e.lon},${e.lat}`}insert(e,t){let S=this.getPointKey(e),w=this.nodeMap.get(S);if(w){t.forEach(e=>w.docIDs.add(e));return}let E=new BKDNode(e,t);if(this.nodeMap.set(S,E),this.root==null){this.root=E;return}let D=this.root,O=0;for(;;){if(O%K$1===0)if(e.lon<D.point.lon){if(D.left==null){D.left=E,E.parent=D;return}D=D.left}else{if(D.right==null){D.right=E,E.parent=D;return}D=D.right}else if(e.lat<D.point.lat){if(D.left==null){D.left=E,E.parent=D;return}D=D.left}else{if(D.right==null){D.right=E,E.parent=D;return}D=D.right}O++}}contains(e){let t=this.getPointKey(e);return this.nodeMap.has(t)}getDocIDsByCoordinates(e){let t=this.getPointKey(e),S=this.nodeMap.get(t);return S?Array.from(S.docIDs):null}removeDocByID(e,t){let S=this.getPointKey(e),w=this.nodeMap.get(S);w&&(w.docIDs.delete(t),w.docIDs.size===0&&(this.nodeMap.delete(S),this.deleteNode(w)))}deleteNode(e){let t=e.parent,S=e.left?e.left:e.right;S&&(S.parent=t),t?t.left===e?t.left=S:t.right===e&&(t.right=S):(this.root=S,this.root&&(this.root.parent=null))}searchByRadius(t,S,w=!0,E=`asc`,D=!1){let O=D?e.vincentyDistance:e.haversineDistance,k=[{node:this.root,depth:0}],j=[];for(;k.length>0;){let{node:e,depth:E}=k.pop();if(e==null)continue;let D=O(t,e.point);(w?D<=S:D>S)&&j.push({point:e.point,docIDs:Array.from(e.docIDs)}),e.left!=null&&k.push({node:e.left,depth:E+1}),e.right!=null&&k.push({node:e.right,depth:E+1})}return E&&j.sort((e,S)=>{let w=O(t,e.point),D=O(t,S.point);return E.toLowerCase()===`asc`?w-D:D-w}),j}searchByPolygon(t,S=!0,w=null,E=!1){let D=[{node:this.root,depth:0}],O=[];for(;D.length>0;){let{node:w,depth:E}=D.pop();if(w==null)continue;w.left!=null&&D.push({node:w.left,depth:E+1}),w.right!=null&&D.push({node:w.right,depth:E+1});let k=e.isPointInPolygon(t,w.point);(k&&S||!k&&!S)&&O.push({point:w.point,docIDs:Array.from(w.docIDs)})}let k=e.calculatePolygonCentroid(t);if(w){let t=E?e.vincentyDistance:e.haversineDistance;O.sort((e,S)=>{let E=t(k,e.point),D=t(k,S.point);return w.toLowerCase()===`asc`?E-D:D-E})}return O}toJSON(){return{root:this.root?this.root.toJSON():null}}static fromJSON(t){let S=new e;return t.root&&(S.root=BKDNode.fromJSON(t.root),S.buildNodeMap(S.root)),S}buildNodeMap(e){if(e==null)return;let t=this.getPointKey(e.point);this.nodeMap.set(t,e),e.left&&this.buildNodeMap(e.left),e.right&&this.buildNodeMap(e.right)}static calculatePolygonCentroid(e){let t=0,S=0,w=0,E=e.length;for(let D=0,O=E-1;D<E;O=D++){let E=e[D].lon,k=e[D].lat,j=e[O].lon,F=e[O].lat,L=E*F-j*k;t+=L,S+=(E+j)*L,w+=(k+F)*L}t/=2;let D=6*t;return S/=D,w/=D,{lon:S,lat:w}}static isPointInPolygon(e,t){let S=!1,w=t.lon,E=t.lat,D=e.length;for(let t=0,O=D-1;t<D;O=t++){let D=e[t].lon,k=e[t].lat,j=e[O].lon,F=e[O].lat;k>E!=F>E&&w<(j-D)*(E-k)/(F-k)+D&&(S=!S)}return S}static haversineDistance(e,t){let S=Math.PI/180,w=e.lat*S,E=t.lat*S,D=(t.lat-e.lat)*S,O=(t.lon-e.lon)*S,k=Math.sin(D/2)*Math.sin(D/2)+Math.cos(w)*Math.cos(E)*Math.sin(O/2)*Math.sin(O/2);return EARTH_RADIUS*(2*Math.atan2(Math.sqrt(k),Math.sqrt(1-k)))}static vincentyDistance(e,t){let S=6378137,w=1/298.257223563,E=(1-w)*S,D=Math.PI/180,O=e.lat*D,k=t.lat*D,j=(t.lon-e.lon)*D,F=Math.atan((1-w)*Math.tan(O)),L=Math.atan((1-w)*Math.tan(k)),B=Math.sin(F),H=Math.cos(F),q=Math.sin(L),J=Math.cos(L),Y=j,ee,te=1e3,ne,ae,oe,se,ce,ue;do{let e=Math.sin(Y),t=Math.cos(Y);if(ne=Math.sqrt(J*e*(J*e)+(H*q-B*J*t)*(H*q-B*J*t)),ne===0)return 0;ae=B*q+H*J*t,oe=Math.atan2(ne,ae),se=H*J*e/ne,ce=1-se*se,ue=ae-2*B*q/ce,isNaN(ue)&&(ue=0);let S=w/16*ce*(4+w*(4-3*ce));ee=Y,Y=j+(1-S)*w*se*(oe+S*ne*(ue+S*ae*(-1+2*ue*ue)))}while(Math.abs(Y-ee)>1e-12&&--te>0);if(te===0)return NaN;let de=ce*(S*S-E*E)/(E*E),fe=1+de/16384*(4096+de*(-768+de*(320-175*de))),me=de/1024*(256+de*(-128+de*(74-47*de))),ge=me*ne*(ue+me/4*(ae*(-1+2*ue*ue)-me/6*ue*(-3+4*ne*ne)*(-3+4*ue*ue)));return E*fe*(oe-ge)}},BoolNode=class e{true;false;constructor(){this.true=new Set,this.false=new Set}insert(e,t){t?this.true.add(e):this.false.add(e)}delete(e,t){t?this.true.delete(e):this.false.delete(e)}getSize(){return this.true.size+this.false.size}toJSON(){return{true:Array.from(this.true),false:Array.from(this.false)}}static fromJSON(t){let S=new e;return S.true=new Set(t.true),S.false=new Set(t.false),S}};function BM25(e,t,S,w,E,{k:D,b:O,d:k}){return Math.log(1+(S-t+.5)/(t+.5))*(k+e*(D+1))/(e+D*(1-O+O*w/E))}const DEFAULT_SIMILARITY=.8;var VectorIndex=class e{size;vectors=new Map;constructor(e){this.size=e}add(e,t){t instanceof Float32Array||(t=new Float32Array(t));let S=getMagnitude(t,this.size);this.vectors.set(e,[S,t])}remove(e){this.vectors.delete(e)}find(e,t,S){return e instanceof Float32Array||(e=new Float32Array(e)),findSimilarVectors(e,S,this.vectors,this.size,t)}toJSON(){let e=[];for(let[t,[S,w]]of this.vectors)e.push([t,[S,Array.from(w)]]);return{size:this.size,vectors:e}}static fromJSON(t){let S=t,w=new e(S.size);for(let[e,[t,E]]of S.vectors)w.vectors.set(e,[t,new Float32Array(E)]);return w}};function getMagnitude(e,t){let S=0;for(let w=0;w<t;w++)S+=e[w]*e[w];return Math.sqrt(S)}function findSimilarVectors(e,t,S,w,E){let D=getMagnitude(e,w),O=[],k=t||S.keys();for(let t of k){let k=S.get(t);if(!k)continue;let j=k[0],F=k[1],L=0;for(let t=0;t<w;t++)L+=e[t]*F[t];let B=L/(D*j);B>=E&&O.push([t,B])}return O}function insertDocumentScoreParameters(e,t,S,w,E){let D=getInternalDocumentId(e.sharedInternalDocumentStore,S);e.avgFieldLength[t]=((e.avgFieldLength[t]??0)*(E-1)+w.length)/E,e.fieldLengths[t][D]=w.length,e.frequencies[t][D]={}}function insertTokenScoreParameters(e,t,S,w,E){let D=0;for(let e of w)e===E&&D++;let O=getInternalDocumentId(e.sharedInternalDocumentStore,S),k=D/w.length;e.frequencies[t][O][E]=k,E in e.tokenOccurrences[t]||(e.tokenOccurrences[t][E]=0),e.tokenOccurrences[t][E]=(e.tokenOccurrences[t][E]??0)+1}function removeDocumentScoreParameters(e,t,S,w){let E=getInternalDocumentId(e.sharedInternalDocumentStore,S);w>1?e.avgFieldLength[t]=(e.avgFieldLength[t]*w-e.fieldLengths[t][E])/(w-1):e.avgFieldLength[t]=void 0,e.fieldLengths[t][E]=void 0,e.frequencies[t][E]=void 0}function removeTokenScoreParameters(e,t,S){e.tokenOccurrences[t][S]--}function create$12(e,t,S,w,E=``){w||={sharedInternalDocumentStore:t,indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},frequencies:{},tokenOccurrences:{},avgFieldLength:{},fieldLengths:{}};for(let[D,O]of Object.entries(S)){let S=`${E}${E?`.`:``}${D}`;if(typeof O==`object`&&!Array.isArray(O)){create$12(e,t,O,w,S);continue}if(isVectorType(O))w.searchableProperties.push(S),w.searchablePropertiesWithTypes[S]=O,w.vectorIndexes[S]={type:`Vector`,node:new VectorIndex(getVectorSize(O)),isArray:!1};else{let e=/\[/.test(O);switch(O){case`boolean`:case`boolean[]`:w.indexes[S]={type:`Bool`,node:new BoolNode,isArray:e};break;case`number`:case`number[]`:w.indexes[S]={type:`AVL`,node:new AVLTree(0,[]),isArray:e};break;case`string`:case`string[]`:w.indexes[S]={type:`Radix`,node:new RadixTree,isArray:e},w.avgFieldLength[S]=0,w.frequencies[S]={},w.tokenOccurrences[S]={},w.fieldLengths[S]={};break;case`enum`:case`enum[]`:w.indexes[S]={type:`Flat`,node:new FlatTree,isArray:e};break;case`geopoint`:w.indexes[S]={type:`BKD`,node:new BKDTree,isArray:e};break;default:throw createError(`INVALID_SCHEMA_TYPE`,Array.isArray(O)?`array`:O,S)}w.searchableProperties.push(S),w.searchablePropertiesWithTypes[S]=O}}return w}function insertScalarBuilder(e,t,S,w,E,D,O,k){return j=>{let{type:F,node:L}=t.indexes[S];switch(F){case`Bool`:L[j?`true`:`false`].add(w);break;case`AVL`:{let e=k?.avlRebalanceThreshold??1;L.insert(j,w,e);break}case`Radix`:{let k=D.tokenize(j,E,S,!1);e.insertDocumentScoreParameters(t,S,w,k,O);for(let E of k)e.insertTokenScoreParameters(t,S,w,k,E),L.insert(E,w);break}case`Flat`:L.insert(j,w);break;case`BKD`:L.insert(j,[w]);break}}}function insert$2(e,t,S,w,E,D,O,k,j,F,L){if(isVectorType(O))return insertVector(t,S,D,w,E);let B=insertScalarBuilder(e,t,S,E,k,j,F,L);if(!isArrayType(O))return B(D);let H=D,q=H.length;for(let e=0;e<q;e++)B(H[e])}function insertVector(e,t,S,w,E){e.vectorIndexes[t].node.add(E,S)}function removeScalar(e,t,S,w,E,D,O,k,j,F){if(isVectorType(O))return t.vectorIndexes[S].node.remove(E),!0;let{type:L,node:B}=t.indexes[S];switch(L){case`AVL`:return B.removeDocument(D,E),!0;case`Bool`:return B[D?`true`:`false`].delete(E),!0;case`Radix`:{let O=j.tokenize(D,k,S);e.removeDocumentScoreParameters(t,S,w,F);for(let w of O)e.removeTokenScoreParameters(t,S,w),B.removeDocumentByWord(w,E);return!0}case`Flat`:return B.removeDocument(E,D),!0;case`BKD`:return B.removeDocByID(D,E),!1}}function remove$1(e,t,S,w,E,D,O,k,j,F){if(!isArrayType(O))return removeScalar(e,t,S,w,E,D,O,k,j,F);let L=getInnerType(O),B=D,H=B.length;for(let D=0;D<H;D++)removeScalar(e,t,S,w,E,B[D],L,k,j,F);return!0}function calculateResultScores(e,t,S,w,E,D,O,k,j,F){let L=Array.from(w),B=e.avgFieldLength[t],H=e.fieldLengths[t],q=e.tokenOccurrences[t],J=e.frequencies[t],Y=typeof q[S]==`number`?q[S]??0:0,ee=L.length;for(let e=0;e<ee;e++){let w=L[e];if(j&&!j.has(w))continue;F.has(w)||F.set(w,new Map);let q=F.get(w);q.set(t,(q.get(t)||0)+1);let ee=BM25(J?.[w]?.[S]??0,Y,E,H[w],B,D);O.has(w)?O.set(w,O.get(w)+ee*k):O.set(w,ee*k)}}function search$1(e,t,S,w,E,D,O,k,j,F,L,B=0){let H=S.tokenize(t,w),q=H.length||1,J=new Map,Y=new Map,ee=new Map;for(let S of E){if(!(S in e.indexes))continue;let w=e.indexes[S],{type:E}=w;if(E!==`Radix`)throw createError(`WRONG_SEARCH_PROPERTY_TYPE`,S);let B=k[S]??1;if(B<=0)throw createError(`INVALID_BOOST_VALUE`,B);H.length===0&&!t&&H.push(``);let q=H.length;for(let t=0;t<q;t++){let E=H[t],k=w.node.find({term:E,exact:D,tolerance:O}),q=Object.keys(k);q.length>0&&Y.set(E,!0);let te=q.length;for(let t=0;t<te;t++){let w=q[t],E=k[w];calculateResultScores(e,S,w,E,F,j,ee,B,L,J)}}}let te=Array.from(ee.entries()).map(([e,t])=>[e,t]).sort((e,t)=>t[1]-e[1]);if(te.length===0)return[];if(B===1)return te;if(B===0){if(q===1)return te;for(let e of H)if(!Y.get(e))return[];return te.filter(([e])=>{let t=J.get(e);return t?Array.from(t.values()).some(e=>e===q):!1})}let ne=te.filter(([e])=>{let t=J.get(e);return t?Array.from(t.values()).some(e=>e===q):!1});if(ne.length>0){let e=te.filter(([e])=>!ne.some(([t])=>t===e)),t=Math.ceil(e.length*B);return[...ne,...e.slice(0,t)]}return te}function searchByWhereClause(e,t,S,w){if(`and`in S&&S.and&&Array.isArray(S.and)){let E=S.and;return E.length===0?new Set:setIntersection(...E.map(S=>searchByWhereClause(e,t,S,w)))}if(`or`in S&&S.or&&Array.isArray(S.or)){let E=S.or;return E.length===0?new Set:E.map(S=>searchByWhereClause(e,t,S,w)).reduce((e,t)=>setUnion(e,t),new Set)}if(`not`in S&&S.not){let E=S.not,D=new Set,O=e.sharedInternalDocumentStore;for(let e=1;e<=O.internalIdToId.length;e++)D.add(e);return setDifference(D,searchByWhereClause(e,t,E,w))}let E=Object.keys(S),D=E.reduce((e,t)=>({[t]:new Set,...e}),{});for(let O of E){let E=S[O];if(e.indexes[O]===void 0)throw createError(`UNKNOWN_FILTER_PROPERTY`,O);let{node:k,type:j,isArray:F}=e.indexes[O];if(j===`Bool`){let e=k,t=E?e.true:e.false;D[O]=setUnion(D[O],t);continue}if(j===`BKD`){let e;if(`radius`in E)e=`radius`;else if(`polygon`in E)e=`polygon`;else throw Error(`Invalid operation ${E}`);if(e===`radius`){let{value:t,coordinates:S,unit:w=`m`,inside:j=!0,highPrecision:F=!1}=E[e],L=convertDistanceToMeters(t,w),B=k.searchByRadius(S,L,j,void 0,F);D[O]=addGeoResult(D[O],B)}else{let{coordinates:t,inside:S=!0,highPrecision:w=!1}=E[e],j=k.searchByPolygon(t,S,void 0,w);D[O]=addGeoResult(D[O],j)}continue}if(j===`Radix`&&(typeof E==`string`||Array.isArray(E))){for(let e of[E].flat()){let S=t.tokenize(e,w,O);for(let e of S){let t=k.find({term:e,exact:!0});D[O]=addFindResult(D[O],t)}}continue}let L=Object.keys(E);if(L.length>1)throw createError(`INVALID_FILTER_OPERATION`,L.length);if(j===`Flat`){let e=new Set(F?k.filterArr(E):k.filter(E));D[O]=setUnion(D[O],e);continue}if(j===`AVL`){let e=L[0],t=E[e],S;switch(e){case`gt`:S=k.greaterThan(t,!1);break;case`gte`:S=k.greaterThan(t,!0);break;case`lt`:S=k.lessThan(t,!1);break;case`lte`:S=k.lessThan(t,!0);break;case`eq`:S=k.find(t)??new Set;break;case`between`:{let[e,w]=t;S=k.rangeSearch(e,w);break}default:throw createError(`INVALID_FILTER_OPERATION`,e)}D[O]=setUnion(D[O],S)}}return setIntersection(...Object.values(D))}function getSearchableProperties(e){return e.searchableProperties}function getSearchablePropertiesWithTypes(e){return e.searchablePropertiesWithTypes}function load$2(e,t){let{indexes:S,vectorIndexes:w,searchableProperties:E,searchablePropertiesWithTypes:D,frequencies:O,tokenOccurrences:k,avgFieldLength:j,fieldLengths:F}=t,L={},B={};for(let e of Object.keys(S)){let{node:t,type:w,isArray:E}=S[e];switch(w){case`Radix`:L[e]={type:`Radix`,node:RadixTree.fromJSON(t),isArray:E};break;case`Flat`:L[e]={type:`Flat`,node:FlatTree.fromJSON(t),isArray:E};break;case`AVL`:L[e]={type:`AVL`,node:AVLTree.fromJSON(t),isArray:E};break;case`BKD`:L[e]={type:`BKD`,node:BKDTree.fromJSON(t),isArray:E};break;case`Bool`:L[e]={type:`Bool`,node:BoolNode.fromJSON(t),isArray:E};break;default:L[e]=S[e]}}for(let e of Object.keys(w))B[e]={type:`Vector`,isArray:!1,node:VectorIndex.fromJSON(w[e])};return{sharedInternalDocumentStore:e,indexes:L,vectorIndexes:B,searchableProperties:E,searchablePropertiesWithTypes:D,frequencies:O,tokenOccurrences:k,avgFieldLength:j,fieldLengths:F}}function save$2(e){let{indexes:t,vectorIndexes:S,searchableProperties:w,searchablePropertiesWithTypes:E,frequencies:D,tokenOccurrences:O,avgFieldLength:k,fieldLengths:j}=e,F={};for(let e of Object.keys(S))F[e]=S[e].node.toJSON();let L={};for(let e of Object.keys(t)){let{type:S,node:w,isArray:E}=t[e];S===`Flat`||S===`Radix`||S===`AVL`||S===`BKD`||S===`Bool`?L[e]={type:S,node:w.toJSON(),isArray:E}:(L[e]=t[e],L[e].node=L[e].node.toJSON())}return{indexes:L,vectorIndexes:F,searchableProperties:w,searchablePropertiesWithTypes:E,frequencies:D,tokenOccurrences:O,avgFieldLength:k,fieldLengths:j}}function createIndex(){return{create:create$12,insert:insert$2,remove:remove$1,insertDocumentScoreParameters,insertTokenScoreParameters,removeDocumentScoreParameters,removeTokenScoreParameters,calculateResultScores,search:search$1,searchByWhereClause,getSearchableProperties,getSearchablePropertiesWithTypes,load:load$2,save:save$2}}function addGeoResult(e,t){e||=new Set;let S=t.length;for(let w=0;w<S;w++){let S=t[w].docIDs,E=S.length;for(let t=0;t<E;t++)e.add(S[t])}return e}function createGeoTokenScores(e,t,S=!1){let w=S?BKDTree.vincentyDistance:BKDTree.haversineDistance,E=[],D=[];for(let{point:S}of e)D.push(w(t,S));let O=Math.max(...D),k=0;for(let{docIDs:t}of e){let e=O-D[k]+1;for(let S of t)E.push([S,e]);k++}return E.sort((e,t)=>t[1]-e[1]),E}function isGeosearchOnlyQuery(e,t){let S=Object.keys(e);if(S.length!==1)return{isGeoOnly:!1};let w=S[0],E=e[w];if(t.indexes[w]===void 0)return{isGeoOnly:!1};let{type:D}=t.indexes[w];return D===`BKD`&&E&&(`radius`in E||`polygon`in E)?{isGeoOnly:!0,geoProperty:w,geoOperation:E}:{isGeoOnly:!1}}function searchByGeoWhereClause(e,t){let S=e,w=isGeosearchOnlyQuery(t,S);if(!w.isGeoOnly||!w.geoProperty||!w.geoOperation)return null;let{node:E}=S.indexes[w.geoProperty],D=w.geoOperation,O=E,k;if(`radius`in D){let{value:e,coordinates:t,unit:S=`m`,inside:w=!0,highPrecision:E=!1}=D.radius,j=t,F=convertDistanceToMeters(e,S);return k=O.searchByRadius(j,F,w,`asc`,E),createGeoTokenScores(k,j,E)}else if(`polygon`in D){let{coordinates:e,inside:t=!0,highPrecision:S=!1}=D.polygon;k=O.searchByPolygon(e,t,`asc`,S);let w=BKDTree.calculatePolygonCentroid(e);return createGeoTokenScores(k,w,S)}return null}function addFindResult(e,t){e||=new Set;let S=Object.keys(t),w=S.length;for(let E=0;E<w;E++){let w=t[S[E]],D=w.length;for(let t=0;t<D;t++)e.add(w[t])}return e}function innerCreate(e,t,S,w,E){let D={language:e.tokenizer.language,sharedInternalDocumentStore:t,enabled:!0,isSorted:!0,sortableProperties:[],sortablePropertiesWithTypes:{},sorts:{}};for(let[O,k]of Object.entries(S)){let S=`${E}${E?`.`:``}${O}`;if(!w.includes(S)){if(typeof k==`object`&&!Array.isArray(k)){let E=innerCreate(e,t,k,w,S);safeArrayPush(D.sortableProperties,E.sortableProperties),D.sorts={...D.sorts,...E.sorts},D.sortablePropertiesWithTypes={...D.sortablePropertiesWithTypes,...E.sortablePropertiesWithTypes};continue}if(!isVectorType(k))switch(k){case`boolean`:case`number`:case`string`:D.sortableProperties.push(S),D.sortablePropertiesWithTypes[S]=k,D.sorts[S]={docs:new Map,orderedDocsToRemove:new Map,orderedDocs:[],type:k};break;case`geopoint`:case`enum`:continue;case`enum[]`:case`boolean[]`:case`number[]`:case`string[]`:continue;default:throw createError(`INVALID_SORT_SCHEMA_TYPE`,Array.isArray(k)?`array`:k,S)}}}return D}function create$11(e,t,S,w){return w?.enabled===!1?{disabled:!0}:innerCreate(e,t,S,(w||{}).unsortableProperties||[],``)}function insert$1(e,t,S,w){if(!e.enabled)return;e.isSorted=!1;let E=getInternalDocumentId(e.sharedInternalDocumentStore,S),D=e.sorts[t];D.orderedDocsToRemove.has(E)&&ensureOrderedDocsAreDeletedByProperty(e,t),D.docs.set(E,D.orderedDocs.length),D.orderedDocs.push([E,w])}function ensureIsSorted(e){if(e.isSorted||!e.enabled)return;let t=Object.keys(e.sorts);for(let S of t)ensurePropertyIsSorted(e,S);e.isSorted=!0}function stringSort(e,t,S){return t[1].localeCompare(S[1],getLocale(e))}function numberSort(e,t){return e[1]-t[1]}function booleanSort(e,t){return t[1]?-1:1}function ensurePropertyIsSorted(e,t){let S=e.sorts[t],w;switch(S.type){case`string`:w=stringSort.bind(null,e.language);break;case`number`:w=numberSort.bind(null);break;case`boolean`:w=booleanSort.bind(null);break}S.orderedDocs.sort(w);let E=S.orderedDocs.length;for(let e=0;e<E;e++){let t=S.orderedDocs[e][0];S.docs.set(t,e)}}function ensureOrderedDocsAreDeleted(e){let t=Object.keys(e.sorts);for(let S of t)ensureOrderedDocsAreDeletedByProperty(e,S)}function ensureOrderedDocsAreDeletedByProperty(e,t){let S=e.sorts[t];S.orderedDocsToRemove.size&&(S.orderedDocs=S.orderedDocs.filter(e=>!S.orderedDocsToRemove.has(e[0])),S.orderedDocsToRemove.clear())}function remove(e,t,S){if(!e.enabled)return;let w=e.sorts[t],E=getInternalDocumentId(e.sharedInternalDocumentStore,S);w.docs.get(E)&&(w.docs.delete(E),w.orderedDocsToRemove.set(E,!0))}function sortBy(e,t,S){if(!e.enabled)throw createError(`SORT_DISABLED`);let w=S.property,E=S.order===`DESC`,D=e.sorts[w];if(!D)throw createError(`UNABLE_TO_SORT_ON_UNKNOWN_FIELD`,w,e.sortableProperties.join(`, `));return ensureOrderedDocsAreDeletedByProperty(e,w),ensureIsSorted(e),t.sort((t,S)=>{let w=D.docs.get(getInternalDocumentId(e.sharedInternalDocumentStore,t[0])),O=D.docs.get(getInternalDocumentId(e.sharedInternalDocumentStore,S[0])),k=w!==void 0,j=O!==void 0;return!k&&!j?0:k?j?E?O-w:w-O:-1:1}),t}function getSortableProperties(e){return e.enabled?e.sortableProperties:[]}function getSortablePropertiesWithTypes(e){return e.enabled?e.sortablePropertiesWithTypes:{}}function load$1(e,t){let S=t;if(!S.enabled)return{enabled:!1};let w=Object.keys(S.sorts).reduce((e,t)=>{let{docs:w,orderedDocs:E,type:D}=S.sorts[t];return e[t]={docs:new Map(Object.entries(w).map(([e,t])=>[+e,t])),orderedDocsToRemove:new Map,orderedDocs:E,type:D},e},{});return{sharedInternalDocumentStore:e,language:S.language,sortableProperties:S.sortableProperties,sortablePropertiesWithTypes:S.sortablePropertiesWithTypes,sorts:w,enabled:!0,isSorted:S.isSorted}}function save$1(e){if(!e.enabled)return{enabled:!1};ensureOrderedDocsAreDeleted(e),ensureIsSorted(e);let t=Object.keys(e.sorts).reduce((t,S)=>{let{docs:w,orderedDocs:E,type:D}=e.sorts[S];return t[S]={docs:Object.fromEntries(w.entries()),orderedDocs:E,type:D},t},{});return{language:e.language,sortableProperties:e.sortableProperties,sortablePropertiesWithTypes:e.sortablePropertiesWithTypes,sorts:t,enabled:e.enabled,isSorted:e.isSorted}}function createSorter(){return{create:create$11,insert:insert$1,remove,save:save$1,load:load$1,sortBy,getSortableProperties,getSortablePropertiesWithTypes}}const DIACRITICS_CHARCODE_START=192,DIACRITICS_CHARCODE_END=383,CHARCODE_REPLACE_MAPPING=[65,65,65,65,65,65,65,67,69,69,69,69,73,73,73,73,69,78,79,79,79,79,79,null,79,85,85,85,85,89,80,115,97,97,97,97,97,97,97,99,101,101,101,101,105,105,105,105,101,110,111,111,111,111,111,null,111,117,117,117,117,121,112,121,65,97,65,97,65,97,67,99,67,99,67,99,67,99,68,100,68,100,69,101,69,101,69,101,69,101,69,101,71,103,71,103,71,103,71,103,72,104,72,104,73,105,73,105,73,105,73,105,73,105,73,105,74,106,75,107,107,76,108,76,108,76,108,76,108,76,108,78,110,78,110,78,110,110,78,110,79,111,79,111,79,111,79,111,82,114,82,114,82,114,83,115,83,115,83,115,83,115,84,116,84,116,84,116,85,117,85,117,85,117,85,117,85,117,85,117,87,119,89,121,89,90,122,90,122,90,122,115];function replaceChar(e){return e<DIACRITICS_CHARCODE_START||e>DIACRITICS_CHARCODE_END?e:CHARCODE_REPLACE_MAPPING[e-DIACRITICS_CHARCODE_START]||e}function replaceDiacritics(e){let t=[];for(let S=0;S<e.length;S++)t[S]=replaceChar(e.charCodeAt(S));return String.fromCharCode(...t)}const step2List={ational:`ate`,tional:`tion`,enci:`ence`,anci:`ance`,izer:`ize`,bli:`ble`,alli:`al`,entli:`ent`,eli:`e`,ousli:`ous`,ization:`ize`,ation:`ate`,ator:`ate`,alism:`al`,iveness:`ive`,fulness:`ful`,ousness:`ous`,aliti:`al`,iviti:`ive`,biliti:`ble`,logi:`log`},step3List={icate:`ic`,ative:``,alize:`al`,iciti:`ic`,ical:`ic`,ful:``,ness:``},c=`[^aeiou]`,v=`[aeiouy]`,C=c+`[^aeiouy]*`;v+``;const mgr0=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*`,meq1=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$`,mgr1=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*`,s_v=`^(`+C+`)?[aeiouy]`;function stemmer(e){let t,S,w,E,D,O;if(e.length<3)return e;let k=e.substring(0,1);if(k==`y`&&(e=k.toUpperCase()+e.substring(1)),w=/^(.+?)(ss|i)es$/,E=/^(.+?)([^s])s$/,w.test(e)?e=e.replace(w,`$1$2`):E.test(e)&&(e=e.replace(E,`$1$2`)),w=/^(.+?)eed$/,E=/^(.+?)(ed|ing)$/,w.test(e)){let t=w.exec(e);w=new RegExp(mgr0),w.test(t[1])&&(w=/.$/,e=e.replace(w,``))}else E.test(e)&&(t=E.exec(e)[1],E=new RegExp(s_v),E.test(t)&&(e=t,E=/(at|bl|iz)$/,D=RegExp(`([^aeiouylsz])\\1$`),O=RegExp(`^`+C+v+`[^aeiouwxy]$`),E.test(e)?e+=`e`:D.test(e)?(w=/.$/,e=e.replace(w,``)):O.test(e)&&(e+=`e`)));if(w=/^(.+?)y$/,w.test(e)&&(t=w.exec(e)?.[1],w=new RegExp(s_v),t&&w.test(t)&&(e=t+`i`)),w=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,w.test(e)){let E=w.exec(e);t=E?.[1],S=E?.[2],w=new RegExp(mgr0),t&&w.test(t)&&(e=t+step2List[S])}if(w=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,w.test(e)){let E=w.exec(e);t=E?.[1],S=E?.[2],w=new RegExp(mgr0),t&&w.test(t)&&(e=t+step3List[S])}if(w=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,E=/^(.+?)(s|t)(ion)$/,w.test(e))t=w.exec(e)?.[1],w=new RegExp(mgr1),t&&w.test(t)&&(e=t);else if(E.test(e)){let S=E.exec(e);t=S?.[1]??``+S?.[2]??``,E=new RegExp(mgr1),E.test(t)&&(e=t)}return w=/^(.+?)e$/,w.test(e)&&(t=w.exec(e)?.[1],w=new RegExp(mgr1),E=new RegExp(meq1),D=RegExp(`^`+C+v+`[^aeiouwxy]$`),t&&(w.test(t)||E.test(t)&&!D.test(t))&&(e=t)),w=/ll$/,E=new RegExp(mgr1),w.test(e)&&E.test(e)&&(w=/.$/,e=e.replace(w,``)),k==`y`&&(e=k.toLowerCase()+e.substring(1)),e}function normalizeToken(e,t,S=!0){let w=`${this.language}:${e}:${t}`;return S&&this.normalizationCache.has(w)?this.normalizationCache.get(w):this.stopWords?.includes(t)?(S&&this.normalizationCache.set(w,``),``):(this.stemmer&&!this.stemmerSkipProperties.has(e)&&(t=this.stemmer(t)),t=replaceDiacritics(t),S&&this.normalizationCache.set(w,t),t)}function trim(e){for(;e[e.length-1]===``;)e.pop();for(;e[0]===``;)e.shift();return e}function tokenize(e,t,S,w=!0){if(t&&t!==this.language)throw createError(`LANGUAGE_NOT_SUPPORTED`,t);if(typeof e!=`string`)return[e];let E=this.normalizeToken.bind(this,S??``),D;if(S&&this.tokenizeSkipProperties.has(S))D=[E(e,w)];else{let t=SPLITTERS[this.language];D=e.toLowerCase().split(t).map(e=>E(e,w)).filter(Boolean)}let O=trim(D);return this.allowDuplicates?O:Array.from(new Set(O))}function createTokenizer(e={}){if(!e.language)e.language=`english`;else if(!SUPPORTED_LANGUAGES.includes(e.language))throw createError(`LANGUAGE_NOT_SUPPORTED`,e.language);let t;if(e.stemming||e.stemmer&&!(`stemming`in e))if(e.stemmer){if(typeof e.stemmer!=`function`)throw createError(`INVALID_STEMMER_FUNCTION_TYPE`);t=e.stemmer}else if(e.language===`english`)t=stemmer;else throw createError(`MISSING_STEMMER`,e.language);let S;if(e.stopWords!==!1){if(S=[],Array.isArray(e.stopWords))S=e.stopWords;else if(typeof e.stopWords==`function`)S=e.stopWords(S);else if(e.stopWords)throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`);if(!Array.isArray(S))throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`);for(let e of S)if(typeof e!=`string`)throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`)}let w={tokenize,language:e.language,stemmer:t,stemmerSkipProperties:new Set(e.stemmerSkipProperties?[e.stemmerSkipProperties].flat():[]),tokenizeSkipProperties:new Set(e.tokenizeSkipProperties?[e.tokenizeSkipProperties].flat():[]),stopWords:S,allowDuplicates:!!e.allowDuplicates,normalizeToken,normalizationCache:new Map};return w.tokenize=tokenize.bind(w),w.normalizeToken=normalizeToken,w}function create$10(e){return{sharedInternalDocumentStore:e,rules:new Map}}function addRule(e,t){if(e.rules.has(t.id))throw Error(`PINNING_RULE_ALREADY_EXISTS: A pinning rule with id "${t.id}" already exists. Use updateRule to modify it.`);e.rules.set(t.id,t)}function updateRule(e,t){if(!e.rules.has(t.id))throw Error(`PINNING_RULE_NOT_FOUND: Cannot update pinning rule with id "${t.id}" because it does not exist. Use addRule to create it.`);e.rules.set(t.id,t)}function removeRule(e,t){return e.rules.delete(t)}function getRule(e,t){return e.rules.get(t)}function getAllRules(e){return Array.from(e.rules.values())}function matchesCondition(e,t){let S=e.toLowerCase().trim(),w=t.pattern.toLowerCase().trim();switch(t.anchoring){case`is`:return S===w;case`starts_with`:return S.startsWith(w);case`contains`:return S.includes(w);default:return!1}}function matchesRule(e,t){return e?t.conditions.every(t=>matchesCondition(e,t)):!1}function getMatchingRules(e,t){if(!t)return[];let S=[];for(let w of e.rules.values())matchesRule(t,w)&&S.push(w);return S}function load(e,t){return{sharedInternalDocumentStore:e,rules:new Map(t?.rules??[])}}function save(e){return{rules:Array.from(e.rules.entries())}}function createPinning(){return{create:create$10,addRule,updateRule,removeRule,getRule,getAllRules,getMatchingRules,load,save}}function validateComponents(e){let t={formatElapsedTime,getDocumentIndexId,getDocumentProperties,validateSchema};for(let S of FUNCTION_COMPONENTS){let w=S;if(e[w]){if(typeof e[w]!=`function`)throw createError(`COMPONENT_MUST_BE_FUNCTION`,w)}else e[w]=t[w]}for(let t of Object.keys(e))if(!OBJECT_COMPONENTS.includes(t)&&!FUNCTION_COMPONENTS.includes(t))throw createError(`UNSUPPORTED_COMPONENT`,t)}function create$9({schema:e,sort:t,language:S,components:w,id:E,plugins:D}){w||={};for(let t of D??[]){if(!(`getComponents`in t)||typeof t.getComponents!=`function`)continue;let S=t.getComponents(e),E=Object.keys(S);for(let e of E)if(w[e])throw createError(`PLUGIN_COMPONENT_CONFLICT`,e,t.name);w={...w,...S}}E||=uniqueId();let O=w.tokenizer,k=w.index,j=w.documentsStore,F=w.sorter,L=w.pinning;if(O=O?O.tokenize?O:createTokenizer(O):createTokenizer({language:S??`english`}),w.tokenizer&&S)throw createError(`NO_LANGUAGE_WITH_CUSTOM_TOKENIZER`);let B=createInternalDocumentIDStore();k||=createIndex(),F||=createSorter(),j||=createDocumentsStore(),L||=createPinning(),validateComponents(w);let{getDocumentProperties:H,getDocumentIndexId:q,validateSchema:J,formatElapsedTime:Y}=w,ee={data:{},caches:{},schema:e,tokenizer:O,index:k,sorter:F,documentsStore:j,pinning:L,internalDocumentIDStore:B,getDocumentProperties:H,getDocumentIndexId:q,validateSchema:J,beforeInsert:[],afterInsert:[],beforeRemove:[],afterRemove:[],beforeUpdate:[],afterUpdate:[],beforeUpsert:[],afterUpsert:[],beforeSearch:[],afterSearch:[],beforeInsertMultiple:[],afterInsertMultiple:[],beforeRemoveMultiple:[],afterRemoveMultiple:[],beforeUpdateMultiple:[],afterUpdateMultiple:[],beforeUpsertMultiple:[],afterUpsertMultiple:[],afterCreate:[],formatElapsedTime:Y,id:E,plugins:D,version:getVersion()};ee.data={index:ee.index.create(ee,B,e),docs:ee.documentsStore.create(ee,B),sorting:ee.sorter.create(ee,B,e,t),pinning:ee.pinning.create(B)};for(let e of AVAILABLE_PLUGIN_HOOKS)ee[e]=(ee[e]??[]).concat(getAllPluginsByHook(ee,e));let te=ee.afterCreate;return te&&runAfterCreate(te,ee),ee}function getVersion(){return`{{VERSION}}`}function count(e){return e.documentsStore.count(e.data.docs)}function insert(e,t,S,w,E){let D=e.validateSchema(t,e.schema);if(D)throw createError(`SCHEMA_VALIDATION_FAILURE`,D);return isAsyncFunction(e.beforeInsert)||isAsyncFunction(e.afterInsert)||isAsyncFunction(e.index.beforeInsert)||isAsyncFunction(e.index.insert)||isAsyncFunction(e.index.afterInsert)?innerInsertAsync(e,t,S,w,E):innerInsertSync(e,t,S,w,E)}const ENUM_TYPE=new Set([`enum`,`enum[]`]),STRING_NUMBER_TYPE=new Set([`string`,`number`]);async function innerInsertAsync(e,t,S,w,E){let{index:D,docs:O}=e.data,k=e.getDocumentIndexId(t);if(typeof k!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof k);let j=getInternalDocumentId(e.internalDocumentIDStore,k);if(w||await runSingleHook(e.beforeInsert,e,k,t),!e.documentsStore.store(O,k,j,t))throw createError(`DOCUMENT_ALREADY_EXISTS`,k);let F=e.documentsStore.count(O),L=e.index.getSearchableProperties(D),B=e.index.getSearchablePropertiesWithTypes(D),H=e.getDocumentProperties(t,L);for(let[e,t]of Object.entries(H)){if(t===void 0)continue;let S=typeof t,w=B[e];validateDocumentProperty(S,w,e,t)}return await indexAndSortDocument(e,k,L,H,F,S,t,E),w||await runSingleHook(e.afterInsert,e,k,t),k}function innerInsertSync(e,t,S,w,E){let{index:D,docs:O}=e.data,k=e.getDocumentIndexId(t);if(typeof k!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof k);let j=getInternalDocumentId(e.internalDocumentIDStore,k);if(w||runSingleHook(e.beforeInsert,e,k,t),!e.documentsStore.store(O,k,j,t))throw createError(`DOCUMENT_ALREADY_EXISTS`,k);let F=e.documentsStore.count(O),L=e.index.getSearchableProperties(D),B=e.index.getSearchablePropertiesWithTypes(D),H=e.getDocumentProperties(t,L);for(let[e,t]of Object.entries(H)){if(t===void 0)continue;let S=typeof t,w=B[e];validateDocumentProperty(S,w,e,t)}return indexAndSortDocumentSync(e,k,L,H,F,S,t,E),w||runSingleHook(e.afterInsert,e,k,t),k}function validateDocumentProperty(e,t,S,w){if(!(isGeoPointType(t)&&typeof w==`object`&&typeof w.lon==`number`&&typeof w.lat==`number`)&&!(isVectorType(t)&&Array.isArray(w))&&!(isArrayType(t)&&Array.isArray(w))&&!(ENUM_TYPE.has(t)&&STRING_NUMBER_TYPE.has(e))&&e!==t)throw createError(`INVALID_DOCUMENT_PROPERTY`,S,t,e)}async function indexAndSortDocument(e,t,S,w,E,D,O,k){for(let O of S){let S=w[O];if(S===void 0)continue;let j=e.index.getSearchablePropertiesWithTypes(e.data.index)[O];await e.index.beforeInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E);let F=e.internalDocumentIDStore.idToInternalId.get(t);await e.index.insert(e.index,e.data.index,O,t,F,S,j,D,e.tokenizer,E,k),await e.index.afterInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E)}let j=e.sorter.getSortableProperties(e.data.sorting),F=e.getDocumentProperties(O,j);for(let S of j){let w=F[S];if(w===void 0)continue;let E=e.sorter.getSortablePropertiesWithTypes(e.data.sorting)[S];e.sorter.insert(e.data.sorting,S,t,w,E,D)}}function indexAndSortDocumentSync(e,t,S,w,E,D,O,k){for(let O of S){let S=w[O];if(S===void 0)continue;let j=e.index.getSearchablePropertiesWithTypes(e.data.index)[O],F=getInternalDocumentId(e.internalDocumentIDStore,t);e.index.beforeInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E),e.index.insert(e.index,e.data.index,O,t,F,S,j,D,e.tokenizer,E,k),e.index.afterInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E)}let j=e.sorter.getSortableProperties(e.data.sorting),F=e.getDocumentProperties(O,j);for(let S of j){let w=F[S];if(w===void 0)continue;let E=e.sorter.getSortablePropertiesWithTypes(e.data.sorting)[S];e.sorter.insert(e.data.sorting,S,t,w,E,D)}}function insertMultiple(e,t,S,w,E,D){return isAsyncFunction(e.afterInsertMultiple)||isAsyncFunction(e.beforeInsertMultiple)||isAsyncFunction(e.index.beforeInsert)||isAsyncFunction(e.index.insert)||isAsyncFunction(e.index.afterInsert)?innerInsertMultipleAsync(e,t,S,w,E,D):innerInsertMultipleSync(e,t,S,w,E,D)}async function innerInsertMultipleAsync(e,t,S=1e3,w,E,D=0){let O=[],k=async D=>{let k=Math.min(D+S,t.length),j=t.slice(D,k);for(let t of j){let S=await insert(e,t,w,E,{avlRebalanceThreshold:j.length});O.push(S)}return k};return await(async()=>{let e=0;for(;e<t.length;){let t=Date.now();if(e=await k(e),D>0){let e=D-(Date.now()-t);e>0&&sleep$1(e)}}})(),E||await runMultipleHook(e.afterInsertMultiple,e,t),O}function innerInsertMultipleSync(e,t,S=1e3,w,E,D=0){let O=[],k=0;function j(){let D=t.slice(k*S,(k+1)*S);if(D.length===0)return!1;for(let t of D){let S=insert(e,t,w,E,{avlRebalanceThreshold:D.length});O.push(S)}return k++,!0}function F(){let e=Date.now();for(;j();)if(D>0){let t=Date.now()-e;if(t>=D){let e=D-t%D;e>0&&sleep$1(e)}}}return F(),E||runMultipleHook(e.afterInsertMultiple,e,t),O}const MODE_FULLTEXT_SEARCH=`fulltext`,MODE_HYBRID_SEARCH=`hybrid`,MODE_VECTOR_SEARCH=`vector`;function sortAsc(e,t){return e[1]-t[1]}function sortDesc(e,t){return t[1]-e[1]}function sortingPredicateBuilder(e=`desc`){return e.toLowerCase()===`asc`?sortAsc:sortDesc}function getFacets(e,t,S){let w={},E=t.map(([e])=>e),D=e.documentsStore.getMultiple(e.data.docs,E),O=Object.keys(S),k=e.index.getSearchablePropertiesWithTypes(e.data.index);for(let e of O){let t;if(k[e]===`number`){let{ranges:w}=S[e],E=w.length,D=Array.from({length:E});for(let e=0;e<E;e++){let t=w[e];D[e]=[`${t.from}-${t.to}`,0]}t=Object.fromEntries(D)}w[e]={count:0,values:t??{}}}let j=D.length;for(let e=0;e<j;e++){let t=D[e];for(let e of O){let E=e.includes(`.`)?getNested(t,e):t[e],D=k[e],O=w[e].values;switch(D){case`number`:{let t=S[e].ranges;calculateNumberFacetBuilder(t,O)(E);break}case`number[]`:{let t=new Set,w=S[e].ranges,D=calculateNumberFacetBuilder(w,O,t);for(let e of E)D(e);break}case`boolean`:case`enum`:case`string`:calculateBooleanStringOrEnumFacetBuilder(O,D)(E);break;case`boolean[]`:case`enum[]`:case`string[]`:{let e=calculateBooleanStringOrEnumFacetBuilder(O,D===`boolean[]`?`boolean`:`string`,new Set);for(let t of E)e(t);break}default:throw createError(`FACET_NOT_SUPPORTED`,D)}}}for(let e of O){let t=w[e];if(t.count=Object.keys(t.values).length,k[e]===`string`){let w=S[e],E=sortingPredicateBuilder(w.sort);t.values=Object.fromEntries(Object.entries(t.values).sort(E).slice(w.offset??0,w.limit??10))}}return w}function calculateNumberFacetBuilder(e,t,S){return w=>{for(let E of e){let e=`${E.from}-${E.to}`;S?.has(e)||w>=E.from&&w<=E.to&&(t[e]===void 0?t[e]=1:(t[e]++,S?.add(e)))}}}function calculateBooleanStringOrEnumFacetBuilder(e,t,S){let w=t===`boolean`?`false`:``;return t=>{let E=t?.toString()??w;S?.has(E)||(e[E]=(e[E]??0)+1,S?.add(E))}}const DEFAULT_REDUCE={reducer:(e,t,S,w)=>(t[w]=S,t),getInitialValue:e=>Array.from({length:e})},ALLOWED_TYPES=[`string`,`number`,`boolean`];function getGroups(e,t,S){let w=S.properties,E=w.length,D=e.index.getSearchablePropertiesWithTypes(e.data.index);for(let e=0;e<E;e++){let t=w[e];if(D[t]===void 0)throw createError(`UNKNOWN_GROUP_BY_PROPERTY`,t);if(!ALLOWED_TYPES.includes(D[t]))throw createError(`INVALID_GROUP_BY_PROPERTY`,t,ALLOWED_TYPES.join(`, `),D[t])}let O=t.map(([t])=>getDocumentIdFromInternalId(e.internalDocumentIDStore,t)),k=e.documentsStore.getMultiple(e.data.docs,O),j=k.length,F=S.maxResult||2**53-1,L=[],B={};for(let e=0;e<E;e++){let t=w[e],S={property:t,perValue:{}},E=new Set;for(let e=0;e<j;e++){let w=k[e],D=getNested(w,t);if(D===void 0)continue;let O=typeof D==`boolean`?``+D:D,j=S.perValue[O]??{indexes:[],count:0};j.count>=F||(j.indexes.push(e),j.count++,S.perValue[O]=j,E.add(D))}L.push(Array.from(E)),B[t]=S}let H=calculateCombination(L),q=H.length,J=[];for(let e=0;e<q;e++){let t=H[e],S=t.length,E={values:[],indexes:[]},D=[];for(let e=0;e<S;e++){let S=t[e],O=w[e];D.push(B[O].perValue[typeof S==`boolean`?``+S:S].indexes),E.values.push(S)}E.indexes=intersect(D).sort((e,t)=>e-t),E.indexes.length!==0&&J.push(E)}let Y=J.length,ee=Array.from({length:Y});for(let e=0;e<Y;e++){let w=J[e],E=S.reduce||DEFAULT_REDUCE,D=w.indexes.map(e=>({id:O[e],score:t[e][1],document:k[e]})),j=E.reducer.bind(null,w.values),F=E.getInitialValue(w.indexes.length),L=D.reduce(j,F);ee[e]={values:w.values,result:L}}return ee}function calculateCombination(e,t=0){if(t+1===e.length)return e[t].map(e=>[e]);let S=e[t],w=calculateCombination(e,t+1),E=[];for(let e of S)for(let t of w){let S=[e];safeArrayPush(S,t),E.push(S)}return E}function applyPinningRules(e,t,S,w){let E=getMatchingRules(t,w);if(E.length===0)return S;let D=E.flatMap(e=>e.consequence.promote);D.sort((e,t)=>e.position-t.position);let O=new Set,k=new Map,j=new Set;for(let t of D){let S=getInternalDocumentId(e.internalDocumentIDStore,t.doc_id);if(S!==void 0){if(k.has(S)){let e=k.get(S);t.position<e&&k.set(S,t.position);continue}j.has(t.position)||(O.add(S),k.set(S,t.position),j.add(t.position))}}if(k.size===0)return S;let F=S.filter(([e])=>!O.has(e)),L=1e6,B=[];for(let[t,w]of k.entries())S.find(([e])=>e===t)?B.push([t,1e6-w]):e.documentsStore.get(e.data.docs,t)&&B.push([t,0]);B.sort((e,t)=>(k.get(e[0])??1/0)-(k.get(t[0])??1/0));let H=[],q=new Map;for(let e of B){let t=k.get(e[0]);q.set(t,e)}let J=0,Y=0;for(;Y<F.length+B.length;)if(q.has(Y))H.push(q.get(Y)),Y++;else if(J<F.length)H.push(F[J]),J++,Y++;else break;for(let[e,t]of q.entries())e>=H.length&&H.push(t);return H}function innerFullTextSearch(e,t,S){let{term:w,properties:E}=t,D=e.data.index,O=e.caches.propertiesToSearch;if(!O){let t=e.index.getSearchablePropertiesWithTypes(D);O=e.index.getSearchableProperties(D),O=O.filter(e=>t[e].startsWith(`string`)),e.caches.propertiesToSearch=O}if(E&&E!==`*`){for(let e of E)if(!O.includes(e))throw createError(`UNKNOWN_INDEX`,e,O.join(`, `));O=O.filter(e=>E.includes(e))}let k=Object.keys(t.where??{}).length>0,j;k&&(j=e.index.searchByWhereClause(D,e.tokenizer,t.where,S));let F,L=t.threshold!==void 0&&t.threshold!==null?t.threshold:1;if(w||E){let E=count(e);if(F=e.index.search(D,w||``,e.tokenizer,S,O,t.exact||!1,t.tolerance||0,t.boost||{},applyDefault(t.relevance),E,j,L),t.exact&&w){let t=w.trim().split(/\s+/);F=F.filter(([S])=>{let w=e.documentsStore.get(e.data.docs,S);if(!w)return!1;for(let e of O){let S=getPropValue(w,e);if(typeof S==`string`&&t.every(e=>RegExp(`\\b${escapeRegex(e)}\\b`).test(S)))return!0}return!1})}}else F=k?searchByGeoWhereClause(D,t.where)||(j?Array.from(j):[]).map(e=>[+e,0]):Object.keys(e.documentsStore.getAll(e.data.docs)).map(e=>[+e,0]);return F}function escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function getPropValue(e,t){let S=t.split(`.`),w=e;for(let e of S)if(w&&typeof w==`object`&&e in w)w=w[e];else return;return w}function fullTextSearch(e,t,S){let w=getNanosecondsTime();function E(){let E=Object.keys(e.data.index.vectorIndexes),D=t.facets&&Object.keys(t.facets).length>0,{limit:O=10,offset:k=0,distinctOn:j,includeVectors:F=!1}=t,L=t.preflight===!0,B=innerFullTextSearch(e,t,S);if(t.sortBy)if(typeof t.sortBy==`function`){let S=B.map(([e])=>e),w=e.documentsStore.getMultiple(e.data.docs,S).map((e,t)=>[B[t][0],B[t][1],e]);w.sort(t.sortBy),B=w.map(([e,t])=>[e,t])}else B=e.sorter.sortBy(e.data.sorting,B,t.sortBy).map(([t,S])=>[getInternalDocumentId(e.internalDocumentIDStore,t),S]);else B=B.sort(sortTokenScorePredicate);B=applyPinningRules(e,e.data.pinning,B,t.term);let H;L||(H=j?fetchDocumentsWithDistinct(e,B,k,O,j):fetchDocuments(e,B,k,O));let q={elapsed:{formatted:``,raw:0},hits:[],count:B.length};return H!==void 0&&(q.hits=H.filter(Boolean),F||removeVectorsFromHits(q,E)),D&&(q.facets=getFacets(e,B,t.facets)),t.groupBy&&(q.groups=getGroups(e,B,t.groupBy)),q.elapsed=e.formatElapsedTime(getNanosecondsTime()-w),q}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}const defaultBM25Params={k:1.2,b:.75,d:.5};function applyDefault(e){let t=e??{};return t.k=t.k??defaultBM25Params.k,t.b=t.b??defaultBM25Params.b,t.d=t.d??defaultBM25Params.d,t}function innerVectorSearch(e,t,S){let w=t.vector;if(w&&(!(`value`in w)||!(`property`in w)))throw createError(`INVALID_VECTOR_INPUT`,Object.keys(w).join(`, `));let E=e.data.index.vectorIndexes[w.property];if(!E)throw createError(`UNKNOWN_VECTOR_PROPERTY`,w.property);let D=E.node.size;if(w?.value.length!==D)throw w?.property===void 0||w?.value.length===void 0?createError(`INVALID_INPUT_VECTOR`,`undefined`,D,`undefined`):createError(`INVALID_INPUT_VECTOR`,w.property,D,w.value.length);let O=e.data.index,k;return Object.keys(t.where??{}).length>0&&(k=e.index.searchByWhereClause(O,e.tokenizer,t.where,S)),E.node.find(w.value,t.similarity??.8,k)}function searchVector(e,t,S=`english`){let w=getNanosecondsTime();function E(){let E=innerVectorSearch(e,t,S).sort(sortTokenScorePredicate);E=applyPinningRules(e,e.data.pinning,E,void 0);let D=[];t.facets&&Object.keys(t.facets).length>0&&(D=getFacets(e,E,t.facets));let O=t.vector.property,k=t.includeVectors??!1,j=t.limit??10,F=t.offset??0,L=Array.from({length:j});for(let t=0;t<j;t++){let S=E[t+F];if(!S)break;let w=e.data.docs.docs[S[0]];w&&(k||(w[O]=null),L[t]={id:getDocumentIdFromInternalId(e.internalDocumentIDStore,S[0]),score:S[1],document:w})}let B=[];t.groupBy&&(B=getGroups(e,E,t.groupBy));let H=getNanosecondsTime()-w;return{count:E.length,hits:L.filter(Boolean),elapsed:{raw:Number(H),formatted:formatNanoseconds(H)},...D?{facets:D}:{},...B?{groups:B}:{}}}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}function innerHybridSearch(e,t,S){let w=minMaxScoreNormalization(innerFullTextSearch(e,t,S)),E=innerVectorSearch(e,t,S),D=t.hybridWeights;return mergeAndRankResults(w,E,t.term??``,D)}function hybridSearch(e,t,S){let w=getNanosecondsTime();function E(){let E=innerHybridSearch(e,t,S);E=applyPinningRules(e,e.data.pinning,E,t.term);let D;t.facets&&Object.keys(t.facets).length>0&&(D=getFacets(e,E,t.facets));let O;t.groupBy&&(O=getGroups(e,E,t.groupBy));let k=t.offset??0,j=t.limit??10,F=fetchDocuments(e,E,k,j).filter(Boolean),L=getNanosecondsTime(),B={count:E.length,elapsed:{raw:Number(L-w),formatted:formatNanoseconds(L-w)},hits:F,...D?{facets:D}:{},...O?{groups:O}:{}};return(t.includeVectors??!1)||removeVectorsFromHits(B,Object.keys(e.data.index.vectorIndexes)),B}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}function extractScore(e){return e[1]}function minMaxScoreNormalization(e){let t=Math.max.apply(Math,e.map(extractScore));return e.map(([e,S])=>[e,S/t])}function normalizeScore(e,t){return e/t}function hybridScoreBuilder(e,t){return(S,w)=>S*e+w*t}function mergeAndRankResults(e,t,S,w){let E=Math.max.apply(Math,e.map(extractScore)),D=Math.max.apply(Math,t.map(extractScore)),{text:O,vector:k}=w&&w.text&&w.vector?w:getQueryWeights(S),j=new Map,F=e.length,L=hybridScoreBuilder(O,k);for(let t=0;t<F;t++){let[S,w]=e[t],D=L(normalizeScore(w,E),0);j.set(S,D)}let B=t.length;for(let e=0;e<B;e++){let[S,w]=t[e],E=normalizeScore(w,D),O=j.get(S)??0;j.set(S,O+L(0,E))}return[...j].sort((e,t)=>t[1]-e[1])}function getQueryWeights(e){return{text:.5,vector:.5}}function search(e,t,S){let w=t.mode??`fulltext`;if(w===`fulltext`)return fullTextSearch(e,t,S);if(w===`vector`)return searchVector(e,t);if(w===`hybrid`)return hybridSearch(e,t);throw createError(`INVALID_SEARCH_MODE`,w)}function fetchDocumentsWithDistinct(e,t,S,w,E){let D=e.data.docs,O=new Map,k=[],j=new Set,F=t.length,L=0;for(let B=0;B<F;B++){let F=t[B];if(F===void 0)continue;let[H,q]=F;if(j.has(H))continue;let J=e.documentsStore.get(D,H),Y=getNested(J,E);if(!(Y===void 0||O.has(Y))&&(O.set(Y,!0),L++,!(L<=S)&&(k.push({id:getDocumentIdFromInternalId(e.internalDocumentIDStore,H),score:q,document:J}),j.add(H),L>=S+w)))break}return k}function fetchDocuments(e,t,S,w){let E=e.data.docs,D=Array.from({length:w}),O=new Set;for(let k=S;k<w+S;k++){let S=t[k];if(S===void 0)break;let[w,j]=S;if(!O.has(w)){let t=e.documentsStore.get(E,w);D[k]={id:getDocumentIdFromInternalId(e.internalDocumentIDStore,w),score:j,document:t},O.add(w)}}return D}var import_diff_match_patch=__toESM$1(require_diff_match_patch(),1);const dmp$1=new import_diff_match_patch.default;function diffLinesFast(e,t){if(e===t)return[{value:e}];let{chars1:S,chars2:w,lineArray:E}=dmp$1.diff_linesToChars_(e,t),D=dmp$1.diff_main(S,w,!1);dmp$1.diff_charsToLines_(D,E),dmp$1.diff_cleanupSemantic(D);let O=[];for(let[e,t]of D)e===import_diff_match_patch.default.DIFF_DELETE?O.push({value:t,removed:!0}):e===import_diff_match_patch.default.DIFF_INSERT?O.push({value:t,added:!0}):O.push({value:t});return O}const dmpDiff=new import_diff_match_patch.default;dmpDiff.Diff_Timeout=.25;const APPLY_FAST_DIFF_MAX_BYTES=256*1024;function applyIncrementalDiff(e,t,S){if(t===S)return;let w=diffLinesFast(t,S),E=0;for(let S=0;S<w.length;S++){let D=w[S],O=w[S+1];if(D.removed&&O?.added){if(t.substring(E,E+O.value.length)===O.value){E+=O.value.length,S++;continue}e.delete(E,D.value.length),e.insert(E,O.value),E+=O.value.length,S++}else D.removed?e.delete(E,D.value.length):(D.added&&e.insert(E,D.value),E+=D.value.length)}}function applyFastDiff(e,t,S){if(t===S)return;if(t.length>APPLY_FAST_DIFF_MAX_BYTES||S.length>APPLY_FAST_DIFF_MAX_BYTES){applyByPrefixSuffixMiddleReplace(e,t,S);return}let w=dmpDiff.diff_main(t,S);dmpDiff.diff_cleanupSemantic(w);let E=0;for(let[t,S]of w)t===0?E+=S.length:t===-1?e.delete(E,S.length):t===1&&(e.insert(E,S),E+=S.length)}function applyByPrefixSuffixMiddleReplace(e,t,S){let w=0,E=Math.min(t.length,S.length);for(;w<E&&t.charCodeAt(w)===S.charCodeAt(w);)w++;let D=0;for(;D<E-w&&t.charCodeAt(t.length-1-D)===S.charCodeAt(S.length-1-D);)D++;let O=t.length-w-D,k=S.slice(w,S.length-D);O>0&&e.delete(w,O),k.length>0&&e.insert(w,k)}const FrontmatterIssueSchema=object$1({path:array(union([string$2(),number$1()])),message:string$2(),issueCode:string$2()}),FrontmatterValidationErrorSchema=discriminatedUnion(`code`,[object$1({code:literal(`SCHEMA_INVALID`),issues:array(FrontmatterIssueSchema)}),object$1({code:literal(`WRITE_ERROR`),detail:string$2()})]),FRONTMATTER_TYPES=[`text`,`number`,`boolean`,`date`,`list`],FrontmatterTypeSchema=_enum(FRONTMATTER_TYPES),FrontmatterValueSchema=union([string$2(),number$1(),boolean$1(),array(union([string$2(),number$1(),boolean$1()]).transform(e=>String(e)))]),FrontmatterMapSchema=record(string$2(),FrontmatterValueSchema),FrontmatterPatchSchema=record(string$2(),union([FrontmatterValueSchema,_null()])),FRONTMATTER_RE$1=/^---\r?\n([\s\S]*?\r?\n)?---(\r?\n|$)/;function stripFrontmatter(e){let t=e.match(FRONTMATTER_RE$1);return t?{frontmatter:t[0],body:e.slice(t[0].length)}:{frontmatter:``,body:e}}function prependFrontmatter(e,t){return e?e+t:t}function unwrapFrontmatterFences(e){if(e===``)return``;let t=e.match(FRONTMATTER_RE$1);return t?(t[1]??``).replace(/\r?\n$/,``):e}const STRINGIFY_OPTIONS={defaultKeyType:`PLAIN`,defaultStringType:`PLAIN`,lineWidth:0};function parseFrontmatterYaml(e){if(e.trim()===``)return{doc:new import_dist$1.Document({}),map:{}};let t;try{t=(0,import_dist$1.parseDocument)(e)}catch(e){let t=e instanceof Error?e.message:String(e);return{doc:new import_dist$1.Document({}),map:null,parseError:`parse threw: ${t}`}}if(t.errors.length>0)return{doc:t,map:null,parseError:t.errors[0]?.message??`yaml parse errors`};let S;try{S=t.toJS()}catch(e){let S=e instanceof Error?e.message:String(e);return{doc:t,map:null,parseError:`toJS threw: ${S}`}}if(typeof S!=`object`||!S||Array.isArray(S))return{doc:t,map:null,parseError:`top-level value is not a mapping`};let w=FrontmatterMapSchema.safeParse(S);if(!w.success){let e=w.error.issues[0],S=e&&Array.isArray(e.path)?e.path.join(`.`):``,E=e?.message??`unknown`;return{doc:t,map:null,parseError:S?`value at "${S}" failed schema: ${E}`:`schema validation failed: ${E}`}}return{doc:t,map:w.data}}function withFences(e){return e===``?``:`---\n${e.endsWith(`
|
|
299
|
+
`,ANSWER_SESSION_LAST_MESSAGE_IS_NOT_ASSISTANT:`The last message in the session is not an assistant message. Cannot regenerate non-assistant messages.`,PLUGIN_COMPONENT_CONFLICT:`The component "%s" is already defined. The plugin "%s" is trying to redefine it.`};function createError(e,...t){let S=Error(sprintf(errors[e]??`Unsupported Orama Error code: ${e}`,...t));return S.code=e,`captureStackTrace`in Error.prototype&&Error.captureStackTrace(S),S}function formatElapsedTime(e){return{raw:Number(e),formatted:formatNanoseconds(e)}}function getDocumentIndexId(e){if(e.id){if(typeof e.id!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof e.id);return e.id}return uniqueId()}function validateSchema(e,t){for(let[S,w]of Object.entries(t)){let t=e[S];if(t!==void 0&&!(w===`geopoint`&&typeof t==`object`&&typeof t.lon==`number`&&typeof t.lat==`number`)&&!(w===`enum`&&(typeof t==`string`||typeof t==`number`))){if(w===`enum[]`&&Array.isArray(t)){let e=t.length;for(let w=0;w<e;w++)if(typeof t[w]!=`string`&&typeof t[w]!=`number`)return S+`.`+w;continue}if(isVectorType(w)){let e=getVectorSize(w);if(!Array.isArray(t)||t.length!==e)throw createError(`INVALID_INPUT_VECTOR`,S,e,t.length);continue}if(isArrayType(w)){if(!Array.isArray(t))return S;let e=getInnerType(w),E=t.length;for(let w=0;w<E;w++)if(typeof t[w]!==e)return S+`.`+w;continue}if(typeof w==`object`){if(!t||typeof t!=`object`)return S;let e=validateSchema(t,w);if(e)return S+`.`+e;continue}if(typeof t!==w)return S}}}const IS_ARRAY_TYPE={string:!1,number:!1,boolean:!1,enum:!1,geopoint:!1,"string[]":!0,"number[]":!0,"boolean[]":!0,"enum[]":!0},INNER_TYPE={"string[]":`string`,"number[]":`number`,"boolean[]":`boolean`,"enum[]":`enum`};function isGeoPointType(e){return e===`geopoint`}function isVectorType(e){return typeof e==`string`&&/^vector\[\d+\]$/.test(e)}function isArrayType(e){return typeof e==`string`&&IS_ARRAY_TYPE[e]}function getInnerType(e){return INNER_TYPE[e]}function getVectorSize(e){let t=Number(e.slice(7,-1));switch(!0){case isNaN(t):throw createError(`INVALID_VECTOR_VALUE`,e);case t<=0:throw createError(`INVALID_VECTOR_SIZE`,e);default:return t}}function createInternalDocumentIDStore(){return{idToInternalId:new Map,internalIdToId:[],save:save$4,load:load$4}}function save$4(e){return{internalIdToId:e.internalIdToId}}function load$4(e,t){let{internalIdToId:S}=t;e.internalDocumentIDStore.idToInternalId.clear(),e.internalDocumentIDStore.internalIdToId=[];let w=S.length;for(let t=0;t<w;t++){let w=S[t];e.internalDocumentIDStore.idToInternalId.set(w,t+1),e.internalDocumentIDStore.internalIdToId.push(w)}}function getInternalDocumentId(e,t){if(typeof t==`string`){let S=e.idToInternalId.get(t);if(S)return S;let w=e.idToInternalId.size+1;return e.idToInternalId.set(t,w),e.internalIdToId.push(t),w}return t>e.internalIdToId.length?getInternalDocumentId(e,t.toString()):t}function getDocumentIdFromInternalId(e,t){if(e.internalIdToId.length<t)throw Error(`Invalid internalId ${t}`);return e.internalIdToId[t-1]}function create$13(e,t){return{sharedInternalDocumentStore:t,docs:{},count:0}}function get(e,t){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t);return e.docs[S]}function getMultiple(e,t){let S=t.length,w=Array.from({length:S});for(let E=0;E<S;E++){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t[E]);w[E]=e.docs[S]}return w}function getAll(e){return e.docs}function store(e,t,S,w){return e.docs[S]===void 0?(e.docs[S]=w,e.count++,!0):!1}function remove$2(e,t){let S=getInternalDocumentId(e.sharedInternalDocumentStore,t);return e.docs[S]===void 0?!1:(delete e.docs[S],e.count--,!0)}function count$1(e){return e.count}function load$3(e,t){let S=t;return{docs:S.docs,count:S.count,sharedInternalDocumentStore:e}}function save$3(e){return{docs:e.docs,count:e.count}}function createDocumentsStore(){return{create:create$13,get,getMultiple,getAll,store,remove:remove$2,count:count$1,load:load$3,save:save$3}}const AVAILABLE_PLUGIN_HOOKS=[`beforeInsert`,`afterInsert`,`beforeRemove`,`afterRemove`,`beforeUpdate`,`afterUpdate`,`beforeUpsert`,`afterUpsert`,`beforeSearch`,`afterSearch`,`beforeInsertMultiple`,`afterInsertMultiple`,`beforeRemoveMultiple`,`afterRemoveMultiple`,`beforeUpdateMultiple`,`afterUpdateMultiple`,`beforeUpsertMultiple`,`afterUpsertMultiple`,`beforeLoad`,`afterLoad`,`afterCreate`];function getAllPluginsByHook(e,t){let S=[],w=e.plugins?.length;if(!w)return S;for(let E=0;E<w;E++)try{let w=e.plugins[E];typeof w[t]==`function`&&S.push(w[t])}catch(e){throw console.error(`Caught error in getAllPluginsByHook:`,e),createError(`PLUGIN_CRASHED`)}return S}const OBJECT_COMPONENTS=[`tokenizer`,`index`,`documentsStore`,`sorter`,`pinning`],FUNCTION_COMPONENTS=[`validateSchema`,`getDocumentIndexId`,`getDocumentProperties`,`formatElapsedTime`];function runSingleHook(e,t,S,w){if(e.some(isAsyncFunction))return(async()=>{for(let E of e)await E(t,S,w)})();for(let E of e)E(t,S,w)}function runMultipleHook(e,t,S){if(e.some(isAsyncFunction))return(async()=>{for(let w of e)await w(t,S)})();for(let w of e)w(t,S)}function runAfterSearch(e,t,S,w,E){if(e.some(isAsyncFunction))return(async()=>{for(let D of e)await D(t,S,w,E)})();for(let D of e)D(t,S,w,E)}function runBeforeSearch(e,t,S,w){if(e.some(isAsyncFunction))return(async()=>{for(let E of e)await E(t,S,w)})();for(let E of e)E(t,S,w)}function runAfterCreate(e,t){if(e.some(isAsyncFunction))return(async()=>{for(let S of e)await S(t)})();for(let S of e)S(t)}var AVLNode=class e{k;v;l=null;r=null;h=1;constructor(e,t){this.k=e,this.v=new Set(t)}updateHeight(){this.h=Math.max(e.getHeight(this.l),e.getHeight(this.r))+1}static getHeight(e){return e?e.h:0}getBalanceFactor(){return e.getHeight(this.l)-e.getHeight(this.r)}rotateLeft(){let e=this.r;return this.r=e.l,e.l=this,this.updateHeight(),e.updateHeight(),e}rotateRight(){let e=this.l;return this.l=e.r,e.r=this,this.updateHeight(),e.updateHeight(),e}toJSON(){return{k:this.k,v:Array.from(this.v),l:this.l?this.l.toJSON():null,r:this.r?this.r.toJSON():null,h:this.h}}static fromJSON(t){let S=new e(t.k,t.v);return S.l=t.l?e.fromJSON(t.l):null,S.r=t.r?e.fromJSON(t.r):null,S.h=t.h,S}},AVLTree=class e{root=null;insertCount=0;constructor(e,t){e!==void 0&&t!==void 0&&(this.root=new AVLNode(e,t))}insert(e,t,S=1e3){this.root=this.insertNode(this.root,e,t,S)}insertMultiple(e,t,S=1e3){for(let w of t)this.insert(e,w,S)}rebalance(){this.root&&=this.rebalanceNode(this.root)}toJSON(){return{root:this.root?this.root.toJSON():null,insertCount:this.insertCount}}static fromJSON(t){let S=new e;return S.root=t.root?AVLNode.fromJSON(t.root):null,S.insertCount=t.insertCount||0,S}insertNode(e,t,S,w){if(e===null)return new AVLNode(t,[S]);let E=[],D=e,O=null;for(;D!==null;)if(E.push({parent:O,node:D}),t<D.k)if(D.l===null){D.l=new AVLNode(t,[S]),E.push({parent:D,node:D.l});break}else O=D,D=D.l;else if(t>D.k)if(D.r===null){D.r=new AVLNode(t,[S]),E.push({parent:D,node:D.r});break}else O=D,D=D.r;else return D.v.add(S),e;let k=!1;this.insertCount++%w===0&&(k=!0);for(let t=E.length-1;t>=0;t--){let{parent:S,node:w}=E[t];if(w.updateHeight(),k){let t=this.rebalanceNode(w);S?S.l===w?S.l=t:S.r===w&&(S.r=t):e=t}}return e}rebalanceNode(e){let t=e.getBalanceFactor();if(t>1){if(e.l&&e.l.getBalanceFactor()>=0)return e.rotateRight();if(e.l)return e.l=e.l.rotateLeft(),e.rotateRight()}if(t<-1){if(e.r&&e.r.getBalanceFactor()<=0)return e.rotateLeft();if(e.r)return e.r=e.r.rotateRight(),e.rotateLeft()}return e}find(e){let t=this.findNodeByKey(e);return t?t.v:null}contains(e){return this.find(e)!==null}getSize(){let e=0,t=[],S=this.root;for(;S||t.length>0;){for(;S;)t.push(S),S=S.l;S=t.pop(),e++,S=S.r}return e}isBalanced(){if(!this.root)return!0;let e=[this.root];for(;e.length>0;){let t=e.pop(),S=t.getBalanceFactor();if(Math.abs(S)>1)return!1;t.l&&e.push(t.l),t.r&&e.push(t.r)}return!0}remove(e){this.root=this.removeNode(this.root,e)}removeDocument(e,t){let S=this.findNodeByKey(e);S&&(S.v.size===1?this.root=this.removeNode(this.root,e):S.v=new Set([...S.v.values()].filter(e=>e!==t)))}findNodeByKey(e){let t=this.root;for(;t;)if(e<t.k)t=t.l;else if(e>t.k)t=t.r;else return t;return null}removeNode(e,t){if(e===null)return null;let S=[],w=e;for(;w!==null&&w.k!==t;)S.push(w),w=t<w.k?w.l:w.r;if(w===null)return e;if(w.l===null||w.r===null){let t=w.l?w.l:w.r;if(S.length===0)e=t;else{let e=S[S.length-1];e.l===w?e.l=t:e.r=t}}else{let e=w,t=w.r;for(;t.l!==null;)e=t,t=t.l;w.k=t.k,w.v=t.v,e.l===t?e.l=t.r:e.r=t.r,w=e}S.push(w);for(let t=S.length-1;t>=0;t--){let w=S[t];w.updateHeight();let E=this.rebalanceNode(w);if(t>0){let e=S[t-1];e.l===w?e.l=E:e.r===w&&(e.r=E)}else e=E}return e}rangeSearch(e,t){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.l;if(E=w.pop(),E.k>=e&&E.k<=t)for(let e of E.v)S.add(e);if(E.k>t)break;E=E.r}return S}greaterThan(e,t=!1){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.r;if(E=w.pop(),t&&E.k>=e||!t&&E.k>e)for(let e of E.v)S.add(e);else if(E.k<=e)break;E=E.l}return S}lessThan(e,t=!1){let S=new Set,w=[],E=this.root;for(;E||w.length>0;){for(;E;)w.push(E),E=E.l;if(E=w.pop(),t&&E.k<=e||!t&&E.k<e)for(let e of E.v)S.add(e);else if(E.k>e)break;E=E.r}return S}},FlatTree=class e{numberToDocumentId;constructor(){this.numberToDocumentId=new Map}insert(e,t){this.numberToDocumentId.has(e)?this.numberToDocumentId.get(e).add(t):this.numberToDocumentId.set(e,new Set([t]))}find(e){let t=this.numberToDocumentId.get(e);return t?Array.from(t):null}remove(e){this.numberToDocumentId.delete(e)}removeDocument(e,t){let S=this.numberToDocumentId.get(t);S&&(S.delete(e),S.size===0&&this.numberToDocumentId.delete(t))}contains(e){return this.numberToDocumentId.has(e)}getSize(){let e=0;for(let t of this.numberToDocumentId.values())e+=t.size;return e}filter(e){let t=Object.keys(e);if(t.length!==1)throw Error(`Invalid operation`);let S=t[0];switch(S){case`eq`:{let t=e[S],w=this.numberToDocumentId.get(t);return w?Array.from(w):[]}case`in`:{let t=e[S],w=new Set;for(let e of t){let t=this.numberToDocumentId.get(e);if(t)for(let e of t)w.add(e)}return Array.from(w)}case`nin`:{let t=new Set(e[S]),w=new Set;for(let[e,S]of this.numberToDocumentId.entries())if(!t.has(e))for(let e of S)w.add(e);return Array.from(w)}default:throw Error(`Invalid operation`)}}filterArr(e){let t=Object.keys(e);if(t.length!==1)throw Error(`Invalid operation`);let S=t[0];switch(S){case`containsAll`:{let t=e[S].map(e=>this.numberToDocumentId.get(e)??new Set);if(t.length===0)return[];let w=t.reduce((e,t)=>new Set([...e].filter(e=>t.has(e))));return Array.from(w)}case`containsAny`:{let t=e[S].map(e=>this.numberToDocumentId.get(e)??new Set);if(t.length===0)return[];let w=t.reduce((e,t)=>new Set([...e,...t]));return Array.from(w)}default:throw Error(`Invalid operation`)}}static fromJSON(t){if(!t.numberToDocumentId)throw Error(`Invalid Flat Tree JSON`);let S=new e;for(let[e,w]of t.numberToDocumentId)S.numberToDocumentId.set(e,new Set(w));return S}toJSON(){return{numberToDocumentId:Array.from(this.numberToDocumentId.entries()).map(([e,t])=>[e,Array.from(t)])}}};function _boundedLevenshtein(e,t,S){if(S<0)return-1;if(e===t)return 0;let w=e.length,E=t.length;if(w===0)return E<=S?E:-1;if(E===0)return w<=S?w:-1;let D=Math.abs(w-E);if(e.startsWith(t))return D<=S?D:-1;if(t.startsWith(e))return 0;if(D>S)return-1;let O=[];for(let e=0;e<=w;e++){O[e]=[e];for(let t=1;t<=E;t++)O[e][t]=e===0?t:0}for(let D=1;D<=w;D++){let w=1/0;for(let S=1;S<=E;S++)e[D-1]===t[S-1]?O[D][S]=O[D-1][S-1]:O[D][S]=Math.min(O[D-1][S]+1,O[D][S-1]+1,O[D-1][S-1]+1),w=Math.min(w,O[D][S]);if(w>S)return-1}return O[w][E]<=S?O[w][E]:-1}function syncBoundedLevenshtein(e,t,S){let w=_boundedLevenshtein(e,t,S);return{distance:w,isBounded:w>=0}}var RadixNode=class e{k;s;c=new Map;d=new Set;e;w=``;constructor(e,t,S){this.k=e,this.s=t,this.e=S}updateParent(e){this.w=e.w+this.s}addDocument(e){this.d.add(e)}removeDocument(e){return this.d.delete(e)}findAllWords(e,t,S,w){let E=[this];for(;E.length>0;){let D=E.pop();if(D.e){let{w:E,d:O}=D;if(S&&E!==t)continue;if(getOwnProperty(e,E)!==null)if(w)if(Math.abs(t.length-E.length)<=w&&syncBoundedLevenshtein(t,E,w).isBounded)e[E]=[];else continue;else e[E]=[];if(getOwnProperty(e,E)!=null&&O.size>0){let t=e[E];for(let e of O)t.includes(e)||t.push(e)}}D.c.size>0&&E.push(...D.c.values())}return e}insert(t,S){let w=this,E=0,D=t.length;for(;E<D;){let O=t[E],k=w.c.get(O);if(k){let O=k.s,j=O.length,F=0;for(;F<j&&E+F<D&&O[F]===t[E+F];)F++;if(F===j){if(w=k,E+=F,E===D){k.e||=!0,k.addDocument(S);return}continue}let L=O.slice(0,F),B=O.slice(F),H=t.slice(E+F),q=new e(L[0],L,!1);if(w.c.set(L[0],q),q.updateParent(w),k.s=B,k.k=B[0],q.c.set(B[0],k),k.updateParent(q),H){let t=new e(H[0],H,!0);t.addDocument(S),q.c.set(H[0],t),t.updateParent(q)}else q.e=!0,q.addDocument(S);return}else{let D=new e(O,t.slice(E),!0);D.addDocument(S),w.c.set(O,D),D.updateParent(w);return}}w.e||=!0,w.addDocument(S)}_findLevenshtein(e,t,S,w,E){let D=[{node:this,index:t,tolerance:S}];for(;D.length>0;){let{node:t,index:S,tolerance:O}=D.pop();if(t.w.startsWith(e)){t.findAllWords(E,e,!1,0);continue}if(O<0)continue;if(t.e){let{w:S,d:D}=t;if(S&&(syncBoundedLevenshtein(e,S,w).isBounded&&(E[S]=[]),getOwnProperty(E,S)!==void 0&&D.size>0)){let e=new Set(E[S]);for(let t of D)e.add(t);E[S]=Array.from(e)}}if(S>=e.length)continue;let k=e[S];if(t.c.has(k)){let e=t.c.get(k);D.push({node:e,index:S+1,tolerance:O})}D.push({node:t,index:S+1,tolerance:O-1});for(let[e,w]of t.c)D.push({node:w,index:S,tolerance:O-1}),e!==k&&D.push({node:w,index:S+1,tolerance:O-1})}}find(e){let{term:t,exact:S,tolerance:w}=e;if(w&&!S){let e={};return this._findLevenshtein(t,0,w,w,e),e}else{let e=this,E=0,D=t.length;for(;E<D;){let O=t[E],k=e.c.get(O);if(k){let O=k.s,j=O.length,F=0;for(;F<j&&E+F<D&&O[F]===t[E+F];)F++;if(F===j)e=k,E+=F;else if(E+F===D)if(F===D-E){if(S)return{};{let e={};return k.findAllWords(e,t,S,w),e}}else return{};else return{}}else return{}}let O={};return e.findAllWords(O,t,S,w),O}}contains(e){let t=this,S=0,w=e.length;for(;S<w;){let E=e[S],D=t.c.get(E);if(D){let E=D.s,O=E.length,k=0;for(;k<O&&S+k<w&&E[k]===e[S+k];)k++;if(k<O)return!1;S+=O,t=D}else return!1}return!0}removeWord(e){if(!e)return!1;let t=this,S=e.length,w=[];for(let E=0;E<S;E++){let S=e[E];if(t.c.has(S)){let e=t.c.get(S);w.push({parent:t,character:S}),E+=e.s.length-1,t=e}else return!1}for(t.d.clear(),t.e=!1;w.length>0&&t.c.size===0&&!t.e&&t.d.size===0;){let{parent:e,character:S}=w.pop();e.c.delete(S),t=e}return!0}removeDocumentByWord(e,t,S=!0){if(!e)return!0;let w=this,E=e.length;for(let D=0;D<E;D++){let E=e[D];if(w.c.has(E)){let O=w.c.get(E);D+=O.s.length-1,w=O,S&&w.w!==e||w.removeDocument(t)}else return!1}return!0}static getCommonPrefix(e,t){let S=Math.min(e.length,t.length),w=0;for(;w<S&&e.charCodeAt(w)===t.charCodeAt(w);)w++;return e.slice(0,w)}toJSON(){return{w:this.w,s:this.s,e:this.e,k:this.k,d:Array.from(this.d),c:Array.from(this.c?.entries())?.map(([e,t])=>[e,t.toJSON()])}}static fromJSON(t){let S=new e(t.k,t.s,t.e);return S.w=t.w,S.d=new Set(t.d),S.c=new Map(t?.c?.map(([t,S])=>[t,e.fromJSON(S)])||[]),S}},RadixTree=class e extends RadixNode{constructor(){super(``,``,!1)}static fromJSON(t){let S=new e;return S.w=t.w,S.s=t.s,S.e=t.e,S.k=t.k,S.d=new Set(t.d),S.c=new Map(t?.c?.map(([e,t])=>[e,RadixNode.fromJSON(t)])||[]),S}toJSON(){return super.toJSON()}};const K$1=2,EARTH_RADIUS=6371e3;var BKDNode=class e{point;docIDs;left;right;parent;constructor(e,t){this.point=e,this.docIDs=new Set(t),this.left=null,this.right=null,this.parent=null}toJSON(){return{point:this.point,docIDs:Array.from(this.docIDs),left:this.left?this.left.toJSON():null,right:this.right?this.right.toJSON():null}}static fromJSON(t,S=null){let w=new e(t.point,t.docIDs);return w.parent=S,t.left&&(w.left=e.fromJSON(t.left,w)),t.right&&(w.right=e.fromJSON(t.right,w)),w}},BKDTree=class e{root;nodeMap;constructor(){this.root=null,this.nodeMap=new Map}getPointKey(e){return`${e.lon},${e.lat}`}insert(e,t){let S=this.getPointKey(e),w=this.nodeMap.get(S);if(w){t.forEach(e=>w.docIDs.add(e));return}let E=new BKDNode(e,t);if(this.nodeMap.set(S,E),this.root==null){this.root=E;return}let D=this.root,O=0;for(;;){if(O%K$1===0)if(e.lon<D.point.lon){if(D.left==null){D.left=E,E.parent=D;return}D=D.left}else{if(D.right==null){D.right=E,E.parent=D;return}D=D.right}else if(e.lat<D.point.lat){if(D.left==null){D.left=E,E.parent=D;return}D=D.left}else{if(D.right==null){D.right=E,E.parent=D;return}D=D.right}O++}}contains(e){let t=this.getPointKey(e);return this.nodeMap.has(t)}getDocIDsByCoordinates(e){let t=this.getPointKey(e),S=this.nodeMap.get(t);return S?Array.from(S.docIDs):null}removeDocByID(e,t){let S=this.getPointKey(e),w=this.nodeMap.get(S);w&&(w.docIDs.delete(t),w.docIDs.size===0&&(this.nodeMap.delete(S),this.deleteNode(w)))}deleteNode(e){let t=e.parent,S=e.left?e.left:e.right;S&&(S.parent=t),t?t.left===e?t.left=S:t.right===e&&(t.right=S):(this.root=S,this.root&&(this.root.parent=null))}searchByRadius(t,S,w=!0,E=`asc`,D=!1){let O=D?e.vincentyDistance:e.haversineDistance,k=[{node:this.root,depth:0}],j=[];for(;k.length>0;){let{node:e,depth:E}=k.pop();if(e==null)continue;let D=O(t,e.point);(w?D<=S:D>S)&&j.push({point:e.point,docIDs:Array.from(e.docIDs)}),e.left!=null&&k.push({node:e.left,depth:E+1}),e.right!=null&&k.push({node:e.right,depth:E+1})}return E&&j.sort((e,S)=>{let w=O(t,e.point),D=O(t,S.point);return E.toLowerCase()===`asc`?w-D:D-w}),j}searchByPolygon(t,S=!0,w=null,E=!1){let D=[{node:this.root,depth:0}],O=[];for(;D.length>0;){let{node:w,depth:E}=D.pop();if(w==null)continue;w.left!=null&&D.push({node:w.left,depth:E+1}),w.right!=null&&D.push({node:w.right,depth:E+1});let k=e.isPointInPolygon(t,w.point);(k&&S||!k&&!S)&&O.push({point:w.point,docIDs:Array.from(w.docIDs)})}let k=e.calculatePolygonCentroid(t);if(w){let t=E?e.vincentyDistance:e.haversineDistance;O.sort((e,S)=>{let E=t(k,e.point),D=t(k,S.point);return w.toLowerCase()===`asc`?E-D:D-E})}return O}toJSON(){return{root:this.root?this.root.toJSON():null}}static fromJSON(t){let S=new e;return t.root&&(S.root=BKDNode.fromJSON(t.root),S.buildNodeMap(S.root)),S}buildNodeMap(e){if(e==null)return;let t=this.getPointKey(e.point);this.nodeMap.set(t,e),e.left&&this.buildNodeMap(e.left),e.right&&this.buildNodeMap(e.right)}static calculatePolygonCentroid(e){let t=0,S=0,w=0,E=e.length;for(let D=0,O=E-1;D<E;O=D++){let E=e[D].lon,k=e[D].lat,j=e[O].lon,F=e[O].lat,L=E*F-j*k;t+=L,S+=(E+j)*L,w+=(k+F)*L}t/=2;let D=6*t;return S/=D,w/=D,{lon:S,lat:w}}static isPointInPolygon(e,t){let S=!1,w=t.lon,E=t.lat,D=e.length;for(let t=0,O=D-1;t<D;O=t++){let D=e[t].lon,k=e[t].lat,j=e[O].lon,F=e[O].lat;k>E!=F>E&&w<(j-D)*(E-k)/(F-k)+D&&(S=!S)}return S}static haversineDistance(e,t){let S=Math.PI/180,w=e.lat*S,E=t.lat*S,D=(t.lat-e.lat)*S,O=(t.lon-e.lon)*S,k=Math.sin(D/2)*Math.sin(D/2)+Math.cos(w)*Math.cos(E)*Math.sin(O/2)*Math.sin(O/2);return EARTH_RADIUS*(2*Math.atan2(Math.sqrt(k),Math.sqrt(1-k)))}static vincentyDistance(e,t){let S=6378137,w=1/298.257223563,E=(1-w)*S,D=Math.PI/180,O=e.lat*D,k=t.lat*D,j=(t.lon-e.lon)*D,F=Math.atan((1-w)*Math.tan(O)),L=Math.atan((1-w)*Math.tan(k)),B=Math.sin(F),H=Math.cos(F),q=Math.sin(L),J=Math.cos(L),Y=j,ee,te=1e3,ne,ae,oe,se,ce,ue;do{let e=Math.sin(Y),t=Math.cos(Y);if(ne=Math.sqrt(J*e*(J*e)+(H*q-B*J*t)*(H*q-B*J*t)),ne===0)return 0;ae=B*q+H*J*t,oe=Math.atan2(ne,ae),se=H*J*e/ne,ce=1-se*se,ue=ae-2*B*q/ce,isNaN(ue)&&(ue=0);let S=w/16*ce*(4+w*(4-3*ce));ee=Y,Y=j+(1-S)*w*se*(oe+S*ne*(ue+S*ae*(-1+2*ue*ue)))}while(Math.abs(Y-ee)>1e-12&&--te>0);if(te===0)return NaN;let de=ce*(S*S-E*E)/(E*E),fe=1+de/16384*(4096+de*(-768+de*(320-175*de))),me=de/1024*(256+de*(-128+de*(74-47*de))),ge=me*ne*(ue+me/4*(ae*(-1+2*ue*ue)-me/6*ue*(-3+4*ne*ne)*(-3+4*ue*ue)));return E*fe*(oe-ge)}},BoolNode=class e{true;false;constructor(){this.true=new Set,this.false=new Set}insert(e,t){t?this.true.add(e):this.false.add(e)}delete(e,t){t?this.true.delete(e):this.false.delete(e)}getSize(){return this.true.size+this.false.size}toJSON(){return{true:Array.from(this.true),false:Array.from(this.false)}}static fromJSON(t){let S=new e;return S.true=new Set(t.true),S.false=new Set(t.false),S}};function BM25(e,t,S,w,E,{k:D,b:O,d:k}){return Math.log(1+(S-t+.5)/(t+.5))*(k+e*(D+1))/(e+D*(1-O+O*w/E))}const DEFAULT_SIMILARITY=.8;var VectorIndex=class e{size;vectors=new Map;constructor(e){this.size=e}add(e,t){t instanceof Float32Array||(t=new Float32Array(t));let S=getMagnitude(t,this.size);this.vectors.set(e,[S,t])}remove(e){this.vectors.delete(e)}find(e,t,S){return e instanceof Float32Array||(e=new Float32Array(e)),findSimilarVectors(e,S,this.vectors,this.size,t)}toJSON(){let e=[];for(let[t,[S,w]]of this.vectors)e.push([t,[S,Array.from(w)]]);return{size:this.size,vectors:e}}static fromJSON(t){let S=t,w=new e(S.size);for(let[e,[t,E]]of S.vectors)w.vectors.set(e,[t,new Float32Array(E)]);return w}};function getMagnitude(e,t){let S=0;for(let w=0;w<t;w++)S+=e[w]*e[w];return Math.sqrt(S)}function findSimilarVectors(e,t,S,w,E){let D=getMagnitude(e,w),O=[],k=t||S.keys();for(let t of k){let k=S.get(t);if(!k)continue;let j=k[0],F=k[1],L=0;for(let t=0;t<w;t++)L+=e[t]*F[t];let B=L/(D*j);B>=E&&O.push([t,B])}return O}function insertDocumentScoreParameters(e,t,S,w,E){let D=getInternalDocumentId(e.sharedInternalDocumentStore,S);e.avgFieldLength[t]=((e.avgFieldLength[t]??0)*(E-1)+w.length)/E,e.fieldLengths[t][D]=w.length,e.frequencies[t][D]={}}function insertTokenScoreParameters(e,t,S,w,E){let D=0;for(let e of w)e===E&&D++;let O=getInternalDocumentId(e.sharedInternalDocumentStore,S),k=D/w.length;e.frequencies[t][O][E]=k,E in e.tokenOccurrences[t]||(e.tokenOccurrences[t][E]=0),e.tokenOccurrences[t][E]=(e.tokenOccurrences[t][E]??0)+1}function removeDocumentScoreParameters(e,t,S,w){let E=getInternalDocumentId(e.sharedInternalDocumentStore,S);w>1?e.avgFieldLength[t]=(e.avgFieldLength[t]*w-e.fieldLengths[t][E])/(w-1):e.avgFieldLength[t]=void 0,e.fieldLengths[t][E]=void 0,e.frequencies[t][E]=void 0}function removeTokenScoreParameters(e,t,S){e.tokenOccurrences[t][S]--}function create$12(e,t,S,w,E=``){w||={sharedInternalDocumentStore:t,indexes:{},vectorIndexes:{},searchableProperties:[],searchablePropertiesWithTypes:{},frequencies:{},tokenOccurrences:{},avgFieldLength:{},fieldLengths:{}};for(let[D,O]of Object.entries(S)){let S=`${E}${E?`.`:``}${D}`;if(typeof O==`object`&&!Array.isArray(O)){create$12(e,t,O,w,S);continue}if(isVectorType(O))w.searchableProperties.push(S),w.searchablePropertiesWithTypes[S]=O,w.vectorIndexes[S]={type:`Vector`,node:new VectorIndex(getVectorSize(O)),isArray:!1};else{let e=/\[/.test(O);switch(O){case`boolean`:case`boolean[]`:w.indexes[S]={type:`Bool`,node:new BoolNode,isArray:e};break;case`number`:case`number[]`:w.indexes[S]={type:`AVL`,node:new AVLTree(0,[]),isArray:e};break;case`string`:case`string[]`:w.indexes[S]={type:`Radix`,node:new RadixTree,isArray:e},w.avgFieldLength[S]=0,w.frequencies[S]={},w.tokenOccurrences[S]={},w.fieldLengths[S]={};break;case`enum`:case`enum[]`:w.indexes[S]={type:`Flat`,node:new FlatTree,isArray:e};break;case`geopoint`:w.indexes[S]={type:`BKD`,node:new BKDTree,isArray:e};break;default:throw createError(`INVALID_SCHEMA_TYPE`,Array.isArray(O)?`array`:O,S)}w.searchableProperties.push(S),w.searchablePropertiesWithTypes[S]=O}}return w}function insertScalarBuilder(e,t,S,w,E,D,O,k){return j=>{let{type:F,node:L}=t.indexes[S];switch(F){case`Bool`:L[j?`true`:`false`].add(w);break;case`AVL`:{let e=k?.avlRebalanceThreshold??1;L.insert(j,w,e);break}case`Radix`:{let k=D.tokenize(j,E,S,!1);e.insertDocumentScoreParameters(t,S,w,k,O);for(let E of k)e.insertTokenScoreParameters(t,S,w,k,E),L.insert(E,w);break}case`Flat`:L.insert(j,w);break;case`BKD`:L.insert(j,[w]);break}}}function insert$2(e,t,S,w,E,D,O,k,j,F,L){if(isVectorType(O))return insertVector(t,S,D,w,E);let B=insertScalarBuilder(e,t,S,E,k,j,F,L);if(!isArrayType(O))return B(D);let H=D,q=H.length;for(let e=0;e<q;e++)B(H[e])}function insertVector(e,t,S,w,E){e.vectorIndexes[t].node.add(E,S)}function removeScalar(e,t,S,w,E,D,O,k,j,F){if(isVectorType(O))return t.vectorIndexes[S].node.remove(E),!0;let{type:L,node:B}=t.indexes[S];switch(L){case`AVL`:return B.removeDocument(D,E),!0;case`Bool`:return B[D?`true`:`false`].delete(E),!0;case`Radix`:{let O=j.tokenize(D,k,S);e.removeDocumentScoreParameters(t,S,w,F);for(let w of O)e.removeTokenScoreParameters(t,S,w),B.removeDocumentByWord(w,E);return!0}case`Flat`:return B.removeDocument(E,D),!0;case`BKD`:return B.removeDocByID(D,E),!1}}function remove$1(e,t,S,w,E,D,O,k,j,F){if(!isArrayType(O))return removeScalar(e,t,S,w,E,D,O,k,j,F);let L=getInnerType(O),B=D,H=B.length;for(let D=0;D<H;D++)removeScalar(e,t,S,w,E,B[D],L,k,j,F);return!0}function calculateResultScores(e,t,S,w,E,D,O,k,j,F){let L=Array.from(w),B=e.avgFieldLength[t],H=e.fieldLengths[t],q=e.tokenOccurrences[t],J=e.frequencies[t],Y=typeof q[S]==`number`?q[S]??0:0,ee=L.length;for(let e=0;e<ee;e++){let w=L[e];if(j&&!j.has(w))continue;F.has(w)||F.set(w,new Map);let q=F.get(w);q.set(t,(q.get(t)||0)+1);let ee=BM25(J?.[w]?.[S]??0,Y,E,H[w],B,D);O.has(w)?O.set(w,O.get(w)+ee*k):O.set(w,ee*k)}}function search$1(e,t,S,w,E,D,O,k,j,F,L,B=0){let H=S.tokenize(t,w),q=H.length||1,J=new Map,Y=new Map,ee=new Map;for(let S of E){if(!(S in e.indexes))continue;let w=e.indexes[S],{type:E}=w;if(E!==`Radix`)throw createError(`WRONG_SEARCH_PROPERTY_TYPE`,S);let B=k[S]??1;if(B<=0)throw createError(`INVALID_BOOST_VALUE`,B);H.length===0&&!t&&H.push(``);let q=H.length;for(let t=0;t<q;t++){let E=H[t],k=w.node.find({term:E,exact:D,tolerance:O}),q=Object.keys(k);q.length>0&&Y.set(E,!0);let te=q.length;for(let t=0;t<te;t++){let w=q[t],E=k[w];calculateResultScores(e,S,w,E,F,j,ee,B,L,J)}}}let te=Array.from(ee.entries()).map(([e,t])=>[e,t]).sort((e,t)=>t[1]-e[1]);if(te.length===0)return[];if(B===1)return te;if(B===0){if(q===1)return te;for(let e of H)if(!Y.get(e))return[];return te.filter(([e])=>{let t=J.get(e);return t?Array.from(t.values()).some(e=>e===q):!1})}let ne=te.filter(([e])=>{let t=J.get(e);return t?Array.from(t.values()).some(e=>e===q):!1});if(ne.length>0){let e=te.filter(([e])=>!ne.some(([t])=>t===e)),t=Math.ceil(e.length*B);return[...ne,...e.slice(0,t)]}return te}function searchByWhereClause(e,t,S,w){if(`and`in S&&S.and&&Array.isArray(S.and)){let E=S.and;return E.length===0?new Set:setIntersection(...E.map(S=>searchByWhereClause(e,t,S,w)))}if(`or`in S&&S.or&&Array.isArray(S.or)){let E=S.or;return E.length===0?new Set:E.map(S=>searchByWhereClause(e,t,S,w)).reduce((e,t)=>setUnion(e,t),new Set)}if(`not`in S&&S.not){let E=S.not,D=new Set,O=e.sharedInternalDocumentStore;for(let e=1;e<=O.internalIdToId.length;e++)D.add(e);return setDifference(D,searchByWhereClause(e,t,E,w))}let E=Object.keys(S),D=E.reduce((e,t)=>({[t]:new Set,...e}),{});for(let O of E){let E=S[O];if(e.indexes[O]===void 0)throw createError(`UNKNOWN_FILTER_PROPERTY`,O);let{node:k,type:j,isArray:F}=e.indexes[O];if(j===`Bool`){let e=k,t=E?e.true:e.false;D[O]=setUnion(D[O],t);continue}if(j===`BKD`){let e;if(`radius`in E)e=`radius`;else if(`polygon`in E)e=`polygon`;else throw Error(`Invalid operation ${E}`);if(e===`radius`){let{value:t,coordinates:S,unit:w=`m`,inside:j=!0,highPrecision:F=!1}=E[e],L=convertDistanceToMeters(t,w),B=k.searchByRadius(S,L,j,void 0,F);D[O]=addGeoResult(D[O],B)}else{let{coordinates:t,inside:S=!0,highPrecision:w=!1}=E[e],j=k.searchByPolygon(t,S,void 0,w);D[O]=addGeoResult(D[O],j)}continue}if(j===`Radix`&&(typeof E==`string`||Array.isArray(E))){for(let e of[E].flat()){let S=t.tokenize(e,w,O);for(let e of S){let t=k.find({term:e,exact:!0});D[O]=addFindResult(D[O],t)}}continue}let L=Object.keys(E);if(L.length>1)throw createError(`INVALID_FILTER_OPERATION`,L.length);if(j===`Flat`){let e=new Set(F?k.filterArr(E):k.filter(E));D[O]=setUnion(D[O],e);continue}if(j===`AVL`){let e=L[0],t=E[e],S;switch(e){case`gt`:S=k.greaterThan(t,!1);break;case`gte`:S=k.greaterThan(t,!0);break;case`lt`:S=k.lessThan(t,!1);break;case`lte`:S=k.lessThan(t,!0);break;case`eq`:S=k.find(t)??new Set;break;case`between`:{let[e,w]=t;S=k.rangeSearch(e,w);break}default:throw createError(`INVALID_FILTER_OPERATION`,e)}D[O]=setUnion(D[O],S)}}return setIntersection(...Object.values(D))}function getSearchableProperties(e){return e.searchableProperties}function getSearchablePropertiesWithTypes(e){return e.searchablePropertiesWithTypes}function load$2(e,t){let{indexes:S,vectorIndexes:w,searchableProperties:E,searchablePropertiesWithTypes:D,frequencies:O,tokenOccurrences:k,avgFieldLength:j,fieldLengths:F}=t,L={},B={};for(let e of Object.keys(S)){let{node:t,type:w,isArray:E}=S[e];switch(w){case`Radix`:L[e]={type:`Radix`,node:RadixTree.fromJSON(t),isArray:E};break;case`Flat`:L[e]={type:`Flat`,node:FlatTree.fromJSON(t),isArray:E};break;case`AVL`:L[e]={type:`AVL`,node:AVLTree.fromJSON(t),isArray:E};break;case`BKD`:L[e]={type:`BKD`,node:BKDTree.fromJSON(t),isArray:E};break;case`Bool`:L[e]={type:`Bool`,node:BoolNode.fromJSON(t),isArray:E};break;default:L[e]=S[e]}}for(let e of Object.keys(w))B[e]={type:`Vector`,isArray:!1,node:VectorIndex.fromJSON(w[e])};return{sharedInternalDocumentStore:e,indexes:L,vectorIndexes:B,searchableProperties:E,searchablePropertiesWithTypes:D,frequencies:O,tokenOccurrences:k,avgFieldLength:j,fieldLengths:F}}function save$2(e){let{indexes:t,vectorIndexes:S,searchableProperties:w,searchablePropertiesWithTypes:E,frequencies:D,tokenOccurrences:O,avgFieldLength:k,fieldLengths:j}=e,F={};for(let e of Object.keys(S))F[e]=S[e].node.toJSON();let L={};for(let e of Object.keys(t)){let{type:S,node:w,isArray:E}=t[e];S===`Flat`||S===`Radix`||S===`AVL`||S===`BKD`||S===`Bool`?L[e]={type:S,node:w.toJSON(),isArray:E}:(L[e]=t[e],L[e].node=L[e].node.toJSON())}return{indexes:L,vectorIndexes:F,searchableProperties:w,searchablePropertiesWithTypes:E,frequencies:D,tokenOccurrences:O,avgFieldLength:k,fieldLengths:j}}function createIndex(){return{create:create$12,insert:insert$2,remove:remove$1,insertDocumentScoreParameters,insertTokenScoreParameters,removeDocumentScoreParameters,removeTokenScoreParameters,calculateResultScores,search:search$1,searchByWhereClause,getSearchableProperties,getSearchablePropertiesWithTypes,load:load$2,save:save$2}}function addGeoResult(e,t){e||=new Set;let S=t.length;for(let w=0;w<S;w++){let S=t[w].docIDs,E=S.length;for(let t=0;t<E;t++)e.add(S[t])}return e}function createGeoTokenScores(e,t,S=!1){let w=S?BKDTree.vincentyDistance:BKDTree.haversineDistance,E=[],D=[];for(let{point:S}of e)D.push(w(t,S));let O=Math.max(...D),k=0;for(let{docIDs:t}of e){let e=O-D[k]+1;for(let S of t)E.push([S,e]);k++}return E.sort((e,t)=>t[1]-e[1]),E}function isGeosearchOnlyQuery(e,t){let S=Object.keys(e);if(S.length!==1)return{isGeoOnly:!1};let w=S[0],E=e[w];if(t.indexes[w]===void 0)return{isGeoOnly:!1};let{type:D}=t.indexes[w];return D===`BKD`&&E&&(`radius`in E||`polygon`in E)?{isGeoOnly:!0,geoProperty:w,geoOperation:E}:{isGeoOnly:!1}}function searchByGeoWhereClause(e,t){let S=e,w=isGeosearchOnlyQuery(t,S);if(!w.isGeoOnly||!w.geoProperty||!w.geoOperation)return null;let{node:E}=S.indexes[w.geoProperty],D=w.geoOperation,O=E,k;if(`radius`in D){let{value:e,coordinates:t,unit:S=`m`,inside:w=!0,highPrecision:E=!1}=D.radius,j=t,F=convertDistanceToMeters(e,S);return k=O.searchByRadius(j,F,w,`asc`,E),createGeoTokenScores(k,j,E)}else if(`polygon`in D){let{coordinates:e,inside:t=!0,highPrecision:S=!1}=D.polygon;k=O.searchByPolygon(e,t,`asc`,S);let w=BKDTree.calculatePolygonCentroid(e);return createGeoTokenScores(k,w,S)}return null}function addFindResult(e,t){e||=new Set;let S=Object.keys(t),w=S.length;for(let E=0;E<w;E++){let w=t[S[E]],D=w.length;for(let t=0;t<D;t++)e.add(w[t])}return e}function innerCreate(e,t,S,w,E){let D={language:e.tokenizer.language,sharedInternalDocumentStore:t,enabled:!0,isSorted:!0,sortableProperties:[],sortablePropertiesWithTypes:{},sorts:{}};for(let[O,k]of Object.entries(S)){let S=`${E}${E?`.`:``}${O}`;if(!w.includes(S)){if(typeof k==`object`&&!Array.isArray(k)){let E=innerCreate(e,t,k,w,S);safeArrayPush(D.sortableProperties,E.sortableProperties),D.sorts={...D.sorts,...E.sorts},D.sortablePropertiesWithTypes={...D.sortablePropertiesWithTypes,...E.sortablePropertiesWithTypes};continue}if(!isVectorType(k))switch(k){case`boolean`:case`number`:case`string`:D.sortableProperties.push(S),D.sortablePropertiesWithTypes[S]=k,D.sorts[S]={docs:new Map,orderedDocsToRemove:new Map,orderedDocs:[],type:k};break;case`geopoint`:case`enum`:continue;case`enum[]`:case`boolean[]`:case`number[]`:case`string[]`:continue;default:throw createError(`INVALID_SORT_SCHEMA_TYPE`,Array.isArray(k)?`array`:k,S)}}}return D}function create$11(e,t,S,w){return w?.enabled===!1?{disabled:!0}:innerCreate(e,t,S,(w||{}).unsortableProperties||[],``)}function insert$1(e,t,S,w){if(!e.enabled)return;e.isSorted=!1;let E=getInternalDocumentId(e.sharedInternalDocumentStore,S),D=e.sorts[t];D.orderedDocsToRemove.has(E)&&ensureOrderedDocsAreDeletedByProperty(e,t),D.docs.set(E,D.orderedDocs.length),D.orderedDocs.push([E,w])}function ensureIsSorted(e){if(e.isSorted||!e.enabled)return;let t=Object.keys(e.sorts);for(let S of t)ensurePropertyIsSorted(e,S);e.isSorted=!0}function stringSort(e,t,S){return t[1].localeCompare(S[1],getLocale(e))}function numberSort(e,t){return e[1]-t[1]}function booleanSort(e,t){return t[1]?-1:1}function ensurePropertyIsSorted(e,t){let S=e.sorts[t],w;switch(S.type){case`string`:w=stringSort.bind(null,e.language);break;case`number`:w=numberSort.bind(null);break;case`boolean`:w=booleanSort.bind(null);break}S.orderedDocs.sort(w);let E=S.orderedDocs.length;for(let e=0;e<E;e++){let t=S.orderedDocs[e][0];S.docs.set(t,e)}}function ensureOrderedDocsAreDeleted(e){let t=Object.keys(e.sorts);for(let S of t)ensureOrderedDocsAreDeletedByProperty(e,S)}function ensureOrderedDocsAreDeletedByProperty(e,t){let S=e.sorts[t];S.orderedDocsToRemove.size&&(S.orderedDocs=S.orderedDocs.filter(e=>!S.orderedDocsToRemove.has(e[0])),S.orderedDocsToRemove.clear())}function remove(e,t,S){if(!e.enabled)return;let w=e.sorts[t],E=getInternalDocumentId(e.sharedInternalDocumentStore,S);w.docs.get(E)&&(w.docs.delete(E),w.orderedDocsToRemove.set(E,!0))}function sortBy(e,t,S){if(!e.enabled)throw createError(`SORT_DISABLED`);let w=S.property,E=S.order===`DESC`,D=e.sorts[w];if(!D)throw createError(`UNABLE_TO_SORT_ON_UNKNOWN_FIELD`,w,e.sortableProperties.join(`, `));return ensureOrderedDocsAreDeletedByProperty(e,w),ensureIsSorted(e),t.sort((t,S)=>{let w=D.docs.get(getInternalDocumentId(e.sharedInternalDocumentStore,t[0])),O=D.docs.get(getInternalDocumentId(e.sharedInternalDocumentStore,S[0])),k=w!==void 0,j=O!==void 0;return!k&&!j?0:k?j?E?O-w:w-O:-1:1}),t}function getSortableProperties(e){return e.enabled?e.sortableProperties:[]}function getSortablePropertiesWithTypes(e){return e.enabled?e.sortablePropertiesWithTypes:{}}function load$1(e,t){let S=t;if(!S.enabled)return{enabled:!1};let w=Object.keys(S.sorts).reduce((e,t)=>{let{docs:w,orderedDocs:E,type:D}=S.sorts[t];return e[t]={docs:new Map(Object.entries(w).map(([e,t])=>[+e,t])),orderedDocsToRemove:new Map,orderedDocs:E,type:D},e},{});return{sharedInternalDocumentStore:e,language:S.language,sortableProperties:S.sortableProperties,sortablePropertiesWithTypes:S.sortablePropertiesWithTypes,sorts:w,enabled:!0,isSorted:S.isSorted}}function save$1(e){if(!e.enabled)return{enabled:!1};ensureOrderedDocsAreDeleted(e),ensureIsSorted(e);let t=Object.keys(e.sorts).reduce((t,S)=>{let{docs:w,orderedDocs:E,type:D}=e.sorts[S];return t[S]={docs:Object.fromEntries(w.entries()),orderedDocs:E,type:D},t},{});return{language:e.language,sortableProperties:e.sortableProperties,sortablePropertiesWithTypes:e.sortablePropertiesWithTypes,sorts:t,enabled:e.enabled,isSorted:e.isSorted}}function createSorter(){return{create:create$11,insert:insert$1,remove,save:save$1,load:load$1,sortBy,getSortableProperties,getSortablePropertiesWithTypes}}const DIACRITICS_CHARCODE_START=192,DIACRITICS_CHARCODE_END=383,CHARCODE_REPLACE_MAPPING=[65,65,65,65,65,65,65,67,69,69,69,69,73,73,73,73,69,78,79,79,79,79,79,null,79,85,85,85,85,89,80,115,97,97,97,97,97,97,97,99,101,101,101,101,105,105,105,105,101,110,111,111,111,111,111,null,111,117,117,117,117,121,112,121,65,97,65,97,65,97,67,99,67,99,67,99,67,99,68,100,68,100,69,101,69,101,69,101,69,101,69,101,71,103,71,103,71,103,71,103,72,104,72,104,73,105,73,105,73,105,73,105,73,105,73,105,74,106,75,107,107,76,108,76,108,76,108,76,108,76,108,78,110,78,110,78,110,110,78,110,79,111,79,111,79,111,79,111,82,114,82,114,82,114,83,115,83,115,83,115,83,115,84,116,84,116,84,116,85,117,85,117,85,117,85,117,85,117,85,117,87,119,89,121,89,90,122,90,122,90,122,115];function replaceChar(e){return e<DIACRITICS_CHARCODE_START||e>DIACRITICS_CHARCODE_END?e:CHARCODE_REPLACE_MAPPING[e-DIACRITICS_CHARCODE_START]||e}function replaceDiacritics(e){let t=[];for(let S=0;S<e.length;S++)t[S]=replaceChar(e.charCodeAt(S));return String.fromCharCode(...t)}const step2List={ational:`ate`,tional:`tion`,enci:`ence`,anci:`ance`,izer:`ize`,bli:`ble`,alli:`al`,entli:`ent`,eli:`e`,ousli:`ous`,ization:`ize`,ation:`ate`,ator:`ate`,alism:`al`,iveness:`ive`,fulness:`ful`,ousness:`ous`,aliti:`al`,iviti:`ive`,biliti:`ble`,logi:`log`},step3List={icate:`ic`,ative:``,alize:`al`,iciti:`ic`,ical:`ic`,ful:``,ness:``},c=`[^aeiou]`,v=`[aeiouy]`,C=c+`[^aeiouy]*`;v+``;const mgr0=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*`,meq1=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$`,mgr1=`^(`+C+`)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*`,s_v=`^(`+C+`)?[aeiouy]`;function stemmer(e){let t,S,w,E,D,O;if(e.length<3)return e;let k=e.substring(0,1);if(k==`y`&&(e=k.toUpperCase()+e.substring(1)),w=/^(.+?)(ss|i)es$/,E=/^(.+?)([^s])s$/,w.test(e)?e=e.replace(w,`$1$2`):E.test(e)&&(e=e.replace(E,`$1$2`)),w=/^(.+?)eed$/,E=/^(.+?)(ed|ing)$/,w.test(e)){let t=w.exec(e);w=new RegExp(mgr0),w.test(t[1])&&(w=/.$/,e=e.replace(w,``))}else E.test(e)&&(t=E.exec(e)[1],E=new RegExp(s_v),E.test(t)&&(e=t,E=/(at|bl|iz)$/,D=RegExp(`([^aeiouylsz])\\1$`),O=RegExp(`^`+C+v+`[^aeiouwxy]$`),E.test(e)?e+=`e`:D.test(e)?(w=/.$/,e=e.replace(w,``)):O.test(e)&&(e+=`e`)));if(w=/^(.+?)y$/,w.test(e)&&(t=w.exec(e)?.[1],w=new RegExp(s_v),t&&w.test(t)&&(e=t+`i`)),w=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,w.test(e)){let E=w.exec(e);t=E?.[1],S=E?.[2],w=new RegExp(mgr0),t&&w.test(t)&&(e=t+step2List[S])}if(w=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,w.test(e)){let E=w.exec(e);t=E?.[1],S=E?.[2],w=new RegExp(mgr0),t&&w.test(t)&&(e=t+step3List[S])}if(w=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,E=/^(.+?)(s|t)(ion)$/,w.test(e))t=w.exec(e)?.[1],w=new RegExp(mgr1),t&&w.test(t)&&(e=t);else if(E.test(e)){let S=E.exec(e);t=S?.[1]??``+S?.[2]??``,E=new RegExp(mgr1),E.test(t)&&(e=t)}return w=/^(.+?)e$/,w.test(e)&&(t=w.exec(e)?.[1],w=new RegExp(mgr1),E=new RegExp(meq1),D=RegExp(`^`+C+v+`[^aeiouwxy]$`),t&&(w.test(t)||E.test(t)&&!D.test(t))&&(e=t)),w=/ll$/,E=new RegExp(mgr1),w.test(e)&&E.test(e)&&(w=/.$/,e=e.replace(w,``)),k==`y`&&(e=k.toLowerCase()+e.substring(1)),e}function normalizeToken(e,t,S=!0){let w=`${this.language}:${e}:${t}`;return S&&this.normalizationCache.has(w)?this.normalizationCache.get(w):this.stopWords?.includes(t)?(S&&this.normalizationCache.set(w,``),``):(this.stemmer&&!this.stemmerSkipProperties.has(e)&&(t=this.stemmer(t)),t=replaceDiacritics(t),S&&this.normalizationCache.set(w,t),t)}function trim(e){for(;e[e.length-1]===``;)e.pop();for(;e[0]===``;)e.shift();return e}function tokenize(e,t,S,w=!0){if(t&&t!==this.language)throw createError(`LANGUAGE_NOT_SUPPORTED`,t);if(typeof e!=`string`)return[e];let E=this.normalizeToken.bind(this,S??``),D;if(S&&this.tokenizeSkipProperties.has(S))D=[E(e,w)];else{let t=SPLITTERS[this.language];D=e.toLowerCase().split(t).map(e=>E(e,w)).filter(Boolean)}let O=trim(D);return this.allowDuplicates?O:Array.from(new Set(O))}function createTokenizer(e={}){if(!e.language)e.language=`english`;else if(!SUPPORTED_LANGUAGES.includes(e.language))throw createError(`LANGUAGE_NOT_SUPPORTED`,e.language);let t;if(e.stemming||e.stemmer&&!(`stemming`in e))if(e.stemmer){if(typeof e.stemmer!=`function`)throw createError(`INVALID_STEMMER_FUNCTION_TYPE`);t=e.stemmer}else if(e.language===`english`)t=stemmer;else throw createError(`MISSING_STEMMER`,e.language);let S;if(e.stopWords!==!1){if(S=[],Array.isArray(e.stopWords))S=e.stopWords;else if(typeof e.stopWords==`function`)S=e.stopWords(S);else if(e.stopWords)throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`);if(!Array.isArray(S))throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`);for(let e of S)if(typeof e!=`string`)throw createError(`CUSTOM_STOP_WORDS_MUST_BE_FUNCTION_OR_ARRAY`)}let w={tokenize,language:e.language,stemmer:t,stemmerSkipProperties:new Set(e.stemmerSkipProperties?[e.stemmerSkipProperties].flat():[]),tokenizeSkipProperties:new Set(e.tokenizeSkipProperties?[e.tokenizeSkipProperties].flat():[]),stopWords:S,allowDuplicates:!!e.allowDuplicates,normalizeToken,normalizationCache:new Map};return w.tokenize=tokenize.bind(w),w.normalizeToken=normalizeToken,w}function create$10(e){return{sharedInternalDocumentStore:e,rules:new Map}}function addRule(e,t){if(e.rules.has(t.id))throw Error(`PINNING_RULE_ALREADY_EXISTS: A pinning rule with id "${t.id}" already exists. Use updateRule to modify it.`);e.rules.set(t.id,t)}function updateRule(e,t){if(!e.rules.has(t.id))throw Error(`PINNING_RULE_NOT_FOUND: Cannot update pinning rule with id "${t.id}" because it does not exist. Use addRule to create it.`);e.rules.set(t.id,t)}function removeRule(e,t){return e.rules.delete(t)}function getRule(e,t){return e.rules.get(t)}function getAllRules(e){return Array.from(e.rules.values())}function matchesCondition(e,t){let S=e.toLowerCase().trim(),w=t.pattern.toLowerCase().trim();switch(t.anchoring){case`is`:return S===w;case`starts_with`:return S.startsWith(w);case`contains`:return S.includes(w);default:return!1}}function matchesRule(e,t){return e?t.conditions.every(t=>matchesCondition(e,t)):!1}function getMatchingRules(e,t){if(!t)return[];let S=[];for(let w of e.rules.values())matchesRule(t,w)&&S.push(w);return S}function load(e,t){return{sharedInternalDocumentStore:e,rules:new Map(t?.rules??[])}}function save(e){return{rules:Array.from(e.rules.entries())}}function createPinning(){return{create:create$10,addRule,updateRule,removeRule,getRule,getAllRules,getMatchingRules,load,save}}function validateComponents(e){let t={formatElapsedTime,getDocumentIndexId,getDocumentProperties,validateSchema};for(let S of FUNCTION_COMPONENTS){let w=S;if(e[w]){if(typeof e[w]!=`function`)throw createError(`COMPONENT_MUST_BE_FUNCTION`,w)}else e[w]=t[w]}for(let t of Object.keys(e))if(!OBJECT_COMPONENTS.includes(t)&&!FUNCTION_COMPONENTS.includes(t))throw createError(`UNSUPPORTED_COMPONENT`,t)}function create$9({schema:e,sort:t,language:S,components:w,id:E,plugins:D}){w||={};for(let t of D??[]){if(!(`getComponents`in t)||typeof t.getComponents!=`function`)continue;let S=t.getComponents(e),E=Object.keys(S);for(let e of E)if(w[e])throw createError(`PLUGIN_COMPONENT_CONFLICT`,e,t.name);w={...w,...S}}E||=uniqueId();let O=w.tokenizer,k=w.index,j=w.documentsStore,F=w.sorter,L=w.pinning;if(O=O?O.tokenize?O:createTokenizer(O):createTokenizer({language:S??`english`}),w.tokenizer&&S)throw createError(`NO_LANGUAGE_WITH_CUSTOM_TOKENIZER`);let B=createInternalDocumentIDStore();k||=createIndex(),F||=createSorter(),j||=createDocumentsStore(),L||=createPinning(),validateComponents(w);let{getDocumentProperties:H,getDocumentIndexId:q,validateSchema:J,formatElapsedTime:Y}=w,ee={data:{},caches:{},schema:e,tokenizer:O,index:k,sorter:F,documentsStore:j,pinning:L,internalDocumentIDStore:B,getDocumentProperties:H,getDocumentIndexId:q,validateSchema:J,beforeInsert:[],afterInsert:[],beforeRemove:[],afterRemove:[],beforeUpdate:[],afterUpdate:[],beforeUpsert:[],afterUpsert:[],beforeSearch:[],afterSearch:[],beforeInsertMultiple:[],afterInsertMultiple:[],beforeRemoveMultiple:[],afterRemoveMultiple:[],beforeUpdateMultiple:[],afterUpdateMultiple:[],beforeUpsertMultiple:[],afterUpsertMultiple:[],afterCreate:[],formatElapsedTime:Y,id:E,plugins:D,version:getVersion()};ee.data={index:ee.index.create(ee,B,e),docs:ee.documentsStore.create(ee,B),sorting:ee.sorter.create(ee,B,e,t),pinning:ee.pinning.create(B)};for(let e of AVAILABLE_PLUGIN_HOOKS)ee[e]=(ee[e]??[]).concat(getAllPluginsByHook(ee,e));let te=ee.afterCreate;return te&&runAfterCreate(te,ee),ee}function getVersion(){return`{{VERSION}}`}function count(e){return e.documentsStore.count(e.data.docs)}function insert(e,t,S,w,E){let D=e.validateSchema(t,e.schema);if(D)throw createError(`SCHEMA_VALIDATION_FAILURE`,D);return isAsyncFunction(e.beforeInsert)||isAsyncFunction(e.afterInsert)||isAsyncFunction(e.index.beforeInsert)||isAsyncFunction(e.index.insert)||isAsyncFunction(e.index.afterInsert)?innerInsertAsync(e,t,S,w,E):innerInsertSync(e,t,S,w,E)}const ENUM_TYPE=new Set([`enum`,`enum[]`]),STRING_NUMBER_TYPE=new Set([`string`,`number`]);async function innerInsertAsync(e,t,S,w,E){let{index:D,docs:O}=e.data,k=e.getDocumentIndexId(t);if(typeof k!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof k);let j=getInternalDocumentId(e.internalDocumentIDStore,k);if(w||await runSingleHook(e.beforeInsert,e,k,t),!e.documentsStore.store(O,k,j,t))throw createError(`DOCUMENT_ALREADY_EXISTS`,k);let F=e.documentsStore.count(O),L=e.index.getSearchableProperties(D),B=e.index.getSearchablePropertiesWithTypes(D),H=e.getDocumentProperties(t,L);for(let[e,t]of Object.entries(H)){if(t===void 0)continue;let S=typeof t,w=B[e];validateDocumentProperty(S,w,e,t)}return await indexAndSortDocument(e,k,L,H,F,S,t,E),w||await runSingleHook(e.afterInsert,e,k,t),k}function innerInsertSync(e,t,S,w,E){let{index:D,docs:O}=e.data,k=e.getDocumentIndexId(t);if(typeof k!=`string`)throw createError(`DOCUMENT_ID_MUST_BE_STRING`,typeof k);let j=getInternalDocumentId(e.internalDocumentIDStore,k);if(w||runSingleHook(e.beforeInsert,e,k,t),!e.documentsStore.store(O,k,j,t))throw createError(`DOCUMENT_ALREADY_EXISTS`,k);let F=e.documentsStore.count(O),L=e.index.getSearchableProperties(D),B=e.index.getSearchablePropertiesWithTypes(D),H=e.getDocumentProperties(t,L);for(let[e,t]of Object.entries(H)){if(t===void 0)continue;let S=typeof t,w=B[e];validateDocumentProperty(S,w,e,t)}return indexAndSortDocumentSync(e,k,L,H,F,S,t,E),w||runSingleHook(e.afterInsert,e,k,t),k}function validateDocumentProperty(e,t,S,w){if(!(isGeoPointType(t)&&typeof w==`object`&&typeof w.lon==`number`&&typeof w.lat==`number`)&&!(isVectorType(t)&&Array.isArray(w))&&!(isArrayType(t)&&Array.isArray(w))&&!(ENUM_TYPE.has(t)&&STRING_NUMBER_TYPE.has(e))&&e!==t)throw createError(`INVALID_DOCUMENT_PROPERTY`,S,t,e)}async function indexAndSortDocument(e,t,S,w,E,D,O,k){for(let O of S){let S=w[O];if(S===void 0)continue;let j=e.index.getSearchablePropertiesWithTypes(e.data.index)[O];await e.index.beforeInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E);let F=e.internalDocumentIDStore.idToInternalId.get(t);await e.index.insert(e.index,e.data.index,O,t,F,S,j,D,e.tokenizer,E,k),await e.index.afterInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E)}let j=e.sorter.getSortableProperties(e.data.sorting),F=e.getDocumentProperties(O,j);for(let S of j){let w=F[S];if(w===void 0)continue;let E=e.sorter.getSortablePropertiesWithTypes(e.data.sorting)[S];e.sorter.insert(e.data.sorting,S,t,w,E,D)}}function indexAndSortDocumentSync(e,t,S,w,E,D,O,k){for(let O of S){let S=w[O];if(S===void 0)continue;let j=e.index.getSearchablePropertiesWithTypes(e.data.index)[O],F=getInternalDocumentId(e.internalDocumentIDStore,t);e.index.beforeInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E),e.index.insert(e.index,e.data.index,O,t,F,S,j,D,e.tokenizer,E,k),e.index.afterInsert?.(e.data.index,O,t,S,j,D,e.tokenizer,E)}let j=e.sorter.getSortableProperties(e.data.sorting),F=e.getDocumentProperties(O,j);for(let S of j){let w=F[S];if(w===void 0)continue;let E=e.sorter.getSortablePropertiesWithTypes(e.data.sorting)[S];e.sorter.insert(e.data.sorting,S,t,w,E,D)}}function insertMultiple(e,t,S,w,E,D){return isAsyncFunction(e.afterInsertMultiple)||isAsyncFunction(e.beforeInsertMultiple)||isAsyncFunction(e.index.beforeInsert)||isAsyncFunction(e.index.insert)||isAsyncFunction(e.index.afterInsert)?innerInsertMultipleAsync(e,t,S,w,E,D):innerInsertMultipleSync(e,t,S,w,E,D)}async function innerInsertMultipleAsync(e,t,S=1e3,w,E,D=0){let O=[],k=async D=>{let k=Math.min(D+S,t.length),j=t.slice(D,k);for(let t of j){let S=await insert(e,t,w,E,{avlRebalanceThreshold:j.length});O.push(S)}return k};return await(async()=>{let e=0;for(;e<t.length;){let t=Date.now();if(e=await k(e),D>0){let e=D-(Date.now()-t);e>0&&sleep$1(e)}}})(),E||await runMultipleHook(e.afterInsertMultiple,e,t),O}function innerInsertMultipleSync(e,t,S=1e3,w,E,D=0){let O=[],k=0;function j(){let D=t.slice(k*S,(k+1)*S);if(D.length===0)return!1;for(let t of D){let S=insert(e,t,w,E,{avlRebalanceThreshold:D.length});O.push(S)}return k++,!0}function F(){let e=Date.now();for(;j();)if(D>0){let t=Date.now()-e;if(t>=D){let e=D-t%D;e>0&&sleep$1(e)}}}return F(),E||runMultipleHook(e.afterInsertMultiple,e,t),O}const MODE_FULLTEXT_SEARCH=`fulltext`,MODE_HYBRID_SEARCH=`hybrid`,MODE_VECTOR_SEARCH=`vector`;function sortAsc(e,t){return e[1]-t[1]}function sortDesc(e,t){return t[1]-e[1]}function sortingPredicateBuilder(e=`desc`){return e.toLowerCase()===`asc`?sortAsc:sortDesc}function getFacets(e,t,S){let w={},E=t.map(([e])=>e),D=e.documentsStore.getMultiple(e.data.docs,E),O=Object.keys(S),k=e.index.getSearchablePropertiesWithTypes(e.data.index);for(let e of O){let t;if(k[e]===`number`){let{ranges:w}=S[e],E=w.length,D=Array.from({length:E});for(let e=0;e<E;e++){let t=w[e];D[e]=[`${t.from}-${t.to}`,0]}t=Object.fromEntries(D)}w[e]={count:0,values:t??{}}}let j=D.length;for(let e=0;e<j;e++){let t=D[e];for(let e of O){let E=e.includes(`.`)?getNested(t,e):t[e],D=k[e],O=w[e].values;switch(D){case`number`:{let t=S[e].ranges;calculateNumberFacetBuilder(t,O)(E);break}case`number[]`:{let t=new Set,w=S[e].ranges,D=calculateNumberFacetBuilder(w,O,t);for(let e of E)D(e);break}case`boolean`:case`enum`:case`string`:calculateBooleanStringOrEnumFacetBuilder(O,D)(E);break;case`boolean[]`:case`enum[]`:case`string[]`:{let e=calculateBooleanStringOrEnumFacetBuilder(O,D===`boolean[]`?`boolean`:`string`,new Set);for(let t of E)e(t);break}default:throw createError(`FACET_NOT_SUPPORTED`,D)}}}for(let e of O){let t=w[e];if(t.count=Object.keys(t.values).length,k[e]===`string`){let w=S[e],E=sortingPredicateBuilder(w.sort);t.values=Object.fromEntries(Object.entries(t.values).sort(E).slice(w.offset??0,w.limit??10))}}return w}function calculateNumberFacetBuilder(e,t,S){return w=>{for(let E of e){let e=`${E.from}-${E.to}`;S?.has(e)||w>=E.from&&w<=E.to&&(t[e]===void 0?t[e]=1:(t[e]++,S?.add(e)))}}}function calculateBooleanStringOrEnumFacetBuilder(e,t,S){let w=t===`boolean`?`false`:``;return t=>{let E=t?.toString()??w;S?.has(E)||(e[E]=(e[E]??0)+1,S?.add(E))}}const DEFAULT_REDUCE={reducer:(e,t,S,w)=>(t[w]=S,t),getInitialValue:e=>Array.from({length:e})},ALLOWED_TYPES=[`string`,`number`,`boolean`];function getGroups(e,t,S){let w=S.properties,E=w.length,D=e.index.getSearchablePropertiesWithTypes(e.data.index);for(let e=0;e<E;e++){let t=w[e];if(D[t]===void 0)throw createError(`UNKNOWN_GROUP_BY_PROPERTY`,t);if(!ALLOWED_TYPES.includes(D[t]))throw createError(`INVALID_GROUP_BY_PROPERTY`,t,ALLOWED_TYPES.join(`, `),D[t])}let O=t.map(([t])=>getDocumentIdFromInternalId(e.internalDocumentIDStore,t)),k=e.documentsStore.getMultiple(e.data.docs,O),j=k.length,F=S.maxResult||2**53-1,L=[],B={};for(let e=0;e<E;e++){let t=w[e],S={property:t,perValue:{}},E=new Set;for(let e=0;e<j;e++){let w=k[e],D=getNested(w,t);if(D===void 0)continue;let O=typeof D==`boolean`?``+D:D,j=S.perValue[O]??{indexes:[],count:0};j.count>=F||(j.indexes.push(e),j.count++,S.perValue[O]=j,E.add(D))}L.push(Array.from(E)),B[t]=S}let H=calculateCombination(L),q=H.length,J=[];for(let e=0;e<q;e++){let t=H[e],S=t.length,E={values:[],indexes:[]},D=[];for(let e=0;e<S;e++){let S=t[e],O=w[e];D.push(B[O].perValue[typeof S==`boolean`?``+S:S].indexes),E.values.push(S)}E.indexes=intersect(D).sort((e,t)=>e-t),E.indexes.length!==0&&J.push(E)}let Y=J.length,ee=Array.from({length:Y});for(let e=0;e<Y;e++){let w=J[e],E=S.reduce||DEFAULT_REDUCE,D=w.indexes.map(e=>({id:O[e],score:t[e][1],document:k[e]})),j=E.reducer.bind(null,w.values),F=E.getInitialValue(w.indexes.length),L=D.reduce(j,F);ee[e]={values:w.values,result:L}}return ee}function calculateCombination(e,t=0){if(t+1===e.length)return e[t].map(e=>[e]);let S=e[t],w=calculateCombination(e,t+1),E=[];for(let e of S)for(let t of w){let S=[e];safeArrayPush(S,t),E.push(S)}return E}function applyPinningRules(e,t,S,w){let E=getMatchingRules(t,w);if(E.length===0)return S;let D=E.flatMap(e=>e.consequence.promote);D.sort((e,t)=>e.position-t.position);let O=new Set,k=new Map,j=new Set;for(let t of D){let S=getInternalDocumentId(e.internalDocumentIDStore,t.doc_id);if(S!==void 0){if(k.has(S)){let e=k.get(S);t.position<e&&k.set(S,t.position);continue}j.has(t.position)||(O.add(S),k.set(S,t.position),j.add(t.position))}}if(k.size===0)return S;let F=S.filter(([e])=>!O.has(e)),L=1e6,B=[];for(let[t,w]of k.entries())S.find(([e])=>e===t)?B.push([t,1e6-w]):e.documentsStore.get(e.data.docs,t)&&B.push([t,0]);B.sort((e,t)=>(k.get(e[0])??1/0)-(k.get(t[0])??1/0));let H=[],q=new Map;for(let e of B){let t=k.get(e[0]);q.set(t,e)}let J=0,Y=0;for(;Y<F.length+B.length;)if(q.has(Y))H.push(q.get(Y)),Y++;else if(J<F.length)H.push(F[J]),J++,Y++;else break;for(let[e,t]of q.entries())e>=H.length&&H.push(t);return H}function innerFullTextSearch(e,t,S){let{term:w,properties:E}=t,D=e.data.index,O=e.caches.propertiesToSearch;if(!O){let t=e.index.getSearchablePropertiesWithTypes(D);O=e.index.getSearchableProperties(D),O=O.filter(e=>t[e].startsWith(`string`)),e.caches.propertiesToSearch=O}if(E&&E!==`*`){for(let e of E)if(!O.includes(e))throw createError(`UNKNOWN_INDEX`,e,O.join(`, `));O=O.filter(e=>E.includes(e))}let k=Object.keys(t.where??{}).length>0,j;k&&(j=e.index.searchByWhereClause(D,e.tokenizer,t.where,S));let F,L=t.threshold!==void 0&&t.threshold!==null?t.threshold:1;if(w||E){let E=count(e);if(F=e.index.search(D,w||``,e.tokenizer,S,O,t.exact||!1,t.tolerance||0,t.boost||{},applyDefault(t.relevance),E,j,L),t.exact&&w){let t=w.trim().split(/\s+/);F=F.filter(([S])=>{let w=e.documentsStore.get(e.data.docs,S);if(!w)return!1;for(let e of O){let S=getPropValue(w,e);if(typeof S==`string`&&t.every(e=>RegExp(`\\b${escapeRegex(e)}\\b`).test(S)))return!0}return!1})}}else F=k?searchByGeoWhereClause(D,t.where)||(j?Array.from(j):[]).map(e=>[+e,0]):Object.keys(e.documentsStore.getAll(e.data.docs)).map(e=>[+e,0]);return F}function escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function getPropValue(e,t){let S=t.split(`.`),w=e;for(let e of S)if(w&&typeof w==`object`&&e in w)w=w[e];else return;return w}function fullTextSearch(e,t,S){let w=getNanosecondsTime();function E(){let E=Object.keys(e.data.index.vectorIndexes),D=t.facets&&Object.keys(t.facets).length>0,{limit:O=10,offset:k=0,distinctOn:j,includeVectors:F=!1}=t,L=t.preflight===!0,B=innerFullTextSearch(e,t,S);if(t.sortBy)if(typeof t.sortBy==`function`){let S=B.map(([e])=>e),w=e.documentsStore.getMultiple(e.data.docs,S).map((e,t)=>[B[t][0],B[t][1],e]);w.sort(t.sortBy),B=w.map(([e,t])=>[e,t])}else B=e.sorter.sortBy(e.data.sorting,B,t.sortBy).map(([t,S])=>[getInternalDocumentId(e.internalDocumentIDStore,t),S]);else B=B.sort(sortTokenScorePredicate);B=applyPinningRules(e,e.data.pinning,B,t.term);let H;L||(H=j?fetchDocumentsWithDistinct(e,B,k,O,j):fetchDocuments(e,B,k,O));let q={elapsed:{formatted:``,raw:0},hits:[],count:B.length};return H!==void 0&&(q.hits=H.filter(Boolean),F||removeVectorsFromHits(q,E)),D&&(q.facets=getFacets(e,B,t.facets)),t.groupBy&&(q.groups=getGroups(e,B,t.groupBy)),q.elapsed=e.formatElapsedTime(getNanosecondsTime()-w),q}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}const defaultBM25Params={k:1.2,b:.75,d:.5};function applyDefault(e){let t=e??{};return t.k=t.k??defaultBM25Params.k,t.b=t.b??defaultBM25Params.b,t.d=t.d??defaultBM25Params.d,t}function innerVectorSearch(e,t,S){let w=t.vector;if(w&&(!(`value`in w)||!(`property`in w)))throw createError(`INVALID_VECTOR_INPUT`,Object.keys(w).join(`, `));let E=e.data.index.vectorIndexes[w.property];if(!E)throw createError(`UNKNOWN_VECTOR_PROPERTY`,w.property);let D=E.node.size;if(w?.value.length!==D)throw w?.property===void 0||w?.value.length===void 0?createError(`INVALID_INPUT_VECTOR`,`undefined`,D,`undefined`):createError(`INVALID_INPUT_VECTOR`,w.property,D,w.value.length);let O=e.data.index,k;return Object.keys(t.where??{}).length>0&&(k=e.index.searchByWhereClause(O,e.tokenizer,t.where,S)),E.node.find(w.value,t.similarity??.8,k)}function searchVector(e,t,S=`english`){let w=getNanosecondsTime();function E(){let E=innerVectorSearch(e,t,S).sort(sortTokenScorePredicate);E=applyPinningRules(e,e.data.pinning,E,void 0);let D=[];t.facets&&Object.keys(t.facets).length>0&&(D=getFacets(e,E,t.facets));let O=t.vector.property,k=t.includeVectors??!1,j=t.limit??10,F=t.offset??0,L=Array.from({length:j});for(let t=0;t<j;t++){let S=E[t+F];if(!S)break;let w=e.data.docs.docs[S[0]];w&&(k||(w[O]=null),L[t]={id:getDocumentIdFromInternalId(e.internalDocumentIDStore,S[0]),score:S[1],document:w})}let B=[];t.groupBy&&(B=getGroups(e,E,t.groupBy));let H=getNanosecondsTime()-w;return{count:E.length,hits:L.filter(Boolean),elapsed:{raw:Number(H),formatted:formatNanoseconds(H)},...D?{facets:D}:{},...B?{groups:B}:{}}}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}function innerHybridSearch(e,t,S){let w=minMaxScoreNormalization(innerFullTextSearch(e,t,S)),E=innerVectorSearch(e,t,S),D=t.hybridWeights;return mergeAndRankResults(w,E,t.term??``,D)}function hybridSearch(e,t,S){let w=getNanosecondsTime();function E(){let E=innerHybridSearch(e,t,S);E=applyPinningRules(e,e.data.pinning,E,t.term);let D;t.facets&&Object.keys(t.facets).length>0&&(D=getFacets(e,E,t.facets));let O;t.groupBy&&(O=getGroups(e,E,t.groupBy));let k=t.offset??0,j=t.limit??10,F=fetchDocuments(e,E,k,j).filter(Boolean),L=getNanosecondsTime(),B={count:E.length,elapsed:{raw:Number(L-w),formatted:formatNanoseconds(L-w)},hits:F,...D?{facets:D}:{},...O?{groups:O}:{}};return(t.includeVectors??!1)||removeVectorsFromHits(B,Object.keys(e.data.index.vectorIndexes)),B}async function D(){e.beforeSearch&&await runBeforeSearch(e.beforeSearch,e,t,S);let w=E();return e.afterSearch&&await runAfterSearch(e.afterSearch,e,t,S,w),w}return e.beforeSearch?.length||e.afterSearch?.length?D():E()}function extractScore(e){return e[1]}function minMaxScoreNormalization(e){let t=Math.max.apply(Math,e.map(extractScore));return e.map(([e,S])=>[e,S/t])}function normalizeScore(e,t){return e/t}function hybridScoreBuilder(e,t){return(S,w)=>S*e+w*t}function mergeAndRankResults(e,t,S,w){let E=Math.max.apply(Math,e.map(extractScore)),D=Math.max.apply(Math,t.map(extractScore)),{text:O,vector:k}=w&&w.text&&w.vector?w:getQueryWeights(S),j=new Map,F=e.length,L=hybridScoreBuilder(O,k);for(let t=0;t<F;t++){let[S,w]=e[t],D=L(normalizeScore(w,E),0);j.set(S,D)}let B=t.length;for(let e=0;e<B;e++){let[S,w]=t[e],E=normalizeScore(w,D),O=j.get(S)??0;j.set(S,O+L(0,E))}return[...j].sort((e,t)=>t[1]-e[1])}function getQueryWeights(e){return{text:.5,vector:.5}}function search(e,t,S){let w=t.mode??`fulltext`;if(w===`fulltext`)return fullTextSearch(e,t,S);if(w===`vector`)return searchVector(e,t);if(w===`hybrid`)return hybridSearch(e,t);throw createError(`INVALID_SEARCH_MODE`,w)}function fetchDocumentsWithDistinct(e,t,S,w,E){let D=e.data.docs,O=new Map,k=[],j=new Set,F=t.length,L=0;for(let B=0;B<F;B++){let F=t[B];if(F===void 0)continue;let[H,q]=F;if(j.has(H))continue;let J=e.documentsStore.get(D,H),Y=getNested(J,E);if(!(Y===void 0||O.has(Y))&&(O.set(Y,!0),L++,!(L<=S)&&(k.push({id:getDocumentIdFromInternalId(e.internalDocumentIDStore,H),score:q,document:J}),j.add(H),L>=S+w)))break}return k}function fetchDocuments(e,t,S,w){let E=e.data.docs,D=Array.from({length:w}),O=new Set;for(let k=S;k<w+S;k++){let S=t[k];if(S===void 0)break;let[w,j]=S;if(!O.has(w)){let t=e.documentsStore.get(E,w);D[k]={id:getDocumentIdFromInternalId(e.internalDocumentIDStore,w),score:j,document:t},O.add(w)}}return D}var import_diff_match_patch=__toESM$1(require_diff_match_patch(),1);const dmp$1=new import_diff_match_patch.default;function diffLinesFast(e,t){if(e===t)return[{value:e}];let{chars1:S,chars2:w,lineArray:E}=dmp$1.diff_linesToChars_(e,t),D=dmp$1.diff_main(S,w,!1);dmp$1.diff_charsToLines_(D,E),dmp$1.diff_cleanupSemantic(D);let O=[];for(let[e,t]of D)e===import_diff_match_patch.default.DIFF_DELETE?O.push({value:t,removed:!0}):e===import_diff_match_patch.default.DIFF_INSERT?O.push({value:t,added:!0}):O.push({value:t});return O}const dmpDiff=new import_diff_match_patch.default;dmpDiff.Diff_Timeout=.25;const APPLY_FAST_DIFF_MAX_BYTES=256*1024;function applyIncrementalDiff(e,t,S){if(t===S)return;let w=diffLinesFast(t,S),E=0;for(let S=0;S<w.length;S++){let D=w[S],O=w[S+1];if(D.removed&&O?.added){if(t.substring(E,E+O.value.length)===O.value){E+=O.value.length,S++;continue}e.delete(E,D.value.length),e.insert(E,O.value),E+=O.value.length,S++}else D.removed?e.delete(E,D.value.length):(D.added&&e.insert(E,D.value),E+=D.value.length)}}function applyFastDiff(e,t,S){if(t===S)return;if(t.length>APPLY_FAST_DIFF_MAX_BYTES||S.length>APPLY_FAST_DIFF_MAX_BYTES){applyByPrefixSuffixMiddleReplace(e,t,S);return}let w=dmpDiff.diff_main(t,S);dmpDiff.diff_cleanupSemantic(w);let E=0;for(let[t,S]of w)t===0?E+=S.length:t===-1?e.delete(E,S.length):t===1&&(e.insert(E,S),E+=S.length)}function applyByPrefixSuffixMiddleReplace(e,t,S){let w=0,E=Math.min(t.length,S.length);for(;w<E&&t.charCodeAt(w)===S.charCodeAt(w);)w++;let D=0;for(;D<E-w&&t.charCodeAt(t.length-1-D)===S.charCodeAt(S.length-1-D);)D++;let O=t.length-w-D,k=S.slice(w,S.length-D);O>0&&e.delete(w,O),k.length>0&&e.insert(w,k)}const FrontmatterIssueSchema=object$1({path:array(union([string$2(),number$1()])),message:string$2(),issueCode:string$2()}),FrontmatterValidationErrorSchema=discriminatedUnion(`code`,[object$1({code:literal(`SCHEMA_INVALID`),issues:array(FrontmatterIssueSchema)}),object$1({code:literal(`WRITE_ERROR`),detail:string$2()})]),FRONTMATTER_TYPES=[`text`,`number`,`boolean`,`date`,`list`],FrontmatterTypeSchema=_enum(FRONTMATTER_TYPES),FrontmatterValueSchema=union([string$2(),number$1(),boolean$1(),array(union([string$2(),number$1(),boolean$1()]).transform(e=>String(e)))]),FrontmatterMapSchema=record(string$2(),FrontmatterValueSchema),FrontmatterPatchSchema=record(string$2(),union([FrontmatterValueSchema,_null()]));function isFrontmatterValueEmpty(e){return!!(e===null||typeof e==`string`&&e===``||Array.isArray(e)&&e.length===0)}const DeclarationSchema=object$1({type:FrontmatterTypeSchema}),FolderSchemaSchema=object$1({declarations:record(string$2(),DeclarationSchema).optional().default({})}),FRONTMATTER_RE$1=/^---\r?\n([\s\S]*?\r?\n)?---(\r?\n|$)/;function stripFrontmatter(e){let t=e.match(FRONTMATTER_RE$1);return t?{frontmatter:t[0],body:e.slice(t[0].length)}:{frontmatter:``,body:e}}function prependFrontmatter(e,t){return e?e+t:t}function unwrapFrontmatterFences(e){if(e===``)return``;let t=e.match(FRONTMATTER_RE$1);return t?(t[1]??``).replace(/\r?\n$/,``):e}const STRINGIFY_OPTIONS={defaultKeyType:`PLAIN`,defaultStringType:`PLAIN`,lineWidth:0};function parseFrontmatterYaml(e){if(e.trim()===``)return{doc:new import_dist$1.Document({}),map:{}};let t;try{t=(0,import_dist$1.parseDocument)(e)}catch(e){let t=e instanceof Error?e.message:String(e);return{doc:new import_dist$1.Document({}),map:null,parseError:`parse threw: ${t}`}}if(t.errors.length>0)return{doc:t,map:null,parseError:t.errors[0]?.message??`yaml parse errors`};let S;try{S=t.toJS()}catch(e){let S=e instanceof Error?e.message:String(e);return{doc:t,map:null,parseError:`toJS threw: ${S}`}}if(typeof S!=`object`||!S||Array.isArray(S))return{doc:t,map:null,parseError:`top-level value is not a mapping`};let w=FrontmatterMapSchema.safeParse(S);if(!w.success){let e=w.error.issues[0],S=e&&Array.isArray(e.path)?e.path.join(`.`):``,E=e?.message??`unknown`;return{doc:t,map:null,parseError:S?`value at "${S}" failed schema: ${E}`:`schema validation failed: ${E}`}}return{doc:t,map:w.data}}function withFences(e){return e===``?``:`---\n${e.endsWith(`
|
|
300
300
|
`)?e.slice(0,-1):e}\n---\n`}const MAX_FM_REGION_BYTES=65536;function detectFmRegion(e){let t=e.match(FRONTMATTER_RE$1);return t?{fenced:t[0],body:e.slice(t[0].length)}:{fenced:``,body:e}}function parseFmRegion(e){if(e.trim()===``)return{doc:new import_dist$1.Document({}),map:{}};let t;try{t=(0,import_dist$1.parseDocument)(e,{uniqueKeys:!1})}catch(e){let t=e instanceof Error?e.message:String(e);return{doc:new import_dist$1.Document({}),map:null,parseError:`parse threw: ${t}`}}if(t.errors.length>0)return{doc:t,map:null,parseError:t.errors[0]?.message??`yaml parse errors`};let S;try{S=t.toJS()}catch(e){let S=e instanceof Error?e.message:String(e);return{doc:t,map:null,parseError:`toJS threw: ${S}`}}if(typeof S!=`object`||!S||Array.isArray(S))return{doc:t,map:null,parseError:`top-level value is not a mapping`};let w=FrontmatterMapSchema.safeParse(S);if(!w.success){let e=w.error.issues[0],S=e&&Array.isArray(e.path)?e.path.join(`.`):``,E=e?.message??`unknown`;return{doc:t,map:null,parseError:S?`value at "${S}" failed schema: ${E}`:`schema validation failed: ${E}`}}return{doc:t,map:w.data}}function parseFencedFmRegion(e){return e===``?{doc:new import_dist$1.Document({}),map:{}}:parseFmRegion(unwrapFrontmatterFences(e))}function readFmMap(e){let{fenced:t}=detectFmRegion(e),{map:S}=parseFencedFmRegion(t);return S??{}}const RESERVED_FRONTMATTER_KEY$1=`frontmatter`;function ensureContents(e){if(e.contents==null||!(`items`in e.contents)){let t=e.createNode({});return e.contents=t,t}return e.contents}function stringify$1(e){let t=e.contents;return!t||!(`items`in t)||(t.items?.length??0)===0?``:withFences(e.toString(STRINGIFY_OPTIONS))}function checkRegionSize(e){let t=new TextEncoder().encode(e).byteLength;return t>65536?{kind:`region_too_large`,bytes:t,limit:MAX_FM_REGION_BYTES}:null}function applyPatchToFm(e,t){if(Object.hasOwn(t,RESERVED_FRONTMATTER_KEY$1))return{ok:!1,error:{kind:`reserved_key`,key:RESERVED_FRONTMATTER_KEY$1}};let{doc:S,map:w}=parseFencedFmRegion(e);if(w===null)return{ok:!1,error:{kind:`parse_failed`,reason:`fm region unparseable`}};try{ensureContents(S);for(let[e,w]of Object.entries(t)){if(w===null){S.delete(e);continue}let t=FrontmatterValueSchema.safeParse(w);if(!t.success)return{ok:!1,error:{kind:`invalid_value`,key:e,reason:t.error.issues[0]?.message??`invalid value`}};if(Array.isArray(t.data)){let w=S.get(e,!0),E=(0,import_dist$1.isSeq)(w)?w.flow:void 0,D=S.createNode(t.data);E!==void 0&&(D.flow=E),S.set(e,D);continue}S.set(e,t.data)}let e=stringify$1(S),w=checkRegionSize(e);return w?{ok:!1,error:w}:{ok:!0,nextFenced:e}}catch(e){return{ok:!1,error:{kind:`parse_failed`,reason:`yaml@2 threw: ${e instanceof Error?e.message:String(e)}`}}}}const FORM_WRITE_ORIGIN=Object.freeze({source:`local`,skipStoreHooks:!1,context:Object.freeze({origin:`form-write`})});function fnv1aDigest(e){let t=2166136261;for(let S=0;S<e.length;S++)t^=e.charCodeAt(S),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,`0`)}function toBridgeInvariantLog(e,t){let S=t?.verbose===!0,w=t?.nowMs===void 0?new Date().toISOString():new Date(t.nowMs).toISOString(),E={event:`bridge-invariant-violation`,site:e.site,"doc.name":e.docName??null,"tolerance-class-attempted":`untracked`,"normalize-equal-modulo-tolerance":!1,ytextLen:e.ytextSnapshot.length,fragmentLen:e.fragmentMdSnapshot.length,ytextHash:fnv1aDigest(e.ytextSnapshot),fragmentHash:fnv1aDigest(e.fragmentMdSnapshot),redacted:!S,timestamp:w};return S?{...E,diff:e.unifiedDiff}:E}var BridgeInvariantViolationError=class extends Error{violation;constructor(e){let t=typeof e.origin==`string`?e.origin:e.origin?.context?.origin??`unknown-object`,S=e.docName?` doc='${e.docName}'`:``;super(`Bridge invariant violated [site='${e.site}'${S}, origin='${t}'].\n Y.Text (${e.ytextSnapshot.length} chars): ${e.ytextSnapshot.slice(0,200)}...\n Fragment (${e.fragmentMdSnapshot.length} chars): ${e.fragmentMdSnapshot.slice(0,200)}...\n Diff:\n${e.unifiedDiff}`),this.name=`BridgeInvariantViolationError`,this.violation=e}};const dmp=new import_diff_match_patch.default;dmp.Match_Threshold=.5;function mergeThreeWay(e,t,S){let w=mergeThreeWayImpl(e,t,S);return assertContentPreservation(e,t,S,w),w}function mergeThreeWayImpl(e,t,S){if(e===t)return S;if(e===S||t===S)return t;let w=diff3Merge(t.split(`
|
|
301
301
|
`),e.split(`
|
|
302
302
|
`),S.split(`
|
|
@@ -425,7 +425,7 @@ $2`).split(`
|
|
|
425
425
|
`;return F.join(H)},table(e,t,S,w){let E=` `,D=S.enter(`table`),O=[],k=[],j=e.children??[];for(let e of j){let t=e.children??[],E=[],D=[];for(let e of t){let t=S.enter(`tableCell`),O=S.enter(`phrasing`),k=S.containerPhrasing(e,{...w,before:` `,after:` `});O(),t(),E.push(k);let j=e.data?.sourcePadding;D.push(j&&typeof j.left==`number`&&typeof j.right==`number`?{left:j.left,right:j.right}:null)}O.push(E),k.push(D)}D();let F=e.align??[],L=e.data?.sourceDashCounts,B=O[0]?.length??0,H=O.slice(1).reduce((e,t)=>Math.max(e,t.length),0),q=Math.max(B,H,F.length),J=[];for(let e=0;e<q;e++){let t=F[e],S=``,w=``;t===`center`?(S=`:`,w=`:`):t===`left`?S=`:`:t===`right`&&(w=`:`);let E=L?.[e],D=typeof E==`number`&&E>=1?E:1;J.push(S+`-`.repeat(D)+w)}let Y=(e,t)=>{let S=[];for(let w=0;w<q;w++){let E=e[w]??``,D=t[w]??{left:1,right:1};S.push(` `.repeat(D.left)+E+` `.repeat(D.right))}return`|${S.join(`|`)}|`},ee=Array.from({length:q},()=>null);if(O.length===0)return Y(J,ee);let te=[];te.push(Y(O[0],k[0]??[])),te.push(Y(J,ee));for(let e=1;e<O.length;e++)te.push(Y(O[e],k[e]??[]));return te.join(`
|
|
426
426
|
`)},mdxJsxFlowElement(e,t,S,w){let E=e,D=E.data?.sourceRaw;if(typeof D==`string`)return D;let O=E.data?.htmlBoundary;if(O&&typeof O.opener==`string`&&typeof O.closer==`string`){let e=S.containerFlow({type:`root`,children:E.children??[]},w);return`${O.opener}\n\n${e}\n\n${O.closer}`}let k=E.name??``,j=serializeMdxJsxAttrs(E.attributes??[]);if(!E.children||E.children.length===0)return k?j?`<${k} ${j} />`:`<${k} />`:``;let F=j?`<${k} ${j}>`:`<${k}>`,L=`</${k}>`;return`${F}\n\n${S.containerFlow({type:`root`,children:E.children},w)}\n\n${L}`},mark(e,t,S,w){let E=S.createTracker(w),D=S.enter(`mark`),O=E.move(`==`);return O+=S.containerPhrasing(e,{before:O,after:`==`,...E.current()}),O+=E.move(`==`),D(),O},comment(e,t,S,w){let E=e.data?.sourceForm,D=E===`html`?`<!-- `:`%%`,O=E===`html`?` -->`:`%%`,k=S.createTracker(w),j=S.enter(`comment`),F=k.move(D);return F+=S.containerPhrasing(e,{before:F,after:O,...k.current()}),F+=k.move(O),j(),F},commentBlock(e,t,S,w){let E=S.createTracker(w),D=S.enter(`commentBlock`),O=e.children??[],k=e.data?.sourceForm,j=e.data?.sourceLayout,F=O.length===1&&O[0]?.type===`paragraph`;if(k===`html`&&F){let e=O[0],t=S.containerPhrasing(e,{before:`<!-- `,after:` -->`,...E.current()});return D(),`<!-- ${t} -->`}if(j===`inline`&&F){let e=O[0],t=S.containerPhrasing(e,{before:`%% `,after:` %%`,...E.current()});return D(),`%% ${t} %%`}let L=S.containerFlow(e,E.current());return D(),`%%\n\n${L}\n\n%%`},mdxJsxTextElement(e){let t=e.data?.sourceRaw;if(typeof t==`string`)return t;let S=e.name??``,w=serializeMdxJsxAttrs(e.attributes??[]);return w?`<${S} ${w} />`:`<${S}/>`},rawMdxFallback(e){return e.value??``},blockquote(e,t,S,w){let E=S.enter(`blockquote`),D=S.createTracker(w);D.move(`> `),D.shift(2);let O=S.containerFlow(e,D.current());E();let k=e.data?.sourceMarkerSpacings,j=0;return S.indentLines(O,(e,t,S)=>S?`>`:k?.[j++]===`none`?`>${e}`:`> ${e}`)}};function serializeMdxJsxAttrs(e){let t=[];for(let S of e){if(S.type===`mdxJsxExpressionAttribute`){t.push(`{${S.value}}`);continue}let e=S.name;if(S.value===null||S.value===void 0){t.push(e);continue}if(typeof S.value==`string`){if(S.value.includes(`"`)){let w=S.value.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`);t.push(`${e}={"${w}"}`)}else t.push(`${e}="${S.value}"`);continue}t.push(`${e}={${S.value.value}}`)}return t.join(` `)}function emitLinkTitle(e,t,S=` `){return t===`single`?`${S}'${e.replace(/'/g,`\\'`)}'`:t===`paren`?`${S}(${e.replace(/[()]/g,`\\$&`)})`:`${S}"${e.replace(/"/g,`\\"`)}"`}function formatLinkUrl(e){if(!e)return``;let t=0,S=!0;for(let w of e)w===`(`?t++:w===`)`&&(t--,t<0&&(S=!1));return t!==0&&(S=!1),S?e:e.replace(/[\\()]/g,`\\$&`)}function escapeEntityAmpersands(e){return e.replace(/(?<!\\)&(?=[A-Za-z][A-Za-z0-9]*;|#[0-9]+;|#[xX][0-9A-Fa-f]+;)/g,`\\&`)}function safeText(e,t,S){let w=e.unsafe;e.unsafe=w.filter(e=>!(e.character===`&`&&e.after===`[#A-Za-z]`||e.character===`<`||e.character===`[`||e.character===`(`||e.character==="`"));let E;try{E=e.safe(t,S)}finally{e.unsafe=w}return escapeEntityAmpersands(E)}function formatFileSize(e){if(!Number.isFinite(e)||e<0)return``;if(e<1024)return`${e} B`;let t=[`KiB`,`MiB`,`GiB`,`TiB`],S=e/1024,w=0;for(;S>=1024&&w<t.length-1;)S/=1024,w+=1;return`${S.toFixed(1).replace(/\.0$/,``)} ${t[w]}`}var MarkdownManager=class{schema;handlers;pmNodeHandlers;pmMarkHandlers;parseProcessor;serializeProcessor;parseCtx={current:{}};constructor(e){this.schema=getSchema(e.extensions),this.handlers=buildMdastToPmHandlers(this.schema,this.parseCtx);let{nodeHandlers:t,markHandlers:S}=buildPmToMdastHandlers(this.schema);this.pmNodeHandlers=t,this.pmMarkHandlers=S,this.parseProcessor=createParseProcessor({schema:this.schema,handlers:this.handlers,pmNodeHandlers:this.pmNodeHandlers,pmMarkHandlers:this.pmMarkHandlers}),this.serializeProcessor=createSerializeProcessor({schema:this.schema,handlers:this.handlers,pmNodeHandlers:this.pmNodeHandlers,pmMarkHandlers:this.pmMarkHandlers,toMarkdownHandlers})}parse(e,t){if(!e.trim())return{type:`doc`,content:[{type:`paragraph`,content:[]}]};this.parseCtx.current=t??{};try{return parseMd(e,this.parseProcessor).toJSON()}finally{this.parseCtx.current={}}}parseToMdast(e){return e.trim()?parseMdToMdast(e,this.parseProcessor):{type:`root`,children:[]}}parseWithFallback(e,t){return e.trim()?parseWithFallback(e,{parse:e=>this.parse(e,t)}):{type:`doc`,content:[{type:`paragraph`,content:[]}]}}serialize(e){let t;try{t=this.schema.nodeFromJSON(e)}catch(t){let S=`MarkdownManager.serialize() failed: schema rejected JSONContent (type=${e.type}, childCount=${e.content?.length??0})`;throw Error(S,{cause:t})}return serializeMd(t,this.serializeProcessor,{schema:this.schema,pmNodeHandlers:this.pmNodeHandlers,pmMarkHandlers:this.pmMarkHandlers})}};const registry=createRegistry();function destructureAttrs(e,t){let S=new Map;for(let e of t)S.set(e.name,e);let w={};for(let t of e){if(t.type===`mdxJsxExpressionAttribute`)continue;let e=t.name,E=S.get(e);if(t.value===null||t.value===void 0){w[e]=!0;continue}if(typeof t.value==`string`){if(E?.type===`number`){let S=Number(t.value);w[e]=Number.isNaN(S)?t.value:S}else E?.type===`boolean`?w[e]=t.value===`true`:w[e]=t.value;continue}let D=t.value.value;try{w[e]=JSON.parse(D)}catch{w[e]=D}}return w}function hasDirtyDescendant(e){let t=!1;return e.descendants(e=>t||e.type.name===`jsxInline`?!1:e.type.name===`jsxComponent`&&e.attrs.sourceDirty?(t=!0,!1):!0),t}function effectiveDirty(e){return e.attrs.sourceDirty||hasDirtyDescendant(e)}function isEmptyMdastParagraph(e){if(e.type!==`paragraph`)return!1;let t=e.children??[];return t.length===0?!0:t.every(e=>e.type===`text`&&e.value===``)}function withInlineCodeData(e,t){if(!t)return e;let S={};return t.sourceFenceChar&&(S.sourceFenceChar=t.sourceFenceChar),typeof t.sourceFenceLength==`number`&&(S.sourceFenceLength=t.sourceFenceLength),Object.keys(S).length===0?e:{...e,data:S}}function wrapAsInlineCode(e,t){if(e.length===0)return withInlineCodeData({type:`inlineCode`,value:``},t);if(e.every(e=>e.type===`text`))return withInlineCodeData({type:`inlineCode`,value:e.map(e=>e.value).join(``)},t);if(e.length===1&&`children`in e[0]){let S=e[0];return{...S,children:[wrapAsInlineCode(S.children,t)]}}return withInlineCodeData({type:`inlineCode`,value:extractTextFromMdastNodes(e)},t)}function extractTextFromMdastNodes(e){let t=``;for(let S of e)S.type===`text`?t+=S.value:`children`in S&&Array.isArray(S.children)?t+=extractTextFromMdastNodes(S.children):`value`in S&&typeof S.value==`string`&&(t+=S.value);return t}const WIKI_EMBED_IMAGE_EXTS=IMAGE_EXTENSIONS;function buildMdastToPmHandlers(e,t){let S=e.nodes,w=e.marks,E={};S.paragraph&&(E.paragraph=(e,t,w)=>{let E=w.all(e).flat(),D=E.some(e=>e?.isBlock&&!e?.isInline),O=E.some(e=>e?.isInline||e?.isText||e?.isTextblock);if(D&&!O)return E.length===1?E[0]:E;if(D&&O){let e=E.filter(e=>!e?.isBlock||e?.isInline),t=E.filter(e=>e?.isBlock&&!e?.isInline),w=[],D=S.paragraph.createAndFill(null,e.length>0?e:null);return D&&w.push(D),w.push(...t),w.length===1?w[0]:w}return S.paragraph.createAndFill(null,E.length>0?E:null)}),S.blockquote&&(E.blockquote=toPmNode(S.blockquote,e=>({sourceMarkerSpacings:e.data?.sourceMarkerSpacings??null}))),S.tableCell&&(E.tableCell=(e=>(t,w,E)=>{let D=E.all(t).flat();if(D.length>0&&S.paragraph){let t=S.paragraph.create(null,D);return e.createAndFill(null,[t])}return e.createAndFill(null,null)})(S.tableCell)),S.tableRow&&(E.tableRow=toPmNode(S.tableRow)),S.table&&S.tableRow&&S.tableCell&&(E.table=(e,t,w)=>{let E=e.align??[],D=e.children??[],O=[];for(let e=0;e<D.length;e++){let t=D[e];if(t.type!==`tableRow`)continue;let k=t.children??[],j=[];for(let t=0;t<k.length;t++){let D=k[t];if(D.type!==`tableCell`)continue;let O=w.all(D).flat(),F=O.length>0&&S.paragraph?[S.paragraph.create(null,O)]:null,L=E[t]??null,B=e===0&&S.tableHeader?S.tableHeader:S.tableCell,H=D.data?.sourcePadding??null,q=B.createAndFill({align:L,sourcePadding:H},F);q&&j.push(q)}let F=S.tableRow.createAndFill(null,j.length>0?j:null);F&&O.push(F)}let k=e.data?.sourceDashCounts??null;return S.table.createAndFill({sourceDashCounts:k},O.length>0?O:null)}),S.image&&(E.image=e=>{let w=e.url??``,E=normalizeDocRelativeAssetUrl(w,t.current.sourcePath);return S.image.createAndFill({src:E,alt:e.alt??null,title:e.title??null,sourceUrl:E===w?null:w})},S.imageReference?E.imageReference=e=>S.imageReference.createAndFill({alt:e.alt??``,label:e.label??e.identifier??``,identifier:e.identifier??``,referenceType:e.referenceType??`shortcut`}):E.imageReference=e=>S.image.createAndFill({src:``,alt:e.alt??null,title:null})),w.escapeMark&&(E.text=t=>{let S=t.value??``,E=typeof t.data?.sourceRaw==`string`?t.data.sourceRaw:null;if(!S&&!E)return null;if(E){let t=S.replaceAll(`\xA0`,` `);return w.sourceLiteral?e.text(t,[w.sourceLiteral.create({sourceRaw:E})]):e.text(t)}let D=t.data?.escapedChars,O=t.data?.entityRefSpans;if(!D?.length&&!O?.length)return e.text(S.replaceAll(`\xA0`,` `));let k=[...(D??[]).map(e=>({kind:`escape`,offset:e.offset,length:1})),...(O??[]).map(e=>({kind:`entity`,offset:e.offset,length:e.length,raw:e.raw}))];k.sort((e,t)=>e.offset-t.offset);let j=[],F=0;for(let t of k){if(t.offset>F){let w=S.slice(F,t.offset).replaceAll(`\xA0`,` `);w&&j.push(e.text(w))}if(t.offset<S.length){let E=S.slice(t.offset,t.offset+t.length).replaceAll(`\xA0`,` `);E&&(t.kind===`escape`?j.push(e.text(E,[w.escapeMark.create()])):w.sourceLiteral?j.push(e.text(E,[w.sourceLiteral.create({sourceRaw:t.raw})])):j.push(e.text(E))),F=t.offset+t.length}}if(F<S.length){let t=S.slice(F).replaceAll(`\xA0`,` `);t&&j.push(e.text(t))}return j.length===1?j[0]:j}),w.code&&(E.inlineCode=t=>e.text(t.value,[w.code.create({sourceFenceChar:t.data?.sourceFenceChar??"`",sourceFenceLength:typeof t.data?.sourceFenceLength==`number`?t.data.sourceFenceLength:1})]));let D=w.strike??w.delete;if(D&&(E.delete=toPmMark(D)),w.highlight&&(E.mark=toPmMark(w.highlight)),w.comment&&(E.comment=toPmMark(w.comment,e=>({sourceForm:e.data?.sourceForm??`percent`}))),S.commentBlock&&(E.commentBlock=toPmNode(S.commentBlock,e=>({sourceForm:e.data?.sourceForm??`percent`,sourceLayout:e.data?.sourceLayout??`block`}))),w.emphasis&&(E.emphasis=toPmMark(w.emphasis,e=>({sourceDelimiter:e.data?.sourceDelimiter??`*`}))),w.strong&&(E.strong=toPmMark(w.strong,e=>({sourceDelimiter:e.data?.sourceDelimiter??`**`}))),S.heading&&(E.heading=toPmNode(S.heading,e=>({level:e.depth,headingStyle:e.data?.sourceStyle??`atx`,sourceTrailingHashes:e.data?.sourceTrailingHashes??null,sourceUnderlineLength:e.data?.sourceUnderlineLength??null,sourceContiguousNext:e.data?.sourceContiguousNext??!1}))),S.codeBlock&&(E.code=t=>{let w=t.value?[e.text(t.value)]:[];return S.codeBlock.createAndFill({language:t.lang??null,meta:t.meta??null,fenceDelimiter:t.data?.sourceFenceChar??"`",fenceLength:t.data?.sourceFenceLength??3,sourceStyle:t.data?.sourceStyle??`fenced`},w)}),S.thematicBreak&&(E.thematicBreak=e=>S.thematicBreak.createAndFill({sourceRaw:e.data?.sourceRaw??`---`})),S.hardBreak&&(E.break=e=>S.hardBreak.createAndFill({hardBreakStyle:e.data?.sourceStyle??`spaces`})),S.list&&(E.list=toPmNode(S.list,e=>({ordered:!!e.ordered,start:e.start??1,spread:!!e.spread,bulletMarker:e.data?.bulletMarker??null,listMarkerDelimiter:e.data?.listMarkerDelimiter??null}))),S.listItem&&(E.listItem=toPmNode(S.listItem,e=>({checked:e.checked??null,spread:!!e.spread}))),w.link){let t=w.sourceLiteral;E.link=(S,E,D)=>{if((S.children??[]).length===0){let w=typeof S.data?.sourceRaw==`string`?S.data.sourceRaw:`[](${S.url??``})`;return w?t?e.text(w,[t.create({sourceRaw:w})]):e.text(w):null}let O=D.all(S).flat(),k=w.link.create({href:S.url??``,title:S.title??null,linkStyle:S.data?.sourceStyle??`inline`,refLabel:null,sourceUrlForm:S.data?.sourceUrlForm??null,sourceTitleMarker:S.data?.sourceTitleMarker??null});return O.map(e=>e.mark(k.addToSet(e.marks)))},E.linkReference=(S,E,D)=>{if((S.children??[]).length===0){let w=typeof S.data?.sourceRaw==`string`?S.data.sourceRaw:`[${S.label??``}][${S.identifier??``}]`;return w?t?e.text(w,[t.create({sourceRaw:w})]):e.text(w):null}let O=D.all(S).flat(),k=w.link.create({href:``,title:null,linkStyle:S.referenceType??`shortcut`,refLabel:S.label??S.identifier??null});return O.map(e=>e.mark(k.addToSet(e.marks)))}}S.htmlBlock&&(E.html=e=>S.htmlBlock.createAndFill({content:e.value??``}));let O=S.linkDefinition??S.linkRefDef;if(O){let e=!!O.spec.attrs?.url,t=!!O.spec.attrs?.href,S=!!O.spec.attrs?.identifier,w=!!O.spec.attrs?.sourceLayout,D=!!O.spec.attrs?.sourceTitleMarker;E.definition=E=>{let k={title:E.title??null};return S&&(k.identifier=E.identifier??``),k.label=E.label??E.identifier??``,e?k.url=E.url??``:t&&(k.href=E.url??``),w&&(k.sourceLayout=E.data?.sourceLayout??null),D&&(k.sourceTitleMarker=E.data?.sourceTitleMarker??null),O.createAndFill(k)}}if(S.jsxComponent){let w=e=>{if(e&&typeof e==`object`&&`sourceRaw`in e){let t=e.sourceRaw;if(typeof t==`string`)return t}};E.mdxJsxFlowElement=(e,E,D)=>{let O=e.name??``,k=registry.getOrWildcard(O),j=destructureAttrs(e.attributes,k.props);if(O===`CommonMarkImage`&&typeof j.src==`string`){let e=j.src,S=normalizeDocRelativeAssetUrl(e,t.current.sourcePath);S!==e&&(j.src=S,j.sourceUrl=e)}let F=D.all(e).flat();return S.jsxComponent.createAndFill({componentName:O,kind:`element`,attributes:e.attributes,sourceRaw:w(e.data)??``,sourceDirty:!1,props:j},F.length?F:void 0)};let D=(e,t)=>{let S=e.attributes?.find(e=>e.type===`mdxJsxAttribute`&&e.name===t);return S&&typeof S.value==`string`?S.value:null};E.mdxJsxTextElement=t=>{if(t.name===`InlineMath`&&S.mathInline){let e=D(t,`formula`)??``,w=D(t,`id`);return S.mathInline.create({formula:e,id:w??null})}if(t.name===`Tag`&&S.tag){let e=D(t,`value`)??``;return S.tag.create({value:e})}if(S.jsxInline){let E=w(t.data)??``;return S.jsxInline.createAndFill({},E?[e.text(E)]:null)}return S.jsxComponent.createAndFill({sourceRaw:w(t.data)??``})},E.mdxFlowExpression=e=>{let t=w(e.data)??`{${e.value??``}}`;return S.jsxComponent.createAndFill({kind:`expression`,sourceRaw:t,sourceDirty:!1})},E.mdxTextExpression=t=>{let S=w(t.data)??`{${t.value??``}}`;return e.text(S)}}return S.wikiLink&&(E.wikiLink=e=>S.wikiLink.createAndFill({target:e.data?.target??``,alias:e.data?.alias??null,anchor:e.data?.anchor??null})),S.tag&&(E.tag=e=>S.tag.createAndFill({value:e.value})),S.wikiLinkEmbed&&(E.wikiLinkEmbed=(E,D)=>{let O=E.data?.target??``,k=E.data?.alias??null,j=E.data?.anchor??null,F=extensionOf(O),{resolveEmbed:L,sourcePath:B}=t.current,H=L&&B?L(O,B)??null:null,q=H?`/${H}`:O,J=D?.type===`paragraph`&&Array.isArray(D.children)&&D.children.length===1;if(J&&WIKI_EMBED_IMAGE_EXTS.has(F)&&S.jsxComponent&®istry.has(`WikiEmbedImage`))return S.jsxComponent.createAndFill({componentName:`WikiEmbedImage`,kind:`element`,attributes:[],sourceRaw:``,sourceDirty:!1,props:{src:q,alt:k??O,target:O,anchor:j,alias:k}});if(J&&VIDEO_EXTENSIONS.has(F)&&S.jsxComponent&®istry.has(`WikiEmbedVideo`))return S.jsxComponent.createAndFill({componentName:`WikiEmbedVideo`,kind:`element`,attributes:[],sourceRaw:``,sourceDirty:!1,props:{src:q,title:k??O,target:O,anchor:j,alias:k}});if(J&&AUDIO_EXTENSIONS.has(F)&&S.jsxComponent&®istry.has(`WikiEmbedAudio`))return S.jsxComponent.createAndFill({componentName:`WikiEmbedAudio`,kind:`element`,attributes:[],sourceRaw:``,sourceDirty:!1,props:{src:q,title:k??O,target:O,anchor:j,alias:k}});if(J&&FILE_ATTACHMENT_EXTENSIONS.has(F)&&S.jsxComponent&®istry.has(`WikiEmbedFile`)){let{resolveSize:e}=t.current,w=e&&B?e(O,B)??null:null,E=w===null?null:formatFileSize(w);return S.jsxComponent.createAndFill({componentName:`WikiEmbedFile`,kind:`element`,attributes:[],sourceRaw:``,sourceDirty:!1,props:{src:q,target:O,anchor:j,alias:k,size:E}})}let Y=k||(j?`${O}#${j}`:O);if(WIKI_EMBED_EXTENSIONS.has(F)&&w.link){let t=w.link.create({href:q,title:null,linkStyle:`inline`,refLabel:null,sourceForm:`wikiembed`,target:O,anchor:j,alias:k});return e.text(Y,[t])}if(w.link){let t=w.link.create({href:O,title:null,linkStyle:`inline`,refLabel:null});return e.text(Y,[t])}throw Error("[wikiLinkEmbed handler] schema lacks `link` mark — cannot dispatch without violating the STOP rule against emitting PM wikiLinkEmbed server-side")}),S.mathInline&&(E.inlineMath=e=>S.mathInline.create({formula:e.value??``})),E.math||=t=>{let w=t.value==null?`«unknown:${t.type}»`:t.value;return S.rawMdxFallback?(console.warn(JSON.stringify({event:`unknown-mdast-type`,type:t.type,reason:`Unhandled block mdast: ${t.type}`})),S.rawMdxFallback.createAndFill({reason:`Unhandled block mdast: ${t.type}`},w?[e.text(w)]:null)):null},E.inlineMath||=t=>(console.warn(JSON.stringify({event:`unknown-mdast-type`,type:t.type,reason:`Unhandled inline mdast: ${t.type}`})),t.value==null?e.text(`«unknown:${t.type}»`):e.text(t.value)),S.footnoteReference?E.footnoteReference=e=>S.footnoteReference.create({identifier:e.identifier,label:e.label??e.identifier}):E.footnoteReference||=t=>(console.warn(JSON.stringify({event:`unknown-mdast-type`,type:`footnoteReference`,reason:`FootnoteReference extension missing — recovering [^id] source`})),e.text(`[^${t.label??t.identifier}]`)),S.footnoteDefinition?E.footnoteDefinition=toPmNode(S.footnoteDefinition,e=>{let t=e;return{identifier:t.identifier,label:t.label??t.identifier}}):E.footnoteDefinition||=t=>{console.warn(JSON.stringify({event:`unknown-mdast-type`,type:`footnoteDefinition`,reason:`FootnoteDefinition extension missing — recovering [^id]: marker`}));let w=`[^${t.label??t.identifier}]: `;return S.paragraph?S.paragraph.create(null,e.text(w)):null},E.rawMdxFallbackMdast=t=>{if(!S.rawMdxFallback)return null;let w=t.position?{start:t.position.start?.offset??0,end:t.position.end?.offset??0}:{start:0,end:0};return console.warn(JSON.stringify({event:`unknown-mdast-type`,type:t.originalType,reason:`Unhandled mdast: ${t.originalType}`})),S.rawMdxFallback.createAndFill({reason:`Unhandled mdast: ${t.originalType}`,originalSpan:w},t.value?[e.text(t.value)]:null)},E}function buildPmToMdastHandlers(e){let t={},S={},w=e.nodes,E=e.marks;w.paragraph&&(t.paragraph=fromPmNode(`paragraph`)),w.blockquote&&(t.blockquote=fromPmNode(`blockquote`,e=>{let t=e.attrs.sourceMarkerSpacings,S={};return Array.isArray(t)&&t.length>0&&(S.sourceMarkerSpacings=t),Object.keys(S).length>0?{data:S}:{}})),w.heading&&(t.heading=fromPmNode(`heading`,e=>({depth:e.attrs.level,data:{sourceStyle:e.attrs.headingStyle,sourceTrailingHashes:e.attrs.sourceTrailingHashes??void 0,sourceUnderlineLength:e.attrs.sourceUnderlineLength??void 0,sourceContiguousNext:e.attrs.sourceContiguousNext===!0?!0:void 0}}))),w.codeBlock&&(t.codeBlock=e=>{let t=e.attrs.sourceStyle===`indented`?`indented`:`fenced`;return{type:`code`,lang:t===`indented`?null:e.attrs.language??null,meta:t===`indented`?null:e.attrs.meta??null,value:e.textContent??``,data:{sourceFenceChar:e.attrs.fenceDelimiter,sourceFenceLength:e.attrs.fenceLength,sourceStyle:t}}}),w.thematicBreak&&(t.thematicBreak=e=>({type:`thematicBreak`,data:{sourceRaw:e.attrs.sourceRaw}})),w.hardBreak&&(t.hardBreak=e=>({type:`break`,data:{sourceStyle:e.attrs.hardBreakStyle}})),w.list&&(t.list=fromPmNode(`list`,e=>({ordered:e.attrs.ordered??!1,start:e.attrs.ordered?e.attrs.start??1:null,spread:e.attrs.spread??!1,data:{bulletMarker:e.attrs.bulletMarker,listMarkerDelimiter:e.attrs.listMarkerDelimiter}}))),w.listItem&&(t.listItem=(e,t,S)=>{let w=S.all(e),E=w.length>1&&isEmptyMdastParagraph(w[0])?w.slice(1):w;return{type:`listItem`,checked:e.attrs.checked??null,spread:e.attrs.spread??!1,children:E}}),w.table&&(t.table=(e,t,S)=>{let w=S.all(e),E=[],D=e.firstChild;D&&D.forEach(e=>{let t=e.attrs.align;E.push(t===`left`||t===`right`||t===`center`?t:null)});let O=w.filter(e=>e.type===`tableRow`),k=e.attrs.sourceDashCounts,j=Array.isArray(k)&&k.length>0?{sourceDashCounts:k}:void 0,F={type:`table`,align:E,children:O};return j&&(F.data=j),F}),w.tableRow&&(t.tableRow=fromPmNode(`tableRow`));let D=e=>{let t=e.attrs.sourcePadding,S={};return typeof t==`object`&&t&&typeof t.left==`number`&&typeof t.right==`number`&&(S.sourcePadding=t),Object.keys(S).length>0?{data:S}:{}};if(w.tableCell&&(t.tableCell=fromPmNode(`tableCell`,D)),w.tableHeader&&(t.tableHeader=fromPmNode(`tableCell`,D)),w.image&&(t.image=e=>({type:`image`,url:e.attrs.sourceUrl??e.attrs.src,alt:e.attrs.alt,title:e.attrs.title})),w.imageReference&&(t.imageReference=e=>{let t=e.attrs.label??``,S=e.attrs.identifier??t;return{type:`imageReference`,alt:e.attrs.alt??``,identifier:S,label:t||S,referenceType:e.attrs.referenceType??`shortcut`}}),w.htmlBlock&&(t.htmlBlock=e=>({type:`html`,value:e.attrs.content})),w.linkDefinition??w.linkRefDef){let e=w.linkDefinition?`linkDefinition`:`linkRefDef`;t[e]=e=>{let t={},S=e.attrs.sourceLayout;(S===`multiline`||S===`inline`)&&(t.sourceLayout=S);let w=e.attrs.sourceTitleMarker;(w===`single`||w===`double`||w===`paren`)&&(t.sourceTitleMarker=w);let E={type:`definition`,identifier:e.attrs.identifier??e.attrs.label??``,label:e.attrs.label??e.attrs.identifier??``,url:e.attrs.url??e.attrs.href??``,title:e.attrs.title};return Object.keys(t).length>0&&(E.data=t),E}}if(w.jsxComponent&&(t.jsxComponent=(e,t,S)=>{if(e.attrs.kind===`expression`)return{type:`html`,value:e.attrs.sourceRaw??``};let w=e.attrs.componentName||null,E=Array.isArray(e.attrs.attributes)?e.attrs.attributes:[];return!effectiveDirty(e)&&e.attrs.sourceRaw?{type:`mdxJsxFlowElement`,name:w,attributes:E,children:[],data:{sourceRaw:String(e.attrs.sourceRaw)}}:registry.getOrWildcard(w??`*`).serialize(e,{all:e=>S.all(e),registry,serializeChildren:()=>{throw Error(`SerializeContext.serializeChildren is not available in the PM→mdast handler. Compat descriptors that need markdown-byte body rendering must emit a marker mdast node and let the to-markdown handler render the body via state.containerFlow.`)}})}),w.rawMdxFallback&&(t.rawMdxFallback=e=>{let t=e.textContent??``,S=typeof e.attrs.reason==`string`?e.attrs.reason:``,w=e.attrs.originalSpan;return{type:`rawMdxFallback`,value:t,data:{reason:S,originalSpan:w&&typeof w==`object`&&`start`in w&&`end`in w?{start:Number(w.start)||0,end:Number(w.end)||0}:{start:0,end:0}}}}),w.jsxInline&&(t.jsxInline=e=>{let t=e.attrs.sourceRaw||e.textContent||``;return{type:`mdxJsxTextElement`,name:null,attributes:[],children:[],data:{sourceRaw:String(t)}}}),w.mathInline&&(t.mathInline=e=>{let t=e.attrs.formula??``,S=e.attrs.id;return typeof S==`string`&&S.length>0?{type:`mdxJsxTextElement`,name:`InlineMath`,attributes:[{type:`mdxJsxAttribute`,name:`formula`,value:t},{type:`mdxJsxAttribute`,name:`id`,value:S}],children:[]}:{type:`inlineMath`,value:t}}),w.wikiLink&&(t.wikiLink=e=>{let t=e.attrs.target??``,S=e.attrs.anchor??null,w=e.attrs.alias??null,E=w||(S?`${t}#${S}`:t);return{type:`wikiLink`,value:E,data:{target:t,anchor:S,alias:w},children:[{type:`text`,value:E}]}}),w.tag&&(t.tag=e=>({type:`tag`,value:String(e.attrs.value??``)})),w.wikiLinkEmbed&&(t.wikiLinkEmbed=e=>{let t=e.attrs.target??``,S=e.attrs.anchor??null,w=e.attrs.alias??null,E=w||(S?`${t}#${S}`:t);return{type:`wikiLinkEmbed`,value:E,data:{target:t,anchor:S,alias:w},children:[{type:`text`,value:E}]}}),E.emphasis&&(S.emphasis=fromPmMark(`emphasis`,e=>({data:{sourceDelimiter:e.attrs.sourceDelimiter}}))),E.strong&&(S.strong=fromPmMark(`strong`,e=>({data:{sourceDelimiter:e.attrs.sourceDelimiter}}))),E.code&&(S.code=(e,t,S)=>{let w=e.attrs.sourceFenceChar,E=e.attrs.sourceFenceLength;return wrapAsInlineCode(S,{sourceFenceChar:w,sourceFenceLength:E})}),E.strike??E.delete){let e=E.strike?`strike`:`delete`;S[e]=fromPmMark(`delete`)}return E.highlight&&(S.highlight=fromPmMark(`mark`)),E.comment&&(S.comment=fromPmMark(`comment`,e=>({data:{sourceForm:e.attrs.sourceForm===`html`?`html`:`percent`}}))),w.commentBlock&&(t.commentBlock=fromPmNode(`commentBlock`,e=>({data:{sourceForm:e.attrs.sourceForm===`html`?`html`:`percent`,sourceLayout:e.attrs.sourceLayout===`inline`?`inline`:`block`}}))),w.footnoteReference&&(t.footnoteReference=e=>{let t=String(e.attrs.identifier??``);return{type:`footnoteReference`,identifier:t,label:e.attrs.label?String(e.attrs.label):t}}),w.footnoteDefinition&&(t.footnoteDefinition=fromPmNode(`footnoteDefinition`,e=>({identifier:String(e.attrs.identifier??``),label:e.attrs.label?String(e.attrs.label):String(e.attrs.identifier??``)}))),E.link&&(S.link=(e,t,S)=>{if(e.attrs.sourceForm===`wikiembed`){let t=typeof e.attrs.target==`string`&&e.attrs.target.length>0?e.attrs.target:e.attrs.href??``,S=typeof e.attrs.anchor==`string`&&e.attrs.anchor.length>0?e.attrs.anchor:null,w=typeof e.attrs.alias==`string`&&e.attrs.alias.length>0?e.attrs.alias:null,E=w||(S?`${t}#${S}`:t);return{type:`wikiLinkEmbed`,value:E,data:{target:t,anchor:S,alias:w},children:[{type:`text`,value:E}]}}let w=e.attrs.linkStyle;if(w===`autolink`)return{type:`link`,url:e.attrs.href??``,title:null,children:S,data:{sourceStyle:`autolink`}};if(w===`gfm-autolink`)return{type:`link`,url:e.attrs.href??``,title:null,children:S,data:{sourceStyle:`gfm-autolink`}};if(w===`inline`||!w){let t={};e.attrs.sourceUrlForm===`angle-bracketed`&&(t.sourceUrlForm=`angle-bracketed`);let w=e.attrs.sourceTitleMarker;return(w===`single`||w===`double`||w===`paren`)&&(t.sourceTitleMarker=w),{type:`link`,url:e.attrs.href??``,title:e.attrs.title??null,children:S,...Object.keys(t).length>0?{data:t}:{}}}return{type:`linkReference`,identifier:(e.attrs.refLabel??``).toLowerCase(),label:e.attrs.refLabel,referenceType:w,children:S}}),E.escapeMark&&(S.escapeMark=(e,t,S)=>{for(let e of S)if(e.type===`text`&&e.value){let t=e;t.data=t.data??{},t.data.escapedChars=t.data.escapedChars??[];for(let e=0;e<t.value.length;e++)t.data.escapedChars.push({offset:e,char:t.value[e]})}return S.length===1?S[0]:S}),E.sourceLiteral&&(S.sourceLiteral=(e,t,S)=>{let w=typeof e.attrs.sourceRaw==`string`?e.attrs.sourceRaw:``;if(S.length===1&&S[0]?.type===`text`){let e=S[0],t=w||e.value;return isValidSourceLiteralRaw(t,e.value)&&(e.data=e.data??{},e.data.sourceRaw=t),e}return{type:`text`,value:S.filter(e=>e.type===`text`).map(e=>e.value??``).join(``)||w}}),{nodeHandlers:t,markHandlers:S}}const COMBINING_MARK_RE=/\p{M}+/gu,NON_LETTER_OR_NUMBER_RE=/[^\p{L}\p{N}]+/gu,EDGE_HYPHENS_RE=/^-+|-+$/g;function toWikiLinkSlug(e){return e.trim().normalize(`NFKD`).replace(COMBINING_MARK_RE,``).toLowerCase().replace(NON_LETTER_OR_NUMBER_RE,`-`).replace(EDGE_HYPHENS_RE,``)}function disambiguateSlug(e,t){let S=t.get(e)??0;return t.set(e,S+1),S===0?e:`${e}-${S}`}function getHeadingSlug(e,t){let S=toWikiLinkSlug(e);return S?disambiguateSlug(S,t):``}const MICROMARK_MDX_EXT=mdx(),FROM_MARKDOWN_MDX_EXT=mdxFromMarkdown(),TO_MARKDOWN_MDX_EXT=mdxToMarkdown(),PLACEHOLDER_BODY=`Body content here.`,PLACEHOLDER_MERMAID_FENCE_BODY=`graph LR
|
|
427
427
|
A --> B`;function getCanonicalDescriptors(){return builtInComponents.filter(e=>e.surface===`canonical`&&e.name!==`*`)}function getAgentCanonicalDescriptors(){return getCanonicalDescriptors().filter(e=>resolveKind(e)!==`fence`)}function resolveKind(e){return e.name===`MermaidFence`?`fence`:e.hasChildren?`jsx-block`:`jsx-void`}function projectLite(e){return{id:e.name,displayName:e.displayName??e.name,description:e.description??``,kind:resolveKind(e)}}function exampleValueFor(e){if(e.hidden!==!0&&e.type!==`reactnode`){if(`defaultValue`in e&&e.defaultValue!==void 0)return e.defaultValue;if(e.type===`enum`)return e.enumValues[0];if(e.type===`string`)return``;if(e.type===`number`)return 0;if(e.type===`boolean`)return!1}}function shouldEmitProp(e,t){return!(e.omitOnDefault===!0&&`defaultValue`in e&&Object.is(e.defaultValue,t)||e.type===`string`&&e.required===!1&&e.defaultValue===void 0&&t===``)}function buildAttributes(e){let t=[];for(let S of e.props){let e=exampleValueFor(S);e!==void 0&&shouldEmitProp(S,e)&&t.push(propToMdxJsxAttribute(S.name,e))}return t}function buildBodyChildren(e){return fromMarkdown(e.exampleBody&&e.exampleBody.trim().length>0?e.exampleBody:PLACEHOLDER_BODY,{extensions:[MICROMARK_MDX_EXT],mdastExtensions:[FROM_MARKDOWN_MDX_EXT]}).children}function synthesizeExample(e){let t=resolveKind(e),S;if(t===`fence`)S={type:`code`,lang:`mermaid`,meta:null,value:e.exampleBody&&e.exampleBody.trim().length>0?e.exampleBody:PLACEHOLDER_MERMAID_FENCE_BODY};else{let w=buildAttributes(e),E=t===`jsx-block`?buildBodyChildren(e):[];S={type:`mdxJsxFlowElement`,name:e.name,attributes:w,children:E}}return toMarkdown({type:`root`,children:[S]},{extensions:[TO_MARKDOWN_MDX_EXT]}).trimEnd()}function projectParams(e){let t=[];for(let S of e.props){if(S.hidden===!0)continue;let e={name:S.name,type:S.type,required:S.required};S.description!==void 0&&(e.description=S.description),S.advanced===!0&&(e.advanced=!0),S.omitOnDefault===!0&&(e.omitOnDefault=!0),S.type===`enum`&&(e.values=S.enumValues,S.defaultValue!==void 0&&(e.defaultValue=S.defaultValue)),S.type===`string`&&(S.defaultValue!==void 0&&(e.defaultValue=S.defaultValue),S.language!==void 0&&(e.language=S.language),S.accept!==void 0&&(e.accept=S.accept)),S.type===`boolean`&&S.defaultValue!==void 0&&(e.defaultValue=S.defaultValue),S.type===`number`&&S.defaultValue!==void 0&&(e.defaultValue=S.defaultValue),t.push(e)}return t}function projectFull(e){return{...projectLite(e),example:synthesizeExample(e),params:projectParams(e)}}function renderInventoryFooter(){return[``,"**Custom canonical components.** OK `.md` / `.mdx` supports the JSX components below — use whichever is semantically useful in any part of the doc. For full source syntax + parameter schemas, call `get_components({ ids })` with the ids you want to use. Fenced code blocks render naturally and don't need a fetch — including ` ```mermaid ` for diagrams and ` ```html preview ` for interactive HTML/JS/CSS pages (the fence info-string `preview` token renders the block as a live iframe; works for `html` / `htm` / `xml`; optional `h=` / `w=` tokens set size, e.g. ` ```html preview h=400px `). Use ` ```html preview ` whenever you want anything interactive or JS-powered (charts, demos, calculators, animations) — just author the standalone HTML page in the fence. Call `get_authoring_palette` for the markdown-native component forms (write `> [!NOTE]`, not `<Callout>`), copy-ready themed `html preview` starters, and the theme tokens (`var(--chart-1)`, `var(--foreground)`, …) an embed should reference so it tracks the reader's light/dark theme. Arbitrary `<TagName>` JSX falls through as raw MDX when no canonical fits.",``,...getAgentCanonicalDescriptors().map(projectLite).map(e=>`- \`${e.id}\` (${e.kind}) — ${e.description}`)].join(`
|
|
428
|
-
`)}const AgentWriteRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,content:string$2().optional(),...agentIdentityFields}).loose(),AgentWriteMdRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,markdown:string$2().min(1),position:_enum([`append`,`prepend`,`replace`]).optional(),...agentIdentityFields}).loose(),AgentPatchRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,find:string$2().min(1),replace:string$2(),offset:number$1().int().nonnegative().optional(),...agentIdentityFields}).loose(),AgentUndoRequestSchema=object$1({docName:safeDocNameField,connectionId:string$2().min(1),scope:_enum([`last`,`session`,`file`]).optional(),...agentIdentityFields}).loose(),SummaryResponseFieldSchema=object$1({value:string$2(),truncatedFrom:number$1().int().nonnegative().optional(),hint:string$2().optional()}).loose(),OrphanHintSchema=object$1({type:literal(`orphan`),parentCandidates:array(string$2()),message:string$2()}).loose(),AgentWriteSuccessSchema=object$1({timestamp:string$2().min(1),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentWriteMdSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),hints:array(OrphanHintSchema).optional(),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentPatchSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentUndoSuccessSchema=object$1({docName:string$2().min(1),scope:_enum([`last`,`session`]),undone:boolean$1()}).loose(),FrontmatterPatchRequestSchema=object$1({docName:safeDocNameField,patch:record(string$2(),union([FrontmatterValueSchema,_null()])),types:record(string$2(),_enum(FRONTMATTER_TYPES)).optional(),summary:summaryField,...agentIdentityFields}).loose(),FrontmatterPatchSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),appliedKeys:array(string$2()),summary:SummaryResponseFieldSchema.optional()}).loose(),LifecycleStatusSchema=object$1({status:string$2().min(1),reason:string$2()}).loose(),DocumentReadSuccessSchema=object$1({docName:string$2().min(1),content:string$2(),lifecycle:LifecycleStatusSchema.nullable()}).loose(),DocumentListEntrySchema=object$1({kind:_enum([`document`,`asset`,`folder`]).default(`document`),docName:string$2().min(1).optional(),docExt:string$2().min(1).default(`.md`),size:number$1().int().nonnegative(),modified:string$2().min(1),isSymlink:boolean$1().default(!1),canonicalDocName:string$2().nullable().default(null),targetPath:string$2().nullable().default(null),path:string$2().min(1).optional(),assetExt:string$2().min(1).optional(),mediaKind:_enum([`image`,`video`,`audio`,`pdf`,`text`]).nullable().optional(),referencedBy:array(string$2().min(1)).optional()}).loose().refine(e=>e.kind===`document`?e.docName!==void 0&&e.path===void 0&&e.assetExt===void 0&&e.mediaKind===void 0&&e.referencedBy===void 0:e.kind===`folder`?e.docName===void 0&&e.path!==void 0&&e.assetExt===void 0&&e.mediaKind===void 0&&e.referencedBy===void 0:e.path!==void 0&&e.assetExt!==void 0&&e.referencedBy!==void 0,{message:`document/asset/folder kind must match its required fields (document → docName; asset → path+assetExt+referencedBy; folder → path only, no docName)`}),DocumentListSuccessSchema=object$1({documents:array(DocumentListEntrySchema)}).loose(),BacklinkEntrySchema=object$1({source:string$2().min(1),anchor:string$2().nullable(),title:string$2(),snippet:string$2().nullable()}).loose(),BacklinksSuccessSchema=object$1({docName:string$2().min(1),backlinks:array(BacklinkEntrySchema)}).loose(),BacklinkCountsSuccessSchema=object$1({counts:record(string$2().min(1),number$1().int().nonnegative())}).loose(),ForwardLinkDocEntrySchema=object$1({kind:literal(`doc`),docName:string$2().min(1),anchor:string$2().nullable(),title:string$2(),snippet:string$2().nullable()}).loose(),ForwardLinkExternalEntrySchema=object$1({kind:literal(`external`),url:string$2().min(1),title:string$2(),snippet:string$2().nullable()}).loose(),ForwardLinkEntrySchema=discriminatedUnion(`kind`,[ForwardLinkDocEntrySchema,ForwardLinkExternalEntrySchema]),ForwardLinksSuccessSchema=object$1({docName:string$2().min(1),forwardLinks:array(ForwardLinkEntrySchema)}).loose(),LinkGraphDocNodeSchema=object$1({id:string$2().min(1),kind:literal(`doc`),docName:string$2().min(1),anchor:string$2().nullable(),label:string$2(),cluster:string$2().nullable(),category:string$2().nullable(),tags:array(string$2()).nullable()}).loose(),LinkGraphExternalNodeSchema=object$1({id:string$2().min(1),kind:literal(`external`),url:string$2().min(1),label:string$2()}).loose(),LinkGraphNodeSchema=discriminatedUnion(`kind`,[LinkGraphDocNodeSchema,LinkGraphExternalNodeSchema]),LinkGraphEdgeSchema=object$1({source:string$2().min(1),target:string$2().min(1)}).loose(),LinkGraphSuccessSchema=object$1({nodes:array(LinkGraphNodeSchema),links:array(LinkGraphEdgeSchema)}).loose(),SaveVersionWriterSchema=object$1({id:string$2().min(1),name:string$2().optional(),email:string$2().optional()}).loose(),SaveVersionRequestSchema=object$1({writers:array(SaveVersionWriterSchema).optional(),...agentIdentityFields}).loose(),SaveVersionSuccessSchema=object$1({checkpointRef:string$2().min(1)}).loose(),HistoryShadowContributorSchema=object$1({v:number$1().int().optional(),id:string$2().min(1),name:string$2().min(1),colorSeed:string$2().optional(),docs:array(string$2()),summaries:array(string$2()).optional()}).loose(),HistoryEntrySchema=object$1({sha:string$2().min(1),timestamp:string$2().min(1),author:string$2(),authorEmail:string$2(),type:_enum([`checkpoint`,`wip`,`upstream`,`park`]),message:string$2(),contributors:array(HistoryShadowContributorSchema),checkpoint:unknown$2().nullable()}).loose(),HistorySuccessSchema=object$1({entries:array(HistoryEntrySchema),total:number$1().int().nonnegative().optional(),truncated:boolean$1().optional()}).loose(),HistoryVersionSuccessSchema=object$1({sha:string$2().regex(/^[0-9a-f]{40}$/i),content:string$2(),timestamp:string$2(),author:string$2()}).loose(),DiffLineSchema=object$1({type:_enum([`added`,`removed`,`unchanged`]),text:string$2()}).loose(),DiffSuccessSchema=object$1({lines:array(DiffLineSchema),additions:number$1().int().nonnegative(),deletions:number$1().int().nonnegative()}).loose(),WorkspaceSuccessSchema=object$1({contentDir:string$2().min(1),pathSeparator:_enum([`/`,`\\`]),symlinkResolved:boolean$1()}).loose(),RescueEntryFlatSchema=object$1({docName:string$2().min(1),timestamp:string$2().min(1),size:number$1().int().nonnegative(),source:literal(`flat`)}).loose(),RescueEntryTimelineSchema=object$1({docName:string$2().min(1),timestamp:string$2().min(1),source:literal(`timeline`),sha:string$2().min(1)}).loose(),RescueListSuccessSchema=array(discriminatedUnion(`source`,[RescueEntryFlatSchema,RescueEntryTimelineSchema])).meta({description:"Flat array of rescue buffer entries; discriminated via `source`."}),OrphanEntrySchema=object$1({docName:string$2().min(1),title:string$2()}).loose(),OrphansSuccessSchema=object$1({orphans:array(OrphanEntrySchema)}).loose(),HubEntrySchema=object$1({docName:string$2().min(1),title:string$2(),count:number$1().int().nonnegative()}).loose(),HubsSuccessSchema=object$1({hubs:array(HubEntrySchema)}).loose(),DeadLinkSourceSchema=object$1({source:string$2().min(1),title:string$2(),snippet:string$2().nullable()}).loose(),DeadLinkEntrySchema=object$1({target:string$2().min(1),sources:array(DeadLinkSourceSchema)}).loose(),DeadLinksSuccessSchema=object$1({deadLinks:array(DeadLinkEntrySchema)}).loose(),SuggestLinksTargetSchema=object$1({docName:string$2().min(1),title:string$2(),aliases:array(string$2())}).loose(),SuggestLinksMentionSchema=object$1({source:string$2().min(1),excerpt:string$2(),offset:number$1().int().nonnegative()}).loose(),SuggestLinksSuccessSchema=object$1({target:SuggestLinksTargetSchema,mentions:array(SuggestLinksMentionSchema),truncated:boolean$1()}).loose(),LocalOpOpenRequestSchema=object$1({dir:string$2().min(1)}).loose(),LocalOpOpenSuccessSchema=object$1({port:number$1().int().positive()}).loose(),LocalOpAuthHostRequestSchema=object$1({host:string$2().min(1).optional()}).loose(),LocalOpAuthPatRequestSchema=object$1({pat:string$2().min(1),host:string$2().min(1).optional()}).loose(),LocalOpAuthSetIdentityRequestSchema=object$1({name:string$2().refine(e=>e.trim().length>0,{message:`name must be non-empty`}),email:string$2().refine(e=>e.trim().length>0,{message:`email must be non-empty`})}).loose(),LocalOpAuthIdentitySchema=object$1({name:string$2().min(1),email:string$2().min(1)}).loose().nullable(),LocalOpAuthIdentitySuccessSchema=object$1({identity:LocalOpAuthIdentitySchema}).loose(),LocalOpAuthStatusSuccessSchema=object$1({authenticated:boolean$1()}).loose(),LocalOpAuthPatSuccessSchema=object$1({type:literal(`complete`).optional(),login:string$2().min(1).optional()}).loose(),LocalOpAuthEmptySuccessSchema=object$1({}).loose(),ActivityBurstSchema=object$1({stackIndex:number$1().int().min(0),ts:number$1().int().min(0),additions:number$1().int().min(0),deletions:number$1().int().min(0)}).loose(),ActivityFileSchema=object$1({docName:string$2().min(1),additionsTotal:number$1().int().min(0),deletionsTotal:number$1().int().min(0),lastTs:number$1().int().min(0),bursts:array(ActivityBurstSchema)}).loose(),ActivityAgentHeaderSchema=object$1({displayName:string$2().min(1),color:string$2().min(1),icon:string$2().optional(),connectionId:string$2().min(1)}).loose(),AgentActivitySuccessSchema=object$1({sessionAlive:boolean$1(),agent:ActivityAgentHeaderSchema.nullable(),files:array(ActivityFileSchema)}).loose(),AgentBurstDiffSuccessSchema=object$1({diff:string$2(),generatedAt:number$1().int().min(0)}).loose(),TestResetSuccessSchema=object$1({}).loose(),TestRescanBacklinksSuccessSchema=object$1({}).loose(),TestRescanFilesSuccessSchema=object$1({}).loose(),MetricsReconciliationSuccessSchema=object$1({}).loose(),MetricsParseHealthSuccessSchema=object$1({}).loose(),AgentPresenceEntrySchema=object$1({displayName:string$2().min(1),icon:string$2(),color:string$2().min(1),currentDoc:string$2().nullable(),mode:_enum([`idle`,`writing`]),ts:number$1().int().min(0)}).loose(),MetricsAgentPresenceSuccessSchema=object$1({presence:record(string$2().min(1),AgentPresenceEntrySchema)}).loose(),InstalledAgentsSuccessSchema=record(string$2().min(1),boolean$1()).meta({description:`Flat boolean record keyed by agent-scheme name (claude / codex / cursor). True = installed.`}),SpawnCursorRequestSchema=object$1({path:string$2().min(1,`path must be non-empty`)}).loose(),SpawnCursorSuccessSchema=object$1({}).loose(),RenamedDocMappingSchema=object$1({fromDocName:string$2().min(1),toDocName:string$2().min(1)}).loose(),EmptyRequestSchema=object$1({}).loose(),CreatePageRequestSchema=object$1({path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),CreatePageSuccessSchema=object$1({docName:string$2().min(1)}).loose(),CreateFolderRequestSchema=object$1({path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),CreateFolderSuccessSchema=object$1({path:string$2().min(1)}).loose(),DuplicatePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),DuplicatePathSuccessSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),duplicatedDocNames:array(string$2().min(1))}).loose(),PageEntrySchema=object$1({docName:string$2().min(1),title:string$2(),docExt:string$2().min(1),size:number$1().int().nonnegative(),modified:string$2().min(1),icon:string$2().min(1).max(2048).optional()}).loose(),PagesSuccessSchema=object$1({pages:array(PageEntrySchema)}).loose(),HeadingEntrySchema=object$1({level:number$1().int().min(1).max(6),text:string$2(),slug:string$2()}).loose(),PageHeadingsSuccessSchema=object$1({docName:string$2().min(1),headings:array(HeadingEntrySchema)}).loose(),RenameRequestSchema=object$1({docName:string$2().min(1),newDocName:string$2().min(1),summary:summaryField,...agentIdentityFields}).loose(),RenameRewrittenDocSchema=object$1({docName:string$2().min(1),rewrites:number$1().int().nonnegative()}).loose(),RenameSuccessSchema=object$1({renamed:array(RenamedDocMappingSchema),rewrittenDocs:array(RenameRewrittenDocSchema),summary:SummaryResponseFieldSchema.optional()}).loose(),RenamePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),fromPath:string$2().min(1),toPath:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),RenamePathSuccessSchema=object$1({renamed:array(RenamedDocMappingSchema),rewrittenDocs:array(RenameRewrittenDocSchema).optional(),summary:SummaryResponseFieldSchema.optional()}).loose(),DeletePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields}).loose(),DeletePathSuccessSchema=object$1({deletedDocNames:array(string$2().min(1))}).loose(),TrashCleanupRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),TrashCleanupSuccessSchema=object$1({deletedDocNames:array(string$2().min(1))}).loose(),RollbackRequestSchema=object$1({docName:string$2().min(1),commitSha:string$2().regex(/^[0-9a-f]{40}$/i,{message:`commitSha must be a 40-char git SHA`}),summary:summaryField,...agentIdentityFields}).loose(),RollbackSuccessSchema=object$1({restoredFrom:string$2().min(1),timestamp:string$2().min(1),summary:SummaryResponseFieldSchema.optional()}).loose(),SyncStateSchema=_enum([`dormant`,`idle`,`fetching`,`pulling`,`pushing`,`conflict`,`offline`,`auth-error`,`disabled`]),SyncRemoteSchema=object$1({label:string$2().min(1),webUrl:url().nullable()}).loose(),PushPermissionSchema=discriminatedUnion(`checkStatus`,[object$1({checkStatus:literal(`allowed`)}).loose(),object$1({checkStatus:literal(`denied`),deniedReason:_enum([`no-collaborator`,`private-no-access`,`repo-not-found`])}).loose(),object$1({checkStatus:literal(`unknown`),unknownError:_enum([`network`,`timeout`,`rate-limit`,`token-invalid`,`malformed-response`]).optional()}).loose()]),SyncStatusSchema=object$1({state:SyncStateSchema,lastSyncUtc:string$2().nullable(),lastFetchUtc:string$2().nullable(),lastPushedSha:string$2().nullable(),ahead:number$1().int().min(0),behind:number$1().int().min(0),consecutiveFailures:number$1().int().min(0),conflictCount:number$1().int().min(0),hasRemote:boolean$1(),syncEnabled:boolean$1(),identityUnresolved:boolean$1(),remote:SyncRemoteSchema.nullable().optional(),error:string$2().optional(),errorCode:_enum([`auth-403`,`auth-401`,`auth-scope-mismatch`,`semantic-protected-branch`]).optional(),pausedReason:string$2().optional(),pushPermission:PushPermissionSchema.optional()}).loose(),SyncTriggerRequestSchema=object$1({op:_enum([`sync`,`push`,`pull`]).optional()}).loose(),SyncTriggerSuccessSchema=object$1({op:_enum([`sync`,`push`,`pull`])}).loose(),ConflictEntrySchema=object$1({file:string$2().min(1),detectedAt:string$2().min(1),oursSha:string$2().optional(),theirsSha:string$2().optional(),baseSha:string$2().optional()}).loose(),SyncConflictsSuccessSchema=object$1({conflicts:array(ConflictEntrySchema)}).loose(),SyncResolveConflictRequestSchema=object$1({file:string$2().min(1),strategy:_enum([`mine`,`theirs`,`content`,`delete`]),content:string$2().optional()}).loose().refine(e=>e.strategy!==`content`||e.content!==void 0&&e.content!==``,{message:`content must be a non-empty string when strategy is 'content'`,path:[`content`]}),SyncResolveConflictSuccessSchema=object$1({}).loose(),SyncConflictContentSuccessSchema=object$1({file:string$2().min(1),base:string$2(),ours:string$2(),theirs:string$2(),kind:_enum([`both-modified`,`delete-modify`,`modify-delete`]),lifecycleStatus:string$2().nullable()}).loose(),SyncAbortMergeSuccessSchema=object$1({}).loose(),SeedPlanSuccessSchema=object$1({plan:custom(e=>e!==void 0,{message:`plan is required`})}).loose(),SeedApplyRequestSchema=object$1({plan:custom(e=>e!==void 0,{message:`plan is required`})}).loose(),SeedApplySuccessSchema=object$1({result:custom(e=>e!==void 0,{message:`result is required`})}).loose(),SeedPackFolderInfoSchema=object$1({path:string$2().min(1),summary:string$2().min(1)}).loose(),SeedPackEntryCountsSchema=object$1({files:number$1().int().nonnegative(),folders:number$1().int().nonnegative()}).loose(),SeedPackInfoSchema=object$1({id:string$2().min(1),name:string$2().min(1),description:string$2().min(1),defaultSubfolder:string$2().optional(),folders:array(SeedPackFolderInfoSchema),entryCounts:SeedPackEntryCountsSchema}).loose(),SeedListPacksSuccessSchema=object$1({packs:array(SeedPackInfoSchema)}).loose(),InstallSkillRequestSchema=object$1({noOpen:boolean$1().optional(),out:string$2().min(1).optional()}).loose(),InstallSkillHandoffErrorSchema=object$1({reason:_enum([`unsupported-platform`,`spawn-error`]),message:string$2()}).loose(),InstallSkillSuccessSchema=discriminatedUnion(`status`,[object$1({status:literal(`installed`),outputPath:string$2(),size:number$1().int().nonnegative(),sha256:string$2(),skillVersion:string$2()}).loose(),object$1({status:literal(`built`),outputPath:string$2(),size:number$1().int().nonnegative(),sha256:string$2(),skillVersion:string$2(),handoffError:InstallSkillHandoffErrorSchema.optional()}).loose(),object$1({status:literal(`failed`),buildError:string$2()}).loose(),object$1({status:literal(`skip-current`),skillVersion:string$2(),recordedAt:string$2().optional()}).loose()]),TagSummaryEntrySchema=object$1({name:string$2().min(1),count:number$1().int().nonnegative(),isLeaf:boolean$1()}).loose(),TagsListSuccessSchema=object$1({tags:array(TagSummaryEntrySchema)}).loose(),TagsDocEntrySchema=object$1({docName:string$2().min(1),title:string$2(),matchingTags:array(string$2().min(1)),snippet:string$2().nullable()}).loose(),TagsForNameSuccessSchema=object$1({name:string$2().min(1),docs:array(TagsDocEntrySchema)}).loose(),FolderConfigGetSuccessSchema=object$1({folder:unknown$2(),frontmatter_local:record(string$2(),unknown$2()).nullable()}).loose(),FolderConfigPutRequestSchema=object$1({path:string$2(),frontmatter:record(string$2(),unknown$2()).optional()}).loose(),FolderConfigPutSuccessSchema=object$1({applied:unknown$2()}).loose(),TemplateFrontmatterSchema$1=record(string$2(),unknown$2()).meta({description:`Free-form frontmatter map embedded in template payloads.`}),TemplatePayloadSchema=object$1({name:string$2().min(1),folder:string$2(),scope:_enum([`local`,`inherited`]),path:string$2().min(1),frontmatter:TemplateFrontmatterSchema$1,body:string$2()}).strict(),TemplateGetSuccessSchema=object$1({template:TemplatePayloadSchema}).strict(),TemplatePutRequestSchema=object$1({folder:string$2(),name:string$2(),body:string$2().optional(),frontmatter:TemplateFrontmatterSchema$1.optional()}).strict(),TemplatePutSuccessSchema=object$1({path:string$2().min(1),created:boolean$1(),warnings:array(string$2())}).strict(),TemplateDeleteSuccessSchema=object$1({existed:boolean$1(),path:string$2().min(1)}).strict(),SearchRequestSchema=object$1({query:string$2().optional(),intent:_enum([`autocomplete`,`full_text`,`omnibar`]).optional(),scopes:array(_enum([`page`,`folder`,`content`])).optional(),scope:string$2().optional(),limit:number$1().int().nonnegative().optional()}).loose(),SearchResultEntrySchema=object$1({kind:_enum([`page`,`folder`,`content`]),path:string$2().min(1),title:string$2(),score:number$1(),signals:record(string$2(),unknown$2()),snippet:string$2().optional()}).loose(),SearchSuccessSchema=object$1({query:string$2(),intent:_enum([`autocomplete`,`full_text`,`omnibar`]),results:array(SearchResultEntrySchema),elapsedMs:number$1().nonnegative()}).loose(),SkillInstallTargetStateSchema=object$1({version:string$2().min(1),recordedAt:string$2().min(1)}).loose(),SkillInstallStateSuccessSchema=object$1({currentVersion:string$2().min(1),targets:record(string$2(),SkillInstallTargetStateSchema.nullable())}).loose(),CC1_CHANNEL_SERVER_INFO=`server-info`,CC1_CHANNEL_BRANCH_SWITCHED=`branch-switched`,CC1_CHANNEL_DISK_ACK=`disk-ack`,CC1_CHANNEL_CONFIG_VALIDATION_REJECTED=`config-validation-rejected`,CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR=`config-ignore-nested-error`,DerivedViewChannelSchema=_enum([`files`,`backlinks`,`graph`,`sync-status`,`session-activity`,`tags`]),CC1ServerInfoPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_SERVER_INFO),seq:number$1(),serverInstanceId:string$2().min(1),currentBranch:string$2().min(1).optional()}).loose(),CC1BranchSwitchedPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_BRANCH_SWITCHED),seq:number$1(),branch:string$2().min(1)}).loose(),CC1DerivedViewPayloadSchema=object$1({v:literal(1),ch:DerivedViewChannelSchema,seq:number$1()}).loose(),CC1DiskAckPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_DISK_ACK),seq:number$1(),docName:string$2().min(1),sv:string$2().min(1)}).loose(),CC1ConfigValidationRejectedPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED),seq:number$1(),docName:string$2().min(1),error:ConfigValidationErrorSchema}).loose(),CC1ConfigIgnoreNestedErrorPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR),seq:number$1(),path:string$2().min(1),error:string$2().min(1)}).loose(),WORKSPACE_SEARCH_SCHEMA={id:`string`,kind:`enum`,path:`string`,title:`string`,name:`string`,pathSegments:`string`,content:`string`,modifiedTs:`number`},workspaceSearchIndexes=new WeakMap;function clampLimit(e){return e===void 0||!Number.isFinite(e)?20:Math.max(1,Math.min(100,Math.trunc(e)))}function normalize$2(e){return e.trim().toLowerCase()}function workspaceSearchBasename(e){let t=e.split(`/`).filter(Boolean);return t[t.length-1]??e}function workspaceSearchPathSegments(e){return e.split(`/`).filter(Boolean).join(` `)}function createWorkspaceSearchDocument(e){let t=workspaceSearchBasename(e.path),S=e.title?.trim()||t,w=e.modifiedTs??0;return{id:`${e.kind}:${e.path}`,kind:e.kind,path:e.path,title:S,name:t,pathSegments:workspaceSearchPathSegments(e.path),content:e.content??``,modifiedTs:Number.isFinite(w)?w:0}}function createWorkspaceSearchIndex(e){let t=create$9({schema:WORKSPACE_SEARCH_SCHEMA});return e.length>0&&insertMultiple(t,e),t}function createWorkspaceSearchCorpus(e){let t={documents:e};return workspaceSearchIndexes.set(t,createWorkspaceSearchIndex(e)),t}function getWorkspaceSearchIndex(e){let t=workspaceSearchIndexes.get(e);if(t)return t;let S=createWorkspaceSearchIndex(e.documents);return workspaceSearchIndexes.set(e,S),S}function defaultScopes(e){return e===`autocomplete`?[`page`]:e===`full_text`?[`page`,`content`]:[`page`,`folder`]}function scopeAllows(e,t){return t.has(e.kind)?!0:e.kind===`page`&&t.has(`content`)}function lexicalScore(e,t){let S=normalize$2(t);if(!S)return 0;let w=normalize$2(e.title),E=normalize$2(e.name),D=normalize$2(e.path),O=D.split(`/`);return w===S||E===S?700:D===S?650:w.startsWith(S)||E.startsWith(S)?600:O.some(e=>e.startsWith(S))?550:w.includes(S)||E.includes(S)?500:D.includes(S)?450:-1}function recencyScores(e){let t=e.map(e=>e.modifiedTs).filter(e=>Number.isFinite(e)&&e>0);if(t.length===0)return new Map;let S=1/0,w=-1/0;for(let e of t)e<S&&(S=e),e>w&&(w=e);let E=Math.max(1,w-S);return new Map(e.map(e=>[e.id,e.modifiedTs>0?(e.modifiedTs-S)/E*50:0]))}function searchProperties(e){return e===`full_text`?[`title`,`name`,`path`,`pathSegments`,`content`]:[`title`,`name`,`path`,`pathSegments`]}function searchBoost(e){return e===`full_text`?{title:8,name:7,path:5,pathSegments:4,content:1}:e===`autocomplete`?{title:10,name:9,path:5,pathSegments:4}:{title:8,name:7,path:5,pathSegments:4}}function toleranceFor(e,t){return normalize$2(t).length<4?0:e===`full_text`?1:0}function searchWorkspaceCorpus(e,t,S={}){let w=S.intent??`omnibar`,E=clampLimit(S.limit),D=new Set(S.scopes??defaultScopes(w)),O=e.documents.filter(e=>scopeAllows(e,D)),k=normalize$2(t);if(!k)return O.slice().sort((e,t)=>e.path.localeCompare(t.path)).slice(0,E).map(e=>({document:e,score:0,signals:{lexical:0,fullText:0,recency:0}}));let j=search(getWorkspaceSearchIndex(e),{term:k,properties:searchProperties(w),boost:searchBoost(w),tolerance:toleranceFor(w,k),limit:Math.max(E*4,40)}),F=new Map(j.hits.filter(e=>scopeAllows(e.document,D)).map(e=>[e.document.id,e.score])),L=recencyScores(O),B=new Map;for(let e of O)lexicalScore(e,k)>=0&&B.set(e.id,e);for(let e of j.hits)scopeAllows(e.document,D)&&B.set(e.document.id,e.document);return[...B.values()].map(e=>{let t=Math.max(0,lexicalScore(e,k)),S=F.get(e.id)??0,w=L.get(e.id)??0;return{document:e,score:t+S*20+w,signals:{lexical:t,fullText:S,recency:w}}}).sort((e,t)=>e.score===t.score?e.document.path.localeCompare(t.document.path):t.score-e.score).slice(0,E)}const SHARE_URL_VERSION_V1=1;function encodeShareUrl(e){let t=new TextEncoder().encode(e),S=new Uint8Array(1+t.length);return S[0]=SHARE_URL_VERSION_V1,S.set(t,1),uint8ArrayToBase64Url(S)}function uint8ArrayToBase64Url(e){let t=``;for(let S=0;S<e.length;S++)t+=String.fromCharCode(e[S]);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}const SINGLETON_KEY=Symbol.for(`@inkeep/open-knowledge/skill-state-field-registry`),g=globalThis;g[SINGLETON_KEY]===void 0&&(g[SINGLETON_KEY]=registry$1());const skillStateFieldRegistry=g[SINGLETON_KEY],SKILL_STATE_FILENAME=`skill-state.yml`,SKILL_STATE_REL=[`.ok`,SKILL_STATE_FILENAME],SKILL_STATE_TARGETS=[`claude-cowork`,`cli-hosts`],SKILL_STATE_SURFACES=[`server-build-and-open`,`electron-build-and-open`,`cli-npx-skills-add`,`desktop-direct`,`cli-start`],SKILL_STATE_VERSION_RE=/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/,TargetEntrySchema=looseObject({version:string$2().regex(SKILL_STATE_VERSION_RE,`version must match /^\\d+\\.\\d+\\.\\d+(?:[-+][\\w.-]+)?$/`).register(skillStateFieldRegistry,{description:`Recorded skill version for this target.`}),recordedAt:datetime().register(skillStateFieldRegistry,{description:`ISO 8601 timestamp of the most recent successful write. Updated on every write, including reinstalls of the same version.`}),surface:_enum(SKILL_STATE_SURFACES).register(skillStateFieldRegistry,{description:`Install-source surface that recorded this entry.`}).optional()}),SkillStateSchema=looseObject({schema:literal(1).register(skillStateFieldRegistry,{description:`Schema major version. Bumped only on breaking shape changes.`}),targets:looseObject({"claude-cowork":TargetEntrySchema.optional(),"cli-hosts":TargetEntrySchema.optional()}).register(skillStateFieldRegistry,{description:`Per-target install-state entries. Absent target = no recorded install.`}).default({})});function emptySkillState(){return{schema:1,targets:{}}}function createCodeFenceTracker(){let e=!1,t=``,S=0;return w=>{let E=parseCodeFenceLine(w);return e?(E&&E.char===t&&E.len>=S&&!E.hasInfo&&(e=!1,t=``,S=0),!0):E?(e=!0,t=E.char,S=E.len,!0):!1}}function parseCodeFenceLine(e){let t=(e.endsWith(`\r`)?e.slice(0,-1):e).match(/^ {0,3}([`~])(\1{2,})(.*)$/);return t?{char:t[1],len:1+t[2].length,hasInfo:t[3].trim()!==``}:null}const AGENT_COLORS=[`#D97757`,`#1B1912`,`#F9F3E9`,`#7A9DFF`,`#8534F3`,`#9663F0`,`#727CF3`],AGENT_ICON_COLORS={claude:`#D97757`,cursor:`#1B1912`,windsurf:`#0B100F`,openai:`#7A9DFF`,github:`#8534F3`,cline:`#9663F0`,bot:`#727CF3`};function colorFromSeed(e,t=AGENT_COLORS){let S=0;for(let t of e)S=(S<<5)-S+t.charCodeAt(0)|0;return t[Math.abs(S)%t.length]}const ICON_MAP={"claude-code":`claude`,"claude-ai":`claude`,cursor:`cursor`,"cursor-vscode":`cursor`,cascade:`windsurf`,codex:`openai`,"codex-mcp-client":`openai`,copilot:`github`,cline:`cline`};function iconFromClientName(e){return e?ICON_MAP[e]||(e.startsWith(`local-agent-mode-`)?`claude`:`bot`):`bot`}const BRAND_NAME={claude:`Claude`,cursor:`Cursor`,windsurf:`Windsurf`,openai:`Codex`,github:`Copilot`,cline:`Cline`};function displayNameFromClientName(e){let t=e?.trim();return t?BRAND_NAME[iconFromClientName(t)]??t:`Agent`}function resolveInternalHref(e,t){let S=e.trim();if(!S||/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(S)||S.startsWith(`//`)||S.startsWith(`/`)||S.startsWith(`#`))return null;let w=S.indexOf(`#`),E=w>=0?S.slice(0,w):S,D=w>=0?S.slice(w+1):null,O=(E.split(`?`)[0]??``).trim();if(!O)return null;let k=(O.split(`/`).pop()??``).match(/\.([a-z0-9]+)$/i);if(k){let e=(k[1]??``).toLowerCase();if(e!==`md`&&e!==`mdx`)return null}let j=O.toLowerCase(),F=j.endsWith(`.mdx`)?O.slice(0,-4):j.endsWith(`.md`)?O.slice(0,-3):O,L=t.includes(`/`)?t.split(`/`).slice(0,-1):[];for(let e of F.split(`/`))if(e===`..`){if(L.length===0)return null;L.pop()}else e!==`.`&&e!==``&&L.push(e);return L.length===0?null:{docName:L.join(`/`),anchor:D||null}}const URI_SCHEME_RE=/^[a-zA-Z][a-zA-Z\d+\-.]*:/;function extractAssetExtension(e){let t=(e.split(/[?#]/)[0]??e).match(/\.([a-z0-9]+)$/i);return t?(t[1]??``).toLowerCase():null}function isExternalHref(e){let t=e.trim();return URI_SCHEME_RE.test(t)||t.startsWith(`//`)}function classifyMarkdownHref(e,t){let S=e.trim();if(!S)return null;if(S.startsWith(`#`)){let e=S.slice(1).trim();return e?{kind:`anchor`,anchor:e}:null}let w=resolveInternalHref(S,t);if(w)return{kind:`doc`,docName:w.docName,anchor:w.anchor};if(isExternalHref(S)||S.startsWith(`/`))return{kind:`external`,url:S};let E=extractAssetExtension(S);return E&&E!==`md`&&E!==`mdx`?{kind:`asset`,url:S,ext:E}:null}function classifyWikiLinkTarget(e,t){let S=e.trim();if(!S)return null;if(isExternalHref(S))return{kind:`external`,url:t?`${S}#${t}`:S};let w=extractAssetExtension(S);return w&&w!==`md`&&w!==`mdx`?{kind:`asset`,url:S,ext:w}:{kind:`doc`,docName:S,anchor:t?.trim()||null}}function resolveAssetProjectPath(e,t){let S=e.trim();if(!S||URI_SCHEME_RE.test(S)||S.startsWith(`//`)||S.startsWith(`#`))return null;let w=S.indexOf(`#`),E=((w>=0?S.slice(0,w):S).split(`?`)[0]??``).trim();if(!E)return null;let D=E.startsWith(`/`),O=D?E.slice(1):E,k=D?[]:t.includes(`/`)?t.split(`/`).slice(0,-1):[];for(let e of O.split(`/`))if(e===`..`){if(k.length===0)return null;k.pop()}else e!==`.`&&e!==``&&k.push(e);return k.length===0?null:k.join(`/`)}function normalizePath(e){let t=e;return t.startsWith(`./`)&&(t=t.slice(2)),t.startsWith(`/`)&&(t=t.slice(1)),t}function basenameOf(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}function dirnameOf(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function splitSegments(e){return e.split(`/`).filter(e=>e!==``)}function isInSubtree(e,t){let S=dirnameOf(t);return e===``||S===e?!0:S.startsWith(`${e}/`)}function depthInSubtree(e,t){let S=dirnameOf(t);if(e===S)return 0;let w=e===``?S:S.slice(e.length+1);return w===``?0:splitSegments(w).length}function relativeHops(e,t){let S=splitSegments(e),w=splitSegments(t),E=0;for(;E<S.length&&E<w.length&&S[E]===w[E];)E++;return S.length-E+(w.length-E)}function createBasenameIndex(){let e=new Map;function t(t){let S=normalizePath(t);if(S===``)return;let w=basenameOf(S);if(w===``)return;let E=w.toLowerCase(),D=e.get(E);if(!D){e.set(E,[S]);return}D.includes(S)||D.push(S)}function S(t){let S=normalizePath(t),w=basenameOf(S).toLowerCase(),E=e.get(w);if(!E)return;let D=E.indexOf(S);D!==-1&&(E.splice(D,1),E.length===0&&e.delete(w))}function w(e,w){S(e),t(w)}function E(t,S){let w=t.toLowerCase(),E=e.get(w);if(!E||E.length===0)return null;if(E.length===1)return E[0];let D=dirnameOf(normalizePath(S)),O=[],k=[];for(let e of E)isInSubtree(D,e)?O.push(e):k.push(e);return O.length>0?(e=>{let t=e[0],S=depthInSubtree(D,t);for(let w=1;w<e.length;w++){let E=e[w],O=depthInSubtree(D,E);(O<S||O===S&&E<t)&&(t=E,S=O)}return t})(O):(e=>{let t=e[0],S=relativeHops(D,dirnameOf(t));for(let w=1;w<e.length;w++){let E=e[w],O=relativeHops(D,dirnameOf(E));(O<S||O===S&&E<t)&&(t=E,S=O)}return t})(k)}function D(){let t=new Map;for(let[S,w]of e)t.set(S,[...w]);return t}function O(){e.clear()}return{add:t,remove:S,rename:w,resolveEmbed:E,clear:O,snapshot:D,size:()=>e.size}}const TAG_HIERARCHY_SEPARATOR=`/`;function expandTagToHierarchy(e){if(!e)return[];let t=e.split(TAG_HIERARCHY_SEPARATOR),S=[],w=``;for(let e of t)w=w?`${w}${TAG_HIERARCHY_SEPARATOR}${e}`:e,S.push(w);return S}function tagsMatchingPrefix(e,t){if(e.size===0)return new Set;if(t===``)return new Set(e);let S=new Set,w=`${t}${TAG_HIERARCHY_SEPARATOR}`;for(let E of e)(E===t||E.startsWith(w))&&S.add(E);return S}const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function classifyGitEntry(e,t,S){let w;try{w=statSync(e)}catch(t){let S=t.code;return S===`ENOENT`||S===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:e,cause:t}}let E=computeProjectSubPath(t,S);if(w.isDirectory())return{kind:`directory`,path:e,projectSubPath:E};if(w.isFile()){let S;try{S=readFileSync(e,`utf-8`).trim()}catch(t){return{kind:`malformed-pointer`,gitPath:e,target:``,cause:t}}let w=S.match(/^gitdir:\s*(.+)$/);return w?{kind:`linked`,path:resolve(t,w[1]),gitPath:e,projectSubPath:E}:{kind:`malformed-pointer`,gitPath:e,target:``}}return{kind:`absent`}}function computeProjectSubPath(e,t){let S=relative(e,t);return S===``||S===`.`||S.startsWith(`..`)||isAbsolute(S)?``:S}function findAncestorGitEntry(e){let t=homedir(),S=resolve(e),w=64;for(let e=0;e<64;e++){if(S===t)return null;let e=dirname(S);if(e===S||e===t)return null;let w=resolve(e,`.git`);try{let t=statSync(w);if(t.isDirectory()||t.isFile())return{gitPath:w,workTreeRoot:e}}catch(e){let t=e.code;t!==`ENOENT`&&t!==`ENOTDIR`&&console.warn(`[shadow-repo-layout] Cannot stat ${w} (${t??`unknown`}); skipping ancestor`)}S=e}return null}function resolveGitDirDetailed(e){let t=resolve(e),S=classifyGitEntry(resolve(t,`.git`),t,t);if(S.kind!==`absent`)return S;let w=findAncestorGitEntry(t);return w===null?{kind:`absent`}:classifyGitEntry(w.gitPath,w.workTreeRoot,t)}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,shadowSubdirName(t.projectSubPath));case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(t.gitPath,t.path);return resolve(t.path,shadowSubdirName(t.projectSubPath));case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}function shadowSubdirName(e){return e===``?`ok`:`ok-${slugifyShadowSubPath(e)}`}function slugifyShadowSubPath(e){let t=e.split(sep).join(`-`).replace(/\/+/g,`-`).replace(/[^A-Za-z0-9._-]/g,`_`).replace(/^\.+/,`_`),S=64;if(t.length<=64)return t||`sub`;let w=djb2(e).toString(16).padStart(8,`0`);return`${t.slice(0,55)}-${w}`}function djb2(e){let t=5381;for(let S=0;S<e.length;S++)t=t*33+e.charCodeAt(S)>>>0;return t}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,S){let w=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${w}. Run \`git worktree prune\` from the source repo and try again.`,S),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let S=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${S}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let S of e.split(`
|
|
428
|
+
`)}const AgentWriteRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,content:string$2().optional(),...agentIdentityFields}).loose(),AgentWriteMdRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,markdown:string$2().min(1),position:_enum([`append`,`prepend`,`replace`]).optional(),...agentIdentityFields}).loose(),AgentPatchRequestSchema=object$1({docName:safeDocNameField,summary:summaryField,find:string$2().min(1),replace:string$2(),offset:number$1().int().nonnegative().optional(),...agentIdentityFields}).loose(),AgentUndoRequestSchema=object$1({docName:safeDocNameField,connectionId:string$2().min(1),scope:_enum([`last`,`session`,`file`]).optional(),...agentIdentityFields}).loose(),SummaryResponseFieldSchema=object$1({value:string$2(),truncatedFrom:number$1().int().nonnegative().optional(),hint:string$2().optional()}).loose(),OrphanHintSchema=object$1({type:literal(`orphan`),parentCandidates:array(string$2()),message:string$2()}).loose(),AgentWriteSuccessSchema=object$1({timestamp:string$2().min(1),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentWriteMdSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),hints:array(OrphanHintSchema).optional(),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentPatchSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),summary:SummaryResponseFieldSchema.optional()}).loose(),AgentUndoSuccessSchema=object$1({docName:string$2().min(1),scope:_enum([`last`,`session`]),undone:boolean$1()}).loose(),FrontmatterPatchRequestSchema=object$1({docName:safeDocNameField,patch:record(string$2(),union([FrontmatterValueSchema,_null()])),types:record(string$2(),_enum(FRONTMATTER_TYPES)).optional(),summary:summaryField,...agentIdentityFields}).loose(),FrontmatterPatchSuccessSchema=object$1({timestamp:string$2().min(1),subscriberCount:number$1().int().nonnegative(),systemSubscriberCount:number$1().int().nonnegative(),appliedKeys:array(string$2()),summary:SummaryResponseFieldSchema.optional()}).loose(),LifecycleStatusSchema=object$1({status:string$2().min(1),reason:string$2()}).loose(),DocumentReadSuccessSchema=object$1({docName:string$2().min(1),content:string$2(),lifecycle:LifecycleStatusSchema.nullable()}).loose(),DocumentListEntrySchema=object$1({kind:_enum([`document`,`asset`,`folder`]).default(`document`),docName:string$2().min(1).optional(),docExt:string$2().min(1).default(`.md`),size:number$1().int().nonnegative(),modified:string$2().min(1),isSymlink:boolean$1().default(!1),canonicalDocName:string$2().nullable().default(null),targetPath:string$2().nullable().default(null),path:string$2().min(1).optional(),assetExt:string$2().min(1).optional(),mediaKind:_enum([`image`,`video`,`audio`,`pdf`,`text`]).nullable().optional(),referencedBy:array(string$2().min(1)).optional()}).loose().refine(e=>e.kind===`document`?e.docName!==void 0&&e.path===void 0&&e.assetExt===void 0&&e.mediaKind===void 0&&e.referencedBy===void 0:e.kind===`folder`?e.docName===void 0&&e.path!==void 0&&e.assetExt===void 0&&e.mediaKind===void 0&&e.referencedBy===void 0:e.path!==void 0&&e.assetExt!==void 0&&e.referencedBy!==void 0,{message:`document/asset/folder kind must match its required fields (document → docName; asset → path+assetExt+referencedBy; folder → path only, no docName)`}),DocumentListSuccessSchema=object$1({documents:array(DocumentListEntrySchema)}).loose(),BacklinkEntrySchema=object$1({source:string$2().min(1),anchor:string$2().nullable(),title:string$2(),snippet:string$2().nullable()}).loose(),BacklinksSuccessSchema=object$1({docName:string$2().min(1),backlinks:array(BacklinkEntrySchema)}).loose(),BacklinkCountsSuccessSchema=object$1({counts:record(string$2().min(1),number$1().int().nonnegative())}).loose(),ForwardLinkDocEntrySchema=object$1({kind:literal(`doc`),docName:string$2().min(1),anchor:string$2().nullable(),title:string$2(),snippet:string$2().nullable()}).loose(),ForwardLinkExternalEntrySchema=object$1({kind:literal(`external`),url:string$2().min(1),title:string$2(),snippet:string$2().nullable()}).loose(),ForwardLinkEntrySchema=discriminatedUnion(`kind`,[ForwardLinkDocEntrySchema,ForwardLinkExternalEntrySchema]),ForwardLinksSuccessSchema=object$1({docName:string$2().min(1),forwardLinks:array(ForwardLinkEntrySchema)}).loose(),LinkGraphDocNodeSchema=object$1({id:string$2().min(1),kind:literal(`doc`),docName:string$2().min(1),anchor:string$2().nullable(),label:string$2(),cluster:string$2().nullable(),category:string$2().nullable(),tags:array(string$2()).nullable()}).loose(),LinkGraphExternalNodeSchema=object$1({id:string$2().min(1),kind:literal(`external`),url:string$2().min(1),label:string$2()}).loose(),LinkGraphNodeSchema=discriminatedUnion(`kind`,[LinkGraphDocNodeSchema,LinkGraphExternalNodeSchema]),LinkGraphEdgeSchema=object$1({source:string$2().min(1),target:string$2().min(1)}).loose(),LinkGraphSuccessSchema=object$1({nodes:array(LinkGraphNodeSchema),links:array(LinkGraphEdgeSchema)}).loose(),SaveVersionWriterSchema=object$1({id:string$2().min(1),name:string$2().optional(),email:string$2().optional()}).loose(),SaveVersionRequestSchema=object$1({writers:array(SaveVersionWriterSchema).optional(),...agentIdentityFields}).loose(),SaveVersionSuccessSchema=object$1({checkpointRef:string$2().min(1)}).loose(),HistoryShadowContributorSchema=object$1({v:number$1().int().optional(),id:string$2().min(1),name:string$2().min(1),colorSeed:string$2().optional(),docs:array(string$2()),summaries:array(string$2()).optional()}).loose(),HistoryEntrySchema=object$1({sha:string$2().min(1),timestamp:string$2().min(1),author:string$2(),authorEmail:string$2(),type:_enum([`checkpoint`,`wip`,`upstream`,`park`]),message:string$2(),contributors:array(HistoryShadowContributorSchema),checkpoint:unknown$2().nullable()}).loose(),HistorySuccessSchema=object$1({entries:array(HistoryEntrySchema),total:number$1().int().nonnegative().optional(),truncated:boolean$1().optional()}).loose(),HistoryVersionSuccessSchema=object$1({sha:string$2().regex(/^[0-9a-f]{40}$/i),content:string$2(),timestamp:string$2(),author:string$2()}).loose(),DiffLineSchema=object$1({type:_enum([`added`,`removed`,`unchanged`]),text:string$2()}).loose(),DiffSuccessSchema=object$1({lines:array(DiffLineSchema),additions:number$1().int().nonnegative(),deletions:number$1().int().nonnegative()}).loose(),WorkspaceSuccessSchema=object$1({contentDir:string$2().min(1),pathSeparator:_enum([`/`,`\\`]),symlinkResolved:boolean$1()}).loose(),RescueEntryFlatSchema=object$1({docName:string$2().min(1),timestamp:string$2().min(1),size:number$1().int().nonnegative(),source:literal(`flat`)}).loose(),RescueEntryTimelineSchema=object$1({docName:string$2().min(1),timestamp:string$2().min(1),source:literal(`timeline`),sha:string$2().min(1)}).loose(),RescueListSuccessSchema=array(discriminatedUnion(`source`,[RescueEntryFlatSchema,RescueEntryTimelineSchema])).meta({description:"Flat array of rescue buffer entries; discriminated via `source`."}),OrphanEntrySchema=object$1({docName:string$2().min(1),title:string$2()}).loose(),OrphansSuccessSchema=object$1({orphans:array(OrphanEntrySchema)}).loose(),HubEntrySchema=object$1({docName:string$2().min(1),title:string$2(),count:number$1().int().nonnegative()}).loose(),HubsSuccessSchema=object$1({hubs:array(HubEntrySchema)}).loose(),DeadLinkSourceSchema=object$1({source:string$2().min(1),title:string$2(),snippet:string$2().nullable()}).loose(),DeadLinkEntrySchema=object$1({target:string$2().min(1),sources:array(DeadLinkSourceSchema)}).loose(),DeadLinksSuccessSchema=object$1({deadLinks:array(DeadLinkEntrySchema)}).loose(),SuggestLinksTargetSchema=object$1({docName:string$2().min(1),title:string$2(),aliases:array(string$2())}).loose(),SuggestLinksMentionSchema=object$1({source:string$2().min(1),excerpt:string$2(),offset:number$1().int().nonnegative()}).loose(),SuggestLinksSuccessSchema=object$1({target:SuggestLinksTargetSchema,mentions:array(SuggestLinksMentionSchema),truncated:boolean$1()}).loose(),LocalOpOpenRequestSchema=object$1({dir:string$2().min(1)}).loose(),LocalOpOpenSuccessSchema=object$1({port:number$1().int().positive()}).loose(),LocalOpAuthHostRequestSchema=object$1({host:string$2().min(1).optional()}).loose(),LocalOpAuthPatRequestSchema=object$1({pat:string$2().min(1),host:string$2().min(1).optional()}).loose(),LocalOpAuthSetIdentityRequestSchema=object$1({name:string$2().refine(e=>e.trim().length>0,{message:`name must be non-empty`}),email:string$2().refine(e=>e.trim().length>0,{message:`email must be non-empty`})}).loose(),LocalOpAuthIdentitySchema=object$1({name:string$2().min(1),email:string$2().min(1)}).loose().nullable(),LocalOpAuthIdentitySuccessSchema=object$1({identity:LocalOpAuthIdentitySchema}).loose(),LocalOpAuthStatusSuccessSchema=object$1({authenticated:boolean$1()}).loose(),LocalOpAuthPatSuccessSchema=object$1({type:literal(`complete`).optional(),login:string$2().min(1).optional()}).loose(),LocalOpAuthEmptySuccessSchema=object$1({}).loose(),ActivityBurstSchema=object$1({stackIndex:number$1().int().min(0),ts:number$1().int().min(0),additions:number$1().int().min(0),deletions:number$1().int().min(0)}).loose(),ActivityFileSchema=object$1({docName:string$2().min(1),additionsTotal:number$1().int().min(0),deletionsTotal:number$1().int().min(0),lastTs:number$1().int().min(0),bursts:array(ActivityBurstSchema)}).loose(),ActivityAgentHeaderSchema=object$1({displayName:string$2().min(1),color:string$2().min(1),icon:string$2().optional(),connectionId:string$2().min(1)}).loose(),AgentActivitySuccessSchema=object$1({sessionAlive:boolean$1(),agent:ActivityAgentHeaderSchema.nullable(),files:array(ActivityFileSchema)}).loose(),AgentBurstDiffSuccessSchema=object$1({diff:string$2(),generatedAt:number$1().int().min(0)}).loose(),TestResetSuccessSchema=object$1({}).loose(),TestRescanBacklinksSuccessSchema=object$1({}).loose(),TestRescanFilesSuccessSchema=object$1({}).loose(),MetricsReconciliationSuccessSchema=object$1({}).loose(),MetricsParseHealthSuccessSchema=object$1({}).loose(),AgentPresenceEntrySchema=object$1({displayName:string$2().min(1),icon:string$2(),color:string$2().min(1),currentDoc:string$2().nullable(),mode:_enum([`idle`,`writing`]),ts:number$1().int().min(0)}).loose(),MetricsAgentPresenceSuccessSchema=object$1({presence:record(string$2().min(1),AgentPresenceEntrySchema)}).loose(),InstalledAgentsSuccessSchema=record(string$2().min(1),boolean$1()).meta({description:`Flat boolean record keyed by agent-scheme name (claude / codex / cursor). True = installed.`}),SpawnCursorRequestSchema=object$1({path:string$2().min(1,`path must be non-empty`)}).loose(),SpawnCursorSuccessSchema=object$1({}).loose(),RenamedDocMappingSchema=object$1({fromDocName:string$2().min(1),toDocName:string$2().min(1)}).loose(),EmptyRequestSchema=object$1({}).loose(),CreatePageRequestSchema=object$1({path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),CreatePageSuccessSchema=object$1({docName:string$2().min(1)}).loose(),CreateFolderRequestSchema=object$1({path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),CreateFolderSuccessSchema=object$1({path:string$2().min(1)}).loose(),DuplicatePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),DuplicatePathSuccessSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),duplicatedDocNames:array(string$2().min(1))}).loose(),PageEntrySchema=object$1({docName:string$2().min(1),title:string$2(),docExt:string$2().min(1),size:number$1().int().nonnegative(),modified:string$2().min(1),icon:string$2().min(1).max(2048).optional()}).loose(),PagesSuccessSchema=object$1({pages:array(PageEntrySchema)}).loose(),HeadingEntrySchema=object$1({level:number$1().int().min(1).max(6),text:string$2(),slug:string$2()}).loose(),PageHeadingsSuccessSchema=object$1({docName:string$2().min(1),headings:array(HeadingEntrySchema)}).loose(),RenameRequestSchema=object$1({docName:string$2().min(1),newDocName:string$2().min(1),summary:summaryField,...agentIdentityFields}).loose(),RenameRewrittenDocSchema=object$1({docName:string$2().min(1),rewrites:number$1().int().nonnegative()}).loose(),RenameSuccessSchema=object$1({renamed:array(RenamedDocMappingSchema),rewrittenDocs:array(RenameRewrittenDocSchema),summary:SummaryResponseFieldSchema.optional()}).loose(),RenamePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),fromPath:string$2().min(1),toPath:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),RenamePathSuccessSchema=object$1({renamed:array(RenamedDocMappingSchema),rewrittenDocs:array(RenameRewrittenDocSchema).optional(),summary:SummaryResponseFieldSchema.optional()}).loose(),DeletePathRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields}).loose(),DeletePathSuccessSchema=object$1({deletedDocNames:array(string$2().min(1))}).loose(),TrashCleanupRequestSchema=object$1({kind:_enum([`file`,`folder`]),path:string$2().min(1),...agentIdentityFields,summary:summaryField}).loose(),TrashCleanupSuccessSchema=object$1({deletedDocNames:array(string$2().min(1))}).loose(),RollbackRequestSchema=object$1({docName:string$2().min(1),commitSha:string$2().regex(/^[0-9a-f]{40}$/i,{message:`commitSha must be a 40-char git SHA`}),summary:summaryField,...agentIdentityFields}).loose(),RollbackSuccessSchema=object$1({restoredFrom:string$2().min(1),timestamp:string$2().min(1),summary:SummaryResponseFieldSchema.optional()}).loose(),SyncStateSchema=_enum([`dormant`,`idle`,`fetching`,`pulling`,`pushing`,`conflict`,`offline`,`auth-error`,`disabled`]),SyncRemoteSchema=object$1({label:string$2().min(1),webUrl:url().nullable()}).loose(),PushPermissionSchema=discriminatedUnion(`checkStatus`,[object$1({checkStatus:literal(`allowed`)}).loose(),object$1({checkStatus:literal(`denied`),deniedReason:_enum([`no-collaborator`,`private-no-access`,`repo-not-found`])}).loose(),object$1({checkStatus:literal(`unknown`),unknownError:_enum([`network`,`timeout`,`rate-limit`,`token-invalid`,`malformed-response`]).optional()}).loose()]),SyncStatusSchema=object$1({state:SyncStateSchema,lastSyncUtc:string$2().nullable(),lastFetchUtc:string$2().nullable(),lastPushedSha:string$2().nullable(),ahead:number$1().int().min(0),behind:number$1().int().min(0),consecutiveFailures:number$1().int().min(0),conflictCount:number$1().int().min(0),hasRemote:boolean$1(),syncEnabled:boolean$1(),identityUnresolved:boolean$1(),remote:SyncRemoteSchema.nullable().optional(),error:string$2().optional(),errorCode:_enum([`auth-403`,`auth-401`,`auth-scope-mismatch`,`semantic-protected-branch`]).optional(),pausedReason:string$2().optional(),pushPermission:PushPermissionSchema.optional()}).loose(),SyncTriggerRequestSchema=object$1({op:_enum([`sync`,`push`,`pull`]).optional()}).loose(),SyncTriggerSuccessSchema=object$1({op:_enum([`sync`,`push`,`pull`])}).loose(),ConflictEntrySchema=object$1({file:string$2().min(1),detectedAt:string$2().min(1),oursSha:string$2().optional(),theirsSha:string$2().optional(),baseSha:string$2().optional()}).loose(),SyncConflictsSuccessSchema=object$1({conflicts:array(ConflictEntrySchema)}).loose(),SyncResolveConflictRequestSchema=object$1({file:string$2().min(1),strategy:_enum([`mine`,`theirs`,`content`,`delete`]),content:string$2().optional()}).loose().refine(e=>e.strategy!==`content`||e.content!==void 0&&e.content!==``,{message:`content must be a non-empty string when strategy is 'content'`,path:[`content`]}),SyncResolveConflictSuccessSchema=object$1({}).loose(),SyncConflictContentSuccessSchema=object$1({file:string$2().min(1),base:string$2(),ours:string$2(),theirs:string$2(),kind:_enum([`both-modified`,`delete-modify`,`modify-delete`]),lifecycleStatus:string$2().nullable()}).loose(),SyncAbortMergeSuccessSchema=object$1({}).loose(),SeedPlanSuccessSchema=object$1({plan:custom(e=>e!==void 0,{message:`plan is required`})}).loose(),SeedApplyRequestSchema=object$1({plan:custom(e=>e!==void 0,{message:`plan is required`})}).loose(),SeedApplySuccessSchema=object$1({result:custom(e=>e!==void 0,{message:`result is required`})}).loose(),SeedPackFolderInfoSchema=object$1({path:string$2().min(1),summary:string$2().min(1)}).loose(),SeedPackEntryCountsSchema=object$1({files:number$1().int().nonnegative(),folders:number$1().int().nonnegative()}).loose(),SeedPackInfoSchema=object$1({id:string$2().min(1),name:string$2().min(1),description:string$2().min(1),defaultSubfolder:string$2().optional(),folders:array(SeedPackFolderInfoSchema),entryCounts:SeedPackEntryCountsSchema}).loose(),SeedListPacksSuccessSchema=object$1({packs:array(SeedPackInfoSchema)}).loose(),InstallSkillRequestSchema=object$1({noOpen:boolean$1().optional(),out:string$2().min(1).optional()}).loose(),InstallSkillHandoffErrorSchema=object$1({reason:_enum([`unsupported-platform`,`spawn-error`]),message:string$2()}).loose(),InstallSkillSuccessSchema=discriminatedUnion(`status`,[object$1({status:literal(`installed`),outputPath:string$2(),size:number$1().int().nonnegative(),sha256:string$2(),skillVersion:string$2()}).loose(),object$1({status:literal(`built`),outputPath:string$2(),size:number$1().int().nonnegative(),sha256:string$2(),skillVersion:string$2(),handoffError:InstallSkillHandoffErrorSchema.optional()}).loose(),object$1({status:literal(`failed`),buildError:string$2()}).loose(),object$1({status:literal(`skip-current`),skillVersion:string$2(),recordedAt:string$2().optional()}).loose()]),TagSummaryEntrySchema=object$1({name:string$2().min(1),count:number$1().int().nonnegative(),isLeaf:boolean$1()}).loose(),TagsListSuccessSchema=object$1({tags:array(TagSummaryEntrySchema)}).loose(),TagsDocEntrySchema=object$1({docName:string$2().min(1),title:string$2(),matchingTags:array(string$2().min(1)),snippet:string$2().nullable()}).loose(),TagsForNameSuccessSchema=object$1({name:string$2().min(1),docs:array(TagsDocEntrySchema)}).loose(),FolderConfigGetSuccessSchema=object$1({folder:unknown$2(),frontmatter_local:record(string$2(),unknown$2()).nullable(),frontmatter_sources:record(string$2(),string$2()).optional(),schema_declarations:record(string$2(),unknown$2()).optional(),schema_sources:record(string$2(),string$2()).optional(),schema_local:record(string$2(),unknown$2()).nullable()}).loose(),FolderConfigPutRequestSchema=object$1({path:string$2(),frontmatter:record(string$2(),unknown$2()).optional(),declarations:record(string$2(),unknown$2()).optional()}).loose(),FolderConfigPutSuccessSchema=object$1({applied:unknown$2()}).loose(),TemplateFrontmatterSchema$1=record(string$2(),unknown$2()).meta({description:`Free-form frontmatter map embedded in template payloads.`}),TemplatePayloadSchema=object$1({name:string$2().min(1),folder:string$2(),scope:_enum([`local`,`inherited`]),path:string$2().min(1),frontmatter:TemplateFrontmatterSchema$1,body:string$2()}).strict(),TemplateGetSuccessSchema=object$1({template:TemplatePayloadSchema}).strict(),TemplatePutRequestSchema=object$1({folder:string$2(),name:string$2(),body:string$2().optional(),frontmatter:TemplateFrontmatterSchema$1.optional()}).strict(),TemplatePutSuccessSchema=object$1({path:string$2().min(1),created:boolean$1(),warnings:array(string$2())}).strict(),TemplateDeleteSuccessSchema=object$1({existed:boolean$1(),path:string$2().min(1)}).strict(),SearchRequestSchema=object$1({query:string$2().optional(),intent:_enum([`autocomplete`,`full_text`,`omnibar`]).optional(),scopes:array(_enum([`page`,`folder`,`content`])).optional(),scope:string$2().optional(),limit:number$1().int().nonnegative().optional()}).loose(),SearchResultEntrySchema=object$1({kind:_enum([`page`,`folder`,`content`]),path:string$2().min(1),title:string$2(),score:number$1(),signals:record(string$2(),unknown$2()),snippet:string$2().optional()}).loose(),SearchSuccessSchema=object$1({query:string$2(),intent:_enum([`autocomplete`,`full_text`,`omnibar`]),results:array(SearchResultEntrySchema),elapsedMs:number$1().nonnegative()}).loose(),SkillInstallTargetStateSchema=object$1({version:string$2().min(1),recordedAt:string$2().min(1)}).loose(),SkillInstallStateSuccessSchema=object$1({currentVersion:string$2().min(1),targets:record(string$2(),SkillInstallTargetStateSchema.nullable())}).loose(),CC1_CHANNEL_SERVER_INFO=`server-info`,CC1_CHANNEL_BRANCH_SWITCHED=`branch-switched`,CC1_CHANNEL_DISK_ACK=`disk-ack`,CC1_CHANNEL_CONFIG_VALIDATION_REJECTED=`config-validation-rejected`,CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR=`config-ignore-nested-error`,DerivedViewChannelSchema=_enum([`files`,`backlinks`,`graph`,`sync-status`,`session-activity`,`tags`]),CC1ServerInfoPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_SERVER_INFO),seq:number$1(),serverInstanceId:string$2().min(1),currentBranch:string$2().min(1).optional()}).loose(),CC1BranchSwitchedPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_BRANCH_SWITCHED),seq:number$1(),branch:string$2().min(1)}).loose(),CC1DerivedViewPayloadSchema=object$1({v:literal(1),ch:DerivedViewChannelSchema,seq:number$1()}).loose(),CC1DiskAckPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_DISK_ACK),seq:number$1(),docName:string$2().min(1),sv:string$2().min(1)}).loose(),CC1ConfigValidationRejectedPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_CONFIG_VALIDATION_REJECTED),seq:number$1(),docName:string$2().min(1),error:ConfigValidationErrorSchema}).loose(),CC1ConfigIgnoreNestedErrorPayloadSchema=object$1({v:literal(1),ch:literal(CC1_CHANNEL_CONFIG_IGNORE_NESTED_ERROR),seq:number$1(),path:string$2().min(1),error:string$2().min(1)}).loose(),WORKSPACE_SEARCH_SCHEMA={id:`string`,kind:`enum`,path:`string`,title:`string`,name:`string`,pathSegments:`string`,content:`string`,modifiedTs:`number`},workspaceSearchIndexes=new WeakMap;function clampLimit(e){return e===void 0||!Number.isFinite(e)?20:Math.max(1,Math.min(100,Math.trunc(e)))}function normalize$2(e){return e.trim().toLowerCase()}function workspaceSearchBasename(e){let t=e.split(`/`).filter(Boolean);return t[t.length-1]??e}function workspaceSearchPathSegments(e){return e.split(`/`).filter(Boolean).join(` `)}function createWorkspaceSearchDocument(e){let t=workspaceSearchBasename(e.path),S=e.title?.trim()||t,w=e.modifiedTs??0;return{id:`${e.kind}:${e.path}`,kind:e.kind,path:e.path,title:S,name:t,pathSegments:workspaceSearchPathSegments(e.path),content:e.content??``,modifiedTs:Number.isFinite(w)?w:0}}function createWorkspaceSearchIndex(e){let t=create$9({schema:WORKSPACE_SEARCH_SCHEMA});return e.length>0&&insertMultiple(t,e),t}function createWorkspaceSearchCorpus(e){let t={documents:e};return workspaceSearchIndexes.set(t,createWorkspaceSearchIndex(e)),t}function getWorkspaceSearchIndex(e){let t=workspaceSearchIndexes.get(e);if(t)return t;let S=createWorkspaceSearchIndex(e.documents);return workspaceSearchIndexes.set(e,S),S}function defaultScopes(e){return e===`autocomplete`?[`page`]:e===`full_text`?[`page`,`content`]:[`page`,`folder`]}function scopeAllows(e,t){return t.has(e.kind)?!0:e.kind===`page`&&t.has(`content`)}function lexicalScore(e,t){let S=normalize$2(t);if(!S)return 0;let w=normalize$2(e.title),E=normalize$2(e.name),D=normalize$2(e.path),O=D.split(`/`);return w===S||E===S?700:D===S?650:w.startsWith(S)||E.startsWith(S)?600:O.some(e=>e.startsWith(S))?550:w.includes(S)||E.includes(S)?500:D.includes(S)?450:-1}function recencyScores(e){let t=e.map(e=>e.modifiedTs).filter(e=>Number.isFinite(e)&&e>0);if(t.length===0)return new Map;let S=1/0,w=-1/0;for(let e of t)e<S&&(S=e),e>w&&(w=e);let E=Math.max(1,w-S);return new Map(e.map(e=>[e.id,e.modifiedTs>0?(e.modifiedTs-S)/E*50:0]))}function searchProperties(e){return e===`full_text`?[`title`,`name`,`path`,`pathSegments`,`content`]:[`title`,`name`,`path`,`pathSegments`]}function searchBoost(e){return e===`full_text`?{title:8,name:7,path:5,pathSegments:4,content:1}:e===`autocomplete`?{title:10,name:9,path:5,pathSegments:4}:{title:8,name:7,path:5,pathSegments:4}}function toleranceFor(e,t){return normalize$2(t).length<4?0:e===`full_text`?1:0}function searchWorkspaceCorpus(e,t,S={}){let w=S.intent??`omnibar`,E=clampLimit(S.limit),D=new Set(S.scopes??defaultScopes(w)),O=e.documents.filter(e=>scopeAllows(e,D)),k=normalize$2(t);if(!k)return O.slice().sort((e,t)=>e.path.localeCompare(t.path)).slice(0,E).map(e=>({document:e,score:0,signals:{lexical:0,fullText:0,recency:0}}));let j=search(getWorkspaceSearchIndex(e),{term:k,properties:searchProperties(w),boost:searchBoost(w),tolerance:toleranceFor(w,k),limit:Math.max(E*4,40)}),F=new Map(j.hits.filter(e=>scopeAllows(e.document,D)).map(e=>[e.document.id,e.score])),L=recencyScores(O),B=new Map;for(let e of O)lexicalScore(e,k)>=0&&B.set(e.id,e);for(let e of j.hits)scopeAllows(e.document,D)&&B.set(e.document.id,e.document);return[...B.values()].map(e=>{let t=Math.max(0,lexicalScore(e,k)),S=F.get(e.id)??0,w=L.get(e.id)??0;return{document:e,score:t+S*20+w,signals:{lexical:t,fullText:S,recency:w}}}).sort((e,t)=>e.score===t.score?e.document.path.localeCompare(t.document.path):t.score-e.score).slice(0,E)}const SHARE_URL_VERSION_V1=1;function encodeShareUrl(e){let t=new TextEncoder().encode(e),S=new Uint8Array(1+t.length);return S[0]=SHARE_URL_VERSION_V1,S.set(t,1),uint8ArrayToBase64Url(S)}function uint8ArrayToBase64Url(e){let t=``;for(let S=0;S<e.length;S++)t+=String.fromCharCode(e[S]);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}const SINGLETON_KEY=Symbol.for(`@inkeep/open-knowledge/skill-state-field-registry`),g=globalThis;g[SINGLETON_KEY]===void 0&&(g[SINGLETON_KEY]=registry$1());const skillStateFieldRegistry=g[SINGLETON_KEY],SKILL_STATE_FILENAME=`skill-state.yml`,SKILL_STATE_REL=[`.ok`,SKILL_STATE_FILENAME],SKILL_STATE_TARGETS=[`claude-cowork`,`cli-hosts`],SKILL_STATE_SURFACES=[`server-build-and-open`,`electron-build-and-open`,`cli-npx-skills-add`,`desktop-direct`,`cli-start`],SKILL_STATE_VERSION_RE=/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/,TargetEntrySchema=looseObject({version:string$2().regex(SKILL_STATE_VERSION_RE,`version must match /^\\d+\\.\\d+\\.\\d+(?:[-+][\\w.-]+)?$/`).register(skillStateFieldRegistry,{description:`Recorded skill version for this target.`}),recordedAt:datetime().register(skillStateFieldRegistry,{description:`ISO 8601 timestamp of the most recent successful write. Updated on every write, including reinstalls of the same version.`}),surface:_enum(SKILL_STATE_SURFACES).register(skillStateFieldRegistry,{description:`Install-source surface that recorded this entry.`}).optional()}),SkillStateSchema=looseObject({schema:literal(1).register(skillStateFieldRegistry,{description:`Schema major version. Bumped only on breaking shape changes.`}),targets:looseObject({"claude-cowork":TargetEntrySchema.optional(),"cli-hosts":TargetEntrySchema.optional()}).register(skillStateFieldRegistry,{description:`Per-target install-state entries. Absent target = no recorded install.`}).default({})});function emptySkillState(){return{schema:1,targets:{}}}function createCodeFenceTracker(){let e=!1,t=``,S=0;return w=>{let E=parseCodeFenceLine(w);return e?(E&&E.char===t&&E.len>=S&&!E.hasInfo&&(e=!1,t=``,S=0),!0):E?(e=!0,t=E.char,S=E.len,!0):!1}}function parseCodeFenceLine(e){let t=(e.endsWith(`\r`)?e.slice(0,-1):e).match(/^ {0,3}([`~])(\1{2,})(.*)$/);return t?{char:t[1],len:1+t[2].length,hasInfo:t[3].trim()!==``}:null}const AGENT_COLORS=[`#D97757`,`#1B1912`,`#F9F3E9`,`#7A9DFF`,`#8534F3`,`#9663F0`,`#727CF3`],AGENT_ICON_COLORS={claude:`#D97757`,cursor:`#1B1912`,windsurf:`#0B100F`,openai:`#7A9DFF`,github:`#8534F3`,cline:`#9663F0`,bot:`#727CF3`};function colorFromSeed(e,t=AGENT_COLORS){let S=0;for(let t of e)S=(S<<5)-S+t.charCodeAt(0)|0;return t[Math.abs(S)%t.length]}const ICON_MAP={"claude-code":`claude`,"claude-ai":`claude`,cursor:`cursor`,"cursor-vscode":`cursor`,cascade:`windsurf`,codex:`openai`,"codex-mcp-client":`openai`,copilot:`github`,cline:`cline`};function iconFromClientName(e){return e?ICON_MAP[e]||(e.startsWith(`local-agent-mode-`)?`claude`:`bot`):`bot`}const BRAND_NAME={claude:`Claude`,cursor:`Cursor`,windsurf:`Windsurf`,openai:`Codex`,github:`Copilot`,cline:`Cline`};function displayNameFromClientName(e){let t=e?.trim();return t?BRAND_NAME[iconFromClientName(t)]??t:`Agent`}function resolveInternalHref(e,t){let S=e.trim();if(!S||/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(S)||S.startsWith(`//`)||S.startsWith(`/`)||S.startsWith(`#`))return null;let w=S.indexOf(`#`),E=w>=0?S.slice(0,w):S,D=w>=0?S.slice(w+1):null,O=(E.split(`?`)[0]??``).trim();if(!O)return null;let k=(O.split(`/`).pop()??``).match(/\.([a-z0-9]+)$/i);if(k){let e=(k[1]??``).toLowerCase();if(e!==`md`&&e!==`mdx`)return null}let j=O.toLowerCase(),F=j.endsWith(`.mdx`)?O.slice(0,-4):j.endsWith(`.md`)?O.slice(0,-3):O,L=t.includes(`/`)?t.split(`/`).slice(0,-1):[];for(let e of F.split(`/`))if(e===`..`){if(L.length===0)return null;L.pop()}else e!==`.`&&e!==``&&L.push(e);return L.length===0?null:{docName:L.join(`/`),anchor:D||null}}const URI_SCHEME_RE=/^[a-zA-Z][a-zA-Z\d+\-.]*:/;function extractAssetExtension(e){let t=(e.split(/[?#]/)[0]??e).match(/\.([a-z0-9]+)$/i);return t?(t[1]??``).toLowerCase():null}function isExternalHref(e){let t=e.trim();return URI_SCHEME_RE.test(t)||t.startsWith(`//`)}function classifyMarkdownHref(e,t){let S=e.trim();if(!S)return null;if(S.startsWith(`#`)){let e=S.slice(1).trim();return e?{kind:`anchor`,anchor:e}:null}let w=resolveInternalHref(S,t);if(w)return{kind:`doc`,docName:w.docName,anchor:w.anchor};if(isExternalHref(S)||S.startsWith(`/`))return{kind:`external`,url:S};let E=extractAssetExtension(S);return E&&E!==`md`&&E!==`mdx`?{kind:`asset`,url:S,ext:E}:null}function classifyWikiLinkTarget(e,t){let S=e.trim();if(!S)return null;if(isExternalHref(S))return{kind:`external`,url:t?`${S}#${t}`:S};let w=extractAssetExtension(S);return w&&w!==`md`&&w!==`mdx`?{kind:`asset`,url:S,ext:w}:{kind:`doc`,docName:S,anchor:t?.trim()||null}}function resolveAssetProjectPath(e,t){let S=e.trim();if(!S||URI_SCHEME_RE.test(S)||S.startsWith(`//`)||S.startsWith(`#`))return null;let w=S.indexOf(`#`),E=((w>=0?S.slice(0,w):S).split(`?`)[0]??``).trim();if(!E)return null;let D=E.startsWith(`/`),O=D?E.slice(1):E,k=D?[]:t.includes(`/`)?t.split(`/`).slice(0,-1):[];for(let e of O.split(`/`))if(e===`..`){if(k.length===0)return null;k.pop()}else e!==`.`&&e!==``&&k.push(e);return k.length===0?null:k.join(`/`)}function normalizePath(e){let t=e;return t.startsWith(`./`)&&(t=t.slice(2)),t.startsWith(`/`)&&(t=t.slice(1)),t}function basenameOf(e){let t=e.lastIndexOf(`/`);return t===-1?e:e.slice(t+1)}function dirnameOf(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}function splitSegments(e){return e.split(`/`).filter(e=>e!==``)}function isInSubtree(e,t){let S=dirnameOf(t);return e===``||S===e?!0:S.startsWith(`${e}/`)}function depthInSubtree(e,t){let S=dirnameOf(t);if(e===S)return 0;let w=e===``?S:S.slice(e.length+1);return w===``?0:splitSegments(w).length}function relativeHops(e,t){let S=splitSegments(e),w=splitSegments(t),E=0;for(;E<S.length&&E<w.length&&S[E]===w[E];)E++;return S.length-E+(w.length-E)}function createBasenameIndex(){let e=new Map;function t(t){let S=normalizePath(t);if(S===``)return;let w=basenameOf(S);if(w===``)return;let E=w.toLowerCase(),D=e.get(E);if(!D){e.set(E,[S]);return}D.includes(S)||D.push(S)}function S(t){let S=normalizePath(t),w=basenameOf(S).toLowerCase(),E=e.get(w);if(!E)return;let D=E.indexOf(S);D!==-1&&(E.splice(D,1),E.length===0&&e.delete(w))}function w(e,w){S(e),t(w)}function E(t,S){let w=t.toLowerCase(),E=e.get(w);if(!E||E.length===0)return null;if(E.length===1)return E[0];let D=dirnameOf(normalizePath(S)),O=[],k=[];for(let e of E)isInSubtree(D,e)?O.push(e):k.push(e);return O.length>0?(e=>{let t=e[0],S=depthInSubtree(D,t);for(let w=1;w<e.length;w++){let E=e[w],O=depthInSubtree(D,E);(O<S||O===S&&E<t)&&(t=E,S=O)}return t})(O):(e=>{let t=e[0],S=relativeHops(D,dirnameOf(t));for(let w=1;w<e.length;w++){let E=e[w],O=relativeHops(D,dirnameOf(E));(O<S||O===S&&E<t)&&(t=E,S=O)}return t})(k)}function D(){let t=new Map;for(let[S,w]of e)t.set(S,[...w]);return t}function O(){e.clear()}return{add:t,remove:S,rename:w,resolveEmbed:E,clear:O,snapshot:D,size:()=>e.size}}const TAG_HIERARCHY_SEPARATOR=`/`;function expandTagToHierarchy(e){if(!e)return[];let t=e.split(TAG_HIERARCHY_SEPARATOR),S=[],w=``;for(let e of t)w=w?`${w}${TAG_HIERARCHY_SEPARATOR}${e}`:e,S.push(w);return S}function tagsMatchingPrefix(e,t){if(e.size===0)return new Set;if(t===``)return new Set(e);let S=new Set,w=`${t}${TAG_HIERARCHY_SEPARATOR}`;for(let E of e)(E===t||E.startsWith(w))&&S.add(E);return S}const WRITER_ID_RE=/^(agent-[^/]+|principal-[^/]+|file-system|git-upstream|openknowledge-service)$/;function classifyGitEntry(e,t,S){let w;try{w=statSync(e)}catch(t){let S=t.code;return S===`ENOENT`||S===`ENOTDIR`?{kind:`absent`}:{kind:`inaccessible`,gitPath:e,cause:t}}let E=computeProjectSubPath(t,S);if(w.isDirectory())return{kind:`directory`,path:e,projectSubPath:E};if(w.isFile()){let S;try{S=readFileSync(e,`utf-8`).trim()}catch(t){return{kind:`malformed-pointer`,gitPath:e,target:``,cause:t}}let w=S.match(/^gitdir:\s*(.+)$/);return w?{kind:`linked`,path:resolve(t,w[1]),gitPath:e,projectSubPath:E}:{kind:`malformed-pointer`,gitPath:e,target:``}}return{kind:`absent`}}function computeProjectSubPath(e,t){let S=relative(e,t);return S===``||S===`.`||S.startsWith(`..`)||isAbsolute(S)?``:S}function findAncestorGitEntry(e){let t=homedir(),S=resolve(e),w=64;for(let e=0;e<64;e++){if(S===t)return null;let e=dirname(S);if(e===S||e===t)return null;let w=resolve(e,`.git`);try{let t=statSync(w);if(t.isDirectory()||t.isFile())return{gitPath:w,workTreeRoot:e}}catch(e){let t=e.code;t!==`ENOENT`&&t!==`ENOTDIR`&&console.warn(`[shadow-repo-layout] Cannot stat ${w} (${t??`unknown`}); skipping ancestor`)}S=e}return null}function resolveGitDirDetailed(e){let t=resolve(e),S=classifyGitEntry(resolve(t,`.git`),t,t);if(S.kind!==`absent`)return S;let w=findAncestorGitEntry(t);return w===null?{kind:`absent`}:classifyGitEntry(w.gitPath,w.workTreeRoot,t)}function resolveGitDir(e){let t=resolveGitDirDetailed(e);return t.kind===`directory`||t.kind===`linked`?t.path:null}function resolveShadowDir(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return resolve(t.path,shadowSubdirName(t.projectSubPath));case`linked`:if(!existsSync(t.path))throw new MalformedGitPointerError(t.gitPath,t.path);return resolve(t.path,shadowSubdirName(t.projectSubPath));case`malformed-pointer`:throw new MalformedGitPointerError(t.gitPath,t.target,{cause:t.cause});case`inaccessible`:throw new GitDirAccessError(t.gitPath,{cause:t.cause});case`absent`:return resolve(e,`.git/ok`)}}function shadowSubdirName(e){return e===``?`ok`:`ok-${slugifyShadowSubPath(e)}`}function slugifyShadowSubPath(e){let t=e.split(sep).join(`-`).replace(/\/+/g,`-`).replace(/[^A-Za-z0-9._-]/g,`_`).replace(/^\.+/,`_`),S=64;if(t.length<=64)return t||`sub`;let w=djb2(e).toString(16).padStart(8,`0`);return`${t.slice(0,55)}-${w}`}function djb2(e){let t=5381;for(let S=0;S<e.length;S++)t=t*33+e.charCodeAt(S)>>>0;return t}var MalformedGitPointerError=class extends Error{gitPointerPath;resolvedTarget;constructor(e,t,S){let w=t?`references a missing or unreadable gitdir at ${t}`:`is unreadable or has no valid gitdir: pointer`;super(`\`.git\` pointer at ${e} ${w}. Run \`git worktree prune\` from the source repo and try again.`,S),this.name=`MalformedGitPointerError`,this.gitPointerPath=e,this.resolvedTarget=t}},GitDirAccessError=class extends Error{gitPath;constructor(e,t){let S=t?.cause!==void 0&&t.cause!==null&&typeof t.cause==`object`&&`code`in t.cause&&typeof t.cause.code==`string`?` (${t.cause.code})`:``;super(`Cannot access \`.git\` at ${e}${S}. Check filesystem permissions and that the volume is mounted.`,t),this.name=`GitDirAccessError`,this.gitPath=e}};function getShadowRepoPath(e){let t;try{t=resolveShadowDir(e)}catch(e){if(e instanceof MalformedGitPointerError||e instanceof GitDirAccessError)return null;throw e}return existsSync(resolve(t,`HEAD`))?t:null}function getWipRefPattern(e){return`refs/wip/${e}/`}const OK_CONTRIBUTORS_PREFIX=`ok-contributors: `;function parseContributors(e){if(!e)return[];let t=[];for(let S of e.split(`
|
|
429
429
|
`)){let e=S.trim();if(e.startsWith(OK_CONTRIBUTORS_PREFIX))try{let S=JSON.parse(e.slice(17));if(typeof S==`object`&&S&&`id`in S&&typeof S.id==`string`&&`name`in S&&typeof S.name==`string`&&`docs`in S&&Array.isArray(S.docs)&&S.docs.every(e=>typeof e==`string`)&&(!(`colorSeed`in S)||typeof S.colorSeed==`string`)){let e=S;if(`summaries`in e){let t=e.summaries;(!Array.isArray(t)||!t.every(e=>typeof e==`string`))&&delete e.summaries}t.push(S)}}catch{}}return t}const OK_CHECKPOINT_PREFIX=`ok-checkpoint-v1: `;function parseCheckpoint(e){if(!e)return null;for(let t of e.split(`
|
|
430
430
|
`)){let e=t.trim();if(!e.startsWith(OK_CHECKPOINT_PREFIX))continue;let S;try{S=JSON.parse(e.slice(18))}catch{return null}if(typeof S!=`object`||!S)return null;let w=S,E=w.kind,D=w.metadata;if(typeof D!=`object`||!D)return null;let O=typeof w.docName==`string`?w.docName:null,k=typeof w.size==`number`&&Number.isFinite(w.size)?w.size:null;if(E===`bridge-merge-loss`){let e=D;return Array.isArray(e.lostSubstrings)&&e.lostSubstrings.every(e=>typeof e==`string`)?{kind:`bridge-merge-loss`,docName:O,size:k,metadata:{lostSubstrings:e.lostSubstrings}}:null}if(E===`external-change-rescue`){let e=D;return typeof e.incomingDiskSha==`string`?{kind:`external-change-rescue`,docName:O,size:k,metadata:{incomingDiskSha:e.incomingDiskSha}}:null}return null}return null}function formatCheckpointBodyLine(e){let t={kind:e.kind,metadata:e.metadata};return e.docName!==null&&(t.docName=e.docName),e.size!==null&&(t.size=e.size),`${OK_CHECKPOINT_PREFIX}${JSON.stringify(t)}`}const OK_ACTOR_PREFIX=`ok-actor: `;function formatOkActor(e){let{summaries:t,previous_paths:S,...w}=e,E={...w};return t&&t.length>0&&(E.summaries=t),S&&S.length>0&&(E.previous_paths=S),`${OK_ACTOR_PREFIX}${JSON.stringify(E)}`}function parseOkActorObject(e){if(e.v!==1||!(`display_name`in e)||typeof e.display_name!=`string`||!(`docs`in e)||!Array.isArray(e.docs))return null;let t=typeof e.principal==`string`?e.principal:null,S=typeof e.agent_session==`string`?e.agent_session:null,w;if(typeof e.writer_id==`string`&&e.writer_id.length>0)w=e.writer_id;else if(S)w=`agent-${S}`;else if(t)w=t;else switch(e.display_name){case`File System`:w=`file-system`;break;case`Git (upstream)`:w=`git-upstream`;break;default:w=`openknowledge-service`}let E=`summaries`in e&&Array.isArray(e.summaries)&&e.summaries.every(e=>typeof e==`string`)?e.summaries:void 0,D=parsePreviousPaths(e);return{v:1,writer_id:w,principal:t,agent_session:S,agent_type:typeof e.agent_type==`string`?e.agent_type:null,client_name:typeof e.client_name==`string`?e.client_name:null,client_version:typeof e.client_version==`string`?e.client_version:null,label:typeof e.label==`string`?e.label:null,display_name:e.display_name,color_seed:typeof e.color_seed==`string`?e.color_seed:`unknown`,docs:e.docs.filter(e=>typeof e==`string`),...E&&E.length>0?{summaries:E}:{},...D&&D.length>0?{previous_paths:D}:{}}}function parsePreviousPaths(e){if(!(`previous_paths`in e)||!Array.isArray(e.previous_paths))return;let t=[];for(let S of e.previous_paths){if(typeof S!=`object`||!S)continue;let e=S;typeof e.from!=`string`||typeof e.to!=`string`||t.push({from:e.from,to:e.to})}return t}function parseOkActors(e){if(!e)return[];let t=[];for(let S of e.split(`
|
|
431
431
|
`)){let e=S.trim();if(!e.startsWith(OK_ACTOR_PREFIX))continue;let w;try{w=JSON.parse(e.slice(10))}catch{continue}if(typeof w!=`object`||!w)continue;let E=parseOkActorObject(w);E&&t.push(E)}return t}function okActorToShadowContributor(e){let t={v:1,id:e.writer_id,name:e.display_name,colorSeed:e.color_seed,docs:e.docs};return e.summaries&&e.summaries.length>0&&(t.summaries=e.summaries),t}function readContributors(e){let t=parseOkActors(e);return t.length>0?t.map(okActorToShadowContributor):parseContributors(e)}function formatWipSubject(e){return e.length===0?`wip: auto-save`:e.length===1?`wip: ${e[0]}`:`wip: ${e.length} docs`}function formatReconcileSubject(e){return`reconcile: ${e}`}function formatRollbackSubject(e,t){return`rollback: ${e} to ${t.slice(0,7)}`}function formatParkSubject(e,t){return`park: ${e} -> ${t}`}function formatRenameSubject(e,t){return`rename: ${e} -> ${t}`}function formatCheckpointSubject(e){return`checkpoint: ${e}`}function formatImportSubject(e,t){return e?`import: from ${e.slice(0,8)}..${t.slice(0,8)}`:`import: initial at ${t.slice(0,8)}`}const SUBJECT_LINE_BREAK_RE=RegExp(`[\\r\\n\\v\\f\\u0085\\u2028\\u2029]`,`g`);function stripLineBreaks(e){return e.replace(SUBJECT_LINE_BREAK_RE,` `)}function composeCommitSubject(e,t){let S=stripLineBreaks(e);if(t.length===0)return S;if(t.length>=2)return`${S} (${t.length} edits)`;let[w]=t;if(w===void 0)return S;let E=stripLineBreaks(w),D=`${S} — ${E}`;if(D.length<=72)return D;let O=`${S} — `,k=72-O.length-1;return k<=0?D.slice(0,72):`${O}${E.slice(0,k)}…`}function parseWriterId(e){return WRITER_ID_RE.test(e)?e.startsWith(`agent-`)?{id:e,classification:`agent`,isAgent:!0}:e.startsWith(`principal-`)?{id:e,classification:`principal`,isAgent:!1}:e===`file-system`?{id:e,classification:`classified-file-system`,isAgent:null}:e===`git-upstream`?{id:e,classification:`classified-git-upstream`,isAgent:null}:e===`openknowledge-service`?{id:e,classification:`classified-openknowledge-service`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}:{id:e,classification:`unknown`,isAgent:null}}var require_err_helpers=__commonJSMin$1(((e,t)=>{let S=e=>e&&typeof e.message==`string`,w=e=>{if(!e)return;let t=e.cause;if(typeof t==`function`){let t=e.cause();return S(t)?t:void 0}else return S(t)?t:void 0},E=(e,t)=>{if(!S(e))return``;let D=e.stack||``;if(t.has(e))return D+`
|
|
@@ -1243,9 +1243,9 @@ Open Knowledge accretes a persistent wiki through three workflow tools, mapped t
|
|
|
1243
1243
|
|
|
1244
1244
|
Karpathy's insight: "The tedious part of maintaining a knowledge base is not the reading or the thinking — it's the bookkeeping." Humans abandon wikis because maintenance costs exceed perceived value. These tools exist so an agent can do the bookkeeping (fetching, summarizing, cross-linking, superseding) without fatigue. Follow the steps below faithfully — skipping the cross-linking, supersedes chains, or raw-source preservation is what turns a useful wiki back into an abandoned one.
|
|
1245
1245
|
|
|
1246
|
-
`}function buildWorkflowHandler(e,t,S,w){return async E=>{let D=typeof E.cwd==`string`?E.cwd:void 0,O=await resolveProjectConfigContext(t.resolveCwd,t.config,D);if(!O.ok)return textResult(`Error: ${O.error}`,!0);let k=E[S],j=typeof k==`string`?k:``;return textPlusStructured(`${buildWorkflowFrame(e)}${w(j,O.config.content.dir)}`,{previewUrl:null})}}async function resolveServerUrl(e,t){return typeof e==`function`?await e(t):e}async function resolveConfig(e,t){return typeof e==`function`?await e(t):e}async function resolveProjectConfigContext(e,t,S){let w;try{w=await e(S)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}try{let e=await resolveConfig(t,w);return{ok:!0,cwd:w,config:e}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}async function resolveProjectServerContext(e,t,S,w){let E=await resolveProjectConfigContext(e,t,w);if(!E.ok)return E;let{cwd:D,config:O}=E;try{return{ok:!0,cwd:D,config:O,url:await resolveServerUrl(S,D)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function normalizeDocName(e){let t=e.toLowerCase();return t.endsWith(`.md`)?{ok:!0,docName:e.slice(0,-3)}:t.endsWith(`.mdx`)?{ok:!0,docName:e.slice(0,-4)}:t.endsWith(`.markdown`)?{ok:!1,error:`Error: docName "${e}" ends in ".markdown", which is not a supported extension. Use ".md" or ".mdx", or strip the extension to let the server auto-detect.`}:{ok:!0,docName:e}}function normalizeResponse(e,t){if(e.ok){if(typeof t!=`object`||!t||Array.isArray(t))return{ok:!0,data:t};let{ok:e,...S}=t;return{ok:!0,...S}}if(typeof t!=`object`||!t||Array.isArray(t))return{ok:!1,error:`Server returned HTTP ${e.status} with non-object body`};let S=t;if(typeof S.type==`string`&&typeof S.title==`string`){let{type:e,title:t,status:w,instance:E,detail:D,...O}=S;return{...O,ok:!1,error:t,type:e,...typeof w==`number`?{status:w}:{},...typeof E==`string`?{instance:E}:{},...typeof D==`string`?{detail:D}:{}}}let{ok:w,error:E,...D}=S,O=typeof E==`string`?E:typeof S.message==`string`?S.message:`Server returned HTTP ${e.status}`;return{...D,ok:!1,error:O}}async function httpGet(e,t){let S;try{S=await fetch(`${e}${t}`,{signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}let w;try{w=await S.json()}catch(e){let t=e instanceof Error?e.message:String(e);return S.ok?{ok:!1,error:`Server returned 2xx response with non-JSON body: ${t}`}:{ok:!1,error:`Server returned HTTP ${S.status} with non-JSON body: ${t}`}}return normalizeResponse(S,w)}async function httpPost(e,t,S){let w;if(S!==void 0)try{w=JSON.stringify(S)}catch(e){return{ok:!1,error:`Request body is not JSON-serializable: ${e instanceof Error?e.message:String(e)}`}}let E;try{E=await fetch(`${e}${t}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:w,signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}let D;try{D=await E.json()}catch(e){let t=e instanceof Error?e.message:String(e);return E.ok?{ok:!1,error:`Server returned 2xx response with non-JSON body: ${t}`}:{ok:!1,error:`Server returned HTTP ${E.status} with non-JSON body: ${t}`}}return normalizeResponse(E,D)}function parseRenameCollidingPairs(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{existing:t,incoming:S,to:w}=e;return typeof t==`string`&&typeof S==`string`&&typeof w==`string`?[{existing:t,incoming:S,to:w}]:[]}):[]}function mergeCascade(e,t){let S={...e},w=new Map;for(let[e,E]of Object.entries(t))if(E!==void 0)if(Array.isArray(E)){let t=Array.isArray(S[e])?[...S[e]]:[],D=w.get(e)??new Set(t.map(toDedupKey));w.set(e,D);for(let e of E){let S=toDedupKey(e);D.has(S)||(D.add(S),t.push(e))}S[e]=t}else S[e]=E;return S}function mergePatch(e,t){let S={...e};for(let[e,w]of Object.entries(t))if(w!==void 0){if(isEmpty$1(w)){delete S[e];continue}S[e]=w}return S}function isEmpty$1(e){return
|
|
1246
|
+
`}function buildWorkflowHandler(e,t,S,w){return async E=>{let D=typeof E.cwd==`string`?E.cwd:void 0,O=await resolveProjectConfigContext(t.resolveCwd,t.config,D);if(!O.ok)return textResult(`Error: ${O.error}`,!0);let k=E[S],j=typeof k==`string`?k:``;return textPlusStructured(`${buildWorkflowFrame(e)}${w(j,O.config.content.dir)}`,{previewUrl:null})}}async function resolveServerUrl(e,t){return typeof e==`function`?await e(t):e}async function resolveConfig(e,t){return typeof e==`function`?await e(t):e}async function resolveProjectConfigContext(e,t,S){let w;try{w=await e(S)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}try{let e=await resolveConfig(t,w);return{ok:!0,cwd:w,config:e}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}async function resolveProjectServerContext(e,t,S,w){let E=await resolveProjectConfigContext(e,t,w);if(!E.ok)return E;let{cwd:D,config:O}=E;try{return{ok:!0,cwd:D,config:O,url:await resolveServerUrl(S,D)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}}function normalizeDocName(e){let t=e.toLowerCase();return t.endsWith(`.md`)?{ok:!0,docName:e.slice(0,-3)}:t.endsWith(`.mdx`)?{ok:!0,docName:e.slice(0,-4)}:t.endsWith(`.markdown`)?{ok:!1,error:`Error: docName "${e}" ends in ".markdown", which is not a supported extension. Use ".md" or ".mdx", or strip the extension to let the server auto-detect.`}:{ok:!0,docName:e}}function normalizeResponse(e,t){if(e.ok){if(typeof t!=`object`||!t||Array.isArray(t))return{ok:!0,data:t};let{ok:e,...S}=t;return{ok:!0,...S}}if(typeof t!=`object`||!t||Array.isArray(t))return{ok:!1,error:`Server returned HTTP ${e.status} with non-object body`};let S=t;if(typeof S.type==`string`&&typeof S.title==`string`){let{type:e,title:t,status:w,instance:E,detail:D,...O}=S;return{...O,ok:!1,error:t,type:e,...typeof w==`number`?{status:w}:{},...typeof E==`string`?{instance:E}:{},...typeof D==`string`?{detail:D}:{}}}let{ok:w,error:E,...D}=S,O=typeof E==`string`?E:typeof S.message==`string`?S.message:`Server returned HTTP ${e.status}`;return{...D,ok:!1,error:O}}async function httpGet(e,t){let S;try{S=await fetch(`${e}${t}`,{signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}let w;try{w=await S.json()}catch(e){let t=e instanceof Error?e.message:String(e);return S.ok?{ok:!1,error:`Server returned 2xx response with non-JSON body: ${t}`}:{ok:!1,error:`Server returned HTTP ${S.status} with non-JSON body: ${t}`}}return normalizeResponse(S,w)}async function httpPost(e,t,S){let w;if(S!==void 0)try{w=JSON.stringify(S)}catch(e){return{ok:!1,error:`Request body is not JSON-serializable: ${e instanceof Error?e.message:String(e)}`}}let E;try{E=await fetch(`${e}${t}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:w,signal:AbortSignal.timeout(3e4)})}catch(e){return{ok:!1,error:`Server unreachable: ${e instanceof Error?e.message:e}`}}let D;try{D=await E.json()}catch(e){let t=e instanceof Error?e.message:String(e);return E.ok?{ok:!1,error:`Server returned 2xx response with non-JSON body: ${t}`}:{ok:!1,error:`Server returned HTTP ${E.status} with non-JSON body: ${t}`}}return normalizeResponse(E,D)}function parseRenameCollidingPairs(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let{existing:t,incoming:S,to:w}=e;return typeof t==`string`&&typeof S==`string`&&typeof w==`string`?[{existing:t,incoming:S,to:w}]:[]}):[]}function mergeCascade(e,t){let S={...e},w=new Map;for(let[e,E]of Object.entries(t))if(E!==void 0)if(Array.isArray(E)){let t=Array.isArray(S[e])?[...S[e]]:[],D=w.get(e)??new Set(t.map(toDedupKey));w.set(e,D);for(let e of E){let S=toDedupKey(e);D.has(S)||(D.add(S),t.push(e))}S[e]=t}else S[e]=E;return S}function mergePatch(e,t){let S={...e};for(let[e,w]of Object.entries(t))if(w!==void 0){if(isEmpty$1(w)){delete S[e];continue}S[e]=w}return S}function mergeDeclarations(e,t){return{...e,...t}}function isEmpty$1(e){return isFrontmatterValueEmpty(e)}function toDedupKey(e){return typeof e==`string`?`s:${e}`:typeof e==`number`?`n:${e}`:typeof e==`boolean`?`b:${e}`:e===null?`null`:e===void 0?`undefined`:`j:${JSON.stringify(e)}`}function resolveNestedFrontmatterWithSources(e,t){let S=t.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``),w=S===``||S===`.`?[]:S.split(`/`).filter(e=>e.length>0),E={},D={},O={},k={},j=!1;for(let t=0;t<=w.length;t++){let S=t===0?``:w.slice(0,t).join(`/`),F=t===0?resolve(e,`.ok`):resolve(e,S,`.ok`),L=resolve(F,`frontmatter.yml`);if(existsSync(L)){let e=readFrontmatterYaml(L);if(e!=null){E=mergeCascade(E,e);for(let t of Object.keys(e))e[t]!==void 0&&(D[t]=S);j=!0}}let B=resolve(F,`schema.yml`);if(existsSync(B)){let e=readFolderSchemaYaml(B);if(e!=null&&Object.keys(e).length>0){O=mergeDeclarations(O,e);for(let t of Object.keys(e))k[t]=S;j=!0}}}return j?{merged:coerceWellKnown(E),sources:D,declarations:O,declarationSources:k}:{merged:{},sources:{},declarations:{},declarationSources:{}}}function coerceWellKnown(e){let t={};for(let[S,w]of Object.entries(e))t[S]=w;return typeof e.title==`string`?t.title=e.title:delete t.title,typeof e.description==`string`?t.description=e.description:delete t.description,Array.isArray(e.tags)?t.tags=e.tags.filter(e=>typeof e==`string`):delete t.tags,t}const warnedPaths=new Set;function readFolderSchemaYaml(e){let t;try{t=readFileSync(e,`utf-8`)}catch{return null}let S;try{S=(0,import_dist$1.parse)(t)}catch(t){if(!warnedPaths.has(e)){warnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-folder-schema] malformed YAML at ${e} — folder declarations skipped. Fix the file or delete it. Reason: ${S}`)}return null}if(S==null)return warnedPaths.delete(e),{};let w=FolderSchemaSchema.safeParse(S);return w.success?(warnedPaths.delete(e),w.data.declarations):(warnedPaths.has(e)||(warnedPaths.add(e),console.warn(`[ok-folder-schema] invalid shape at ${e} — folder declarations skipped. ${w.error.message}`)),null)}function readFrontmatterYaml(e){let t;try{t=readFileSync(e,`utf-8`)}catch{return null}let S;try{S=(0,import_dist$1.parse)(t)}catch(t){if(!warnedPaths.has(e)){warnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-folder-frontmatter] malformed YAML at ${e} — folder defaults skipped. Fix the file or delete it. Reason: ${S}`)}return null}return typeof S!=`object`||!S||Array.isArray(S)?null:(warnedPaths.delete(e),S)}function parentFolderOf(e){let t=e.lastIndexOf(`/`);return t===-1?``:e.slice(0,t)}const GIT_TIMEOUT_MS$2=5e3;function projectHasGitDir(e){try{return statSync(resolve(e,`.git`)).isDirectory()}catch{return!1}}function openProjectGit(e){return esm_default({baseDir:resolve(e),timeout:{block:GIT_TIMEOUT_MS$2}})}async function readProjectGitLog(e,t,S=5){if(!projectHasGitDir(e))return{commits:[],source:`git-absent`};let w=openProjectGit(e),E=``;try{E=await w.raw(`log`,`-${Math.max(1,S)}`,`--format=%H|%aI|%an|%s`,`--follow`,`--`,t)}catch{return{commits:[],source:`git`}}let D=[];for(let e of E.split(`
|
|
1247
1247
|
`)){if(!e)continue;let t=e.indexOf(`|`);if(t<0)continue;let S=e.indexOf(`|`,t+1);if(S<0)continue;let w=e.indexOf(`|`,S+1);w<0||D.push({hash:e.slice(0,t),date:e.slice(t+1,S),authorName:e.slice(S+1,w),subject:e.slice(w+1)})}return{commits:D,source:`git`}}const GIT_TIMEOUT_MS$1=5e3;async function currentProjectBranch(e){try{let t=(await esm_default({baseDir:e,timeout:{block:GIT_TIMEOUT_MS$1}}).revparse([`--abbrev-ref`,`HEAD`])).trim();return t&&t!==`HEAD`?t:null}catch{return null}}function openShadowGit(e,t){return esm_default({baseDir:t,timeout:{block:GIT_TIMEOUT_MS$1}}).env({GIT_DIR:e,GIT_WORK_TREE:t})}function writerIdFromRef(e,t){let S=getWipRefPattern(t);return e.startsWith(S)?e.slice(S.length):e}async function logOnRef(e,t,S,w,E){let D=``;try{D=await e.raw(`log`,t,`-${Math.max(1,E*2)}`,`--format=%H%x00%aI%x00%an%x00%s%x00%B%x1e`,`--`,S)}catch{return[]}let O=writerIdFromRef(t,w),k=parseWriterId(O),j=[];for(let e of D.split(``)){let t=e.trimStart();if(!t)continue;let[S=``,E=``,D=``,F=``,L=``]=t.split(`\0`),B=S.trim();B.length===40&&j.push({hash:B,date:E,writerName:D,message:F,contributors:readContributors(L),writerId:O,isAgent:k.isAgent,writerClassification:k.classification,branch:w})}return j}async function readShadowLog(e,t,S=5){let w=getShadowRepoPath(e);if(!w)return{commits:[],source:`shadow-repo-absent`};let E=await currentProjectBranch(e);if(!E)return{commits:[],source:`shadow-repo`};let D=openShadowGit(w,resolve(e)),O=``;try{O=await D.raw(`for-each-ref`,getWipRefPattern(E),`--format=%(refname)`)}catch{return{commits:[],source:`shadow-repo`}}let k=O.split(`
|
|
1248
|
-
`).map(e=>e.trim()).filter(Boolean);return k.length===0?{commits:[],source:`shadow-repo`}:{commits:(await Promise.all(k.map(e=>logOnRef(D,e,t,E,S)))).flat().sort((e,t)=>t.date.localeCompare(e.date)).slice(0,S),source:`shadow-repo`}}function resolveTemplatesAvailable(e,t,S={}){let w=normalizeFolderPath(t),E=w===``?[]:w.split(`/`),D=new Set,O=[];collectFromFolder(e,w,`local`,D,O);for(let t=E.length-1;t>=1;t--)collectFromFolder(e,E.slice(0,t).join(`/`),`inherited`,D,O);return E.length>0&&collectFromFolder(e,``,`inherited`,D,O),O}function collectFromFolder(e,t,S,w,E){let D=t?join(e,t,`.ok`,`templates`):join(e,`.ok`,`templates`);if(!existsSync(D))return;let O;try{O=readdirSync(D)}catch{return}for(let e of O){if(!e.endsWith(`.md`))continue;let O=e.slice(0,-3);if(w.has(O))continue;let k=join(D,e),j;try{j=statSync(k)}catch{continue}if(!j.isFile())continue;let F=readTemplateMeta(k),L={name:O,path:t?posix.join(t,`.ok`,`templates`,e):posix.join(`.ok`,`templates`,e),source_folder:t,scope:S};F.title!==void 0&&(L.title=F.title),F.description!==void 0&&(L.description=F.description),w.add(O),E.push(L)}}function normalizeFolderPath(e){return e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``).replace(/^\.$/,``)}const templateMetaWarnedPaths=new Set;function readTemplateMeta(e){let t;try{t=readFileSync(e,`utf-8`)}catch(t){if(t?.code!==`ENOENT`&&!templateMetaWarnedPaths.has(e)){templateMetaWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-templates] failed to read template at ${e} — metadata skipped. Reason: ${S}`)}return{}}let S=extractFrontmatterYaml(t);if(S===null)return{};let w;try{w=(0,import_dist$1.parse)(S)}catch(t){if(!templateMetaWarnedPaths.has(e)){templateMetaWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-templates] malformed YAML frontmatter at ${e} — title/description unavailable. Reason: ${S}`)}return{}}if(typeof w!=`object`||!w)return{};let E=w,D={};return typeof E.title==`string`&&(D.title=E.title),typeof E.description==`string`&&(D.description=E.description),D}function extractFrontmatterYaml(e){let t=e.replace(/^/,``),S=/^[ \t]*---\r?\n([\s\S]*?)\r?\n[ \t]*---(\r?\n|$)/.exec(t);return S?S[1]??null:null}const FRONTMATTER_RE=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;function parseFrontmatterRaw(e){let t=e.match(FRONTMATTER_RE);if(!t)return null;try{let e=(0,import_dist$1.parse)(t[1]);if(typeof e==`object`&&e&&!Array.isArray(e))return e}catch{}return null}const DIRECTORY_SCAN_CAP=1e3,DIR_SKIP=new Set([`.git`,`.ok`,`node_modules`,`.changeset`,`.claude`,`.agents`,`dist`,`build`]),WIKI_EXT_RE=/\.(md|mdx)$/i;function pathToDocName$1(e){return e.replace(/\.md$/,``).replace(/\.mdx$/,``)}const fmReadWarnedPaths=new Set;async function readFrontmatter(e){try{return parseFrontmatterRaw(await readFile$1(e,`utf-8`))??{}}catch(t){if(t?.code!==`ENOENT`&&!fmReadWarnedPaths.has(e)){fmReadWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-enrich] failed to read frontmatter at ${e} — enrichment degraded for this file. Reason: ${S}`)}return null}}async function fetchBacklinks(e,t){if(!e)return null;let S=await httpGet(e,`/api/backlinks?docName=${encodeURIComponent(t)}`);if(!S.ok)return null;let w=S.backlinks??S.results??S.links;if(!Array.isArray(w))return[];let E=[];for(let e of w){if(typeof e!=`object`||!e)continue;let t=e,S=typeof t.docName==`string`?t.docName:typeof t.source==`string`?t.source:typeof t.page==`string`?t.page:void 0;S&&E.push({source:S,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return E}const BACKLINK_COUNT_CHUNK=100;async function fetchBacklinkCountsBatch(e,t){if(!e||t.length===0)return null;let S=[...new Set(t)],w=[];for(let e=0;e<S.length;e+=BACKLINK_COUNT_CHUNK)w.push(S.slice(e,e+BACKLINK_COUNT_CHUNK));let E=await Promise.all(w.map(async t=>{let S=await httpGet(e,`/api/backlink-counts?docNames=${encodeURIComponent(t.join(`,`))}`);return S.ok?S.counts??{}:null})),D=new Map,O=!1;for(let e of E)if(e){O=!0;for(let[t,S]of Object.entries(e))typeof S==`number`&&Number.isFinite(S)&&D.set(t,S)}return O?D:null}async function fetchForwardLinks(e,t){if(!e)return null;let S=await httpGet(e,`/api/forward-links?docName=${encodeURIComponent(t)}`);if(!S.ok)return null;let w=S.forwardLinks??S.links??S.results;if(!Array.isArray(w))return[];let E=[];for(let e of w){if(typeof e!=`object`||!e)continue;let t=e;if(t.kind===`external`&&typeof t.url==`string`){E.push({kind:`external`,url:t.url,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null});continue}let S=typeof t.docName==`string`?t.docName:void 0;S&&E.push({kind:`doc`,docName:S,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return E}function mergeFileAndFolder(e,t,S){let w=mergeCascade(S?resolveNestedFrontmatter(S,parentFolderOf(t)):{},e??{});return{title:typeof w.title==`string`?w.title:void 0,description:typeof w.description==`string`?w.description:void 0,tags:Array.isArray(w.tags)?w.tags.filter(e=>typeof e==`string`):[],frontmatter:w}}async function enrichPath(e,t,S={}){let w=resolveWithinRoot(t.projectDir,e);if(!w.ok)throw Error(`enrichPath: ${w.reason}`);let E=w.rel,D=w.abs,O=t.historyDepth??5,k=S.includeRichFields===!0,j=readFrontmatter(D);if(!k){let e=mergeFileAndFolder(await j,E,t.projectDir);return{path:E,title:e.title,description:e.description,tags:e.tags,frontmatter:e.frontmatter,backlinkCount:null,backlinks:null,forwardLinkCount:null,forwardLinks:null,history:null,historySource:null,projectHistory:null,projectHistorySource:null}}let[F,L,B,H,q]=await Promise.all([j,fetchBacklinks(t.serverUrl,pathToDocName$1(E)).catch(()=>null),fetchForwardLinks(t.serverUrl,pathToDocName$1(E)).catch(()=>null),readShadowLog(t.projectDir,E,O).catch(()=>({commits:[],source:`shadow-repo`})),readProjectGitLog(t.projectDir,E,O).catch(()=>({commits:[],source:`git`}))]),J=mergeFileAndFolder(F,E,t.projectDir);return{path:E,title:J.title,description:J.description,tags:J.tags,frontmatter:J.frontmatter,backlinkCount:L?.length??null,backlinks:L,forwardLinkCount:B?.length??null,forwardLinks:B,history:H.commits,historySource:H.source,projectHistory:q.commits,projectHistorySource:q.source}}async function scanDirectory(e,t){let S={directMdCount:0,recursiveMdCount:0,childDirCount:0,mostRecent:null,truncated:!1},w=0,E=[{path:e,depth:0}];for(;E.length>0;){let e=E.shift();if(!e)break;if(w>=DIRECTORY_SCAN_CAP){S.truncated=!0;break}let D;try{D=await readdir(e.path,{withFileTypes:!0})}catch{continue}for(let O of D){if(w>=DIRECTORY_SCAN_CAP){S.truncated=!0;break}w++;let D=O.name;if(O.isDirectory()){if(DIR_SKIP.has(D)||D.startsWith(`.`))continue;e.depth===0&&S.childDirCount++,E.push({path:`${e.path}/${D}`,depth:e.depth+1})}else if(O.isFile()&&WIKI_EXT_RE.test(D)){S.recursiveMdCount++,e.depth===0&&S.directMdCount++;let w=`${e.path}/${D}`;try{let e=await stat$1(w);(!S.mostRecent||e.mtimeMs>S.mostRecent.mtimeMs)&&(S.mostRecent={absPath:w,relPath:relative(t,w).split(/[\\/]/).filter(Boolean).join(`/`),mtimeMs:e.mtimeMs})}catch{}}}}return S}async function enrichDirectory(e,t){let S=resolveWithinRoot(t.projectDir,e);if(!S.ok)throw Error(`enrichDirectory: ${S.reason}`);let w=S.rel,E=S.abs,D=await scanDirectory(E,t.projectDir),O;if(D.mostRecent){let e=await readFrontmatter(D.mostRecent.absPath),t=typeof e?.title==`string`?e.title:void 0;O={path:D.mostRecent.relPath,title:t??basename(D.mostRecent.relPath),updatedAt:new Date(D.mostRecent.mtimeMs).toISOString()}}let k={path:w,type:`directory`,directMdCount:D.directMdCount,recursiveMdCount:D.recursiveMdCount,childDirCount:D.childDirCount,mostRecentMd:O,truncated:D.truncated},j=resolveNestedFrontmatter(t.projectDir,w),F=j.title,L=j.description,B=j.tags??[];F!==void 0&&(k.title=F),L!==void 0&&(k.description=L),B.length>0&&(k.tags=B),Object.keys(j).length>0&&(k.frontmatter_defaults=j);let H=resolveTemplatesAvailable(t.projectDir,w);return H.length>0&&(k.templates_available=H),k}async function enrichDirectoryRecursive(e,t,S){let w=await enrichDirectory(e,S);if(t<=1)return w;let E=w.path,D=resolve(S.projectDir,E),O;try{O=await readdir(D,{withFileTypes:!0})}catch{return w}let k=[];for(let e of O){if(!e.isDirectory()||RECURSIVE_LISTING_SKIP_DIRS.has(e.name)||e.name.startsWith(`.`))continue;let w=await enrichDirectoryRecursive(E?`${E}/${e.name}`:e.name,t-1,S);k.push(w)}return k.length>0&&(w.subfolders=k),w}const RECURSIVE_LISTING_SKIP_DIRS=new Set([`.git`,`.ok`,`node_modules`,`.venv`,`venv`,`env`,`__pycache__`,`vendor`,`dist`,`build`,`out`,`output`,`.next`,`.nuxt`,`.svelte-kit`,`.astro`,`.turbo`,`.cache`,`.parcel-cache`,`coverage`]);function applyNestedFolderRulesUpsert(e){if(!isAbsolute(e.projectDir))return{ok:!1,error:{code:`BAD_PROJECT_DIR`,message:`projectDir must be absolute`}};let t=[];for(let S of e.rules){let w=resolveTargetFolderFromMatch(S.new_match??S.match);if(!w.ok)return{ok:!1,error:{code:`MULTI_FOLDER_GLOB`,message:w.message,rule:S.match}};let E=w.folder?resolve(e.projectDir,w.folder):e.projectDir,D=resolve(e.projectDir);if(!E.startsWith(D+sep)&&E!==D)return{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved target folder escapes projectDir: ${E}`,rule:S.match}};let O=null,k=null;if(S.new_match!==void 0&&S.new_match!==S.match){let t=resolveTargetFolderFromMatch(S.match);if(!t.ok)return{ok:!1,error:{code:`MULTI_FOLDER_GLOB`,message:t.message,rule:S.match}};if(O=t.folder,k=t.folder?resolve(e.projectDir,t.folder):e.projectDir,!k.startsWith(D+sep)&&k!==D)return{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved source folder escapes projectDir: ${k}`,rule:S.match}}}t.push({targetFolder:w.folder,targetAbs:E,sourceFolder:O,sourceAbs:k,rule:S})}let S=[];for(let w of t)try{if(w.sourceAbs&&w.sourceAbs!==w.targetAbs){let t=join(w.sourceAbs,`.ok`,`frontmatter.yml`);existsSync(t)&&(unlinkSync(t),autoCleanOkDir(join(w.sourceAbs,`.ok`)),S.push({match:w.rule.match,path:relPathOf$1(e.projectDir,t),action:`deleted`}))}let t=join(w.targetAbs,`.ok`),E=join(t,`frontmatter.yml`),D=readExistingFrontmatter(E),O=Object.keys(w.rule.frontmatter).length===0?{}:mergePatch(D,w.rule.frontmatter);if(Object.keys(O).length===0){existsSync(E)&&(unlinkSync(E),autoCleanOkDir(t),S.push({match:w.rule.new_match??w.rule.match,path:relPathOf$1(e.projectDir,E),action:`deleted`}));continue}mkdirSync(t,{recursive:!0});let k=(0,import_dist$1.stringify)(O),j=`${E}.tmp.${process.pid}.${Date.now()}`;writeFileSync(j,k,`utf-8`),renameSync(j,E),S.push({match:w.rule.new_match??w.rule.match,path:relPathOf$1(e.projectDir,E),action:`written`})}catch(e){return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to write nested frontmatter for ${w.rule.match}: ${e.message}`,rule:w.rule.match},...S.length>0?{partiallyApplied:S}:{}}}return{ok:!0,applied:S}}function resolveTargetFolderFromMatch(e){let t=e.split(`/`).filter(e=>e.length>0),S=[],w=!1;for(let E of t){let t=/[*?[\]{}]/.test(E);if(w&&!t)return{ok:!1,message:`Glob "${e}" matches multiple folders (literal segment "${E}" appears after a glob). Split it into one rule per folder, e.g. folder_config({ action: "set-rule", rules: [{ match: "specs/foo/${E}/**", ... }, ...] }).`};if(t){if(w=!0,E!==`**`&&E!==`*`)return{ok:!1,message:`Glob "${e}" uses an unsupported pattern segment "${E}". Only "*" and "**" are supported in nested folder rules.`};continue}S.push(E)}return{ok:!0,folder:S.join(`/`)}}function readExistingFrontmatter(e){if(!existsSync(e))return{};let t=(0,import_dist$1.parse)(readFileSync(e,`utf-8`));return typeof t!=`object`||!t||Array.isArray(t)?{}:{...t}}function autoCleanOkDir(e){if(!existsSync(e))return;let t;try{t=readdirSync(e)}catch{return}if(t.length===0)try{rmdirSync(e)}catch{}}function relPathOf$1(e,t){let S=resolve(e);return t.startsWith(S+sep)?t.slice(S.length+1).split(sep).join(`/`):t}const SUBSTITUTION_ALLOWLIST=[`date`,`user`],TOKEN_PATTERN=/\{\{([^{}\n]+?)\}\}/g;function validateSubstitution(e){let t=[];for(let S of e.matchAll(TOKEN_PATTERN)){let e=(S[1]??``).trim();isAllowedToken(e)||t.push({token:e,offset:S.index??0})}return t}function applySubstitution(e,t){return e.replace(TOKEN_PATTERN,(e,S)=>{let w=S.trim();return isAllowedToken(w)?t[w]:e})}function isAllowedToken(e){return SUBSTITUTION_ALLOWLIST.includes(e)}function todayIsoUtc(e=new Date){return`${e.getUTCFullYear().toString().padStart(4,`0`)}-${(e.getUTCMonth()+1).toString().padStart(2,`0`)}-${e.getUTCDate().toString().padStart(2,`0`)}`}const NAME_RE=/^[A-Za-z0-9_-]+$/;function applyTemplateWrite(e){let t=validateInputs(e.projectDir,e.folder,e.name);if(!t.ok)return{ok:!1,error:t.error};let S=validateTitle(e.frontmatter.title);if(!S.ok)return{ok:!1,error:S.error};let w=validateSubstitutionAllowlist(e.body);if(!w.ok)return{ok:!1,error:w.error};let{templatesDir:E,filePath:D}=templatePaths(e.projectDir,t.folderRel,e.name),O=serializeFrontmatter(e.frontmatter),k=O?`---\n${O}---\n${e.body}`:e.body;try{mkdirSync(E,{recursive:!0})}catch(t){return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to create template directory at ${relPathOf(e.projectDir,E)}: ${t.message}`}}}let j=!existsSync(D),F=`${D}.tmp.${process.pid}.${Date.now()}`;try{writeFileSync(F,k,`utf-8`),renameSync(F,D)}catch(t){try{unlinkSync(F)}catch{}return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to write template at ${relPathOf(e.projectDir,D)}: ${t.message}`}}}let L=[];return(e.frontmatter.description===void 0||typeof e.frontmatter.description!=`string`||e.frontmatter.description.length===0)&&L.push("Template frontmatter.description is missing — `description` disambiguates between similarly-named templates in the menu. Recommended but not required."),{ok:!0,path:relPathOf(e.projectDir,D),created:j,warnings:L}}function applyTemplateDelete(e){let t=validateInputs(e.projectDir,e.folder,e.name);if(!t.ok)return{ok:!1,error:t.error};let{templatesDir:S,okDir:w,filePath:E}=templatePaths(e.projectDir,t.folderRel,e.name),D=existsSync(E);if(D)try{unlinkSync(E)}catch(t){return{ok:!1,error:{code:`UNLINK_FAILED`,message:`Failed to delete template at ${relPathOf(e.projectDir,E)}: ${t.message}`}}}let O=!1,k=!1;if(existsSync(S)&&isEmpty(S))try{rmdirSync(S),O=!0}catch{}if(existsSync(w)&&isEmpty(w))try{rmdirSync(w),k=!0}catch{}return{ok:!0,path:relPathOf(e.projectDir,E),existed:D,cleanedEmpty:{templatesDir:O,okDir:k}}}function validateInputs(e,t,S){if(!isAbsolute(e))return{ok:!1,error:{code:`BAD_PROJECT_DIR`,message:`projectDir must be absolute`}};if(!NAME_RE.test(S))return{ok:!1,error:{code:`BAD_NAME`,message:`Template name must match /^[A-Za-z0-9_-]+$/ (got: ${JSON.stringify(S)}). Use letters, digits, underscores, or hyphens — no slashes, dots, or spaces.`}};let w=t.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``).replace(/^\.$/,``);if(w.includes(`..`))return{ok:!1,error:{code:`PATH_TRAVERSAL`,message:`Folder path may not contain "..": ${JSON.stringify(t)}`}};let E=w?resolve(e,w):e,D=resolve(e);return!E.startsWith(D+sep)&&E!==D?{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved folder path escapes projectDir: ${E}`}}:{ok:!0,folderRel:w}}function validateTitle(e){return typeof e!=`string`||e.length===0?{ok:!1,error:{code:`TEMPLATE_TITLE_REQUIRED`,message:"Template frontmatter.title is required. `title` is the menu surface — agents pick templates by name+title; a title-less template is effectively invisible. Set a non-empty `title` and retry."}}:{ok:!0}}function validateSubstitutionAllowlist(e){let t=validateSubstitution(e);return t.length===0?{ok:!0}:{ok:!1,error:{code:`TEMPLATE_UNKNOWN_VARIABLE`,message:`Template body contains unknown substitution token(s): ${t.map(e=>`\`{{${e.token}}}\` at offset ${e.offset}`).join(`, `)}. v1 allowlist: \`{{date}}\`, \`{{user}}\`. Remove or rename the offending tokens and retry.`}}}function templatePaths(e,t,S){let w=t?join(e,t,`.ok`):join(e,`.ok`),E=join(w,`templates`);return{okDir:w,templatesDir:E,filePath:join(E,`${S}.md`)}}function relPathOf(e,t){return normalize(t.startsWith(e+sep)?t.slice(e.length+1):t).split(sep).join(`/`)}function serializeFrontmatter(e){let t={};return e.title!==void 0&&(t.title=e.title),e.description!==void 0&&(t.description=e.description),Array.isArray(e.tags)&&e.tags.length>0&&(t.tags=e.tags),Object.keys(t).length===0?``:(0,import_dist$1.stringify)(t)}function isEmpty(e){try{return readdirSync(e).length===0}catch{return!1}}const log$6=()=>getLogger(`http`);function successResponse(e,t,S,w,E={}){if(e.headersSent||e.writableEnded||e.destroyed){log$6().error({event:`api.success.double-write`,status:t,handler:E.handler},`successResponse called after headers already sent — suppressed`),apiErrorCounter().add(1,{type:`urn:ok:error:internal-server-error`,...E.handler?{handler:E.handler}:{}});return}let D=S.safeParse(w);if(!D.success){log$6().error({event:`api.success.malformed-body`,issues:D.error.issues,bodyKeys:typeof w==`object`&&w?Object.keys(w):null,handler:E.handler,originalStatus:t},`successResponse produced an invalid body for the supplied schema — emitting fallback`),errorResponse(e,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:E.handler});return}let O;try{O=JSON.stringify(D.data)}catch(S){log$6().error({event:`api.success.unserializable-body`,bodyKeys:typeof D.data==`object`&&D.data!==null?Object.keys(D.data):null,handler:E.handler,originalStatus:t,err:S},`successResponse parsed body is not JSON-serializable — emitting fallback`),errorResponse(e,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:E.handler});return}e.writeHead(t,{...E.extraHeaders,"Content-Type":`application/json`,"X-Content-Type-Options":`nosniff`}),e.end(O)}const INSTALLED_AGENTS_SCHEMES=[`claude`,`codex`,`cursor`],INSTALLED_AGENTS_PROBE_TIMEOUT_MS=2e3,MACOS_APP_NAMES={claude:[`Claude`],codex:[`Codex`,`OpenAI Codex`],cursor:[`Cursor`]};function createInstalledAgentsProbe(e){let t=new Map,S=e.now??Date.now,w=e.ttlMs??6e4;async function E(E){let D=t.get(E);if(D?.status===`resolved`&&D.expiresAt>S())return D.installed;if(D?.status===`inflight`)return D.promise;let O=(async()=>{try{let D=await e.probe(E);return t.set(E,{status:`resolved`,installed:D,expiresAt:S()+w}),D}catch{return t.set(E,{status:`resolved`,installed:!1,expiresAt:S()+w}),!1}})();return t.set(E,{status:`inflight`,promise:O}),O}async function D(){let e=await Promise.all(INSTALLED_AGENTS_SCHEMES.map(async e=>[e,await E(e)]));return Object.fromEntries(e)}return{probeAll:D,probeWithCache:E}}function isLocalWebHost(e){let t=e.headers.host;if(typeof t==`string`&&t.length>0)try{let{hostname:e}=new URL(`http://${t}/`);return isLoopbackHostname(e)}catch{}let S=e.headers.origin;if(typeof S==`string`&&S.length>0)try{return isLoopbackHostname(new URL(S).hostname)}catch{return!1}return!0}function isLoopbackHostname(e){return e===`localhost`||e===`127.0.0.1`||e===`[::1]`||e===`::1`}async function handleInstalledAgents(e,t,S){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`installed-agents`,extraHeaders:{Allow:`GET`}});return}try{successResponse(t,200,InstalledAgentsSuccessSchema,isLocalWebHost(e)?await S():Object.fromEntries(INSTALLED_AGENTS_SCHEMES.map(e=>[e,!0])),{handler:`installed-agents`})}catch(e){console.error(`[installed-agents]`,e),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`installed-agents`,cause:e})}}function createOsProbe(e,t=execFile){return S=>e===`darwin`?probeMacOs(S,t):e===`win32`?probeWindows(S,t):probeLinux(S,t)}function probeMacOs(e,t){let S=MACOS_APP_NAMES[e];function w(e){return new Promise(S=>{t(`osascript`,[`-e`,`id of app "${e}"`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},(e,t)=>{if(e){S(!1);return}S(t.trim().length>0)})})}return(async()=>{for(let e of S)if(await w(e))return!0;return!1})()}function probeWindows(e,t){return new Promise(S=>{t(`reg`,[`query`,`HKCR\\${e}`,`/ve`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},e=>{S(!e)})})}function probeLinux(e,t){return new Promise(S=>{t(`xdg-mime`,[`query`,`default`,`x-scheme-handler/${e}`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},(e,t)=>{if(e){S(!1);return}S(t.trim().length>0)})})}const MAX_BODY_BYTES=1048576,REQUEST_BODY_TIMEOUT_MS=3e4;function readRequestBody(e){return readBoundedJsonBody(e,{maxBytes:MAX_BODY_BYTES,timeoutMs:REQUEST_BODY_TIMEOUT_MS})}async function readBoundedJsonBody(e,t){let S=[],w=0,E=AbortSignal.timeout(t.timeoutMs),D=()=>e.destroy(new RequestBodyTimeoutError(t.timeoutMs));E.addEventListener(`abort`,D,{once:!0});try{for await(let E of e){if(w+=E.length,w>t.maxBytes)throw new PayloadTooLargeError(t.maxBytes);S.push(E)}return Buffer.concat(S)}finally{E.removeEventListener(`abort`,D)}}var PayloadTooLargeError=class extends Error{maxBytes;constructor(e){super(e===void 0?`Request body exceeded cap`:`Request body exceeded ${formatBytes(e)} cap`),this.name=`PayloadTooLargeError`,this.maxBytes=e}},RequestBodyTimeoutError=class extends Error{timeoutMs;constructor(e){super(e===void 0?`Request body read exceeded timeout`:`Request body read exceeded ${e}ms timeout`),this.name=`RequestBodyTimeoutError`,this.timeoutMs=e}};function formatBytes(e){return e>=1048576?`${(e/1048576).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}function validateBody(e,t,S,w={}){let E=e.safeParse(t);if(E.success)return{ok:!0,value:E.data};let D=E.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);return errorResponse(S,400,`urn:ok:error:invalid-request`,`Request body is invalid.`,{handler:w.handler,detail:D}),{ok:!1}}function withValidation(e,t,S={}){return async(w,E)=>{if(S.method!==void 0&&w.method!==S.method){errorResponse(E,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:S.handler,extraHeaders:{Allow:S.method}});return}if(S.preBodyGate!==void 0&&!S.preBodyGate(w,E)){!E.headersSent&&!E.writableEnded&&!E.destroyed&&errorResponse(E,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:S.handler,cause:Error(`preBodyGate returned false without writing a response`)});return}if(S.skipBodyParse){let D=validateBody(e,{},E,S);if(!D.ok)return;await t(w,E,D.value);return}let D;try{D=await readRequestBody(w)}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(E,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:S.handler,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(E,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:S.handler,cause:e});return}errorResponse(E,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:S.handler,cause:e});return}let O;try{O=D.length===0?{}:JSON.parse(D.toString(`utf8`))}catch(e){errorResponse(E,400,`urn:ok:error:invalid-request`,`Request body is not valid JSON.`,{handler:S.handler,cause:e});return}let k=validateBody(e,O,E,S);k.ok&&await t(w,E,k.value)}}function classifySpawnError(e){let t=e instanceof Error?e.message:String(e);return/ENOENT|EACCES|EPERM/.test(t)?{ok:!1,reason:`not-installed`}:{ok:!1,reason:`spawn-error`}}function spawnDetached(e,t,S){return new Promise(w=>{let E=!1,D=e=>{E||(E=!0,w(e))},O=setTimeout(()=>D({ok:!1,reason:`timeout`}),S);try{let S=spawn(e,[...t],{detached:!0,stdio:`ignore`,shell:!1});S.once(`error`,e=>{clearTimeout(O),D(classifySpawnError(e))}),S.once(`spawn`,()=>{if(!E){try{S.unref()}catch{}clearTimeout(O),D({ok:!0})}})}catch(e){console.warn(`[spawn-detached] synchronous spawn throw:`,e),clearTimeout(O),D(classifySpawnError(e))}})}const SPAWN_CURSOR_WHICH_TIMEOUT_MS=500,SPAWN_CURSOR_SPAWN_TIMEOUT_MS=2e3,SPAWN_CURSOR_MAX_BODY_BYTES=4*1024,SPAWN_CURSOR_BODY_READ_TIMEOUT_MS=5e3,HANDLER$1=`spawn-cursor`;function assertNeverSpawnReason(e){throw Error(`Unhandled spawn-cursor outcome.reason: ${String(e)}`)}async function handleSpawnCursor(e,t,S){if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:HANDLER$1,extraHeaders:{Allow:`POST`}});return}let w;try{w=await readBoundedJsonBody(e,{maxBytes:SPAWN_CURSOR_MAX_BODY_BYTES,timeoutMs:SPAWN_CURSOR_BODY_READ_TIMEOUT_MS})}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(t,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:HANDLER$1,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(t,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:HANDLER$1,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:HANDLER$1,cause:e});return}let E;try{E=JSON.parse(w.toString(`utf-8`))}catch(e){errorResponse(t,400,`urn:ok:error:invalid-request`,`Malformed JSON body.`,{handler:HANDLER$1,cause:e});return}let D=typeof E.path==`string`?E.path:``;if(!D){errorResponse(t,400,`urn:ok:error:invalid-request`,"Missing or empty `path` field.",{handler:HANDLER$1});return}if(!isPathWithinDir(D,S.contentDir,S.platform)){errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER$1});return}let O=await(S.resolveCursorBinary??resolveCursorBinaryDefault)(SPAWN_CURSOR_WHICH_TIMEOUT_MS);if(!O){errorResponse(t,422,`urn:ok:error:cursor-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER$1});return}let k=resolveCursorSpawnInvocation(O,D,S.platform),j=await(S.spawnDetached??spawnDetached)(k.exec,k.args,SPAWN_CURSOR_SPAWN_TIMEOUT_MS);if(j.ok){successResponse(t,200,SpawnCursorSuccessSchema,{},{handler:HANDLER$1});return}switch(j.reason){case`not-installed`:errorResponse(t,422,`urn:ok:error:cursor-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER$1});return;case`timeout`:errorResponse(t,504,`urn:ok:error:cursor-spawn-timeout`,`Cursor spawn exceeded the deadline.`,{handler:HANDLER$1});return;case`spawn-error`:errorResponse(t,502,`urn:ok:error:cursor-spawn-failed`,`Cursor spawn failed.`,{handler:HANDLER$1});return;case`invalid-path`:errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER$1});return;default:return assertNeverSpawnReason(j.reason)}}const CURSOR_BUNDLE_PATHS_BY_PLATFORM={darwin:[()=>`/Applications/Cursor.app/Contents/Resources/app/bin/cursor`,e=>`${e}/Applications/Cursor.app/Contents/Resources/app/bin/cursor`],win32:[e=>`${e}\\AppData\\Local\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd`,()=>`C:\\Program Files\\Cursor\\resources\\app\\bin\\cursor.cmd`]};async function resolveCursorBinaryDefault(e){let t=CURSOR_BUNDLE_PATHS_BY_PLATFORM[process.platform];if(t&&t.length>0){let e=homedir();for(let S of t){let t=S(e);try{return await access(t,constants.X_OK),t}catch(e){let S=e?.code;S!==`ENOENT`&&S!==`EACCES`&&S!==`EPERM`&&console.warn(`[spawn-cursor] unexpected fs.access error on bundle probe:`,S,t)}}}return new Promise(t=>{execFile(process.platform===`win32`?`where`:`which`,[`cursor`],{timeout:e,encoding:`utf-8`},(e,S)=>{if(e){t(null);return}let w=S.split(/\r?\n/)[0]?.trim();t(w&&w.length>0?w:null)})})}function resolveCursorSpawnInvocation(e,t,S){return S===`darwin`&&/\.app\/?$/.test(e)?{exec:`/usr/bin/open`,args:[`-a`,e.replace(/\/$/,``),t]}:{exec:e,args:[t]}}function isPathWithinDir(e,t,S){if(!e||typeof e!=`string`||e.includes(`\0`)||!t||typeof t!=`string`)return!1;if(S===`win32`){if(!/^([a-zA-Z]:[\\/]|\\\\)/.test(e)||!/^([a-zA-Z]:[\\/]|\\\\)/.test(t))return!1}else if(!e.startsWith(`/`)||!t.startsWith(`/`))return!1;let w=S===`win32`?win32:posix;try{let E=w.resolve(e),D=w.resolve(t);if(S===`win32`){let e=w.parse(E).root.toLowerCase(),t=w.parse(D).root.toLowerCase();if(!e||!t||e!==t)return!1}if(E===D)return!0;let O=w.relative(D,E);return O===``||O===`.`?!0:!(O===`..`||O.startsWith(`..${w.sep}`)||S===`win32`&&(/^[a-zA-Z]:[\\/]/.test(O)||O.startsWith(`\\\\`))||S!==`win32`&&O.startsWith(`/`))}catch(e){return console.warn(`[spawn-cursor] unexpected path-resolution error:`,e),!1}}const HANDLER=`handoff`,HANDOFF_MAX_BODY_BYTES=4*1024,HANDOFF_BODY_READ_TIMEOUT_MS=5e3,SPAWN_TIMEOUT_MS=2e3,WHICH_TIMEOUT_MS=500,QUIT_SETTLE_MS=3e3,APP_BUNDLE_SETTLE_MS=5e3,CURSOR_SETTLE_MS=1500,RECIPES={"claude-cowork":{type:`app-bundle`,appName:`Claude`,urlScheme:`claude:`,quitFirst:!1},"claude-code":{type:`app-bundle`,appName:`Claude`,urlScheme:`claude:`,quitFirst:!1},codex:{type:`app-bundle`,appName:`Codex`,urlScheme:`codex:`,quitFirst:!0},cursor:{type:`cli-binary`,binaryName:`cursor`,urlScheme:`cursor:`}},TARGET_VALUES=Object.keys(RECIPES),HandoffRequestSchema=object$1({target:_enum(TARGET_VALUES),url:string$2().min(1).max(4096),workspacePath:string$2().optional()}),HandoffSuccessSchema=object$1({}).loose();function defaultSleep(e){return new Promise(t=>setTimeout(t,e))}async function handleHandoffDispatch(e,t,S){if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:HANDLER,extraHeaders:{Allow:`POST`}});return}if(S.platform!==`darwin`){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Handoff is currently macOS-only.`,{handler:HANDLER});return}let w;try{w=await readBoundedJsonBody(e,{maxBytes:HANDOFF_MAX_BODY_BYTES,timeoutMs:HANDOFF_BODY_READ_TIMEOUT_MS})}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(t,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:HANDLER,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(t,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:HANDLER,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:HANDLER,cause:e});return}let E;try{E=JSON.parse(w.toString(`utf-8`))}catch(e){errorResponse(t,400,`urn:ok:error:invalid-request`,`Malformed JSON body.`,{handler:HANDLER,cause:e});return}let D=HandoffRequestSchema.safeParse(E);if(!D.success){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid request body.`,{handler:HANDLER});return}let{target:O,url:k,workspacePath:j}=D.data,F=RECIPES[O];if(!k.startsWith(F.urlScheme)){errorResponse(t,400,`urn:ok:error:invalid-request`,`URL scheme must be ${F.urlScheme} for target ${O}.`,{handler:HANDLER});return}let L=S.sleep??defaultSleep,B=S.spawnDetached??spawnDetached;if(F.type===`app-bundle`){F.quitFirst&&(await B(`/usr/bin/osascript`,[`-e`,`tell application "${F.appName}" to quit`],SPAWN_TIMEOUT_MS).catch(()=>void 0),await L(QUIT_SETTLE_MS));let e=await B(`/usr/bin/open`,[`-a`,F.appName],SPAWN_TIMEOUT_MS);if(!e.ok){emitSpawnFailure(t,O,e.reason);return}await L(APP_BUNDLE_SETTLE_MS);let S=await B(`/usr/bin/open`,[k],SPAWN_TIMEOUT_MS);if(!S.ok){emitSpawnFailure(t,O,S.reason);return}successResponse(t,200,HandoffSuccessSchema,{},{handler:HANDLER});return}if(!j){errorResponse(t,400,`urn:ok:error:invalid-request`,`workspacePath is required for cursor handoff.`,{handler:HANDLER});return}if(!isPathWithinDir(j,S.contentDir,S.platform)){errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER});return}let H=await(S.resolveCursorBinary??resolveCursorBinaryDefault)(WHICH_TIMEOUT_MS);if(!H){errorResponse(t,422,`urn:ok:error:handoff-target-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER,extensions:{target:`cursor`}});return}let q=resolveCursorSpawnInvocation(H,j,S.platform),J=await B(q.exec,q.args,SPAWN_TIMEOUT_MS);if(!J.ok){emitSpawnFailure(t,O,J.reason);return}await L(CURSOR_SETTLE_MS);let Y=await B(`/usr/bin/open`,[k],SPAWN_TIMEOUT_MS);if(!Y.ok){emitSpawnFailure(t,O,Y.reason);return}successResponse(t,200,HandoffSuccessSchema,{},{handler:HANDLER})}function emitSpawnFailure(e,t,S){switch(S){case`not-installed`:errorResponse(e,422,`urn:ok:error:handoff-target-not-installed`,`Required binary or application not found.`,{handler:HANDLER,extensions:{target:t}});return;case`timeout`:errorResponse(e,504,`urn:ok:error:handoff-spawn-timeout`,`Handoff spawn exceeded the deadline.`,{handler:HANDLER,extensions:{target:t}});return;case`spawn-error`:errorResponse(e,502,`urn:ok:error:handoff-spawn-failed`,`Handoff spawn failed.`,{handler:HANDLER,extensions:{target:t}});return;default:assertNeverReason(S)}}function assertNeverReason(e){throw Error(`Unhandled spawn reason: ${String(e)}`)}const FIXED_HUB_BASENAMES=[`INDEX`,`README`,`REPORT`,`SPEC`],MAX_CANDIDATES=3;function findHubCandidates(e,t){let S=[],w=new Set,E=t=>{!t||w.has(t)||t!==e&&(w.add(t),S.push(t))},D=buildLowerDocNameIndex(t),O=parentFolder(e);for(;;){for(let e of FIXED_HUB_BASENAMES)if(E(lookup$1(t,D,joinDocName(O,e))),S.length>=MAX_CANDIDATES)return S;let e=O===``?null:basename$1(O);if(e&&(E(lookup$1(t,D,joinDocName(O,e))),S.length>=MAX_CANDIDATES))return S;if(O===``)break;O=parentFolder(O)}return S}function lookup$1(e,t,S){return e.has(S)?S:t.get(S.toLowerCase())??null}function buildLowerDocNameIndex(e){let t=new Map;for(let S of e.keys()){let e=S.toLowerCase();t.has(e)||t.set(e,S)}return t}function parentFolder(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}function basename$1(e){let t=e.lastIndexOf(`/`);return t<0?e:e.slice(t+1)}function joinDocName(e,t){return e===``?t:`${e}/${t}`}function splitFrontmatterLines(e){return e?e.replace(/^---\r?\n/,``).replace(/\r?\n---(?:\r?\n)?$/,``).split(/\r?\n/):[]}function normalizeFrontmatterScalar(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1).trim():t}function extractFrontmatterScalar(e,t){let S=`${t}:`;for(let t of splitFrontmatterLines(e))if(t.startsWith(S))return normalizeFrontmatterScalar(t.slice(S.length))||null;return null}function parseInlineAliases(e){let t=[],S=``,w=null;for(let E of e){if(w){S+=E,E===w&&(w=null);continue}if(E===`"`||E===`'`){w=E,S+=E;continue}if(E===`,`){let e=normalizeFrontmatterScalar(S);e&&t.push(e),S=``;continue}S+=E}let E=normalizeFrontmatterScalar(S);return E&&t.push(E),t}function dedupeExact(e){let t=[],S=new Set;for(let w of e)!w||S.has(w)||(S.add(w),t.push(w));return t}function extractPageAliases(e){let{frontmatter:t}=stripFrontmatter(e);if(!t)return[];let S=splitFrontmatterLines(t);for(let e=0;e<S.length;e+=1){let t=S[e]?.match(/^aliases:\s*(.*)$/);if(!t)continue;let w=t[1]?.trim()??``;if(w){if(w.startsWith(`[`)&&w.endsWith(`]`))return dedupeExact(parseInlineAliases(w.slice(1,-1)));let e=normalizeFrontmatterScalar(w);return e?[e]:[]}let E=[];for(let t=e+1;t<S.length;t+=1){let e=S[t];if(e?.trim()){if(/^\s*-\s+/.test(e)){let t=normalizeFrontmatterScalar(e.replace(/^\s*-\s+/,``));t&&E.push(t);continue}if(/^[^\s][^:]*:\s*/.test(e))break;break}}return dedupeExact(E)}return[]}function extractPageTitle(e,t){let{frontmatter:S,body:w}=stripFrontmatter(e),E=extractFrontmatterScalar(S,`title`);if(E)return E;let D=w.match(/^# (.+)$/m);return D?D[1].trim():t}const ICON_VALUE_LENGTH_CAP=2048;function extractPageIcon(e){let{frontmatter:t}=stripFrontmatter(e),S=extractFrontmatterScalar(t,`icon`);if(!(!S||S.length>ICON_VALUE_LENGTH_CAP))return S}function parseFrontmatterMetadata(e){return e?.trim()?{cluster:extractFrontmatterScalar(e,`cluster`)??void 0,category:extractFrontmatterScalar(e,`category`)??void 0,tags:extractFrontmatterArray(e,`tags`)}:{cluster:void 0,category:void 0,tags:void 0}}function extractFrontmatterArray(e,t){let S=`${t}:`,w=splitFrontmatterLines(e);for(let e=0;e<w.length;e+=1){let t=w[e];if(!t?.startsWith(S))continue;let E=t.slice(S.length).trim();if(E){if(E.startsWith(`[`)&&E.endsWith(`]`)){let e=parseInlineAliases(E.slice(1,-1));return e.length>0?e:void 0}let e=normalizeFrontmatterScalar(E);return e?[e]:void 0}let D=[];for(let t=e+1;t<w.length;t+=1){let e=w[t];if(e?.trim()){if(/^\s*-\s+/.test(e)){let t=normalizeFrontmatterScalar(e.replace(/^\s*-\s+/,``));t&&D.push(t);continue}if(/^[^\s][^:]*:\s*/.test(e))break;break}}return D.length>0?D:void 0}}function extractPageIdentity(e,t){let S=extractPageTitle(e,t),w=extractPageAliases(e),E=dedupeExact([S,...w]),D=[],O=new Set;for(let e of E){let t=toWikiLinkSlug(e);!t||O.has(t)||(O.add(t),D.push(t))}return{docName:t,title:S,aliases:w,matchLabels:E,normalizedMatchLabels:D}}const SHARE_BASE_URL=`https://openknowledge.ai/d/`,SHARE_CONSTRUCT_URL_HANDLER_TAG=`share-construct-url`;function isValidShareDocPath(e){if(e.length===0||e.startsWith(`/`)||e.startsWith(`\\`))return!1;for(let t of e.split(/[/\\]/))if(t===`..`||t===`.git`||t.length===0)return!1;return!0}function buildGitHubBlobUrl(e,t,S,w){return`https://github.com/${e}/${t}/blob/${encodeURIComponent(S)}/${w.split(`/`).map(encodeURIComponent).join(`/`)}`}function emitShareConstructUrlLog(e,t){let S=t===void 0?``:` branch_exists=${t}`;console.log(`[share] action=construct-url result=${e}${S}`)}function resolveGitDir$1(e){let t=resolve(e,`.git`);if(!existsSync(t))return null;let S;try{S=statSync(t)}catch{return null}if(S.isDirectory())return t;if(S.isFile()){let S;try{S=readFileSync(t,`utf-8`)}catch{return null}let w=/^gitdir:\s*(.+)$/m.exec(S.trim());if(!w)return null;let E=w[1].trim(),D=isAbsolute(E)?E:resolve(e,E);return existsSync(D)?D:null}return null}function readGitHeadBranch(e){let t=resolveGitDir$1(e);if(!t)return null;let S=join(t,`HEAD`);if(!existsSync(S))return null;let w;try{w=readFileSync(S,`utf-8`)}catch{return null}let E=/^ref:\s*refs\/heads\/(.+)$/.exec(w.trim());return E?E[1]:null}function stripCommentAndTrim(e){let t=e.indexOf(`#`),S=e.indexOf(`;`),w=-1;return t>=0&&S>=0?w=Math.min(t,S):t>=0?w=t:S>=0&&(w=S),(w===-1?e:e.slice(0,w)).trim()}function extractOriginUrl(e){let t=!1;for(let S of e.split(/\r?\n/)){let e=stripCommentAndTrim(S);if(e.length===0)continue;if(e.startsWith(`[`)){t=/^\[\s*remote\s+["']origin["']\s*\]$/.test(e);continue}if(!t)continue;let w=/^url\s*=\s*(.+)$/.exec(e);if(!w)continue;let E=w[1].trim();if((E.startsWith(`"`)&&E.endsWith(`"`)||E.startsWith(`'`)&&E.endsWith(`'`))&&(E=E.slice(1,-1)),E.length>0)return E}return null}function parseGitHubOriginUrl(e){let t=e.trim();if(!t)return null;let S=/^https?:\/\/(?:www\.)?github\.com\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);return S||(S=/^ssh:\/\/(?:[\w.-]+@)?github\.com(?::\d+)?\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t),S)||(S=/^[\w.-]+@github\.com:([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t),S)||(S=/^git:\/\/github\.com\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t),S)?{owner:S[1],repo:S[2]}:null}function readParsedOrigin(e){let t=resolveGitDir$1(e);if(!t)return null;let S=join(t,`config`);if(!existsSync(S))return null;let w;try{w=readFileSync(S,`utf-8`)}catch{return null}let E=extractOriginUrl(w);return E?{originUrl:E,github:parseGitHubOriginUrl(E)}:null}function readOriginGitHubRepo(e){let t=readParsedOrigin(e);return t?t.github?{kind:`ok`,owner:t.github.owner,repo:t.github.repo}:{kind:`non-github`}:{kind:`no-remote`}}function readSyncRemoteInfo(e){let t=readParsedOrigin(e);return t?t.github?{label:`${t.github.owner}/${t.github.repo}`,webUrl:`https://github.com/${t.github.owner}/${t.github.repo}`}:{label:labelFromNonGitHubUrl(t.originUrl),webUrl:null}:null}function labelFromNonGitHubUrl(e){let t=e.trim().replace(/\.git$/,``),S=/^[\w.-]+@([^:/]+):(.+)$/.exec(t);if(S)return`${S[1]}/${S[2]}`;let w=/^[a-z][a-z0-9+.-]*:\/\/(?:[^@/]+@)*(.+)$/i.exec(t);return w?w[1]:t}function branchExistsOnOrigin(e,t){let S=resolveGitDir$1(e);if(!S)return!1;if(existsSync(join(S,`refs`,`remotes`,`origin`,t)))return!0;let w=join(S,`packed-refs`);if(!existsSync(w))return!1;let E;try{E=readFileSync(w,`utf-8`)}catch{return!1}let D=`refs/remotes/origin/${t}`;for(let e of E.split(/\r?\n/)){let t=e.trim();if(t.length===0||t.startsWith(`#`)||t.startsWith(`^`))continue;let S=t.split(/\s+/);if(S.length===2&&S[1]===D)return!0}return!1}const SHARE_PUBLISH_OWNERS_HANDLER_TAG=`share-publish-owners`,SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG=`share-publish-name-check`,SHARE_PUBLISH_HANDLER_TAG=`share-publish`,SHARE_PUBLISH_OWNERS_KEY=`/api/share/publish/owners`,SHARE_PUBLISH_NAME_CHECK_KEY=`/api/share/publish/name-check`,SHARE_PUBLISH_KEY=`/api/share/publish`,SHARE_PUBLISH_TIMEOUT_MS=3e4;function isValidShareRepoName(e){return e.length===0||e.length>100||e.startsWith(`.`)||e.startsWith(`-`)||/^-+$/.test(e)?!1:/^[A-Za-z0-9._-]+$/.test(e)}function isValidShareOwnerName(e){return e.length===0||e.length>39||e.startsWith(`-`)||e.endsWith(`-`)?!1:/^[A-Za-z0-9-]+$/.test(e)}function pickTerminalJsonLine(e){let t=e.split(`
|
|
1248
|
+
`).map(e=>e.trim()).filter(Boolean);return k.length===0?{commits:[],source:`shadow-repo`}:{commits:(await Promise.all(k.map(e=>logOnRef(D,e,t,E,S)))).flat().sort((e,t)=>t.date.localeCompare(e.date)).slice(0,S),source:`shadow-repo`}}function resolveTemplatesAvailable(e,t,S={}){let w=normalizeFolderPath(t),E=w===``?[]:w.split(`/`),D=new Set,O=[];collectFromFolder(e,w,`local`,D,O);for(let t=E.length-1;t>=1;t--)collectFromFolder(e,E.slice(0,t).join(`/`),`inherited`,D,O);return E.length>0&&collectFromFolder(e,``,`inherited`,D,O),O}function collectFromFolder(e,t,S,w,E){let D=t?join(e,t,`.ok`,`templates`):join(e,`.ok`,`templates`);if(!existsSync(D))return;let O;try{O=readdirSync(D)}catch{return}for(let e of O){if(!e.endsWith(`.md`))continue;let O=e.slice(0,-3);if(w.has(O))continue;let k=join(D,e),j;try{j=statSync(k)}catch{continue}if(!j.isFile())continue;let F=readTemplateMeta(k),L={name:O,path:t?posix.join(t,`.ok`,`templates`,e):posix.join(`.ok`,`templates`,e),source_folder:t,scope:S};F.title!==void 0&&(L.title=F.title),F.description!==void 0&&(L.description=F.description),w.add(O),E.push(L)}}function normalizeFolderPath(e){return e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``).replace(/^\.$/,``)}const templateMetaWarnedPaths=new Set;function readTemplateMeta(e){let t;try{t=readFileSync(e,`utf-8`)}catch(t){if(t?.code!==`ENOENT`&&!templateMetaWarnedPaths.has(e)){templateMetaWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-templates] failed to read template at ${e} — metadata skipped. Reason: ${S}`)}return{}}let S=extractFrontmatterYaml(t);if(S===null)return{};let w;try{w=(0,import_dist$1.parse)(S)}catch(t){if(!templateMetaWarnedPaths.has(e)){templateMetaWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-templates] malformed YAML frontmatter at ${e} — title/description unavailable. Reason: ${S}`)}return{}}if(typeof w!=`object`||!w)return{};let E=w,D={};return typeof E.title==`string`&&(D.title=E.title),typeof E.description==`string`&&(D.description=E.description),D}function extractFrontmatterYaml(e){let t=e.replace(/^/,``),S=/^[ \t]*---\r?\n([\s\S]*?)\r?\n[ \t]*---(\r?\n|$)/.exec(t);return S?S[1]??null:null}const FRONTMATTER_RE=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;function parseFrontmatterRaw(e){let t=e.match(FRONTMATTER_RE);if(!t)return null;try{let e=(0,import_dist$1.parse)(t[1]);if(typeof e==`object`&&e&&!Array.isArray(e))return e}catch{}return null}const DIRECTORY_SCAN_CAP=1e3,DIR_SKIP=new Set([`.git`,`.ok`,`node_modules`,`.changeset`,`.claude`,`.agents`,`dist`,`build`]),WIKI_EXT_RE=/\.(md|mdx)$/i;function pathToDocName$1(e){return e.replace(/\.md$/,``).replace(/\.mdx$/,``)}const fmReadWarnedPaths=new Set;async function readFrontmatter(e){try{return parseFrontmatterRaw(await readFile$1(e,`utf-8`))??{}}catch(t){if(t?.code!==`ENOENT`&&!fmReadWarnedPaths.has(e)){fmReadWarnedPaths.add(e);let S=t instanceof Error?t.message:String(t);console.warn(`[ok-enrich] failed to read frontmatter at ${e} — enrichment degraded for this file. Reason: ${S}`)}return null}}async function fetchBacklinks(e,t){if(!e)return null;let S=await httpGet(e,`/api/backlinks?docName=${encodeURIComponent(t)}`);if(!S.ok)return null;let w=S.backlinks??S.results??S.links;if(!Array.isArray(w))return[];let E=[];for(let e of w){if(typeof e!=`object`||!e)continue;let t=e,S=typeof t.docName==`string`?t.docName:typeof t.source==`string`?t.source:typeof t.page==`string`?t.page:void 0;S&&E.push({source:S,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return E}const BACKLINK_COUNT_CHUNK=100;async function fetchBacklinkCountsBatch(e,t){if(!e||t.length===0)return null;let S=[...new Set(t)],w=[];for(let e=0;e<S.length;e+=BACKLINK_COUNT_CHUNK)w.push(S.slice(e,e+BACKLINK_COUNT_CHUNK));let E=await Promise.all(w.map(async t=>{let S=await httpGet(e,`/api/backlink-counts?docNames=${encodeURIComponent(t.join(`,`))}`);return S.ok?S.counts??{}:null})),D=new Map,O=!1;for(let e of E)if(e){O=!0;for(let[t,S]of Object.entries(e))typeof S==`number`&&Number.isFinite(S)&&D.set(t,S)}return O?D:null}async function fetchForwardLinks(e,t){if(!e)return null;let S=await httpGet(e,`/api/forward-links?docName=${encodeURIComponent(t)}`);if(!S.ok)return null;let w=S.forwardLinks??S.links??S.results;if(!Array.isArray(w))return[];let E=[];for(let e of w){if(typeof e!=`object`||!e)continue;let t=e;if(t.kind===`external`&&typeof t.url==`string`){E.push({kind:`external`,url:t.url,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null});continue}let S=typeof t.docName==`string`?t.docName:void 0;S&&E.push({kind:`doc`,docName:S,title:typeof t.title==`string`?t.title:void 0,snippet:typeof t.snippet==`string`?t.snippet:null})}return E}function mergeFileAndFolder(e,t,S){let w=S?resolveNestedFrontmatterWithSources(S,parentFolderOf(t)):{merged:{},sources:{},declarations:{},declarationSources:{}},E=w.merged,D=mergeCascade(E,e??{});return{title:typeof D.title==`string`?D.title:void 0,description:typeof D.description==`string`?D.description:void 0,tags:Array.isArray(D.tags)?D.tags.filter(e=>typeof e==`string`):[],frontmatter:D,schemaDeclarations:w.declarations}}async function enrichPath(e,t,S={}){let w=resolveWithinRoot(t.projectDir,e);if(!w.ok)throw Error(`enrichPath: ${w.reason}`);let E=w.rel,D=w.abs,O=t.historyDepth??5,k=S.includeRichFields===!0,j=readFrontmatter(D);if(!k){let e=mergeFileAndFolder(await j,E,t.projectDir);return{path:E,title:e.title,description:e.description,tags:e.tags,frontmatter:e.frontmatter,schema_declarations:Object.keys(e.schemaDeclarations).length>0?e.schemaDeclarations:void 0,backlinkCount:null,backlinks:null,forwardLinkCount:null,forwardLinks:null,history:null,historySource:null,projectHistory:null,projectHistorySource:null}}let[F,L,B,H,q]=await Promise.all([j,fetchBacklinks(t.serverUrl,pathToDocName$1(E)).catch(()=>null),fetchForwardLinks(t.serverUrl,pathToDocName$1(E)).catch(()=>null),readShadowLog(t.projectDir,E,O).catch(()=>({commits:[],source:`shadow-repo`})),readProjectGitLog(t.projectDir,E,O).catch(()=>({commits:[],source:`git`}))]),J=mergeFileAndFolder(F,E,t.projectDir);return{path:E,title:J.title,description:J.description,tags:J.tags,frontmatter:J.frontmatter,schema_declarations:Object.keys(J.schemaDeclarations).length>0?J.schemaDeclarations:void 0,backlinkCount:L?.length??null,backlinks:L,forwardLinkCount:B?.length??null,forwardLinks:B,history:H.commits,historySource:H.source,projectHistory:q.commits,projectHistorySource:q.source}}async function scanDirectory(e,t){let S={directMdCount:0,recursiveMdCount:0,childDirCount:0,mostRecent:null,truncated:!1},w=0,E=[{path:e,depth:0}];for(;E.length>0;){let e=E.shift();if(!e)break;if(w>=DIRECTORY_SCAN_CAP){S.truncated=!0;break}let D;try{D=await readdir(e.path,{withFileTypes:!0})}catch{continue}for(let O of D){if(w>=DIRECTORY_SCAN_CAP){S.truncated=!0;break}w++;let D=O.name;if(O.isDirectory()){if(DIR_SKIP.has(D)||D.startsWith(`.`))continue;e.depth===0&&S.childDirCount++,E.push({path:`${e.path}/${D}`,depth:e.depth+1})}else if(O.isFile()&&WIKI_EXT_RE.test(D)){S.recursiveMdCount++,e.depth===0&&S.directMdCount++;let w=`${e.path}/${D}`;try{let e=await stat$1(w);(!S.mostRecent||e.mtimeMs>S.mostRecent.mtimeMs)&&(S.mostRecent={absPath:w,relPath:relative(t,w).split(/[\\/]/).filter(Boolean).join(`/`),mtimeMs:e.mtimeMs})}catch{}}}}return S}async function enrichDirectory(e,t){let S=resolveWithinRoot(t.projectDir,e);if(!S.ok)throw Error(`enrichDirectory: ${S.reason}`);let w=S.rel,E=S.abs,D=await scanDirectory(E,t.projectDir),O;if(D.mostRecent){let e=await readFrontmatter(D.mostRecent.absPath),t=typeof e?.title==`string`?e.title:void 0;O={path:D.mostRecent.relPath,title:t??basename(D.mostRecent.relPath),updatedAt:new Date(D.mostRecent.mtimeMs).toISOString()}}let k={path:w,type:`directory`,directMdCount:D.directMdCount,recursiveMdCount:D.recursiveMdCount,childDirCount:D.childDirCount,mostRecentMd:O,truncated:D.truncated},j=resolveNestedFrontmatterWithSources(t.projectDir,w),F=j.merged,L=F.title,B=F.description,H=F.tags??[];L!==void 0&&(k.title=L),B!==void 0&&(k.description=B),H.length>0&&(k.tags=H),Object.keys(F).length>0&&(k.frontmatter_defaults=F),Object.keys(j.declarations).length>0&&(k.schema_declarations=j.declarations);let q=resolveTemplatesAvailable(t.projectDir,w);return q.length>0&&(k.templates_available=q),k}async function enrichDirectoryRecursive(e,t,S){let w=await enrichDirectory(e,S);if(t<=1)return w;let E=w.path,D=resolve(S.projectDir,E),O;try{O=await readdir(D,{withFileTypes:!0})}catch{return w}let k=[];for(let e of O){if(!e.isDirectory()||RECURSIVE_LISTING_SKIP_DIRS.has(e.name)||e.name.startsWith(`.`))continue;let w=await enrichDirectoryRecursive(E?`${E}/${e.name}`:e.name,t-1,S);k.push(w)}return k.length>0&&(w.subfolders=k),w}const RECURSIVE_LISTING_SKIP_DIRS=new Set([`.git`,`.ok`,`node_modules`,`.venv`,`venv`,`env`,`__pycache__`,`vendor`,`dist`,`build`,`out`,`output`,`.next`,`.nuxt`,`.svelte-kit`,`.astro`,`.turbo`,`.cache`,`.parcel-cache`,`coverage`]);function applyNestedFolderRulesUpsert(e){if(!isAbsolute(e.projectDir))return{ok:!1,error:{code:`BAD_PROJECT_DIR`,message:`projectDir must be absolute`}};let t=[];for(let S of e.rules){let w=resolveTargetFolderFromMatch(S.new_match??S.match);if(!w.ok)return{ok:!1,error:{code:`MULTI_FOLDER_GLOB`,message:w.message,rule:S.match}};let E=w.folder?resolve(e.projectDir,w.folder):e.projectDir,D=resolve(e.projectDir);if(!E.startsWith(D+sep)&&E!==D)return{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved target folder escapes projectDir: ${E}`,rule:S.match}};let O=null,k=null;if(S.new_match!==void 0&&S.new_match!==S.match){let t=resolveTargetFolderFromMatch(S.match);if(!t.ok)return{ok:!1,error:{code:`MULTI_FOLDER_GLOB`,message:t.message,rule:S.match}};if(O=t.folder,k=t.folder?resolve(e.projectDir,t.folder):e.projectDir,!k.startsWith(D+sep)&&k!==D)return{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved source folder escapes projectDir: ${k}`,rule:S.match}}}t.push({targetFolder:w.folder,targetAbs:E,sourceFolder:O,sourceAbs:k,rule:S})}let S=[];for(let w of t)try{if(w.sourceAbs&&w.sourceAbs!==w.targetAbs){let t=join(w.sourceAbs,`.ok`,`frontmatter.yml`);existsSync(t)&&(unlinkSync(t),autoCleanOkDir(join(w.sourceAbs,`.ok`)),S.push({match:w.rule.match,path:relPathOf$1(e.projectDir,t),action:`deleted`}))}let t=join(w.targetAbs,`.ok`),E=join(t,`frontmatter.yml`),D=readExistingFrontmatter(E),O=Object.keys(w.rule.frontmatter).length===0?{}:mergePatch(D,w.rule.frontmatter);if(Object.keys(O).length===0){existsSync(E)&&(unlinkSync(E),autoCleanOkDir(t),S.push({match:w.rule.new_match??w.rule.match,path:relPathOf$1(e.projectDir,E),action:`deleted`}));continue}mkdirSync(t,{recursive:!0});let k=(0,import_dist$1.stringify)(O),j=`${E}.tmp.${process.pid}.${Date.now()}`;writeFileSync(j,k,`utf-8`),renameSync(j,E),S.push({match:w.rule.new_match??w.rule.match,path:relPathOf$1(e.projectDir,E),action:`written`})}catch(e){return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to write nested frontmatter for ${w.rule.match}: ${e.message}`,rule:w.rule.match},...S.length>0?{partiallyApplied:S}:{}}}return{ok:!0,applied:S}}function resolveTargetFolderFromMatch(e){let t=e.split(`/`).filter(e=>e.length>0),S=[],w=!1;for(let E of t){let t=/[*?[\]{}]/.test(E);if(w&&!t)return{ok:!1,message:`Glob "${e}" matches multiple folders (literal segment "${E}" appears after a glob). Split it into one rule per folder, e.g. folder_config({ action: "set-rule", rules: [{ match: "specs/foo/${E}/**", ... }, ...] }).`};if(t){if(w=!0,E!==`**`&&E!==`*`)return{ok:!1,message:`Glob "${e}" uses an unsupported pattern segment "${E}". Only "*" and "**" are supported in nested folder rules.`};continue}S.push(E)}return{ok:!0,folder:S.join(`/`)}}function applyNestedFolderSchemaUpsert(e){if(!isAbsolute(e.projectDir))return{ok:!1,error:{code:`BAD_PROJECT_DIR`,message:`projectDir must be absolute`}};let t=[];for(let S of e.rules){let w=resolveTargetFolderFromMatch(S.match);if(!w.ok)return{ok:!1,error:{code:`MULTI_FOLDER_GLOB`,message:w.message,rule:S.match}};let E=w.folder?resolve(e.projectDir,w.folder):e.projectDir,D=resolve(e.projectDir);if(!E.startsWith(D+sep)&&E!==D)return{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved target folder escapes projectDir: ${E}`,rule:S.match}};t.push({targetFolder:w.folder,targetAbs:E,rule:S})}let S=[];for(let w of t)try{let t=join(w.targetAbs,`.ok`),E=join(t,`schema.yml`),D={...readExistingSchema(E)};for(let[e,t]of Object.entries(w.rule.declarations))t===null?delete D[e]:D[e]=t;if(Object.keys(D).length===0){existsSync(E)&&(unlinkSync(E),autoCleanOkDir(t),S.push({match:w.rule.match,path:relPathOf$1(e.projectDir,E),action:`deleted`}));continue}mkdirSync(t,{recursive:!0});let O=(0,import_dist$1.stringify)({declarations:D}),k=`${E}.tmp.${process.pid}.${Date.now()}`;writeFileSync(k,O,`utf-8`),renameSync(k,E),S.push({match:w.rule.match,path:relPathOf$1(e.projectDir,E),action:`written`})}catch(e){return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to write nested schema for ${w.rule.match}: ${e.message}`,rule:w.rule.match},...S.length>0?{partiallyApplied:S}:{}}}return{ok:!0,applied:S}}function readExistingSchema(e){if(!existsSync(e))return{};let t=(0,import_dist$1.parse)(readFileSync(e,`utf-8`));if(t==null)return{};let S=FolderSchemaSchema.safeParse(t);if(!S.success)throw Error(`Malformed schema.yml at ${e}: ${S.error.issues.map(e=>e.message).join(`, `)}`);return S.data.declarations}function readExistingFrontmatter(e){if(!existsSync(e))return{};let t=(0,import_dist$1.parse)(readFileSync(e,`utf-8`));return typeof t!=`object`||!t||Array.isArray(t)?{}:{...t}}function autoCleanOkDir(e){if(!existsSync(e))return;let t;try{t=readdirSync(e)}catch{return}if(t.length===0)try{rmdirSync(e)}catch{}}function relPathOf$1(e,t){let S=resolve(e);return t.startsWith(S+sep)?t.slice(S.length+1).split(sep).join(`/`):t}const SUBSTITUTION_ALLOWLIST=[`date`,`user`],TOKEN_PATTERN=/\{\{([^{}\n]+?)\}\}/g;function validateSubstitution(e){let t=[];for(let S of e.matchAll(TOKEN_PATTERN)){let e=(S[1]??``).trim();isAllowedToken(e)||t.push({token:e,offset:S.index??0})}return t}function applySubstitution(e,t){return e.replace(TOKEN_PATTERN,(e,S)=>{let w=S.trim();return isAllowedToken(w)?t[w]:e})}function isAllowedToken(e){return SUBSTITUTION_ALLOWLIST.includes(e)}function todayIsoUtc(e=new Date){return`${e.getUTCFullYear().toString().padStart(4,`0`)}-${(e.getUTCMonth()+1).toString().padStart(2,`0`)}-${e.getUTCDate().toString().padStart(2,`0`)}`}const NAME_RE=/^[A-Za-z0-9_-]+$/;function applyTemplateWrite(e){let t=validateInputs(e.projectDir,e.folder,e.name);if(!t.ok)return{ok:!1,error:t.error};let S=validateTitle(e.frontmatter.title);if(!S.ok)return{ok:!1,error:S.error};let w=validateSubstitutionAllowlist(e.body);if(!w.ok)return{ok:!1,error:w.error};let{templatesDir:E,filePath:D}=templatePaths(e.projectDir,t.folderRel,e.name),O=serializeFrontmatter(e.frontmatter),k=O?`---\n${O}---\n${e.body}`:e.body;try{mkdirSync(E,{recursive:!0})}catch(t){return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to create template directory at ${relPathOf(e.projectDir,E)}: ${t.message}`}}}let j=!existsSync(D),F=`${D}.tmp.${process.pid}.${Date.now()}`;try{writeFileSync(F,k,`utf-8`),renameSync(F,D)}catch(t){try{unlinkSync(F)}catch{}return{ok:!1,error:{code:`WRITE_ERROR`,message:`Failed to write template at ${relPathOf(e.projectDir,D)}: ${t.message}`}}}let L=[];return(e.frontmatter.description===void 0||typeof e.frontmatter.description!=`string`||e.frontmatter.description.length===0)&&L.push("Template frontmatter.description is missing — `description` disambiguates between similarly-named templates in the menu. Recommended but not required."),{ok:!0,path:relPathOf(e.projectDir,D),created:j,warnings:L}}function applyTemplateDelete(e){let t=validateInputs(e.projectDir,e.folder,e.name);if(!t.ok)return{ok:!1,error:t.error};let{templatesDir:S,okDir:w,filePath:E}=templatePaths(e.projectDir,t.folderRel,e.name),D=existsSync(E);if(D)try{unlinkSync(E)}catch(t){return{ok:!1,error:{code:`UNLINK_FAILED`,message:`Failed to delete template at ${relPathOf(e.projectDir,E)}: ${t.message}`}}}let O=!1,k=!1;if(existsSync(S)&&isEmpty(S))try{rmdirSync(S),O=!0}catch{}if(existsSync(w)&&isEmpty(w))try{rmdirSync(w),k=!0}catch{}return{ok:!0,path:relPathOf(e.projectDir,E),existed:D,cleanedEmpty:{templatesDir:O,okDir:k}}}function validateInputs(e,t,S){if(!isAbsolute(e))return{ok:!1,error:{code:`BAD_PROJECT_DIR`,message:`projectDir must be absolute`}};if(!NAME_RE.test(S))return{ok:!1,error:{code:`BAD_NAME`,message:`Template name must match /^[A-Za-z0-9_-]+$/ (got: ${JSON.stringify(S)}). Use letters, digits, underscores, or hyphens — no slashes, dots, or spaces.`}};let w=t.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``).replace(/^\.$/,``);if(w.includes(`..`))return{ok:!1,error:{code:`PATH_TRAVERSAL`,message:`Folder path may not contain "..": ${JSON.stringify(t)}`}};let E=w?resolve(e,w):e,D=resolve(e);return!E.startsWith(D+sep)&&E!==D?{ok:!1,error:{code:`PATH_ESCAPE`,message:`Resolved folder path escapes projectDir: ${E}`}}:{ok:!0,folderRel:w}}function validateTitle(e){return typeof e!=`string`||e.length===0?{ok:!1,error:{code:`TEMPLATE_TITLE_REQUIRED`,message:"Template frontmatter.title is required. `title` is the menu surface — agents pick templates by name+title; a title-less template is effectively invisible. Set a non-empty `title` and retry."}}:{ok:!0}}function validateSubstitutionAllowlist(e){let t=validateSubstitution(e);return t.length===0?{ok:!0}:{ok:!1,error:{code:`TEMPLATE_UNKNOWN_VARIABLE`,message:`Template body contains unknown substitution token(s): ${t.map(e=>`\`{{${e.token}}}\` at offset ${e.offset}`).join(`, `)}. v1 allowlist: \`{{date}}\`, \`{{user}}\`. Remove or rename the offending tokens and retry.`}}}function templatePaths(e,t,S){let w=t?join(e,t,`.ok`):join(e,`.ok`),E=join(w,`templates`);return{okDir:w,templatesDir:E,filePath:join(E,`${S}.md`)}}function relPathOf(e,t){return normalize(t.startsWith(e+sep)?t.slice(e.length+1):t).split(sep).join(`/`)}function serializeFrontmatter(e){let t={};return e.title!==void 0&&(t.title=e.title),e.description!==void 0&&(t.description=e.description),Array.isArray(e.tags)&&e.tags.length>0&&(t.tags=e.tags),Object.keys(t).length===0?``:(0,import_dist$1.stringify)(t)}function isEmpty(e){try{return readdirSync(e).length===0}catch{return!1}}const log$6=()=>getLogger(`http`);function successResponse(e,t,S,w,E={}){if(e.headersSent||e.writableEnded||e.destroyed){log$6().error({event:`api.success.double-write`,status:t,handler:E.handler},`successResponse called after headers already sent — suppressed`),apiErrorCounter().add(1,{type:`urn:ok:error:internal-server-error`,...E.handler?{handler:E.handler}:{}});return}let D=S.safeParse(w);if(!D.success){log$6().error({event:`api.success.malformed-body`,issues:D.error.issues,bodyKeys:typeof w==`object`&&w?Object.keys(w):null,handler:E.handler,originalStatus:t},`successResponse produced an invalid body for the supplied schema — emitting fallback`),errorResponse(e,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:E.handler});return}let O;try{O=JSON.stringify(D.data)}catch(S){log$6().error({event:`api.success.unserializable-body`,bodyKeys:typeof D.data==`object`&&D.data!==null?Object.keys(D.data):null,handler:E.handler,originalStatus:t,err:S},`successResponse parsed body is not JSON-serializable — emitting fallback`),errorResponse(e,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:E.handler});return}e.writeHead(t,{...E.extraHeaders,"Content-Type":`application/json`,"X-Content-Type-Options":`nosniff`}),e.end(O)}const INSTALLED_AGENTS_SCHEMES=[`claude`,`codex`,`cursor`],INSTALLED_AGENTS_PROBE_TIMEOUT_MS=2e3,MACOS_APP_NAMES={claude:[`Claude`],codex:[`Codex`,`OpenAI Codex`],cursor:[`Cursor`]};function createInstalledAgentsProbe(e){let t=new Map,S=e.now??Date.now,w=e.ttlMs??6e4;async function E(E){let D=t.get(E);if(D?.status===`resolved`&&D.expiresAt>S())return D.installed;if(D?.status===`inflight`)return D.promise;let O=(async()=>{try{let D=await e.probe(E);return t.set(E,{status:`resolved`,installed:D,expiresAt:S()+w}),D}catch{return t.set(E,{status:`resolved`,installed:!1,expiresAt:S()+w}),!1}})();return t.set(E,{status:`inflight`,promise:O}),O}async function D(){let e=await Promise.all(INSTALLED_AGENTS_SCHEMES.map(async e=>[e,await E(e)]));return Object.fromEntries(e)}return{probeAll:D,probeWithCache:E}}function isLocalWebHost(e){let t=e.headers.host;if(typeof t==`string`&&t.length>0)try{let{hostname:e}=new URL(`http://${t}/`);return isLoopbackHostname(e)}catch{}let S=e.headers.origin;if(typeof S==`string`&&S.length>0)try{return isLoopbackHostname(new URL(S).hostname)}catch{return!1}return!0}function isLoopbackHostname(e){return e===`localhost`||e===`127.0.0.1`||e===`[::1]`||e===`::1`}async function handleInstalledAgents(e,t,S){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`installed-agents`,extraHeaders:{Allow:`GET`}});return}try{successResponse(t,200,InstalledAgentsSuccessSchema,isLocalWebHost(e)?await S():Object.fromEntries(INSTALLED_AGENTS_SCHEMES.map(e=>[e,!0])),{handler:`installed-agents`})}catch(e){console.error(`[installed-agents]`,e),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`installed-agents`,cause:e})}}function createOsProbe(e,t=execFile){return S=>e===`darwin`?probeMacOs(S,t):e===`win32`?probeWindows(S,t):probeLinux(S,t)}function probeMacOs(e,t){let S=MACOS_APP_NAMES[e];function w(e){return new Promise(S=>{t(`osascript`,[`-e`,`id of app "${e}"`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},(e,t)=>{if(e){S(!1);return}S(t.trim().length>0)})})}return(async()=>{for(let e of S)if(await w(e))return!0;return!1})()}function probeWindows(e,t){return new Promise(S=>{t(`reg`,[`query`,`HKCR\\${e}`,`/ve`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},e=>{S(!e)})})}function probeLinux(e,t){return new Promise(S=>{t(`xdg-mime`,[`query`,`default`,`x-scheme-handler/${e}`],{timeout:INSTALLED_AGENTS_PROBE_TIMEOUT_MS,encoding:`utf-8`},(e,t)=>{if(e){S(!1);return}S(t.trim().length>0)})})}const MAX_BODY_BYTES=1048576,REQUEST_BODY_TIMEOUT_MS=3e4;function readRequestBody(e){return readBoundedJsonBody(e,{maxBytes:MAX_BODY_BYTES,timeoutMs:REQUEST_BODY_TIMEOUT_MS})}async function readBoundedJsonBody(e,t){let S=[],w=0,E=AbortSignal.timeout(t.timeoutMs),D=()=>e.destroy(new RequestBodyTimeoutError(t.timeoutMs));E.addEventListener(`abort`,D,{once:!0});try{for await(let E of e){if(w+=E.length,w>t.maxBytes)throw new PayloadTooLargeError(t.maxBytes);S.push(E)}return Buffer.concat(S)}finally{E.removeEventListener(`abort`,D)}}var PayloadTooLargeError=class extends Error{maxBytes;constructor(e){super(e===void 0?`Request body exceeded cap`:`Request body exceeded ${formatBytes(e)} cap`),this.name=`PayloadTooLargeError`,this.maxBytes=e}},RequestBodyTimeoutError=class extends Error{timeoutMs;constructor(e){super(e===void 0?`Request body read exceeded timeout`:`Request body read exceeded ${e}ms timeout`),this.name=`RequestBodyTimeoutError`,this.timeoutMs=e}};function formatBytes(e){return e>=1048576?`${(e/1048576).toFixed(0)} MB`:e>=1024?`${(e/1024).toFixed(0)} KB`:`${e} B`}function validateBody(e,t,S,w={}){let E=e.safeParse(t);if(E.success)return{ok:!0,value:E.data};let D=E.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`; `);return errorResponse(S,400,`urn:ok:error:invalid-request`,`Request body is invalid.`,{handler:w.handler,detail:D}),{ok:!1}}function withValidation(e,t,S={}){return async(w,E)=>{if(S.method!==void 0&&w.method!==S.method){errorResponse(E,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:S.handler,extraHeaders:{Allow:S.method}});return}if(S.preBodyGate!==void 0&&!S.preBodyGate(w,E)){!E.headersSent&&!E.writableEnded&&!E.destroyed&&errorResponse(E,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:S.handler,cause:Error(`preBodyGate returned false without writing a response`)});return}if(S.skipBodyParse){let D=validateBody(e,{},E,S);if(!D.ok)return;await t(w,E,D.value);return}let D;try{D=await readRequestBody(w)}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(E,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:S.handler,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(E,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:S.handler,cause:e});return}errorResponse(E,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:S.handler,cause:e});return}let O;try{O=D.length===0?{}:JSON.parse(D.toString(`utf8`))}catch(e){errorResponse(E,400,`urn:ok:error:invalid-request`,`Request body is not valid JSON.`,{handler:S.handler,cause:e});return}let k=validateBody(e,O,E,S);k.ok&&await t(w,E,k.value)}}function classifySpawnError(e){let t=e instanceof Error?e.message:String(e);return/ENOENT|EACCES|EPERM/.test(t)?{ok:!1,reason:`not-installed`}:{ok:!1,reason:`spawn-error`}}function spawnDetached(e,t,S){return new Promise(w=>{let E=!1,D=e=>{E||(E=!0,w(e))},O=setTimeout(()=>D({ok:!1,reason:`timeout`}),S);try{let S=spawn(e,[...t],{detached:!0,stdio:`ignore`,shell:!1});S.once(`error`,e=>{clearTimeout(O),D(classifySpawnError(e))}),S.once(`spawn`,()=>{if(!E){try{S.unref()}catch{}clearTimeout(O),D({ok:!0})}})}catch(e){console.warn(`[spawn-detached] synchronous spawn throw:`,e),clearTimeout(O),D(classifySpawnError(e))}})}const SPAWN_CURSOR_WHICH_TIMEOUT_MS=500,SPAWN_CURSOR_SPAWN_TIMEOUT_MS=2e3,SPAWN_CURSOR_MAX_BODY_BYTES=4*1024,SPAWN_CURSOR_BODY_READ_TIMEOUT_MS=5e3,HANDLER$1=`spawn-cursor`;function assertNeverSpawnReason(e){throw Error(`Unhandled spawn-cursor outcome.reason: ${String(e)}`)}async function handleSpawnCursor(e,t,S){if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:HANDLER$1,extraHeaders:{Allow:`POST`}});return}let w;try{w=await readBoundedJsonBody(e,{maxBytes:SPAWN_CURSOR_MAX_BODY_BYTES,timeoutMs:SPAWN_CURSOR_BODY_READ_TIMEOUT_MS})}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(t,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:HANDLER$1,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(t,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:HANDLER$1,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:HANDLER$1,cause:e});return}let E;try{E=JSON.parse(w.toString(`utf-8`))}catch(e){errorResponse(t,400,`urn:ok:error:invalid-request`,`Malformed JSON body.`,{handler:HANDLER$1,cause:e});return}let D=typeof E.path==`string`?E.path:``;if(!D){errorResponse(t,400,`urn:ok:error:invalid-request`,"Missing or empty `path` field.",{handler:HANDLER$1});return}if(!isPathWithinDir(D,S.contentDir,S.platform)){errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER$1});return}let O=await(S.resolveCursorBinary??resolveCursorBinaryDefault)(SPAWN_CURSOR_WHICH_TIMEOUT_MS);if(!O){errorResponse(t,422,`urn:ok:error:cursor-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER$1});return}let k=resolveCursorSpawnInvocation(O,D,S.platform),j=await(S.spawnDetached??spawnDetached)(k.exec,k.args,SPAWN_CURSOR_SPAWN_TIMEOUT_MS);if(j.ok){successResponse(t,200,SpawnCursorSuccessSchema,{},{handler:HANDLER$1});return}switch(j.reason){case`not-installed`:errorResponse(t,422,`urn:ok:error:cursor-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER$1});return;case`timeout`:errorResponse(t,504,`urn:ok:error:cursor-spawn-timeout`,`Cursor spawn exceeded the deadline.`,{handler:HANDLER$1});return;case`spawn-error`:errorResponse(t,502,`urn:ok:error:cursor-spawn-failed`,`Cursor spawn failed.`,{handler:HANDLER$1});return;case`invalid-path`:errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER$1});return;default:return assertNeverSpawnReason(j.reason)}}const CURSOR_BUNDLE_PATHS_BY_PLATFORM={darwin:[()=>`/Applications/Cursor.app/Contents/Resources/app/bin/cursor`,e=>`${e}/Applications/Cursor.app/Contents/Resources/app/bin/cursor`],win32:[e=>`${e}\\AppData\\Local\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd`,()=>`C:\\Program Files\\Cursor\\resources\\app\\bin\\cursor.cmd`]};async function resolveCursorBinaryDefault(e){let t=CURSOR_BUNDLE_PATHS_BY_PLATFORM[process.platform];if(t&&t.length>0){let e=homedir();for(let S of t){let t=S(e);try{return await access(t,constants.X_OK),t}catch(e){let S=e?.code;S!==`ENOENT`&&S!==`EACCES`&&S!==`EPERM`&&console.warn(`[spawn-cursor] unexpected fs.access error on bundle probe:`,S,t)}}}return new Promise(t=>{execFile(process.platform===`win32`?`where`:`which`,[`cursor`],{timeout:e,encoding:`utf-8`},(e,S)=>{if(e){t(null);return}let w=S.split(/\r?\n/)[0]?.trim();t(w&&w.length>0?w:null)})})}function resolveCursorSpawnInvocation(e,t,S){return S===`darwin`&&/\.app\/?$/.test(e)?{exec:`/usr/bin/open`,args:[`-a`,e.replace(/\/$/,``),t]}:{exec:e,args:[t]}}function isPathWithinDir(e,t,S){if(!e||typeof e!=`string`||e.includes(`\0`)||!t||typeof t!=`string`)return!1;if(S===`win32`){if(!/^([a-zA-Z]:[\\/]|\\\\)/.test(e)||!/^([a-zA-Z]:[\\/]|\\\\)/.test(t))return!1}else if(!e.startsWith(`/`)||!t.startsWith(`/`))return!1;let w=S===`win32`?win32:posix;try{let E=w.resolve(e),D=w.resolve(t);if(S===`win32`){let e=w.parse(E).root.toLowerCase(),t=w.parse(D).root.toLowerCase();if(!e||!t||e!==t)return!1}if(E===D)return!0;let O=w.relative(D,E);return O===``||O===`.`?!0:!(O===`..`||O.startsWith(`..${w.sep}`)||S===`win32`&&(/^[a-zA-Z]:[\\/]/.test(O)||O.startsWith(`\\\\`))||S!==`win32`&&O.startsWith(`/`))}catch(e){return console.warn(`[spawn-cursor] unexpected path-resolution error:`,e),!1}}const HANDLER=`handoff`,HANDOFF_MAX_BODY_BYTES=4*1024,HANDOFF_BODY_READ_TIMEOUT_MS=5e3,SPAWN_TIMEOUT_MS=2e3,WHICH_TIMEOUT_MS=500,QUIT_SETTLE_MS=3e3,APP_BUNDLE_SETTLE_MS=5e3,CURSOR_SETTLE_MS=1500,RECIPES={"claude-cowork":{type:`app-bundle`,appName:`Claude`,urlScheme:`claude:`,quitFirst:!1},"claude-code":{type:`app-bundle`,appName:`Claude`,urlScheme:`claude:`,quitFirst:!1},codex:{type:`app-bundle`,appName:`Codex`,urlScheme:`codex:`,quitFirst:!0},cursor:{type:`cli-binary`,binaryName:`cursor`,urlScheme:`cursor:`}},TARGET_VALUES=Object.keys(RECIPES),HandoffRequestSchema=object$1({target:_enum(TARGET_VALUES),url:string$2().min(1).max(4096),workspacePath:string$2().optional()}),HandoffSuccessSchema=object$1({}).loose();function defaultSleep(e){return new Promise(t=>setTimeout(t,e))}async function handleHandoffDispatch(e,t,S){if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:HANDLER,extraHeaders:{Allow:`POST`}});return}if(S.platform!==`darwin`){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Handoff is currently macOS-only.`,{handler:HANDLER});return}let w;try{w=await readBoundedJsonBody(e,{maxBytes:HANDOFF_MAX_BODY_BYTES,timeoutMs:HANDOFF_BODY_READ_TIMEOUT_MS})}catch(e){if(e instanceof PayloadTooLargeError){errorResponse(t,413,`urn:ok:error:payload-too-large`,`Payload too large.`,{handler:HANDLER,cause:e});return}if(e instanceof RequestBodyTimeoutError){errorResponse(t,408,`urn:ok:error:request-timeout`,`Request body read timed out.`,{handler:HANDLER,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read request body.`,{handler:HANDLER,cause:e});return}let E;try{E=JSON.parse(w.toString(`utf-8`))}catch(e){errorResponse(t,400,`urn:ok:error:invalid-request`,`Malformed JSON body.`,{handler:HANDLER,cause:e});return}let D=HandoffRequestSchema.safeParse(E);if(!D.success){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid request body.`,{handler:HANDLER});return}let{target:O,url:k,workspacePath:j}=D.data,F=RECIPES[O];if(!k.startsWith(F.urlScheme)){errorResponse(t,400,`urn:ok:error:invalid-request`,`URL scheme must be ${F.urlScheme} for target ${O}.`,{handler:HANDLER});return}let L=S.sleep??defaultSleep,B=S.spawnDetached??spawnDetached;if(F.type===`app-bundle`){F.quitFirst&&(await B(`/usr/bin/osascript`,[`-e`,`tell application "${F.appName}" to quit`],SPAWN_TIMEOUT_MS).catch(()=>void 0),await L(QUIT_SETTLE_MS));let e=await B(`/usr/bin/open`,[`-a`,F.appName],SPAWN_TIMEOUT_MS);if(!e.ok){emitSpawnFailure(t,O,e.reason);return}await L(APP_BUNDLE_SETTLE_MS);let S=await B(`/usr/bin/open`,[k],SPAWN_TIMEOUT_MS);if(!S.ok){emitSpawnFailure(t,O,S.reason);return}successResponse(t,200,HandoffSuccessSchema,{},{handler:HANDLER});return}if(!j){errorResponse(t,400,`urn:ok:error:invalid-request`,`workspacePath is required for cursor handoff.`,{handler:HANDLER});return}if(!isPathWithinDir(j,S.contentDir,S.platform)){errorResponse(t,403,`urn:ok:error:path-escape`,`Path escapes the content directory.`,{handler:HANDLER});return}let H=await(S.resolveCursorBinary??resolveCursorBinaryDefault)(WHICH_TIMEOUT_MS);if(!H){errorResponse(t,422,`urn:ok:error:handoff-target-not-installed`,`Cursor CLI not found on this machine.`,{handler:HANDLER,extensions:{target:`cursor`}});return}let q=resolveCursorSpawnInvocation(H,j,S.platform),J=await B(q.exec,q.args,SPAWN_TIMEOUT_MS);if(!J.ok){emitSpawnFailure(t,O,J.reason);return}await L(CURSOR_SETTLE_MS);let Y=await B(`/usr/bin/open`,[k],SPAWN_TIMEOUT_MS);if(!Y.ok){emitSpawnFailure(t,O,Y.reason);return}successResponse(t,200,HandoffSuccessSchema,{},{handler:HANDLER})}function emitSpawnFailure(e,t,S){switch(S){case`not-installed`:errorResponse(e,422,`urn:ok:error:handoff-target-not-installed`,`Required binary or application not found.`,{handler:HANDLER,extensions:{target:t}});return;case`timeout`:errorResponse(e,504,`urn:ok:error:handoff-spawn-timeout`,`Handoff spawn exceeded the deadline.`,{handler:HANDLER,extensions:{target:t}});return;case`spawn-error`:errorResponse(e,502,`urn:ok:error:handoff-spawn-failed`,`Handoff spawn failed.`,{handler:HANDLER,extensions:{target:t}});return;default:assertNeverReason(S)}}function assertNeverReason(e){throw Error(`Unhandled spawn reason: ${String(e)}`)}const FIXED_HUB_BASENAMES=[`INDEX`,`README`,`REPORT`,`SPEC`],MAX_CANDIDATES=3;function findHubCandidates(e,t){let S=[],w=new Set,E=t=>{!t||w.has(t)||t!==e&&(w.add(t),S.push(t))},D=buildLowerDocNameIndex(t),O=parentFolder(e);for(;;){for(let e of FIXED_HUB_BASENAMES)if(E(lookup$1(t,D,joinDocName(O,e))),S.length>=MAX_CANDIDATES)return S;let e=O===``?null:basename$1(O);if(e&&(E(lookup$1(t,D,joinDocName(O,e))),S.length>=MAX_CANDIDATES))return S;if(O===``)break;O=parentFolder(O)}return S}function lookup$1(e,t,S){return e.has(S)?S:t.get(S.toLowerCase())??null}function buildLowerDocNameIndex(e){let t=new Map;for(let S of e.keys()){let e=S.toLowerCase();t.has(e)||t.set(e,S)}return t}function parentFolder(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}function basename$1(e){let t=e.lastIndexOf(`/`);return t<0?e:e.slice(t+1)}function joinDocName(e,t){return e===``?t:`${e}/${t}`}function splitFrontmatterLines(e){return e?e.replace(/^---\r?\n/,``).replace(/\r?\n---(?:\r?\n)?$/,``).split(/\r?\n/):[]}function normalizeFrontmatterScalar(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1).trim():t}function extractFrontmatterScalar(e,t){let S=`${t}:`;for(let t of splitFrontmatterLines(e))if(t.startsWith(S))return normalizeFrontmatterScalar(t.slice(S.length))||null;return null}function parseInlineAliases(e){let t=[],S=``,w=null;for(let E of e){if(w){S+=E,E===w&&(w=null);continue}if(E===`"`||E===`'`){w=E,S+=E;continue}if(E===`,`){let e=normalizeFrontmatterScalar(S);e&&t.push(e),S=``;continue}S+=E}let E=normalizeFrontmatterScalar(S);return E&&t.push(E),t}function dedupeExact(e){let t=[],S=new Set;for(let w of e)!w||S.has(w)||(S.add(w),t.push(w));return t}function extractPageAliases(e){let{frontmatter:t}=stripFrontmatter(e);if(!t)return[];let S=splitFrontmatterLines(t);for(let e=0;e<S.length;e+=1){let t=S[e]?.match(/^aliases:\s*(.*)$/);if(!t)continue;let w=t[1]?.trim()??``;if(w){if(w.startsWith(`[`)&&w.endsWith(`]`))return dedupeExact(parseInlineAliases(w.slice(1,-1)));let e=normalizeFrontmatterScalar(w);return e?[e]:[]}let E=[];for(let t=e+1;t<S.length;t+=1){let e=S[t];if(e?.trim()){if(/^\s*-\s+/.test(e)){let t=normalizeFrontmatterScalar(e.replace(/^\s*-\s+/,``));t&&E.push(t);continue}if(/^[^\s][^:]*:\s*/.test(e))break;break}}return dedupeExact(E)}return[]}function extractPageTitle(e,t){let{frontmatter:S,body:w}=stripFrontmatter(e),E=extractFrontmatterScalar(S,`title`);if(E)return E;let D=w.match(/^# (.+)$/m);return D?D[1].trim():t}const ICON_VALUE_LENGTH_CAP=2048;function extractPageIcon(e){let{frontmatter:t}=stripFrontmatter(e),S=extractFrontmatterScalar(t,`icon`);if(!(!S||S.length>ICON_VALUE_LENGTH_CAP))return S}function parseFrontmatterMetadata(e){return e?.trim()?{cluster:extractFrontmatterScalar(e,`cluster`)??void 0,category:extractFrontmatterScalar(e,`category`)??void 0,tags:extractFrontmatterArray(e,`tags`)}:{cluster:void 0,category:void 0,tags:void 0}}function extractFrontmatterArray(e,t){let S=`${t}:`,w=splitFrontmatterLines(e);for(let e=0;e<w.length;e+=1){let t=w[e];if(!t?.startsWith(S))continue;let E=t.slice(S.length).trim();if(E){if(E.startsWith(`[`)&&E.endsWith(`]`)){let e=parseInlineAliases(E.slice(1,-1));return e.length>0?e:void 0}let e=normalizeFrontmatterScalar(E);return e?[e]:void 0}let D=[];for(let t=e+1;t<w.length;t+=1){let e=w[t];if(e?.trim()){if(/^\s*-\s+/.test(e)){let t=normalizeFrontmatterScalar(e.replace(/^\s*-\s+/,``));t&&D.push(t);continue}if(/^[^\s][^:]*:\s*/.test(e))break;break}}return D.length>0?D:void 0}}function extractPageIdentity(e,t){let S=extractPageTitle(e,t),w=extractPageAliases(e),E=dedupeExact([S,...w]),D=[],O=new Set;for(let e of E){let t=toWikiLinkSlug(e);!t||O.has(t)||(O.add(t),D.push(t))}return{docName:t,title:S,aliases:w,matchLabels:E,normalizedMatchLabels:D}}const SHARE_BASE_URL=`https://openknowledge.ai/d/`,SHARE_CONSTRUCT_URL_HANDLER_TAG=`share-construct-url`;function isValidShareDocPath(e){if(e.length===0||e.startsWith(`/`)||e.startsWith(`\\`))return!1;for(let t of e.split(/[/\\]/))if(t===`..`||t===`.git`||t.length===0)return!1;return!0}function buildGitHubBlobUrl(e,t,S,w){return`https://github.com/${e}/${t}/blob/${encodeURIComponent(S)}/${w.split(`/`).map(encodeURIComponent).join(`/`)}`}function emitShareConstructUrlLog(e,t){let S=t===void 0?``:` branch_exists=${t}`;console.log(`[share] action=construct-url result=${e}${S}`)}function resolveGitDir$1(e){let t=resolve(e,`.git`);if(!existsSync(t))return null;let S;try{S=statSync(t)}catch{return null}if(S.isDirectory())return t;if(S.isFile()){let S;try{S=readFileSync(t,`utf-8`)}catch{return null}let w=/^gitdir:\s*(.+)$/m.exec(S.trim());if(!w)return null;let E=w[1].trim(),D=isAbsolute(E)?E:resolve(e,E);return existsSync(D)?D:null}return null}function readGitHeadBranch(e){let t=resolveGitDir$1(e);if(!t)return null;let S=join(t,`HEAD`);if(!existsSync(S))return null;let w;try{w=readFileSync(S,`utf-8`)}catch{return null}let E=/^ref:\s*refs\/heads\/(.+)$/.exec(w.trim());return E?E[1]:null}function stripCommentAndTrim(e){let t=e.indexOf(`#`),S=e.indexOf(`;`),w=-1;return t>=0&&S>=0?w=Math.min(t,S):t>=0?w=t:S>=0&&(w=S),(w===-1?e:e.slice(0,w)).trim()}function extractOriginUrl(e){let t=!1;for(let S of e.split(/\r?\n/)){let e=stripCommentAndTrim(S);if(e.length===0)continue;if(e.startsWith(`[`)){t=/^\[\s*remote\s+["']origin["']\s*\]$/.test(e);continue}if(!t)continue;let w=/^url\s*=\s*(.+)$/.exec(e);if(!w)continue;let E=w[1].trim();if((E.startsWith(`"`)&&E.endsWith(`"`)||E.startsWith(`'`)&&E.endsWith(`'`))&&(E=E.slice(1,-1)),E.length>0)return E}return null}function parseGitHubOriginUrl(e){let t=e.trim();if(!t)return null;let S=/^https?:\/\/(?:www\.)?github\.com\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t);return S||(S=/^ssh:\/\/(?:[\w.-]+@)?github\.com(?::\d+)?\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t),S)||(S=/^[\w.-]+@github\.com:([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?$/.exec(t),S)||(S=/^git:\/\/github\.com\/([\w.\-~%]+)\/([\w.\-~%]+?)(?:\.git)?\/?$/.exec(t),S)?{owner:S[1],repo:S[2]}:null}function readParsedOrigin(e){let t=resolveGitDir$1(e);if(!t)return null;let S=join(t,`config`);if(!existsSync(S))return null;let w;try{w=readFileSync(S,`utf-8`)}catch{return null}let E=extractOriginUrl(w);return E?{originUrl:E,github:parseGitHubOriginUrl(E)}:null}function readOriginGitHubRepo(e){let t=readParsedOrigin(e);return t?t.github?{kind:`ok`,owner:t.github.owner,repo:t.github.repo}:{kind:`non-github`}:{kind:`no-remote`}}function readSyncRemoteInfo(e){let t=readParsedOrigin(e);return t?t.github?{label:`${t.github.owner}/${t.github.repo}`,webUrl:`https://github.com/${t.github.owner}/${t.github.repo}`}:{label:labelFromNonGitHubUrl(t.originUrl),webUrl:null}:null}function labelFromNonGitHubUrl(e){let t=e.trim().replace(/\.git$/,``),S=/^[\w.-]+@([^:/]+):(.+)$/.exec(t);if(S)return`${S[1]}/${S[2]}`;let w=/^[a-z][a-z0-9+.-]*:\/\/(?:[^@/]+@)*(.+)$/i.exec(t);return w?w[1]:t}function branchExistsOnOrigin(e,t){let S=resolveGitDir$1(e);if(!S)return!1;if(existsSync(join(S,`refs`,`remotes`,`origin`,t)))return!0;let w=join(S,`packed-refs`);if(!existsSync(w))return!1;let E;try{E=readFileSync(w,`utf-8`)}catch{return!1}let D=`refs/remotes/origin/${t}`;for(let e of E.split(/\r?\n/)){let t=e.trim();if(t.length===0||t.startsWith(`#`)||t.startsWith(`^`))continue;let S=t.split(/\s+/);if(S.length===2&&S[1]===D)return!0}return!1}const SHARE_PUBLISH_OWNERS_HANDLER_TAG=`share-publish-owners`,SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG=`share-publish-name-check`,SHARE_PUBLISH_HANDLER_TAG=`share-publish`,SHARE_PUBLISH_OWNERS_KEY=`/api/share/publish/owners`,SHARE_PUBLISH_NAME_CHECK_KEY=`/api/share/publish/name-check`,SHARE_PUBLISH_KEY=`/api/share/publish`,SHARE_PUBLISH_TIMEOUT_MS=3e4;function isValidShareRepoName(e){return e.length===0||e.length>100||e.startsWith(`.`)||e.startsWith(`-`)||/^-+$/.test(e)?!1:/^[A-Za-z0-9._-]+$/.test(e)}function isValidShareOwnerName(e){return e.length===0||e.length>39||e.startsWith(`-`)||e.endsWith(`-`)?!1:/^[A-Za-z0-9-]+$/.test(e)}function pickTerminalJsonLine(e){let t=e.split(`
|
|
1249
1249
|
`).map(e=>e.trim()).filter(Boolean);for(let e=t.length-1;e>=0;e--)try{let S=JSON.parse(t[e]);if(S&&typeof S==`object`&&!Array.isArray(S))return S}catch{}return null}function parseOwnersEvent(e){if(e===null)return{ok:!1,error:`network`};if(e.type===`owners`&&Array.isArray(e.owners)){let t=[];for(let S of e.owners){if(!S||typeof S!=`object`)continue;let e=S,w=typeof e.login==`string`?e.login:null,E=e.kind===`user`||e.kind===`org`?e.kind:null;if(w===null||E===null)continue;let D=typeof e.avatarUrl==`string`?e.avatarUrl:void 0;t.push({login:w,kind:E,...D?{avatarUrl:D}:{}})}return{ok:!0,owners:t}}return e.type===`error`?{ok:!1,error:isOwnersErrorCode(e.code)?e.code:`network`}:{ok:!1,error:`network`}}function isOwnersErrorCode(e){return e===`auth-required`||e===`network`}function parseNameCheckEvent(e){return e===null?{ok:!1,error:`network`}:e.type===`name-check`&&typeof e.available==`boolean`?{ok:!0,available:e.available}:e.type===`error`?{ok:!1,error:isOwnersErrorCode(e.code)?e.code:`network`}:{ok:!1,error:`network`}}const PUBLISH_ERROR_CODES=new Set([`name-conflict`,`saml-sso`,`auth-required`,`push-failed`,`init-failed`,`network`,`no-project`]);function isPublishErrorCode(e){return typeof e==`string`&&PUBLISH_ERROR_CODES.has(e)}function parsePublishEvent(e){if(e===null)return{ok:!1,error:`network`};if(e.type===`publish`){let t=typeof e.ownerLogin==`string`?e.ownerLogin:null,S=typeof e.repoName==`string`?e.repoName:null,w=typeof e.cloneUrl==`string`?e.cloneUrl:null,E=typeof e.defaultBranch==`string`?e.defaultBranch:null;return t!==null&&S!==null&&w!==null&&E!==null?{ok:!0,ownerLogin:t,repoName:S,cloneUrl:w,defaultBranch:E}:{ok:!1,error:`network`}}return e.type===`error`?{ok:!1,error:isPublishErrorCode(e.code)?e.code:`network`}:{ok:!1,error:`network`}}function emitSharePublishLog(e,t,S){let w=[`action=${e}`,`result=${t}`];S?.count!==void 0&&w.push(`count=${S.count}`),S?.available!==void 0&&w.push(`available=${S.available}`),console.log(`[share] ${w.join(` `)}`)}function redactShareSubprocessStderr(e){return e.replace(/(https?:\/\/)([^:@\s/]+):([^@\s/]+)@/g,`$1$2:***@`)}const MAX_ZIP_BYTES=102400,BUNDLE_SKILL_NAME={discovery:`open-knowledge-discovery`,project:`open-knowledge`},DESKTOP_SKILLS_REL=`Open Knowledge.app/Contents/Resources/cli/dist/assets/skills`;function resolveBundledSkillDir(e,t={}){let S=t.platform??process.platform,w=t.checkDesktop??!1,E=t.home??homedir(),D=[];w&&S===`darwin`&&(D.push(join(`/Applications`,DESKTOP_SKILLS_REL,e)),D.push(join(E,`Applications`,DESKTOP_SKILLS_REL,e))),D.push(fileURLToPath(new URL(`../dist/assets/skills/${e}`,import.meta.url))),D.push(fileURLToPath(new URL(`../assets/skills/${e}`,import.meta.url))),D.push(fileURLToPath(new URL(`./assets/skills/${e}`,import.meta.url)));for(let e of D)if(existsSync(e))return e;throw Error(`Bundled skill asset directory not found for bundle '${e}'. Tried: ${D.join(`, `)}. This usually means the CLI build did not copy packages/server/assets into dist/assets. Run \`cd packages/cli && bun run build\` before publishing.`)}async function*walkFiles(e,t=e){let S=await readdir(e,{withFileTypes:!0});for(let w of S){let S=join(e,w.name);w.isDirectory()?yield*walkFiles(S,t):w.isFile()&&(yield relative(t,S))}}function computeWrapperFolderName(e,t=basename){return t(e)||`open-knowledge`}function toPosixZipPath(e,t=sep){return t===`/`?e:e.split(t).join(`/`)}async function zipDirectory(e,t,S=computeWrapperFolderName(e)){let w=new import_yazl.ZipFile;w.addEmptyDirectory(`${S}/`);let E=[];for await(let t of walkFiles(e))E.push(t);E.sort();for(let t of E){let E=join(e,t),D=`${S}/${toPosixZipPath(t)}`;w.addFile(E,D)}w.end(),await new Promise((e,S)=>{let E=createWriteStream(t);w.outputStream.pipe(E),E.on(`close`,()=>e()),E.on(`error`,S),w.outputStream.on(`error`,S)})}async function sha256OfFile(e){return new Promise((t,S)=>{let w=createHash(`sha256`),E=createReadStream(e);E.on(`data`,e=>w.update(e)),E.on(`end`,()=>t(w.digest(`hex`))),E.on(`error`,S)})}function extractMetadataVersion(e){let t=e.indexOf(`
|
|
1250
1250
|
---`,4);if(!e.startsWith(`---
|
|
1251
1251
|
`)||t<0)return;let S=e.slice(4,t),w=S.search(/^metadata:/m);if(w<0)return;let E=S.slice(w).split(`
|
|
@@ -2239,7 +2239,7 @@ description: When the agent does scheduled work: daily briefings, end-of-day dos
|
|
|
2239
2239
|
`)[0]??``).split(/\s+/)[2];if(S){let w=await e.raw(`cat-file`,`-p`,S);t.writeHead(200,{"Content-Type":`text/markdown`,"X-Content-Type-Options":`nosniff`}),t.end(w);return}}}catch(e){console.warn(`[rescue] timeline-ref fallback failed:`,e)}errorResponse(t,404,`urn:ok:error:not-found`,`Not found.`,{handler:`rescue-get`})}let Os=withValidation(CreatePageRequestSchema,async(e,t,S)=>{try{let e=extractActorIdentity(S,fe);if(e.kind===`invalid-summary`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:`create-page`});return}let E=S.path;if(!isSupportedDocFile(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`path must end with .md or .mdx.`,{handler:`create-page`});return}if(E.includes(`..`)||E.startsWith(`/`)||E.includes(`\0`)||E.includes(`\\`)){errorResponse(t,400,`urn:ok:error:path-escape`,`Invalid path.`,{handler:`create-page`,detail:`path must not contain .. or start with /`});return}let O=resolve(w),k=resolve(O,E);if(!k.startsWith(`${O}/`)&&k!==O){errorResponse(t,400,`urn:ok:error:path-escape`,`path must not escape content directory.`,{handler:`create-page`});return}let j=stripDocExtension(E);if(isSystemDoc(j)||isConfigDoc(j)){errorResponse(t,400,`urn:ok:error:reserved-doc-name`,`'${j}' is a reserved document name.`,{handler:`create-page`});return}let F=typeof S.template==`string`?S.template.trim():``,L=``,B;if(F.length>0){if(!/^[A-Za-z0-9_-]+$/.test(F)){errorResponse(t,400,`urn:ok:error:invalid-request`,`Template name must match [A-Za-z0-9_-]+.`,{handler:`create-page`});return}let S=E.includes(`/`)?E.slice(0,E.lastIndexOf(`/`)):``,w=resolveTemplatesAvailable(O,S),D=w.find(e=>e.name===F);if(!D){let e=w.length===0?`(none)`:w.map(e=>`"${e.name}" (${e.scope})`).join(`, `);errorResponse(t,400,`urn:ok:error:invalid-request`,`Template "${F}" does not resolve for folder "${S||`(root)`}". Available: ${e}`,{handler:`create-page`});return}let k=resolve(O,D.path),j;try{j=readFileSync(k,`utf-8`)}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read template at ${D.path}.`,{handler:`create-page`,cause:e});return}let{body:H}=stripFrontmatter(j),q=e.kind===`agent`||e.kind===`principal`?e.displayName??``:``;L=applySubstitution(H,{date:todayIsoUtc(),user:q}),B=D.scope}mkdirSync(dirname(k),{recursive:!0});try{writeFileSync(k,L,{encoding:`utf-8`,flag:`wx`})}catch(e){if(isAlreadyExistsError(e)){errorResponse(t,409,`urn:ok:error:doc-already-exists`,`File already exists.`,{handler:`create-page`,cause:e});return}throw e}let H=stripDocExtension(E);switch(ye?.delete(H),me&&me.incrementMdDir(dirname(H)),registerWrite(k,contentHash(L)),e.kind){case`agent`:case`principal`:recordContributor(H,e.writerId,e.displayName,e.colorSeed,void 0,e.actor);break;case`anonymous`:break;default:throw Error(`Unhandled actor kind in handleCreatePage: ${String(e.kind)}`)}let q=typeof D==`function`?D():null;q instanceof Map&&updateFileIndex({kind:`create`,path:k,docName:H,content:L},q),ee&&(ee.updateDocumentFromMarkdown(H,L),ee.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist create-page cache for ${H}:`,e)}),ne?.(`backlinks`),ne?.(`graph`)),ne?.(`files`),B!==void 0&&console.warn(JSON.stringify({event:`template-instantiate`,templateName:F,templateScope:B,docName:H})),successResponse(t,200,CreatePageSuccessSchema,{docName:H},{handler:`create-page`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to create page.`,{handler:`create-page`,cause:e})}},{handler:`create-page`,method:`POST`}),ks=withValidation(CreateFolderRequestSchema,async(e,t,S)=>{try{if(extractActorIdentity(S,fe).kind===`invalid-summary`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:`create-folder`});return}let e=S.path;if(!isValidRelativeContentPath(e)){errorResponse(t,400,`urn:ok:error:invalid-request`,`path must be a relative content path.`,{handler:`create-folder`});return}if(e===`.ok`||e.startsWith(`.ok/`)){errorResponse(t,400,`urn:ok:error:reserved-doc-name`,`'.ok' is a reserved directory.`,{handler:`create-folder`});return}if(me?.isDirExcluded(e)){errorResponse(t,400,`urn:ok:error:invalid-request`,`Destination folder is excluded by the workspace content config.`,{handler:`create-folder`});return}let E=resolveContentEntryPath(w,`folder`,e);if(existsSync(E)){errorResponse(t,409,`urn:ok:error:doc-already-exists`,`Folder already exists.`,{handler:`create-folder`});return}tracedMkdirSync(E,{recursive:!0}),Me(e),ne?.(`files`),successResponse(t,200,CreateFolderSuccessSchema,{path:e},{handler:`create-folder`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to create folder.`,{handler:`create-folder`,cause:e})}},{handler:`create-folder`,method:`POST`}),As=withValidation(DuplicatePathRequestSchema,async(e,S,E)=>{try{let e=extractActorIdentity(E,fe);if(e.kind===`invalid-summary`){errorResponse(S,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:`duplicate-path`});return}let{kind:O}=E,k=O===`file`?stripDocExtension(E.path):E.path;if(!isValidRelativeContentPath(k)){errorResponse(S,400,`urn:ok:error:invalid-request`,`path must be a relative content path.`,{handler:`duplicate-path`});return}if(k===`.ok`||k.startsWith(`.ok/`)||O===`file`&&(isSystemDoc(k)||isConfigDoc(k))||O===`folder`&&isReservedSyntheticFolderPath(k)){errorResponse(S,400,`urn:ok:error:reserved-doc-name`,`Reserved paths cannot be duplicated.`,{handler:`duplicate-path`});return}O===`file`&&probeAndRegisterSourceFileExtension(w,k);let j=resolveContentEntryPath(w,O,k);if(!existsSync(j)){if(O===`file`){let e=resolveContentEntryPath(w,`folder`,k);if(existsSync(e)&&statSync(e).isDirectory()){errorResponse(S,400,`urn:ok:error:invalid-request`,`Target path is not a ${O}.`,{handler:`duplicate-path`});return}}errorResponse(S,404,`urn:ok:error:doc-not-found`,`${O} does not exist.`,{handler:`duplicate-path`});return}let F=statSync(j);if(O===`file`&&!F.isFile()||O===`folder`&&!F.isDirectory()){errorResponse(S,400,`urn:ok:error:invalid-request`,`Target path is not a ${O}.`,{handler:`duplicate-path`});return}let L=O===`file`?[k]:listAffectedDocNames(D(),O,k),B=ce?.(),H=new Set(B?B.getConflicts().map(e=>e.file):[]);for(let e of L){let w=stripDocExtension(e),E=t.documents.get(w),D=`${w}${getDocExtension(w)}`,O=E!==void 0&&isDocInConflict(E),k=H.has(D);if(O||k){respondDocInConflict(S,new DocInConflictError({file:D}),`duplicate-path`);return}}let q=typeof D==`function`?D():null,J,Y=[];if(O===`file`){let e=extname(j);if(J=nextAvailableDuplicateDocName(w,k).docName,isSystemDoc(J)||isConfigDoc(J)||me?.isExcluded(`${J}${e}`)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Duplicated document destination is excluded by the project content config.`,{handler:`duplicate-path`});return}let t=resolveDuplicateDocPath(w,J,e),E=readFileSync(j,`utf-8`),D=dirname(t),O=existsSync(D);try{tracedMkdirSync(D,{recursive:!0}),tracedWriteFileSync(t,E,{encoding:`utf-8`,flag:`wx`})}catch(e){if(isAlreadyExistsError(e)){errorResponse(S,409,`urn:ok:error:doc-already-exists`,`A file at the duplicate destination already exists.`,{handler:`duplicate-path`,cause:e});return}if(!O)try{tracedRmdirSync(D)}catch(e){let t=e.code;t!==`ENOENT`&&t!==`ENOTEMPTY`&&console.warn(`[duplicate-path] failed to clean duplicate parent directory:`,{destinationDir:D,err:e})}throw e}let F=!1;try{registerDocExtension(J,e),ye?.delete(J),me&&(me.incrementMdDir(dirname(J)),F=!0),registerWrite(t,contentHash(E)),q instanceof Map&&updateFileIndex({kind:`create`,path:t,docName:J,content:E},q),ee?.updateDocumentFromMarkdown(J,E),Y=[J]}catch(e){try{tracedRmSync(t,{force:!0})}catch(e){console.warn(`[duplicate-path] failed to clean partial file duplicate:`,{destinationPath:t,err:e})}throw forgetDocExtension(J),me&&F&&me.decrementMdDir(dirname(J)),q instanceof Map&&updateFileIndex({kind:`delete`,path:t,docName:J},q),e}}else{if(J=nextAvailableDuplicateFolderPath(w,k).folderPath,me?.isDirExcluded(J)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Duplicated folder destination is excluded by the project content config.`,{handler:`duplicate-path`});return}let e=resolveContentEntryPath(w,`folder`,J);try{tracedCpSync(j,e,{recursive:!0,errorOnExist:!0,force:!1})}catch(e){if(isAlreadyExistsError(e)){errorResponse(S,409,`urn:ok:error:doc-already-exists`,`A folder at the duplicate destination already exists.`,{handler:`duplicate-path`,cause:e});return}throw e}try{for(let e of collectFolderPaths(w,J))Me(e);let e=collectMarkdownCopies(w,J);Y=e.map(e=>e.docName);for(let t of e){let e=extname(t.fullPath);registerDocExtension(t.docName,e),ye?.delete(t.docName),me&&me.incrementMdDir(dirname(t.docName)),registerWrite(t.fullPath,contentHash(t.content)),q instanceof Map&&updateFileIndex({kind:`create`,path:t.fullPath,docName:t.docName,content:t.content},q),ee?.updateDocumentFromMarkdown(t.docName,t.content)}}catch(t){try{tracedRmSync(e,{recursive:!0,force:!0})}catch(t){console.warn(`[duplicate-path] failed to clean partial folder duplicate:`,{destinationPath:e,err:t})}throw t}}switch(e.kind){case`agent`:case`principal`:for(let t of Y)recordContributor(t,e.writerId,e.displayName,e.colorSeed,void 0,e.actor);break;case`anonymous`:break;default:throw Error(`Unhandled actor kind in handleDuplicatePath: ${String(e.kind)}`)}ee&&Y.length>0&&(ee.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist duplicate-path cache:`,e)}),ne?.(`backlinks`),ne?.(`graph`)),ne?.(`files`),successResponse(S,200,DuplicatePathSuccessSchema,{kind:O,path:J,duplicatedDocNames:Y},{handler:`duplicate-path`})}catch(e){if(e instanceof DuplicateNameExhaustedError){errorResponse(S,409,`urn:ok:error:doc-already-exists`,`All available duplicate name slots are occupied for this path.`,{handler:`duplicate-path`,cause:e});return}let t=classifyDuplicatePathFilesystemProblem(e);if(t){errorResponse(S,t.status,t.type,t.title,{handler:`duplicate-path`,cause:e});return}errorResponse(S,500,`urn:ok:error:internal-server-error`,`Failed to duplicate path.`,{handler:`duplicate-path`,cause:e})}},{handler:`duplicate-path`,method:`POST`}),Ns=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!S||S.length===0){errorResponse(t,400,`urn:ok:error:invalid-request`,`Missing docName query parameter.`,{handler:`page-headings`});return}if(!isSafeDocName(S)){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid docName.`,{handler:`page-headings`});return}let w=Be(S);if(!w){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid docName.`,{handler:`page-headings`});return}if(!existsSync(w)){errorResponse(t,404,`urn:ok:error:doc-not-found`,`Page not found.`,{handler:`page-headings`});return}successResponse(t,200,PageHeadingsSuccessSchema,{docName:S,headings:extractHeadings(readFileSync(w,`utf-8`))},{handler:`page-headings`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read headings.`,{handler:`page-headings`,cause:e})}},{handler:`page-headings`,method:`GET`,skipBodyParse:!0}),Ps=withValidation(RenamePathRequestSchema,async(e,S,E)=>{try{let e=extractActorIdentity(E,fe);if(e.kind===`invalid-summary`){errorResponse(S,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:`rename-path`});return}let{kind:O,fromPath:k,toPath:j}=E;if(!isValidRelativeContentPath(k)||!isValidRelativeContentPath(j)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Paths must be relative content paths.`,{handler:`rename-path`});return}if(O===`file`&&(isSystemDoc(k)||isSystemDoc(j)||isConfigDoc(k)||isConfigDoc(j))){errorResponse(S,400,`urn:ok:error:reserved-doc-name`,`Reserved document names cannot be renamed.`,{handler:`rename-path`});return}if(k===`.ok`||k.startsWith(`.ok/`)||j===`.ok`||j.startsWith(`.ok/`)){errorResponse(S,400,`urn:ok:error:reserved-doc-name`,`.ok is a reserved directory.`,{handler:`rename-path`});return}if(k===j){successResponse(S,200,RenamePathSuccessSchema,{renamed:[],rewrittenDocs:[]},{handler:`rename-path`});return}let F=O===`file`?[stripDocExtension(k)]:listAffectedDocNames(D(),O,k),L=ce?.(),B=new Set(L?L.getConflicts().map(e=>e.file):[]);for(let e of F){let w=stripDocExtension(e),E=t.documents.get(w),D=O===`file`?k:`${w}${getDocExtension(e)}`,j=E!==void 0&&isDocInConflict(E),F=B.has(D);if(j||F){respondDocInConflict(S,new DocInConflictError({file:D}),`rename-path`);return}}if(k.toLowerCase()===j.toLowerCase()){errorResponse(S,400,`urn:ok:error:invalid-request`,`Case-only renames are not supported.`,{handler:`rename-path`});return}if(O===`file`&&probeAndRegisterSourceFileExtension(w,k),me&&(O===`file`?me.isExcluded(isSupportedDocFile(j)?j:`${j}${getDocExtension(k)}`):me.isDirExcluded(j))){errorResponse(S,400,`urn:ok:error:invalid-request`,`Destination ${O===`file`?`document`:`folder`} is excluded by the project content config.`,{handler:`rename-path`});return}let q=e.kind===`agent`||e.kind===`principal`?{writerId:e.writerId,displayName:e.displayName,colorSeed:e.colorSeed,actorMetadata:e.actor}:void 0,J;try{J=await Rt(k,j,O,q?{actor:q}:{})}catch(e){if(e instanceof ManagedRenameCollisionError){errorResponse(S,409,`urn:ok:error:doc-already-exists`,Tt(e.message),{handler:`rename-path`,extensions:{colliding:e.colliding},cause:e});return}throw e}if(J.renamed.length===0){successResponse(S,200,RenamePathSuccessSchema,{renamed:[],rewrittenDocs:[]},{handler:`rename-path`});return}let Y;switch(e.kind){case`agent`:{let t=e.summary.kind===`value`,S=t?e.summary:normalizeSummary(`Renamed ${k} → ${j}`),w=Vt(S);Y=t||!w.response?w.response:Ht(w.response);for(let t=0;t<J.renamed.length;t++){let{fromDocName:S,toDocName:E}=J.renamed[t];recordContributor(E,e.writerId,e.displayName,e.colorSeed,formatRenameSubject(S,E),e.actor,t===0?w.stored:void 0)}incrementAgentWriteCalls(),Ut(S,!t);for(let{toDocName:e}of J.renamed)it(e,`rename-path`);break}case`principal`:{let t=Vt(e.summary);Y=t.response;for(let S=0;S<J.renamed.length;S++){let{fromDocName:w,toDocName:E}=J.renamed[S];recordContributor(E,e.writerId,e.displayName,e.colorSeed,formatRenameSubject(w,E),e.actor,S===0?t.stored:void 0)}Ut(e.summary,!1);for(let{toDocName:e}of J.renamed)it(e,`rename-path`);break}case`anonymous`:log$3.debug({kind:O,fromPath:k,toPath:j,affectedDocs:J.renamed.length},`[rename-path] anonymous actor — no contributor recorded (no agentId in body and getPrincipal() returned null)`);break;default:throw Error(`Unhandled actor kind in handleRenamePath: ${String(e.kind)}`)}if(renameAttributionCounter().add(1,{kind:`rename-${O}`,attribution_kind:e.kind}),H)try{await H()}catch(e){console.warn(`[rename-path] flushContributors failed (commitSha backfill may be deferred):`,e)}successResponse(S,200,RenamePathSuccessSchema,{renamed:J.renamed,rewrittenDocs:J.rewrittenDocs,...Y?{summary:Y}:{}},{handler:`rename-path`})}catch(e){let{status:t,type:w,error:E}=Et(e);errorResponse(S,t,w,E,{handler:`rename-path`,cause:e})}},{handler:`rename-path`,method:`POST`}),Is=withValidation(DeletePathRequestSchema,async(e,S,E)=>{try{zt(E);let{kind:e,path:O}=E;if(!isValidRelativeContentPath(O)){errorResponse(S,400,`urn:ok:error:invalid-request`,`path must be a relative content path.`,{handler:`delete-path`});return}let k=resolveContentEntryPath(w,e,O);if(!existsSync(k)){errorResponse(S,404,`urn:ok:error:doc-not-found`,`${e} does not exist.`,{handler:`delete-path`});return}let j=statSync(k);if(e===`file`&&!j.isFile()||e===`folder`&&!j.isDirectory()){errorResponse(S,400,`urn:ok:error:invalid-request`,`Target path is not a ${e}.`,{handler:`delete-path`});return}let F=e===`file`?[O]:listAffectedDocNames(D(),e,O),L=ce?.(),B=new Set(L?L.getConflicts().map(e=>e.file):[]);for(let w of F){let E=stripDocExtension(w),D=t.documents.get(E),O=e===`file`?w:`${E}${getDocExtension(E)}`,k=D!==void 0&&isDocInConflict(D),j=B.has(O);if(k||j){respondDocInConflict(S,new DocInConflictError({file:O}),`delete-path`);return}}if(await Dt(F),ye)for(let e of F)isSystemDoc(e)||isConfigDoc(e)||(ye.setDeleted(e),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:e,kind:`deleted`,source:`handleDeletePath`})));e===`file`?unlinkSync(k):(tracedRmSync(k,{recursive:!0,force:!1}),Pe(O));let H=D();if(H instanceof Map)for(let e of F)updateFileIndex({kind:`delete`,path:resolve(w,`${e}${getDocExtension(e)}`),docName:e},H);successResponse(S,200,DeletePathSuccessSchema,{deletedDocNames:F},{handler:`delete-path`})}catch(e){errorResponse(S,500,`urn:ok:error:internal-server-error`,`Failed to delete path.`,{handler:`delete-path`,cause:e})}},{handler:`delete-path`,method:`POST`}),Rs=withValidation(TrashCleanupRequestSchema,async(e,t,S)=>withSpan(`ok.fs.trash_cleanup`,{attributes:{"ok.cleanup.kind":S.kind,"ok.cleanup.path":normalizeFsPath(S.path),"ok.cleanup.path.role":classifyFsPath(S.path)}},async()=>{try{if(extractActorIdentity(S,fe).kind===`invalid-summary`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:`trash-cleanup`});return}let{kind:e,path:E}=S;if(!isValidRelativeContentPath(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`path must be a relative content path.`,{handler:`trash-cleanup`});return}let O=e===`folder`&&isReservedSyntheticFolderPath(E);if(e===`file`&&(isSystemDoc(E)||isConfigDoc(E))||O){errorResponse(t,400,`urn:ok:error:reserved-doc-name`,`'${E}' is a reserved document name.`,{handler:`trash-cleanup`});return}let k=D(),j=e===`file`?k.has(E)?[E]:[]:listAffectedDocNames(k,e,E);if(j.length===0){successResponse(t,200,TrashCleanupSuccessSchema,{deletedDocNames:[]},{handler:`trash-cleanup`});return}if(await Dt(j),ye)for(let e of j)isSystemDoc(e)||isConfigDoc(e)||(ye.setDeleted(e),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:e,kind:`deleted`,source:`handleTrashCleanup`})));let F=D();if(F instanceof Map)for(let e of j)updateFileIndex({kind:`delete`,path:resolve(w,`${e}${getDocExtension(e)}`),docName:e},F);e===`folder`&&Pe(E),ne?.(`files`),successResponse(t,200,TrashCleanupSuccessSchema,{deletedDocNames:j},{handler:`trash-cleanup`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to clean up after trash.`,{handler:`trash-cleanup`,cause:e})}}),{handler:`trash-cleanup`,method:`POST`}),$s=withValidation(EmptyRequestSchema,async(e,t)=>{try{let e=D(),S=[];for(let[t,E]of e){let e=t,D,O=getDocExtension(t);try{let S=readFileSync(resolve(w,`${t}${O}`),`utf-8`);e=extractPageTitle(S,t),D=extractPageIcon(S)}catch(e){console.warn(`[pages] Failed to read title for ${t}:`,e)}S.push({docName:t,title:e,docExt:O,size:E.size,modified:E.modified,icon:D})}S.sort((e,t)=>e.docName.localeCompare(t.docName)),successResponse(t,200,PagesSuccessSchema,{pages:S},{handler:`pages`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to list pages.`,{handler:`pages`,cause:e})}},{handler:`pages`,method:`GET`,skipBodyParse:!0}),ec=withValidation(EmptyRequestSchema,async(e,S)=>{try{let w=new URL(e.url??``,`http://localhost`).searchParams.get(`docName`);if(!w){errorResponse(S,400,`urn:ok:error:invalid-request`,`Missing docName parameter.`,{handler:`suggest-links`});return}if(!isSafeDocName(w)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Invalid docName.`,{handler:`suggest-links`});return}if(isSystemDoc(w)||isConfigDoc(w)){errorResponse(S,400,`urn:ok:error:reserved-doc-name`,`'${w}' is a reserved document name.`,{handler:`suggest-links`});return}successResponse(S,200,SuggestLinksSuccessSchema,await suggestLinks({hocuspocus:t,fileIndex:D(),docName:w}),{handler:`suggest-links`})}catch(e){if(e instanceof SuggestLinksTargetNotFoundError){errorResponse(S,404,`urn:ok:error:doc-not-found`,`Page not found.`,{handler:`suggest-links`,cause:e});return}errorResponse(S,500,`urn:ok:error:internal-server-error`,`Failed to suggest links.`,{handler:`suggest-links`,cause:e})}},{handler:`suggest-links`,method:`GET`,skipBodyParse:!0});async function tc(e,t){if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`upload-asset`,extraHeaders:{Allow:`POST`}});return}let S;try{S=await readUploadBody(e,de??w)}catch(e){if(e instanceof UploadWriteError){errorResponse(t,uploadStatusFor(e.reason),e.reason,uploadTitleFor(e.reason),{handler:`upload-asset`,cause:e});return}errorResponse(t,400,`urn:ok:error:malformed-upload`,`Failed to parse upload.`,{handler:`upload-asset`,cause:e});return}let{filename:E,tempPath:D,sha:O,byteLength:k,parentDocName:j}=S,F=()=>{if(existsSync(D))try{unlinkSync(D)}catch{}},L=validateBody(UploadRequestSchema,{parentDocName:j},t,{handler:`upload-asset`});if(!L.ok){F();return}let{parentDocName:B}=L.value,{agentId:H,agentName:q}=zt(Object.fromEntries(new URL(e.url??``,`http://localhost`).searchParams.entries()));if(k===0){F(),errorResponse(t,400,`urn:ok:error:no-file-received`,`No file received.`,{handler:`upload-asset`});return}if(B.includes(`\0`)||B.includes(`..`)||B.startsWith(`/`)){F(),errorResponse(t,400,`urn:ok:error:path-escape`,`Path escape detected.`,{handler:`upload-asset`});return}let J=resolve(w),Y=resolveUploadDestDir(B,`./`,J);if(!isWithinContentDir(Y,J)){F(),errorResponse(t,400,`urn:ok:error:path-escape`,`Path escape detected.`,{handler:`upload-asset`});return}try{assertNoSymlinkEscape(Y,J)}catch(e){if(F(),(e instanceof Error?e.message:String(e)).startsWith(`symlink-escape:`)){errorResponse(t,400,`urn:ok:error:path-escape`,`Path escape detected.`,{handler:`upload-asset`});return}log$3.error({err:e,destDir:Y},`[upload] failed to validate destination directory`),errorResponse(t,500,`urn:ok:error:storage-error`,`Storage error.`,{handler:`upload-asset`,cause:e});return}try{mkdirSync(Y,{recursive:!0})}catch(e){if(!isAlreadyExistsError(e)){F();let S=classifyUploadErrno(e);errorResponse(t,uploadStatusFor(S),S,uploadTitleFor(S),{handler:`upload-asset`,cause:e,detail:`failed to create attachment directory`});return}}try{let e=realpathSync(Y),S;try{S=realpathSync(J)}catch{S=J}if(!isWithinContentDir(e,S)){F(),errorResponse(t,400,`urn:ok:error:path-escape`,`Path escape detected.`,{handler:`upload-asset`});return}}catch(e){if(e.code!==`ENOENT`){F(),errorResponse(t,400,`urn:ok:error:path-escape`,`Path escape detected.`,{handler:`upload-asset`,cause:e});return}}let ee=await fileTypeFromFile(D),te=ee?.mime,ne=ee?.ext;if(!te){let e=readTempFileHead(D,256).toString(`utf-8`).replace(/^/,``).trimStart();(e.startsWith(`<svg`)||e.startsWith(`<?xml`)&&e.includes(`<svg`))&&(te=`image/svg+xml`,ne=`svg`)}{let S=await findDuplicateAsset(Y,O,k);if(S){F();let E=relative(w,resolve(Y,S));log$3.info({event:`upload`,endpoint:e.url??`/api/upload`,agentId:H,agentName:q,dedup:!0,mime:te??null,size:k,destPath:E,httpStatus:200},`[upload] dedup hit`),successResponse(t,200,UploadAssetSuccessSchema,{src:S,path:E,deduped:!0},{handler:`upload-asset`});return}}let ae;if(!E||E===`upload`||GENERIC_PASTE_NAMES.test(E)){let e=new Date().toISOString().replace(/[-:T]/g,``).slice(0,14).replace(/(\d{8})(\d{6})/,`$1-$2`),t=E?extname(E).slice(1):``,S=ne??t??``;ae=S===``?`pasted-${e}`:`pasted-${e}.${S}`}else ae=sanitizeFilename(E);try{let S=linkTempToFinalWithCollisionRetry(D,Y,ae),E=relative(w,resolve(Y,S));log$3.info({event:`upload`,endpoint:e.url??`/api/upload`,agentId:H,agentName:q,dedup:!1,mime:te??null,size:k,destPath:E,httpStatus:200},`[upload] write ok`),successResponse(t,200,UploadAssetSuccessSchema,{src:S,path:E,deduped:!1},{handler:`upload-asset`})}catch(S){let w=S instanceof UploadWriteError?S.reason:`urn:ok:error:storage-error`;log$3.error({event:`upload`,endpoint:e.url??`/api/upload`,agentId:H,agentName:q,filename:ae,size:k,reason:w,httpStatus:uploadStatusFor(w),err:S},`[upload] write failed`),errorResponse(t,uploadStatusFor(w),w,uploadTitleFor(w),{handler:`upload-asset`,cause:S})}}let nc=`/api/local-op/clone`,rc=`/api/local-op/open`,ic=600*1e3,ac=45e3,oc=`local-op-clone`,sc=withValidation(LocalOpCloneRequestSchema,cc,{handler:oc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:oc})});async function cc(e,t,S){let{url:w,dir:E,branch:D}=S;if(!isAllowedGitUrl(w)){errorResponse(t,400,`urn:ok:error:url-not-allowed`,`URL protocol is not allowed for clone.`,{handler:oc,cause:Error(`url=${w}`)});return}if(!isSafeLocalPath(E)){errorResponse(t,400,`urn:ok:error:dir-outside-home`,`Clone destination must be within the user home directory.`,{handler:oc,cause:Error(`dir=${E}`)});return}if(!we.tryAcquire(nc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A clone operation is already in progress.`,{handler:oc,extraHeaders:{"Retry-After":`30`}});return}t.writeHead(200,{"Content-Type":`application/x-ndjson`,"Transfer-Encoding":`chunked`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-cache`});let O=createStreamingErrorWriter(t,oc),k=null,j=runCloneSubprocess({cliArgs:ue,url:w,dir:E,branch:D,timeoutMs:ic,onEvent:e=>{if(e.type===`complete`){k=e.dir;return}if(e.type===`error`){e.message&&log$3.warn({stderr:redactShareSubprocessStderr(e.message),url:w,dir:E},`[local-op/clone] clone failed`);let t=classifyCloneError(e.message??``);O(500,`urn:ok:error:clone-failed`,t.title,{detail:t.detail||void 0,cause:e.message?Error(redactShareSubprocessStderr(e.message)):void 0});return}if(!t.writableEnded&&!t.destroyed)try{t.write(`${JSON.stringify(e)}\n`)}catch{}}});(async()=>{try{if(await j.done,k&&!t.writableEnded&&!t.destroyed){let e=await lc(k);!t.writableEnded&&!t.destroyed&&(`port`in e?t.write(`${JSON.stringify({type:`complete`,port:e.port,dir:k})}\n`):O(500,`urn:ok:error:server-start-failed`,`Cloned successfully but failed to start the project server.`,{cause:Error(e.error)}))}}catch(e){!t.writableEnded&&!t.destroyed?O(500,`urn:ok:error:internal-server-error`,`Unexpected error during clone post-processing.`,{cause:e}):log$3.error({err:e,handler:oc},`clone IIFE rejected after stream ended`)}finally{t.writableEnded||t.end(),we.release(nc)}})(),t.on(`close`,()=>{j.cancel()})}async function lc(e){let t=resolve(expandTilde(e)),S=getLocalDir(t),w=readUiLock(S);if(w&&w.port>0)return{port:w.port};let E=readServerLock(S),[D,...O]=ue,k=E&&E.port>0?`ui`:`start`,j=spawn(D,[...O,k],{cwd:t,detached:!0,stdio:[`ignore`,`ignore`,`pipe`],env:{...process.env,OK_LOCK_KIND:`interactive`}}),F=[];j.stderr?.on(`data`,e=>{F.push(e),log$3.warn({cwd:t,cliCmd:k,msg:e.toString(`utf-8`).trim()},`[local-op/open] child stderr`)});let L=null;j.on(`exit`,e=>{L=e??-1}),j.unref();let B=Date.now()+45e3;for(;Date.now()<B;){await setTimeout$1(500);let e=readUiLock(S);if(e&&e.port>0)return{port:e.port};if(L!==null){let e=Buffer.concat(F).toString(`utf-8`).trim();return{error:`\`ok ${k}\` exited (code ${L})${e?` — ${e}`:``}`}}}let H=Buffer.concat(F).toString(`utf-8`).trim();return{error:`UI did not start within the expected time${H?` — ${H}`:``}`}}let uc=`local-op-open`,dc=withValidation(LocalOpOpenRequestSchema,async(e,t,S)=>{let{dir:w}=S;if(!isSafeLocalPath(w)){errorResponse(t,400,`urn:ok:error:dir-outside-home`,`dir must be within the user home directory.`,{handler:uc,cause:Error(`dir=${w}`)});return}if(!we.tryAcquire(rc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A server-open operation is already in progress.`,{handler:uc,extraHeaders:{"Retry-After":`5`}});return}try{let e=await lc(w);`port`in e?successResponse(t,200,LocalOpOpenSuccessSchema,{port:e.port},{handler:uc}):errorResponse(t,504,`urn:ok:error:server-open-failed`,`Failed to open project server.`,{handler:uc,cause:Error(e.error)})}finally{we.release(rc)}},{handler:uc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:uc})}),fc=`/api/local-op/auth/login`,pc=`/api/local-op/auth/status`,mc=`/api/local-op/auth/repos`,hc=`/api/local-op/auth/signout`,gc=`/api/local-op/auth/pat`,_c=null,vc=`local-op-auth-login`,yc=withValidation(LocalOpAuthHostRequestSchema,bc,{handler:vc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:vc})});async function bc(e,t,S){let w=S.host??`github.com`;if(!we.tryAcquire(fc)){let e=_c;if(!e){console.error(JSON.stringify({event:`ok-local-op:auth-login-slot-no-controller`,channel:`auth`,transport:`http`})),errorResponse(t,429,`urn:ok:error:concurrent-operation`,`An auth login operation is already in progress.`,{handler:vc,extraHeaders:{"Retry-After":`5`}});return}e.cancel(),_c=null,console.warn(JSON.stringify({event:`ok-local-op:idempotent-start-replaced-stale-slot`,channel:`auth`,transport:`http`}))}t.writeHead(200,{"Content-Type":`application/x-ndjson`,"Transfer-Encoding":`chunked`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-cache`});let E=createStreamingErrorWriter(t,vc),D=runDeviceFlowSubprocess({cliArgs:ue,host:w,timeoutMs:ic,onEvent:e=>{if(e.type===`error`){E(500,`urn:ok:error:auth-failed`,`Auth subprocess reported an error.`,{cause:e.message?Error(e.message):void 0});return}if(!t.writableEnded&&!t.destroyed)try{t.write(`${JSON.stringify(e)}\n`)}catch{}}});_c=D;let O=()=>{D.cancel(),_c===D&&(_c=null,we.release(fc))};t.on(`close`,O),D.done.finally(()=>{if(t.off(`close`,O),!t.writableEnded&&!t.destroyed)try{t.end()}catch{}_c===D&&(_c=null,we.release(fc))})}let xc=`local-op-auth-status`,Sc=withValidation(LocalOpAuthHostRequestSchema,async(e,t,S)=>{let w=S.host??`github.com`;if(!we.tryAcquire(pc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`An auth status operation is already in progress.`,{handler:xc,extraHeaders:{"Retry-After":`5`}});return}try{let[e,...S]=ue,E=[...S,`auth`,`status`,`--json`,`--host`,w],D=(await new Promise((t,S)=>{let w=spawn(e,E,{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),D=!1,O=setTimeout(()=>{D=!0,w.kill(`SIGTERM`)},3e4),k=[];w.stdout.on(`data`,e=>k.push(e)),w.on(`close`,()=>{if(clearTimeout(O),D){S(Error(`auth status subprocess timed out after 30s`));return}t(Buffer.concat(k).toString(`utf-8`))}),w.on(`error`,e=>{clearTimeout(O),S(e)})})).split(`
|
|
2240
2240
|
`).map(e=>e.trim()).filter(Boolean),O=null;for(let e=D.length-1;e>=0;e--)try{O=JSON.parse(D[e]);break}catch{}O===null?successResponse(t,200,LocalOpAuthStatusSuccessSchema,{authenticated:!1},{handler:xc}):successResponse(t,200,LocalOpAuthStatusSuccessSchema,O,{handler:xc})}catch(e){errorResponse(t,500,`urn:ok:error:auth-failed`,`Auth status check failed.`,{handler:xc,cause:e})}finally{we.release(pc)}},{handler:xc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:xc})}),Cc=`local-op-auth-repos`,wc=withValidation(LocalOpAuthHostRequestSchema,Tc,{handler:Cc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Cc})});async function Tc(e,t,S){let w=S.host??`github.com`;if(!we.tryAcquire(mc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`An auth repos operation is already in progress.`,{handler:Cc,extraHeaders:{"Retry-After":`5`}});return}t.writeHead(200,{"Content-Type":`application/x-ndjson`,"Transfer-Encoding":`chunked`,"X-Content-Type-Options":`nosniff`,"Cache-Control":`no-cache`});let E=createStreamingErrorWriter(t,Cc),[D,...O]=ue,k=[...O,`auth`,`repos`,`--json`,`--host`,w],j=!1,F=``,L=spawn(D,k,{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),B=setTimeout(()=>{L.kill(`SIGTERM`)},ic);L.stdout.on(`data`,e=>{F+=e.toString(`utf-8`);let S=F.split(`
|
|
2241
2241
|
`);F=S.pop()??``;for(let e of S){if(!e.trim())continue;let S=null;try{S=JSON.parse(e)}catch{}if(S&&S.type===`error`){E(500,`urn:ok:error:auth-failed`,`Auth repos subprocess reported an error.`,{detail:typeof S.message==`string`?S.message:void 0});continue}if(!t.writableEnded&&!t.destroyed)try{t.write(`${e}\n`)}catch{}}}),L.stderr.on(`data`,e=>{log$3.debug({msg:e.toString(`utf-8`).trim()},`[local-op/auth/repos] stderr`)}),L.on(`close`,e=>{clearTimeout(B),j||(j=!0,e!==0&&!t.writableEnded&&E(500,`urn:ok:error:auth-failed`,`Auth repos subprocess exited with code ${e}.`),t.end(),we.release(mc))}),L.on(`error`,e=>{clearTimeout(B),j||(j=!0,t.writableEnded||(E(500,`urn:ok:error:auth-failed`,`Failed to spawn the auth repos subprocess.`,{cause:e}),t.end()),we.release(mc))}),t.on(`close`,()=>{j||(j=!0,clearTimeout(B),L.kill(`SIGTERM`),we.release(mc))})}let Ec=`local-op-auth-signout`,Dc=withValidation(LocalOpAuthHostRequestSchema,async(e,t,S)=>{let w=S.host??`github.com`;if(!we.tryAcquire(hc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`An auth signout operation is already in progress.`,{handler:Ec,extraHeaders:{"Retry-After":`5`}});return}try{let[e,...S]=ue,E=[...S,`auth`,`signout`,`--host`,w];await new Promise((t,S)=>{let w=spawn(e,E,{stdio:`ignore`,env:{...process.env}}),D=setTimeout(()=>{w.kill(`SIGTERM`)},3e4);w.on(`close`,()=>{clearTimeout(D),t()}),w.on(`error`,e=>{clearTimeout(D),S(e)})}),successResponse(t,200,LocalOpAuthEmptySuccessSchema,{},{handler:Ec})}catch(e){errorResponse(t,500,`urn:ok:error:auth-failed`,`Auth signout failed.`,{handler:Ec,cause:e})}finally{we.release(hc)}},{handler:Ec,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Ec})}),Oc=`local-op-auth-pat`,kc=withValidation(LocalOpAuthPatRequestSchema,async(e,t,S)=>{let{pat:w,host:E}=S,D=E??`github.com`;if(!we.tryAcquire(gc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`An auth pat operation is already in progress.`,{handler:Oc,extraHeaders:{"Retry-After":`5`}});return}try{let[e,...S]=ue,E=[...S,`auth`,`pat`,`--json`,`--host`,D],O=(await new Promise((t,S)=>{let D=spawn(e,E,{stdio:[`pipe`,`pipe`,`pipe`],env:{...process.env}}),O=setTimeout(()=>{D.kill(`SIGTERM`)},3e4);D.stdin.write(`${w}\n`),D.stdin.end();let k=[];D.stdout.on(`data`,e=>k.push(e)),D.on(`close`,e=>{clearTimeout(O),e===0?t(Buffer.concat(k).toString(`utf-8`)):S(Error(`auth pat exited with code ${e}`))}),D.on(`error`,e=>{clearTimeout(O),S(e)})})).split(`
|
|
2242
|
-
`).map(e=>e.trim()).filter(Boolean),k=null;for(let e=O.length-1;e>=0;e--)try{k=JSON.parse(O[e]);break}catch{}k===null?successResponse(t,200,LocalOpAuthPatSuccessSchema,{},{handler:Oc}):successResponse(t,200,LocalOpAuthPatSuccessSchema,k,{handler:Oc})}catch(e){errorResponse(t,500,`urn:ok:error:auth-failed`,`Auth pat failed.`,{handler:Oc,cause:e})}finally{we.release(gc)}},{handler:Oc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Oc})}),Ac=`local-op-auth-identity`;async function jc(e,t){if(checkLocalOpSecurity(e,t,{handler:Ac})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:Ac,extraHeaders:{Allow:`GET`}});return}if(!de){errorResponse(t,503,`urn:ok:error:no-project-dir`,`No project directory configured.`,{handler:Ac});return}try{successResponse(t,200,LocalOpAuthIdentitySuccessSchema,{identity:await resolveGitIdentity(de)},{handler:Ac})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Identity resolution failed.`,{handler:Ac,cause:e})}}}let Mc=`/api/local-op/auth/set-identity`,Nc=`local-op-auth-set-identity`,Pc=withValidation(LocalOpAuthSetIdentityRequestSchema,async(e,t,S)=>{let w=S.name.trim(),E=S.email.trim();if(!de){errorResponse(t,503,`urn:ok:error:no-project-dir`,`No project directory configured.`,{handler:Nc});return}if(!we.tryAcquire(Mc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A set-identity operation is already in progress.`,{handler:Nc,extraHeaders:{"Retry-After":`5`}});return}try{writeGitIdentity(de,w,E),ce?.()?.refreshIdentity().catch(()=>{}),successResponse(t,200,LocalOpAuthEmptySuccessSchema,{},{handler:Nc})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Set-identity failed.`,{handler:Nc,cause:e})}finally{we.release(Mc)}},{handler:Nc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Nc})});async function Fc(e,t){if(checkLocalOpSecurity(e,t,{handler:`sync-status`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-status`,extraHeaders:{Allow:`GET`}});return}try{let e=ce?.();if(!e){successResponse(t,200,SyncStatusSchema,{state:`dormant`,lastSyncUtc:null,lastFetchUtc:null,lastPushedSha:null,ahead:0,behind:0,consecutiveFailures:0,conflictCount:0,hasRemote:!1,syncEnabled:!1,identityUnresolved:!1,remote:null},{handler:`sync-status`});return}await e.refreshRemote(),successResponse(t,200,SyncStatusSchema,e.getStatus(),{handler:`sync-status`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`sync-status`,cause:e})}}}let Ic=withValidation(SyncTriggerRequestSchema,async(e,t,S)=>{let w=ce?.();if(!w){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-trigger`});return}let E=S.op??`sync`;successResponse(t,202,SyncTriggerSuccessSchema,{op:E},{handler:`sync-trigger`}),w.trigger(E)},{handler:`sync-trigger`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`sync-trigger`})?ce?.()?!0:(errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-trigger`}),!1):!1});async function Lc(e,t){if(checkLocalOpSecurity(e,t,{handler:`sync-conflicts`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-conflicts`,extraHeaders:{Allow:`GET`}});return}try{let e=ce?.();successResponse(t,200,SyncConflictsSuccessSchema,{conflicts:e?e.getConflicts():[]},{handler:`sync-conflicts`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`sync-conflicts`,cause:e})}}}let Rc=withValidation(SyncResolveConflictRequestSchema,async(e,t,S)=>{let w=ce?.();if(!w){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-resolve-conflict`});return}let{file:E,strategy:D,content:O}=S;try{await w.resolveConflict(E,D,O),successResponse(t,200,SyncResolveConflictSuccessSchema,{},{handler:`sync-resolve-conflict`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to resolve conflict.`,{handler:`sync-resolve-conflict`,cause:e,detail:e instanceof Error?e.message:void 0})}},{handler:`sync-resolve-conflict`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`sync-resolve-conflict`})?ce?.()?!0:(errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-resolve-conflict`}),!1):!1});async function zc(e,S){if(!checkLocalOpSecurity(e,S,{handler:`sync-conflict-content`}))return;if(e.method!==`GET`){errorResponse(S,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-conflict-content`,extraHeaders:{Allow:`GET`}});return}if(!de){errorResponse(S,503,`urn:ok:error:project-repo-not-configured`,`Project repo not configured.`,{handler:`sync-conflict-content`});return}let w=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),E=w.searchParams.get(`file`);if(!E){errorResponse(S,400,`urn:ok:error:invalid-request`,`Missing required query param: file.`,{handler:`sync-conflict-content`});return}if(E.includes(`..`)||E.startsWith(`/`)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Invalid file path.`,{handler:`sync-conflict-content`});return}let D=stripDocExtension(E),O=t.documents.get(D)?.getMap(`lifecycle`).get(`status`)===`conflict`,k=ce?.(),j=k?k.getConflicts().some(e=>e.file===E):!1;if(!O&&!j){errorResponse(S,404,`urn:ok:error:no-conflict-tracked`,`No conflict is tracked for this path.`,{handler:`sync-conflict-content`,extensions:{file:E}});return}let F=w.searchParams.get(`source`),L=esm_default({baseDir:de,timeout:{block:15e3}});async function B(e){try{return{present:!0,content:await L.raw([`show`,`:${e}:${E}`])}}catch(t){let S=t instanceof Error?t.message:String(t);if(!/pathspec|did not match|exists on disk, but not in|is in the index, but not at stage/i.test(S))throw console.warn(JSON.stringify({event:`showstage-unexpected-error`,stage:e,file:E,detail:S,handler:`sync-conflict-content`})),t;return{present:!1}}}try{let[e,w,D]=await Promise.all([B(1),B(2),B(3)]),O=e.present?e.content:``,k=D.present?D.content:``,j=w.present&&D.present?`both-modified`:!w.present&&D.present?`delete-modify`:w.present&&!D.present?`modify-delete`:`both-modified`,L=w.present?w.content:``,H=null;if(F===`ytext`){let e=stripDocExtension(E),S=t.documents.get(e);if(S){let t=S.getMap(`lifecycle`).get(`status`);if(H=typeof t==`string`&&t.length>0?t:null,j!==`delete-modify`){let t=Ce?Ce(e):null;t!==null&&!ytextHasConflictMarkers(t)?L=t:t!==null&&console.warn(JSON.stringify({event:`ytext-conflict-marker-detected`,"doc.name":e,handler:`sync-conflict-content`}))}}else console.warn(`[conflict-content] doc ${e} not loaded; lifecycleStatus unavailable`)}successResponse(S,200,SyncConflictContentSuccessSchema,{file:E,base:O,ours:L,theirs:k,kind:j,lifecycleStatus:H},{handler:`sync-conflict-content`})}catch(e){errorResponse(S,500,`urn:ok:error:internal-server-error`,`Failed to read conflict content.`,{handler:`sync-conflict-content`,cause:e})}}async function Bc(e,t){if(!checkLocalOpSecurity(e,t,{handler:`seed-plan`}))return;if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`seed-plan`,extraHeaders:{Allow:`GET`}});return}let S=new URL(e.url??`/`,`http://localhost`),E=S.searchParams.get(`rootDir`)??void 0,D=S.searchParams.get(`packId`),O=coercePackId(D);if(D!==null&&D!==``&&O===void 0){errorResponse(t,400,`urn:ok:error:invalid-request`,`Unknown packId.`,{handler:`seed-plan`,detail:`Pack id "${D}" is not registered.`});return}try{successResponse(t,200,SeedPlanSuccessSchema,{plan:await planSeed({projectDir:w,rootDir:E,packId:O})},{handler:`seed-plan`})}catch(e){if(e instanceof SeedPrerequisiteError){errorResponse(t,422,`urn:ok:error:seed-prerequisite-missing`,`Seed prerequisite missing.`,{handler:`seed-plan`,cause:e});return}if(e instanceof SeedRootDirError){errorResponse(t,400,`urn:ok:error:seed-invalid-root`,`Invalid seed root directory.`,{handler:`seed-plan`,detail:`The provided root directory is not within the workspace content directory.`,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`seed-plan`,cause:e})}}let Vc=withValidation(SeedApplyRequestSchema,async(e,t,S)=>{let E=S.plan;if(!E||typeof E!=`object`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid plan payload.`,{handler:`seed-apply`});return}let D=E,O=S.packId,k=coercePackId(O);if(typeof O==`string`&&O.length>0&&k===void 0){errorResponse(t,400,`urn:ok:error:invalid-request`,`Unknown packId.`,{handler:`seed-apply`,detail:`Pack id "${O}" is not registered.`});return}try{successResponse(t,200,SeedApplySuccessSchema,{result:await applySeed(D,{projectDir:w,packId:k})},{handler:`seed-apply`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to apply seed plan.`,{handler:`seed-apply`,cause:e})}},{handler:`seed-apply`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`seed-apply`})});async function Hc(e,t){if(checkLocalOpSecurity(e,t,{handler:`seed-packs`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`seed-packs`,extraHeaders:{Allow:`GET`}});return}successResponse(t,200,SeedListPacksSuccessSchema,{packs:listStarterPacks()},{handler:`seed-packs`})}}let Uc=withValidation(InstallSkillRequestSchema,async(e,t,S)=>{if(S.out!==void 0&&!isSafeLocalPath(S.out)){errorResponse(t,400,`urn:ok:error:invalid-request`,`Output path must be within home directory.`,{handler:`install-skill`});return}try{successResponse(t,200,InstallSkillSuccessSchema,await buildAndOpenSkill({...S.noOpen===void 0?{}:{noOpen:S.noOpen},...S.out===void 0?{}:{out:S.out}}),{handler:`install-skill`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to install skill.`,{handler:`install-skill`,cause:e})}},{handler:`install-skill`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`install-skill`})});async function Wc(e,t){if(checkLocalOpSecurity(e,t,{handler:`installed-agents`}))try{await handleInstalledAgents(e,t,ze.probeAll)}catch(e){t.headersSent||(log$3.error({err:e},`[installed-agents] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`installed-agents`,cause:e}))}}async function Gc(e,t){if(!checkLocalOpSecurity(e,t,{handler:`sync-abort-merge`}))return;if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-abort-merge`,extraHeaders:{Allow:`POST`}});return}let S=ce?.();if(!S){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-abort-merge`});return}try{await S.abortMerge(),successResponse(t,200,SyncAbortMergeSuccessSchema,{},{handler:`sync-abort-merge`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to abort merge.`,{handler:`sync-abort-merge`,cause:e})}}let Kc=withValidation(EmptyRequestSchema,async(e,t)=>{if(!te){errorResponse(t,503,`urn:ok:error:tag-index-not-configured`,`Tag index not configured.`,{handler:`tags-list`});return}try{successResponse(t,200,TagsListSuccessSchema,{tags:te.getAllTags()},{handler:`tags-list`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read tags.`,{handler:`tags-list`,cause:e})}},{handler:`tags-list`,method:`GET`,skipBodyParse:!0});async function qc(e,t,S){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`tags-for-name`,extraHeaders:{Allow:`GET`}});return}if(!te){errorResponse(t,503,`urn:ok:error:tag-index-not-configured`,`Tag index not configured.`,{handler:`tags-for-name`});return}let w;try{w=decodeURIComponent(S)}catch{errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid tag name encoding.`,{handler:`tags-for-name`});return}if(!w){errorResponse(t,400,`urn:ok:error:invalid-request`,`Missing tag name.`,{handler:`tags-for-name`});return}try{let e=te.getDocsForTagWithMatches(w).map(({docName:e,matchingTags:t})=>({docName:e,title:Ve(e),matchingTags:t,snippet:null}));successResponse(t,200,TagsForNameSuccessSchema,{name:w,docs:e},{handler:`tags-for-name`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read tag membership.`,{handler:`tags-for-name`,cause:e})}}function Jc(e,t,S=`path`,E=`folder-config`){let D=e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``);if(D.split(`/`).some(e=>e===`..`)||e.startsWith(`/`))return errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid ${S}: must be project-root-relative.`,{handler:E}),null;let O=resolve(w),k=D===``?O:resolve(O,D);return k!==O&&!k.startsWith(`${O}${sep}`)?(errorResponse(t,400,`urn:ok:error:invalid-request`,`Path escapes content directory.`,{handler:E}),null):{folderRel:D,resolvedContentDir:O}}let Yc=/^[A-Za-z0-9_-]+$/;function Xc(e,t,S=`template`){return!e||!Yc.test(e)?(errorResponse(t,400,`urn:ok:error:invalid-request`,"Invalid name: must be letters / digits / `_` / `-` only (no `.md` extension).",{handler:S}),!1):!0}function Zc(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;for(let[S,w]of Object.entries(e))w!==void 0&&(t[S]=w);return t}async function Qc(e,t){if(e.method===`GET`)return $c(e,t);if(e.method===`PUT`)return nl(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`folder-config`,extraHeaders:{Allow:`GET, PUT`}})}let $c=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=Jc(new URL(e.url??``,`http://localhost`).searchParams.get(`path`)??``,t,`path`,`folder-config-get`);if(!S)return;let w=await enrichDirectory(S.folderRel,{projectDir:S.resolvedContentDir}),E=resolve(S.resolvedContentDir,S.folderRel,`.ok`,`frontmatter.yml`),D=null;if(existsSync(E))try{let e=(0,import_dist$1.parse)(await readFile$1(E,`utf-8`));D=e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[folder-config:get] malformed YAML in ${E}: ${t}`),D=null}successResponse(t,200,FolderConfigGetSuccessSchema,{folder:w,frontmatter_local:D},{handler:`folder-config-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read folder config.`,{handler:`folder-config-get`,cause:e})}},{handler:`folder-config-get`,method:`GET`,skipBodyParse:!0}),nl=withValidation(FolderConfigPutRequestSchema,async(e,t,S)=>{try{let e=Jc(S.path,t,`path`,`folder-config-put`);if(!e)return;let w=e.folderRel===``?`**`:`${e.folderRel}/**`,E=applyNestedFolderRulesUpsert({projectDir:e.resolvedContentDir,rules:[{match:w,frontmatter:Zc(S.frontmatter)}]});if(!E.ok){let e=E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to write folder config.`:`Invalid folder config request.`,{handler:`folder-config-put`,detail:E.error.code,cause:Error(E.error.message)});return}successResponse(t,200,FolderConfigPutSuccessSchema,{applied:E.applied},{handler:`folder-config-put`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to write folder config.`,{handler:`folder-config-put`,cause:e})}},{handler:`folder-config-put`,method:`PUT`});function il(e,S,w,E){if(!S)return!1;let D=e===``?`.ok/templates/${S}`:`${e.replace(/\/$/,``)}/.ok/templates/${S}`,O=t.documents.get(D);return O&&isDocInConflict(O)?(respondDocInConflict(E,new DocInConflictError({file:`${D}.md`}),w),!0):!1}async function al(e,t){if(e.method===`GET`)return ul(e,t);if(e.method===`PUT`)return dl(e,t);if(e.method===`DELETE`)return fl(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`template`,extraHeaders:{Allow:`GET, PUT, DELETE`}})}let cl=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/,ll=e=>{let t=e.match(cl),S={},w=e;if(t){try{let e=(0,import_dist$1.parse)(t[1]??``);e&&typeof e==`object`&&!Array.isArray(e)&&(S=e)}catch{}w=e.slice(t[0].length)}return{frontmatter:S,body:w}},ul=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`name`)??``;if(!Xc(w,t,`template-get`))return;let E=Jc(S.searchParams.get(`folder`)??``,t,`folder`,`template-get`);if(!E)return;let{folderRel:D,resolvedContentDir:O}=E,k=D===``?[]:D.split(`/`),j=null,F=null,L=null;for(let e=k.length;e>=0;e--){let t=e===0?``:k.slice(0,e).join(`/`),S=t===``?O:resolve(O,t);if(S!==O&&!S.startsWith(`${O}${sep}`))continue;let E=resolve(S,`.ok`,`templates`,`${w}.md`);if(existsSync(E)){j=E,F=t,L=e===k.length?`local`:`inherited`;break}}if(!j||F===null||L===null){errorResponse(t,404,`urn:ok:error:template-not-found`,`Template not found.`,{handler:`template-get`,detail:`Template "${w}" not found for folder "${D||`.`}". Walked leaf → root.`});return}let{frontmatter:B,body:H}=ll(await readFile$1(j,`utf-8`)),q=relative(O,j).split(/[\\/]/).filter(Boolean).join(`/`);successResponse(t,200,TemplateGetSuccessSchema,{template:{name:w,folder:F,scope:L,path:q,frontmatter:B,body:H}},{handler:`template-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read template.`,{handler:`template-get`,cause:e})}},{handler:`template-get`,method:`GET`,skipBodyParse:!0}),dl=withValidation(TemplatePutRequestSchema,async(e,t,S)=>{try{let e=S.name;if(!Xc(e,t,`template-put`))return;let w=Jc(S.folder,t,`folder`,`template-put`);if(!w||il(w.folderRel,e,`template-put`,t))return;let E=applyTemplateWrite({projectDir:w.resolvedContentDir,folder:w.folderRel,name:e,body:typeof S.body==`string`?S.body:``,frontmatter:Zc(S.frontmatter)});if(!E.ok){let e=E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to write template.`:`Invalid template request.`,{handler:`template-put`,detail:E.error.code,cause:Error(E.error.message)});return}successResponse(t,200,TemplatePutSuccessSchema,{path:E.path,created:E.created,warnings:E.warnings},{handler:`template-put`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to write template.`,{handler:`template-put`,cause:e})}},{handler:`template-put`,method:`PUT`}),fl=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`name`)??``;if(!Xc(w,t,`template-delete`))return;let E=Jc(S.searchParams.get(`folder`)??``,t,`folder`,`template-delete`);if(!E||il(E.folderRel,w,`template-delete`,t))return;let D=applyTemplateDelete({projectDir:E.resolvedContentDir,folder:E.folderRel,name:w});if(!D.ok){let e=D.error.code===`WRITE_ERROR`||D.error.code===`UNLINK_FAILED`||D.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to delete template.`:`Invalid template request.`,{handler:`template-delete`,detail:D.error.code,cause:Error(D.error.message)});return}successResponse(t,200,TemplateDeleteSuccessSchema,{existed:D.existed,path:D.path},{handler:`template-delete`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to delete template.`,{handler:`template-delete`,cause:e})}},{handler:`template-delete`,method:`DELETE`,skipBodyParse:!0});function pl(e){let t=new Map;for(let S of e){let e=S.path.split(`/`).filter(Boolean);e.pop();for(let w=1;w<=e.length;w++){let E=e.slice(0,w).join(`/`);t.set(E,Math.max(t.get(E)??0,S.modifiedTs))}}return[...t.entries()].map(([e,t])=>createWorkspaceSearchDocument({kind:`folder`,path:e,modifiedTs:t}))}function ml(e,t){let S=t.trim().toLowerCase();if(!S||!e)return;let w=e.toLowerCase().indexOf(S);if(w<0)return;let E=Math.max(0,w-80),D=Math.min(e.length,w+S.length+120),O=E>0?`…`:``,k=D<e.length?`…`:``;return`${O}${e.slice(E,D).replace(/\s+/g,` `).trim()}${k}`}function hl(e){return e===`autocomplete`||e===`full_text`||e===`omnibar`?e:`omnibar`}function gl(e){let t=typeof e==`string`?e.split(`,`):Array.isArray(e)?e:void 0;if(!t)return;let S=t.filter(e=>e===`page`||e===`folder`||e===`content`);return S.length>0?S:void 0}async function _l(){let e=[];for(let[t,S]of D()){if(isSystemDoc(t)||isConfigDoc(t))continue;let w=``,E=t;try{w=await readFile$1(S.canonicalPath,`utf-8`),E=extractPageTitle(w,t)}catch(e){console.warn(`[search] Failed to index ${t}:`,e)}e.push(createWorkspaceSearchDocument({kind:`page`,path:t,title:E,content:w,modifiedTs:Date.parse(S.modified)}))}return[...e,...pl(e)]}function vl(){return[...D()].filter(([e])=>!isSystemDoc(e)&&!isConfigDoc(e)).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}${t.modified}${t.size}${t.canonicalPath}${t.inode}${t.aliases.join(`,`)}`).join(``)}async function yl(){let e=`${w}${de??``}`,t=vl(),S=workspaceSearchCaches.get(e);if(S?.fingerprint===t&&S.corpus)return S.corpus;if(S?.fingerprint===t&&S.pending)return S.pending;let E=_l().then(e=>createWorkspaceSearchCorpus(e));workspaceSearchCaches.set(e,{fingerprint:t,pending:E});try{let S=await E;return workspaceSearchCaches.get(e)?.pending===E&&workspaceSearchCaches.set(e,{fingerprint:t,corpus:S}),S}catch(t){throw workspaceSearchCaches.get(e)?.pending===E&&workspaceSearchCaches.delete(e),t}}function xl(){if(process.env.NODE_ENV!==`test`)for(let e of[0,1e3,3e3])setTimeout(()=>{yl().catch(e=>{console.warn(`[search] Failed to prewarm workspace search cache:`,e)})},e)}xl();async function Cl(e,t){if(e.method===`GET`)return Tl(e,t);if(e.method===`POST`)return El(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`search`,extraHeaders:{Allow:`GET, POST`}})}let Tl=withValidation(EmptyRequestSchema,async(e,t)=>{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`limit`),E=S.searchParams.get(`query`)??``,D=hl(S.searchParams.get(`intent`)),O=gl(S.searchParams.get(`scope`)??S.searchParams.get(`scopes`)),k=w===null?void 0:Number(w);if(E.length>200){errorResponse(t,400,`urn:ok:error:invalid-request`,`Query is too long (max 200 chars).`,{handler:`search-get`});return}try{let e=performance.now();successResponse(t,200,SearchSuccessSchema,{query:E,intent:D,results:searchWorkspaceCorpus(await yl(),E,{intent:D,scopes:O,limit:k}).map(e=>({kind:e.document.kind,path:e.document.path,title:e.document.title,score:e.score,signals:e.signals,snippet:e.document.kind===`page`?ml(e.document.content,E):void 0})),elapsedMs:Math.max(0,performance.now()-e)},{handler:`search-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to search workspace.`,{handler:`search-get`,cause:e})}},{handler:`search-get`,method:`GET`,skipBodyParse:!0}),El=withValidation(SearchRequestSchema,async(e,t,S)=>{let w=typeof S.query==`string`?S.query:``,E=hl(S.intent),D=gl(S.scopes??S.scope),O=typeof S.limit==`number`?S.limit:void 0;if(w.length>200){errorResponse(t,400,`urn:ok:error:invalid-request`,`Query is too long (max 200 chars).`,{handler:`search-post`});return}try{let e=performance.now();successResponse(t,200,SearchSuccessSchema,{query:w,intent:E,results:searchWorkspaceCorpus(await yl(),w,{intent:E,scopes:D,limit:O}).map(e=>({kind:e.document.kind,path:e.document.path,title:e.document.title,score:e.score,signals:e.signals,snippet:e.document.kind===`page`?ml(e.document.content,w):void 0})),elapsedMs:Math.max(0,performance.now()-e)},{handler:`search-post`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to search workspace.`,{handler:`search-post`,cause:e})}},{handler:`search-post`,method:`POST`}),Dl=withValidation(EmptyRequestSchema,async(e,t)=>{try{successResponse(t,200,SkillInstallStateSuccessSchema,{...await readSkillInstallStateSnapshot(homedir())},{handler:`skill-install-state`,extraHeaders:{"Cache-Control":`no-store`}})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read skill install state.`,{handler:`skill-install-state`,cause:e})}},{handler:`skill-install-state`,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`skill-install-state`})});async function Ol(e,t){if(checkLocalOpSecurity(e,t,{handler:`handoff`}))try{await handleHandoffDispatch(e,t,{contentDir:w,platform:process.platform})}catch(e){t.headersSent||(log$3.error({err:e},`[handoff] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`handoff`,cause:e}))}}async function kl(e,t){if(checkLocalOpSecurity(e,t,{handler:`spawn-cursor`}))try{await handleSpawnCursor(e,t,{contentDir:w,platform:process.platform})}catch(e){t.headersSent||(log$3.error({err:e},`[spawn-cursor] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`spawn-cursor`,cause:e}))}}let jl=withValidation(ShareConstructUrlRequestSchema,async(e,t,S)=>{try{if(!de){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(!isValidShareDocPath(S.docPath)){emitShareConstructUrlLog(`invalid-path`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`invalid-path`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let e=readGitHeadBranch(de);if(e===null){if(readOriginGitHubRepo(de).kind===`no-remote`){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}emitShareConstructUrlLog(`detached-head`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`detached-head`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let w=readOriginGitHubRepo(de);if(w.kind===`no-remote`){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(w.kind===`non-github`){emitShareConstructUrlLog(`non-github-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`non-github-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(!branchExistsOnOrigin(de,e)){emitShareConstructUrlLog(`branch-not-on-origin`,!1),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`branch-not-on-origin`,branch:e},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let E=buildGitHubBlobUrl(w.owner,w.repo,e,S.docPath),D=`${SHARE_BASE_URL}${encodeShareUrl(E)}`;emitShareConstructUrlLog(`ok`,!0),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!0,shareUrl:D,blobUrl:E,branch:e},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG,cause:e})}},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG})}),Ml=withValidation(EmptyRequestSchema,async(e,t)=>{try{if(!de){errorResponse(t,500,`urn:ok:error:internal-server-error`,`projectDir is not configured for this server.`,{handler:BRANCH_INFO_HANDLER_TAG});return}let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`branch`),E=S.searchParams.get(`path`);if(!isValidBranchName(w)){errorResponse(t,400,`urn:ok:error:invalid-request`,`branch query param missing or malformed.`,{handler:BRANCH_INFO_HANDLER_TAG});return}if(!isValidBranchInfoDocPath(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`path query param missing or malformed.`,{handler:BRANCH_INFO_HANDLER_TAG});return}successResponse(t,200,BranchInfoResponseSchema,await computeBranchInfo(de,w,E),{handler:BRANCH_INFO_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:BRANCH_INFO_HANDLER_TAG,cause:e})}},{handler:BRANCH_INFO_HANDLER_TAG,method:`GET`,skipBodyParse:!0}),Pl=withValidation(CheckoutRequestSchema,async(e,t,S)=>{if(extractActorIdentity(S,fe).kind===`invalid-summary`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:CHECKOUT_HANDLER_TAG});return}if(!de){errorResponse(t,500,`urn:ok:error:internal-server-error`,`projectDir is not configured for this server.`,{handler:CHECKOUT_HANDLER_TAG});return}try{successResponse(t,200,CheckoutResponseSchema,await withParentLock(()=>runCheckoutFlow(de,S.branch)),{handler:CHECKOUT_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:CHECKOUT_HANDLER_TAG,cause:e})}},{handler:CHECKOUT_HANDLER_TAG,method:`POST`});async function Fl(e){let[t,...S]=ue,w=[...S,...e];return await new Promise((e,S)=>{let E=spawn(t,w,{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),D=!1,O=setTimeout(()=>{D=!0,E.kill(`SIGTERM`)},SHARE_PUBLISH_TIMEOUT_MS),k=[],j=[];E.stdout.on(`data`,e=>k.push(e)),E.stderr.on(`data`,e=>j.push(e)),E.on(`close`,t=>{if(clearTimeout(O),D){S(Error(`share subprocess timed out after ${SHARE_PUBLISH_TIMEOUT_MS}ms`));return}let w=Buffer.concat(k).toString(`utf-8`);if(t!==0){let e=redactShareSubprocessStderr(Buffer.concat(j).toString(`utf-8`)).slice(0,500);console.warn(`[share] subprocess exited code=${t} stderr=${e}`)}e({stdout:w,code:t})}),E.on(`error`,e=>{clearTimeout(O),S(e)})})}let Il=withValidation(EmptyRequestSchema,async(e,t)=>{if(!we.tryAcquire(`/api/share/publish/owners`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share owners operation is already in progress.`,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let{stdout:e}=await Fl([`share`,`owners`,`--json`]),S=parseOwnersEvent(pickTerminalJsonLine(e));emitSharePublishLog(`owners-list`,S.ok?`ok`:S.error,S.ok?{count:S.owners.length}:void 0),successResponse(t,200,SharePublishOwnersResponseSchema,S,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_OWNERS_KEY)}},{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG})}),Ll=withValidation(EmptyRequestSchema,async(e,t)=>{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`owner`)??``,E=S.searchParams.get(`name`)??``;if(!isValidShareOwnerName(w)||!isValidShareRepoName(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`owner and name query params must be valid GitHub identifiers.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG});return}if(!we.tryAcquire(`/api/share/publish/name-check`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share name-check operation is already in progress.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let{stdout:e}=await Fl([`share`,`name-check`,`--owner`,w,`--name`,E,`--json`]),S=parseNameCheckEvent(pickTerminalJsonLine(e));emitSharePublishLog(`name-check`,S.ok?`ok`:S.error,S.ok?{available:S.available}:void 0),successResponse(t,200,SharePublishNameCheckResponseSchema,S,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_NAME_CHECK_KEY)}},{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG})}),Rl=withValidation(SharePublishRequestSchema,async(e,t,S)=>{if(!de){emitSharePublishLog(`publish-create`,`no-project`),successResponse(t,200,SharePublishResponseSchema,{ok:!1,error:`no-project`},{handler:SHARE_PUBLISH_HANDLER_TAG});return}if(!isValidShareOwnerName(S.owner)||!isValidShareRepoName(S.name)){errorResponse(t,400,`urn:ok:error:invalid-request`,`owner and name must be valid GitHub identifiers.`,{handler:SHARE_PUBLISH_HANDLER_TAG});return}if(!we.tryAcquire(`/api/share/publish`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share publish operation is already in progress.`,{handler:SHARE_PUBLISH_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let e=[`share`,`publish`,`--owner`,S.owner,`--name`,S.name,`--visibility`,S.visibility,`--project-dir`,de,`--json`];S.description!==void 0&&S.description.length>0&&e.push(`--description`,S.description);let{stdout:w}=await Fl(e),E=parsePublishEvent(pickTerminalJsonLine(w));emitSharePublishLog(`publish-create`,E.ok?`ok`:E.error),successResponse(t,200,SharePublishResponseSchema,E,{handler:SHARE_PUBLISH_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_KEY)}},{handler:SHARE_PUBLISH_HANDLER_TAG,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_HANDLER_TAG})}),zl={"/api/asset":ka,"/api/asset-text":xs,"/api/document":jr,"/api/documents":Mr,"/api/backlinks":Fr,"/api/backlink-counts":Ir,"/api/forward-links":Lr,"/api/link-graph":zr,"/api/dead-links":Hr,"/api/orphans":Br,"/api/hubs":Vr,"/api/tags":Kc,"/api/pages":$s,"/api/folder-config":Qc,"/api/template":al,"/api/search":Cl,"/api/suggest-links":ec,"/api/page-headings":Ns,"/api/create-page":Os,"/api/create-folder":ks,"/api/duplicate-path":As,"/api/rename-path":Ps,"/api/delete-path":Is,"/api/trash/cleanup":Rs,"/api/upload":tc,"/api/agent-write":Wt,"/api/agent-write-md":Kt,"/api/frontmatter-patch":$t,"/api/agent-patch":Ur,"/api/agent-undo":Wr,"/api/agent-activity":Gr,"/api/agent-burst-diff":Kr,"/api/save-version":Xr,"/api/history":Zr,"/api/diff":ji,"/api/rollback":Hi,"/api/metrics/reconciliation":Ui,"/api/metrics/parse-health":Gi,"/api/metrics/agent-presence":Xi,"/api/server-info":Ki,"/api/share/construct-url":jl,"/api/git/branch-info":Ml,"/api/git/checkout":Pl,"/api/share/publish/owners":Il,"/api/share/publish/name-check":Ll,"/api/share/publish":Rl,"/api/principal":Yi,"/api/rescue":Ts,"/api/workspace":Zi,"/api/sync/status":Fc,"/api/sync/trigger":Ic,"/api/sync/conflicts":Lc,"/api/sync/conflict-content":zc,"/api/sync/resolve-conflict":Rc,"/api/sync/abort-merge":Gc,"/api/local-op/clone":sc,"/api/local-op/open":dc,"/api/local-op/auth/login":yc,"/api/local-op/auth/status":Sc,"/api/local-op/auth/repos":wc,"/api/local-op/auth/signout":Dc,"/api/local-op/auth/pat":kc,"/api/local-op/auth/identity":jc,"/api/local-op/auth/set-identity":Pc,"/api/installed-agents":Wc,"/api/spawn-cursor":kl,"/api/handoff":Ol,"/api/install-skill":Uc,"/api/skill/install-state":Dl,"/api/seed/plan":Bc,"/api/seed/apply":Vc,"/api/seed/packs":Hc};F&&(zl[`/api/test-reset`]=qr,zl[`/api/test-rescan-backlinks`]=Jr,zl[`/api/test-rescan-files`]=Yr);let Bl=new Set([`/api/upload`,`/api/create-page`,`/api/create-folder`,`/api/duplicate-path`,`/api/rename-path`,`/api/delete-path`,`/api/trash/cleanup`,`/api/agent-write`,`/api/agent-write-md`,`/api/frontmatter-patch`,`/api/agent-patch`,`/api/agent-undo`,`/api/save-version`,`/api/rollback`,`/api/sync/trigger`,`/api/sync/resolve-conflict`,`/api/sync/abort-merge`,`/api/git/checkout`,`/api/test-reset`,`/api/test-rescan-backlinks`,`/api/test-rescan-files`,`/api/install-skill`,`/api/folder-config`,`/api/template`,`/api/seed/apply`]),Vl=[`/api/local-op/`];return{priority:100,async onRequest({request:e,response:t}){let S=e.url?.split(`?`)[0];if(!S)return;if(S.startsWith(`/api/`)){let S=e.headers.origin;if(S!==void 0&&!isAllowedApiOrigin(S)){errorResponse(t,403,`urn:ok:error:invalid-origin`,`Origin not allowed.`,{handler:`api-origin-gate`});return}if(typeof t.setHeader==`function`&&(S!==void 0&&(t.setHeader(`Access-Control-Allow-Origin`,S),t.setHeader(`Vary`,`Origin`)),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, traceparent, tracestate, baggage`)),e.method===`OPTIONS`){t.writeHead(204),t.end();return}}if(Bl.has(S)||Vl.some(e=>S.startsWith(e))){let S=e.socket?.remoteAddress;if(S!==void 0&&!isLoopbackAddress(S)){errorResponse(t,403,`urn:ok:error:loopback-required`,`Loopback required.`,{handler:`api-mutating-gate`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){errorResponse(t,403,`urn:ok:error:host-not-allowed`,`Host header not allowed.`,{handler:`api-mutating-gate`});return}}if(!S.startsWith(`/api/`))return;let w=propagation.extract(context.active(),e.headers),E=e.method??`GET`,D=S;S.startsWith(`/api/rescue/`)?D=`/api/rescue/:docName`:S.startsWith(`/api/history/`)?D=`/api/history/:sha`:S.startsWith(`/api/tags/`)?D=`/api/tags/:name`:zl[S]||(D=`/api/*`);let O=getTracer(),k=Date.now();await context.with(w,()=>O.startActiveSpan(`HTTP ${E} ${D}`,{kind:SpanKind.SERVER,attributes:{[ATTR_HTTP_REQUEST_METHOD]:E,[ATTR_HTTP_ROUTE]:D,[ATTR_URL_PATH]:S,[ATTR_URL_SCHEME]:`http`,[ATTR_USER_AGENT_ORIGINAL]:e.headers[`user-agent`]??``}},async w=>{try{let D=zl[S],O=!1;if(D)O=!0,await D(e,t);else if(S.startsWith(`/api/rescue/`)){let w=decodeURIComponent(S.slice(12));w&&(O=!0,await Ds(e,t,w))}else if(S.startsWith(`/api/history/`)){let w=decodeURIComponent(S.slice(13));w&&(O=!0,await Qr(e,t,w))}else if(S.startsWith(`/api/tags/`)){let w=S.slice(10);w&&(O=!0,await qc(e,t,w))}O||errorResponse(t,404,`urn:ok:error:not-found`,`API endpoint not found.`,{handler:`api-dispatch`,detail:`No handler for ${E} ${S}`});let k=t.statusCode;w.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE,k),k>=500&&w.setStatus({code:SpanStatusCode.ERROR,message:`status ${k}`})}catch(e){throw w.recordException(e),w.setStatus({code:SpanStatusCode.ERROR,message:e instanceof Error?e.message:String(e)}),!t.headersSent&&!t.writableEnded&&!t.destroyed&&errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:D,cause:e}),e}finally{w.end();let e=(Date.now()-k)/1e3;httpDurationHist().record(e,{[ATTR_HTTP_REQUEST_METHOD]:E,[ATTR_HTTP_ROUTE]:D,[ATTR_HTTP_RESPONSE_STATUS_CODE]:t.statusCode})}}))}}}function isWithinDir(e,t){return e===t?!0:e.startsWith(`${t}${sep}`)}function errnoCode(e){let t=e?.code;return typeof t==`string`?t:void 0}function seedBasenameIndex(e){let t=e.contentDir,S=new Set;function w(E){let D;try{D=readdirSync(E,{withFileTypes:!0})}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`read-failed`,S,E);return}for(let O of D){let D=join(E,O.name),k=relative(t,D);if(k.startsWith(`..`)||e.contentFilter?.isDirExcluded(k)&&O.isDirectory())continue;let j;try{j=lstatSync(D)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`lstat-failed`,S,D);continue}if(j.isSymbolicLink()){let E;try{E=realpathSync(D)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`realpath-failed`,S,D);continue}if(!isWithinDir(E,t)){e.onSkip?.(`symlink-escape`,void 0,D);continue}let O;try{O=statSync(E)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`symlink-stat-failed`,S,E);continue}if(S.has(O.ino))continue;S.add(O.ino),O.isDirectory()?w(E):O.isFile()&&isSupportedAssetFile(D,ASSET_EXTENSIONS)&&!e.contentFilter?.isExcluded(k)&&e.basenameIndex.add(k);continue}if(j.isDirectory()){if(S.has(j.ino))continue;S.add(j.ino),w(D);continue}j.isFile()&&isSupportedAssetFile(D,ASSET_EXTENSIONS)&&!e.contentFilter?.isExcluded(k)&&e.basenameIndex.add(k)}}w(t)}const HocuspocusAuthTokenSchema=object$1({principalId:string$2().optional(),tabSessionId:string$2().optional(),expectedServerInstanceId:string$2().optional(),expectedBranch:string$2().optional()}).loose(),HOCUSPOCUS_AUTH_REJECTION_REASONS=[`server-instance-mismatch`,`branch-mismatch`,`rename-redirect`,`doc-deleted`];function isHocuspocusAuthRejectionReason(e){return HOCUSPOCUS_AUTH_REJECTION_REASONS.includes(e)}const WIRE_PAYLOAD_SEPARATOR=`:`;function formatAuthRejectionWire(e,t){return typeof t!=`string`||t.length===0?e:`${e}${WIRE_PAYLOAD_SEPARATOR}${t}`}function parseAuthRejectionWire(e){if(e.length===0)return{kind:null,payload:void 0};let t=e.indexOf(WIRE_PAYLOAD_SEPARATOR),S=t===-1?e:e.slice(0,t);if(!isHocuspocusAuthRejectionReason(S))return{kind:null,payload:void 0};if(t===-1)return{kind:S,payload:void 0};let w=e.slice(t+1);return{kind:S,payload:w.length>0?w:void 0}}var HocuspocusAuthRejection=class extends Error{kind;payload;reason;constructor(e,t,S){super(t),this.name=`HocuspocusAuthRejection`,this.kind=e,this.payload=typeof S==`string`&&S.length>0?S:void 0,this.reason=formatAuthRejectionWire(e,this.payload)}};function parseHocuspocusAuthToken(e){if(typeof e!=`string`||e.length===0)return;let t;try{t=JSON.parse(e)}catch{return}let S=HocuspocusAuthTokenSchema.safeParse(t);return S.success?S.data:void 0}const log$2=getLogger(`conflict-storage`);var ConflictStore=class{storePath;projectDir;branch;conflicts=[];constructor(e,t=`main`){this.storePath=join(getLocalDir(e),`conflicts.json`),this.projectDir=e,this.branch=t,this.load()}load(){if(!existsSync(this.storePath)){this.conflicts=[];return}try{let e=readFileSync(this.storePath,`utf-8`),t=JSON.parse(e);if(t.version!==1){log$2.warn({path:this.storePath},`[conflicts] unknown schema version — resetting`),this.conflicts=[];return}this.branch=t.branch??this.branch,this.conflicts=t.conflicts??[]}catch(e){log$2.warn({err:e},`[conflicts] failed to load conflicts.json — starting empty`),this.conflicts=[]}}save(){try{let e=dirname(this.storePath);existsSync(e)||mkdirSync(e,{recursive:!0});let t={version:1,branch:this.branch,conflicts:this.conflicts};writeFileSync(this.storePath,JSON.stringify(t,null,2),`utf-8`)}catch(e){log$2.warn({err:e},`[conflicts] failed to save conflicts.json`)}}addConflict(e){let t=this.conflicts.findIndex(t=>t.file===e.file);t===-1?this.conflicts.push(e):this.conflicts[t]=e,this.save()}removeConflict(e){this.conflicts=this.conflicts.filter(t=>t.file!==e),this.save()}clear(){this.conflicts=[],this.save()}count(){return this.conflicts.length}list(){return[...this.conflicts]}hasConflicts(){return this.conflicts.length>0}setBranch(e){this.branch=e}async resolveConflict(e,t,S,w=[]){if(!this.conflicts.find(t=>t.file===e))throw Error(`[conflicts] no conflict tracked for file: ${e}`);if(t===`content`&&S===void 0)throw Error(`[conflicts] strategy 'content' requires content parameter`);let{createGitInstance:E}=await import(`./git-handle-CjyGVy33-lwHYMDQ0.mjs`).then(e=>e.n),D=E(this.projectDir,{credentialArgs:w});switch(t){case`mine`:await D.git.raw([`checkout`,`--ours`,`--`,e]),await D.git.raw([`add`,`--`,e]);break;case`theirs`:await D.git.raw([`checkout`,`--theirs`,`--`,e]),await D.git.raw([`add`,`--`,e]);break;case`content`:{if(S===void 0)throw Error(`[conflicts] strategy 'content' requires content parameter`);let t=resolve(this.projectDir),w=resolve(t,e);if(w!==t&&!w.startsWith(`${t}/`))throw Error(`[conflicts] file path escapes project directory: ${e}`);writeFileSync(w,S,`utf-8`),await D.git.raw([`add`,`--`,e]);break}case`delete`:await D.git.raw([`rm`,`--`,e]);break;default:throw Error(`[conflicts] unknown resolve strategy: ${t}`)}if(this.removeConflict(e),!this.hasConflicts())try{await D.git.raw([`commit`,`--no-edit`]),log$2.info({file:e},`[conflicts] all conflicts resolved — merge commit created`)}catch(t){let S=new Date().toISOString(),w=!1;try{let e=(await D.git.raw([`diff`,`--name-only`,`--diff-filter=U`])).split(`
|
|
2242
|
+
`).map(e=>e.trim()).filter(Boolean),k=null;for(let e=O.length-1;e>=0;e--)try{k=JSON.parse(O[e]);break}catch{}k===null?successResponse(t,200,LocalOpAuthPatSuccessSchema,{},{handler:Oc}):successResponse(t,200,LocalOpAuthPatSuccessSchema,k,{handler:Oc})}catch(e){errorResponse(t,500,`urn:ok:error:auth-failed`,`Auth pat failed.`,{handler:Oc,cause:e})}finally{we.release(gc)}},{handler:Oc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Oc})}),Ac=`local-op-auth-identity`;async function jc(e,t){if(checkLocalOpSecurity(e,t,{handler:Ac})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:Ac,extraHeaders:{Allow:`GET`}});return}if(!de){errorResponse(t,503,`urn:ok:error:no-project-dir`,`No project directory configured.`,{handler:Ac});return}try{successResponse(t,200,LocalOpAuthIdentitySuccessSchema,{identity:await resolveGitIdentity(de)},{handler:Ac})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Identity resolution failed.`,{handler:Ac,cause:e})}}}let Mc=`/api/local-op/auth/set-identity`,Nc=`local-op-auth-set-identity`,Pc=withValidation(LocalOpAuthSetIdentityRequestSchema,async(e,t,S)=>{let w=S.name.trim(),E=S.email.trim();if(!de){errorResponse(t,503,`urn:ok:error:no-project-dir`,`No project directory configured.`,{handler:Nc});return}if(!we.tryAcquire(Mc)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A set-identity operation is already in progress.`,{handler:Nc,extraHeaders:{"Retry-After":`5`}});return}try{writeGitIdentity(de,w,E),ce?.()?.refreshIdentity().catch(()=>{}),successResponse(t,200,LocalOpAuthEmptySuccessSchema,{},{handler:Nc})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Set-identity failed.`,{handler:Nc,cause:e})}finally{we.release(Mc)}},{handler:Nc,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:Nc})});async function Fc(e,t){if(checkLocalOpSecurity(e,t,{handler:`sync-status`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-status`,extraHeaders:{Allow:`GET`}});return}try{let e=ce?.();if(!e){successResponse(t,200,SyncStatusSchema,{state:`dormant`,lastSyncUtc:null,lastFetchUtc:null,lastPushedSha:null,ahead:0,behind:0,consecutiveFailures:0,conflictCount:0,hasRemote:!1,syncEnabled:!1,identityUnresolved:!1,remote:null},{handler:`sync-status`});return}await e.refreshRemote(),successResponse(t,200,SyncStatusSchema,e.getStatus(),{handler:`sync-status`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`sync-status`,cause:e})}}}let Ic=withValidation(SyncTriggerRequestSchema,async(e,t,S)=>{let w=ce?.();if(!w){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-trigger`});return}let E=S.op??`sync`;successResponse(t,202,SyncTriggerSuccessSchema,{op:E},{handler:`sync-trigger`}),w.trigger(E)},{handler:`sync-trigger`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`sync-trigger`})?ce?.()?!0:(errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-trigger`}),!1):!1});async function Lc(e,t){if(checkLocalOpSecurity(e,t,{handler:`sync-conflicts`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-conflicts`,extraHeaders:{Allow:`GET`}});return}try{let e=ce?.();successResponse(t,200,SyncConflictsSuccessSchema,{conflicts:e?e.getConflicts():[]},{handler:`sync-conflicts`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`sync-conflicts`,cause:e})}}}let Rc=withValidation(SyncResolveConflictRequestSchema,async(e,t,S)=>{let w=ce?.();if(!w){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-resolve-conflict`});return}let{file:E,strategy:D,content:O}=S;try{await w.resolveConflict(E,D,O),successResponse(t,200,SyncResolveConflictSuccessSchema,{},{handler:`sync-resolve-conflict`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to resolve conflict.`,{handler:`sync-resolve-conflict`,cause:e,detail:e instanceof Error?e.message:void 0})}},{handler:`sync-resolve-conflict`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`sync-resolve-conflict`})?ce?.()?!0:(errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-resolve-conflict`}),!1):!1});async function zc(e,S){if(!checkLocalOpSecurity(e,S,{handler:`sync-conflict-content`}))return;if(e.method!==`GET`){errorResponse(S,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-conflict-content`,extraHeaders:{Allow:`GET`}});return}if(!de){errorResponse(S,503,`urn:ok:error:project-repo-not-configured`,`Project repo not configured.`,{handler:`sync-conflict-content`});return}let w=new URL(e.url??`/`,`http://${e.headers.host??`localhost`}`),E=w.searchParams.get(`file`);if(!E){errorResponse(S,400,`urn:ok:error:invalid-request`,`Missing required query param: file.`,{handler:`sync-conflict-content`});return}if(E.includes(`..`)||E.startsWith(`/`)){errorResponse(S,400,`urn:ok:error:invalid-request`,`Invalid file path.`,{handler:`sync-conflict-content`});return}let D=stripDocExtension(E),O=t.documents.get(D)?.getMap(`lifecycle`).get(`status`)===`conflict`,k=ce?.(),j=k?k.getConflicts().some(e=>e.file===E):!1;if(!O&&!j){errorResponse(S,404,`urn:ok:error:no-conflict-tracked`,`No conflict is tracked for this path.`,{handler:`sync-conflict-content`,extensions:{file:E}});return}let F=w.searchParams.get(`source`),L=esm_default({baseDir:de,timeout:{block:15e3}});async function B(e){try{return{present:!0,content:await L.raw([`show`,`:${e}:${E}`])}}catch(t){let S=t instanceof Error?t.message:String(t);if(!/pathspec|did not match|exists on disk, but not in|is in the index, but not at stage/i.test(S))throw console.warn(JSON.stringify({event:`showstage-unexpected-error`,stage:e,file:E,detail:S,handler:`sync-conflict-content`})),t;return{present:!1}}}try{let[e,w,D]=await Promise.all([B(1),B(2),B(3)]),O=e.present?e.content:``,k=D.present?D.content:``,j=w.present&&D.present?`both-modified`:!w.present&&D.present?`delete-modify`:w.present&&!D.present?`modify-delete`:`both-modified`,L=w.present?w.content:``,H=null;if(F===`ytext`){let e=stripDocExtension(E),S=t.documents.get(e);if(S){let t=S.getMap(`lifecycle`).get(`status`);if(H=typeof t==`string`&&t.length>0?t:null,j!==`delete-modify`){let t=Ce?Ce(e):null;t!==null&&!ytextHasConflictMarkers(t)?L=t:t!==null&&console.warn(JSON.stringify({event:`ytext-conflict-marker-detected`,"doc.name":e,handler:`sync-conflict-content`}))}}else console.warn(`[conflict-content] doc ${e} not loaded; lifecycleStatus unavailable`)}successResponse(S,200,SyncConflictContentSuccessSchema,{file:E,base:O,ours:L,theirs:k,kind:j,lifecycleStatus:H},{handler:`sync-conflict-content`})}catch(e){errorResponse(S,500,`urn:ok:error:internal-server-error`,`Failed to read conflict content.`,{handler:`sync-conflict-content`,cause:e})}}async function Bc(e,t){if(!checkLocalOpSecurity(e,t,{handler:`seed-plan`}))return;if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`seed-plan`,extraHeaders:{Allow:`GET`}});return}let S=new URL(e.url??`/`,`http://localhost`),E=S.searchParams.get(`rootDir`)??void 0,D=S.searchParams.get(`packId`),O=coercePackId(D);if(D!==null&&D!==``&&O===void 0){errorResponse(t,400,`urn:ok:error:invalid-request`,`Unknown packId.`,{handler:`seed-plan`,detail:`Pack id "${D}" is not registered.`});return}try{successResponse(t,200,SeedPlanSuccessSchema,{plan:await planSeed({projectDir:w,rootDir:E,packId:O})},{handler:`seed-plan`})}catch(e){if(e instanceof SeedPrerequisiteError){errorResponse(t,422,`urn:ok:error:seed-prerequisite-missing`,`Seed prerequisite missing.`,{handler:`seed-plan`,cause:e});return}if(e instanceof SeedRootDirError){errorResponse(t,400,`urn:ok:error:seed-invalid-root`,`Invalid seed root directory.`,{handler:`seed-plan`,detail:`The provided root directory is not within the workspace content directory.`,cause:e});return}errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`seed-plan`,cause:e})}}let Vc=withValidation(SeedApplyRequestSchema,async(e,t,S)=>{let E=S.plan;if(!E||typeof E!=`object`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid plan payload.`,{handler:`seed-apply`});return}let D=E,O=S.packId,k=coercePackId(O);if(typeof O==`string`&&O.length>0&&k===void 0){errorResponse(t,400,`urn:ok:error:invalid-request`,`Unknown packId.`,{handler:`seed-apply`,detail:`Pack id "${O}" is not registered.`});return}try{successResponse(t,200,SeedApplySuccessSchema,{result:await applySeed(D,{projectDir:w,packId:k})},{handler:`seed-apply`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to apply seed plan.`,{handler:`seed-apply`,cause:e})}},{handler:`seed-apply`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`seed-apply`})});async function Hc(e,t){if(checkLocalOpSecurity(e,t,{handler:`seed-packs`})){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`seed-packs`,extraHeaders:{Allow:`GET`}});return}successResponse(t,200,SeedListPacksSuccessSchema,{packs:listStarterPacks()},{handler:`seed-packs`})}}let Uc=withValidation(InstallSkillRequestSchema,async(e,t,S)=>{if(S.out!==void 0&&!isSafeLocalPath(S.out)){errorResponse(t,400,`urn:ok:error:invalid-request`,`Output path must be within home directory.`,{handler:`install-skill`});return}try{successResponse(t,200,InstallSkillSuccessSchema,await buildAndOpenSkill({...S.noOpen===void 0?{}:{noOpen:S.noOpen},...S.out===void 0?{}:{out:S.out}}),{handler:`install-skill`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to install skill.`,{handler:`install-skill`,cause:e})}},{handler:`install-skill`,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`install-skill`})});async function Wc(e,t){if(checkLocalOpSecurity(e,t,{handler:`installed-agents`}))try{await handleInstalledAgents(e,t,ze.probeAll)}catch(e){t.headersSent||(log$3.error({err:e},`[installed-agents] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`installed-agents`,cause:e}))}}async function Gc(e,t){if(!checkLocalOpSecurity(e,t,{handler:`sync-abort-merge`}))return;if(e.method!==`POST`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`sync-abort-merge`,extraHeaders:{Allow:`POST`}});return}let S=ce?.();if(!S){errorResponse(t,503,`urn:ok:error:sync-not-active`,`Sync engine not active.`,{handler:`sync-abort-merge`});return}try{await S.abortMerge(),successResponse(t,200,SyncAbortMergeSuccessSchema,{},{handler:`sync-abort-merge`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to abort merge.`,{handler:`sync-abort-merge`,cause:e})}}let Kc=withValidation(EmptyRequestSchema,async(e,t)=>{if(!te){errorResponse(t,503,`urn:ok:error:tag-index-not-configured`,`Tag index not configured.`,{handler:`tags-list`});return}try{successResponse(t,200,TagsListSuccessSchema,{tags:te.getAllTags()},{handler:`tags-list`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read tags.`,{handler:`tags-list`,cause:e})}},{handler:`tags-list`,method:`GET`,skipBodyParse:!0});async function qc(e,t,S){if(e.method!==`GET`){errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`tags-for-name`,extraHeaders:{Allow:`GET`}});return}if(!te){errorResponse(t,503,`urn:ok:error:tag-index-not-configured`,`Tag index not configured.`,{handler:`tags-for-name`});return}let w;try{w=decodeURIComponent(S)}catch{errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid tag name encoding.`,{handler:`tags-for-name`});return}if(!w){errorResponse(t,400,`urn:ok:error:invalid-request`,`Missing tag name.`,{handler:`tags-for-name`});return}try{let e=te.getDocsForTagWithMatches(w).map(({docName:e,matchingTags:t})=>({docName:e,title:Ve(e),matchingTags:t,snippet:null}));successResponse(t,200,TagsForNameSuccessSchema,{name:w,docs:e},{handler:`tags-for-name`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read tag membership.`,{handler:`tags-for-name`,cause:e})}}function Jc(e,t,S=`path`,E=`folder-config`){let D=e.replace(/^\.\//,``).replace(/^\/+/,``).replace(/\/+$/,``);if(D.split(`/`).some(e=>e===`..`)||e.startsWith(`/`))return errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid ${S}: must be project-root-relative.`,{handler:E}),null;let O=resolve(w),k=D===``?O:resolve(O,D);return k!==O&&!k.startsWith(`${O}${sep}`)?(errorResponse(t,400,`urn:ok:error:invalid-request`,`Path escapes content directory.`,{handler:E}),null):{folderRel:D,resolvedContentDir:O}}let Yc=/^[A-Za-z0-9_-]+$/;function Xc(e,t,S=`template`){return!e||!Yc.test(e)?(errorResponse(t,400,`urn:ok:error:invalid-request`,"Invalid name: must be letters / digits / `_` / `-` only (no `.md` extension).",{handler:S}),!1):!0}function Zc(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return t;for(let[S,w]of Object.entries(e))w!==void 0&&(t[S]=w);return t}function Qc(e){let t={};if(!e||typeof e!=`object`||Array.isArray(e))return{patch:t,badField:null};for(let[S,w]of Object.entries(e)){if(w===void 0)continue;if(w===null){t[S]=null;continue}let e=DeclarationSchema.safeParse(w);if(!e.success)return{patch:null,badField:S};t[S]=e.data}return{patch:t,badField:null}}async function $c(e,t){if(e.method===`GET`)return nl(e,t);if(e.method===`PUT`)return il(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`folder-config`,extraHeaders:{Allow:`GET, PUT`}})}let nl=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=Jc(new URL(e.url??``,`http://localhost`).searchParams.get(`path`)??``,t,`path`,`folder-config-get`);if(!S)return;let w=await enrichDirectory(S.folderRel,{projectDir:S.resolvedContentDir}),E=resolve(S.resolvedContentDir,S.folderRel,`.ok`),D=resolve(E,`frontmatter.yml`),O=null;if(existsSync(D))try{let e=(0,import_dist$1.parse)(await readFile$1(D,`utf-8`));O=e&&typeof e==`object`&&!Array.isArray(e)?e:{}}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[folder-config:get] malformed YAML in ${D}: ${t}`),O=null}let k=resolveNestedFrontmatterWithSources(S.resolvedContentDir,S.folderRel),j=resolve(E,`schema.yml`),F=null;if(existsSync(j))try{let e=(0,import_dist$1.parse)(await readFile$1(j,`utf-8`)),t=FolderSchemaSchema.safeParse(e);t.success?F=t.data.declarations:(console.warn(`[ok-folder-schema] invalid shape at ${j}: ${t.error.message}`),F=null)}catch(e){let t=e instanceof Error?e.message:String(e);console.warn(`[ok-folder-schema] malformed YAML in ${j}: ${t}`),F=null}let L=Object.keys(k.declarations).length>0;successResponse(t,200,FolderConfigGetSuccessSchema,{folder:w,frontmatter_local:O,...Object.keys(k.sources).length>0?{frontmatter_sources:k.sources}:{},...L?{schema_declarations:k.declarations,schema_sources:k.declarationSources}:{},schema_local:F},{handler:`folder-config-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read folder config.`,{handler:`folder-config-get`,cause:e})}},{handler:`folder-config-get`,method:`GET`,skipBodyParse:!0}),il=withValidation(FolderConfigPutRequestSchema,async(e,t,S)=>{try{let e=Jc(S.path,t,`path`,`folder-config-put`);if(!e)return;let w=e.folderRel===``?`**`:`${e.folderRel}/**`,E;if(S.declarations!==void 0){let e=Qc(S.declarations);if(e.patch===null){errorResponse(t,400,`urn:ok:error:invalid-request`,`Invalid declaration for field "${e.badField}": must be { type: text|number|boolean|date|list } or null.`,{handler:`folder-config-put`,detail:`INVALID_DECLARATION`});return}E=e.patch}let D=[];if(S.frontmatter!==void 0){let E=applyNestedFolderRulesUpsert({projectDir:e.resolvedContentDir,rules:[{match:w,frontmatter:Zc(S.frontmatter)}]});if(!E.ok){let e=E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to write folder config.`:`Invalid folder config request.`,{handler:`folder-config-put`,detail:E.error.code,cause:Error(E.error.message)});return}D.push(...E.applied)}if(E!==void 0&&Object.keys(E).length>0){let S=applyNestedFolderSchemaUpsert({projectDir:e.resolvedContentDir,rules:[{match:w,declarations:E}]});if(!S.ok){let e=S.error.code===`WRITE_ERROR`||S.error.code===`BAD_PROJECT_DIR`?500:400,w=e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,E=e===500?`Failed to write folder schema.`:`Invalid folder schema request.`,O=D.length>0?{partiallyApplied:D}:void 0;errorResponse(t,e,w,E,{handler:`folder-config-put`,detail:S.error.code,cause:Error(S.error.message),...O?{extensions:O}:{}});return}D.push(...S.applied)}successResponse(t,200,FolderConfigPutSuccessSchema,{applied:D},{handler:`folder-config-put`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to write folder config.`,{handler:`folder-config-put`,cause:e})}},{handler:`folder-config-put`,method:`PUT`});function al(e,S,w,E){if(!S)return!1;let D=e===``?`.ok/templates/${S}`:`${e.replace(/\/$/,``)}/.ok/templates/${S}`,O=t.documents.get(D);return O&&isDocInConflict(O)?(respondDocInConflict(E,new DocInConflictError({file:`${D}.md`}),w),!0):!1}async function cl(e,t){if(e.method===`GET`)return dl(e,t);if(e.method===`PUT`)return fl(e,t);if(e.method===`DELETE`)return pl(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`template`,extraHeaders:{Allow:`GET, PUT, DELETE`}})}let ll=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/,ul=e=>{let t=e.match(ll),S={},w=e;if(t){try{let e=(0,import_dist$1.parse)(t[1]??``);e&&typeof e==`object`&&!Array.isArray(e)&&(S=e)}catch{}w=e.slice(t[0].length)}return{frontmatter:S,body:w}},dl=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`name`)??``;if(!Xc(w,t,`template-get`))return;let E=Jc(S.searchParams.get(`folder`)??``,t,`folder`,`template-get`);if(!E)return;let{folderRel:D,resolvedContentDir:O}=E,k=D===``?[]:D.split(`/`),j=null,F=null,L=null;for(let e=k.length;e>=0;e--){let t=e===0?``:k.slice(0,e).join(`/`),S=t===``?O:resolve(O,t);if(S!==O&&!S.startsWith(`${O}${sep}`))continue;let E=resolve(S,`.ok`,`templates`,`${w}.md`);if(existsSync(E)){j=E,F=t,L=e===k.length?`local`:`inherited`;break}}if(!j||F===null||L===null){errorResponse(t,404,`urn:ok:error:template-not-found`,`Template not found.`,{handler:`template-get`,detail:`Template "${w}" not found for folder "${D||`.`}". Walked leaf → root.`});return}let{frontmatter:B,body:H}=ul(await readFile$1(j,`utf-8`)),q=relative(O,j).split(/[\\/]/).filter(Boolean).join(`/`);successResponse(t,200,TemplateGetSuccessSchema,{template:{name:w,folder:F,scope:L,path:q,frontmatter:B,body:H}},{handler:`template-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read template.`,{handler:`template-get`,cause:e})}},{handler:`template-get`,method:`GET`,skipBodyParse:!0}),fl=withValidation(TemplatePutRequestSchema,async(e,t,S)=>{try{let e=S.name;if(!Xc(e,t,`template-put`))return;let w=Jc(S.folder,t,`folder`,`template-put`);if(!w||al(w.folderRel,e,`template-put`,t))return;let E=applyTemplateWrite({projectDir:w.resolvedContentDir,folder:w.folderRel,name:e,body:typeof S.body==`string`?S.body:``,frontmatter:Zc(S.frontmatter)});if(!E.ok){let e=E.error.code===`WRITE_ERROR`||E.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to write template.`:`Invalid template request.`,{handler:`template-put`,detail:E.error.code,cause:Error(E.error.message)});return}successResponse(t,200,TemplatePutSuccessSchema,{path:E.path,created:E.created,warnings:E.warnings},{handler:`template-put`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to write template.`,{handler:`template-put`,cause:e})}},{handler:`template-put`,method:`PUT`}),pl=withValidation(EmptyRequestSchema,async(e,t)=>{try{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`name`)??``;if(!Xc(w,t,`template-delete`))return;let E=Jc(S.searchParams.get(`folder`)??``,t,`folder`,`template-delete`);if(!E||al(E.folderRel,w,`template-delete`,t))return;let D=applyTemplateDelete({projectDir:E.resolvedContentDir,folder:E.folderRel,name:w});if(!D.ok){let e=D.error.code===`WRITE_ERROR`||D.error.code===`UNLINK_FAILED`||D.error.code===`BAD_PROJECT_DIR`?500:400;errorResponse(t,e,e===500?`urn:ok:error:internal-server-error`:`urn:ok:error:invalid-request`,e===500?`Failed to delete template.`:`Invalid template request.`,{handler:`template-delete`,detail:D.error.code,cause:Error(D.error.message)});return}successResponse(t,200,TemplateDeleteSuccessSchema,{existed:D.existed,path:D.path},{handler:`template-delete`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to delete template.`,{handler:`template-delete`,cause:e})}},{handler:`template-delete`,method:`DELETE`,skipBodyParse:!0});function ml(e){let t=new Map;for(let S of e){let e=S.path.split(`/`).filter(Boolean);e.pop();for(let w=1;w<=e.length;w++){let E=e.slice(0,w).join(`/`);t.set(E,Math.max(t.get(E)??0,S.modifiedTs))}}return[...t.entries()].map(([e,t])=>createWorkspaceSearchDocument({kind:`folder`,path:e,modifiedTs:t}))}function hl(e,t){let S=t.trim().toLowerCase();if(!S||!e)return;let w=e.toLowerCase().indexOf(S);if(w<0)return;let E=Math.max(0,w-80),D=Math.min(e.length,w+S.length+120),O=E>0?`…`:``,k=D<e.length?`…`:``;return`${O}${e.slice(E,D).replace(/\s+/g,` `).trim()}${k}`}function gl(e){return e===`autocomplete`||e===`full_text`||e===`omnibar`?e:`omnibar`}function _l(e){let t=typeof e==`string`?e.split(`,`):Array.isArray(e)?e:void 0;if(!t)return;let S=t.filter(e=>e===`page`||e===`folder`||e===`content`);return S.length>0?S:void 0}async function vl(){let e=[];for(let[t,S]of D()){if(isSystemDoc(t)||isConfigDoc(t))continue;let w=``,E=t;try{w=await readFile$1(S.canonicalPath,`utf-8`),E=extractPageTitle(w,t)}catch(e){console.warn(`[search] Failed to index ${t}:`,e)}e.push(createWorkspaceSearchDocument({kind:`page`,path:t,title:E,content:w,modifiedTs:Date.parse(S.modified)}))}return[...e,...ml(e)]}function yl(){return[...D()].filter(([e])=>!isSystemDoc(e)&&!isConfigDoc(e)).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}${t.modified}${t.size}${t.canonicalPath}${t.inode}${t.aliases.join(`,`)}`).join(``)}async function xl(){let e=`${w}${de??``}`,t=yl(),S=workspaceSearchCaches.get(e);if(S?.fingerprint===t&&S.corpus)return S.corpus;if(S?.fingerprint===t&&S.pending)return S.pending;let E=vl().then(e=>createWorkspaceSearchCorpus(e));workspaceSearchCaches.set(e,{fingerprint:t,pending:E});try{let S=await E;return workspaceSearchCaches.get(e)?.pending===E&&workspaceSearchCaches.set(e,{fingerprint:t,corpus:S}),S}catch(t){throw workspaceSearchCaches.get(e)?.pending===E&&workspaceSearchCaches.delete(e),t}}function Cl(){if(process.env.NODE_ENV!==`test`)for(let e of[0,1e3,3e3])setTimeout(()=>{xl().catch(e=>{console.warn(`[search] Failed to prewarm workspace search cache:`,e)})},e)}Cl();async function Tl(e,t){if(e.method===`GET`)return El(e,t);if(e.method===`POST`)return Dl(e,t);errorResponse(t,405,`urn:ok:error:method-not-allowed`,`Method not allowed.`,{handler:`search`,extraHeaders:{Allow:`GET, POST`}})}let El=withValidation(EmptyRequestSchema,async(e,t)=>{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`limit`),E=S.searchParams.get(`query`)??``,D=gl(S.searchParams.get(`intent`)),O=_l(S.searchParams.get(`scope`)??S.searchParams.get(`scopes`)),k=w===null?void 0:Number(w);if(E.length>200){errorResponse(t,400,`urn:ok:error:invalid-request`,`Query is too long (max 200 chars).`,{handler:`search-get`});return}try{let e=performance.now();successResponse(t,200,SearchSuccessSchema,{query:E,intent:D,results:searchWorkspaceCorpus(await xl(),E,{intent:D,scopes:O,limit:k}).map(e=>({kind:e.document.kind,path:e.document.path,title:e.document.title,score:e.score,signals:e.signals,snippet:e.document.kind===`page`?hl(e.document.content,E):void 0})),elapsedMs:Math.max(0,performance.now()-e)},{handler:`search-get`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to search workspace.`,{handler:`search-get`,cause:e})}},{handler:`search-get`,method:`GET`,skipBodyParse:!0}),Dl=withValidation(SearchRequestSchema,async(e,t,S)=>{let w=typeof S.query==`string`?S.query:``,E=gl(S.intent),D=_l(S.scopes??S.scope),O=typeof S.limit==`number`?S.limit:void 0;if(w.length>200){errorResponse(t,400,`urn:ok:error:invalid-request`,`Query is too long (max 200 chars).`,{handler:`search-post`});return}try{let e=performance.now();successResponse(t,200,SearchSuccessSchema,{query:w,intent:E,results:searchWorkspaceCorpus(await xl(),w,{intent:E,scopes:D,limit:O}).map(e=>({kind:e.document.kind,path:e.document.path,title:e.document.title,score:e.score,signals:e.signals,snippet:e.document.kind===`page`?hl(e.document.content,w):void 0})),elapsedMs:Math.max(0,performance.now()-e)},{handler:`search-post`})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to search workspace.`,{handler:`search-post`,cause:e})}},{handler:`search-post`,method:`POST`}),Ol=withValidation(EmptyRequestSchema,async(e,t)=>{try{successResponse(t,200,SkillInstallStateSuccessSchema,{...await readSkillInstallStateSnapshot(homedir())},{handler:`skill-install-state`,extraHeaders:{"Cache-Control":`no-store`}})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Failed to read skill install state.`,{handler:`skill-install-state`,cause:e})}},{handler:`skill-install-state`,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:`skill-install-state`})});async function kl(e,t){if(checkLocalOpSecurity(e,t,{handler:`handoff`}))try{await handleHandoffDispatch(e,t,{contentDir:w,platform:process.platform})}catch(e){t.headersSent||(log$3.error({err:e},`[handoff] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`handoff`,cause:e}))}}async function jl(e,t){if(checkLocalOpSecurity(e,t,{handler:`spawn-cursor`}))try{await handleSpawnCursor(e,t,{contentDir:w,platform:process.platform})}catch(e){t.headersSent||(log$3.error({err:e},`[spawn-cursor] route wrapper failed`),errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`spawn-cursor`,cause:e}))}}let Ml=withValidation(ShareConstructUrlRequestSchema,async(e,t,S)=>{try{if(!de){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(!isValidShareDocPath(S.docPath)){emitShareConstructUrlLog(`invalid-path`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`invalid-path`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let e=readGitHeadBranch(de);if(e===null){if(readOriginGitHubRepo(de).kind===`no-remote`){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}emitShareConstructUrlLog(`detached-head`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`detached-head`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let w=readOriginGitHubRepo(de);if(w.kind===`no-remote`){emitShareConstructUrlLog(`no-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`no-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(w.kind===`non-github`){emitShareConstructUrlLog(`non-github-remote`),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`non-github-remote`},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}if(!branchExistsOnOrigin(de,e)){emitShareConstructUrlLog(`branch-not-on-origin`,!1),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!1,error:`branch-not-on-origin`,branch:e},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG});return}let E=buildGitHubBlobUrl(w.owner,w.repo,e,S.docPath),D=`${SHARE_BASE_URL}${encodeShareUrl(E)}`;emitShareConstructUrlLog(`ok`,!0),successResponse(t,200,ShareConstructUrlResponseSchema,{ok:!0,shareUrl:D,blobUrl:E,branch:e},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG,cause:e})}},{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_CONSTRUCT_URL_HANDLER_TAG})}),Pl=withValidation(EmptyRequestSchema,async(e,t)=>{try{if(!de){errorResponse(t,500,`urn:ok:error:internal-server-error`,`projectDir is not configured for this server.`,{handler:BRANCH_INFO_HANDLER_TAG});return}let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`branch`),E=S.searchParams.get(`path`);if(!isValidBranchName(w)){errorResponse(t,400,`urn:ok:error:invalid-request`,`branch query param missing or malformed.`,{handler:BRANCH_INFO_HANDLER_TAG});return}if(!isValidBranchInfoDocPath(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`path query param missing or malformed.`,{handler:BRANCH_INFO_HANDLER_TAG});return}successResponse(t,200,BranchInfoResponseSchema,await computeBranchInfo(de,w,E),{handler:BRANCH_INFO_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:BRANCH_INFO_HANDLER_TAG,cause:e})}},{handler:BRANCH_INFO_HANDLER_TAG,method:`GET`,skipBodyParse:!0}),Fl=withValidation(CheckoutRequestSchema,async(e,t,S)=>{if(extractActorIdentity(S,fe).kind===`invalid-summary`){errorResponse(t,400,`urn:ok:error:invalid-request`,`Summary must be a string.`,{handler:CHECKOUT_HANDLER_TAG});return}if(!de){errorResponse(t,500,`urn:ok:error:internal-server-error`,`projectDir is not configured for this server.`,{handler:CHECKOUT_HANDLER_TAG});return}try{successResponse(t,200,CheckoutResponseSchema,await withParentLock(()=>runCheckoutFlow(de,S.branch)),{handler:CHECKOUT_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:CHECKOUT_HANDLER_TAG,cause:e})}},{handler:CHECKOUT_HANDLER_TAG,method:`POST`});async function Il(e){let[t,...S]=ue,w=[...S,...e];return await new Promise((e,S)=>{let E=spawn(t,w,{stdio:[`ignore`,`pipe`,`pipe`],env:{...process.env}}),D=!1,O=setTimeout(()=>{D=!0,E.kill(`SIGTERM`)},SHARE_PUBLISH_TIMEOUT_MS),k=[],j=[];E.stdout.on(`data`,e=>k.push(e)),E.stderr.on(`data`,e=>j.push(e)),E.on(`close`,t=>{if(clearTimeout(O),D){S(Error(`share subprocess timed out after ${SHARE_PUBLISH_TIMEOUT_MS}ms`));return}let w=Buffer.concat(k).toString(`utf-8`);if(t!==0){let e=redactShareSubprocessStderr(Buffer.concat(j).toString(`utf-8`)).slice(0,500);console.warn(`[share] subprocess exited code=${t} stderr=${e}`)}e({stdout:w,code:t})}),E.on(`error`,e=>{clearTimeout(O),S(e)})})}let Ll=withValidation(EmptyRequestSchema,async(e,t)=>{if(!we.tryAcquire(`/api/share/publish/owners`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share owners operation is already in progress.`,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let{stdout:e}=await Il([`share`,`owners`,`--json`]),S=parseOwnersEvent(pickTerminalJsonLine(e));emitSharePublishLog(`owners-list`,S.ok?`ok`:S.error,S.ok?{count:S.owners.length}:void 0),successResponse(t,200,SharePublishOwnersResponseSchema,S,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_OWNERS_KEY)}},{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_OWNERS_HANDLER_TAG})}),Rl=withValidation(EmptyRequestSchema,async(e,t)=>{let S=new URL(e.url??``,`http://localhost`),w=S.searchParams.get(`owner`)??``,E=S.searchParams.get(`name`)??``;if(!isValidShareOwnerName(w)||!isValidShareRepoName(E)){errorResponse(t,400,`urn:ok:error:invalid-request`,`owner and name query params must be valid GitHub identifiers.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG});return}if(!we.tryAcquire(`/api/share/publish/name-check`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share name-check operation is already in progress.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let{stdout:e}=await Il([`share`,`name-check`,`--owner`,w,`--name`,E,`--json`]),S=parseNameCheckEvent(pickTerminalJsonLine(e));emitSharePublishLog(`name-check`,S.ok?`ok`:S.error,S.ok?{available:S.available}:void 0),successResponse(t,200,SharePublishNameCheckResponseSchema,S,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_NAME_CHECK_KEY)}},{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG,method:`GET`,skipBodyParse:!0,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_NAME_CHECK_HANDLER_TAG})}),zl=withValidation(SharePublishRequestSchema,async(e,t,S)=>{if(!de){emitSharePublishLog(`publish-create`,`no-project`),successResponse(t,200,SharePublishResponseSchema,{ok:!1,error:`no-project`},{handler:SHARE_PUBLISH_HANDLER_TAG});return}if(!isValidShareOwnerName(S.owner)||!isValidShareRepoName(S.name)){errorResponse(t,400,`urn:ok:error:invalid-request`,`owner and name must be valid GitHub identifiers.`,{handler:SHARE_PUBLISH_HANDLER_TAG});return}if(!we.tryAcquire(`/api/share/publish`)){errorResponse(t,429,`urn:ok:error:concurrent-operation`,`A share publish operation is already in progress.`,{handler:SHARE_PUBLISH_HANDLER_TAG,extraHeaders:{"Retry-After":`5`}});return}try{let e=[`share`,`publish`,`--owner`,S.owner,`--name`,S.name,`--visibility`,S.visibility,`--project-dir`,de,`--json`];S.description!==void 0&&S.description.length>0&&e.push(`--description`,S.description);let{stdout:w}=await Il(e),E=parsePublishEvent(pickTerminalJsonLine(w));emitSharePublishLog(`publish-create`,E.ok?`ok`:E.error),successResponse(t,200,SharePublishResponseSchema,E,{handler:SHARE_PUBLISH_HANDLER_TAG})}catch(e){errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:SHARE_PUBLISH_HANDLER_TAG,cause:e})}finally{we.release(SHARE_PUBLISH_KEY)}},{handler:SHARE_PUBLISH_HANDLER_TAG,method:`POST`,preBodyGate:(e,t)=>checkLocalOpSecurity(e,t,{handler:SHARE_PUBLISH_HANDLER_TAG})}),Bl={"/api/asset":ka,"/api/asset-text":xs,"/api/document":jr,"/api/documents":Mr,"/api/backlinks":Fr,"/api/backlink-counts":Ir,"/api/forward-links":Lr,"/api/link-graph":zr,"/api/dead-links":Hr,"/api/orphans":Br,"/api/hubs":Vr,"/api/tags":Kc,"/api/pages":$s,"/api/folder-config":$c,"/api/template":cl,"/api/search":Tl,"/api/suggest-links":ec,"/api/page-headings":Ns,"/api/create-page":Os,"/api/create-folder":ks,"/api/duplicate-path":As,"/api/rename-path":Ps,"/api/delete-path":Is,"/api/trash/cleanup":Rs,"/api/upload":tc,"/api/agent-write":Wt,"/api/agent-write-md":Kt,"/api/frontmatter-patch":$t,"/api/agent-patch":Ur,"/api/agent-undo":Wr,"/api/agent-activity":Gr,"/api/agent-burst-diff":Kr,"/api/save-version":Xr,"/api/history":Zr,"/api/diff":ji,"/api/rollback":Hi,"/api/metrics/reconciliation":Ui,"/api/metrics/parse-health":Gi,"/api/metrics/agent-presence":Xi,"/api/server-info":Ki,"/api/share/construct-url":Ml,"/api/git/branch-info":Pl,"/api/git/checkout":Fl,"/api/share/publish/owners":Ll,"/api/share/publish/name-check":Rl,"/api/share/publish":zl,"/api/principal":Yi,"/api/rescue":Ts,"/api/workspace":Zi,"/api/sync/status":Fc,"/api/sync/trigger":Ic,"/api/sync/conflicts":Lc,"/api/sync/conflict-content":zc,"/api/sync/resolve-conflict":Rc,"/api/sync/abort-merge":Gc,"/api/local-op/clone":sc,"/api/local-op/open":dc,"/api/local-op/auth/login":yc,"/api/local-op/auth/status":Sc,"/api/local-op/auth/repos":wc,"/api/local-op/auth/signout":Dc,"/api/local-op/auth/pat":kc,"/api/local-op/auth/identity":jc,"/api/local-op/auth/set-identity":Pc,"/api/installed-agents":Wc,"/api/spawn-cursor":jl,"/api/handoff":kl,"/api/install-skill":Uc,"/api/skill/install-state":Ol,"/api/seed/plan":Bc,"/api/seed/apply":Vc,"/api/seed/packs":Hc};F&&(Bl[`/api/test-reset`]=qr,Bl[`/api/test-rescan-backlinks`]=Jr,Bl[`/api/test-rescan-files`]=Yr);let Vl=new Set([`/api/upload`,`/api/create-page`,`/api/create-folder`,`/api/duplicate-path`,`/api/rename-path`,`/api/delete-path`,`/api/trash/cleanup`,`/api/agent-write`,`/api/agent-write-md`,`/api/frontmatter-patch`,`/api/agent-patch`,`/api/agent-undo`,`/api/save-version`,`/api/rollback`,`/api/sync/trigger`,`/api/sync/resolve-conflict`,`/api/sync/abort-merge`,`/api/git/checkout`,`/api/test-reset`,`/api/test-rescan-backlinks`,`/api/test-rescan-files`,`/api/install-skill`,`/api/folder-config`,`/api/template`,`/api/seed/apply`]),Hl=[`/api/local-op/`];return{priority:100,async onRequest({request:e,response:t}){let S=e.url?.split(`?`)[0];if(!S)return;if(S.startsWith(`/api/`)){let S=e.headers.origin;if(S!==void 0&&!isAllowedApiOrigin(S)){errorResponse(t,403,`urn:ok:error:invalid-origin`,`Origin not allowed.`,{handler:`api-origin-gate`});return}if(typeof t.setHeader==`function`&&(S!==void 0&&(t.setHeader(`Access-Control-Allow-Origin`,S),t.setHeader(`Vary`,`Origin`)),t.setHeader(`Access-Control-Allow-Methods`,`GET, POST, PUT, DELETE, OPTIONS`),t.setHeader(`Access-Control-Allow-Headers`,`Content-Type, Authorization, traceparent, tracestate, baggage`)),e.method===`OPTIONS`){t.writeHead(204),t.end();return}}if(Vl.has(S)||Hl.some(e=>S.startsWith(e))){let S=e.socket?.remoteAddress;if(S!==void 0&&!isLoopbackAddress(S)){errorResponse(t,403,`urn:ok:error:loopback-required`,`Loopback required.`,{handler:`api-mutating-gate`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){errorResponse(t,403,`urn:ok:error:host-not-allowed`,`Host header not allowed.`,{handler:`api-mutating-gate`});return}}if(!S.startsWith(`/api/`))return;let w=propagation.extract(context.active(),e.headers),E=e.method??`GET`,D=S;S.startsWith(`/api/rescue/`)?D=`/api/rescue/:docName`:S.startsWith(`/api/history/`)?D=`/api/history/:sha`:S.startsWith(`/api/tags/`)?D=`/api/tags/:name`:Bl[S]||(D=`/api/*`);let O=getTracer(),k=Date.now();await context.with(w,()=>O.startActiveSpan(`HTTP ${E} ${D}`,{kind:SpanKind.SERVER,attributes:{[ATTR_HTTP_REQUEST_METHOD]:E,[ATTR_HTTP_ROUTE]:D,[ATTR_URL_PATH]:S,[ATTR_URL_SCHEME]:`http`,[ATTR_USER_AGENT_ORIGINAL]:e.headers[`user-agent`]??``}},async w=>{try{let D=Bl[S],O=!1;if(D)O=!0,await D(e,t);else if(S.startsWith(`/api/rescue/`)){let w=decodeURIComponent(S.slice(12));w&&(O=!0,await Ds(e,t,w))}else if(S.startsWith(`/api/history/`)){let w=decodeURIComponent(S.slice(13));w&&(O=!0,await Qr(e,t,w))}else if(S.startsWith(`/api/tags/`)){let w=S.slice(10);w&&(O=!0,await qc(e,t,w))}O||errorResponse(t,404,`urn:ok:error:not-found`,`API endpoint not found.`,{handler:`api-dispatch`,detail:`No handler for ${E} ${S}`});let k=t.statusCode;w.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE,k),k>=500&&w.setStatus({code:SpanStatusCode.ERROR,message:`status ${k}`})}catch(e){throw w.recordException(e),w.setStatus({code:SpanStatusCode.ERROR,message:e instanceof Error?e.message:String(e)}),!t.headersSent&&!t.writableEnded&&!t.destroyed&&errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:D,cause:e}),e}finally{w.end();let e=(Date.now()-k)/1e3;httpDurationHist().record(e,{[ATTR_HTTP_REQUEST_METHOD]:E,[ATTR_HTTP_ROUTE]:D,[ATTR_HTTP_RESPONSE_STATUS_CODE]:t.statusCode})}}))}}}function isWithinDir(e,t){return e===t?!0:e.startsWith(`${t}${sep}`)}function errnoCode(e){let t=e?.code;return typeof t==`string`?t:void 0}function seedBasenameIndex(e){let t=e.contentDir,S=new Set;function w(E){let D;try{D=readdirSync(E,{withFileTypes:!0})}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`read-failed`,S,E);return}for(let O of D){let D=join(E,O.name),k=relative(t,D);if(k.startsWith(`..`)||e.contentFilter?.isDirExcluded(k)&&O.isDirectory())continue;let j;try{j=lstatSync(D)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`lstat-failed`,S,D);continue}if(j.isSymbolicLink()){let E;try{E=realpathSync(D)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`realpath-failed`,S,D);continue}if(!isWithinDir(E,t)){e.onSkip?.(`symlink-escape`,void 0,D);continue}let O;try{O=statSync(E)}catch(t){let S=errnoCode(t);S!==`ENOENT`&&e.onSkip?.(`symlink-stat-failed`,S,E);continue}if(S.has(O.ino))continue;S.add(O.ino),O.isDirectory()?w(E):O.isFile()&&isSupportedAssetFile(D,ASSET_EXTENSIONS)&&!e.contentFilter?.isExcluded(k)&&e.basenameIndex.add(k);continue}if(j.isDirectory()){if(S.has(j.ino))continue;S.add(j.ino),w(D);continue}j.isFile()&&isSupportedAssetFile(D,ASSET_EXTENSIONS)&&!e.contentFilter?.isExcluded(k)&&e.basenameIndex.add(k)}}w(t)}const HocuspocusAuthTokenSchema=object$1({principalId:string$2().optional(),tabSessionId:string$2().optional(),expectedServerInstanceId:string$2().optional(),expectedBranch:string$2().optional()}).loose(),HOCUSPOCUS_AUTH_REJECTION_REASONS=[`server-instance-mismatch`,`branch-mismatch`,`rename-redirect`,`doc-deleted`];function isHocuspocusAuthRejectionReason(e){return HOCUSPOCUS_AUTH_REJECTION_REASONS.includes(e)}const WIRE_PAYLOAD_SEPARATOR=`:`;function formatAuthRejectionWire(e,t){return typeof t!=`string`||t.length===0?e:`${e}${WIRE_PAYLOAD_SEPARATOR}${t}`}function parseAuthRejectionWire(e){if(e.length===0)return{kind:null,payload:void 0};let t=e.indexOf(WIRE_PAYLOAD_SEPARATOR),S=t===-1?e:e.slice(0,t);if(!isHocuspocusAuthRejectionReason(S))return{kind:null,payload:void 0};if(t===-1)return{kind:S,payload:void 0};let w=e.slice(t+1);return{kind:S,payload:w.length>0?w:void 0}}var HocuspocusAuthRejection=class extends Error{kind;payload;reason;constructor(e,t,S){super(t),this.name=`HocuspocusAuthRejection`,this.kind=e,this.payload=typeof S==`string`&&S.length>0?S:void 0,this.reason=formatAuthRejectionWire(e,this.payload)}};function parseHocuspocusAuthToken(e){if(typeof e!=`string`||e.length===0)return;let t;try{t=JSON.parse(e)}catch{return}let S=HocuspocusAuthTokenSchema.safeParse(t);return S.success?S.data:void 0}const log$2=getLogger(`conflict-storage`);var ConflictStore=class{storePath;projectDir;branch;conflicts=[];constructor(e,t=`main`){this.storePath=join(getLocalDir(e),`conflicts.json`),this.projectDir=e,this.branch=t,this.load()}load(){if(!existsSync(this.storePath)){this.conflicts=[];return}try{let e=readFileSync(this.storePath,`utf-8`),t=JSON.parse(e);if(t.version!==1){log$2.warn({path:this.storePath},`[conflicts] unknown schema version — resetting`),this.conflicts=[];return}this.branch=t.branch??this.branch,this.conflicts=t.conflicts??[]}catch(e){log$2.warn({err:e},`[conflicts] failed to load conflicts.json — starting empty`),this.conflicts=[]}}save(){try{let e=dirname(this.storePath);existsSync(e)||mkdirSync(e,{recursive:!0});let t={version:1,branch:this.branch,conflicts:this.conflicts};writeFileSync(this.storePath,JSON.stringify(t,null,2),`utf-8`)}catch(e){log$2.warn({err:e},`[conflicts] failed to save conflicts.json`)}}addConflict(e){let t=this.conflicts.findIndex(t=>t.file===e.file);t===-1?this.conflicts.push(e):this.conflicts[t]=e,this.save()}removeConflict(e){this.conflicts=this.conflicts.filter(t=>t.file!==e),this.save()}clear(){this.conflicts=[],this.save()}count(){return this.conflicts.length}list(){return[...this.conflicts]}hasConflicts(){return this.conflicts.length>0}setBranch(e){this.branch=e}async resolveConflict(e,t,S,w=[]){if(!this.conflicts.find(t=>t.file===e))throw Error(`[conflicts] no conflict tracked for file: ${e}`);if(t===`content`&&S===void 0)throw Error(`[conflicts] strategy 'content' requires content parameter`);let{createGitInstance:E}=await import(`./git-handle-CjyGVy33-lwHYMDQ0.mjs`).then(e=>e.n),D=E(this.projectDir,{credentialArgs:w});switch(t){case`mine`:await D.git.raw([`checkout`,`--ours`,`--`,e]),await D.git.raw([`add`,`--`,e]);break;case`theirs`:await D.git.raw([`checkout`,`--theirs`,`--`,e]),await D.git.raw([`add`,`--`,e]);break;case`content`:{if(S===void 0)throw Error(`[conflicts] strategy 'content' requires content parameter`);let t=resolve(this.projectDir),w=resolve(t,e);if(w!==t&&!w.startsWith(`${t}/`))throw Error(`[conflicts] file path escapes project directory: ${e}`);writeFileSync(w,S,`utf-8`),await D.git.raw([`add`,`--`,e]);break}case`delete`:await D.git.raw([`rm`,`--`,e]);break;default:throw Error(`[conflicts] unknown resolve strategy: ${t}`)}if(this.removeConflict(e),!this.hasConflicts())try{await D.git.raw([`commit`,`--no-edit`]),log$2.info({file:e},`[conflicts] all conflicts resolved — merge commit created`)}catch(t){let S=new Date().toISOString(),w=!1;try{let e=(await D.git.raw([`diff`,`--name-only`,`--diff-filter=U`])).split(`
|
|
2243
2243
|
`).map(e=>e.trim()).filter(Boolean);for(let t of e)this.addConflict({file:t,detectedAt:S});w=e.length>0}catch(e){log$2.warn({err:e},`[conflicts] commit failed and re-scan of unmerged files failed — falling back to single-file re-add`)}w||this.addConflict({file:e,detectedAt:S}),log$2.warn({err:t},`[conflicts] failed to commit merge after all conflicts resolved — unmerged files re-added`);let E=t instanceof Error?t.message:String(t);throw Error(`Merge commit failed after resolving ${e}; ${w?`unmerged files re-added`:`original file re-added`} — ${E}`,{cause:t})}}};const DEFAULT_WARN_BEFORE_MS=300*1e3;function attachIdleShutdown(e){let t=e.scheduler??defaultScheduler,S=e.warnBeforeMs??DEFAULT_WARN_BEFORE_MS,w=0,E=null,D=null,O=!1,k=!1;function j(){E!==null&&(t.clearTimeout(E),E=null),D!==null&&(t.clearTimeout(D),D=null)}function F(){j(),!(k||O)&&w===0&&(S>0&&S<e.thresholdMs&&(D=t.setTimeout(()=>{D=null,w===0&&!O&&e.log?.warn({msUntilShutdown:S,webSocketClientCount:0},`idle shutdown pending: no WebSocket clients`)},e.thresholdMs-S)),E=t.setTimeout(()=>{if(E=null,!(k||O)&&w===0){O=!0,e.log?.info({webSocketClientCount:0},`idle shutdown firing`);try{let t=e.onShutdown();t&&typeof t.then==`function`&&t.catch(t=>{e.log?.error({err:t},`idle shutdown handler rejected`)})}catch(t){e.log?.error({err:t},`idle shutdown handler threw`)}}},e.thresholdMs))}let L=(e,t)=>{e.url?.startsWith(`/collab`)&&(w++,j(),t.once(`close`,()=>{w--,w<0&&(w=0),w===0&&F()}))};return e.httpServer.on(`upgrade`,L),F(),{detach:()=>{k||(k=!0,e.httpServer.off(`upgrade`,L),j())}}}const MCP_SERVER_NAME=`open-knowledge`,MCP_CONNECTION_ID_HEADER=`x-ok-connection-id`;function sanitizeClientName(e,t){let S=Array.from(e??``).map(e=>{let t=e.charCodeAt(0);return t<=31||t===127?` `:e}).join(``).replace(/\s+/g,` `).trim();return S?S.slice(0,128):t}function buildInstructions(e){return'Open Knowledge is a markdown-CRDT knowledge base exposed via MCP.\n\n## STOP — native tools on in-scope `.md` / `.mdx`\n\nWhen this workspace has Open Knowledge MCP configured, do **not** use your host\'s native file tools on markdown paths inside the content directory. The ban covers every common rationalization:\n\n- **Native `Read` / `Grep` / `Glob` on in-scope `.md` / `.mdx`** — the original case.\n- **`Bash ls` / `Bash find` / `Bash cat` on dirs containing in-scope markdown** — use `exec("ls -A …")` / `exec("find … -name \'*.md\'")` / `exec("cat …")` instead. Native returns bare names; `exec` returns frontmatter, backlink counts, and recent activity per child. `-A` shows hidden entries (`.ok/`, `.okignore`) which OK projects carry; omit `.` and `..` rows that `-a` would add.\n- **Glob patterns that target markdown** (`**/*.md`, any dir known to be markdown-heavy like `specs/**`, `reports/**`, `docs/**`) — use `exec` with `find`, or `exec("ls -A <dir>")`.\n- **Dispatching the Explore / general-purpose subagent for markdown-heavy exploration** — subagents use native `Read` / `Grep` / `Glob` internally and bypass Open Knowledge entirely. Do markdown exploration yourself via `exec` / `search`. Subagents remain appropriate for **source-code** exploration.\n- **Native `Read` / `Grep` on any in-scope markdown inside `.ok/`** — the `.ok/` directory is in-scope; if it carries `.md` / `.mdx`, treat those the same as any other knowledge-base file.\n\nWhy: native tools skip frontmatter, backlinks, shadow-repo activity, and project git history that OK\'s tools return for every matched knowledge-base file. `exec` is the primary read surface; it runs read-only bash (`cat`, `ls`, `grep`, `find`, `head`, `tail`, `wc`, `sort`, `uniq`, `cut` — pipes OK) and returns raw stdout plus enriched metadata per file.\n\n**MCP tool visibility — not seeing `exec` is NOT the escape hatch.** MCP wiring varies by client. Claude Code, Cursor, Codex, Windsurf, VS Code — each surfaces MCP differently. Server labels are user-defined; tools may not appear as top-level symbols named `exec` in your specific UI. If Open Knowledge is registered as an MCP server in this workspace, route markdown reads through its `exec` / `search` via your client\'s documented MCP invocation (including any generic "call MCP tool" flow). Registration is the test, not top-level-symbol visibility.\n\n**Escape hatch.** Native `Read` / `Grep` / `Glob` on `.md` / `.mdx` is allowed **only** when no Open Knowledge MCP server is registered for this project, **or** immediately after you tried an MCP call and it failed — then begin a user-visible sentence with `Open Knowledge MCP unavailable:`. Never use the hatch because you skipped your client\'s MCP path, didn\'t see `exec` as a top-level tool, or rationalized the skill wasn\'t necessary.\n\n**Source code and non-markdown files** (`.ts`, `.py`, `package.json`, …): native `Read` / `Grep` / `Glob` always.\n\n## Reads — examples\n\n- Read a file: `exec("cat <path>.md")` — contents + full rich enrichment.\n- List a directory: `exec("ls -A <dir>")` — per-child frontmatter, recursive markdown counts, most-recently-updated doc per subdir, folder-level `frontmatter_defaults` + `templates_available`. Prefer `-A` over plain `ls` to surface dot-prefixed entries (`.ok/`, `.okignore`) without the noisy `.`/`..` rows that `-a` adds.\n- Literal search: `exec("grep -rn <term> <dir> | head -5")` — matches + enrichment on matched files.\n- Ranked search: `search({ query })` — cmd-K parity (title boost + body BM25 + recency); use when picking the best doc, not when listing every occurrence.\n\n## Preview — open the browser at session start\n\nThe user watches your edits land in a live browser preview. Open it once at session start, then keep working. Re-navigate only when the user asks to open a different doc, or to land them on a finished deliverable (see below) — not to re-check your own edits.\n\n**End a turn on the deliverable, not your scratch space.** Keep the preview steady *during* a multi-doc task — don\'t yank it around to re-check your own edits. But when a turn created or substantially changed user-facing docs, navigate the preview to the primary deliverable before you hand back: the hub / overview / index page when you created several docs, or the changed doc when you changed one. Don\'t step the user through every supporting source card — the user is watching, so leave them on the result.\n\n**`previewUrl` is a route, not a URL to open.** Every read response (per-doc, on `exec` / `search` / `links` rows) and every write response carries a `previewUrl` — a route fragment like `/#/specs/foo/SPEC`, with **no scheme, host, or port**. It identifies *which doc* to preview, not a URL to hand a browser by itself. Never construct or guess preview URLs.\n\n**Pick how to open the preview by tool capability — not by host name.** Look at the tools actually available to you this session. If a tool can navigate to a URL, it counts as an in-app browser — match on the capability, not on what your host is called.\n\n- **You have a `preview_*` tool** (e.g. `preview_start`) → call `preview_start("open-knowledge-ui")` and nothing else. The pane supplies its own origin; you never need a URL. Do NOT also call `get_preview_url`. Do NOT read, diagnose, or edit `.claude/launch.json` — that file is host-managed, and the OK lock-collision proxy handles the UI-already-running case automatically. If `preview_start` fails, report it to the user; do not try to "fix" `launch.json`.\n- **No `preview_*` tool, but you have an in-app / built-in browser tool** — including Codex\'s built-in browser, and any host tool whose contract is "navigate to a URL" (`browser`, `view_url`, `open_url`, `web.browse`, host-specific names, etc.) → call `get_preview_url` once to get the full browser URL (`{ url, baseUrl, running }`), then navigate your **in-app browser** to `url`. Pass a `docName` to `get_preview_url` to jump straight to a doc, or omit it for the UI root.\n- **Truly no browser-capable tool — if you have ANY tool that navigates to a URL, use the in-app branch above** (a pure stdio host with no URL-navigation tool at all) → call `get_preview_url`, then `open <url>` in the system browser as a last resort, and say so plainly to the user ("opening the preview in your system browser — this host has no in-app browser"). The system browser is the fallback, never the default.\n\n**Opening or reading a file IS a preview navigation.** On any "open `<file>`" / "read `<file>`" request, navigate the browser to that doc\'s `previewUrl` route from the tool response — not a separate fetch, not a fresh system-browser launch.\n\n**Four signals to check if the preview is already attached** (read these from each write response):\n\n1. You opened/navigated earlier this session → don\'t reopen.\n2. Write response has `previewUrl` (non-null route) and NO `warning` → a browser is attached somewhere; do nothing.\n3. `warning: { action: "attach-preview-once", previewUrl, message }` → UI reachable, no browser attached; navigate one-shot (`preview_start`, or `get_preview_url` → in-app browser).\n4. `warning: { action: "start-ui", previewUrl: null, message }` → no UI running anywhere. Surface the message verbatim — recovery options are in the in-band copy. Don\'t loop on retries.\n\nWarnings fire at most once per session in the fresh-start case.\n\n**`previewUrl: null` only means "no UI reachable" on the three attach-warning tools: `write_document` / `edit_document` / `edit_frontmatter`.** Workflow tools return prose and don\'t carry `previewUrl`. `delete_document` / `rename` emit `previousPreviewUrl` (different field, for closing stale tabs) and don\'t fire attach warnings. `get_preview_url` reports `running: false` + `url: null` when no UI is running.\n\nIf you see `"Hocuspocus server is not running"`, run `ok start` and retry.\n\nOK Electron and `ok ui` share `ui.lock`; when a second UI binds a different port, the OK lock-collision proxy bridges it to the live server transparently. That is exactly why `previewUrl` is route-only — the port behind the proxy is not the agent\'s to use. **Do not nudge the user to quit OK Electron to free a port** — the proxy handles it, and quitting tears down a UI in active use.\n\n**The preview is read-only for the agent — it is the user\'s view, not a surface you read back.** You cannot click or type to drive edits — the CRDT flow is one-way (agent → MCP → CRDT → preview).\n\n**No screenshots to confirm edits, no generic verification loop.** Do NOT take `preview_screenshot` (host tool, not OK MCP) after a write, and do not run a generic snapshot/eval/screenshot verification loop — OK\'s preview is a read-only, one-way mirror, so the CRDT tool response *is* the confirmation that an edit landed. Screenshot only when debugging a visual rendering issue or when the user explicitly asks to see the preview — never to confirm an edit landed.\n\n## Scope recap\n\nOpen Knowledge looks for documents under the resolved `content.dir` (discoverable at runtime via `get_config({ path: [\'content\', \'dir\'] })`). `.gitignore` and `.okignore` (at the project root and at any folder depth) define exclusions. Folder defaults + templates live in nested `<folder>/.ok/frontmatter.yml` + `<folder>/.ok/templates/` files — NOT in `.ok/config.yml`.\n\nDefault mental model (no jargon): **every `.md` and `.mdx` under `content.dir`** not excluded by `.gitignore` or `.okignore` is an Open Knowledge document — including under `specs/`, `reports/`, `docs/`, etc. Read `.okignore` (and any nested `.okignore` files) once per turn to know what\'s excluded.\n\n**First session in this project?** If `frontmatter_defaults` and `templates_available` are empty for substantial folders, the project hasn\'t been onboarded yet — invoke `discover` (Workflow tools table) before writing. Once onboarded, the cascade carries the discipline.\n\n\nFull guidance lives in the bundled `open-knowledge` skill at `~/.ok/skills/open-knowledge/SKILL.md`.\n'}function installPrettyZodErrors(e){let t=e;if(t.__prettyZodErrorsInstalled===!0)return;let S=t.validateToolInput;if(typeof S!=`function`){console.warn(`[pretty-zod-errors] McpServer.validateToolInput not found — SDK internals may have changed. Falling back to default error formatting.`);return}t.validateToolInput=async function(e,t,w){if(!e.inputSchema||!isZodSchema(e.inputSchema))return S.call(this,e,t,w);let E=await e.inputSchema.safeParseAsync(t);if(E.success)return E.data;let D=prettifyError(E.error);throw new McpError(ErrorCode.InvalidParams,`Input validation error: Invalid arguments for tool ${w}:\n${D}`)},t.__prettyZodErrorsInstalled=!0}function isZodSchema(e){return typeof e!=`object`||!e?!1:typeof e.safeParseAsync==`function`}const loggerContext=new AsyncLocalStorage;var McpLogger=class e{sessionId;corrId;component;constructor(e=`mcp`,t){this.sessionId=t??randomUUID().slice(0,12),this.corrId=randomUUID().slice(0,8),this.component=e}info(e,t={}){this.emit(`info`,e,t)}warn(e,t={}){this.emit(`warn`,e,t)}error(e,t,S={}){let w=t?{error:t instanceof Error?t.message:String(t),...S}:S;this.emit(`error`,e,w)}debug(e,t={}){(process.env.MCP_DEBUG===`1`||process.env.DEBUG?.includes(`mcp`))&&this.emit(`debug`,e,t)}child(t){return new e(t??this.component,this.sessionId)}asCallback(){return e=>this.info(e)}emit(e,t,S){let w={ts:new Date().toISOString(),level:e,sessionId:this.sessionId,corrId:this.corrId,component:this.component,msg:t,...S},E=`${JSON.stringify(w)}\n`;process.stderr.write(E);let D=process.env.OK_LOG_FILE;if(D)try{appendFileSync(D,E)}catch(e){console.warn(`[mcp-logger] Failed to write to OK_LOG_FILE: ${e instanceof Error?e.message:e}`)}}};function runWithMcpLogger(e,t){return loggerContext.run(e,t)}function getCurrentMcpLogger(){return loggerContext.getStore()}const REDACTED_STRING_KEYS=new Set([`find`,`markdown`,`replace`]),COMMON_ARRAY_KEYS=[`backlinks`,`deadLinks`,`documents`,`enrichedPaths`,`entries`,`forwardLinks`,`hints`,`hubs`,`orphans`,`results`],COMMON_SCALAR_KEYS=[`checkpointRef`,`cwd`,`fileCount`,`matchCount`,`ok`,`query`,`stdoutTruncated`,`truncated`];function isPlainObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isToolExtraLike(e){return isPlainObject(e)&&`requestId`in e}function summarizeStringForLog(e,t){if(REDACTED_STRING_KEYS.has(e))return{redacted:!0,type:`string`,length:t.length,lines:t.length===0?0:t.split(`
|
|
2244
2244
|
`).length};let S=e===`command`?240:120;return t.length<=S?t:{type:`string`,length:t.length,preview:`${t.slice(0,S)}...`}}function summarizeArgValue(e,t){if(t===null)return null;if(typeof t==`string`)return summarizeStringForLog(e,t);if(typeof t==`number`||typeof t==`boolean`)return t;if(Array.isArray(t))return{type:`array`,length:t.length};if(isPlainObject(t)){let e=Object.keys(t).sort();return{type:`object`,keyCount:e.length,keys:e.slice(0,12)}}if(t!==void 0)return{type:typeof t}}function summarizeArgsForLog(e,t){return isPlainObject(t)?Object.fromEntries(Object.entries(t).map(([e,t])=>[e,summarizeArgValue(e,t)])):summarizeArgValue(e,t)}function summarizeStructuredContentForLog(e){let t={structuredKeys:Object.keys(e).sort()};for(let S of COMMON_SCALAR_KEYS)S in e&&(t[S]=e[S]);for(let S of COMMON_ARRAY_KEYS){let w=e[S];Array.isArray(w)&&(t[`${S}Count`]=w.length)}return`previewUrl`in e&&(t.previewUrl=e.previewUrl??null),`previewUrlSource`in e&&(t.previewUrlSource=e.previewUrlSource),typeof e.stdout==`string`&&(t.stdoutChars=e.stdout.length),Array.isArray(e.warnings)&&(t.warningsCount=e.warnings.length),isPlainObject(e.warning)&&(t.warning=!0,`previewUrl`in e.warning&&(t.warningPreviewUrl=e.warning.previewUrl??null)),t}function summarizeToolResultForLog(e){if(!isPlainObject(e))return{resultType:typeof e};let t={isError:e.isError===!0};return Array.isArray(e.content)&&(t.contentItems=e.content.length,t.contentTextChars=e.content.reduce((e,t)=>isPlainObject(t)&&typeof t.text==`string`?e+t.text.length:e,0)),isPlainObject(e.structuredContent)&&Object.assign(t,summarizeStructuredContentForLog(e.structuredContent)),t}function summarizeIdentityForLog(e){return{connectionId:e.connectionId.slice(0,8),displayName:e.displayName,...e.clientInfo?.name?{clientName:e.clientInfo.name}:{}}}function splitInvocationArgs(e){let t=e.at(-1);return isToolExtraLike(t)?{toolArgs:e.length>1?e[0]:void 0,extra:t}:{toolArgs:e[0],extra:void 0}}function wrapToolHandlerForLogging(e,t,S){let w=S.logger;return w?async(...E)=>{let D=w.child(),O=Date.now(),{toolArgs:k,extra:j}=splitInvocationArgs(E);D.info(`tool start`,{tool:e,...j?.requestId===void 0?{}:{requestId:j.requestId},...j?.sessionId?{transportSessionId:j.sessionId}:{},...S.identityRef?.current?{agent:summarizeIdentityForLog(S.identityRef.current)}:{},...k===void 0?{}:{args:summarizeArgsForLog(e,k)}});try{let S=await runWithMcpLogger(D,async()=>await t(...E));return D.info(`tool finish`,{tool:e,...j?.requestId===void 0?{}:{requestId:j.requestId},durationMs:Date.now()-O,result:summarizeToolResultForLog(S)}),S}catch(t){throw D.error(`tool error`,t,{tool:e,...j?.requestId===void 0?{}:{requestId:j.requestId},durationMs:Date.now()-O}),t}}:t}function createLoggedServer(e,t){if(!t.logger)return e;let S=e.tool.bind(e),w=e.registerTool,E=typeof w==`function`?w.bind(e):void 0,D=Object.create(e);return D.tool=((...e)=>{let w=String(e[0]),E=e.at(-1);if(typeof E!=`function`)return S(...e);let D=[...e];return D[D.length-1]=wrapToolHandlerForLogging(w,E,t),S(...D)}),E&&(D.registerTool=((e,S,w)=>typeof w==`function`?E(e,S,wrapToolHandlerForLogging(e,w,t)):E(e,S,w))),D}function buildBody$2(e,t){return`Promote existing research on this topic into a canonical article inside the project content directory. **Canonical, not provisional** — the output is the source of truth for future agents.
|
|
2245
2245
|
|
|
@@ -2706,7 +2706,7 @@ Link-graph activation:
|
|
|
2706
2706
|
`}const DESCRIPTION$20=[`Returns a step-by-step plan for setting up an existing repo: extract folder conventions, write folder frontmatter + templates, activate the link graph. Does NOT execute the plan — you run it, with per-phase user confirmation.`,``,"Invoke on first arrival at a repo that has markdown content but no folder frontmatter / templates (an `exec` listing shows empty `frontmatter_defaults` + `templates_available`). Skip empty repos (use `ok seed`) and already-configured ones. One-shot per project; idempotent on re-run (extends, never re-proposes).",``,"Phases 1-4 run fs-direct; Phase 5 (link-graph activation) needs `ok start`. Composes existing tools only — `exec`, `links`, `search`, `folder_config`, `edit_document`."].join(`
|
|
2707
2707
|
`),InputSchema$5={cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)},OutputSchema$9=outputSchemaWithText({previewUrl:_null()});function register$20(e,t){e.registerTool(`discover`,{description:DESCRIPTION$20,inputSchema:InputSchema$5,outputSchema:OutputSchema$9,annotations:{readOnlyHint:!1,idempotentHint:!0,destructiveHint:!1}},async e=>{let S=await resolveProjectConfigContext(t.resolveCwd,t.config,e.cwd);return S.ok?textPlusStructured(buildDiscoverBody(S.config.content.dir),{previewUrl:null}):textResult(`Error: ${S.error}`,!0)})}const DESCRIPTION$19=`${["[Requires: Hocuspocus server] Find-and-replace on a live document via the CRDT layer. The patch propagates to all connected editors in real-time. Use `offset` to target an exact occurrence; omit for first-match.",``,'**Body-only.** Frontmatter-intersecting find/replace is rejected with HTTP 400. For frontmatter: 1-2 keys → `edit_frontmatter`; full rewrite → `write_document({ position: "replace" })`.',``,`**Parameters:**`,"- `docName` — Document name, extension-less. Trailing `.md`/`.mdx` stripped.","- `find` — Text to find (exact match).","- `replace` — Replacement text.",'- `offset` — Optional JavaScript string offset of the exact occurrence to patch. Stale offsets return an error; re-fetch via `links({ kind: "suggest", docName })`.',"- `summary` — Optional one-line user-outcome (≤80 chars). Avoid secrets or PII — persisted to git history."].join(`
|
|
2708
2708
|
`)}\n${renderInventoryFooter()}`;function register$19(e,t){e.registerTool(`edit_document`,{description:DESCRIPTION$19,inputSchema:{docName:string$2().describe(`Document name to edit`),find:string$2().describe(`Text to find (exact match)`),replace:string$2().describe(`Replacement text`),offset:number$1().int().min(0).optional().describe(`Exact occurrence to patch, as a JavaScript string offset in the current markdown`),summary:summaryArgSchema,cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)}},async e=>{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,url:E}=S;if(!E)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let D=normalizeDocName(e.docName);if(!D.ok)return textResult(D.error,!0);let O=t.identityRef?.current,k=await httpPost(E,`/api/agent-patch`,{docName:D.docName,find:e.find,replace:e.replace,offset:e.offset,...e.summary===void 0?{}:{summary:e.summary},...O?{agentId:O.connectionId,agentName:O.displayName,clientName:O.clientInfo?.name,colorSeed:O.colorSeed}:{}});if(!k.ok)return textResult(`Error: ${k.error}`,!0);let j=resolveLockDir(w),F=resolvePreviewUrl(D.docName,{lockDir:j}),L=typeof k.subscriberCount==`number`?k.subscriberCount:void 0,B=(typeof k.systemSubscriberCount==`number`?k.systemSubscriberCount:void 0)===0,H=L===0,q=k.summary&&typeof k.summary==`object`?k.summary:void 0,J=typeof q?.hint==`string`?q.hint:void 0,Y=[`Edit applied successfully.`];B&&!F&&Y.push(START_UI_TEXT_HINT),J&&Y.push(J);let ee=Y.join(`
|
|
2709
|
-
`);if(!F&&!B&&!H&&!q)return textResult(ee);let te={};return F&&(te.previewUrl=F.url,te.previewUrlSource=F.source),B&&(te.warning=buildPreviewAttachWarning(F)),q&&(te.summary=q),textPlusStructured(ee,te)})}const DESCRIPTION$18=[`[Requires: Hocuspocus server] Set, create, or delete frontmatter properties via JSON Merge Patch (RFC 7396).`,``,`Field-level CRDT merge: concurrent patches to different keys (human form + this tool, or two agents) merge cleanly. Same-key concurrent writes resolve last-writer-wins per key.`,``,'**Use this tool — not `edit_document` — for any frontmatter change.** `edit_document` (agent-patch) targets body content; FM-intersecting `edit_document` calls return HTTP 400. For full-document rewrites (≥3-5 frontmatter keys changing), `write_document({ position: "replace" })` remains the canonical pathway.',``,`**Parameters:**`,"- `docName` — Document name. A trailing `.md` or `.mdx` is stripped automatically.","- `patch` — Object whose keys are property names. Each value is the new value (string, number, boolean, or array of strings) to **set or create** the key, or `null` to **delete** the key. Keys not present in `patch` are unchanged.","- `types` (optional) — **Currently ignored.** Shape-validated for forward-compat but not persisted server-side; type is inferred from value shape on read. Reserved for a future per-key widget-type override (`text | number | boolean | date | list`) once persistence ships.",'- `summary` — Optional one-line user-outcome description (≤80 chars). Prefer outcome phrasing ("Marked spec as approved") over structural ("Set status field"). Avoid secrets / PII — summaries persist to git history.',``,`**Atomicity:** any value failing schema validation rejects the WHOLE patch (HTTP 400 with per-key error report). Either every change commits or none do
|
|
2709
|
+
`);if(!F&&!B&&!H&&!q)return textResult(ee);let te={};return F&&(te.previewUrl=F.url,te.previewUrlSource=F.source),B&&(te.warning=buildPreviewAttachWarning(F)),q&&(te.summary=q),textPlusStructured(ee,te)})}const DESCRIPTION$18=[`[Requires: Hocuspocus server] Set, create, or delete frontmatter properties via JSON Merge Patch (RFC 7396).`,``,`Field-level CRDT merge: concurrent patches to different keys (human form + this tool, or two agents) merge cleanly. Same-key concurrent writes resolve last-writer-wins per key.`,``,'**Use this tool — not `edit_document` — for any frontmatter change.** `edit_document` (agent-patch) targets body content; FM-intersecting `edit_document` calls return HTTP 400. For full-document rewrites (≥3-5 frontmatter keys changing), `write_document({ position: "replace" })` remains the canonical pathway.',``,`**Parameters:**`,"- `docName` — Document name. A trailing `.md` or `.mdx` is stripped automatically.","- `patch` — Object whose keys are property names. Each value is the new value (string, number, boolean, or array of strings) to **set or create** the key, or `null` to **delete** the key. Keys not present in `patch` are unchanged.","- `types` (optional) — **Currently ignored.** Shape-validated for forward-compat but not persisted server-side; type is inferred from value shape on read. Reserved for a future per-key widget-type override (`text | number | boolean | date | list`) once persistence ships.",'- `summary` — Optional one-line user-outcome description (≤80 chars). Prefer outcome phrasing ("Marked spec as approved") over structural ("Set status field"). Avoid secrets / PII — summaries persist to git history.',``,`**Atomicity:** any value failing schema validation rejects the WHOLE patch (HTTP 400 with per-key error report). Either every change commits or none do.`,``,"**Folder schema declarations:** if the doc's parent folder declares fields via `<folder>/.ok/schema.yml` (visible on the doc's `EnrichedMeta.schema_declarations`), prefer filling those declared fields when relevant — they exist precisely because every doc in the folder should carry them. Type is advisory, not enforced."].join(`
|
|
2710
2710
|
`),PatchValueSchema=union([FrontmatterValueSchema,_null()]).describe("Property value (string|number|boolean|string[]) — `null` deletes the key");function register$18(e,t){e.registerTool(`edit_frontmatter`,{description:DESCRIPTION$18,inputSchema:{docName:string$2().describe(`Document name`),patch:record(string$2(),PatchValueSchema).describe("JSON Merge Patch — `{key: value}` sets, `{key: null}` deletes"),types:record(string$2(),_enum(FRONTMATTER_TYPES)).optional().describe(`Currently ignored (shape-validated for forward-compat but not persisted). Type is inferred from value shape on read. Will become a real per-key widget-type override (text|number|boolean|date|list) once persistence lands.`),summary:summaryArgSchema,cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)}},async e=>{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,url:E}=S;if(!E)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let D=normalizeDocName(e.docName);if(!D.ok)return textResult(D.error,!0);let O=t.identityRef?.current,k=await httpPost(E,`/api/frontmatter-patch`,{docName:D.docName,patch:e.patch,...e.types?{types:e.types}:{},...e.summary===void 0?{}:{summary:e.summary},...O?{agentId:O.connectionId,agentName:O.displayName,clientName:O.clientInfo?.name,colorSeed:O.colorSeed}:{}});if(!k.ok){let e=k.error,t=k.fieldErrors&&typeof k.fieldErrors==`object`?k.fieldErrors:void 0;return textResult(t?`Error: ${e}\n${Object.entries(t).map(([e,t])=>` ${e}: ${t}`).join(`
|
|
2711
2711
|
`)}`:`Error: ${e}`,!0)}let j=resolveLockDir(w),F=resolvePreviewUrl(D.docName,{lockDir:j}),L=typeof k.subscriberCount==`number`?k.subscriberCount:void 0,B=(typeof k.systemSubscriberCount==`number`?k.systemSubscriberCount:void 0)===0,H=L===0,q=k.summary&&typeof k.summary==`object`?k.summary:void 0,J=typeof q?.hint==`string`?q.hint:void 0,Y=[],ee=[];for(let[t,S]of Object.entries(e.patch))S===null?ee.push(t):Y.push(t);let te=[`Frontmatter patched (${[Y.length?`${Y.length} set`:``,ee.length?`${ee.length} deleted`:``].filter(Boolean).join(`, `)||`${Object.keys(e.patch).length} key(s)`}).`];B&&!F&&te.push(START_UI_TEXT_HINT),J&&te.push(J);let ne=te.join(`
|
|
2712
2712
|
`);if(!F&&!B&&!H&&!q)return textResult(ne);let ae={};return F&&(ae.previewUrl=F.url,ae.previewUrlSource=F.source),B&&(ae.warning=buildPreviewAttachWarning(F)),q&&(ae.summary=q),textPlusStructured(ne,ae)})}const PRODUCER_COMMANDS=new Set([`cat`,`ls`,`grep`,`find`]),PATH_FALLBACK_RE=/\b[\w./-]+\.(md|mdx)\b/g;function isWikiPath(e){return/\.(md|mdx)$/.test(e)}function normalize$1(e){let t=e.trim();return t?(t=t.replace(/\/+/g,`/`),t.startsWith(`./`)&&(t=t.slice(2)),t.endsWith(`/`)&&(t=t.slice(0,-1)),t):``}function argsOf(e){return e.args.slice(1)}function nonFlagArgs(e){return e.filter(e=>!e.startsWith(`-`))}function extractFromCat(e){return nonFlagArgs(argsOf(e)).filter(isWikiPath)}function extractFromLs(e,t){let S=nonFlagArgs(argsOf(t)),w=S.length>0?S[S.length-1]:``,E=w&&w!==`.`?normalize$1(w):``,D=[];E&&D.push(E);for(let t of e.split(`
|
|
@@ -2718,8 +2718,8 @@ Link-graph activation:
|
|
|
2718
2718
|
`),k=S-D;return{text:`${O}\n<truncated: ${k} more lines — re-run with a more-specific query>`,truncated:!0,omittedLines:k}}function detectBinaryArgs(e){let t=[];for(let S of e)if(S.command===`cat`)for(let e of S.args.slice(1))e.startsWith(`-`)||BINARY_EXT_RE.test(e)&&t.push(e);return t}function extractHeadTailLimit(e){for(let t=1;t<e.length;t++){let S=e[t],w=S.match(/^--lines=(\d+)$/);if(w)return Number(w[1]);if(S===`--lines`&&t+1<e.length){let S=Number(e[t+1]);if(Number.isFinite(S))return S}if(S===`-n`&&t+1<e.length){let S=Number(e[t+1]);if(Number.isFinite(S))return S}let E=S.match(/^-n(\d+)$/);if(E)return Number(E[1]);let D=S.match(/^-(\d+)$/);if(D)return Number(D[1])}return 10}function detectHeadTailTruncation(e,t){if(e.length<2)return null;let S=e[e.length-1];if(S.command!==`head`&&S.command!==`tail`)return null;let w=extractHeadTailLimit(S.args),E=t.split(`
|
|
2719
2719
|
`),D=E[E.length-1]===``?E.length-1:E.length;if(D<w)return null;let O=E.slice(0,D),k=new Set(O.map(e=>{let t=e.indexOf(`:`);return t>0?e.slice(0,t):e})).size,j=e.slice(0,-1).map(e=>e.command).join(` | `);return{banner:`Output hit \`${S.command} -${w}\` cap (${D} lines, ${k} unique file${k===1?``:`s`}). The \`${j}\` stage may have had more matches that never reached stdout. For existence checks across many files, prefer \`grep -rl PATTERN <dir>\` (list files only, no head). For enumeration, drop the \`| ${S.command}\` or widen the cap.`}}function isDirectoryMeta(e){return e.type===`directory`}function formatDirectoryEntry(e){let t=[e.title?`**${e.title}** (${e.path}/)`:`**${e.path}/** (directory)`];e.description&&t.push(e.description),e.tags&&e.tags.length>0&&t.push(`tags: ${e.tags.join(`, `)}`);let S=[];return S.push(`${e.recursiveMdCount} md file${e.recursiveMdCount===1?``:`s`}`),e.childDirCount>0&&S.push(`${e.childDirCount} subdir${e.childDirCount===1?``:`s`}`),t.push(S.join(`, `)),e.mostRecentMd&&t.push(`most recent: ${e.mostRecentMd.title??e.mostRecentMd.path} (${e.mostRecentMd.path})`),e.truncated&&t.push(`scan truncated`),`- ${t.join(` — `)}`}function formatFileEntry(e){let t=[`**${e.title??e.path}** (${e.path})`];if(e.description&&t.push(e.description),e.tags.length>0&&t.push(`tags: ${e.tags.join(`, `)}`),e.backlinkCount!==null&&t.push(`backlinks: ${e.backlinkCount}`),e.forwardLinkCount!==null&&t.push(`forward links: ${e.forwardLinkCount}`),e.history&&e.history.length>0){let S=e.history.map(e=>{let t=e.writerClassification===`agent`?`agent: ${e.writerName}`:e.writerClassification===`principal`?`human: ${e.writerName}`:`${e.writerClassification}: ${e.writerName}`;return`${e.hash.slice(0,7)} [${t}] ${e.message}`});t.push(`OK edits: ${S.join(` · `)}`)}if(e.projectHistory&&e.projectHistory.length>0){let S=e.projectHistory.map(e=>`${e.hash.slice(0,7)} ${e.authorName}: ${e.subject}`);t.push(`commits: ${S.join(` · `)}`)}return`- ${t.join(` — `)}`}function buildStdoutProvenance(e,t,S){let w=null;for(let t=e.length-1;t>=0;t--){let S=e[t],E=S.command;if(E===`ls`||E===`cat`){w=S;break}if((E===`head`||E===`tail`)&&nonFlagArgs(argsOf(S)).length>0){w=S;break}}if(!w)return``;let E=nonFlagArgs(argsOf(w));if(w.command===`ls`){let e=E[E.length-1];if(!e||e===`.`)return``;let S=e.replace(/\/+/g,`/`);return S.startsWith(`./`)&&(S=S.slice(2)),S.endsWith(`/`)&&(S=S.slice(0,-1)),!S||!t.has(S)?``:`${S}/:\n`}let D=E.filter(e=>/\.(md|mdx)$/.test(e)&&S.has(e));return D.length===1?`==> ${D[0]} <==\n`:``}function formatEnrichedBlock(e){if(e.length===0)return``;let t=[``,`### Referenced files`,``];for(let S of e)t.push(isDirectoryMeta(S)?formatDirectoryEntry(S):formatFileEntry(S));return t.join(`
|
|
2720
2720
|
`)}async function classifyPaths(e,t){let S=[],w=[];return await Promise.all(t.map(async t=>{try{let E=await stat$1(resolve(e,t));E.isDirectory()?w.push(t):E.isFile()&&S.push(t)}catch{/\.(md|mdx)$/i.test(t)&&S.push(t)}})),{files:S,dirs:w}}function errorCategoryResult(e,t){return textPlusStructured(t,{enrichedPaths:[],error:{category:e,message:t}},!0)}function withPreviewUrls(e,t){return e.map(e=>{let S=t(docNameFromPath(e.path));return{...e,previewUrl:S?.url??null,...S?{previewUrlSource:S.source}:{}}})}async function buildExecResult(e,t){let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return errorCategoryResult(`shell_construct_blocked`,`exec failed: ${S.error}`);let{cwd:w,config:E,url:D}=S,O=parseCommand(e.command);if(`error`in O)return errorCategoryResult(O.error.category,O.error.message);let k=augmentStagesWithExcludes(O.stages),j=serializeStages(k),F=await snapshotMtimes(w),L=createBashInstance(w),B=``,H=``;try{let e=await execBash(L,j);B=e.stdout,H=e.stderr}catch(e){return e instanceof StdoutOverflowError?errorCategoryResult(`output_overflow`,`Output exceeded 16 MB buffer. Narrow the command (e.g., add a more specific grep pattern, use head, restrict the path).`):errorCategoryResult(`shell_construct_blocked`,`exec failed: ${e instanceof Error?e.message:String(e)}`)}let q=await snapshotMtimes(w),J=diffMtimes(F.snapshot,q.snapshot);if(J.changed.length>0)return errorCategoryResult(`security_invariant_violation`,`Security invariant violated: file(s) in the content directory were modified during a read-only exec call: ${J.changed.join(`, `)}. This indicates a parser bug; the command has been logged.`);let Y=applySoftCap(B),ee=extractReferencedPaths(B,k).filter(e=>resolveWithinRoot(w,e).ok),{files:te,dirs:ne}=await classifyPaths(w,ee),ae=k.length===1&&k[0].command===`cat`&&te.length===1,oe=await Promise.all(te.map(e=>enrichPath(e,{projectDir:w,serverUrl:D},{includeRichFields:ae}).catch(()=>({path:e,tags:[],frontmatter:{},backlinkCount:null,backlinks:null,forwardLinkCount:null,forwardLinks:null,history:null,historySource:null,projectHistory:null,projectHistorySource:null})))),se=await Promise.all(ne.map(e=>enrichDirectoryRecursive(e,1,{projectDir:w}).catch(()=>({path:e,type:`directory`,directMdCount:0,recursiveMdCount:0,childDirCount:0,truncated:!1}))));if(!ae&&D&&oe.length>0){let e=await fetchBacklinkCountsBatch(D,oe.map(e=>pathToDocName$1(e.path))).catch(()=>null);if(e)for(let t of oe){let S=e.get(pathToDocName$1(t.path));typeof S==`number`&&(t.backlinkCount=S)}}let ce=new Map(oe.map(e=>[e.path,e])),ue=new Map(se.map(e=>[e.path,e])),de=[];for(let e of ee){let t=ce.get(e);if(t){de.push(t);continue}let S=ue.get(e);S&&de.push(S)}let fe=detectBinaryArgs(k),me=[];fe.length>0&&me.push(`File${fe.length>1?`s`:``} ${fe.join(`, `)} appear${fe.length===1?`s`:``} to be binary (image/PDF/etc.) — exec returns text only (NG8). For binary retrieval, use native Read.`);let ge=detectHeadTailTruncation(k,B);ge&&me.push(ge.banner),H&&me.push(`stderr: ${H.trim()}`);let _e=me.length>0?`${me.join(`
|
|
2721
|
-
`)}\n\n`:``,ve=buildStdoutProvenance(k,ue,ce)+Y.text,ye=`${_e}${ve}${formatEnrichedBlock(de)}`,{resolve:Ce}=await buildListResolver({config:E,resolveCwd:async()=>w});return textPlusStructured(ye,{enrichedPaths:withPreviewUrls(de,Ce),stdout:ve,stdoutTruncated:Y.truncated,cwd:w,...me.length>0?{warnings:me}:{}})}function register$17(e,t){e.registerTool(`exec`,{description:DESCRIPTION$17,inputSchema:{command:string$2().describe(`Read-only bash command (allowlist: cat, ls, grep, find, head, tail, wc, sort, uniq, cut; pipes OK)`),cwd:string$2().optional().describe("Absolute host path to run the command from. Defaults only when the MCP client advertises exactly one root; otherwise pass `cwd` explicitly.")}},async e=>{try{return await buildExecResult(e,t)}catch(e){return errorCategoryResult(`shell_construct_blocked`,`exec handler error: ${e instanceof Error?e.message:String(e)}`)}})}const DESCRIPTION$16=["[Operates on disk; no running OK server required] Folder-level configuration writes. Dispatches on `action`:",``,'- `action: "set-rule"` — Upsert folder rules (default frontmatter applied to docs in `<folder>/` via cascade). Writes nested `<folder>/.ok/frontmatter.yml`. Always batch-shape: pass `rules: [{...}]` even for one. Empty `frontmatter: {}` removes the rule and auto-cleans `<folder>/.ok/` if empty. Use `new_match` to rename the rule\'s match glob. Multi-folder globs are rejected (split per folder).','- `action: "write-template"` — Create or update `<folder>/.ok/templates/<name>.md`. Templates are markdown starter shapes; agents instantiate via `write_document({ template })`. `title` in frontmatter is REQUIRED (menu surface). Body MAY use `{{date}}` / `{{user}}` substitution tokens; any other `{{...}}` is rejected. Unknown keys are rejected.','- `action: "delete-template"` — Remove `<folder>/.ok/templates/<name>.md`. Idempotent (`existed: false` if missing). Auto-cleans empty `templates/` and `.ok/` dirs. Unknown keys are rejected.',``,"To apply several writes in one call (e.g. set a folder rule and write its template together), pass `operations: [{action, ...}, ...]` instead of a top-level `action`. Operations run in order; the response reports each.",``,`**Cascade merge semantics:** scalars replace last-wins along the leaf → root walk; arrays union-and-dedup with first-occurrence preserved; objects replace last-wins.`,``,`**Parameters:**`,"- `action` — `set-rule` | `write-template` | `delete-template`. Omit when using `operations`.","- `operations` — Array of `{action, ...}` objects. Mutually exclusive with a top-level `action`.","- `rules` — Required for `set-rule`. Array of `{match, frontmatter, new_match?}`. `match` is a folder glob (`specs/**`). `frontmatter` is an open record; common keys: `title`, `description`, `tags`; arbitrary keys also persist.","- `folder` — Required for `write-template`/`delete-template`. Project-root-relative folder. Empty / `.` means project root.","- `name` — Required for `write-template`/`delete-template`.
|
|
2722
|
-
`),ACTIONS$1=[`set-rule`,`write-template`,`delete-template`],FolderRuleUpsertInputSchema=object$1({match:string$2().min(1).describe(`Glob pattern (e.g. "specs/**", "meetings/prep-notes/**") that identifies the target folder.`),frontmatter:record(string$2(),unknown$2()).refine(e=>!(`title`in e&&e.title!==null&&typeof e.title!=`string`||`description`in e&&e.description!==null&&typeof e.description!=`string`||`tags`in e&&e.tags!==null&&!Array.isArray(e.tags)),{message:"Well-known keys must match expected types when present: `title` (string|null), `description` (string|null), `tags` (string[]|null)."}).describe("Default frontmatter to apply to matched docs. Open shape. Common: `{title?, description?, tags?: string[]}`; arbitrary keys also persist. Pass `{}` to remove the rule."),new_match:string$2().min(1).optional().describe("If set, move the rule from `match` to this new folder.")}),TEMPLATE_NAME_REGEX=/^[A-Za-z0-9_-]+$/,TemplateFrontmatterSchema=object$1({title:string$2().min(1,"Template `title` is required — it is the menu surface agents pick from.").describe(`Required. The menu surface agents pick from.`),description:string$2().optional().describe(`Recommended. Disambiguates similarly-named templates.`),tags:array(string$2()).optional().describe(`Optional. Concatenated with cascade tags at instantiation time.`)}),ACTION_FIELDS={rules:array(FolderRuleUpsertInputSchema).min(1).optional().describe("Required for `set-rule`. Array of folder rules to upsert."),folder:string$2().optional().describe("Required for `write-template`/`delete-template`. Project-root-relative folder."),name:string$2().min(1).
|
|
2721
|
+
`)}\n\n`:``,ve=buildStdoutProvenance(k,ue,ce)+Y.text,ye=`${_e}${ve}${formatEnrichedBlock(de)}`,{resolve:Ce}=await buildListResolver({config:E,resolveCwd:async()=>w});return textPlusStructured(ye,{enrichedPaths:withPreviewUrls(de,Ce),stdout:ve,stdoutTruncated:Y.truncated,cwd:w,...me.length>0?{warnings:me}:{}})}function register$17(e,t){e.registerTool(`exec`,{description:DESCRIPTION$17,inputSchema:{command:string$2().describe(`Read-only bash command (allowlist: cat, ls, grep, find, head, tail, wc, sort, uniq, cut; pipes OK)`),cwd:string$2().optional().describe("Absolute host path to run the command from. Defaults only when the MCP client advertises exactly one root; otherwise pass `cwd` explicitly.")}},async e=>{try{return await buildExecResult(e,t)}catch(e){return errorCategoryResult(`shell_construct_blocked`,`exec handler error: ${e instanceof Error?e.message:String(e)}`)}})}const DESCRIPTION$16=["[Operates on disk; no running OK server required] Folder-level configuration writes. Dispatches on `action`:",``,'- `action: "set-rule"` — Upsert folder rules (default frontmatter applied to docs in `<folder>/` via cascade). Writes nested `<folder>/.ok/frontmatter.yml`. Always batch-shape: pass `rules: [{...}]` even for one. Empty `frontmatter: {}` removes the rule and auto-cleans `<folder>/.ok/` if empty. Use `new_match` to rename the rule\'s match glob. Multi-folder globs are rejected (split per folder).','- `action: "write-template"` — Create or update `<folder>/.ok/templates/<name>.md`. Templates are markdown starter shapes; agents instantiate via `write_document({ template })`. `title` in frontmatter is REQUIRED (menu surface). Body MAY use `{{date}}` / `{{user}}` substitution tokens; any other `{{...}}` is rejected. Unknown keys are rejected.','- `action: "delete-template"` — Remove `<folder>/.ok/templates/<name>.md`. Idempotent (`existed: false` if missing). Auto-cleans empty `templates/` and `.ok/` dirs. Unknown keys are rejected.','- `action: "declare-field"` — Declare that docs in `<folder>/` should have a field named `name` of `type` (`text|number|boolean|date|list`). Writes `<folder>/.ok/schema.yml`. Each doc fills in its own value; the declaration only describes the shape. Use this when you want every doc in a folder to share a structural slot without dictating its value.','- `action: "remove-field"` — Remove a declared field from `<folder>/.ok/schema.yml`. Auto-cleans `schema.yml` and `.ok/` when empty.',``,"To apply several writes in one call (e.g. set a folder rule and write its template together), pass `operations: [{action, ...}, ...]` instead of a top-level `action`. Operations run in order; the response reports each.",``,`**Cascade merge semantics:** scalars replace last-wins along the leaf → root walk; arrays union-and-dedup with first-occurrence preserved; objects replace last-wins. Declarations accumulate up the tree with leaf-wins on type conflicts.`,``,`**Parameters:**`,"- `action` — `set-rule` | `write-template` | `delete-template` | `declare-field` | `remove-field`. Omit when using `operations`.","- `operations` — Array of `{action, ...}` objects. Mutually exclusive with a top-level `action`.","- `rules` — Required for `set-rule`. Array of `{match, frontmatter, new_match?}`. `match` is a folder glob (`specs/**`). `frontmatter` is an open record; common keys: `title`, `description`, `tags`; arbitrary keys also persist.","- `folder` — Required for `write-template`/`delete-template`/`declare-field`/`remove-field`. Project-root-relative folder. Empty / `.` means project root.","- `name` — Required for `write-template`/`delete-template`/`declare-field`/`remove-field`. For templates: filename without `.md`. For declarations: the field name. Letters/digits/`_`/`-` only for templates; declaration names are open.","- `body` — Required for `write-template`. Markdown body. May use `{{date}}` / `{{user}}`.","- `frontmatter` — Required for `write-template`. `{title (required), description?, tags?: string[]}`.","- `type` — Required for `declare-field`. One of `text|number|boolean|date|list`.","- `cwd` (optional) — Project root."].join(`
|
|
2722
|
+
`),ACTIONS$1=[`set-rule`,`write-template`,`delete-template`,`declare-field`,`remove-field`],FolderRuleUpsertInputSchema=object$1({match:string$2().min(1).describe(`Glob pattern (e.g. "specs/**", "meetings/prep-notes/**") that identifies the target folder.`),frontmatter:record(string$2(),unknown$2()).refine(e=>!(`title`in e&&e.title!==null&&typeof e.title!=`string`||`description`in e&&e.description!==null&&typeof e.description!=`string`||`tags`in e&&e.tags!==null&&!Array.isArray(e.tags)),{message:"Well-known keys must match expected types when present: `title` (string|null), `description` (string|null), `tags` (string[]|null)."}).describe("Default frontmatter to apply to matched docs. Open shape. Common: `{title?, description?, tags?: string[]}`; arbitrary keys also persist. Pass `{}` to remove the rule."),new_match:string$2().min(1).optional().describe("If set, move the rule from `match` to this new folder.")}),TEMPLATE_NAME_REGEX=/^[A-Za-z0-9_-]+$/,TemplateFrontmatterSchema=object$1({title:string$2().min(1,"Template `title` is required — it is the menu surface agents pick from.").describe(`Required. The menu surface agents pick from.`),description:string$2().optional().describe(`Recommended. Disambiguates similarly-named templates.`),tags:array(string$2()).optional().describe(`Optional. Concatenated with cascade tags at instantiation time.`)}),ACTION_FIELDS={rules:array(FolderRuleUpsertInputSchema).min(1).optional().describe("Required for `set-rule`. Array of folder rules to upsert."),folder:string$2().optional().describe("Required for `write-template`/`delete-template`/`declare-field`/`remove-field`. Project-root-relative folder. Empty / `.` means project root."),name:string$2().min(1).max(128).optional().describe("Required for `write-template`/`delete-template`/`declare-field`/`remove-field`. For templates: filename without `.md` extension (letters/digits/`_`/`-` only — enforced per-action). For declarations: the field name (open shape, matching frontmatter key conventions)."),body:string$2().optional().describe("Required for `write-template`. Markdown body."),frontmatter:TemplateFrontmatterSchema.optional().describe("Required for `write-template`. Template menu metadata."),type:FrontmatterTypeSchema.optional().describe("Required for `declare-field`. The widget type docs in the folder will see for this declared field.")},OperationSchema=object$1({action:_enum(ACTIONS$1).describe(`Which folder-config write to perform.`),...ACTION_FIELDS}).strict();function checkActionFields(e,t,S){e.action===`set-rule`?e.rules||t.addIssue({code:`custom`,message:"action=set-rule requires `rules`.",path:[...S,`rules`]}):e.action===`write-template`?(e.folder===void 0&&t.addIssue({code:`custom`,message:"action=write-template requires `folder`.",path:[...S,`folder`]}),e.name?typeof e.name==`string`&&!TEMPLATE_NAME_REGEX.test(e.name)&&t.addIssue({code:`custom`,message:"Template name must use letters, digits, `_`, or `-` only (no slashes, dots, or spaces).",path:[...S,`name`]}):t.addIssue({code:`custom`,message:"action=write-template requires `name`.",path:[...S,`name`]}),e.body===void 0&&t.addIssue({code:`custom`,message:"action=write-template requires `body`.",path:[...S,`body`]}),e.frontmatter||t.addIssue({code:`custom`,message:"action=write-template requires `frontmatter`.",path:[...S,`frontmatter`]})):e.action===`delete-template`?(e.folder===void 0&&t.addIssue({code:`custom`,message:"action=delete-template requires `folder`.",path:[...S,`folder`]}),e.name?typeof e.name==`string`&&!TEMPLATE_NAME_REGEX.test(e.name)&&t.addIssue({code:`custom`,message:"Template name must use letters, digits, `_`, or `-` only (no slashes, dots, or spaces).",path:[...S,`name`]}):t.addIssue({code:`custom`,message:"action=delete-template requires `name`.",path:[...S,`name`]})):e.action===`declare-field`?(e.folder===void 0&&t.addIssue({code:`custom`,message:"action=declare-field requires `folder`.",path:[...S,`folder`]}),e.name||t.addIssue({code:`custom`,message:"action=declare-field requires `name`.",path:[...S,`name`]}),e.type||t.addIssue({code:`custom`,message:"action=declare-field requires `type`.",path:[...S,`type`]})):e.action===`remove-field`&&(e.folder===void 0&&t.addIssue({code:`custom`,message:"action=remove-field requires `folder`.",path:[...S,`folder`]}),e.name||t.addIssue({code:`custom`,message:"action=remove-field requires `name`.",path:[...S,`name`]}))}const FolderConfigInputSchema=object$1({action:_enum(ACTIONS$1).optional().describe("Which folder-config write to perform. Omit when `operations` is set."),...ACTION_FIELDS,operations:array(OperationSchema).min(1).optional().describe("Batch form: apply several folder-config writes in one call. Mutually exclusive with `action`."),cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)}).strict().superRefine((e,t)=>{if(e.operations!==void 0){e.action!==void 0&&t.addIssue({code:`custom`,message:"`action` and `operations` are mutually exclusive.",path:[`action`]});for(let S of[`rules`,`folder`,`name`,`body`,`frontmatter`,`type`])e[S]!==void 0&&t.addIssue({code:`custom`,message:`\`${S}\` belongs inside an \`operations\` entry, not at the top level.`,path:[S]});e.operations.forEach((e,S)=>{checkActionFields(e,t,[`operations`,S])});return}if(e.action===void 0){t.addIssue({code:`custom`,message:"Provide either `action` or `operations`.",path:[`action`]});return}checkActionFields(e,t,[])}),AppliedEntrySchema=object$1({match:string$2(),path:string$2(),action:_enum([`written`,`deleted`])}),SingleResultSchema=union([object$1({ok:literal(!0),applied:array(AppliedEntrySchema)}),object$1({ok:literal(!1),error:object$1({code:_enum([`MULTI_FOLDER_GLOB`,`PATH_ESCAPE`,`BAD_PROJECT_DIR`,`WRITE_ERROR`]),message:string$2(),rule:string$2().optional()}),partiallyApplied:array(AppliedEntrySchema).optional()}),object$1({ok:literal(!0),path:string$2(),created:boolean$1(),warnings:array(string$2())}),object$1({ok:literal(!0),path:string$2(),existed:boolean$1(),cleanedEmpty:object$1({templatesDir:boolean$1(),okDir:boolean$1()})}),object$1({ok:literal(!1),error:object$1({code:string$2(),message:string$2()})})]),FolderConfigOutputSchema=outputSchemaWithText({result:union([SingleResultSchema,object$1({ok:boolean$1(),operations:array(object$1({action:_enum(ACTIONS$1),result:SingleResultSchema}))})])});function register$16(e,t){e.registerTool(`folder_config`,{description:DESCRIPTION$16,inputSchema:FolderConfigInputSchema,outputSchema:FolderConfigOutputSchema,annotations:{readOnlyHint:!1,idempotentHint:!0,destructiveHint:!0}},async e=>{let S=await resolveProjectConfigContext(t.resolveCwd,t.config,e.cwd);if(!S.ok)return{isError:!0,content:[{type:`text`,text:`Error: ${S.error}`}]};let{cwd:w}=S;if(e.operations!==void 0)return handleBatch(e.operations,w);switch(e.action){case`set-rule`:return handleSetRule(e,w);case`write-template`:return handleWriteTemplate(e,w);case`delete-template`:return handleDeleteTemplate(e,w);case`declare-field`:return handleDeclareField(e,w);case`remove-field`:return handleRemoveField(e,w)}return{isError:!0,content:[{type:`text`,text:`Error: no action.`}]}})}function applyOperation(e,t){switch(e.action){case`set-rule`:return e.rules?applyNestedFolderRulesUpsert({projectDir:t,rules:e.rules.map(e=>({match:e.match,frontmatter:e.frontmatter??{},...e.new_match===void 0?{}:{new_match:e.new_match}}))}):{ok:!1,error:{code:`MISSING_FIELD`,message:"set-rule requires `rules`."}};case`write-template`:return e.folder===void 0||!e.name||e.body===void 0||!e.frontmatter?{ok:!1,error:{code:`MISSING_FIELD`,message:"write-template requires `folder`, `name`, `body`, and `frontmatter`."}}:applyTemplateWrite({projectDir:t,folder:e.folder,name:e.name,body:e.body,frontmatter:e.frontmatter});case`delete-template`:return e.folder===void 0||!e.name?{ok:!1,error:{code:`MISSING_FIELD`,message:"delete-template requires `folder` and `name`."}}:applyTemplateDelete({projectDir:t,folder:e.folder,name:e.name});case`declare-field`:return e.folder===void 0||!e.name||!e.type?{ok:!1,error:{code:`MISSING_FIELD`,message:"declare-field requires `folder`, `name`, and `type`."}}:applyNestedFolderSchemaUpsert({projectDir:t,rules:[{match:e.folder===``?`**`:`${e.folder}/**`,declarations:{[e.name]:{type:e.type}}}]});case`remove-field`:return e.folder===void 0||!e.name?{ok:!1,error:{code:`MISSING_FIELD`,message:"remove-field requires `folder` and `name`."}}:applyNestedFolderSchemaUpsert({projectDir:t,rules:[{match:e.folder===``?`**`:`${e.folder}/**`,declarations:{[e.name]:null}}]})}}function handleDeclareField(e,t){let S=e.folder??``,w=S===``?`**`:`${S}/**`,E=e.name??``,D=e.type??`text`,O=applyNestedFolderSchemaUpsert({projectDir:t,rules:[{match:w,declarations:{[E]:{type:D}}}]});return O.ok?textPlusStructured(JSON.stringify(O,null,2),{result:O}):textPlusStructured(`${O.error.code}: ${O.error.message}`,{result:O},!0)}function handleRemoveField(e,t){let S=e.folder??``,w=applyNestedFolderSchemaUpsert({projectDir:t,rules:[{match:S===``?`**`:`${S}/**`,declarations:{[e.name??``]:null}}]});return w.ok?textPlusStructured(JSON.stringify(w,null,2),{result:w}):textPlusStructured(`${w.error.code}: ${w.error.message}`,{result:w},!0)}function describeResult(e,t){return t.ok?`applied`in t?`${e}: ${t.applied.length} rule(s) applied`:`created`in t?`${e}: ${t.created?`created`:`updated`} ${t.path}`:`existed`in t?`${e}: ${t.existed?`deleted`:`no-op (missing)`} ${t.path}`:e:`${e}: ${t.error.code}: ${t.error.message}`}function handleBatch(e,t){let S=e.map(e=>({action:e.action,result:applyOperation(e,t)})),w=S.every(e=>e.result.ok),E={ok:w,operations:S},D=S.map(e=>describeResult(e.action,e.result)).join(`
|
|
2723
2723
|
`);return w?textPlusStructured(D,{result:E}):textPlusStructured(D,{result:E},!0)}function handleSetRule(e,t){let S=applyNestedFolderRulesUpsert({projectDir:t,rules:(e.rules??[]).map(e=>({match:e.match,frontmatter:e.frontmatter??{},...e.new_match===void 0?{}:{new_match:e.new_match}}))});return S.ok?textPlusStructured(JSON.stringify(S,null,2),{result:S}):textPlusStructured(`${S.error.code}: ${S.error.message}`,{result:S},!0)}function handleWriteTemplate(e,t){let S=applyTemplateWrite({projectDir:t,folder:e.folder??``,name:e.name??``,body:e.body??``,frontmatter:e.frontmatter??{title:``}});if(!S.ok)return textPlusStructured(`${S.error.code}: ${S.error.message}`,{result:S},!0);let w=[`${S.created?`Created`:`Updated`} template at ${S.path}`];if(S.warnings.length>0){w.push(``,`Warnings:`);for(let e of S.warnings)w.push(` - ${e}`)}return textPlusStructured(w.join(`
|
|
2724
2724
|
`),{result:S})}function handleDeleteTemplate(e,t){let S=applyTemplateDelete({projectDir:t,folder:e.folder??``,name:e.name??``});if(!S.ok)return textPlusStructured(`${S.error.code}: ${S.error.message}`,{result:S},!0);let w=[S.existed?`Deleted template at ${S.path}`:`Template at ${S.path} did not exist (no-op)`];return S.cleanedEmpty.templatesDir&&w.push(`Removed empty .ok/templates/ directory`),S.cleanedEmpty.okDir&&w.push(`Removed empty .ok/ directory`),textPlusStructured(w.join(`
|
|
2725
2725
|
`),{result:S})}const DESCRIPTION$15=[`[Operates on registry data; no running OK server required] Return the OK authoring palette so a generated document reads as one coherent, themed artifact.`,``,`Three sections:`,"- `components` — the **markdown-native forms** OK auto-promotes into themed canonical components at parse time. Write `> [!NOTE]` (not `<Callout>`), `<details>` (not `<Accordion>`), ` ```mermaid `, `$x$`. Each entry carries a copy-ready `example` + `guidance`.","- `embedPatterns` — copy-ready ` ```html preview ` starters (chart, stat cards, custom SVG, interactive control) already wired to the theme tokens, so an embed tracks light/dark with no hand-picked colors.","- `tokens` — the CSS custom properties injected into every preview iframe; reference them as `var(--chart-1)`, `var(--foreground)`, … inside an `html preview` embed.",``,"For the full JSX-form prop schema of a specific canonical, call `get_components({ ids })`.",``,`**Parameters:**`,"- `cwd` (optional) — Project root (see `cwd` description below)."].join(`
|
|
@@ -3347,7 +3347,7 @@ In headless mode, write the recap into the research article's "Further reading"
|
|
|
3347
3347
|
`)}function register$3(e,t){e.registerTool(`search`,{description:DESCRIPTION$3,inputSchema:InputSchema,outputSchema:OutputSchema$1,annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0}},async e=>{try{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,config:E,url:D}=S;if(!D)return textResult(`${HOCUSPOCUS_NOT_RUNNING_ERROR}\nFor server-free literal-string search, use \`exec("grep ...")\` instead — it walks the filesystem and does not need Hocuspocus.`,!0);let O=e.intent??`full_text`,k=e.limit??20,j={query:e.query,intent:O,limit:k};e.scopes&&(j.scopes=e.scopes);let F=await httpPost(D,`/api/search`,j);if(!F.ok)return textResult(`Error: ${F.error}`,!0);let{resolve:L}=await buildListResolver({config:E,resolveCwd:async()=>w},w),B=(F.results??[]).flatMap(e=>{if(!isSearchKind(e.kind)||typeof e.path!=`string`)return[];let t=docNameFromPath(e.path),S=L(t);return[{kind:e.kind,path:e.path,docName:t,title:e.title??null,score:typeof e.score==`number`?e.score:0,signals:normalizeSignals(e.signals),...e.snippet?{snippet:e.snippet}:{},previewUrl:S?.url??null,...S?{previewUrlSource:S.source}:{}}]}),H={cwd:w,query:e.query,intent:O,resultCount:B.length,results:B,elapsedMs:typeof F.elapsedMs==`number`?F.elapsedMs:null},q=`## Search results for "${e.query}" (${B.length} hit${B.length===1?``:`s`}, intent: ${O})`;return textPlusStructured(B.length===0?`No matches for "${e.query}".`:`${q}\n\n${formatResultsBlock(B)}`,H)}catch(e){return textResult(`Error: ${e instanceof Error?e.message:String(e)}`,!0)}})}const DESCRIPTION$2=["[Requires: Hocuspocus server] Build a shareable GitHub-substrate URL (`https://openknowledge.ai/d/...`) pinned to the project's current branch + the focused doc. Read-only against the working tree — no commits, no pushes, no `git fetch`.",``,`Use this when the user asks for a share link / shareable link / URL to send to a teammate. Recipients open the link to receive the doc into their own Open Knowledge install.`,``,"**Publishing is a user act.** Agents do NOT publish projects to GitHub from this tool. When the project has no GitHub remote, this tool returns an error pointing the user at the Share wizard (or `gh repo create` + `git push`) — it does not run those steps itself.",``,`**Parameters:**`,"- `docName` — Document name, extension-less. Trailing `.md`/`.mdx` is stripped; the on-disk file is probed automatically.","- `cwd` (optional) — Project root (see `cwd` description below).",``,"**Preconditions:** project on a named branch (not detached HEAD); origin set to a `github.com` remote; the branch already pushed to origin."].join(`
|
|
3348
3348
|
`);function messageForShareError(e,t){switch(e){case`no-remote`:return"This project has no GitHub remote. Ask the user to push it to GitHub first (e.g. `gh repo create` then `git push -u origin <branch>`), or use the Share button in the editor to run the Publish wizard. Agents do not publish projects from this tool.";case`detached-head`:return"HEAD is detached (no branch checked out). Ask the user to check out a branch (`git checkout <branch>`) before sharing.";case`branch-not-on-origin`:{let e=" (If the user says it is already pushed, ask them to `git fetch origin` first to refresh the local mirror, then retry.)";return t?`Branch \`${t}\` is not on origin yet. Ask the user to push it (\`git push -u origin ${t}\`), then retry.${e}`:`The current branch is not on origin yet. Ask the user to push it (\`git push -u origin <branch>\`), then retry.${e}`}case`non-github-remote`:return"Origin is not a `github.com` remote. Share links are GitHub-only in v1.";case`invalid-path`:return"The resolved document path is not shareable (escapes the project root or names the `.git` subtree). Pass a normal docName under the content directory.";default:return`Unknown share-construct-url error: ${String(e)}`}}function resolveDocSharePath(e,t,S){let w=resolveWithinRoot(t,S);if(!w.ok)return null;for(let t of[`.mdx`,`.md`]){let S=`${w.abs}${t}`;if(existsSync(S)){let t=resolveWithinRoot(e,S);return t.ok?t.rel:null}}return null}const OutputSchema=outputSchemaWithText({ok:boolean$1().describe(`Success discriminator.`),shareUrl:string$2().optional().describe(`Marketing share URL (success only).`),blobUrl:string$2().optional().describe(`Unencoded GitHub blob URL (success only).`),branch:string$2().optional().describe(`Branch the share URL pins to (success only).`),error:_enum([`no-remote`,`detached-head`,`branch-not-on-origin`,`non-github-remote`,`invalid-path`,`doc-not-found`,`unknown`]).optional().describe(`Failure code (error path only).`),message:string$2().optional().describe(`Agent-actionable error message (error path only).`),previewUrl:string$2().nullable().optional().describe("Route-only preview URL `/#/<doc>` (no host:port). `null` when no UI is running."),previewUrlSource:string$2().optional().describe(`Internal: preview-URL provenance.`)});function register$2(e,t){e.registerTool(`share_link`,{description:DESCRIPTION$2,inputSchema:{docName:string$2().describe("Document to share, extension-less. Trailing `.md`/`.mdx` is stripped."),cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)},outputSchema:OutputSchema,annotations:{readOnlyHint:!0,idempotentHint:!0}},async e=>{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,config:E,url:D}=S;if(!D)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let O=normalizeDocName(e.docName);if(!O.ok)return textResult(O.error,!0);let k=resolveDocSharePath(w,join(w,E.content.dir),O.docName);if(k===null){let e={ok:!1,error:`doc-not-found`,message:`Document \`${O.docName}\` does not exist under the content directory (looked for \`.md\` and \`.mdx\`).`};return textPlusStructured(`Error: ${e.message}`,e,!0)}let j;try{j=await fetch(`${D}/api/share/construct-url`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({docPath:k}),signal:AbortSignal.timeout(3e4)})}catch(e){let t=`Server unreachable: ${e instanceof Error?e.message:String(e)}`;return textPlusStructured(`Error: ${t}`,{ok:!1,error:`unknown`,message:t},!0)}let F;try{F=await j.json()}catch(e){let t=`Server returned non-JSON body: ${e instanceof Error?e.message:String(e)}`;return textPlusStructured(`Error: ${t}`,{ok:!1,error:`unknown`,message:t},!0)}if(!j.ok){let e;if(F&&typeof F==`object`){let t=F,S=typeof t.title==`string`?t.title:void 0,w=typeof t.detail==`string`?t.detail:void 0;e=S&&w?`${S}: ${w}`:S||w||`HTTP ${j.status}`}else e=`HTTP ${j.status}`;return textPlusStructured(`Error: ${e}`,{ok:!1,error:`unknown`,message:e},!0)}let L=ShareConstructUrlResponseSchema.safeParse(F);if(!L.success){let e=`Server returned an unexpected share-construct-url response shape.`;return textPlusStructured(`Error: ${e}`,{ok:!1,error:`unknown`,message:e},!0)}let B=L.data;if(!B.ok){let e=messageForShareError(B.error,B.branch),t={ok:!1,error:B.error,message:e,...B.branch?{branch:B.branch}:{}};return textPlusStructured(`Error: ${e}`,t,!0)}let{shareUrl:H,blobUrl:q,branch:J}=B,Y={ok:!0,shareUrl:H,blobUrl:q,branch:J},ee=await resolvePreviewUrlForTool(O.docName,{config:t.config,resolveCwd:t.resolveCwd},w);return textPlusStructured(`Share link for \`${O.docName}\` on branch \`${J}\`:\n${H}`,{...Y,previewUrl:ee?.url??null,...ee?{previewUrlSource:ee.source}:{}})})}const ACTIONS=[`save`,`rollback`],DESCRIPTION$1=["[Requires: Hocuspocus server] Project version management. Dispatches on `action`:",``,'- `action: "save"` — Project-wide checkpoint of every document. No `docName`. Returns `{checkpointRef, previewUrl: null}`. Find checkpoints later via `get_history`.','- `action: "rollback"` — Restore one document to a historical version via the CRDT layer (append-only — creates a new version with the old content; all connected editors see the change in real-time). Requires `docName` and `commitSha`. Find `commitSha` via `get_history`.',``,`**Parameters:**`,"- `action` — `save` | `rollback`.","- `docName` — Required for `rollback`. Document name, typically without extension; trailing `.md`/`.mdx` is stripped.","- `commitSha` — Required for `rollback`. 40-character SHA from the shadow-repo timeline.",'- `summary` — Optional rollback summary (≤80 chars). If omitted, defaults to "Restored to <sha-short>". Avoid secrets or PII — summaries persist to git history.'].join(`
|
|
3349
3349
|
`);function register$1(e,t){e.registerTool(`version`,{description:DESCRIPTION$1,inputSchema:{action:_enum(ACTIONS).describe(`Which version action to perform.`),docName:string$2().optional().describe(`Document name. Required for action=rollback.`),commitSha:string$2().length(40).regex(/^[0-9a-f]+$/i).optional().describe(`40-character commit SHA from the shadow-repo timeline. Required for action=rollback. Find via get_history.`),summary:summaryArgSchema.describe(`Optional rollback summary (≤80 chars). Defaults to "Restored to <sha-short>". Appears as a bullet in the timeline.`),cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)}},async e=>{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,url:E}=S;if(!E)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);switch(e.action){case`save`:return handleSave(E,t);case`rollback`:return handleRollback(e,E,w,t);default:return textResult(`Error: unknown version action.`,!0)}})}async function handleSave(e,t){let S=t.identityRef?.current,w=await httpPost(e,`/api/save-version`,S?{writers:[{id:`agent-${S.connectionId}`,name:S.displayName,email:`agent-${S.connectionId}@openknowledge.local`}]}:{});return w.ok?textPlusStructured(`Checkpoint saved. Checkpoint ref: ${w.checkpointRef}`,{checkpointRef:w.checkpointRef,previewUrl:null}):textResult(`Error: ${w.error}`,!0)}async function handleRollback(e,t,S,w){if(!e.docName)return textResult("Error: action=rollback requires `docName`.",!0);if(!e.commitSha)return textResult("Error: action=rollback requires `commitSha`.",!0);let E=normalizeDocName(e.docName);if(!E.ok)return textResult(E.error,!0);let D=E.docName,O=await httpGet(t,`/api/history/${e.commitSha}?docName=${encodeURIComponent(D)}`);if(!O.ok)return textResult(`Error: ${O.error??`Version not found`}`,!0);let k=w.identityRef?.current,j=await httpPost(t,`/api/rollback`,{docName:D,commitSha:e.commitSha,...e.summary===void 0?{}:{summary:e.summary},...k?{agentId:k.connectionId,agentName:k.displayName,clientName:k.clientInfo?.name,colorSeed:k.colorSeed}:{}});if(!j.ok)return textResult(`Error: ${j.error}`,!0);let F=j.summary&&typeof j.summary==`object`?j.summary:void 0,L=typeof F?.hint==`string`?F.hint:void 0,B=typeof O.author==`string`?O.author:void 0,H=typeof O.timestamp==`string`?O.timestamp:void 0,q=B&&H?` (${B}, ${H})`:``,J=[`Restored "${D}" to version ${e.commitSha.slice(0,8)}${q}. The change has been applied to all connected editors.`];L&&J.push(L);let Y=await resolvePreviewUrlForTool(D,{config:w.config,resolveCwd:w.resolveCwd},S);return textPlusStructured(J.join(`
|
|
3350
|
-
`),{previewUrl:Y?.url??null,...Y?{previewUrlSource:Y.source}:{},...F?{summary:F}:{}})}const POSITIONS=[`append`,`prepend`,`replace`],DESCRIPTION=`${[`[Requires: Hocuspocus server] Write markdown to a document via the CRDT layer. Content propagates to all connected editors in real-time.`,``,'Frontmatter changes: 1-2 keys → prefer `edit_frontmatter` (field-level CRDT, atomic). Full rewrite (≥3-5 keys or body + frontmatter together) → this tool with `position: "replace"` and the full YAML block in the payload.',``,'Templates: `template: "<name>"` resolves against the parent folder\'s `templates_available` (see `exec("ls <folder>/")`) and becomes the new doc verbatim. `template` and `markdown` are mutually exclusive. With `template` set, `position` is forced to `"replace"`.',``,"To create several docs in one call (scaffolding a pack, seeding dossiers), pass `docs: [{docName, markdown|template, position?, summary?}, ...]` instead of the single-doc fields. Docs write in order; the response reports each.",``,`**Parameters:**`,"- `docName` — A single document, extension-less (`notes/meeting`). Trailing `.md`/`.mdx` is stripped. New docs default to `.md`.","- `docs` — Batch form: array of `{docName, markdown?|template?, position?, summary?}`. Mutually exclusive with the single-doc fields.","- `markdown` — Markdown payload. Required unless `template` is set.","- `template` — Template name. Mutually exclusive with `markdown`.","- `position` — `append` | `prepend` | `replace`. Optional for a new doc (defaults to `replace`); required for an existing doc. Forced to `replace` with `template`.","- `summary` — Optional one-line user-outcome (≤80 chars). Avoid secrets or PII — persisted to git history."].join(`
|
|
3350
|
+
`),{previewUrl:Y?.url??null,...Y?{previewUrlSource:Y.source}:{},...F?{summary:F}:{}})}const POSITIONS=[`append`,`prepend`,`replace`],DESCRIPTION=`${[`[Requires: Hocuspocus server] Write markdown to a document via the CRDT layer. Content propagates to all connected editors in real-time.`,``,'Frontmatter changes: 1-2 keys → prefer `edit_frontmatter` (field-level CRDT, atomic). Full rewrite (≥3-5 keys or body + frontmatter together) → this tool with `position: "replace"` and the full YAML block in the payload.',``,'Templates: `template: "<name>"` resolves against the parent folder\'s `templates_available` (see `exec("ls <folder>/")`) and becomes the new doc verbatim. `template` and `markdown` are mutually exclusive. With `template` set, `position` is forced to `"replace"`.',``,"To create several docs in one call (scaffolding a pack, seeding dossiers), pass `docs: [{docName, markdown|template, position?, summary?}, ...]` instead of the single-doc fields. Docs write in order; the response reports each.",``,`**Parameters:**`,"- `docName` — A single document, extension-less (`notes/meeting`). Trailing `.md`/`.mdx` is stripped. New docs default to `.md`.","- `docs` — Batch form: array of `{docName, markdown?|template?, position?, summary?}`. Mutually exclusive with the single-doc fields.","- `markdown` — Markdown payload. Required unless `template` is set.","- `template` — Template name. Mutually exclusive with `markdown`.","- `position` — `append` | `prepend` | `replace`. Optional for a new doc (defaults to `replace`); required for an existing doc. Forced to `replace` with `template`.","- `summary` — Optional one-line user-outcome (≤80 chars). Avoid secrets or PII — persisted to git history.",``,"Folder schema declarations: if the target folder declares fields via `<folder>/.ok/schema.yml`, those declarations surface on each doc's `EnrichedMeta.schema_declarations` (visible through `exec(\"cat <doc>.md\")`). Prefer including declared fields in the new doc's frontmatter when their value is known. Type is advisory, not enforced."].join(`
|
|
3351
3351
|
`)}\n${renderInventoryFooter()}`;function frontmatterIgnoredNote(e,t){return e!==`prepend`&&e!==`append`||!t||stripFrontmatter(t).frontmatter.trim()===``?null:`Note: a \`---\` frontmatter block in this \`${e}\` payload was ignored — frontmatter is written only with \`position: "replace"\`. To change frontmatter, use \`edit_frontmatter\` (1-2 keys) or \`write_document({ position: "replace" })\` (full rewrite).`}function docExistsOnDisk(e,t){return SUPPORTED_DOC_EXTENSIONS.some(S=>{let w=resolveWithinRoot(e,`${t}${S}`);return w.ok&&existsSync(w.abs)})}async function writeOneDoc(e,t,S,w,E){let D=normalizeDocName(e.docName);if(!D.ok)return{docName:e.docName,ok:!1,error:D.error};let O=D.docName,k=E.identityRef?.current;if(e.template===void 0&&e.markdown===void 0)return{docName:O,ok:!1,error:"either `markdown` or `template` must be provided — omitting both would write empty content."};if(e.template!==void 0&&e.markdown!==void 0)return{docName:O,ok:!1,error:"TEMPLATE_AND_MARKDOWN_BOTH_SET — `template` and `markdown` are mutually exclusive. Pass one; fill placeholders via subsequent `edit_document` calls."};let j=e.markdown??``,F;if(e.position!==void 0)F=e.position;else if(docExistsOnDisk(S,O))return{docName:O,ok:!1,error:`"${O}" already exists — pass \`position\` (\`append\` | \`prepend\` | \`replace\`), or use \`edit_document\` for a targeted change.`};else F=`replace`;if(e.template!==void 0){let S=parentFolderOf(O),w=resolveTemplatesAvailable(t,S,{depth:1}),E=w.find(t=>t.name===e.template);if(!E)return{docName:O,ok:!1,error:`template "${e.template}" not found for folder "${S||`.`}". Available: ${w.length===0?`(none)`:w.map(e=>`${e.name} [${e.scope}]`).join(`, `)}. Templates are resolved by walk-up; check the parent folder's exec listing to see the menu.`};let D;try{D=readFileSync(resolve(t,E.path),`utf-8`)}catch(e){return{docName:O,ok:!1,error:`failed to read template at ${E.path}: ${e.message}`}}let{body:L}=stripFrontmatter(D);j=applySubstitution(L,{date:todayIsoUtc(),user:k?.displayName??``}),F=`replace`}let L=await httpPost(w,`/api/agent-write-md`,{docName:O,markdown:j,position:F,...e.summary===void 0?{}:{summary:e.summary},...k?{agentId:k.connectionId,agentName:k.displayName,clientName:k.clientInfo?.name,colorSeed:k.colorSeed}:{}});return L.ok?{docName:O,ok:!0,position:F,...e.template===void 0?{}:{fromTemplate:e.template},raw:L}:{docName:O,ok:!1,error:String(L.error)}}function register(e,t){let S={docName:string$2().describe(`Document name to write to`),markdown:string$2().optional().describe("Markdown content to write. Optional when `template` is set."),template:string$2().min(1).optional().describe("Template name resolved against the parent folder's templates_available (leaf → root walk-up; closest-wins). Inspect the menu with an `exec` listing of the folder."),position:_enum(POSITIONS).optional().describe("Where to insert the content. Optional for a new doc (defaults to `replace`); required when the doc already exists."),summary:summaryArgSchema};e.registerTool(`write_document`,{description:DESCRIPTION,inputSchema:{docName:string$2().optional().describe(`A single document to write to.`),markdown:string$2().optional().describe("Markdown content. Optional when `template` is set."),template:string$2().min(1).optional().describe("Template name resolved against the parent folder's templates_available (leaf → root walk-up; closest-wins). Inspect the menu with an `exec` listing of the folder."),position:_enum(POSITIONS).optional().describe("Where to insert the content. Optional for a new doc (defaults to `replace`); required when the doc already exists."),summary:summaryArgSchema,docs:array(object$1(S)).min(1).optional().describe(`Batch: documents to write in one call. Mutually exclusive with the single-doc fields.`),cwd:string$2().optional().describe(ROUTED_CWD_DESCRIPTION)}},async e=>{let S=await resolveProjectServerContext(t.resolveCwd,t.config,t.serverUrl,e.cwd);if(!S.ok)return textResult(`Error: ${S.error}`,!0);let{cwd:w,config:E,url:D}=S;if(!D)return textResult(HOCUSPOCUS_NOT_RUNNING_ERROR,!0);let O=resolveLockDir(w),k=resolveContentDir(E,w);if(e.docs!==void 0){if(e.docName!==void 0||e.markdown!==void 0||e.template!==void 0||e.position!==void 0||e.summary!==void 0)return textResult("Error: `docs` is the batch form — do not also pass top-level `docName` / `markdown` / `template` / `position` / `summary` (each `docs[]` entry carries its own).",!0);let S=[];for(let E of e.docs)S.push(await writeOneDoc(E,w,k,D,t));let E=S.map(e=>{if(!e.ok)return{docName:e.docName,ok:!1,error:e.error};let t=resolvePreviewUrl(e.docName,{lockDir:O});return{docName:e.docName,ok:!0,position:e.position,...t?{previewUrl:t.url}:{}}}),j=E.filter(e=>e.ok).length,F=j===E.length,L=E.map(e=>e.ok?`Wrote ${e.docName} (${e.position}).`:`Failed ${e.docName}: ${e.error}`),B=e.docs.flatMap((e,t)=>{let w=S[t];if(!w?.ok)return[];let E=frontmatterIgnoredNote(w.position,e.markdown);return E?[`${e.docName} — ${E}`]:[]}),H=[`${j}/${E.length} written.`,...L,...B].join(`
|
|
3352
3352
|
`),q={ok:F,documents:E},J=S.find(e=>e.ok);return J&&J.raw.systemSubscriberCount===0&&(q.warning=buildPreviewAttachWarning(resolvePreviewUrl(J.docName,{lockDir:O}))),textPlusStructured(H,q,!F)}if(e.docName===void 0)return textResult("Error: provide `docName` (single) or `docs` (batch).",!0);let j=await writeOneDoc({docName:e.docName,markdown:e.markdown,template:e.template,position:e.position,summary:e.summary},w,k,D,t);if(!j.ok)return textResult(`Error: ${j.error}`,!0);let F=j.raw,L=resolvePreviewUrl(j.docName,{lockDir:O}),B=typeof F.subscriberCount==`number`?F.subscriberCount:void 0,H=(typeof F.systemSubscriberCount==`number`?F.systemSubscriberCount:void 0)===0,q=B===0,J=Array.isArray(F.hints)?F.hints:void 0,Y=F.summary&&typeof F.summary==`object`?F.summary:void 0,ee=typeof Y?.hint==`string`?Y.hint:void 0,te=[j.fromTemplate===void 0?`Written successfully (${j.position}).`:`Written successfully (instantiated from template "${j.fromTemplate}").`],ne=frontmatterIgnoredNote(j.position,e.markdown);if(ne&&te.push(ne),H&&!L&&te.push(START_UI_TEXT_HINT),ee&&te.push(ee),J)for(let e of J)e.message&&te.push(e.message);let ae=te.join(`
|
|
3353
3353
|
`);if(!L&&!H&&!q&&!J&&!Y)return textResult(ae);let oe={};return L&&(oe.previewUrl=L.url,oe.previewUrlSource=L.source),H&&(oe.warning=buildPreviewAttachWarning(L)),J&&(oe.hints=J),Y&&(oe.summary=Y),textPlusStructured(ae,oe)})}function registerAllTools(e,t){let S=t.logger,w=createLoggedServer(e,{logger:t.logger,identityRef:t.identityRef}),E=e=>async w=>{try{let E=await t.resolveCwd(w);return(getCurrentMcpLogger()??S)?.debug(`tool cwd resolved`,{tool:e,cwd:E,...w?{explicit:w}:{}}),E}catch(t){throw(getCurrentMcpLogger()??S)?.warn(`tool call failed`,{tool:e,error:t instanceof Error?t.message:String(t),...w?{explicit:w}:{}}),t}};register$17(w,{resolveCwd:E(`exec`),serverUrl:t.serverUrl,config:t.config}),register$9(w,{config:t.config,resolveCwd:E(`ingest`)}),register$5(w,{config:t.config,resolveCwd:E(`research`)}),register$22(w,{config:t.config,resolveCwd:E(`consolidate`)}),register$20(w,{config:t.config,resolveCwd:E(`discover`)}),register$3(w,{resolveCwd:E(`search`),config:t.config,serverUrl:t.serverUrl}),register$8(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`links`)}),register(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`write_document`),identityRef:t.identityRef}),register$19(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`edit_document`),identityRef:t.identityRef}),register$21(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`delete_document`),identityRef:t.identityRef}),register$18(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`edit_frontmatter`),identityRef:t.identityRef}),register$6(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`rename`),identityRef:t.identityRef}),register$11(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`get_history`)}),register$1(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`version`),identityRef:t.identityRef}),register$14(w,{resolveCwd:E(`get_components`),config:t.config}),register$15(w,{resolveCwd:E(`get_authoring_palette`),config:t.config}),register$13(w,{config:t.config,resolveCwd:E(`get_config`)}),register$10(w,{config:t.config,resolveCwd:E(`get_preview_url`)}),register$16(w,{config:t.config,resolveCwd:E(`folder_config`)}),register$7(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`list_conflicts`)}),register$12(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`get_conflict_content`)}),register$4(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`resolve_conflict`)}),register$2(w,{serverUrl:t.serverUrl,config:t.config,resolveCwd:E(`share_link`)})}function firstHeader(e){return Array.isArray(e)?e[0]:e}function writePlain(e,t,S){e.writableEnded||(e.statusCode=t,e.setHeader(`Content-Type`,`text/plain; charset=utf-8`),e.end(S))}function createSessionServer(e,t,S){let w=e.config,E=new McpServer({name:MCP_SERVER_NAME,version:RUNTIME_VERSION},{instructions:buildInstructions(w.content)});installPrettyZodErrors(E);let D=S??randomUUID(),O={current:{connectionId:D,displayName:D,colorSeed:D}};E.server.oninitialized=()=>{let e=E.server.getClientVersion(),t=sanitizeClientName(e?.name,D);O.current={connectionId:D,clientInfo:e?{name:t,version:e.version}:void 0,displayName:displayNameFromClientName(t),colorSeed:t}};let k=e.projectDir??e.contentDir;return registerAllTools(E,{serverUrl:async()=>e.getServerUrl(),resolveCwd:async e=>{if(e===void 0)return k;let t=resolveWithinRoot(k,e);if(!t.ok)throw Error(`cwd "${e}" is not within the configured project root: ${t.reason}`);return t.abs},config:w,identityRef:O}),{server:E,transport:t}}function createMcpHttpHandler(e){let t=new Map,S=e.sessionTtlMs??1800*1e3,w=e.maxSessions??100;async function E(S,w){let E=t.get(S);if(!E)return;t.delete(S),E.ttlTimer!==void 0&&clearTimeout(E.ttlTimer);let D=await Promise.allSettled([E.server.close(),E.transport.close()]);for(let t of D)t.status===`rejected`&&e.log?.warn?.({err:t.reason,sessionId:S,reason:w},`MCP HTTP session close failed`);e.log?.info?.({sessionId:S,reason:w},`MCP HTTP session closed`)}function D(t,w){w.ttlTimer!==void 0&&clearTimeout(w.ttlTimer),w.ttlTimer=setTimeout(()=>{E(t,`ttl-expired`).catch(S=>{e.log?.warn?.({err:S,sessionId:t},`MCP HTTP session TTL cleanup failed`)})},S),w.ttlTimer.unref?.()}return{async handle(S,O){let k=firstHeader(S.headers[`mcp-session-id`]);if(k){let e=t.get(k);if(!e){writePlain(O,404,`MCP session not found`);return}D(k,e),await e.transport.handleRequest(S,O);return}if(S.method!==`POST`){writePlain(O,400,`Missing MCP session. Initialize with POST /mcp first.`);return}if(t.size>=w){e.log?.warn?.({activeSessions:t.size,maxSessions:w},`MCP HTTP session cap reached`),writePlain(O,503,`Too many active MCP sessions`);return}let j=firstHeader(S.headers[MCP_CONNECTION_ID_HEADER]),F=validateAgentId(j)??void 0;j!==void 0&&F===void 0&&e.log?.warn?.({headerLength:j.length},`MCP HTTP forwarded connectionId header failed validation; falling back to randomUUID`);let L=new StreamableHTTPServerTransport({sessionIdGenerator:()=>randomUUID(),enableJsonResponse:!0,onsessioninitialized:async S=>{try{let w=createSessionServer(e,L,F);await w.server.connect(L),t.set(S,w),D(S,w),e.log?.info?.({sessionId:S},`MCP HTTP session initialized`)}catch(w){throw t.delete(S),e.log?.error?.({err:w,sessionId:S},`MCP HTTP session initialization failed`),w}}});L.onerror=t=>{e.log?.warn?.({err:t},`MCP HTTP transport error`)},L.onclose=()=>{let t=L.sessionId;if(!t){e.log?.info?.({sessionId:t,reason:`transport-closed`},`MCP HTTP session closed`);return}E(t,`transport-closed`).catch(S=>{e.log?.warn?.({err:S,sessionId:t},`MCP HTTP transport-close cleanup failed`)})},await L.handleRequest(S,O)},async close(){let e=[...t.entries()];await Promise.allSettled(e.map(([e])=>E(e,`handler-close`)))}}}const DEFAULT_KEEPALIVE_GRACE_MS=1e4,MAX_COLLAB_MESSAGE_BYTES=1024*1024,MCP_CORS_HEADERS={"Access-Control-Allow-Methods":`GET, POST, DELETE, OPTIONS`,"Access-Control-Allow-Headers":`Content-Type, Authorization, traceparent, tracestate, baggage, mcp-session-id, mcp-protocol-version`,"Access-Control-Max-Age":`86400`};function mountMcpAndApi(e){let{httpServer:t,hocuspocus:S,mcpHttpHandler:w,log:E,sessionManager:D,agentFocusBroadcaster:O,agentPresenceBroadcaster:k,contentAssetMiddleware:j,reactShellMiddleware:F}=e,L=e.keepaliveGraceMs??DEFAULT_KEEPALIVE_GRACE_MS,B=new import_websocket_server$1.default({noServer:!0,maxPayload:MAX_COLLAB_MESSAGE_BYTES});B.on(`error`,e=>{E.error({err:e},`WebSocketServer error`)});let H=new Map,q=new Set,J=!1;return t.on(`request`,(e,t)=>{let D=e.url?.split(`?`)[0];if(w!==void 0&&D===`/mcp`){let S=e.headers.origin,D=Array.isArray(e.headers[`mcp-session-id`])?e.headers[`mcp-session-id`][0]:e.headers[`mcp-session-id`];if(!isLoopbackAddress(e.socket.remoteAddress)){errorResponse(t,403,`urn:ok:error:loopback-required`,`Loopback access required.`,{handler:`mcp`});return}if(!isAllowedWorkspaceHostHeader(e.headers.host)){errorResponse(t,403,`urn:ok:error:host-not-allowed`,`Host header not allowed.`,{handler:`mcp`});return}if(S!==void 0&&!isAllowedApiOrigin(S)){errorResponse(t,403,`urn:ok:error:invalid-origin`,`Origin not allowed.`,{handler:`mcp`});return}S!==void 0&&(t.setHeader(`Access-Control-Allow-Origin`,S),t.setHeader(`Vary`,`Origin`));for(let[e,S]of Object.entries(MCP_CORS_HEADERS))t.setHeader(e,S);if(e.method===`OPTIONS`){t.writeHead(204),t.end();return}w.handle(e,t).catch(e=>{E.error({err:e,sessionId:D},`Unhandled MCP HTTP error`),!t.writableEnded&&!t.headersSent?errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`mcp`,cause:e}):t.writableEnded||t.end()});return}if(D?.startsWith(`/api/`)){S.hooks(`onRequest`,{request:e,response:t}).then(()=>{t.writableEnded||t.headersSent||errorResponse(t,404,`urn:ok:error:not-found`,`API endpoint not found.`,{handler:`mcp-mount`,detail:`No handler for ${e.method??`GET`} ${D}`})}).catch(e=>{E.error({err:e},`Unhandled onRequest error`),!t.writableEnded&&!t.headersSent?errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`mcp-mount`,cause:e}):t.writableEnded||t.end()});return}let O=(S,w,D)=>{if(S===void 0){D();return}try{S(e,t,()=>{t.writableEnded||t.headersSent||D()})}catch(e){E.error({err:e},`Unhandled ${w} middleware error`),!t.writableEnded&&!t.headersSent?errorResponse(t,500,`urn:ok:error:internal-server-error`,`Internal server error.`,{handler:`mcp-mount`,cause:e}):t.writableEnded||t.end()}},k=e=>O(j,`content-asset`,e),L=e=>O(F,`react-shell`,e),B=()=>{t.writableEnded||t.headersSent||errorResponse(t,404,`urn:ok:error:not-found`,`Not found.`,{handler:`mcp-mount`,detail:`No handler for ${D??`/`}`})};if(F!==void 0&&D?.startsWith(`/assets/`)){L(()=>k(B));return}if(j!==void 0||F!==void 0){k(()=>L(B));return}errorResponse(t,404,`urn:ok:error:not-found`,`Not found.`,{handler:`mcp-mount`,detail:`The React UI is served by \`ok ui\` (run \`ok ui\` and check \`ui.lock.port\`). No handler for ${D??`/`}`})}),t.on(`upgrade`,(e,t,w)=>{if(e.url?.startsWith(`/collab/keepalive`)){if(!isLoopbackAddress(e.socket.remoteAddress)||!isAllowedWorkspaceHostHeader(e.headers.host)){t.destroy();return}t.on(`error`,e=>{handleCollabSocketError(e)||E.error({err:e},`MCP keepalive socket error`)}),B.handleUpgrade(e,t,w,t=>{let S=parseKeepaliveConnectionId(e.url);if(S){let e=H.get(S);e!==void 0&&(clearTimeout(e),H.delete(S),E.info({connectionId:S},`[keepalive] reconnect during grace — timer cancelled`))}if(S&&k){let t=parseKeepaliveIdentity(e.url);if(t)try{let e=iconFromClientName(t.clientName),w=AGENT_ICON_COLORS[e]??colorFromSeed(t.colorSeed);k.setPresence(toBroadcasterKey(S),{displayName:t.displayName,icon:e,color:w,currentDoc:`(connected)`,mode:`idle`,ts:Date.now()})}catch(e){E.error({err:e,connectionId:S},`[keepalive] presence bootstrap failed`)}}let w=setInterval(()=>{try{t.ping()}catch{}},3e4);w.unref?.();let j=S?setInterval(()=>{k?.bumpPresenceTs(toBroadcasterKey(S))},3e3):null;j?.unref?.(),t.on(`close`,()=>{if(clearInterval(w),j!==null&&clearInterval(j),!S)return;let e=setTimeout(()=>{if(H.delete(S),J)return;let e=(async()=>{E.info({connectionId:S},`[keepalive] grace expired — cleaning up sessions`);try{await D?.closeAllForAgent(S)}catch(e){E.error({err:e,connectionId:S},`[keepalive] closeAllForAgent failed`)}try{O?.clearFocus(S)}catch(e){E.error({err:e,connectionId:S},`[keepalive] clearFocus failed`)}try{k?.clearPresence(toBroadcasterKey(S))}catch(e){E.error({err:e,connectionId:S},`[keepalive] clearPresence failed`)}})();q.add(e),e.finally(()=>q.delete(e))},L);e.unref?.(),H.set(S,e),E.info({connectionId:S,graceMs:L},`[keepalive] disconnected — grace timer started`)}),t.on(`error`,e=>{handleCollabSocketError(e)||E.error({err:e},`MCP keepalive WS error`),t.terminate()})});return}if(e.url?.startsWith(`/collab`)){t.on(`error`,e=>{handleCollabSocketError(e)||E.error({err:e},`Upgrade socket error`)}),B.handleUpgrade(e,t,w,t=>{let w=S.handleConnection(t,e),D=!1;t.on(`message`,e=>{if(D)return;let S=e.byteLength;if(S>MAX_COLLAB_MESSAGE_BYTES){D=!0,incrementCollabMessageTooLarge(),E.warn({event:`collab-message-too-large`,bytes:S,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket message rejected before Yjs processing`),t.close(1009,`Message Too Big`);return}w.handleMessage(new Uint8Array(e))}),t.on(`close`,(e,t)=>{w.handleClose({code:e,reason:t.toString()})}),t.on(`error`,e=>{if(e.code===`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`){incrementCollabMessageTooLarge(),E.warn({event:`collab-message-too-large`,limit:MAX_COLLAB_MESSAGE_BYTES},`Collab WebSocket frame rejected by ws maxPayload before Yjs processing`),t.terminate();return}handleCollabSocketError(e)||E.error({err:e},`WebSocket error`),t.terminate()})});return}t.destroy()}),{wss:B,shutdown:async()=>{if(!J){J=!0;for(let e of H.values())clearTimeout(e);H.clear(),q.size>0&&await Promise.allSettled(q)}}}}function parseKeepaliveConnectionId(e){if(!e)return null;try{return validateAgentId(new URL(e,`http://localhost`).searchParams.get(`connectionId`))}catch{return null}}const MAX_KEEPALIVE_IDENTITY_LEN=256;function sanitizeIdentityField(e){return e===null||e.length===0||e.length>MAX_KEEPALIVE_IDENTITY_LEN||/[-]/.test(e)?null:e}function parseKeepaliveIdentity(e){if(!e)return null;try{let t=new URL(e,`http://localhost`),S=sanitizeIdentityField(t.searchParams.get(`displayName`)),w=sanitizeIdentityField(t.searchParams.get(`clientName`)),E=sanitizeIdentityField(t.searchParams.get(`colorSeed`));return S===null||w===null||E===null?null:{displayName:S,clientName:w,colorSeed:E}}catch{return null}}const MISSING_OK_CONFIG_MESSAGE=`Open Knowledge config not found at .ok/config.yml. Run ok init to scaffold OK in this directory.`;var MissingOkConfigError=class extends Error{kind;projectDir;constructor(e,t,S){super(MISSING_OK_CONFIG_MESSAGE,S),this.name=`MissingOkConfigError`,this.kind=e,this.projectDir=t}};async function startConfigFileWatcher(e,t){let S=getLogger(`config-file-watcher`),{watch:w}=await import(`./chokidar-CblsKfnx.mjs`),E=dirname(e);try{tracedMkdirSync(E,{recursive:!0})}catch(e){e.code!==`EEXIST`&&S.warn({err:e,watchDir:E},`failed to create watch directory; watcher may be inert`)}let D=w(E,{ignoreInitial:!0,depth:0,usePolling:!0,interval:200,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},ignored:t=>t!==E&&t!==e});await new Promise(e=>{D.once(`ready`,e)});let O=null;try{O=readFileSync(e,`utf-8`)}catch{}let k=(w,E=!0)=>{if(w!==e)return;let D;try{D=readFileSync(w,`utf-8`)}catch(e){if(e.code===`ENOENT`){E&&S.debug({path:w},`config file disappeared between event and read; dropping`);return}S.warn({err:e,path:w},`config file read failed; dropping event`);return}if(D!==O){O=D;try{t(D)}catch(e){S.warn({err:e,path:w},`config file change handler threw`)}}},j=e=>k(e);D.on(`add`,j),D.on(`change`,j),D.on(`unlink`,t=>{t===e&&S.debug({path:t},`config file unlinked; Y.Text retained at current state`)}),D.on(`error`,t=>{S.warn({err:t,watchDir:E,absPath:e},`[config-file-watcher] chokidar error while watching ${e}`)});let F=0,L=setInterval(()=>{F++,k(e,!1),F>=20&&clearInterval(L)},500);L.unref?.();let B=!1;return async()=>{B||(B=!0,clearInterval(L),await D.close())}}async function startMultiPathConfigFileWatcher(e,t){if(e.length===0)throw Error(`startMultiPathConfigFileWatcher requires at least one absolute path`);let S=getLogger(`config-file-watcher`),{watch:w}=await import(`./chokidar-CblsKfnx.mjs`),E=new Set(e),D=Array.from(new Set(Array.from(E,e=>dirname(e))));for(let e of D)try{tracedMkdirSync(e,{recursive:!0})}catch(t){t.code!==`EEXIST`&&S.warn({err:t,dir:e},`failed to create watch directory; watcher may be inert`)}let O=w(D,{ignoreInitial:!0,depth:0,usePolling:!0,interval:200,awaitWriteFinish:{stabilityThreshold:100,pollInterval:50},ignored:e=>!E.has(e)&&!D.includes(e)});await new Promise(e=>{O.once(`ready`,e)});let k=new Map;for(let e of E)try{k.set(e,readFileSync(e,`utf-8`))}catch{k.set(e,null)}let j=(e,w=!0)=>{if(!E.has(e))return;let D;try{D=readFileSync(e,`utf-8`)}catch(t){if(t.code===`ENOENT`){w&&S.debug({path:e},`config file disappeared between event and read; dropping`);return}S.warn({err:t,path:e},`config file read failed; dropping event`);return}if(D!==k.get(e)){k.set(e,D);try{t(e,D)}catch(t){S.warn({err:t,path:e},`config file change handler threw`)}}},F=e=>j(e);O.on(`add`,F),O.on(`change`,F),O.on(`unlink`,e=>{E.has(e)&&S.debug({path:e},`config file unlinked; downstream state retained`)}),O.on(`error`,e=>{S.warn({err:e,watchDirs:D,paths:Array.from(E)},`[config-file-watcher] chokidar error in multi-path watcher`)});let L=0,B=setInterval(()=>{L++;for(let e of E)j(e,!1);L>=20&&clearInterval(B)},500);B.unref?.();let H=!1;return async()=>{H||(H=!0,clearInterval(B),await O.close())}}function entryMatchesDocName(e,t,S,w){let E=relative(w,join(S,e.file));return E.startsWith(`..`)?!1:stripDocExtension(E)===t}function createConflictLifecycleSeedExtension(e){let{getSyncEngine:t,projectDir:S,contentDir:w}=e;return{async afterLoadDocument({documentName:e,document:E}){if(!(isSystemDoc(e)||isConfigDoc(e)))try{let D=t();if(!D)return;let O=D.getConflicts();if(O.length===0||!O.some(t=>entryMatchesDocName(t,e,S,w)))return;let k=E.getMap(`lifecycle`);if(k.get(`status`)===`conflict`)return;k.set(`status`,`conflict`),k.set(`reason`,`conflict-markers`),console.warn(JSON.stringify({event:`lifecycle-seeded-on-load-from-conflict-store`,"doc.name":e}))}catch(t){console.warn(`[conflict-lifecycle-seed] failed to seed lifecycle on load (doc=${e}):`,t instanceof Error?t:String(t))}}}}const execFileAsync$1=promisify(execFile),BUILTIN_SKIP_DIRS=new Set([`node_modules`,`.venv`,`venv`,`env`,`__pycache__`,`vendor`,`dist`,`build`,`out`,`output`,`.next`,`.nuxt`,`.svelte-kit`,`.astro`,`.turbo`,`.cache`,`.parcel-cache`,`coverage`,`.git`,`.ok`,`.open-knowledge`,`.openknowledge`,`Library`,`Applications`,`.Trash`]),IGNORE_FILE_NAMES=[`.gitignore`,`.okignore`];function loadGitExcludeSources(e,t){let S=readGitCommonDirSync(e);if(S===null)return[];let w=[];appendExcludeFileIfExists(join(S,`info`,`exclude`),t,w,`info/exclude`);let E=resolveGlobalExcludesfileSync(e);return E&&appendExcludeFileIfExists(E,t,w,`global excludesfile`),w}async function loadGitExcludeSourcesAsync(e,t){let S=await readGitCommonDirAsync(e);if(S===null)return[];let w=[];await appendExcludeFileIfExistsAsync(join(S,`info`,`exclude`),t,w,`info/exclude`);let E=await resolveGlobalExcludesfileAsync(e);return E&&await appendExcludeFileIfExistsAsync(E,t,w,`global excludesfile`),w}function readGitCommonDirSync(e){let t=spawnSync(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf-8`,timeout:5e3});return t.status!==0||!t.stdout?null:resolve(e,t.stdout.trim())}async function readGitCommonDirAsync(e){try{let{stdout:t}=await execFileAsync$1(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf-8`,timeout:5e3});return t?resolve(e,t.trim()):null}catch{return null}}function resolveGlobalExcludesfileSync(e){let t=spawnSync(`git`,[`config`,`--get`,`--type=path`,`core.excludesfile`],{cwd:e,encoding:`utf-8`,timeout:5e3});if(t.status===0&&t.stdout){let e=t.stdout.trim();if(e)return e}return xdgGlobalIgnoreDefault()}async function resolveGlobalExcludesfileAsync(e){try{let{stdout:t}=await execFileAsync$1(`git`,[`config`,`--get`,`--type=path`,`core.excludesfile`],{cwd:e,encoding:`utf-8`,timeout:5e3}),S=t.trim();if(S)return S}catch{}return xdgGlobalIgnoreDefault()}function xdgGlobalIgnoreDefault(){let e=process.env.XDG_CONFIG_HOME?.trim();return join(e&&e.length>0?e:join(homedir(),`.config`),`git`,`ignore`)}function appendExcludeFileIfExists(e,t,S,w){if(existsSync(e))try{let w=readFileSync(e,`utf-8`);t.value+=w.length,S.push(...parseIgnorePatterns(w))}catch(t){console.warn(`[content-filter] Failed to read ${w} at ${e}:`,t)}}async function appendExcludeFileIfExistsAsync(e,t,S,w){if(existsSync(e))try{let w=await readFile$1(e,`utf-8`);t.value+=w.length,S.push(...parseIgnorePatterns(w))}catch(t){console.warn(`[content-filter] Failed to read ${w} at ${e}:`,t)}}function createContentFilter(e){let{projectDir:t,contentDir:S,onAfterRebuild:w}=e,E=relative(t,S),D=E.startsWith(`..`),O,k,j,F=0,L=0,B=0;function H(){let e=(0,import_ignore.default)();e.add(`.git`);let w=[],H=0,q=0;for(let S of IGNORE_FILE_NAMES){let E=join(t,S);if(existsSync(E))try{let t=readFileSync(E,`utf-8`);H+=t.length;let S=parseIgnorePatterns(t);w.push(...S),e.add(S)}catch(e){console.warn(`[content-filter] Failed to read ${S} at ${E}:`,e)}}if(E&&!D)for(let t of IGNORE_FILE_NAMES){let w=join(S,t);if(existsSync(w))try{let t=readFileSync(w,`utf-8`);H+=t.length,q++;let S=parseIgnorePatterns(t).map(e=>prefixPattern(e,E));e.add(S)}catch(e){console.warn(`[content-filter] Failed to read ${t} at ${w}:`,e)}}let J={value:H};q+=loadNestedIgnoreFiles(S,t,e,J),H=J.value;let Y=loadGitExcludeSources(t,J);H=J.value,Y.length>0&&(w.push(...Y),e.add(Y));let ee=w.filter(e=>e.length>0&&!e.startsWith(`!`)&&!e.startsWith(`#`));return O=e,k=w,j=ee,F=w.length,L=q,B=H,{patternCount:F,nestedFileCount:L,bytes:B}}H();let q=new Map;function J(e){if(D)return!1;let t=E?`${E}/${e}`:e;return O.ignores(t)}populateDirCount(S,``,J,q);function Y(e){let t=stripDocExtension(e);return isSystemDoc(t)||isConfigDoc(t)}function ee(e){for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;return D?!1:J(e)}return{isExcluded(e,t){if(Y(e))return!0;if(t?.bypassFilters)return!1;if(ee(e))return!0;if(isSupportedDocFile(e))return!1;let S=extname(e).slice(1).toLowerCase();if(ASSET_EXTENSIONS.has(S)){let t=dirname(e),S=t===`.`?``:t;if((q.get(S)??0)>0)return!1}return!0},isDirExcluded(e,t){if(t?.bypassFilters)return!1;for(let t of e.split(`/`))if(BUILTIN_SKIP_DIRS.has(t))return!0;if(D)return!1;let S=E?`${E}/${e}`:e;return O.ignores(S)||O.ignores(`${S}/`)},isPathIgnored(e,t){return Y(e)?!0:t?.bypassFilters?!1:ee(e)},getWatcherIgnoreGlobs(){return j},incrementMdDir(e){let t=e===`.`?``:e;q.set(t,(q.get(t)??0)+1)},decrementMdDir(e){let t=e===`.`?``:e,S=q.get(t)??0;S<=1?q.delete(t):q.set(t,S-1)},rebuildDirCount(){let e=new Map(q);q.clear();try{populateDirCount(S,``,J,q)}catch(t){for(let[t,S]of e)q.set(t,S);getLogger(`content-filter`).warn({err:t instanceof Error?t:Error(String(t))},`content-filter rebuildDirCount walk failed — retaining previous counts`)}},async rebuildIgnorePatterns(){let e=getLogger(`content-filter`),t=O,E=k,D=j,Y=F,ee=L,te=B,ne=Date.now();return withSpan(`config.ignore.rebuild`,{attributes:{}},async ae=>{try{let t=H();q.clear(),populateDirCount(S,``,J,q);let E=Date.now()-ne;if(ae.setAttributes({"ok.ignore.pattern_count":t.patternCount,"ok.ignore.nested_file_count":t.nestedFileCount,"ok.ignore.bytes":t.bytes}),e.info({patternCount:t.patternCount,nestedFileCount:t.nestedFileCount,bytes:t.bytes,durationMs:E},`content-filter rebuild succeeded`),w)try{w()}catch(t){e.warn({err:t instanceof Error?t:Error(String(t))},`content-filter onAfterRebuild callback threw — derived views may be stale`)}return{ok:!0,patternCount:t.patternCount,nestedFileCount:t.nestedFileCount,bytes:t.bytes,durationMs:E}}catch(w){O=t,k=E,j=D,F=Y,L=ee,B=te,q.clear();try{populateDirCount(S,``,J,q)}catch(t){e.warn({err:t instanceof Error?t:Error(String(t))},`content-filter rollback dirCount re-walk failed — sibling-asset counts may be stale until next rebuild`)}let H=w instanceof Error?w.message:String(w);return e.warn({err:w instanceof Error?w:Error(H)},`content-filter rebuild failed — rolled back to previous state`),{ok:!1,error:{message:H}}}})}}}function populateDirCount(e,t,S,w){let E;try{E=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[content-filter] Failed to read directory for dir-count: ${e}`,t);return}for(let D of E){let E=t?`${t}/${D.name}`:D.name;if(D.isDirectory()){if(BUILTIN_SKIP_DIRS.has(D.name)||S(E)||S(`${E}/`))continue;populateDirCount(join(e,D.name),E,S,w)}else D.isFile()&&isSupportedDocFile(D.name)&&!S(E)&&w.set(t,(w.get(t)??0)+1)}}function parseIgnorePatterns(e){return e.split(`
|
|
@@ -3366,4 +3366,4 @@ In headless mode, write the recap into the research article's "Further reading"
|
|
|
3366
3366
|
`),S=[],w=!1,E=``;for(let e of t){let t=/^\s{0,3}([`~]{3,})/.exec(e);if(t){w?RegExp(`^\\s{0,3}${E[0]==="`"?"`":`~`}{${E.length},}\\s*$`).test(e)&&(w=!1,E=``):(w=!0,E=t[1]);continue}if(w)continue;let D=stripInlineCodeSpans(e);for(TAG_VALUE_RE.lastIndex=0;;){let e=TAG_VALUE_RE.exec(D);if(e===null)break;let t=e[2];t&&S.push(t)}}return S}var TagIndex=class{contentDir;contentFilter;state=createEmptyState();constructor(e){this.contentDir=e.contentDir,this.contentFilter=e.contentFilter}updateDocumentFromMarkdown(e,t){if(!(isSystemDoc(e)||isConfigDoc(e)))try{let{frontmatter:S,body:w}=stripFrontmatter(t),E=extractFrontmatterTags(S?unwrapFrontmatterFences(S):``),D=extractInlineTagsFromBody(w),O=new Set([...E,...D]),k=new Set;for(let e of O)for(let t of expandTagToHierarchy(e))k.add(t);this.applyDocSnapshot(e,O,k)}catch(t){console.warn(`[tag-index] Failed to scan ${e} for tag extraction:`,t),this.deleteDocument(e)}}deleteDocument(e){if(isSystemDoc(e)||isConfigDoc(e))return;let t=this.state.byDoc.get(e);if(t){for(let S of t){let t=this.state.byTag.get(S);t&&(t.delete(e),t.size===0&&this.state.byTag.delete(S))}this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)}}renameDocument(e,t,S){this.deleteDocument(e),this.updateDocumentFromMarkdown(t,S)}getDocsForTag(e){let t=this.state.byTag.get(e);return t?[...t].sort((e,t)=>e.localeCompare(t)):[]}getDocsForTagWithMatches(e){let t=this.state.byTag.get(e);if(!t)return[];let S=[];for(let w of t){let t=this.state.byDocLiteral.get(w);if(!t)continue;let E=tagsMatchingPrefix(t,e);S.push({docName:w,matchingTags:[...E].sort((e,t)=>e.localeCompare(t))})}return S.sort((e,t)=>e.docName.localeCompare(t.docName))}getAllTags(){let e=[...this.state.byTag.entries()],t=e.map(([e])=>e),S=new Set;for(let e of t){let t=e.indexOf(`/`);t>0&&S.add(e.slice(0,t));let w=t;for(;w>0;)S.add(e.slice(0,w)),w=e.indexOf(`/`,w+1)}return e.map(([e,t])=>({name:e,count:t.size,isLeaf:!S.has(e)})).sort((e,t)=>e.name.localeCompare(t.name))}init(){if(this.state=createEmptyState(),!existsSync(this.contentDir))return;let e=this.listDocsWithPaths();for(let{docName:t,filePath:S}of e)try{let e=readFileSync(S,`utf-8`);this.updateDocumentFromMarkdown(t,e)}catch(e){console.warn(`[tag-index] Failed to read ${t} during init:`,e)}}applyDocSnapshot(e,t,S){let w=this.state.byDoc.get(e)??new Set;for(let t of w){if(S.has(t))continue;let w=this.state.byTag.get(t);w&&(w.delete(e),w.size===0&&this.state.byTag.delete(t))}for(let t of S){let S=this.state.byTag.get(t);S||(S=new Set,this.state.byTag.set(t,S)),S.add(e)}S.size===0?(this.state.byDoc.delete(e),this.state.byDocLiteral.delete(e)):(this.state.byDoc.set(e,S),this.state.byDocLiteral.set(e,t))}listDocsWithPaths(){let e=[];this.walkContentDir(this.contentDir,e),e.sort((e,t)=>e.docName===t.docName?t.filePath.localeCompare(e.filePath):e.docName.localeCompare(t.docName));let t=new Set;return e.filter(({docName:e})=>t.has(e)?!1:(t.add(e),!0))}walkContentDir(e,t){let S;try{S=readdirSync(e,{withFileTypes:!0})}catch(t){console.warn(`[tag-index] Failed to read directory ${e}:`,t);return}for(let w of S){let S=join(e,w.name);if(w.isDirectory()){let e=relative(this.contentDir,S);if(this.contentFilter&&e&&this.contentFilter.isDirExcluded(e))continue;this.walkContentDir(S,t);continue}if(!w.isFile()||!isSupportedDocFile(w.name))continue;let E=relative(this.contentDir,S);this.contentFilter?.isExcluded(E)||t.push({docName:stripDocExtension(E),filePath:S})}}};const PARK_SNAPSHOT_ORIGIN=(()=>{let e=Object.freeze({origin:`park-snapshot`,paired:!0});return Object.freeze({source:`local`,skipStoreHooks:!1,context:e})})();function createServer$1(e){let{contentDir:t,projectDir:S=t,quiet:w=!0,debounce:E=2e3,maxDebounce:D=1e4,gitEnabled:O=!0,commitDebounceMs:k=3e4,wipRef:j=`refs/wip/main`,configHomedirOverride:F,enableTestRoutes:L=!1,shadowRepo:B,contentRoot:H,destroyTimeoutMs:q=1e4,localOpCliArgs:J,skipStateManifestCheck:Y=!1}=e,ee=getLogger(`server`);function te(){let e=readConfigSafely({absPath:resolveConfigPath(`project-local`,S),sideline:!1,warn:e=>ee.warn({message:e},`[config] could not read project-local config`)}),t=e.value.autoSync?.enabled;return t==null?(e.valid||ee.warn({},`[config] project-local autoSync.enabled unavailable (config invalid) — falling back to project config`),readConfigSafely({absPath:resolveConfigPath(`project`,S),sideline:!1,warn:e=>ee.warn({message:e},`[config] could not read project config`)}).value.autoSync?.enabled===!0):t===!0}initTelemetry();let ne=randomUUID(),ae=getLocalDir(S);if(acquireServerLock(ae,{port:e.port??0,worktreeRoot:S,kind:e.lockKind??`interactive`,capabilities:[`http`,`ws`]}),!Y)try{assertCompatibleStateManifest({lockDir:ae,shadowRepoDir:resolveShadowDir(S)})}catch(e){throw releaseServerLock(ae),e}let oe=createBasenameIndex(),se=(e,t)=>oe.resolveEmbed(e,t),ce=(e,S)=>{let w=oe.resolveEmbed(e,S);if(!w&&e.includes(`/`)&&(w=e.replace(/^\.?\//,``)),!w)return null;let E=resolve(t,w),D=resolve(t);if(E!==D&&!E.startsWith(`${D}/`))return null;try{let e=statSync(E);return e.isFile()?e.size:null}catch{return null}},ue,de,fe,me,ge,_e,ve,ye=null,Ce=null,we=null,Te=null,De=new Set,je=!1,Me,Pe,Ie,Re=new Promise((e,t)=>{Pe=e,Ie=t});function ze(e){ye?.signal(e)}let Be=2e3,Ve=null;function Ue(){Ve!==null&&clearTimeout(Ve),Ve=setTimeout(()=>{Ve=null,de.saveToDisk().catch(e=>{console.warn(`[backlinks] Failed to persist debounced cache:`,e)})},2e3)}let We=new RecentlyRemovedDocs(void 0,{onEviction:()=>incrementRecentlyRemovedDocsEviction(),onSizeChange:e=>setRecentlyRemovedDocsSize(e)}),Ge=(e,t)=>{isSystemDoc(e)||isConfigDoc(e)||We.setRenamed(e,t)},Ke=e=>{if(!(isSystemDoc(e)||isConfigDoc(e))){if(We.peek(e)?.kind===`renamed`){console.info(JSON.stringify({event:`recently-removed-docs-unpaired-delete-suppressed`,docName:e,source:`watcher-delete`}));return}We.setDeleted(e)}},Xe=e=>{isSystemDoc(e)||isConfigDoc(e)||We.delete(e)};try{ue=createContentFilter({projectDir:S,contentDir:t,onAfterRebuild:()=>{de.rebuildFromDisk(getActiveBranch()).catch(e=>{getLogger(`server-factory`).warn({err:e},`[content-filter] backlink-index rebuild failed after onAfterRebuild`)});try{fe.init()}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] tag-index rebuild failed after onAfterRebuild`)}try{let{prunedFiles:e,prunedFolders:t}=reconcileFileIndexAfterFilterRebuild(Rt),S=e+t;S>0?getLogger(`server-factory`).info({pruned:S,prunedFiles:e,prunedFolders:t},`[content-filter] reconciled file indexes after onAfterRebuild`):getLogger(`server-factory`).debug({prunedFiles:e,prunedFolders:t},`[content-filter] file index reconcile completed after onAfterRebuild (no entries pruned; rescan may have added entries)`)}catch(e){getLogger(`server-factory`).warn({err:e},`[content-filter] file index reconcile failed after onAfterRebuild`)}}}),de=new BacklinkIndex({projectDir:S,contentDir:t,contentFilter:ue}),fe=new TagIndex({contentDir:t,contentFilter:ue});try{fe.init()}catch(e){console.warn(`[server-factory] tag-index init failed; continuing with empty index:`,e)}me={current:B},ge=createPersistenceExtension({contentDir:t,projectDir:S,gitEnabled:O,commitDebounceMs:k,wipRef:j,shadowRef:me,contentRoot:H,backlinkIndex:de,configHomedirOverride:F,getCurrentBranch:()=>zt?.getLastKnownBranch()??null,resolveEmbed:se,resolveSize:ce,getPrincipal:()=>Te,onAgentCommit:()=>ye?.signal(`session-activity`),onDiskFlush:(e,t)=>ye?.emitDiskAck(e,t),onConfigRejected:(e,t)=>ye?.emitConfigValidationRejected(e,t),mdManager:e.mdManager}),_e=new Hocuspocus({quiet:w,debounce:E,maxDebounce:D,extensions:[ge.extension]});let q=_e.shouldUnloadDocument.bind(_e);_e.shouldUnloadDocument=e=>{if(De.has(e)||je&&q(e))return!0;let t=e.name;return isSystemDoc(t)||isConfigDoc(t)||getReconciledBase(t)!==void 0||e.getXmlFragment(`default`).length!==0||e.getText(`source`).length!==0?!1:q(e)},Me=async e=>{De.add(e);try{await _e.unloadDocument(e)}finally{De.delete(e)}},ye=new CC1Broadcaster(_e),Ce=new AgentFocusBroadcaster(_e),we=new AgentPresenceBroadcaster(_e),ve=new AgentSessionManager(_e);let Y=createLiveDerivedIndexExtension({backlinkIndex:de,tagIndex:fe,signalChannel:ze});_e.configuration.extensions.push(Y),_e.configuration.extensions.push({__kind:`principal-auth`,async onAuthenticate(e){let t=e.token,S=parseHocuspocusAuthToken(t),w=S?.expectedServerInstanceId;if(typeof w==`string`&&w.length>0&&w!==ne)throw new HocuspocusAuthRejection(`server-instance-mismatch`,`server instance mismatch: client claimed ${w}, this server is ${ne}`);let E=S?.expectedBranch,D=getActiveBranch();if(typeof E==`string`&&E.length>0&&E!==D)throw new HocuspocusAuthRejection(`branch-mismatch`,`branch mismatch: client claimed ${E}, server is on ${D}`);if(!S)return;let O=e.context;typeof S.principalId==`string`&&(Te&&S.principalId===Te.id?O.principalId=Te.id:Te?console.warn(JSON.stringify({event:`principal-token-mismatch`,claimed:S.principalId,loaded:Te.id})):O.principalId=S.principalId),typeof S.tabSessionId==`string`&&(O.tabSessionId=S.tabSessionId),O.kind=`human`}}),_e.configuration.extensions.push({__kind:`config-doc-admission-guard`,async onAuthenticate(e){if(!isConfigDoc(e.documentName))return;let t=e.request,S=t.socket?.remoteAddress;if(S!==void 0&&!isLoopbackAddress(S))throw Error(`config-doc admission requires loopback peer (peer=${S}, doc=${e.documentName})`);let w=e.requestHeaders,E=(w&&typeof w.get==`function`?w.get(`host`):null)??t.headers?.host??void 0;if(!isAllowedWorkspaceHostHeader(E))throw Error(`config-doc admission requires loopback Host header (host=${E??`<absent>`}, doc=${e.documentName})`)}});let ee=resolve(t);function te(e){if(!isSafeDocName(e))return null;let t=resolve(ee,`${e}${getDocExtension(e)}`);return!t.startsWith(`${ee}/`)&&t!==ee?null:t}_e.configuration.extensions.push({__kind:`removal-redirect-guard`,async onAuthenticate(e){await runRemovalRedirectGuard(e.documentName,{recentlyRemovedDocs:We,resolveFilePath:te,fileExists:existsSync})}}),_e.configuration.extensions.push({__kind:`system-doc-broadcast-guard`,async beforeHandleMessage(e){if(e.documentName!==`__system__`)return;let t=new IncomingMessage(e.update);if(t.readVarString(),t.readVarUint()===MessageType.BroadcastStateless)throw Error(`inbound BroadcastStateless on ${SYSTEM_DOC_NAME} rejected — server-only channel`)}});let ae=createApiExtension({hocuspocus:_e,sessionManager:ve,contentDir:t,contentFilter:ue,serverInstanceId:ne,getFileIndex:()=>Rt?Rt.getFileIndex():new Map,getFolderIndex:()=>Rt?Rt.getFolderIndex():new Map,getAliasMap:()=>Rt?Rt.getAliasMap():new Map,rescanFiles:()=>Rt?.rescanFromDisk(),enableTestRoutes:L,shadowRef:me,flushGitCommit:()=>ge.flushPendingGitCommit(),flushContributors:()=>ge.flushContributors(),getCurrentBranch:()=>zt?.getLastKnownBranch()??null,getDiskAckSVs:()=>ye?.getLatestDiskAckSVsAsBase64()??{},contentRoot:H,backlinkIndex:de,tagIndex:fe,signalChannel:ze,agentFocusBroadcaster:Ce,agentPresenceBroadcaster:we,onAgentWrite:e.onAgentWrite,getSyncEngine:()=>Bt,localOpCliArgs:J,projectDir:S,resolveEmbed:se,getPrincipal:()=>Te,forceUnloadDocument:Me,ready:Re,recentlyRemovedDocs:We,serializeDoc:at});_e.configuration.extensions.push(ae),_e.configuration.extensions.push(createServerObserverExtension({mdManager,schema,shadowRef:me,contentRoot:H,getCurrentBranch:()=>zt?.getLastKnownBranch()??null,resolveEmbed:se,resolveSize:ce})),_e.configuration.extensions.push(createSyncHandshakeSpanExtension()),_e.configuration.extensions.push(createConflictLifecycleSeedExtension({getSyncEngine:()=>Bt,projectDir:S,contentDir:t}))}catch(e){throw releaseServerLock(ae),e}let $e=null,nt=new Map,rt=[];function it(e,t){let S=resolve(e,`rescue`),w=resolve(S,`${t}${getDocExtension(t)}`);return w.startsWith(`${S}/`)?w:null}function at(e){let t=_e.documents.get(e);if(!t)return null;let{frontmatter:S,body:w}=stripFrontmatter(t.getText(`source`).toString());return prependFrontmatter(S,w)}let st=(e,t)=>applyExternalChange(_e,e,t,se,ce);function vt(e){if(!isDocInConflict(e))return;let t=e.getMap(`lifecycle`);t.delete(`status`),t.delete(`reason`)}let Tt=e=>{if(!e)return;let t=`[[${e}]]`;for(let[S]of _e.documents){if(isSystemDoc(S)||isConfigDoc(S))continue;let w=_e.documents.get(S);if(!w)continue;let E=w.getText(`source`).toString();if(E.includes(t))try{w.transact(()=>{applyDiskContentToDoc(w,E,se,S)},FILE_WATCHER_ORIGIN)}catch(t){ee.error({err:t,docName:S,assetBasename:e},`[asset-event] failed to re-render ${S} for asset basename ${e}`)}}},Et=null,Dt=e=>{e&&(Et===null&&(Et=new Set,setImmediate(()=>{let e=Et;if(Et=null,e)try{for(let t of e)Tt(t)}catch(t){ee.error({err:t,basenames:[...e]},`[asset-event] dedup rerender pass crashed`)}})),Et.add(e))};function jt(e){switch(e.kind){case`rename`:return e.newDocName;case`asset-create`:case`asset-delete`:case`folder-create`:case`folder-delete`:return e.relativePath;case`create`:case`update`:case`delete`:case`conflict`:return e.docName;default:return assertNeverDiskEvent(e)}}async function Mt(e){try{switch(e.kind){case`create`:ee.info({docName:e.docName},`[reconcile] create: ${e.docName}`),de.updateDocumentFromMarkdown(e.docName,e.content),Ue(),fe.updateDocumentFromMarkdown(e.docName,e.content),ze(`files`),ze(`backlinks`),ze(`graph`),ze(`tags`),Xe(e.docName);break;case`update`:{let{docName:t,content:S}=e,w=_e.documents.get(t);if(!w){de.updateDocumentFromMarkdown(t,S),Ue(),fe.updateDocumentFromMarkdown(t,S),ze(`backlinks`),ze(`graph`),ze(`tags`);return}let E=getReconciledBase(t)??``,D=at(t)??E,O=reconcile({docName:t,base:E,ours:D,theirs:S}),k=contentHash(E).slice(0,6),j=contentHash(D).slice(0,6),F=contentHash(S).slice(0,6);switch(ee.info({docName:t,base:k,ours:j,theirs:F,result:O.kind},`[reconcile] ${t} base=${k} ours=${j} theirs=${F} result=${O.kind}`),O.kind){case`noop`:vt(w),de.updateDocumentFromMarkdown(t,S),Ue(),fe.updateDocumentFromMarkdown(t,S),ze(`backlinks`),ze(`graph`),ze(`tags`);break;case`clean`:try{st(t,O.newContent),setReconciledBase(t,O.newContent),incrementReconcile(),vt(w),de.updateDocumentFromMarkdown(t,S),Ue(),fe.updateDocumentFromMarkdown(t,S),ze(`backlinks`),ze(`graph`),ze(`tags`)}catch(e){ee.error({err:e,docName:t},`[reconcile] failed to apply clean content to Y.Doc for ${t}`),setReconciledBase(t,S),vt(w)}break;case`merged`:try{st(t,O.newContent),setReconciledBase(t,O.newContent),incrementReconcile(),vt(w),de.updateDocumentFromMarkdown(t,S),Ue(),fe.updateDocumentFromMarkdown(t,S),ze(`backlinks`),ze(`graph`),ze(`tags`)}catch(e){ee.error({err:e,docName:t},`[reconcile] failed to apply merged content to Y.Doc for ${t}`),setReconciledBase(t,S),vt(w)}break;case`conflicts`:try{st(t,O.newContent),setReconciledBase(t,O.newContent),incrementReconcile(),incrementConflict(),de.updateDocumentFromMarkdown(t,S),Ue(),fe.updateDocumentFromMarkdown(t,S),ze(`backlinks`),ze(`graph`),ze(`tags`)}catch(e){ee.error({err:e,docName:t},`[reconcile] failed to apply conflict content to Y.Doc for ${t}`),setReconciledBase(t,S)}{let e=w.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,`merged-with-markers`)}break;case`refused`:{incrementConflict();let e=w.getMap(`lifecycle`);e.set(`status`,`conflict`),e.set(`reason`,O.reason);break}}break}case`delete`:{let{docName:t}=e,S=_e.documents.get(t);if(!S){de.deleteDocument(t),Ue(),fe.deleteDocument(t),ze(`files`),ze(`backlinks`),ze(`graph`),ze(`tags`),Ke(t),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:t,kind:`deleted`,source:`watcher-delete`}));return}let w=getReconciledBase(t)??``,E=at(t)??``,D=E!==w;if(D&&me.current){let e=me.current,S=zt?.getLastKnownBranch()??`main`;queueMicrotask(()=>{saveInMemoryCheckpoint(e,H??``,{kind:`external-change-rescue`,docName:t,contents:E,label:`External change recovered @ ${new Date().toISOString()}`,branch:S,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),ee.info({docName:t},`[reconcile] rescue checkpoint saved (delete): ${t}`)}).catch(e=>{ee.error({docName:t,err:e},`[reconcile] rescue checkpoint write failed: ${t}`)})})}S.getMap(`lifecycle`).set(`status`,`deleted-upstream`),deleteReconciledBase(t),de.deleteDocument(t),Ue(),fe.deleteDocument(t),ee.info({docName:t,isDirty:D},`[reconcile] delete: ${t} (dirty=${D})`),_e.closeConnections(t),await Me(S),ze(`files`),ze(`backlinks`),ze(`graph`),ze(`tags`),Ke(t),console.info(JSON.stringify({event:`recently-removed-docs-populate`,docName:t,kind:`deleted`,source:`watcher-delete`}));break}case`rename`:{let{oldDocName:t,newDocName:S,content:w}=e,E=_e.documents.get(t);if(deleteReconciledBase(t),setReconciledBase(S,w),de.renameDocument(t,S,w),Ue(),fe.renameDocument(t,S,w),E){let e=E.getMap(`lifecycle`);e.set(`status`,`renamed`),e.set(`newPath`,S)}ee.info({oldDocName:t,newDocName:S},`[reconcile] rename: ${t} → ${S}`),ze(`files`),ze(`backlinks`),ze(`graph`),ze(`tags`),Ge(t,S),console.info(JSON.stringify({event:`recently-removed-docs-populate`,from:t,to:S,kind:`renamed`,source:`watcher-rename`}));break}case`conflict`:{let{docName:t}=e,S=_e.documents.get(t);if(!S)return;let w=at(t);w===null?ee.warn({docName:t},`[reconcile] case 'conflict': serializeDoc returned null for ${t}; reconciledBase snapshot skipped — post-resolution reconcile may degrade to 3-way merge`):setReconciledBase(t,w);let E=S.getMap(`lifecycle`);E.set(`status`,`conflict`),E.set(`reason`,`conflict-markers`),ee.info({docName:t},`[reconcile] conflict markers detected: ${t}`);break}case`asset-create`:oe.add(e.relativePath),ze(`files`),Dt(basename(e.relativePath));break;case`asset-delete`:oe.remove(e.relativePath),ze(`files`),Dt(basename(e.relativePath));break;case`folder-create`:case`folder-delete`:ze(`files`);break;default:assertNeverDiskEvent(e)}}catch(t){let S=jt(e);ee.error({err:t,kind:e.kind,label:S},`[reconcile] failed to handle ${e.kind} for ${S}`)}}let Ft=[];async function It(e){if(isBatchInProgress()){Ft.push(e);return}await Mt(e)}async function Lt(){let e=Ft.splice(0,Ft.length);for(let t of e)await Mt(t)}let Rt=null,zt=null,Bt=null,Vt=null;async function Ht(e){if(_e.documents.size===0)return;let t=!1,S=new Promise(e=>{_e.configuration.extensions.push({async afterUnloadDocument({instance:S}){!t&&S.getDocumentsCount()===0&&(t=!0,e())}})}),w=Array.from(_e.documents.keys());_e.closeConnections(),_e.flushPendingStores();for(let e of _e.documents.values())e.getConnectionsCount()===0&&_e.unloadDocument(e).catch(t=>{console.warn(JSON.stringify({event:`ok-shutdown-unload-document-failed`,docName:e.name,reason:t instanceof Error?t.message:String(t)}))});let E,D=new Promise((S,D)=>{E=setTimeout(()=>{t=!0;let S=Array.from(_e.documents.keys()),E=[],O=[];if(me.current){for(let e of S)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let t=at(e);if(t===null){ee.warn({docName:e},`[rescue] skipping ${e} — document dropped from map mid-rescue`),O.push(e);continue}let S=it(me.current.gitDir,e);if(!S){ee.warn({docName:e,gitDir:me.current.gitDir},`[rescue] path-traversal guard rejected docName: ${e}`),O.push(e);continue}mkdirSync(dirname(S),{recursive:!0}),writeFileSync(S,t,`utf-8`),incrementRescueBuffer(),E.push(e),ee.info({docName:e},`[rescue] rescue buffer saved on flush timeout: ${e}`)}catch(t){O.push(e),ee.error({err:t,docName:e},`[rescue] failed to write rescue buffer for ${e}`)}}else ee.warn({stillLoadedCount:S.length},`[rescue] shadow repo unavailable at flush timeout — ${S.length} doc(s) will be lost: [${S.join(`, `)}]`),O.push(...S);let k=E.length>0||O.length>0?` — rescued [${E.join(`, `)}]${O.length>0?`, lost [${O.join(`, `)}]`:``}`:``;D(Error(`flushAllStoresAndWait timeout after ${e}ms — ${S.length}/${w.length} docs did not unload: [${S.join(`, `)}]${k}`))},e)});try{await Promise.race([S,D])}finally{E!==void 0&&clearTimeout(E)}}async function Ut(){return Vt||(Vt=(async()=>{let e=Date.now(),t=[];je=!0,Ve!==null&&(clearTimeout(Ve),Ve=null);let w,E=await Promise.race([Re.then(()=>`completed`,e=>(ee.debug({err:e},`[server] init incomplete during shutdown`),`failed`)),new Promise(e=>{w=setTimeout(()=>e(`timeout`),5e3)})]);w!==void 0&&clearTimeout(w),E===`timeout`&&ee.warn({},`[server] init did not complete within 5s during shutdown`);let D=_e.documents.size;try{try{try{zt&&=(await zt.unsubscribe(),null),Rt&&=(await Rt.unsubscribe(),null);for(let{docName:e,cleanup:t}of rt)try{await t()}catch(t){ee.warn({err:t,docName:e},`[server] failed to stop config-file-watcher for ${e}`)}rt.length=0}catch(e){t.push({phase:`watcher-unsubscribe`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-1 watcher unsubscribe failed`)}try{ye?.destroy(),we?.destroy(),$e&&=(await $e.disconnect(),null);for(let[e,t]of nt)try{await t.disconnect()}catch(t){ee.warn({err:t,docName:e},`[server] failed to disconnect ${e} during shutdown`)}nt.clear()}catch(e){t.push({phase:`cc1-teardown`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-1b CC1 teardown failed`)}try{await ve.closeAll()}catch(e){t.push({phase:`agent-session-drain`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-2 agent session drain failed`)}try{await Ht(q)}catch(e){t.push({phase:`flush-all-stores`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-3 flush failed`)}let e;try{await Promise.race([(async()=>{await ge.flushPendingGitCommit(),await ge.waitForPendingCommits()})(),new Promise((t,S)=>{e=setTimeout(()=>S(Error(`L2 git flush timeout`)),q)})])}catch(e){t.push({phase:`git-commit-flush`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-4 git commit flush failed`)}finally{e!==void 0&&clearTimeout(e)}try{Bt&&=(await Bt.destroy(),null)}catch(e){t.push({phase:`sync-engine-stop`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown sync-engine-stop failed`)}}finally{if(me.current){try{let e=(await esm_default({baseDir:S,timeout:{block:5e3}}).revparse(`HEAD`)).trim();e&&writeFileSync(resolve(me.current.gitDir,`last-known-head`),e,`utf-8`)}catch{}try{destroyShadowRepo(me.current)}catch(e){t.push({phase:`shadow-repo-release`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-5 destroyShadowRepo failed`)}}let w=Date.now()-e;t.length===0?ee.info({documentCount:D,durationMs:w},`[server] shutdown flushed ${D} documents in ${w}ms`):ee.warn({documentCount:D,durationMs:w,phaseErrors:t},`[server] shutdown flushed ${D} documents in ${w}ms with ${t.length} phase error(s)`)}}finally{try{releaseServerLock(ae)}catch(e){t.push({phase:`server-lock-release`,error:e instanceof Error?e.message:String(e)}),ee.error({err:e},`[server] shutdown phase-6 releaseServerLock failed`)}try{await shutdownTelemetry()}catch(e){t.push({phase:`telemetry-shutdown`,error:e instanceof Error?e.message:String(e)})}}})(),Vt)}let Wt=[];async function Kt(){try{Te=await loadPrincipal(S),ee.info({principalId:Te.id},`[server] principal loaded`)}catch(e){ee.warn({err:e},`[server] principal load failed — browser writes will use SERVICE_WRITER`)}if(!me.current)try{me.current=await initShadowRepo(S),ee.info({gitDir:me.current.gitDir},`[server] history repo initialized at ${me.current.gitDir}`)}catch(e){ee.error({err:e},`[server] history repo init failed`),Wt.push(`shadow-repo`)}if(me.current){let e=null;try{e=loadRenameLogIndex(me.current.gitDir),sweepLazyPopOrphans(me.current.gitDir,e),setRenameLogIndex(me.current.gitDir,e),ee.info({entries:e.byTo.size},`[server] rename log loaded (${e.byTo.size} entries)`)}catch(e){ee.warn({err:e},`[rename-log] boot-time load/sweep failed; rename history unavailable`)}if(e){let t=1e4;try{await Promise.race([gcRenameLog(me.current,e,{rebuild:!0}),new Promise((e,S)=>setTimeout(()=>S(Error(`boot-time GC exceeded ${t}ms`)),t))])}catch(e){ee.warn({err:e},`[rename-log] boot-time GC/rebuild failed; index loaded without GC`)}}}if(me.current)try{await shadowGit(me.current).raw(`rev-parse`,`--git-dir`)}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`not a git repository`)||t.includes(`invalid object`)){ee.warn({},`[server] history repo appears corrupted — reinitializing`);try{me.current=await initShadowRepo(S)}catch(e){ee.error({err:e},`[server] history repo reinit failed`),me.current=void 0,Wt.includes(`shadow-repo`)||Wt.push(`shadow-repo`)}}else ee.error({err:e},`[server] history repo check failed (transient?)`)}if(me.current)try{let e=resolve(me.current.gitDir,`last-known-head`),t=null;try{t=readFileSync(e,`utf-8`).trim()||null}catch{}let w=null;try{w=(await esm_default({baseDir:S,timeout:{block:1e4}}).revparse(`HEAD`)).trim()||null}catch{}if(w!==null){if(w!==t){let e=`main`;try{let t=(await esm_default({baseDir:S,timeout:{block:1e4}}).raw(`rev-parse`,`--abbrev-ref`,`HEAD`)).trim();t&&t!==`HEAD`&&(e=t)}catch{}ee.info({lastKnownHead:t,currentHead:w,branch:e},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${w}, action=import`);try{await commitUpstreamImport(me.current,H??``,t,w,e),incrementUpstreamImport()}catch(e){ee.warn({err:e},`[head-drift] commitUpstreamImport failed — continuing`)}}else ee.info({currentHead:w},`[head-drift] lastKnownHead=${t??`null`}, currentHead=${w}, action=noop`);try{writeFileSync(e,w,`utf-8`)}catch(e){ee.warn({err:e},`[head-drift] failed to write last-known-head`)}}}catch(e){ee.warn({err:e},`[head-drift] check failed — continuing`)}try{let e=recoverPendingManagedRename(t,S);if(e.recovered&&e.journal){let t=e.journal.version===2?e.journal.fromPath:e.journal.sourceDocName,S=e.journal.version===2?e.journal.toPath:e.journal.destinationDocName;ee.warn({journalVersion:e.journal.version,fromPath:t,toPath:S,restoredDocNames:e.restoredDocNames},`[managed-rename] recovered pending rename ${t} -> ${S}`)}}catch(e){ee.error({err:e},`[server] managed rename recovery failed`),Wt.push(`managed-rename-recovery`)}try{let e=cleanupOrphanUploadTempfiles(S);(e.deleted>0||e.errors>0)&&ee.info({scanned:e.scanned,deleted:e.deleted,errors:e.errors},`[upload-tempfile-sweep] swept ${e.deleted} orphan tempfile(s)`)}catch(e){ee.error({err:e},`[server] upload-tempfile sweep failed`),Wt.push(`upload-tempfile-sweep`)}try{$e=await _e.openDirectConnection(SYSTEM_DOC_NAME),ye?.emitServerInfo(ne,getActiveBranch())}catch(e){ee.error({err:e},`[server] failed to open __system__ direct connection — CC1 push disabled`),Wt.push(`cc1-push`)}for(let e of CONFIG_DOC_NAMES)try{let t=await _e.openDirectConnection(e);nt.set(e,t)}catch(t){ee.error({err:t,docName:e},`[server] failed to open ${e} direct connection — config bind degraded`),Wt.push(`config-doc:${e}`)}let w=new Map([[CONFIG_DOC_NAME_PROJECT,resolveConfigPath(`project`,S)],[CONFIG_DOC_NAME_PROJECT_LOCAL,resolveConfigPath(`project-local`,S)],[CONFIG_DOC_NAME_USER,resolveConfigPath(`user`,S,F)]]);for(let e of CONFIG_DOC_NAMES){let t=w.get(e);if(t)try{ee.info({docName:e,path:t},`[config-file-watcher] starting`);let S=await startConfigFileWatcher(t,t=>{let S=_e.documents.get(e);ee.info({docName:e,hasDocument:S!==void 0,contentLength:t.length},`[config-file-watcher] file changed`);let w=applyExternalConfigChange(S??null,e,t,ge.configPersistenceCtx);if(ee.info({docName:e,outcome:w},`[config-file-watcher] applyExternalConfigChange outcome`),e===`__config__/project`||e===`__local__/project`){let e=te();Bt?.setEnabled(e).catch(t=>{ee.warn({err:t,enabled:e},`[sync] failed to apply autoSync.enabled from config`)})}});rt.push({docName:e,cleanup:S}),ee.info({docName:e,path:t},`[config-file-watcher] started`)}catch(S){ee.warn({err:S,docName:e,path:t},`[config-file-watcher] failed to start for ${e}`),Wt.push(`config-file-watcher:${e}`)}}try{let e=resolve(t,`.okignore`),w=resolve(S,`.gitignore`),E=null;try{let e=spawnSync(`git`,[`rev-parse`,`--git-common-dir`],{cwd:S,encoding:`utf-8`,timeout:5e3});if(e.status===0&&e.stdout){let t=join(resolve(S,e.stdout.trim()),`info`,`exclude`);existsSync(dirname(t))&&(E=t)}}catch{}let D=E?[e,w,E]:[e,w],O=ee;O.info({okignorePath:e,gitignorePath:w,gitInfoExcludePath:E},`[ignore-watcher] starting multi-path watcher for .okignore + .gitignore (+ .git/info/exclude when present)`);let k=await startMultiPathConfigFileWatcher(D,(t,w)=>{(async()=>{if(t===e)try{let e=applyExternalConfigChange(_e.documents.get(`__config__/okignore`)??null,CONFIG_DOC_NAME_OKIGNORE,w,ge.configPersistenceCtx);O.info({docName:CONFIG_DOC_NAME_OKIGNORE,outcome:e},`[ignore-watcher] applyExternalConfigChange outcome`)}catch(e){O.error({err:e,changedPath:relative(S,t)},`[ignore-watcher] applyExternalConfigChange failed; rebuild proceeds independently`)}let E=await ue.rebuildIgnorePatterns();if(E.ok)O.info({changedPath:relative(S,t),patternCount:E.patternCount,nestedFileCount:E.nestedFileCount,durationMs:E.durationMs},`[ignore-watcher] rebuild succeeded — broadcasting files channel`),ye?.signal(`files`);else{let e=relative(S,t)||`.`;O.warn({changedPath:e,error:E.error.message},`[ignore-watcher] rebuild failed — emitting config-ignore-nested-error`),ye?.emitConfigIgnoreNestedError(e,E.error.message)}})().catch(e=>{O.error({err:e,changedPath:relative(S,t)||`.`},`[ignore-watcher] handler threw`)})});rt.push({docName:`__ignore-files__`,cleanup:k}),O.info({okignorePath:e,gitignorePath:w},`[ignore-watcher] multi-path watcher started`)}catch(e){ee.warn({err:e,projectDir:S,contentDir:t},`[ignore-watcher] failed to start multi-path watcher`),Wt.push(`ignore-files-watcher`)}let E=resolveGitDir(S),D=E?readBranchFromHead(E)??`main`:`main`;switchReconciledBaseScope(D),de.switchBranch(D);try{{let e=getActiveBranch();try{if(await de.loadFromDisk(e)){let t=await de.reconcileWithDisk(e);(t.added>0||t.updated>0||t.deleted>0)&&ee.info(t,`[backlinks] startup reconcile: offline changes applied`)}else await de.rebuildFromDisk(e);de.saveToDisk().catch(t=>{console.warn(`[backlinks] Failed to persist startup cache for ${e}:`,t)})}catch(t){ee.error({err:t,branch:e},`[backlinks] startup init failed; index will populate incrementally via watcher`)}}Rt=await startWatcher(t,It,ue),fe.init();let e=0;try{seedBasenameIndex({contentDir:t,contentFilter:ue,basenameIndex:oe,onSkip:(t,S,w)=>{e++,ee.warn({reason:t,code:S,path:w},`[basename-index] skipped entry during seed (${t}${S?` ${S}`:``})`)}}),e>0&&(ee.warn({count:e},`[basename-index] startup seed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve`),Wt.push(`basename-index-partial`))}catch(e){ee.error({err:e},`[basename-index] startup seed failed`),Wt.push(`basename-index`)}}catch(e){ee.error({err:e},`[server] disk bridge watcher failed to start`),Wt.push(`file-watcher`)}try{zt=await startHeadWatcher(S,async({trigger:e})=>{if(ee.info({trigger:e},`[batch] begin trigger=${e}`),incrementBatch(),_e.flushPendingStores(),await ge.flushPendingGitCommit(),setBatchInProgress(!0),me.current){let e=getActiveBranch(),t=resolveGitDir(S),w=t?readBranchFromHead(t)??e:e,E=[];for(let[e,t]of _e.documents){if(isSystemDoc(e)||isConfigDoc(e))continue;let S=null;if(t.transact(()=>{S=at(e)},PARK_SNAPSHOT_ORIGIN),S===null)continue;let w=getReconciledBase(e)??S;E.push({docName:e,markdown:S,diskSnapshot:w})}if(E.length>0)try{let t=await parkBranch(me.current,e,SERVICE_WRITER.id,E,w);t&&(incrementPark(),ee.info({count:E.length,branch:e,sha:t.slice(0,8)},`[history] parked ${E.length} docs on ${e} → ${t.slice(0,8)}`))}catch(e){ee.error({err:e},`[shadow] park failed`)}}},async e=>{let S=Ft.length,w=e.newBranch??`main`;if(ee.info({kind:e.batchKind,headMoved:e.headMoved,docs:S,timeout:!!e.timeout},`[batch] end kind=${e.batchKind} headMoved=${e.headMoved} docs=${S}${e.timeout?` timeout`:``}`),e.batchKind===`within-branch`){if(setBatchInProgress(!1),await Lt(),await ge.flushDeferredStores(`within-branch`),Bt!==null)try{await Bt.reconcileConflictsFromGit()}catch(e){ee.warn({err:e},`[head-watcher] sync engine conflict reconcile failed`)}}else{incrementBranchSwitch(),Ft.splice(0,Ft.length),switchReconciledBaseScope(w),Ve!==null&&(clearTimeout(Ve),Ve=null),de.switchBranch(w),ue.rebuildDirCount();try{let e=0;oe.clear(),seedBasenameIndex({contentDir:t,contentFilter:ue,basenameIndex:oe,onSkip:(t,S,E)=>{e++,ee.warn({reason:t,code:S,path:E,branch:w},`[basename-index] skipped entry during branch-switch reseed (${t}${S?` ${S}`:``})`)}}),e>0&&(ee.warn({count:e,branch:w},`[basename-index] branch-switch reseed completed with ${e} skipped entries — embeds under inaccessible subtrees will not resolve on this branch`),Wt.includes(`basename-index-partial`)||Wt.push(`basename-index-partial`))}catch(e){ee.error({err:e,branch:w},`[basename-index] branch-switch reseed failed`)}for(let[e,S]of _e.documents)if(!(isSystemDoc(e)||isConfigDoc(e)))try{let E=safeContentPath(e,t);if(!existsSync(E)){let t=getReconciledBase(e)??``,E=at(e)??``;if(E!==t&&me.current){let t=me.current;queueMicrotask(()=>{saveInMemoryCheckpoint(t,H??``,{kind:`external-change-rescue`,docName:e,contents:E,label:`External change recovered @ ${new Date().toISOString()}`,branch:w,metadata:{incomingDiskSha:``}}).then(()=>{incrementRescueBuffer(),ee.info({docName:e},`[reconcile] rescue checkpoint saved on branch switch: ${e}`)}).catch(t=>{ee.error({docName:e,err:t},`[reconcile] rescue checkpoint write failed: ${e}`)})})}S.getMap(`lifecycle`).set(`status`,`deleted-upstream`),ee.info({docName:e,branch:w},`[branch-switch] tombstone: ${e} (not on ${w})`);continue}let D=readFileSync(E,`utf-8`);st(e,D),setReconciledBase(e,D),ee.info({docName:e},`[branch-switch] reset: ${e}`)}catch(t){ee.error({err:t,docName:e},`[branch-switch] failed to reset ${e}`)}ee.info({branch:w,docCount:_e.documents.size},`[branch-switch] loaded branch ${w} (${_e.documents.size} docs)`);try{if(await de.loadFromDisk(w)){let e=await de.reconcileWithDisk(w);(e.added>0||e.updated>0||e.deleted>0)&&ee.info(e,`[backlinks] branch-switch reconcile for ${w}`)}else await de.rebuildFromDisk(w);de.saveToDisk(w).catch(e=>{console.warn(`[backlinks] Failed to persist branch cache for ${w}:`,e)})}catch(e){ee.error({err:e,branch:w},`[backlinks] branch-switch rebuild failed; backlinks may be stale`)}if(fe.init(),me.current&&e.batchKind===`cross-branch`){let e=0;for(let[t]of _e.documents)if(!(isSystemDoc(t)||isConfigDoc(t)))try{let S=await readParkedState(me.current,w,SERVICE_WRITER.id,t);if(!S||S.markdown===S.diskSnapshot)continue;let E=getReconciledBase(t);if(!E)continue;let D=reconcile({docName:t,base:S.diskSnapshot,ours:S.markdown,theirs:E});switch(D.kind){case`merged`:case`clean`:st(t,D.newContent),setReconciledBase(t,D.newContent),e++;break;case`conflicts`:st(t,D.newContent),setReconciledBase(t,D.newContent),incrementConflict(),e++;{let e=_e.documents.get(t);if(e){let t=e.getMap(`lifecycle`);t.set(`status`,`conflict`),t.set(`reason`,`merged-with-markers`)}}break;case`noop`:case`refused`:break}}catch(e){ee.error({err:e,docName:t},`[branch-switch] restore WIP failed for ${t}`)}e>0&&ee.info({count:e,branch:w},`[branch-switch] restored ${e} parked docs on ${w}`)}if(e.oldBranch?.startsWith(`detached-`)&&me.current)try{let t=shadowGit(me.current),S=(await t.raw(`for-each-ref`,`refs/wip/${e.oldBranch}/`,`--format=%(refname)`)).trim();if(S){for(let e of S.split(`
|
|
3367
3367
|
`))e&&await t.raw(`update-ref`,`-d`,e);ee.info({context:e.oldBranch},`[branch-switch] cleaned up detached context ${e.oldBranch}`)}}catch(e){ee.error({err:e},`[branch-switch] detached cleanup failed`)}setBatchInProgress(!1),await ge.flushDeferredStores(`discard-stale`),ye?.emitBranchSwitched(w)}if(e.headMoved&&e.newHead&&me.current&&S>0){let t=H??`.`;try{let S=await commitUpstreamImport(me.current,t,e.oldHead,e.newHead,w);incrementUpstreamImport(),ee.info({oldHead:e.oldHead?.slice(0,8)??`null`,newHead:e.newHead.slice(0,8),sha:S.slice(0,8)},`[history] upstream-import from ${e.oldHead?.slice(0,8)??`null`}..${e.newHead.slice(0,8)} → ${S.slice(0,8)}`)}catch(e){ee.error({err:e},`[shadow] upstream-import failed`)}}})}catch(e){ee.error({err:e},`[server] HEAD watcher failed to start`),Wt.push(`head-watcher`)}function O(e){for(let w of e)try{let e=relative(t,join(S,w));if(e.startsWith(`..`))continue;let E=stripDocExtension(e),D=_e.documents.get(E);if(!D)continue;let O=at(E);O===null?ee.warn({docName:E,file:w},`[sync] content conflict: serializeDoc returned null; reconciledBase snapshot skipped`):setReconciledBase(E,O);let k=D.getMap(`lifecycle`);k.set(`status`,`conflict`),k.set(`reason`,`sync-merge-conflict`),ee.info({docName:E,file:w},`[sync] marked loaded content conflict`)}catch(e){ee.warn({err:e,file:w},`[sync] failed to mark loaded content conflict`)}}let k=J?.[0]??`open-knowledge`,j=[`-c`,`credential.helper=!${J&&J.length>1?J.join(` `):k} auth git-credential`];try{Bt=new SyncEngine({projectDir:S,contentDir:t,contentFilter:ue,contentRoot:H,syncEnabled:te(),credentialArgs:j,cc1Broadcaster:ye,detectGh:e.detectGh,tokenStore:e.tokenStore,checkPushPermissionFn:e.checkPushPermissionFn,setBatchInProgress:e=>{setBatchInProgress(e),e||ge.flushDeferredStores(`within-branch`).catch(e=>{ee.error({err:e},`[persistence] deferred store drain failed after sync batch`)})},onStateChange:e=>{ee.info({state:e},`[sync] state → ${e}`)},onContentConflictsDetected:O,onAutoDisable:async e=>{ee.warn({reason:e},`[sync] auto-disabled — persisting to project-local config`);let t=await writeConfigPatch({cwd:S,scope:`project-local`,patch:{autoSync:{enabled:!1}}});t.ok||ee.error({result:t,reason:e,humanError:humanFormat(t.error),configPath:resolveConfigPath(`project-local`,S)},`[sync] failed to persist auto-disable — next restart WILL re-enable sync and re-trigger the same failure. Check permissions on the config path.`)}}),await Bt.start()}catch(e){ee.warn({err:e},`[server] SyncEngine failed to start — sync disabled`),Bt=null}ze(`files`),ze(`backlinks`),ze(`graph`),ze(`tags`)}return Kt().then(Pe,Ie),{hocuspocus:_e,sessionManager:ve,cc1Broadcaster:ye,agentFocusBroadcaster:Ce,agentPresenceBroadcaster:we,contentFilter:ue,basenameIndex:oe,serverInstanceId:ne,destroy:Ut,ready:Re,degraded:Wt,lockDir:ae,get syncEngine(){return Bt}}}const LEGACY_RUNTIME_FILENAMES=[`server.lock`,`ui.lock`,`state.json`,`principal.json`,`sync-state.json`,`conflicts.json`,`last-spawn-error.log`],LEGACY_RUNTIME_DIRNAMES=[`cache`,`tmp`];function findLegacyRuntimeFiles(e){let t=resolve(e,LOCAL_DIR);if(!(()=>{if(!existsSync(t))return!0;try{return readdirSync(t).length===0}catch{return!0}})())return[];let S=[];for(let t of LEGACY_RUNTIME_FILENAMES)existsSync(resolve(e,t))&&S.push(t);for(let t of LEGACY_RUNTIME_DIRNAMES){let w=resolve(e,t);try{existsSync(w)&&statSync(w).isDirectory()&&S.push(`${t}/`)}catch{}}return S}function computeWorktreeAttributes(e){let t=resolveGitDirDetailed(e);switch(t.kind){case`directory`:return{kind:`main`,gitdir:t.path};case`linked`:return{kind:`linked`,gitdir:t.path};case`malformed-pointer`:return{kind:`linked`,gitdir:null};case`inaccessible`:case`absent`:return{kind:`main`,gitdir:null}}}const DEFAULT_IDLE_THRESHOLD_MS=1800*1e3,DESTROY_STEP_TIMEOUT_MS=5e3;async function bootServer(e){initTelemetry();let{kind:t,gitdir:S}=computeWorktreeAttributes(e.projectDir??e.contentDir),w={"ok.worktree.kind":t};return S!==null&&(w[`ok.worktree.gitdir`]=normalizeFsPath(S)),withSpan(`ok.boot`,{attributes:w},async()=>bootServerInner(e))}async function bootServerInner(e){let t=e.skipAutoInit??!1,S=e.attachUiSibling??!0,w=e.idleShutdownMs,E=e.log??getLogger(`boot`),D=process.env.OK_LOCK_KIND===`mcp-spawned`||process.env.OK_LOCK_KIND===`interactive`?process.env.OK_LOCK_KIND:void 0,O=e.lockKind??D??`interactive`,{createServer:k}=await import(`node:http`),{updateServerLockPort:j}=await import(`./server-lock-BniQ3qki-D-qFWWUB.mjs`).then(e=>e.a),F=!1;if(!t&&e.autoInitFn)try{F=!!await e.autoInitFn()}catch(e){E.warn({err:e},`autoInitFn failed`)}let L=e.projectDir??e.contentDir,B=resolve(L,`.ok`);if(!existsSync(resolve(B,`config.yml`)))throw new MissingOkConfigError(existsSync(B)?`config`:`okdir`,L);existsSync(resolve(B,`.gitignore`))||console.warn("[boot] Note: .ok/.gitignore is missing — per-machine state files in .ok/ may show up as untracked changes. Run `ok init` to add the recommended ignore entries.");let H=findLegacyRuntimeFiles(B);H.length>0&&console.warn(`[boot] Found legacy runtime files at .ok/${H.join(`, `)}. Delete .ok/ and re-init — these files moved to .ok/${LOCAL_DIR}/.`);let q=createServer$1({contentDir:e.contentDir,projectDir:e.projectDir,contentRoot:e.contentRoot,port:e.port,host:e.host,quiet:e.quiet??!1,debounce:e.debounce,maxDebounce:e.maxDebounce,gitEnabled:e.gitEnabled,commitDebounceMs:e.commitDebounceMs,wipRef:e.wipRef,enableTestRoutes:e.enableTestRoutes,shadowRepo:e.shadowRepo,destroyTimeoutMs:e.destroyTimeoutMs,localOpCliArgs:e.localOpCliArgs,onAgentWrite:e.onAgentWrite,lockKind:O,skipStateManifestCheck:e.skipStateManifestCheck,detectGh:e.detectGh,tokenStore:e.tokenStore}),{hocuspocus:J,destroy:Y,ready:ee,degraded:te,lockDir:ne,sessionManager:ae,agentFocusBroadcaster:oe,agentPresenceBroadcaster:se}=q,ce=(()=>{let t=e.host??`localhost`;return t===`0.0.0.0`||t===`::`?`localhost`:t.includes(`:`)&&!t.startsWith(`[`)?`[${t}]`:t})(),ue=e.port??0,de=createMcpHttpHandler({contentDir:e.contentDir,projectDir:e.projectDir??e.contentDir,config:e.config,getServerUrl:()=>`http://${ce}:${ue}`,log:E}),fe=k();fe.headersTimeout=3e4,fe.requestTimeout=6e4;let me=e.serveContentAssets?createAssetServeMiddleware({contentFilter:q.contentFilter,contentSirv:build_default(e.contentDir,{dev:!0,dotfiles:!1}),inlineExtensions:INLINE_RENDERABLE_EXTENSIONS,assetExtensions:ASSET_EXTENSIONS,blocklistExtensions:EXECUTABLE_BLOCKLIST_EXTENSIONS}):void 0,ge=!1;if(e.reactShellDistDir)try{acquireUiLock(ne,{port:0,worktreeRoot:e.projectDir??e.contentDir}),ge=!0}catch(e){if(e instanceof UiLockCollisionError)E.info({event:`ui-lock-yielded-to-live-holder`,pid:process.pid,existingPid:e.existing.pid,existingPort:e.existing.port,lockDir:ne},`ui.lock already held by a live process — yielding (advertisement is fulfilled)`);else throw await Y().catch(()=>{}),e}let _e=e.reactShellDistDir?build_default(e.reactShellDistDir,{single:!0,gzip:!0,immutable:!0}):void 0,ve=mountMcpAndApi({httpServer:fe,hocuspocus:J,mcpHttpHandler:de,log:E,sessionManager:ae,agentFocusBroadcaster:oe,agentPresenceBroadcaster:se,keepaliveGraceMs:e.keepaliveGraceMs,contentAssetMiddleware:me,reactShellMiddleware:_e}),ye=async()=>{throw Error(`bootServer: destroy() invoked before initialization — boot did not complete`)},Ce=null;w!==null&&(Ce=attachIdleShutdown({httpServer:fe,thresholdMs:w??DEFAULT_IDLE_THRESHOLD_MS,log:E,onShutdown:(e.idleShutdownHandler??(e=>async()=>{await e()}))(async()=>{await ye()})})),await restoreLifecycleFromConflictsJson({hocuspocus:J,projectDir:e.projectDir??e.contentDir,log:E});try{await new Promise((t,S)=>{let w=e=>S(e);fe.once(`error`,w),fe.listen(e.port,e.host,()=>{fe.removeListener(`error`,w),t()})})}catch(e){if(ge)try{releaseUiLock(ne)}catch(e){E.warn({err:e},`releaseUiLock failed during listen-error cleanup`)}throw await Y().catch(()=>{}),e}let we=fe.address(),Te=typeof we==`object`&&we?we.port:e.port??0;if(ue=Te,j(ne,Te),ge&&updateUiLockPort(ne,Te),S&&e.spawnUiSiblingFn)try{await e.spawnUiSiblingFn({lockDir:ne,log:E})}catch(e){E.warn({err:e},`spawnUiSiblingFn failed`)}let De=!1,je=async(e,t)=>{let S;try{await Promise.race([t(),new Promise((t,w)=>{S=setTimeout(()=>{w(Error(`${e} timed out after ${DESTROY_STEP_TIMEOUT_MS}ms`))},DESTROY_STEP_TIMEOUT_MS),S.unref?.()})])}finally{S!==void 0&&clearTimeout(S)}};return ye=async()=>{if(De)return;De=!0;let e=[],t=async(t,S)=>{try{await je(t,S)}catch(S){e.push(S),E.warn({err:S,step:t},`bootServer destroy step failed`)}};try{Ce?.detach()}catch(t){e.push(t),E.warn({err:t,step:`idleHandle.detach`},`bootServer destroy step failed`)}if(await t(`mount.shutdown`,()=>ve.shutdown()),await t(`mcpHttpHandler.close`,()=>de.close()),await t(`mount.wss.close`,()=>new Promise((e,t)=>{ve.wss.close(S=>S?t(S):e())})),await t(`httpServer.closeAllConnections`,async()=>{fe.closeAllConnections?.()}),await t(`httpServer.close`,()=>new Promise((e,t)=>{fe.close(S=>S&&S.code!==`ERR_SERVER_NOT_RUNNING`?t(S):e())})),await t(`destroyHocuspocus`,()=>Y()),ge&&await t(`releaseUiLock`,async()=>releaseUiLock(ne)),await t(`shutdownTelemetry`,()=>shutdownTelemetry()),e.length>0)throw AggregateError(e,`bootServer destroy completed with errors`)},{httpServer:fe,destroy:ye,lockDir:ne,contentDir:e.contentDir,port:Te,ready:ee,degraded:te,didAutoInit:F,serverInstance:q}}async function restoreLifecycleFromConflictsJson(e){let{hocuspocus:t,projectDir:S,log:w}=e,E,D;try{E=new ConflictStore(S),D=E.list()}catch(e){w.warn({err:e,projectDir:S},`[boot] lifecycle restore: failed to read conflicts.json — skipping`);return}if(D.length===0)return;let O=null;try{let e=resolveGitDir(S),t=e?join(e,`MERGE_HEAD`):null;if(!t||!existsSync(t)){E.clear(),console.warn(JSON.stringify({event:`lifecycle-restore-cleared-stale-conflicts`,reason:`no-merge-head`,count:D.length}));return}let w=(await simpleGit({baseDir:S,timeout:{block:5e3}}).raw([`diff`,`--name-only`,`--diff-filter=U`])).trim();O=new Set(w?w.split(`
|
|
3368
3368
|
`).map(e=>e.trim()).filter(Boolean):[])}catch(e){w.warn({err:e,projectDir:S},`[boot] lifecycle restore: git unmerged probe failed — restoring all entries`)}if(O!==null){let e=0;for(let t of D)O.has(t.file)||(E.removeConflict(t.file),e++);if(e>0&&console.warn(JSON.stringify({event:`lifecycle-restore-pruned-resolved-entries`,pruned:e,remaining:D.length-e})),D=D.filter(e=>O?.has(e.file)),D.length===0)return}for(let e of D){let S=stripDocExtension(e.file),E=null,D=!1;try{E=await t.openDirectConnection(S);let e=E.document;if(!e)continue;let w=e.getMap(`lifecycle`);w.set(`status`,`conflict`),w.set(`reason`,`conflict-markers`),D=!0,console.warn(JSON.stringify({event:`lifecycle-restored-from-conflicts-json`,"doc.name":S}))}catch(e){w.warn({err:e,docName:S},`[boot] lifecycle restore: failed to set lifecycle for doc — skipping`)}finally{if(E)try{await E.disconnect()}catch(e){w.warn({err:e,docName:S,restored:D},`[boot] lifecycle restore: disconnect failed after lifecycle write`)}}}}const ConfigSchema=ConfigSchema$1;function detectClaudeDesktopPresence(e={}){let t=e.home??homedir(),S=e.platformName??process.platform,w=e.env??process.env;return S===`darwin`?existsSync(join(t,`Library`,`Application Support`,`Claude`)):S===`win32`?existsSync(join(w.APPDATA??join(t,`AppData`,`Roaming`),`Claude`)):!1}const ANCESTOR_WALK_DEPTH_LIMIT=30,GIT_MARKER=`.git`;function findEnclosingGitRoot(e){let t=resolve(e),S=0;for(;S<ANCESTOR_WALK_DEPTH_LIMIT;){let e=!1;try{e=existsSync(resolve(t,GIT_MARKER))}catch{e=!1}if(e)return{gitRoot:t,distance:S};let w=dirname(t);if(w===t)return null;t=w,S+=1}return null}const execFileAsync=promisify(execFile);var ProjectGitInitError=class extends Error{stderr;constructor(e,t=``,S){super(e,S),this.name=`ProjectGitInitError`,this.stderr=t}};async function isInsideExistingWorkTree(e){try{let{stdout:t}=await execFileAsync(`git`,[`rev-parse`,`--is-inside-work-tree`],{cwd:e});return t.trim()===`true`}catch{return!1}}async function ensureProjectGit(e){let t=resolve(e),S=resolve(t,`.git`),w=resolve(S,`HEAD`),E=!1;if(existsSync(S)){if(!statSync(S).isDirectory()||existsSync(w))return{didInit:!1};console.log(`[project-git] detected partial .git/ — running git init to repair`),E=!0}else if(await isInsideExistingWorkTree(t))return{didInit:!1};let D=``;try{D=(await execFileAsync(`git`,[`init`,`--initial-branch=main`,t])).stderr??``}catch(e){let S=typeof e==`object`&&e&&`stderr`in e?String(e.stderr??``):``;throw new ProjectGitInitError(`git init failed at ${t}: ${e instanceof Error?e.message:String(e)}`,S,{cause:e})}if(!existsSync(w))throw new ProjectGitInitError(`git init reported success but ${S}/HEAD is missing (partial init detected)`,D);return E?(console.log(`[project-git] backfilled missing .git/HEAD at ${t}`),{didInit:!0,repaired:!0}):(console.log(`[project-git] initialized .git/ at ${t} (branch: main)`),{didInit:!0})}async function resolvePackageVersion(e,t){let S;try{S=createRequire(t).resolve(e)}catch(e){if(e?.code===`MODULE_NOT_FOUND`)return;throw e}for(let t=dirname(S),w=0;w<32;w+=1){let S=join(t,`package.json`);if(existsSync(S))try{let t=JSON.parse(await readFile$1(S,`utf-8`));if(t.name===e&&typeof t.version==`string`)return t.version}catch{}let w=dirname(t);if(w===t)return;t=w}}export{assertNeverDiskEvent as $,rewriteWikiLinksForDocumentRename as $n,GitDirAccessError as $r,initShadowRepo as $t,MissingOkConfigError as A,looseObject as Ai,readSkillInstallStateSnapshot as An,tracedWriteFile as Ar,createTestLogger as At,STARTER_PACK_IDS as B,releaseUiLock as Bn,writeTargetVersion as Br,formatContributors as Bt,LOG_MD_TEMPLATE as C,OK_PROJECT_MARKER as Ci,parseHocuspocusAuthToken as Cn,tracedMkdir as Cr,createLiveDerivedIndexExtension as Ct,MCP_SERVER_NAME as D,array as Di,readAllTargets as Dn,tracedRmSync as Dr,createServer$1 as Dt,MCP_CONNECTION_ID_HEADER as E,any$1 as Ei,planSeed as En,tracedRenameSync as Er,createPersistenceExtension as Et,SERVICE_WRITER as F,_coercedNumber as Fi,reconcile as Fn,validateCloneInputs as Fr,evictStaleTrackerEntries as Ft,StateManifestError as G,resolveCursorBinaryDefault as Gn,isInitializedNotification as Gr,getLogger as Gt,STATE_MANIFEST_FILENAME as H,resetMetrics as Hn,McpServer as Hr,gcCheckpointRefs as Ht,SKILL_INSTALL_EVENTS_FILE_REL as I,NEVER as Ii,recordContributor as In,validateSkillZip as Ir,extractWikiLinksFromMarkdown as It,acquireUiLock as J,resolvePack as Jn,atomicWriteFileSync as Jr,getTracer as Jt,TagIndex as K,resolveCursorSpawnInvocation as Kn,isJSONRPCRequest as Kr,getMeter as Kt,STARTER_FOLDERS as L,require_dist$2 as Li,recordSkillInstallEvent as Ln,withSpan as Lr,findEnclosingGitRoot as Lt,PinoLogger as M,object$1 as Mi,readTargetRecordedAt as Mn,updateLastKnownHash as Mr,detectProjectShape as Mt,ProjectGitInitError as N,string$2 as Ni,readTargetVersion as Nn,updateUiLockPort as Nr,ensureProjectGit as Nt,MISSING_OK_CONFIG_MESSAGE as O,boolean$1 as Oi,readBranchFromHead as On,tracedRmdirSync as Or,createServerObserverExtension as Ot,ROLLBACK_ORIGIN as P,url as Pi,readUiLock as Pn,validateAgentId as Pr,errorResponse as Pt,assertCompatibleStateManifest as Q,rewriteMarkdownLinksForDocumentRename as Qn,writeConfigPatch as Qr,incrementServerObserverFire as Qt,STARTER_FOLDER_FRONTMATTER_FILENAME as R,registerAllTools as Rn,withSpanSync as Rr,findEnclosingProjectRoot as Rt,LIVE_DERIVED_INDEX_DEBOUNCE_MS as S,LOCAL_DIR as Si,parseAuthRejectionWire as Sn,tracedLinkSync as Sr,createExternalChangeHandler as St,MAX_AGENT_SESSIONS as T,ZodNumber$1 as Ti,pathToDocName as Tn,tracedRename as Tr,createOsProbe as Tt,SeedPrerequisiteError as U,resolveBundledSkillDir as Un,JSONRPCMessageSchema as Ur,getCurrentMcpLogger as Ut,STARTER_TEMPLATES as V,removeLastKnownHash as Vn,writeTracker as Vr,formatContributorsFrom as Vt,SeedRootDirError as W,resolveContentDir as Wn,LATEST_PROTOCOL_VERSION as Wr,getLocalDir as Wt,applyExternalChange as X,restoreContributors as Xn,resolveConfigPath as Xr,handleSpawnCursor as Xt,applyAgentMarkdownWrite as Y,resolvePackageVersion as Yn,readConfigSafely as Yr,handleCollabSocketError as Yt,applySeed as Z,restoreLifecycleFromConflictsJson as Zn,withFileLockSync as Zr,incrementCollabSocketFilteredError as Zt,GIT_UPSTREAM_WRITER as _,humanFormat as _i,listStarterPacks as _n,startWatcher as _r,contributorCount as _t,AgentPresenceBroadcaster as a,DEFAULT_SERVER_HOST as ai,isAllowedWorkspaceHostHeader as an,safeContentPath as ar,buildSkillZip as at,HocuspocusAuthTokenSchema as b,isOrphanMode as bi,mountMcpAndApi as bn,toBroadcasterKey as br,createContentFilter as bt,BacklinkIndex as c,EXECUTABLE_BLOCKLIST_EXTENSIONS as ci,isKnownPackId as cn,sanitizeClientName as cr,classifyEvents as ct,CURSOR_BUNDLE_PATHS_BY_PLATFORM as d,ProblemDetailsSchema as di,isPathWithinDir as dn,seedBasenameIndex as dr,coercePackId as dt,MalformedGitPointerError as ei,initTelemetry as en,runAuthReposSubprocess as er,attachIdleShutdown as et,ConfigSchema as f,SKILL_STATE_TARGETS as fi,isProjectRoot as fn,setActiveSpanAttributes as fr,commitUpstreamImport as ft,FILE_WATCHER_ORIGIN as g,defaultScheduler as gi,listRescueCheckpoints as gn,splitMarkdownBlocks as gr,contentHash as gt,FILE_SYSTEM_WRITER as h,colorFromSeed as hi,lastKnownHash as hn,spawnDetached as hr,containsConflictMarkers as ht,AgentFocusBroadcaster as i,DEFAULT_GITHUB_OAUTH_CLIENT_ID as ii,isAllowedApiOrigin as in,runWithMcpLogger as ir,buildInstructions as it,OBSERVER_SYNC_ORIGIN as j,number$1 as ji,readStateManifest as jn,tracedWriteFileSync as jr,detectClaudeDesktopPresence as jt,McpLogger as k,literal as ki,readServerPackageVersion as kn,tracedUnlinkSync as kr,createStreamingErrorWriter as kt,CC1Broadcaster as l,INLINE_RENDERABLE_EXTENSIONS as li,isLoopbackAddress as ln,saveInMemoryCheckpoint as lr,classifyFsPath as lt,DEFAULT_PACK_ID as m,SYSTEM_DOC_NAME as mi,isSystemDoc as mn,shutdownTelemetry as mr,commitWipFromTree as mt,AGENT_ID_RE as n,ASSET_EXTENSIONS as ni,installTestLoggers as nn,runCloneSubprocess as nr,buildAndOpenSkill as nt,AgentSessionCapacityError as o,DEFAULT_SIGTERM_GRACE_MS as oi,isConfigDoc as on,safeSubdir as or,buildStarterFolderFrontmatterYaml as ot,DEFAULT_CHECKPOINT_RETENTION as p,SPAWN_ERROR_LOG as pi,isSelfWrite as pn,shadowGit as pr,commitWip as pt,UiLockCollisionError as q,resolveLockDir as qn,isJSONRPCResultResponse as qr,getMetrics as qt,AGENT_WRITE_ORIGIN as r,CC1_CONTRACT_VERSION as ri,installUserSkill as rn,runDeviceFlowSubprocess as rr,buildExecResult as rt,AgentSessionManager as s,EDITOR_LABELS as si,isHocuspocusAuthRejectionReason as sn,safetyCheckpoint as sr,buildWipTree as st,AGENT_ID_MAX_LEN as t,ALL_EDITOR_IDS as ti,installPrettyZodErrors as tn,runAuthStatusSubprocess as tr,bootServer as tt,CONFLICT_MARKER_RE as u,ORPHAN_MODES as ui,isPairedWriteOrigin as un,saveVersion as ur,clearContributors as ut,HOCUSPOCUS_AUTH_REJECTION_REASONS as v,iconFromClientName as vi,loadPrincipal as vn,streamingProblemEvent as vr,createApiExtension as vt,MANAGED_RENAME_ORIGIN as w,locateIssue as wi,parseKeepaliveConnectionId as wn,tracedMkdirSync as wr,createMcpHttpHandler as wt,INSTALLED_AGENTS_SCHEMES as x,CONFIG_SCHEMA_MAJOR_PATH as xi,normalizeFsPath as xn,tracedAppendFileSync as xr,createContentFilterAsync as xt,HocuspocusAuthRejection as y,isBranchNotFoundGitError as yi,loggerFactory as yn,swapContributors as yr,createAssetServeMiddleware as yt,STARTER_PACKS as z,registerWrite as zn,writeStateManifest as zr,formatAuthRejectionWire as zt};
|
|
3369
|
-
//# sourceMappingURL=dist-
|
|
3369
|
+
//# sourceMappingURL=dist-lSCD8oz8.mjs.map
|