agentix-cli 0.126.1 → 0.127.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/{App-BUYK4EGC.js → App-FF66N2KH.js} +2 -2
  2. package/dist/{ChatApp-ZS6EPDDK.js → ChatApp-HMHQZVVD.js} +2 -2
  3. package/dist/{absorb-eval-5Y5IZWW2.js → absorb-eval-ERKVVTGG.js} +2 -2
  4. package/dist/{agent-WJTYM5HR.js → agent-UAWDO3I2.js} +2 -2
  5. package/dist/{board-dashboard-DQR2OSV7.js → board-dashboard-Y2OECKDG.js} +303 -228
  6. package/dist/board-dashboard-Y2OECKDG.js.map +1 -0
  7. package/dist/{chunk-JUIL2EW3.js → chunk-3KYZOC7N.js} +2 -2
  8. package/dist/{chunk-JIXNSA67.js → chunk-4WZGZ2Z6.js} +2 -2
  9. package/dist/chunk-52SIHG45.js +4 -0
  10. package/dist/chunk-52SIHG45.js.map +1 -0
  11. package/dist/{chunk-FHBPKMCF.js → chunk-73WQ42PO.js} +2 -2
  12. package/dist/{chunk-6GLJIA25.js → chunk-CKYPQMUD.js} +2 -2
  13. package/dist/chunk-COWAAE54.js +128 -0
  14. package/dist/chunk-COWAAE54.js.map +1 -0
  15. package/dist/{chunk-ZQWWMAMJ.js → chunk-EHLTZ6IB.js} +2 -2
  16. package/dist/{chunk-Z7XXUYBB.js → chunk-EJT3F6QM.js} +33 -35
  17. package/dist/chunk-EJT3F6QM.js.map +1 -0
  18. package/dist/{chunk-LVV7JBHM.js → chunk-HNBW5Q47.js} +2 -2
  19. package/dist/{chunk-4VUGJB5S.js → chunk-HYRBBH6T.js} +98 -98
  20. package/dist/chunk-HYRBBH6T.js.map +1 -0
  21. package/dist/{chunk-CY6ABHF2.js → chunk-I4DGMFQG.js} +2 -2
  22. package/dist/{chunk-VXKNB4AW.js → chunk-LTH3AYXC.js} +2 -2
  23. package/dist/{chunk-O4XEQTEN.js → chunk-NUSROFTJ.js} +3 -3
  24. package/dist/chunk-NUSROFTJ.js.map +1 -0
  25. package/dist/chunk-O6FP3LPC.js +4 -0
  26. package/dist/chunk-O6FP3LPC.js.map +1 -0
  27. package/dist/{chunk-WMTGAVPW.js → chunk-PH43FUU7.js} +2 -2
  28. package/dist/{chunk-2W3X6H7Z.js → chunk-PLIT25TH.js} +2 -2
  29. package/dist/chunk-QUXMLLX5.js +2 -0
  30. package/dist/chunk-QUXMLLX5.js.map +1 -0
  31. package/dist/{chunk-D6SWAB5J.js → chunk-QWQOI4G4.js} +32 -32
  32. package/dist/chunk-QWQOI4G4.js.map +1 -0
  33. package/dist/{chunk-YNA5T43U.js → chunk-TJ4P4WW2.js} +2 -2
  34. package/dist/{chunk-2C3X6DVD.js → chunk-UJXS4MS3.js} +2 -2
  35. package/dist/{chunk-GUQDPA6R.js → chunk-VBJTGTF5.js} +2 -2
  36. package/dist/{chunk-FVG2BADS.js → chunk-XX5QKBX4.js} +2 -2
  37. package/dist/{chunk-QQYXYJOG.js → chunk-XYT6XY7G.js} +2 -2
  38. package/dist/{chunk-46JKX6CT.js → chunk-Y27RUOD2.js} +10 -10
  39. package/dist/chunk-Y27RUOD2.js.map +1 -0
  40. package/dist/{chunk-WUDVBPQV.js → chunk-YV22EOGL.js} +2 -2
  41. package/dist/cli.js +1 -1
  42. package/dist/{client-PO5LDFS4.js → client-2VVRJ3UF.js} +2 -2
  43. package/dist/{config-L2RQ6EJX.js → config-YSKHOV44.js} +2 -2
  44. package/dist/config-mutate-47WZDZBO.js +2 -0
  45. package/dist/config-mutator-7DIEQUB5.js +2 -0
  46. package/dist/doctor-Q3QNZVLC.js +2 -0
  47. package/dist/{follow-up-tool-AIOLNUF7.js → follow-up-tool-GKZVG4L2.js} +2 -2
  48. package/dist/{follow-up-tool-AIOLNUF7.js.map → follow-up-tool-GKZVG4L2.js.map} +1 -1
  49. package/dist/hub-DNPINTIF.js +2 -0
  50. package/dist/index.d.ts +115 -50
  51. package/dist/index.js +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/notes-YLTNRMB5.js +2 -0
  54. package/dist/notes-settings-X63D5HPM.js +2 -0
  55. package/dist/{program-EYGICEXY.js → program-4QWUOJE3.js} +214 -214
  56. package/dist/program-4QWUOJE3.js.map +1 -0
  57. package/dist/{promote-MQYJMGGZ.js → promote-PETKX7KR.js} +2 -2
  58. package/dist/query-D44BUTH3.js +2 -0
  59. package/dist/registry-2XDO53AJ.js +2 -0
  60. package/dist/{request-planner-XYHM26CO.js → request-planner-A3WJNPXO.js} +2 -2
  61. package/dist/{review-candidates-XRBAMRBH.js → review-candidates-A6ID2RDX.js} +2 -2
  62. package/dist/routing-NPP3MEUW.js +2 -0
  63. package/dist/schedule-tool-ZECUQMQK.js +2 -0
  64. package/dist/scheduler-T6VLBM3U.js +2 -0
  65. package/dist/scheduler-T6VLBM3U.js.map +1 -0
  66. package/dist/{seat-LKBZ6SDS.js → seat-D3DBYTSC.js} +2 -2
  67. package/dist/seat-D3DBYTSC.js.map +1 -0
  68. package/dist/{select-BSC3TFMZ.js → select-RFY64RY7.js} +2 -2
  69. package/dist/{set-enabled-YWXWSKME.js → set-enabled-AU66DR5C.js} +2 -2
  70. package/dist/{tool-FZEC5FQX.js → tool-F3YA2ZZQ.js} +2 -2
  71. package/dist/{tool-FZEC5FQX.js.map → tool-F3YA2ZZQ.js.map} +1 -1
  72. package/dist/{tool-5JTCSRTW.js → tool-PCHIVR27.js} +2 -2
  73. package/dist/{tool-5JTCSRTW.js.map → tool-PCHIVR27.js.map} +1 -1
  74. package/dist/wiki-NI3ZPUZS.js +2 -0
  75. package/dist/wiki-NI3ZPUZS.js.map +1 -0
  76. package/package.json +1 -1
  77. package/dist/board-dashboard-DQR2OSV7.js.map +0 -1
  78. package/dist/chunk-46JKX6CT.js.map +0 -1
  79. package/dist/chunk-4VUGJB5S.js.map +0 -1
  80. package/dist/chunk-5DFUUYEA.js +0 -126
  81. package/dist/chunk-5DFUUYEA.js.map +0 -1
  82. package/dist/chunk-D6SWAB5J.js.map +0 -1
  83. package/dist/chunk-O4XEQTEN.js.map +0 -1
  84. package/dist/chunk-Z7XXUYBB.js.map +0 -1
  85. package/dist/config-mutator-44OAOZXM.js +0 -2
  86. package/dist/doctor-AU5TCOSG.js +0 -2
  87. package/dist/hub-53YQQCVA.js +0 -2
  88. package/dist/program-EYGICEXY.js.map +0 -1
  89. package/dist/query-DNJONEKC.js +0 -2
  90. package/dist/registry-5A3SLBVJ.js +0 -2
  91. package/dist/routing-OMIWZKNC.js +0 -2
  92. package/dist/schedule-tool-YRANRFHO.js +0 -2
  93. package/dist/scheduler-L4P4Z55R.js +0 -2
  94. package/dist/wiki-BT3H2WCD.js +0 -2
  95. /package/dist/{App-BUYK4EGC.js.map → App-FF66N2KH.js.map} +0 -0
  96. /package/dist/{ChatApp-ZS6EPDDK.js.map → ChatApp-HMHQZVVD.js.map} +0 -0
  97. /package/dist/{absorb-eval-5Y5IZWW2.js.map → absorb-eval-ERKVVTGG.js.map} +0 -0
  98. /package/dist/{agent-WJTYM5HR.js.map → agent-UAWDO3I2.js.map} +0 -0
  99. /package/dist/{chunk-JUIL2EW3.js.map → chunk-3KYZOC7N.js.map} +0 -0
  100. /package/dist/{chunk-JIXNSA67.js.map → chunk-4WZGZ2Z6.js.map} +0 -0
  101. /package/dist/{chunk-FHBPKMCF.js.map → chunk-73WQ42PO.js.map} +0 -0
  102. /package/dist/{chunk-6GLJIA25.js.map → chunk-CKYPQMUD.js.map} +0 -0
  103. /package/dist/{chunk-ZQWWMAMJ.js.map → chunk-EHLTZ6IB.js.map} +0 -0
  104. /package/dist/{chunk-LVV7JBHM.js.map → chunk-HNBW5Q47.js.map} +0 -0
  105. /package/dist/{chunk-CY6ABHF2.js.map → chunk-I4DGMFQG.js.map} +0 -0
  106. /package/dist/{chunk-VXKNB4AW.js.map → chunk-LTH3AYXC.js.map} +0 -0
  107. /package/dist/{chunk-WMTGAVPW.js.map → chunk-PH43FUU7.js.map} +0 -0
  108. /package/dist/{chunk-2W3X6H7Z.js.map → chunk-PLIT25TH.js.map} +0 -0
  109. /package/dist/{chunk-YNA5T43U.js.map → chunk-TJ4P4WW2.js.map} +0 -0
  110. /package/dist/{chunk-2C3X6DVD.js.map → chunk-UJXS4MS3.js.map} +0 -0
  111. /package/dist/{chunk-GUQDPA6R.js.map → chunk-VBJTGTF5.js.map} +0 -0
  112. /package/dist/{chunk-FVG2BADS.js.map → chunk-XX5QKBX4.js.map} +0 -0
  113. /package/dist/{chunk-QQYXYJOG.js.map → chunk-XYT6XY7G.js.map} +0 -0
  114. /package/dist/{chunk-WUDVBPQV.js.map → chunk-YV22EOGL.js.map} +0 -0
  115. /package/dist/{client-PO5LDFS4.js.map → client-2VVRJ3UF.js.map} +0 -0
  116. /package/dist/{config-L2RQ6EJX.js.map → config-YSKHOV44.js.map} +0 -0
  117. /package/dist/{config-mutator-44OAOZXM.js.map → config-mutate-47WZDZBO.js.map} +0 -0
  118. /package/dist/{doctor-AU5TCOSG.js.map → config-mutator-7DIEQUB5.js.map} +0 -0
  119. /package/dist/{hub-53YQQCVA.js.map → doctor-Q3QNZVLC.js.map} +0 -0
  120. /package/dist/{promote-MQYJMGGZ.js.map → hub-DNPINTIF.js.map} +0 -0
  121. /package/dist/{query-DNJONEKC.js.map → notes-YLTNRMB5.js.map} +0 -0
  122. /package/dist/{registry-5A3SLBVJ.js.map → notes-settings-X63D5HPM.js.map} +0 -0
  123. /package/dist/{routing-OMIWZKNC.js.map → promote-PETKX7KR.js.map} +0 -0
  124. /package/dist/{schedule-tool-YRANRFHO.js.map → query-D44BUTH3.js.map} +0 -0
  125. /package/dist/{scheduler-L4P4Z55R.js.map → registry-2XDO53AJ.js.map} +0 -0
  126. /package/dist/{request-planner-XYHM26CO.js.map → request-planner-A3WJNPXO.js.map} +0 -0
  127. /package/dist/{review-candidates-XRBAMRBH.js.map → review-candidates-A6ID2RDX.js.map} +0 -0
  128. /package/dist/{seat-LKBZ6SDS.js.map → routing-NPP3MEUW.js.map} +0 -0
  129. /package/dist/{wiki-BT3H2WCD.js.map → schedule-tool-ZECUQMQK.js.map} +0 -0
  130. /package/dist/{select-BSC3TFMZ.js.map → select-RFY64RY7.js.map} +0 -0
  131. /package/dist/{set-enabled-YWXWSKME.js.map → set-enabled-AU66DR5C.js.map} +0 -0
@@ -0,0 +1,4 @@
1
+ import{oa as l,ra as m}from"./chunk-Y27RUOD2.js";m();import{existsSync as g,readFileSync as u,writeFileSync as a,copyFileSync as y}from"fs";import{resolve as p}from"path";function P(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(!g(t))throw new Error(`agentx.json not found at ${t}`);let i=JSON.parse(u(t,"utf-8")),o=e(i),s=typeof o=="string"?{summary:o}:o,c=JSON.stringify(i,null,2)+`
2
+ `,f=t+".tmp";a(f,c,"utf-8");try{JSON.parse(u(f,"utf-8"))}catch(d){throw new Error(`config did not round-trip cleanly: ${d.message}`)}let r;return n.skipBackup||(r=`${t}.bak.${Date.now()}`,y(t,r)),a(t,c,"utf-8"),n.skipReload||h().catch(()=>{}),{summary:s.summary,payload:s.payload,backupPath:r}}function S(e,n={}){let t=n.configPath||p(process.cwd(),"agentx.json");if(g(t)&&!n.overwrite)throw new Error(`agentx.json already exists at ${t}. Pass overwrite=true to replace it.`);return a(t,JSON.stringify(e,null,2)+`
3
+ `,"utf-8"),{file:t}}async function h(){try{let n=l().dashboard.daemonUrl?.replace(/\/+$/,"")||"http://127.0.0.1:18800";await fetch(`${n}/reload`,{method:"POST"}).catch(()=>null)}catch{}}export{P as a,S as b};
4
+ //# sourceMappingURL=chunk-O6FP3LPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon/config-mutate.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync, copyFileSync } from \"fs\"\nimport { resolve } from \"path\"\nimport { loadDaemonConfig } from \"./config\"\n\n// --- Shared helpers for safe agentx.json mutation ---\n//\n// Multiple CLI commands and the dashboard admin UI all need to read → tweak →\n// write agentx.json without corrupting it on failure. This module owns the\n// atomic-write + backup + best-effort-reload pattern so every caller gets the\n// same guarantees.\n\nexport interface MutateOptions {\n /** Absolute path to the target agentx.json. Defaults to ./agentx.json. */\n configPath?: string\n /** When true, don't write a timestamped backup. Use for operations that are\n * intrinsically reversible (or when the caller already took a snapshot). */\n skipBackup?: boolean\n /** When true, don't POST /reload after writing. Handy in tests. */\n skipReload?: boolean\n}\n\nexport interface MutateResult<T = void> {\n summary: string\n payload?: T\n}\n\n/**\n * Read agentx.json, let the mutator tweak it in-place, then atomically write\n * the result back to disk. The mutator returns a short human-readable summary\n * of what changed and may optionally return a payload for the caller to relay.\n *\n * If the mutator throws, nothing is written. If writing succeeds but the file\n * doesn't round-trip as JSON, we restore from backup and rethrow.\n */\nexport function mutateAgentxConfig<T = void>(\n mutator: (cfg: any) => MutateResult<T> | string,\n opts: MutateOptions = {},\n): { summary: string; payload?: T; backupPath?: string } {\n const file = opts.configPath || resolve(process.cwd(), \"agentx.json\")\n if (!existsSync(file)) throw new Error(`agentx.json not found at ${file}`)\n\n const cfg = JSON.parse(readFileSync(file, \"utf-8\"))\n const raw = mutator(cfg)\n const result: MutateResult<T> = typeof raw === \"string\" ? { summary: raw } : raw\n\n const json = JSON.stringify(cfg, null, 2) + \"\\n\"\n const tmp = file + \".tmp\"\n writeFileSync(tmp, json, \"utf-8\")\n try {\n JSON.parse(readFileSync(tmp, \"utf-8\"))\n } catch (e: any) {\n throw new Error(`config did not round-trip cleanly: ${e.message}`)\n }\n\n let backupPath: string | undefined\n if (!opts.skipBackup) {\n backupPath = `${file}.bak.${Date.now()}`\n copyFileSync(file, backupPath)\n }\n writeFileSync(file, json, \"utf-8\")\n\n if (!opts.skipReload) triggerLocalReload().catch(() => { /* daemon may be off */ })\n\n return { summary: result.summary, payload: result.payload, backupPath }\n}\n\n/**\n * Write a fresh agentx.json from scratch. Used by the setup wizard on a truly\n * empty working directory. Fails if a file already exists (callers must pass\n * the overwrite flag explicitly — we don't want to silently clobber an\n * operator's hand-written config).\n */\nexport function writeAgentxConfig(\n cfg: unknown,\n opts: { configPath?: string; overwrite?: boolean } = {},\n): { file: string } {\n const file = opts.configPath || resolve(process.cwd(), \"agentx.json\")\n if (existsSync(file) && !opts.overwrite) {\n throw new Error(`agentx.json already exists at ${file}. Pass overwrite=true to replace it.`)\n }\n writeFileSync(file, JSON.stringify(cfg, null, 2) + \"\\n\", \"utf-8\")\n return { file }\n}\n\n/**\n * POST to the primary daemon's /reload endpoint so it picks up config changes\n * without a full restart. Silently no-ops if the daemon isn't running.\n */\nasync function triggerLocalReload(): Promise<void> {\n try {\n const cfg = loadDaemonConfig()\n const url = cfg.dashboard.daemonUrl?.replace(/\\/+$/, \"\") || \"http://127.0.0.1:18800\"\n await fetch(`${url}/reload`, { method: \"POST\" }).catch(() => null)\n } catch { /* config didn't load — leave it */ }\n}\n"],"mappings":"iDAEAA,IAFA,OAAS,cAAAC,EAAY,gBAAAC,EAAc,iBAAAC,EAAe,gBAAAC,MAAoB,KACtE,OAAS,WAAAC,MAAe,OAiCjB,SAASC,EACdC,EACAC,EAAsB,CAAC,EACgC,CACvD,IAAMC,EAAOD,EAAK,YAAcH,EAAQ,QAAQ,IAAI,EAAG,aAAa,EACpE,GAAI,CAACJ,EAAWQ,CAAI,EAAG,MAAM,IAAI,MAAM,4BAA4BA,GAAM,EAEzE,IAAMC,EAAM,KAAK,MAAMR,EAAaO,EAAM,OAAO,CAAC,EAC5CE,EAAMJ,EAAQG,CAAG,EACjBE,EAA0B,OAAOD,GAAQ,SAAW,CAAE,QAASA,CAAI,EAAIA,EAEvEE,EAAO,KAAK,UAAUH,EAAK,KAAM,CAAC,EAAI;AAAA,EACtCI,EAAML,EAAO,OACnBN,EAAcW,EAAKD,EAAM,OAAO,EAChC,GAAI,CACF,KAAK,MAAMX,EAAaY,EAAK,OAAO,CAAC,CACvC,OAASC,EAAP,CACA,MAAM,IAAI,MAAM,sCAAsCA,EAAE,SAAS,CACnE,CAEA,IAAIC,EACJ,OAAKR,EAAK,aACRQ,EAAa,GAAGP,SAAY,KAAK,IAAI,IACrCL,EAAaK,EAAMO,CAAU,GAE/Bb,EAAcM,EAAMI,EAAM,OAAO,EAE5BL,EAAK,YAAYS,EAAmB,EAAE,MAAM,IAAM,CAA0B,CAAC,EAE3E,CAAE,QAASL,EAAO,QAAS,QAASA,EAAO,QAAS,WAAAI,CAAW,CACxE,CAQO,SAASE,EACdR,EACAF,EAAqD,CAAC,EACpC,CAClB,IAAMC,EAAOD,EAAK,YAAcH,EAAQ,QAAQ,IAAI,EAAG,aAAa,EACpE,GAAIJ,EAAWQ,CAAI,GAAK,CAACD,EAAK,UAC5B,MAAM,IAAI,MAAM,iCAAiCC,uCAA0C,EAE7F,OAAAN,EAAcM,EAAM,KAAK,UAAUC,EAAK,KAAM,CAAC,EAAI;AAAA,EAAM,OAAO,EACzD,CAAE,KAAAD,CAAK,CAChB,CAMA,eAAeQ,GAAoC,CACjD,GAAI,CAEF,IAAME,EADMC,EAAiB,EACb,UAAU,WAAW,QAAQ,OAAQ,EAAE,GAAK,yBAC5D,MAAM,MAAM,GAAGD,WAAc,CAAE,OAAQ,MAAO,CAAC,EAAE,MAAM,IAAM,IAAI,CACnE,MAAE,CAA4C,CAChD","names":["init_config","existsSync","readFileSync","writeFileSync","copyFileSync","resolve","mutateAgentxConfig","mutator","opts","file","cfg","raw","result","json","tmp","e","backupPath","triggerLocalReload","writeAgentxConfig","url","loadDaemonConfig"]}
@@ -1,5 +1,5 @@
1
- import{ma as m,na as $,ra as x}from"./chunk-46JKX6CT.js";x();import{readFileSync as S,writeFileSync as P,existsSync as b}from"fs";import{resolve as f}from"path";function w(r){if(r)return f(r);let e=[f(process.cwd(),"agentx.json"),f(process.cwd(),".agentx/config.json")];for(let n of e)if(b(n))return n;return e[0]}function v(r){return JSON.parse(JSON.stringify(r))}async function O(r){try{let e=await fetch(`${r.replace(/\/$/,"")}/reload`,{method:"POST",signal:AbortSignal.timeout(3e3)});return e.ok?{ok:!0}:{ok:!1,reason:`HTTP ${e.status}`}}catch(e){return{ok:!1,reason:e?.cause?.code||e?.message||"unreachable"}}}async function J(r,e={}){let{validate:n=!0,dryRun:t=!1,reload:s=!0,configPath:u,daemonUrl:c}=e,o=w(u);if(!b(o))return{success:!1,path:o,error:`Config not found at ${o}. Run \`agentx init\` first.`};let d;try{d=S(o,"utf-8")}catch(a){return{success:!1,path:o,error:`Cannot read ${o}: ${a.message}`}}let g;try{g=JSON.parse(d)}catch(a){return{success:!1,path:o,error:`Invalid JSON in ${o}: ${a.message}`}}let i=v(g);try{await r(i)}catch(a){return{success:!1,path:o,error:`Mutator threw: ${a.message}`}}if(n){let a=$(i),l=m.safeParse(a);if(!l.success){let k=l.error.issues.map(y=>` ${y.path.join(".")||"<root>"}: ${y.message}`).join(`
1
+ import{ma as m,na as $,ra as x}from"./chunk-Y27RUOD2.js";x();import{readFileSync as S,writeFileSync as P,existsSync as b}from"fs";import{resolve as f}from"path";function w(r){if(r)return f(r);let e=[f(process.cwd(),"agentx.json"),f(process.cwd(),".agentx/config.json")];for(let n of e)if(b(n))return n;return e[0]}function v(r){return JSON.parse(JSON.stringify(r))}async function O(r){try{let e=await fetch(`${r.replace(/\/$/,"")}/reload`,{method:"POST",signal:AbortSignal.timeout(3e3)});return e.ok?{ok:!0}:{ok:!1,reason:`HTTP ${e.status}`}}catch(e){return{ok:!1,reason:e?.cause?.code||e?.message||"unreachable"}}}async function J(r,e={}){let{validate:n=!0,dryRun:t=!1,reload:s=!0,configPath:u,daemonUrl:c}=e,o=w(u);if(!b(o))return{success:!1,path:o,error:`Config not found at ${o}. Run \`agentx init\` first.`};let d;try{d=S(o,"utf-8")}catch(a){return{success:!1,path:o,error:`Cannot read ${o}: ${a.message}`}}let g;try{g=JSON.parse(d)}catch(a){return{success:!1,path:o,error:`Invalid JSON in ${o}: ${a.message}`}}let i=v(g);try{await r(i)}catch(a){return{success:!1,path:o,error:`Mutator threw: ${a.message}`}}if(n){let a=$(i),l=m.safeParse(a);if(!l.success){let k=l.error.issues.map(y=>` ${y.path.join(".")||"<root>"}: ${y.message}`).join(`
2
2
  `);return{success:!1,path:o,error:`Validation failed:
3
3
  ${k}`,after:i}}}if(t)return{success:!0,path:o,after:i,dryRun:!0};try{P(o,JSON.stringify(i,null,2)+`
4
4
  `)}catch(a){return{success:!1,path:o,error:`Write failed: ${a.message}`,after:i}}let p=!1,h;if(s){let a=c||R(i),l=await O(a);l.ok?p=!0:h=l.reason}return{success:!0,path:o,after:i,reloaded:p,reloadSkipped:h}}function R(r){let e=r?.node?.bind;if(!e)return"http://127.0.0.1:18800";let[n,t]=e.split(":");return`http://${n==="0.0.0.0"||n==="::"?"127.0.0.1":n}:${t}`}function N(r,e,n){let t=e.split("."),s=r;for(let u=0;u<t.length-1;u++){let c=t[u];(s[c]===void 0||s[c]===null)&&(s[c]={}),s=s[c]}s[t[t.length-1]]=n}function j(r,e){let n=e.split("."),t=r;for(let s of n){if(t==null)return;t=t[s]}return t}function A(r,e){let n=e.split("."),t=r;for(let s=0;s<n.length-1;s++){if(t==null)return;t=t[n[s]]}t!=null&&delete t[n[n.length-1]]}export{w as a,J as b,N as c,j as d,A as e};
5
- //# sourceMappingURL=chunk-WMTGAVPW.js.map
5
+ //# sourceMappingURL=chunk-PH43FUU7.js.map
@@ -1,4 +1,4 @@
1
- import{b as j}from"./chunk-2C3X6DVD.js";async function q(t,r,i,s,o={}){let e=o.retrieve??j,u=o.perEntry??2,l=o.maxArticles??8,p=o.queryChars??1500,m=new Map;for(let d of t){let n=[];try{n=await e(d.content.slice(0,p),r,i,{pool:s,maxCandidates:u,maxHops:1,maxArticles:u*2,stage:"absorb-covering"})}catch{}for(let a of n){let g=m.get(a.path);g?(g.hop=Math.min(g.hop,a.hop),g.entries.includes(d.id)||g.entries.push(d.id)):m.set(a.path,{...a,entries:[d.id]})}}return[...m.values()].sort((d,n)=>d.hop-n.hop||n.entries.length-d.entries.length||d.path.localeCompare(n.path)).slice(0,l)}function B(t){if(t.length===0)return"";let r=t.map(i=>{let s=`### ${i.meta.title} \u2014 ${i.meta.type||"untyped"} (${i.path})`,o=`Found for entries: ${i.entries.join(", ")}${i.hop>0?" (linked from a match)":""}`,e=i.meta.related?.length?`Related: ${i.meta.related.join(", ")}`:"";return[s,o,e,"",i.content].filter(u=>u!=="").join(`
1
+ import{b as j}from"./chunk-UJXS4MS3.js";async function q(t,r,i,s,o={}){let e=o.retrieve??j,u=o.perEntry??2,l=o.maxArticles??8,p=o.queryChars??1500,m=new Map;for(let d of t){let n=[];try{n=await e(d.content.slice(0,p),r,i,{pool:s,maxCandidates:u,maxHops:1,maxArticles:u*2,stage:"absorb-covering"})}catch{}for(let a of n){let g=m.get(a.path);g?(g.hop=Math.min(g.hop,a.hop),g.entries.includes(d.id)||g.entries.push(d.id)):m.set(a.path,{...a,entries:[d.id]})}}return[...m.values()].sort((d,n)=>d.hop-n.hop||n.entries.length-d.entries.length||d.path.localeCompare(n.path)).slice(0,l)}function B(t){if(t.length===0)return"";let r=t.map(i=>{let s=`### ${i.meta.title} \u2014 ${i.meta.type||"untyped"} (${i.path})`,o=`Found for entries: ${i.entries.join(", ")}${i.hop>0?" (linked from a match)":""}`,e=i.meta.related?.length?`Related: ${i.meta.related.join(", ")}`:"";return[s,o,e,"",i.content].filter(u=>u!=="").join(`
2
2
  `)}).join(`
3
3
 
4
4
  ---
@@ -48,4 +48,4 @@ Reply with JSON only, no fencing:
48
48
  {"claims": 0, "supported": 0, "unsupported": [], "contradicted": [], "off_subject": [], "missing": [], "verdict": "good"}`}function nt(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t,i=l=>Array.isArray(l)?l.map(p=>String(p)):[],s=l=>typeof l=="number"&&Number.isFinite(l)&&l>=0?Math.round(l):NaN,o=s(r.claims);if(Number.isNaN(o))return null;let e=Math.min(o,Number.isNaN(s(r.supported))?o-i(r.unsupported).length:s(r.supported)),u=r.verdict==="good"||r.verdict==="minor"||r.verdict==="major"?r.verdict:null;return u?{claims:o,supported:Math.max(0,e),unsupported:i(r.unsupported),contradicted:i(r.contradicted),offSubject:i(r.off_subject??r.offSubject),missing:i(r.missing),verdict:u}:null}function rt(t,r,i,s=[],o=5,e){let u={};for(let n of t)u[n.type??"untyped"]=(u[n.type??"untyped"]??0)+1;let l=new Set,p=new Set;for(let n of t)for(let a of n.lost)l.add(a.entry),p.add(`${a.entry}|${a.fact}`);let m=new Set(r.flatMap(n=>[n.a,n.b]).filter(n=>t.some(a=>a.path===n))),d={sample:{articles:t.length,seed:i.seed,since:i.since,byType:u},citations:{withSources:t.filter(n=>n.sources>0).length,missingSources:t.reduce((n,a)=>n+a.missingSources.length,0),weakSources:t.reduce((n,a)=>n+a.weakSources.length,0),articlesWithWeak:t.filter(n=>n.weakSources.length>0).length},grounding:{articlesWithUngrounded:t.filter(n=>n.ungrounded.length>0).length,ungroundedFacts:t.reduce((n,a)=>n+a.ungrounded.length,0)},lost:{entriesWithLostFacts:l.size,lostFacts:p.size},duplicates:{pairs:r.length,articlesInPair:m.size},...e?{uncited:{entries:e.entries,withLostFacts:e.lost.length}}:{},examples:{ungrounded:t.filter(n=>n.ungrounded.length>0).slice(0,o).map(n=>({path:n.path,facts:n.ungrounded.slice(0,6)})),lost:t.flatMap(n=>n.lost.map(a=>({path:n.path,...a}))).slice(0,o),weak:t.filter(n=>n.weakSources.length>0).slice(0,o).map(n=>({path:n.path,entries:n.weakSources})),duplicates:r.slice(0,o),uncited:(e?.lost??[]).slice(0,o).map(n=>({entry:n.entry,facts:n.facts.slice(0,4)})),judged:s.filter(n=>n.verdict.verdict!=="good").slice(0,o).map(n=>({path:n.path,verdict:n.verdict.verdict,unsupported:n.verdict.unsupported.slice(0,4),contradicted:n.verdict.contradicted.slice(0,4),offSubject:n.verdict.offSubject,missing:n.verdict.missing.slice(0,4)}))}};if(s.length>0){let n=s.map(c=>c.verdict),a=n.reduce((c,h)=>c+h.claims,0),g=n.reduce((c,h)=>c+h.supported,0);d.judge={judged:n.length,claims:a,supported:g,supportRate:a>0?g/a:1,unsupported:n.reduce((c,h)=>c+h.unsupported.length,0),contradicted:n.reduce((c,h)=>c+h.contradicted.length,0),articlesWithWrongMerge:n.filter(c=>c.offSubject.length>0).length,missingFacts:n.reduce((c,h)=>c+h.missing.length,0),verdicts:{good:n.filter(c=>c.verdict==="good").length,minor:n.filter(c=>c.verdict==="minor").length,major:n.filter(c=>c.verdict==="major").length}}}return d}var b=(t,r)=>r>0?`${Math.round(t/r*100)}%`:"\u2013";function st(t){let r=t.sample.articles,i=["# Wiki absorb scorecard","",`Sample: ${r} articles (seed \`${t.sample.seed}\`${t.sample.since?`, changed since ${t.sample.since}`:""}). Types: ${Object.entries(t.sample.byType).map(([e,u])=>`${e} ${u}`).join(", ")||"\u2013"}.`,"","| Check | Result | Lower is better? |","|---|---|---|",`| Articles citing at least one entry | ${t.citations.withSources}/${r} (${b(t.citations.withSources,r)}) | no |`,`| Cited ids with no entry | ${t.citations.missingSources} | yes |`,`| Articles with a weak citation (entry shares <${Math.round(_*100)}% of its words) | ${t.citations.articlesWithWeak}/${r} (${b(t.citations.articlesWithWeak,r)}) | yes |`,`| Articles with an ungrounded commit, link or number | ${t.grounding.articlesWithUngrounded}/${r} (${b(t.grounding.articlesWithUngrounded,r)}) | yes |`,`| Ungrounded facts | ${t.grounding.ungroundedFacts} | yes |`,`| Commits or links lost from cited entries | ${t.lost.lostFacts} across ${t.lost.entriesWithLostFacts} entries | yes |`,`| Sampled articles in a likely duplicate pair | ${t.duplicates.articlesInPair}/${r} (${b(t.duplicates.articlesInPair,r)}) | yes |`];if(t.uncited&&i.push(`| Entries read in the window but cited by no article | ${t.uncited.entries} | \u2013 |`,`| \u2026of which carry a commit or link no article has | ${t.uncited.withLostFacts} | yes |`),t.judge){let e=t.judge;i.push(`| Judge: claims supported by the cited entries | ${e.supported}/${e.claims} (${b(e.supported,e.claims)}) | no |`,`| Judge: unsupported / contradicted claims | ${e.unsupported} / ${e.contradicted} | yes |`,`| Judge: articles with an off-subject source (wrong merge) | ${e.articlesWithWrongMerge}/${e.judged} (${b(e.articlesWithWrongMerge,e.judged)}) | yes |`,`| Judge: facts missing from the article | ${e.missingFacts} | yes |`,`| Judge verdicts good / minor / major | ${e.verdicts.good} / ${e.verdicts.minor} / ${e.verdicts.major} | \u2013 |`)}let s=t.examples,o=(e,u)=>{u.length!==0&&i.push("",`## ${e}`,"",...u)};return o("Examples: ungrounded facts",s.ungrounded.map(e=>`- \`${e.path}\`: ${e.facts.join("; ")}`)),o("Examples: lost facts",s.lost.map(e=>`- \`${e.path}\` \u2190 entry \`${e.entry}\`: ${e.fact}`)),o("Examples: weak citations",s.weak.map(e=>`- \`${e.path}\`: ${e.entries.map(u=>`\`${u}\``).join(", ")}`)),o("Examples: uncited entries with facts no article has",s.uncited.map(e=>`- \`${e.entry}\`: ${e.facts.join("; ")}`)),o("Examples: likely duplicates",s.duplicates.map(e=>`- \`${e.a}\` \u2194 \`${e.b}\` (${e.reason}, ${e.score.toFixed(2)})`)),o("Examples: judge findings",s.judged.map(e=>{let u=[e.unsupported.length?`unsupported: ${e.unsupported.join(" | ")}`:"",e.contradicted.length?`contradicted: ${e.contradicted.join(" | ")}`:"",e.offSubject.length?`off-subject: ${e.offSubject.join(", ")}`:"",e.missing.length?`missing: ${e.missing.join(" | ")}`:""].filter(Boolean);return`- \`${e.path}\` (${e.verdict}): ${u.join("; ")}`})),i.push("","## Method","","- The sample is drawn with a seeded shuffle from the articles changed in the window, so the same seed and window give the same articles.","- Ungrounded: a commit hash, link or number (three digits or more, or a date) in the article that no cited entry and no earlier version of the article contains.","- Lost: a commit hash or link in a cited entry that no article citing that entry contains.","- Uncited: entries the absorb ledger marks as read in the window that no article cites; those carrying a commit or link that no article on the node has are counted as lost, since absorb will not offer them again.","- Weak citation: a cited entry sharing fewer than 15% of its distinctive words with the article.","- Duplicate: two articles of the same type whose titles share at least 75% of their words, or which share at least half their sources.","- Judge (optional): one model call per article reads the article and its cited entries and lists unsupported, contradicted, off-subject and missing items."),i.join(`
49
49
  `)+`
50
50
  `}function it(t){if(!t||typeof t!="object")return{};let r=t,i=r.usage??{},s=o=>typeof o=="number"&&Number.isFinite(o)?o:void 0;return{costUsd:s(r.total_cost_usd)??s(r.cost_usd),apiMs:s(r.duration_api_ms),inputTokens:s(i.input_tokens),outputTokens:s(i.output_tokens),cacheReadTokens:s(i.cache_read_input_tokens),cacheWriteTokens:s(i.cache_creation_input_tokens)}}function T(t,r){return t.length===0?0:t[Math.min(t.length-1,Math.floor(r*t.length))]}function ot(t){let r=new Map,i=o=>{let e=o||"(none)",u=r.get(e);return u||r.set(e,u={calls:[],runs:[]}),u};for(let o of t)o.kind==="call"?i(o.label).calls.push(o):o.kind==="run"&&i(o.label).runs.push(o);let s=[];for(let[o,{calls:e,runs:u}]of r){if(e.length===0)continue;let l=e.map(n=>n.wallMs).sort((n,a)=>n-a),p;if(u.length>0)p=u.reduce((n,a)=>n+(Date.parse(a.endedAt)-Date.parse(a.startedAt)),0);else{let n=e.map(g=>Date.parse(g.at)-g.wallMs),a=e.map(g=>Date.parse(g.at));p=Math.max(...a)-Math.min(...n)}let m=e.reduce((n,a)=>n+a.entries,0),d=e.reduce((n,a)=>n+(a.costUsd??0),0);s.push({label:o,calls:e.length,failed:e.filter(n=>n.failed).length,entries:m,articles:e.reduce((n,a)=>n+a.articles,0),refused:e.reduce((n,a)=>n+a.refused,0),heldCited:e.reduce((n,a)=>n+(a.heldCited??0),0),wallMs:p,callMsP50:T(l,.5),callMsP95:T(l,.95),prepMs:e.reduce((n,a)=>n+(a.prepMs??0),0),costUsd:d,costPerEntry:m>0?d/m:0,entriesPerMinute:p>0?m/p*6e4:0,promptChars:e.reduce((n,a)=>n+a.promptChars,0)})}return s.sort((o,e)=>o.label.localeCompare(e.label))}export{q as a,B as b,V as c,Y as d,I as e,Q as f,S as g,J as h,_ as i,X as j,Z as k,tt as l,L as m,et as n,nt as o,rt as p,st as q,it as r,ot as s};
51
- //# sourceMappingURL=chunk-2W3X6H7Z.js.map
51
+ //# sourceMappingURL=chunk-PLIT25TH.js.map
@@ -0,0 +1,2 @@
1
+ var s=/^[A-Za-z0-9][A-Za-z0-9._:@-]*$/;function a(o){let n=o&&typeof o=="object"?o:{};return{enabled:n.enabled===!0,inbox:typeof n.inbox=="string"?n.inbox:"",crons:Array.isArray(n.crons)?n.crons.filter(r=>typeof r=="string"):[],maxNotesPerRun:Number.isInteger(n.maxNotesPerRun)?n.maxNotesPerRun:20,maxDeferrals:Number.isInteger(n.maxDeferrals)?n.maxDeferrals:3}}function b(o,n){let r={...o.wikiNotes&&typeof o.wikiNotes=="object"?o.wikiNotes:{}},t=[];if(n.inbox!==void 0){let e=String(n.inbox).trim();if(e&&!s.test(e))throw new Error(`"${e}" is not an agent id`);e?r.inbox=e:delete r.inbox,t.push(e?`inbox=${e}`:"inbox cleared")}if(n.crons!==void 0){let e=[...new Set(n.crons.map(i=>String(i).trim()).filter(Boolean))];r.crons=e,t.push(`crons=${e.length?e.join(","):"none"}`)}if(n.maxNotesPerRun!==void 0){let e=Number(n.maxNotesPerRun);if(!Number.isInteger(e)||e<1||e>100)throw new Error("max notes per run must be a whole number from 1 to 100");r.maxNotesPerRun=e,t.push(`maxNotesPerRun=${e}`)}if(n.maxDeferrals!==void 0){let e=Number(n.maxDeferrals);if(!Number.isInteger(e)||e<1||e>20)throw new Error("deferrals before a note expires must be a whole number from 1 to 20");r.maxDeferrals=e,t.push(`maxDeferrals=${e}`)}if(n.enabled!==void 0&&(r.enabled=!!n.enabled,t.push(r.enabled?"on":"off")),t.length===0)throw new Error("nothing to update");if(r.enabled&&!r.inbox)throw new Error("set the inbox agent first: the agent that runs the wiki observe/sweep schedule");for(let e of r.crons??[]){let i=o.crons?.[e];if(!i)throw new Error(`no schedule "${e}" on this node`);if(r.inbox&&i.agent!==r.inbox)throw new Error(`schedule "${e}" runs as "${i.agent}", not the inbox agent "${r.inbox}"`)}return o.wikiNotes=r,`wiki notes updated (${t.join(", ")})`}export{a,b};
2
+ //# sourceMappingURL=chunk-QUXMLLX5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wiki/notes-settings.ts"],"sourcesContent":["// Settings for the wiki notes inbox (#825), shared by\n// `agentx wiki notes config` and the dashboard's Schedules tab so both\n// apply the same checks to agentx.json.\n\nexport interface WikiNotesPatch {\n enabled?: boolean\n /** Agent that runs the wiki observe/sweep schedule. \"\" clears it. */\n inbox?: string\n /** Replace the list of schedules that read the inbox. */\n crons?: string[]\n maxNotesPerRun?: number\n maxDeferrals?: number\n}\n\nexport interface WikiNotesView {\n enabled: boolean\n inbox: string\n crons: string[]\n maxNotesPerRun: number\n maxDeferrals: number\n}\n\nconst ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:@-]*$/\n\n/** The current settings, with defaults filled in. */\nexport function wikiNotesSettings(raw: any): WikiNotesView {\n const n = raw && typeof raw === \"object\" ? raw : {}\n return {\n enabled: n.enabled === true,\n inbox: typeof n.inbox === \"string\" ? n.inbox : \"\",\n crons: Array.isArray(n.crons) ? n.crons.filter((c: unknown) => typeof c === \"string\") : [],\n maxNotesPerRun: Number.isInteger(n.maxNotesPerRun) ? n.maxNotesPerRun : 20,\n maxDeferrals: Number.isInteger(n.maxDeferrals) ? n.maxDeferrals : 3,\n }\n}\n\n/**\n * Apply `patch` to `cfg.wikiNotes` in place and say what changed. Throws a\n * message meant for a person when the result would not work.\n *\n * The inbox agent may live on another node (a node that only posts notes),\n * so it is not required to be in `cfg.agents`. A schedule listed in\n * `crons` must exist here and run as the inbox agent: that is the run\n * that reads the notes.\n */\nexport function patchWikiNotes(cfg: any, patch: WikiNotesPatch): string {\n const cur = { ...(cfg.wikiNotes && typeof cfg.wikiNotes === \"object\" ? cfg.wikiNotes : {}) }\n const changes: string[] = []\n\n if (patch.inbox !== undefined) {\n const inbox = String(patch.inbox).trim()\n if (inbox && !ID_RE.test(inbox)) throw new Error(`\"${inbox}\" is not an agent id`)\n if (inbox) cur.inbox = inbox\n else delete cur.inbox\n changes.push(inbox ? `inbox=${inbox}` : \"inbox cleared\")\n }\n if (patch.crons !== undefined) {\n const ids = [...new Set(patch.crons.map((c) => String(c).trim()).filter(Boolean))]\n cur.crons = ids\n changes.push(`crons=${ids.length ? ids.join(\",\") : \"none\"}`)\n }\n if (patch.maxNotesPerRun !== undefined) {\n const n = Number(patch.maxNotesPerRun)\n if (!Number.isInteger(n) || n < 1 || n > 100) throw new Error(\"max notes per run must be a whole number from 1 to 100\")\n cur.maxNotesPerRun = n\n changes.push(`maxNotesPerRun=${n}`)\n }\n if (patch.maxDeferrals !== undefined) {\n const n = Number(patch.maxDeferrals)\n if (!Number.isInteger(n) || n < 1 || n > 20) throw new Error(\"deferrals before a note expires must be a whole number from 1 to 20\")\n cur.maxDeferrals = n\n changes.push(`maxDeferrals=${n}`)\n }\n if (patch.enabled !== undefined) {\n cur.enabled = Boolean(patch.enabled)\n changes.push(cur.enabled ? \"on\" : \"off\")\n }\n if (changes.length === 0) throw new Error(\"nothing to update\")\n\n if (cur.enabled && !cur.inbox) {\n throw new Error(\"set the inbox agent first: the agent that runs the wiki observe/sweep schedule\")\n }\n for (const id of cur.crons ?? []) {\n const job = cfg.crons?.[id]\n if (!job) throw new Error(`no schedule \"${id}\" on this node`)\n if (cur.inbox && job.agent !== cur.inbox) {\n throw new Error(`schedule \"${id}\" runs as \"${job.agent}\", not the inbox agent \"${cur.inbox}\"`)\n }\n }\n\n cfg.wikiNotes = cur\n return `wiki notes updated (${changes.join(\", \")})`\n}\n"],"mappings":"AAsBA,IAAMA,EAAQ,iCAGP,SAASC,EAAkBC,EAAyB,CACzD,IAAM,EAAIA,GAAO,OAAOA,GAAQ,SAAWA,EAAM,CAAC,EAClD,MAAO,CACL,QAAS,EAAE,UAAY,GACvB,MAAO,OAAO,EAAE,OAAU,SAAW,EAAE,MAAQ,GAC/C,MAAO,MAAM,QAAQ,EAAE,KAAK,EAAI,EAAE,MAAM,OAAQC,GAAe,OAAOA,GAAM,QAAQ,EAAI,CAAC,EACzF,eAAgB,OAAO,UAAU,EAAE,cAAc,EAAI,EAAE,eAAiB,GACxE,aAAc,OAAO,UAAU,EAAE,YAAY,EAAI,EAAE,aAAe,CACpE,CACF,CAWO,SAASC,EAAeC,EAAUC,EAA+B,CACtE,IAAMC,EAAM,CAAE,GAAIF,EAAI,WAAa,OAAOA,EAAI,WAAc,SAAWA,EAAI,UAAY,CAAC,CAAG,EACrFG,EAAoB,CAAC,EAE3B,GAAIF,EAAM,QAAU,OAAW,CAC7B,IAAMG,EAAQ,OAAOH,EAAM,KAAK,EAAE,KAAK,EACvC,GAAIG,GAAS,CAACT,EAAM,KAAKS,CAAK,EAAG,MAAM,IAAI,MAAM,IAAIA,uBAA2B,EAC5EA,EAAOF,EAAI,MAAQE,EAClB,OAAOF,EAAI,MAChBC,EAAQ,KAAKC,EAAQ,SAASA,IAAU,eAAe,EAEzD,GAAIH,EAAM,QAAU,OAAW,CAC7B,IAAMI,EAAM,CAAC,GAAG,IAAI,IAAIJ,EAAM,MAAM,IAAKH,GAAM,OAAOA,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EACjFI,EAAI,MAAQG,EACZF,EAAQ,KAAK,SAASE,EAAI,OAASA,EAAI,KAAK,GAAG,EAAI,QAAQ,EAE7D,GAAIJ,EAAM,iBAAmB,OAAW,CACtC,IAAMK,EAAI,OAAOL,EAAM,cAAc,EACrC,GAAI,CAAC,OAAO,UAAUK,CAAC,GAAKA,EAAI,GAAKA,EAAI,IAAK,MAAM,IAAI,MAAM,wDAAwD,EACtHJ,EAAI,eAAiBI,EACrBH,EAAQ,KAAK,kBAAkBG,GAAG,EAEpC,GAAIL,EAAM,eAAiB,OAAW,CACpC,IAAMK,EAAI,OAAOL,EAAM,YAAY,EACnC,GAAI,CAAC,OAAO,UAAUK,CAAC,GAAKA,EAAI,GAAKA,EAAI,GAAI,MAAM,IAAI,MAAM,qEAAqE,EAClIJ,EAAI,aAAeI,EACnBH,EAAQ,KAAK,gBAAgBG,GAAG,EAMlC,GAJIL,EAAM,UAAY,SACpBC,EAAI,QAAU,EAAQD,EAAM,QAC5BE,EAAQ,KAAKD,EAAI,QAAU,KAAO,KAAK,GAErCC,EAAQ,SAAW,EAAG,MAAM,IAAI,MAAM,mBAAmB,EAE7D,GAAID,EAAI,SAAW,CAACA,EAAI,MACtB,MAAM,IAAI,MAAM,gFAAgF,EAElG,QAAWK,KAAML,EAAI,OAAS,CAAC,EAAG,CAChC,IAAMM,EAAMR,EAAI,QAAQO,CAAE,EAC1B,GAAI,CAACC,EAAK,MAAM,IAAI,MAAM,gBAAgBD,iBAAkB,EAC5D,GAAIL,EAAI,OAASM,EAAI,QAAUN,EAAI,MACjC,MAAM,IAAI,MAAM,aAAaK,eAAgBC,EAAI,gCAAgCN,EAAI,QAAQ,EAIjG,OAAAF,EAAI,UAAYE,EACT,uBAAuBC,EAAQ,KAAK,IAAI,IACjD","names":["ID_RE","wikiNotesSettings","raw","c","patchWikiNotes","cfg","patch","cur","changes","inbox","ids","n","id","job"]}