apt-mcp-agent-setup 3.3.4 → 3.5.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 (126) hide show
  1. package/README.md +6 -1
  2. package/bin/cli.js +1 -1
  3. package/bundle/NOTICES.md +0 -0
  4. package/bundle/core.enc +0 -0
  5. package/bundle/mcp-rules.enc +0 -0
  6. package/bundle/skills-aso.enc +0 -0
  7. package/bundle/skills-ba.enc +0 -0
  8. package/bundle/skills-base.enc +0 -0
  9. package/bundle/skills-be.enc +0 -0
  10. package/bundle/skills-design.enc +0 -0
  11. package/bundle/skills-fe.enc +0 -0
  12. package/bundle/skills-marketing.enc +0 -0
  13. package/bundle/skills-mobile.enc +0 -0
  14. package/bundle/skills-pm.enc +0 -0
  15. package/docs/apt-3.5.0-migration.md +37 -0
  16. package/docs/technical-sources-release-checklist.md +14 -0
  17. package/docs/technical-sources.md +125 -0
  18. package/docs/upstream-manifest.json +89 -0
  19. package/integrity-manifest.json +127 -106
  20. package/package.json +1 -1
  21. package/release-check.js +76 -71
  22. package/source-skills-lock.json +311 -0
  23. package/src/backends/browser-tools.js +1 -1
  24. package/src/backends/index-command.js +1 -1
  25. package/src/backends/index-store.js +1 -1
  26. package/src/backends/memory-2026.8.31.json +34 -34
  27. package/src/backends/profiles.js +1 -1
  28. package/src/core/admission-fence.js +1 -1
  29. package/src/core/aso-import.js +1 -1
  30. package/src/core/caller-context.js +1 -1
  31. package/src/core/catalog.js +1 -1
  32. package/src/core/claude-caller-authority.js +1 -1
  33. package/src/core/claude-invocation.js +1 -1
  34. package/src/core/claude-native.js +1 -1
  35. package/src/core/claude-plan.js +1 -0
  36. package/src/core/claude-worker-transcript.js +1 -1
  37. package/src/core/codex-host-metadata.js +1 -1
  38. package/src/core/codex-transcript-receipt.js +1 -1
  39. package/src/core/context-metrics.js +1 -1
  40. package/src/core/doctor.js +1 -1
  41. package/src/core/draining-completion.js +1 -1
  42. package/src/core/execution.js +1 -1
  43. package/src/core/git-context.js +1 -0
  44. package/src/core/hook-bridge.js +1 -1
  45. package/src/core/host-adapters.js +1 -1
  46. package/src/core/ipc-envelope.js +1 -1
  47. package/src/core/memory-scope.js +1 -0
  48. package/src/core/memory-store.js +1 -1
  49. package/src/core/model-inventory.js +1 -1
  50. package/src/core/model-routing.js +1 -1
  51. package/src/core/native-dispatch.js +1 -1
  52. package/src/core/node-version.js +1 -1
  53. package/src/core/npm-cli.js +1 -1
  54. package/src/core/owned-command-child.js +1 -0
  55. package/src/core/owned-command.js +1 -0
  56. package/src/core/owned-lock.js +1 -1
  57. package/src/core/owned-process.js +1 -0
  58. package/src/core/presentations.js +1 -1
  59. package/src/core/quality-artifacts.js +1 -1
  60. package/src/core/quality.js +1 -1
  61. package/src/core/read-command.js +1 -0
  62. package/src/core/readonly-skill.js +1 -0
  63. package/src/core/resource-transaction.js +1 -1
  64. package/src/core/run-compatibility.js +1 -1
  65. package/src/core/runtime-info.js +1 -1
  66. package/src/core/runtime-ownership.js +1 -1
  67. package/src/core/session.js +1 -1
  68. package/src/core/skill-companions.js +1 -1
  69. package/src/core/skill-names.js +1 -1
  70. package/src/core/storage-retry.js +1 -0
  71. package/src/core/tool-contracts.js +1 -1
  72. package/src/core/update-control.js +1 -1
  73. package/src/core/upgrade-runs.js +1 -0
  74. package/src/core/upgrade-stop.js +1 -0
  75. package/src/core/windows-job.js +1 -0
  76. package/src/core/windows-job.ps1 +75 -0
  77. package/src/core/workspace-generation.js +1 -1
  78. package/src/core/workspace-path.js +1 -1
  79. package/src/installer/bounded-command.js +1 -1
  80. package/src/installer/candidate-preflight.js +1 -1
  81. package/src/installer/connection-activation.js +1 -1
  82. package/src/installer/connection-supervisor.js +1 -1
  83. package/src/installer/deployment-draft.js +1 -1
  84. package/src/installer/gateway-context.js +1 -1
  85. package/src/installer/gateway-migration.js +1 -1
  86. package/src/installer/gateway-runtime.js +1 -1
  87. package/src/installer/global-setup.js +1 -1
  88. package/src/installer/hook-context-client.js +1 -1
  89. package/src/installer/hook-dispatcher.js +51 -51
  90. package/src/installer/host-hooks.js +1 -1
  91. package/src/installer/managed-config.js +1 -1
  92. package/src/installer/platform-config.js +1 -1
  93. package/src/installer/prerequisites.js +1 -1
  94. package/src/installer/presentations.js +1 -1
  95. package/src/installer/project-setup.js +1 -1
  96. package/src/installer/registration-closure.js +1 -0
  97. package/src/installer/registration-plan.js +1 -1
  98. package/src/installer/registration-receipt.js +1 -1
  99. package/src/installer/registrations.js +1 -1
  100. package/src/installer/runtime-activation.js +1 -1
  101. package/src/installer/runtime-child.js +1 -1
  102. package/src/installer/runtime-launcher.js +50 -50
  103. package/src/installer/runtime-lock.js +1 -1
  104. package/src/installer/runtime-store.js +1 -1
  105. package/src/installer/runtime-supervisor.js +1 -1
  106. package/src/installer/setup-wizard.js +1 -1
  107. package/src/installer/update-addons.js +1 -1
  108. package/src/installer/update-executor.js +1 -1
  109. package/src/installer/workspace-registry.js +1 -1
  110. package/src/installer/workspace-transaction.js +1 -1
  111. package/src/installer/workspace-update.js +1 -1
  112. package/src/license/crypto.js +1 -1
  113. package/src/license/fingerprint.js +1 -1
  114. package/src/license/terms.js +1 -1
  115. package/src/license/verify.js +1 -1
  116. package/src/presets/index.js +1 -1
  117. package/src/proxy/backends.js +1 -1
  118. package/src/proxy/browser-sessions.js +1 -1
  119. package/src/proxy/core-tools.js +1 -1
  120. package/src/proxy/pipeline.js +1 -1
  121. package/src/proxy/public-catalog.js +1 -1
  122. package/src/proxy/router.config.js +1 -1
  123. package/src/proxy/router.js +1 -1
  124. package/src/proxy/server.js +1 -1
  125. package/src/proxy/workspace-gateway.js +1 -1
  126. package/technical-sources-check.js +249 -0
@@ -1 +1 @@
1
- 'use strict';const _0x4391ee=_0x5b47;(function(_0x2eeb5d,_0x5b1762){const _0x4c28c1=_0x5b47,_0x1de7c0=_0x2eeb5d();while(!![]){try{const _0x4b78a2=-parseInt(_0x4c28c1(0x19c))/0x1*(-parseInt(_0x4c28c1(0x15b))/0x2)+parseInt(_0x4c28c1(0x176))/0x3+parseInt(_0x4c28c1(0x13f))/0x4+parseInt(_0x4c28c1(0x161))/0x5+parseInt(_0x4c28c1(0x157))/0x6*(parseInt(_0x4c28c1(0x164))/0x7)+parseInt(_0x4c28c1(0x162))/0x8*(-parseInt(_0x4c28c1(0x1a1))/0x9)+-parseInt(_0x4c28c1(0x16d))/0xa;if(_0x4b78a2===_0x5b1762)break;else _0x1de7c0['push'](_0x1de7c0['shift']());}catch(_0x3f3a1a){_0x1de7c0['push'](_0x1de7c0['shift']());}}}(_0x2fce,0xb65a4));const crypto=require(_0x4391ee(0x197)),{WorkspaceRegistry}=require(_0x4391ee(0x14d)),{gatewayCatalog}=require('./public-catalog'),{sameWorkspace}=require(_0x4391ee(0x1ba)),contracts=require(_0x4391ee(0x1ac)),fail=(_0x1b3d74,_0x5dce5d=_0x1b3d74)=>{const _0x5c5d31=_0x4391ee,_0x2b1eac={};_0x2b1eac[_0x5c5d31(0x140)]=_0x1b3d74;throw Object[_0x5c5d31(0x18d)](new Error(_0x5dce5d),_0x2b1eac);},content=_0x38c219=>({'content':[{'type':'text','text':JSON[_0x4391ee(0x179)](_0x38c219)}]});function _0x5b47(_0x2ab5dd,_0x2529d6){_0x2ab5dd=_0x2ab5dd-0x12d;const _0x2fce1e=_0x2fce();let _0x5b470d=_0x2fce1e[_0x2ab5dd];if(_0x5b47['mLOScd']===undefined){var _0x37b3ca=function(_0x46d994){const _0x415cff='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x177821='',_0x2a7652='';for(let _0xe8d231=0x0,_0x53d0a3,_0x31b82c,_0x18981b=0x0;_0x31b82c=_0x46d994['charAt'](_0x18981b++);~_0x31b82c&&(_0x53d0a3=_0xe8d231%0x4?_0x53d0a3*0x40+_0x31b82c:_0x31b82c,_0xe8d231++%0x4)?_0x177821+=String['fromCharCode'](0xff&_0x53d0a3>>(-0x2*_0xe8d231&0x6)):0x0){_0x31b82c=_0x415cff['indexOf'](_0x31b82c);}for(let _0xd2502f=0x0,_0x30693a=_0x177821['length'];_0xd2502f<_0x30693a;_0xd2502f++){_0x2a7652+='%'+('00'+_0x177821['charCodeAt'](_0xd2502f)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2a7652);};_0x5b47['Wnktdm']=_0x37b3ca,_0x5b47['dxqkFM']={},_0x5b47['mLOScd']=!![];}const _0x1017e6=_0x2fce1e[0x0],_0x4ab4ff=_0x2ab5dd+_0x1017e6,_0x205d10=_0x5b47['dxqkFM'][_0x4ab4ff];return!_0x205d10?(_0x5b470d=_0x5b47['Wnktdm'](_0x5b470d),_0x5b47['dxqkFM'][_0x4ab4ff]=_0x5b470d):_0x5b470d=_0x205d10,_0x5b470d;}function validateIdentity(_0x28e439){const _0x1920c7=_0x4391ee,_0x414ec5={};_0x414ec5[_0x1920c7(0x138)]=contracts[_0x1920c7(0x138)],_0x414ec5[_0x1920c7(0x1a3)]=contracts[_0x1920c7(0x1a3)],_0x414ec5[_0x1920c7(0x137)]=contracts[_0x1920c7(0x137)],_0x414ec5['runId']=contracts[_0x1920c7(0x1a7)];for(const [_0x2eece0,_0x2ff09f]of Object[_0x1920c7(0x159)](_0x414ec5)){if(_0x28e439[_0x2eece0]===undefined)continue;const _0x3e23b5=_0x28e439[_0x2eece0];if(typeof _0x3e23b5!==_0x1920c7(0x165)||!_0x3e23b5[_0x1920c7(0x1b7)]()||_0x3e23b5[_0x1920c7(0x18a)]>_0x2ff09f['maxLength']||_0x2ff09f[_0x1920c7(0x13b)]&&!new RegExp(_0x2ff09f[_0x1920c7(0x13b)])['test'](_0x3e23b5))fail(_0x1920c7(0x14f)+_0x2eece0[_0x1920c7(0x16a)](/([a-z])([A-Z])/g,_0x1920c7(0x14c))[_0x1920c7(0x1a8)](),_0x2ff09f[_0x1920c7(0x163)]);}}class WorkspaceGateway{constructor(_0x28fe13={}){const _0x5f47c3=_0x4391ee;this[_0x5f47c3(0x16c)]=_0x28fe13['registry']||new WorkspaceRegistry(),this['runtimeFactory']=_0x28fe13[_0x5f47c3(0x130)],this[_0x5f47c3(0x17a)]=_0x28fe13[_0x5f47c3(0x17a)]||null,this['connectionId']=_0x28fe13['connectionId']||crypto['randomUUID'](),this['sessions']=new Map(),this[_0x5f47c3(0x151)]=new Map(),this[_0x5f47c3(0x1a4)]=new Map(),this[_0x5f47c3(0x184)]=gatewayCatalog(),this[_0x5f47c3(0x16b)]=_0x28fe13[_0x5f47c3(0x16b)]||(()=>{}),this['initialize']=null,this[_0x5f47c3(0x1a0)]=![];}async[_0x4391ee(0x194)](_0x2e8f27){const _0x241f3c=_0x4391ee;if(!_0x2e8f27[_0x241f3c(0x138)])fail('SESSION_ID_REQUIRED',_0x241f3c(0x1b2));const _0x4beead=this[_0x241f3c(0x14b)][_0x241f3c(0x152)](_0x2e8f27[_0x241f3c(0x138)]);if(_0x4beead&&!_0x2e8f27[_0x241f3c(0x149)]&&!_0x2e8f27[_0x241f3c(0x17c)])return _0x4beead;const _0x3e8490=this[_0x241f3c(0x151)]['get'](_0x2e8f27[_0x241f3c(0x138)]);if(_0x3e8490&&!_0x2e8f27[_0x241f3c(0x149)]&&!_0x2e8f27['workspacePath'])return _0x3e8490[_0x241f3c(0x144)];const _0x24364f=this[_0x241f3c(0x16c)][_0x241f3c(0x13a)](_0x2e8f27,{'host':this[_0x241f3c(0x17a)]});if(_0x2e8f27[_0x241f3c(0x1af)])this[_0x241f3c(0x175)](_0x2e8f27['bindingToken'],_0x24364f[_0x241f3c(0x149)]);if(_0x4beead){if(!sameWorkspace(_0x24364f[_0x241f3c(0x173)],_0x4beead[_0x241f3c(0x173)]))fail('WORKSPACE_BINDING_CONFLICT');return _0x4beead;}if(this['initializing'][_0x241f3c(0x192)](_0x2e8f27[_0x241f3c(0x138)])){const _0x48c0b0=this[_0x241f3c(0x151)][_0x241f3c(0x152)](_0x2e8f27['sessionId']);if(!sameWorkspace(_0x48c0b0[_0x241f3c(0x173)],_0x24364f[_0x241f3c(0x173)]))fail('WORKSPACE_BINDING_CONFLICT');return _0x48c0b0[_0x241f3c(0x144)];}const _0x94cb92={};_0x94cb92[_0x241f3c(0x16f)]=this[_0x241f3c(0x16f)],_0x94cb92['sessionId']=_0x2e8f27['sessionId'],_0x94cb92['workspace']=_0x24364f[_0x241f3c(0x173)],_0x94cb92[_0x241f3c(0x149)]=_0x24364f['workspaceId'],_0x94cb92[_0x241f3c(0x1b1)]=_0x241f3c(0x15f),_0x94cb92['provenance']='caller-selected',_0x94cb92[_0x241f3c(0x133)]=_0x241f3c(0x167);const _0x543bf6=_0x94cb92,_0xc9c23e=((async()=>{const _0x44d2c7=_0x241f3c;if(typeof this[_0x44d2c7(0x130)]!=='function')fail(_0x44d2c7(0x160));const _0x181dac=_0x24364f['profiles']?.[this[_0x44d2c7(0x17a)]]||{},_0x533c5d=await this[_0x44d2c7(0x130)](_0x543bf6,this[_0x44d2c7(0x18f)]||{},_0x181dac);this['stopped']&&(await _0x533c5d[_0x44d2c7(0x17b)](),fail('GATEWAY_CLOSED'));const _0x3f569c={..._0x543bf6};_0x3f569c[_0x44d2c7(0x19a)]=_0x533c5d,_0x3f569c[_0x44d2c7(0x143)]=_0x181dac;const _0x59cb1b=_0x3f569c;return this[_0x44d2c7(0x14b)][_0x44d2c7(0x17f)](_0x2e8f27['sessionId'],_0x59cb1b),_0x59cb1b;})()),_0x25655c={};_0x25655c[_0x241f3c(0x173)]=_0x24364f[_0x241f3c(0x173)],_0x25655c[_0x241f3c(0x144)]=_0xc9c23e,this[_0x241f3c(0x151)][_0x241f3c(0x17f)](_0x2e8f27['sessionId'],_0x25655c);try{return await _0xc9c23e;}finally{this['initializing'][_0x241f3c(0x12f)](_0x2e8f27[_0x241f3c(0x138)]);}}[_0x4391ee(0x1b9)](_0x1499ea){const _0x9dc846=_0x4391ee;for(const [_0x10fc71,_0x1052b1]of this[_0x9dc846(0x1a4)])if(_0x1052b1[_0x9dc846(0x177)]<Date[_0x9dc846(0x153)]())this[_0x9dc846(0x1a4)][_0x9dc846(0x12f)](_0x10fc71);if(this[_0x9dc846(0x1a4)]['size']>=0x1000)fail(_0x9dc846(0x172));const _0x2b612a=this[_0x9dc846(0x16f)]+'.'+crypto[_0x9dc846(0x187)](0x20)[_0x9dc846(0x1a9)]('base64url');this[_0x9dc846(0x1a4)][_0x9dc846(0x17f)](_0x2b612a,{'workspaceId':_0x1499ea[_0x9dc846(0x149)],'expiresAt':Date[_0x9dc846(0x153)]()+0xdbba0});const _0x81c83c={};return _0x81c83c[_0x9dc846(0x149)]=_0x1499ea[_0x9dc846(0x149)],_0x81c83c['workspace']=_0x1499ea[_0x9dc846(0x173)],_0x81c83c[_0x9dc846(0x1af)]=_0x2b612a,_0x81c83c;}[_0x4391ee(0x175)](_0x66c9e0,_0x2ffb31){const _0xf40198=_0x4391ee,_0x505669=this[_0xf40198(0x1a4)][_0xf40198(0x152)](_0x66c9e0);if(!_0x505669||_0x505669[_0xf40198(0x177)]<Date[_0xf40198(0x153)]()||_0x505669[_0xf40198(0x149)]!==_0x2ffb31)fail(_0xf40198(0x148),'Call\x20workspace_list\x20on\x20this\x20connection\x20and\x20use\x20its\x20current\x20bindingToken.');return _0x505669;}[_0x4391ee(0x1b0)](_0x12f994){const _0x2dabfd=_0x4391ee;let _0x48d20c;if(_0x12f994[_0x2dabfd(0x138)])_0x48d20c=this['sessions'][_0x2dabfd(0x152)](_0x12f994[_0x2dabfd(0x138)]);else{if(this[_0x2dabfd(0x14b)][_0x2dabfd(0x12d)]===0x1)_0x48d20c=this[_0x2dabfd(0x14b)][_0x2dabfd(0x19d)]()[_0x2dabfd(0x14a)]()[_0x2dabfd(0x188)];else{if(this['sessions']['size']>0x1)fail(_0x2dabfd(0x131),_0x2dabfd(0x15d));}}if(!_0x48d20c)fail(_0x2dabfd(0x1b4),_0x2dabfd(0x135));if(_0x12f994['workspaceId']||_0x12f994[_0x2dabfd(0x17c)]){const _0x45497b=this['registry'][_0x2dabfd(0x13a)](_0x12f994,{'host':this[_0x2dabfd(0x17a)]});if(!sameWorkspace(_0x45497b[_0x2dabfd(0x173)],_0x48d20c[_0x2dabfd(0x173)]))fail('WORKSPACE_BINDING_CONFLICT');}if(_0x12f994[_0x2dabfd(0x147)]&&!sameWorkspace(_0x12f994[_0x2dabfd(0x147)],_0x48d20c[_0x2dabfd(0x173)]))fail(_0x2dabfd(0x1aa));return _0x48d20c;}async[_0x4391ee(0x13c)](_0x27fdd4){const _0x318ed3=_0x4391ee;if(this['stopped'])fail('GATEWAY_CLOSED');const {id:_0x139945,method:_0x3455fa,params:params={}}=_0x27fdd4,_0x3f348c=_0x51a532=>({'jsonrpc':_0x318ed3(0x142),'id':_0x139945,'result':_0x51a532});if(_0x3455fa===_0x318ed3(0x18f)||_0x3455fa===_0x318ed3(0x18c)){const _0x4327de=[_0x318ed3(0x1ab),_0x318ed3(0x16e),_0x318ed3(0x195),_0x318ed3(0x14e)],_0x38562b=_0x4327de[_0x318ed3(0x17e)](params[_0x318ed3(0x1b3)])?params['protocolVersion']:_0x4327de['at'](-0x1),_0x267afb={...params};_0x267afb[_0x318ed3(0x1b3)]=_0x38562b,this['initialize']=_0x267afb;const _0x296027={};_0x296027['listChanged']=!![];const _0x332c2f={};return _0x332c2f[_0x318ed3(0x178)]=_0x296027,_0x3f348c({'protocolVersion':_0x38562b,'capabilities':_0x332c2f,'serverInfo':{'name':_0x318ed3(0x15f),'version':require(_0x318ed3(0x1b6))['version']},'instructions':_0x318ed3(0x171)});}if(_0x3455fa===_0x318ed3(0x155))return _0x3f348c({'tools':structuredClone(this[_0x318ed3(0x184)])});if(_0x3455fa==='ping')return _0x3f348c({});if(_0x3455fa===_0x318ed3(0x193))return null;const _0xf44552={};_0xf44552['code']=-0x7f59,_0xf44552['message']=_0x318ed3(0x169);if(_0x3455fa!==_0x318ed3(0x145))return _0x139945===undefined?null:{'jsonrpc':_0x318ed3(0x142),'id':_0x139945,'error':_0xf44552};try{const _0x174843=params[_0x318ed3(0x146)]||{};if(Array[_0x318ed3(0x141)](_0x174843)||typeof _0x174843!==_0x318ed3(0x174))fail('INVALID_ARGUMENTS');validateIdentity(_0x174843);if(params['name']!=='workspace_list'&&params[_0x318ed3(0x13e)]!==_0x318ed3(0x1ae)&&require(_0x318ed3(0x158))[_0x318ed3(0x18b)](params[_0x318ed3(0x13e)])&&!_0x174843[_0x318ed3(0x138)])fail(_0x318ed3(0x1a6),_0x318ed3(0x186));const _0x3264f4=this['catalog'][_0x318ed3(0x185)](_0x348947=>_0x348947[_0x318ed3(0x13e)]===params[_0x318ed3(0x13e)]);if(!_0x3264f4){const _0x293176=require(_0x318ed3(0x150))['mapExposedToOriginal'](params[_0x318ed3(0x13e)]);if(_0x293176&&_0x293176['backend']!==_0x318ed3(0x180)){const _0x4ac2cf={};_0x4ac2cf[_0x318ed3(0x18e)]=_0x293176[_0x318ed3(0x18e)],_0x4ac2cf[_0x318ed3(0x138)]=_0x174843[_0x318ed3(0x138)];const _0x52bf32={};_0x52bf32['tool']=_0x318ed3(0x1ae),_0x52bf32[_0x318ed3(0x146)]=_0x4ac2cf;const _0x782f2f={};_0x782f2f['code']=_0x318ed3(0x196),_0x782f2f['recovery']=_0x52bf32;const _0x160601=Object['assign'](new Error(_0x318ed3(0x191)),_0x782f2f);throw _0x160601;}fail(_0x318ed3(0x190),'This\x20gateway\x20has\x20no\x20verified\x20catalog\x20for\x20that\x20tool.');}if(params[_0x318ed3(0x13e)]===_0x318ed3(0x199))return _0x3f348c(content({'workspaces':this[_0x318ed3(0x16c)][_0x318ed3(0x15a)]()[_0x318ed3(0x12e)](_0x112852=>!this[_0x318ed3(0x17a)]||_0x112852['hosts'][_0x318ed3(0x17e)](this[_0x318ed3(0x17a)]))['map'](_0x30eb2b=>this[_0x318ed3(0x1b9)](_0x30eb2b)),'connectionId':this['connectionId']}));if(params[_0x318ed3(0x13e)]===_0x318ed3(0x1ae)&&!_0x174843[_0x318ed3(0x138)]&&!_0x174843['backend'])return _0x3f348c(content({'registration':_0x318ed3(0x15f),'connectionId':this['connectionId'],'boundSessions':this[_0x318ed3(0x14b)][_0x318ed3(0x12d)],'backendsStartedByDiscovery':0x0,'serving':'gateway','version':require('../../package.json')[_0x318ed3(0x19b)]}));for(const _0x45edcf of _0x3264f4['inputSchema'][_0x318ed3(0x156)]||[])if(_0x174843[_0x45edcf]===undefined&&_0x45edcf!==_0x318ed3(0x138))fail(_0x318ed3(0x17d)+_0x45edcf[_0x318ed3(0x16a)](/([a-z])([A-Z])/g,_0x318ed3(0x14c))['toUpperCase'](),_0x318ed3(0x1a5)+_0x45edcf+'.');const _0x3fba03=params[_0x318ed3(0x13e)]===_0x318ed3(0x136)?await this[_0x318ed3(0x194)](_0x174843):this[_0x318ed3(0x1b0)](_0x174843);if(_0x3fba03[_0x318ed3(0x143)]?.[_0x318ed3(0x178)]?.[params[_0x318ed3(0x13e)]]?.['enabled']===![])fail(_0x318ed3(0x198));const _0x2e4ecb={..._0x174843};_0x2e4ecb[_0x318ed3(0x138)]=_0x3fba03['sessionId'];const _0x49ca92=_0x2e4ecb,_0x4f6fc6={...params};_0x4f6fc6[_0x318ed3(0x146)]=_0x49ca92;const _0x429698={..._0x27fdd4};_0x429698['params']=_0x4f6fc6;const _0x352172=await _0x3fba03[_0x318ed3(0x19a)][_0x318ed3(0x1b5)](_0x429698);if(params[_0x318ed3(0x13e)]===_0x318ed3(0x1ae)&&_0x174843[_0x318ed3(0x18e)]&&!_0x352172[_0x318ed3(0x183)]){const _0x397764={};_0x397764[_0x318ed3(0x132)]=_0x318ed3(0x155),_0x397764[_0x318ed3(0x189)]={};const _0x473ac1=await _0x3fba03[_0x318ed3(0x19a)][_0x318ed3(0x1b5)](_0x397764);let _0x4e7a2b=![];for(const _0x338df1 of _0x473ac1[_0x318ed3(0x178)]||[]){if(require('./router')[_0x318ed3(0x181)](_0x338df1[_0x318ed3(0x13e)])?.[_0x318ed3(0x18e)]!==_0x174843[_0x318ed3(0x18e)])continue;const _0x30aef6=require(_0x318ed3(0x15c))[_0x318ed3(0x1ad)](structuredClone(_0x338df1)),_0x186f5c=this[_0x318ed3(0x184)][_0x318ed3(0x185)](_0x175ba1=>_0x175ba1[_0x318ed3(0x13e)]===_0x30aef6['name']);if(_0x186f5c&&JSON[_0x318ed3(0x179)](_0x186f5c[_0x318ed3(0x1a2)])!==JSON[_0x318ed3(0x179)](_0x30aef6['inputSchema']))fail(_0x318ed3(0x15e));!_0x186f5c&&(this[_0x318ed3(0x184)]['push'](_0x30aef6),_0x4e7a2b=!![]);}if(_0x4e7a2b)this[_0x318ed3(0x16b)]();}return _0x3f348c(_0x352172);}catch(_0x26294b){const _0x2dfb69={};return _0x2dfb69[_0x318ed3(0x166)]=_0x318ed3(0x199),_0x2dfb69[_0x318ed3(0x182)]=_0x318ed3(0x136),_0x2dfb69[_0x318ed3(0x156)]=[_0x318ed3(0x138),'workspaceId'],_0x3f348c({...content({'success':![],'code':_0x26294b[_0x318ed3(0x140)]||'GATEWAY_REQUEST_FAILED','error':_0x26294b['message'],'recovery':_0x26294b[_0x318ed3(0x134)]||([_0x318ed3(0x1b4),_0x318ed3(0x131),'WORKSPACE_NOT_REGISTERED']['includes'](_0x26294b['code'])?_0x2dfb69:undefined)}),'isError':!![]});}}async[_0x4391ee(0x17b)](){const _0x3fa77b=_0x4391ee;this[_0x3fa77b(0x1a0)]=!![],await Promise[_0x3fa77b(0x170)]([...this[_0x3fa77b(0x151)][_0x3fa77b(0x19d)]()][_0x3fa77b(0x139)](_0x199972=>_0x199972[_0x3fa77b(0x144)]));const _0x1fca88=await Promise['allSettled']([...this['sessions'][_0x3fa77b(0x19d)]()][_0x3fa77b(0x139)](_0x2b338d=>_0x2b338d['runtime'][_0x3fa77b(0x17b)]())),_0x544d8d=_0x1fca88[_0x3fa77b(0x185)](_0x351a53=>_0x351a53[_0x3fa77b(0x154)]===_0x3fa77b(0x13d));if(_0x544d8d)throw _0x544d8d[_0x3fa77b(0x168)];this[_0x3fa77b(0x14b)][_0x3fa77b(0x19e)]();}}function _0x2fce(){const _0x38dbee=['AgfUzgXL','CMvQzwn0zwq','BMfTzq','mJa2mJi2nfbrr0Xcta','y29Kzq','AxnbCNjHEq','mI4W','ChjVzMLSzq','ChjVBwLZzq','Dg9VBhmVy2fSBa','yxjNDw1LBNrZ','ChjVAMvJDfbHDgG','r0furvDbwv9truXfq1rjt05FuKvrvuLsruq','D29YA3nWywnLswq','BMv4Da','C2vZC2LVBNm','jdfFjdi','lI4VAw5ZDgfSBgvYl3DVCMTZCgfJzs1YzwDPC3rYEq','mJaYns0Xms0Ynq','su5wquXjrf8','lI9YB3v0zxi','Aw5PDgLHBgL6Aw5N','z2v0','BM93','C3rHDhvZ','Dg9VBhmVBgLZDa','CMvXDwLYzwq','nZe0ody0sMHeENny','lI4Vy29Yzs9JywXSzxiTy29UDgv4Da','zw50CMLLCW','BgLZDa','nZK4swDjvg1p','lI9WDwjSAwmTy2f0ywXVzW','ugfZCYbZzxnZAw9Uswq7ihrOAxmGy29UBMvJDgLVBIbZzxj2zxmGBxvSDgLWBguGChjVAMvJDcbZzxnZAw9UCY4','q0fuquXpr19tq0HftufFq09orKXjq1q','yxb0lw1JCc1Hz2vUDa','r0furvDbwv9svu5usu1fx1voqvzbsuXbqKXf','mZm5nte1yKD3s2Lu','nZjPuwfLwxu','zgvZy3jPChrPB24','ntzoDfzcwxO','C3rYAw5N','Dg9VBa','Dw5JB25MAxjTzwq','CMvHC29U','twv0Ag9Kig5VDcbMB3vUza','CMvWBgfJzq','B25dyxrHBg9Nq2HHBMDLza','CMvNAxn0CNK','mtu1nZGZmdbrqLLougG','mJaYns0WmY0YnG','y29UBMvJDgLVBKLK','ywXSu2v0DgXLza','t25LiefqvcbNyxrLD2f5ihnLCNzLCYbPBNn0ywXSzwqGChjVAMvJDhmUienHBgWGD29YA3nWywnLx2XPC3qSihrOzw4GC2vZC2LVBL9IB290C3rYyxaGD2L0Acb5B3vYihnLC3nPB25jzcbHBMqGDgHLihbYB2PLy3qGD29YA3nWywnLswqUiefSD2f5CYbWyxnZihrOyxqGC2vZC2LVBKLKig9Uihn1yNnLCxvLBNqGy2fSBhmUie5LDMvYigjPBMqGAg9TzsbVCIbZzwXLy3qGysbWCM9Qzwn0igzYB20GCMvJzw5JEs4','r0furvDbwv9truXfq1rjt05FteLnsvq','D29YA3nWywnL','B2jQzwn0','DMvYAwz5u2vSzwn0Aw9U','mti4odm4m0jusg91vq','zxHWAxjLC0f0','Dg9VBhm','C3rYAw5NAwz5','Ag9ZDa','y2XVC2u','D29YA3nWywnLugf0Aa','tuLtu0Lor18','Aw5JBhvKzxm','C2v0','x2j1AwX0Aw4','BwfWrxHWB3nLzfrVt3jPz2LUywW','DgHLBG','AxnfCNjVCG','y2f0ywXVzW','zMLUza','txv0yxrPB25ZihjLCxvPCMuGDgHLigv4CgXPy2L0BhKGyM91BMqGC2vZC2LVBKLKlG','CMfUzg9TqNL0zxm','DMfSDwu','CgfYyw1Z','BgvUz3rO','C2vUC2L0AxzLvg9VBa','C2vYDMvYl2rPC2nVDMvY','yxnZAwDU','yMfJA2vUza','Aw5PDgLHBgL6zq','ve9ptf9ot1rFqvzbsuXbqKXf','vgHPCYbHzgrVBIbUzwvKCYbPBNrLBNrPB25HBcbJyxrHBg9NigrPC2nVDMvYEtSGy2fSBcbTy3bFywDLBNrFAgvHBhrOihDPDgGGAxrZigjHy2TLBMqGyw5KihnLC3nPB25jzc4','AgfZ','BM90AwzPy2f0Aw9UCY9PBML0AwfSAxPLza','yMLUza','mJaYns0WnI0Xoa','qKfds0vorf9dqvrbte9hx0rju0npvKvswv9srvfvsvjfra','BM9KztPJCNLWDg8','ufjpsKvdvf9ut09mx0rju0fcteve','D29YA3nWywnLx2XPC3q','CNvUDgLTzq','DMvYC2LVBG','mtK2oxzesxLOtG','DMfSDwvZ','y2XLyxi','v29YA3nWywnLr2f0zxDHEq','C3rVChbLza','ndq2oty3rMPhzgPz','Aw5WDxrty2HLBwe','CMvXDwvZDeLK','yMLUzgLUz1nLBgvJDgLVBNm','uMvXDwLYzwqGzMLLBgq6ia','u0vtu0LptL9jrf9srvfvsvjfra','CNvUswq','Dg9vChbLCKnHC2u','Dg9tDhjPBMC','v09ss1nqqunfx0jjtKrjtKDFq09orKXjq1q','mJaYnc0Xms0Wnq','lI4Vy29Yzs90B29SlwnVBNrYywn0CW','zgvJB3jHDgvhyxrLD2f5vg9VBa','BwnWx2fNzw50x2HLywX0Aa','yMLUzgLUz1rVA2vU','C2vSzwn0zwq','CMvNAxn0CMf0Aw9U','ugfZCYb0AguGC2fTzsbUB25LBxb0EsbZzxnZAw9UswqGDgHYB3vNAg91Dcb0AgLZignOyxqU','ChjVDg9JB2XwzxjZAw9U','v09ss1nqqunfx0jjtKrjtKDFuKvrvuLsruq','CMvXDwvZDa','lI4VlI4VCgfJA2fNzs5QC29U','DhjPBq','DMfSAwrHDgvjzgvUDgL0Eq','C2vSzwn0Aw9U','lI4Vy29Yzs93B3jRC3bHy2uTCgf0Aa','C2L6zq','zMLSDgvY','zgvSzxrL','CNvUDgLTzuzHy3rVCNK','v09ss1nqqunfx0fnqKLhvu9vuW','Bwv0Ag9K','BMf0AxzLswrLBNrPDhK','CMvJB3zLCNK','q2fSBcb3B3jRC3bHy2vFBgLZDcWGDgHLBIbZzxnZAw9Ux2jVB3rZDhjHCcb3AxrOihnLC3nPB25jzcbHBMqGD29YA3nWywnLswqU','C2vZC2LVBL9IB290C3rYyxa','DgfZAW','C2vZC2LVBKLK','BwfW','CMvZB2X2zq','Cgf0DgvYBG'];_0x2fce=function(){return _0x38dbee;};return _0x2fce();}const _0x3c0489={};_0x3c0489[_0x4391ee(0x19f)]=WorkspaceGateway,_0x3c0489[_0x4391ee(0x1b8)]=validateIdentity,module['exports']=_0x3c0489;
1
+ 'use strict';const _0x58473b=_0x4da0;(function(_0x24ff31,_0x4a2c95){const _0x5e1a8d=_0x4da0,_0x47b056=_0x24ff31();while(!![]){try{const _0x5b3097=-parseInt(_0x5e1a8d(0x196))/0x1+-parseInt(_0x5e1a8d(0x144))/0x2+-parseInt(_0x5e1a8d(0x18e))/0x3*(parseInt(_0x5e1a8d(0x15a))/0x4)+parseInt(_0x5e1a8d(0x19d))/0x5+-parseInt(_0x5e1a8d(0x1a0))/0x6+-parseInt(_0x5e1a8d(0x112))/0x7+parseInt(_0x5e1a8d(0x128))/0x8;if(_0x5b3097===_0x4a2c95)break;else _0x47b056['push'](_0x47b056['shift']());}catch(_0x189a9b){_0x47b056['push'](_0x47b056['shift']());}}}(_0x4d45,0x74b48));const crypto=require(_0x58473b(0x138)),{WorkspaceRegistry}=require(_0x58473b(0x148)),{gatewayCatalog}=require('./public-catalog'),{sameWorkspace}=require(_0x58473b(0x122)),contracts=require(_0x58473b(0x181)),fail=(_0xecff70,_0x122531=_0xecff70)=>{const _0x5e38be={};_0x5e38be['code']=_0xecff70;throw Object['assign'](new Error(_0x122531),_0x5e38be);},content=_0x1c5e16=>({'content':[{'type':_0x58473b(0x163),'text':JSON['stringify'](_0x1c5e16)}]});function validateIdentity(_0x281cb8){const _0x30cf8b=_0x58473b,_0x61dee6={};_0x61dee6[_0x30cf8b(0x191)]=contracts['sessionId'],_0x61dee6[_0x30cf8b(0x124)]=contracts[_0x30cf8b(0x124)],_0x61dee6[_0x30cf8b(0x140)]=contracts[_0x30cf8b(0x140)],_0x61dee6[_0x30cf8b(0x125)]=contracts['runId'];for(const [_0x3d876c,_0x36c9f8]of Object[_0x30cf8b(0x120)](_0x61dee6)){if(_0x281cb8[_0x3d876c]===undefined)continue;const _0x2cfb84=_0x281cb8[_0x3d876c];if(typeof _0x2cfb84!==_0x30cf8b(0x141)||!_0x2cfb84[_0x30cf8b(0x15c)]()||_0x2cfb84[_0x30cf8b(0x11c)]>_0x36c9f8[_0x30cf8b(0x12a)]||_0x36c9f8[_0x30cf8b(0x158)]&&!new RegExp(_0x36c9f8[_0x30cf8b(0x158)])['test'](_0x2cfb84))fail(_0x30cf8b(0x154)+_0x3d876c[_0x30cf8b(0x16a)](/([a-z])([A-Z])/g,_0x30cf8b(0x171))['toUpperCase'](),_0x36c9f8['description']);}}class WorkspaceGateway{constructor(_0xc18951={}){const _0x185f21=_0x58473b;this[_0x185f21(0x19f)]=_0xc18951[_0x185f21(0x19f)]||new WorkspaceRegistry(),this['runtimeFactory']=_0xc18951[_0x185f21(0x190)],this[_0x185f21(0x17a)]=_0xc18951[_0x185f21(0x17a)]||null,this['connectionId']=_0xc18951['connectionId']||crypto['randomUUID'](),this[_0x185f21(0x117)]=new Map(),this[_0x185f21(0x14b)]=new Map(),this[_0x185f21(0x127)]=new Map(),this[_0x185f21(0x151)]=gatewayCatalog(),this[_0x185f21(0x17f)]=_0xc18951[_0x185f21(0x17f)]||(()=>{}),this[_0x185f21(0x14c)]=null,this[_0x185f21(0x193)]=![];}async[_0x58473b(0x134)](_0x4549f5){const _0x13ceed=_0x58473b;if(!_0x4549f5[_0x13ceed(0x191)])fail(_0x13ceed(0x165),_0x13ceed(0x152));const _0x11e063=this[_0x13ceed(0x117)][_0x13ceed(0x13e)](_0x4549f5['sessionId']);if(_0x11e063&&!_0x4549f5['workspaceId']&&!_0x4549f5['workspacePath'])return _0x11e063;const _0x1416ef=this['initializing'][_0x13ceed(0x13e)](_0x4549f5[_0x13ceed(0x191)]);if(_0x1416ef&&!_0x4549f5[_0x13ceed(0x186)]&&!_0x4549f5[_0x13ceed(0x15d)])return _0x1416ef['promise'];const _0x577a60=this['registry']['resolve'](_0x4549f5,{'host':this[_0x13ceed(0x17a)]});if(_0x4549f5[_0x13ceed(0x142)])this['verifySelection'](_0x4549f5[_0x13ceed(0x142)],_0x577a60[_0x13ceed(0x186)]);if(_0x11e063){if(!sameWorkspace(_0x577a60[_0x13ceed(0x17d)],_0x11e063[_0x13ceed(0x17d)]))fail('WORKSPACE_BINDING_CONFLICT');return _0x11e063;}if(this[_0x13ceed(0x14b)][_0x13ceed(0x139)](_0x4549f5[_0x13ceed(0x191)])){const _0x14feab=this[_0x13ceed(0x14b)]['get'](_0x4549f5[_0x13ceed(0x191)]);if(!sameWorkspace(_0x14feab[_0x13ceed(0x17d)],_0x577a60[_0x13ceed(0x17d)]))fail(_0x13ceed(0x199));return _0x14feab[_0x13ceed(0x143)];}const _0x505421={};_0x505421['connectionId']=this[_0x13ceed(0x132)],_0x505421[_0x13ceed(0x191)]=_0x4549f5[_0x13ceed(0x191)],_0x505421[_0x13ceed(0x17d)]=_0x577a60[_0x13ceed(0x17d)],_0x505421[_0x13ceed(0x186)]=_0x577a60[_0x13ceed(0x186)],_0x505421[_0x13ceed(0x172)]=_0x13ceed(0x19c),_0x505421[_0x13ceed(0x19b)]=_0x13ceed(0x150),_0x505421[_0x13ceed(0x197)]=_0x13ceed(0x12b);const _0x35c2b4=_0x505421,_0x3dbbc0=((async()=>{const _0x11531d=_0x13ceed;if(typeof this[_0x11531d(0x190)]!==_0x11531d(0x182))fail('GATEWAY_RUNTIME_UNAVAILABLE');const _0x3b1b9c=_0x577a60[_0x11531d(0x18b)]?.[this[_0x11531d(0x17a)]]||{},_0x370fb8=await this[_0x11531d(0x190)](_0x35c2b4,this[_0x11531d(0x14c)]||{},_0x3b1b9c);this[_0x11531d(0x193)]&&(await _0x370fb8[_0x11531d(0x15b)](),fail(_0x11531d(0x14e)));const _0x476a61={..._0x35c2b4};_0x476a61[_0x11531d(0x19a)]=_0x370fb8,_0x476a61[_0x11531d(0x123)]=_0x3b1b9c;const _0x4e47e2=_0x476a61;return this[_0x11531d(0x117)][_0x11531d(0x195)](_0x4549f5[_0x11531d(0x191)],_0x4e47e2),_0x4e47e2;})()),_0x167f5e={};_0x167f5e[_0x13ceed(0x17d)]=_0x577a60[_0x13ceed(0x17d)],_0x167f5e[_0x13ceed(0x143)]=_0x3dbbc0,this[_0x13ceed(0x14b)][_0x13ceed(0x195)](_0x4549f5['sessionId'],_0x167f5e);try{return await _0x3dbbc0;}finally{this[_0x13ceed(0x14b)][_0x13ceed(0x11f)](_0x4549f5[_0x13ceed(0x191)]);}}[_0x58473b(0x129)](_0x4e6f6e){const _0x13161a=_0x58473b;for(const [_0x1c3263,_0x320a23]of this[_0x13161a(0x127)])if(_0x320a23[_0x13161a(0x188)]<Date['now']())this[_0x13161a(0x127)][_0x13161a(0x11f)](_0x1c3263);if(this[_0x13161a(0x127)]['size']>=0x1000)fail(_0x13161a(0x156));const _0x4da0c3=this['connectionId']+'.'+crypto[_0x13161a(0x12d)](0x20)['toString'](_0x13161a(0x177));this[_0x13161a(0x127)]['set'](_0x4da0c3,{'workspaceId':_0x4e6f6e[_0x13161a(0x186)],'expiresAt':Date[_0x13161a(0x176)]()+0xdbba0});const _0x422d04={};return _0x422d04[_0x13161a(0x186)]=_0x4e6f6e['workspaceId'],_0x422d04[_0x13161a(0x17d)]=_0x4e6f6e[_0x13161a(0x17d)],_0x422d04[_0x13161a(0x142)]=_0x4da0c3,_0x422d04;}[_0x58473b(0x16c)](_0x2de2ef,_0x475701){const _0x1f2088=_0x58473b,_0x1cd50d=this[_0x1f2088(0x127)][_0x1f2088(0x13e)](_0x2de2ef);if(!_0x1cd50d||_0x1cd50d[_0x1f2088(0x188)]<Date[_0x1f2088(0x176)]()||_0x1cd50d[_0x1f2088(0x186)]!==_0x475701)fail(_0x1f2088(0x11d),_0x1f2088(0x13d));return _0x1cd50d;}[_0x58473b(0x169)](_0x2793fc){const _0x35e133=_0x58473b;let _0x1f0443;if(_0x2793fc[_0x35e133(0x191)])_0x1f0443=this[_0x35e133(0x117)][_0x35e133(0x13e)](_0x2793fc[_0x35e133(0x191)]);else{if(this['sessions']['size']===0x1)_0x1f0443=this['sessions'][_0x35e133(0x19e)]()['next']()['value'];else{if(this[_0x35e133(0x117)][_0x35e133(0x11a)]>0x1)fail(_0x35e133(0x133),_0x35e133(0x192));}}if(!_0x1f0443)fail(_0x35e133(0x15e),'Call\x20workspace_list,\x20then\x20session_bootstrap\x20with\x20sessionId\x20and\x20workspaceId.');if(_0x2793fc[_0x35e133(0x186)]||_0x2793fc[_0x35e133(0x15d)]){const _0x216864=this['registry']['resolve'](_0x2793fc,{'host':this['host']});if(!sameWorkspace(_0x216864[_0x35e133(0x17d)],_0x1f0443['workspace']))fail(_0x35e133(0x199));}if(_0x2793fc[_0x35e133(0x113)]&&!sameWorkspace(_0x2793fc[_0x35e133(0x113)],_0x1f0443[_0x35e133(0x17d)]))fail(_0x35e133(0x199));return _0x1f0443;}async[_0x58473b(0x13a)](_0x3ab781){const _0x149dda=_0x58473b;if(this[_0x149dda(0x193)])fail(_0x149dda(0x14e));const {id:_0x39f906,method:_0x3603f1,params:params={}}=_0x3ab781,_0x5d398d=_0x513d25=>({'jsonrpc':_0x149dda(0x187),'id':_0x39f906,'result':_0x513d25});if(_0x3603f1===_0x149dda(0x14c)||_0x3603f1==='server/discover'){const _0x4ef66c=[_0x149dda(0x12e),_0x149dda(0x16b),_0x149dda(0x175),_0x149dda(0x174)],_0x20ea6a=_0x4ef66c['includes'](params['protocolVersion'])?params[_0x149dda(0x115)]:_0x4ef66c['at'](-0x1),_0x5eafb9={...params};_0x5eafb9[_0x149dda(0x115)]=_0x20ea6a,this[_0x149dda(0x14c)]=_0x5eafb9;const _0x5b1672={};_0x5b1672['listChanged']=!![];const _0x3a6885={};return _0x3a6885['tools']=_0x5b1672,_0x5d398d({'protocolVersion':_0x20ea6a,'capabilities':_0x3a6885,'serverInfo':{'name':_0x149dda(0x19c),'version':require('../../package.json')[_0x149dda(0x11e)]},'instructions':_0x149dda(0x118)});}if(_0x3603f1==='tools/list')return _0x5d398d({'tools':structuredClone(this[_0x149dda(0x151)])});if(_0x3603f1===_0x149dda(0x18c))return _0x5d398d({});if(_0x3603f1===_0x149dda(0x164))return null;const _0x3dfbbb={};_0x3dfbbb[_0x149dda(0x14a)]=-0x7f59,_0x3dfbbb['message']=_0x149dda(0x160);if(_0x3603f1!=='tools/call')return _0x39f906===undefined?null:{'jsonrpc':_0x149dda(0x187),'id':_0x39f906,'error':_0x3dfbbb};try{const _0x18cf6a=params[_0x149dda(0x178)]||{};if(Array['isArray'](_0x18cf6a)||typeof _0x18cf6a!==_0x149dda(0x170))fail(_0x149dda(0x11b));validateIdentity(_0x18cf6a);if(params[_0x149dda(0x16f)]!==_0x149dda(0x183)&&params['name']!==_0x149dda(0x18a)&&require('../core/caller-context')[_0x149dda(0x114)](params[_0x149dda(0x16f)])&&!_0x18cf6a[_0x149dda(0x191)])fail(_0x149dda(0x165),'Mutations\x20require\x20the\x20explicitly\x20bound\x20sessionId.');const _0x1dfc16=this['catalog'][_0x149dda(0x13c)](_0x7b3917=>_0x7b3917[_0x149dda(0x16f)]===params[_0x149dda(0x16f)]);if(!_0x1dfc16){const _0x5998fe=require(_0x149dda(0x15f))[_0x149dda(0x161)](params[_0x149dda(0x16f)]);if(_0x5998fe&&_0x5998fe[_0x149dda(0x13b)]!==_0x149dda(0x16e)){const _0x4027a9={};_0x4027a9[_0x149dda(0x13b)]=_0x5998fe[_0x149dda(0x13b)],_0x4027a9[_0x149dda(0x191)]=_0x18cf6a['sessionId'];const _0x22b201={};_0x22b201[_0x149dda(0x162)]=_0x149dda(0x18a),_0x22b201[_0x149dda(0x178)]=_0x4027a9;const _0x5c750e={};_0x5c750e[_0x149dda(0x14a)]=_0x149dda(0x179),_0x5c750e[_0x149dda(0x14f)]=_0x22b201;const _0x22e767=Object[_0x149dda(0x131)](new Error(_0x149dda(0x16d)),_0x5c750e);throw _0x22e767;}fail(_0x149dda(0x173),_0x149dda(0x135));}if(params[_0x149dda(0x16f)]===_0x149dda(0x183))return _0x5d398d(content({'workspaces':this[_0x149dda(0x19f)][_0x149dda(0x147)]()[_0x149dda(0x121)](_0x195488=>!this['host']||_0x195488[_0x149dda(0x130)][_0x149dda(0x18d)](this[_0x149dda(0x17a)]))[_0x149dda(0x18f)](_0x328aa5=>this['selection'](_0x328aa5)),'connectionId':this['connectionId']}));if(params[_0x149dda(0x16f)]===_0x149dda(0x18a)&&!_0x18cf6a[_0x149dda(0x191)]&&!_0x18cf6a[_0x149dda(0x13b)])return _0x5d398d(content({'registration':_0x149dda(0x19c),'connectionId':this['connectionId'],'boundSessions':this[_0x149dda(0x117)]['size'],'backendsStartedByDiscovery':0x0,'serving':'gateway','version':require(_0x149dda(0x17b))['version']}));for(const _0x4348b8 of _0x1dfc16['inputSchema'][_0x149dda(0x126)]||[])if(_0x18cf6a[_0x4348b8]===undefined&&_0x4348b8!=='sessionId')fail(_0x149dda(0x12f)+_0x4348b8[_0x149dda(0x16a)](/([a-z])([A-Z])/g,_0x149dda(0x171))[_0x149dda(0x185)](),_0x149dda(0x17e)+_0x4348b8+'.');const _0x2ddf2e=params['name']==='session_bootstrap'?await this['bind'](_0x18cf6a):this[_0x149dda(0x169)](_0x18cf6a);if(_0x2ddf2e[_0x149dda(0x123)]?.['tools']?.[params[_0x149dda(0x16f)]]?.[_0x149dda(0x17c)]===![])fail(_0x149dda(0x137));const _0x4d3a84={..._0x18cf6a};_0x4d3a84['sessionId']=_0x2ddf2e[_0x149dda(0x191)];const _0x5f975e=_0x4d3a84,_0x223358={...params};_0x223358['arguments']=_0x5f975e;const _0x5b43c7={..._0x3ab781};_0x5b43c7[_0x149dda(0x149)]=_0x223358;const _0x7d7ec8=await _0x2ddf2e[_0x149dda(0x19a)][_0x149dda(0x184)](_0x5b43c7);if(params['name']==='mcp_agent_health'&&_0x18cf6a[_0x149dda(0x13b)]&&!_0x7d7ec8[_0x149dda(0x136)]){const _0xe90abb={};_0xe90abb[_0x149dda(0x159)]=_0x149dda(0x157),_0xe90abb[_0x149dda(0x149)]={};const _0x33f043=await _0x2ddf2e[_0x149dda(0x19a)][_0x149dda(0x184)](_0xe90abb);let _0x3bfaaf=![];for(const _0x42f2d7 of _0x33f043[_0x149dda(0x166)]||[]){if(require('./router')[_0x149dda(0x161)](_0x42f2d7['name'])?.[_0x149dda(0x13b)]!==_0x18cf6a[_0x149dda(0x13b)])continue;const _0x11c07a=require(_0x149dda(0x146))[_0x149dda(0x13f)](structuredClone(_0x42f2d7)),_0x2d5b50=this[_0x149dda(0x151)][_0x149dda(0x13c)](_0x8b3fdc=>_0x8b3fdc[_0x149dda(0x16f)]===_0x11c07a[_0x149dda(0x16f)]);if(_0x2d5b50&&JSON[_0x149dda(0x145)](_0x2d5b50[_0x149dda(0x167)])!==JSON[_0x149dda(0x145)](_0x11c07a['inputSchema']))fail('CATALOG_SCHEMA_CONFLICT');!_0x2d5b50&&(this[_0x149dda(0x151)][_0x149dda(0x14d)](_0x11c07a),_0x3bfaaf=!![]);}if(_0x3bfaaf)this[_0x149dda(0x17f)]();}return _0x5d398d(_0x7d7ec8);}catch(_0x1b5a46){const _0x105602={};return _0x105602[_0x149dda(0x162)]=_0x149dda(0x183),_0x105602['then']=_0x149dda(0x155),_0x105602['required']=[_0x149dda(0x191),_0x149dda(0x186)],_0x5d398d({...content({'success':![],'code':_0x1b5a46[_0x149dda(0x14a)]||'GATEWAY_REQUEST_FAILED','error':_0x1b5a46[_0x149dda(0x168)],'recovery':_0x1b5a46[_0x149dda(0x14f)]||([_0x149dda(0x15e),_0x149dda(0x133),_0x149dda(0x189)][_0x149dda(0x18d)](_0x1b5a46[_0x149dda(0x14a)])?_0x105602:undefined)}),'isError':!![]});}}async[_0x58473b(0x15b)](){const _0x21086f=_0x58473b;this[_0x21086f(0x193)]=!![],await Promise[_0x21086f(0x116)]([...this[_0x21086f(0x14b)][_0x21086f(0x19e)]()][_0x21086f(0x18f)](_0x358afa=>_0x358afa[_0x21086f(0x143)]));const _0x4ba696=await Promise[_0x21086f(0x116)]([...this[_0x21086f(0x117)][_0x21086f(0x19e)]()][_0x21086f(0x18f)](_0x58d6be=>_0x58d6be[_0x21086f(0x19a)]['close']())),_0x3f97bd=_0x4ba696[_0x21086f(0x13c)](_0x297b37=>_0x297b37[_0x21086f(0x198)]===_0x21086f(0x153));if(_0x3f97bd)throw _0x3f97bd[_0x21086f(0x119)];this[_0x21086f(0x117)][_0x21086f(0x194)]();}}function _0x4da0(_0x3b709c,_0x50acf3){_0x3b709c=_0x3b709c-0x112;const _0x4d457f=_0x4d45();let _0x4da0c1=_0x4d457f[_0x3b709c];if(_0x4da0['SucxLS']===undefined){var _0xb90123=function(_0x4e44fa){const _0x1b95c4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x58f720='',_0x14857b='';for(let _0x44fc26=0x0,_0x59cd5c,_0xf294ee,_0x3ba2da=0x0;_0xf294ee=_0x4e44fa['charAt'](_0x3ba2da++);~_0xf294ee&&(_0x59cd5c=_0x44fc26%0x4?_0x59cd5c*0x40+_0xf294ee:_0xf294ee,_0x44fc26++%0x4)?_0x58f720+=String['fromCharCode'](0xff&_0x59cd5c>>(-0x2*_0x44fc26&0x6)):0x0){_0xf294ee=_0x1b95c4['indexOf'](_0xf294ee);}for(let _0x3ce3aa=0x0,_0x43fb2c=_0x58f720['length'];_0x3ce3aa<_0x43fb2c;_0x3ce3aa++){_0x14857b+='%'+('00'+_0x58f720['charCodeAt'](_0x3ce3aa)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x14857b);};_0x4da0['dQQXYk']=_0xb90123,_0x4da0['oDfwWM']={},_0x4da0['SucxLS']=!![];}const _0x44c93b=_0x4d457f[0x0],_0x733e1c=_0x3b709c+_0x44c93b,_0x235074=_0x4da0['oDfwWM'][_0x733e1c];return!_0x235074?(_0x4da0c1=_0x4da0['dQQXYk'](_0x4da0c1),_0x4da0['oDfwWM'][_0x733e1c]=_0x4da0c1):_0x4da0c1=_0x235074,_0x4da0c1;}function _0x4d45(){const _0x22addc=['AgfUzgXL','yMfJA2vUza','zMLUza','q2fSBcb3B3jRC3bHy2vFBgLZDcbVBIb0AgLZignVBM5Ly3rPB24Gyw5KihvZzsbPDhmGy3vYCMvUDcbIAw5KAw5Nvg9Rzw4U','z2v0','zgvJB3jHDgvhyxrLD2f5vg9VBa','DgfZAW','C3rYAw5N','yMLUzgLUz1rVA2vU','ChjVBwLZzq','mty4nZi4mgDdz1nYwq','C3rYAw5NAwz5','lI9WDwjSAwmTy2f0ywXVzW','BgLZDa','lI4VAw5ZDgfSBgvYl3DVCMTZCgfJzs1YzwDPC3rYEq','CgfYyw1Z','y29Kzq','Aw5PDgLHBgL6Aw5N','Aw5PDgLHBgL6zq','ChvZAa','r0furvDbwv9dte9truq','CMvJB3zLCNK','y2fSBgvYlxnLBgvJDgvK','y2f0ywXVzW','ugfZCYb0AguGC2fTzsbUB25LBxb0EsbZzxnZAw9UswqGDgHYB3vNAg91Dcb0AgLZignOyxqU','CMvQzwn0zwq','su5wquXjrf8','C2vZC2LVBL9IB290C3rYyxa','r0furvDbwv9truXfq1rjt05FteLnsvq','Dg9VBhmVBgLZDa','Cgf0DgvYBG','Bwv0Ag9K','mtzVuffwEKm','y2XVC2u','DhjPBq','D29YA3nWywnLugf0Aa','v09ss1nqqunfx0jjtKrjtKDFuKvrvuLsruq','lI9YB3v0zxi','twv0Ag9Kig5VDcbMB3vUza','BwfWrxHWB3nLzfrVt3jPz2LUywW','Dg9VBa','Dgv4Da','BM90AwzPy2f0Aw9UCY9PBML0AwfSAxPLza','u0vtu0LptL9jrf9srvfvsvjfra','Dg9VBhm','Aw5WDxrty2HLBwe','BwvZC2fNzq','C2vSzwn0zwq','CMvWBgfJzq','mJaYns0WmY0YnG','DMvYAwz5u2vSzwn0Aw9U','vgHPCYbHzgrVBIbUzwvKCYbPBNrLBNrPB25HBcbJyxrHBg9NigrPC2nVDMvYEtSGy2fSBcbTy3bFywDLBNrFAgvHBhrOihDPDgGGAxrZigjHy2TLBMqGyw5KihnLC3nPB25jzc4','x2j1AwX0Aw4','BMfTzq','B2jQzwn0','jdfFjdi','CMvNAxn0CMf0Aw9U','ve9ptf9ot1rFqvzbsuXbqKXf','mJaYns0Xms0Ynq','mJaYns0WnI0Xoa','BM93','yMfZzty0DxjS','yxjNDw1LBNrZ','qKfds0vorf9dqvrbte9hx0rju0npvKvswv9srvfvsvjfra','Ag9ZDa','lI4VlI4VCgfJA2fNzs5QC29U','zw5HyMXLza','D29YA3nWywnL','uMvXDwLYzwqGzMLLBgq6ia','B25dyxrHBg9Nq2HHBMDLza','v29YA3nWywnLr2f0zxDHEq','lI4Vy29Yzs90B29SlwnVBNrYywn0CW','zNvUy3rPB24','D29YA3nWywnLx2XPC3q','CMvXDwvZDa','Dg9vChbLCKnHC2u','D29YA3nWywnLswq','mI4W','zxHWAxjLC0f0','v09ss1nqqunfx05pvf9sruDju1rfuKve','BwnWx2fNzw50x2HLywX0Aa','ChjVzMLSzxm','CgLUzW','Aw5JBhvKzxm','nJGZmdCWuxnhAhbj','BwfW','CNvUDgLTzuzHy3rVCNK','C2vZC2LVBKLK','ugfZCYbZzxnZAw9Uswq7ihrOAxmGy29UBMvJDgLVBIbZzxj2zxmGBxvSDgLWBguGChjVAMvJDcbZzxnZAw9UCY4','C3rVChbLza','y2XLyxi','C2v0','nZyXndy1v0TjuMfZ','BMf0AxzLswrLBNrPDhK','C3rHDhvZ','v09ss1nqqunfx0jjtKrjtKDFq09orKXjq1q','CNvUDgLTzq','ChjVDMvUyw5Jzq','yxb0lw1JCc1Hz2vUDa','mZi3mtmXnwPVqxvxrG','DMfSDwvZ','CMvNAxn0CNK','otqXotK0z25Iquvk','mtC0mta0n2PTt05QrG','ChjVAMvJDfbHDgG','C2vUC2L0AxzLvg9VBa','ChjVDg9JB2XwzxjZAw9U','ywXSu2v0DgXLza','C2vZC2LVBNm','t25LiefqvcbNyxrLD2f5ihnLCNzLCYbPBNn0ywXSzwqGChjVAMvJDhmUienHBgWGD29YA3nWywnLx2XPC3qSihrOzw4GC2vZC2LVBL9IB290C3rYyxaGD2L0Acb5B3vYihnLC3nPB25jzcbHBMqGDgHLihbYB2PLy3qGD29YA3nWywnLswqUiefSD2f5CYbWyxnZihrOyxqGC2vZC2LVBKLKig9Uihn1yNnLCxvLBNqGy2fSBhmUie5LDMvYigjPBMqGAg9TzsbVCIbZzwXLy3qGysbWCM9Qzwn0igzYB20GCMvJzw5JEs4','CMvHC29U','C2L6zq','su5wquXjrf9buKDvtuvovfm','BgvUz3rO','r0furvDbwv9truXfq1rjt05FuKvrvuLsruq','DMvYC2LVBG','zgvSzxrL','zw50CMLLCW','zMLSDgvY','lI4Vy29Yzs93B3jRC3bHy2uTCgf0Aa','ChjVzMLSzq','CMvXDwvZDeLK','CNvUswq','CMvXDwLYzwq','yMLUzgLUz1nLBgvJDgLVBNm','mJe5nJi3nJHMC2vPr3i','C2vSzwn0Aw9U','Bwf4tgvUz3rO','Dw5JB25MAxjTzwq','zxHWB3j0CW','CMfUzg9TqNL0zxm','mJaYnc0Xms0Wnq','tuLtu0Lor18','Ag9ZDhm','yxnZAwDU','y29UBMvJDgLVBKLK','v09ss1nqqunfx0fnqKLhvu9vuW','yMLUza','vgHPCYbNyxrLD2f5igHHCYbUBYb2zxjPzMLLzcbJyxrHBg9NigzVCIb0Agf0ihrVB2WU','AxnfCNjVCG','ufjpsKvdvf9ut09mx0rju0fcteve','BM9KztPJCNLWDg8','AgfZ'];_0x4d45=function(){return _0x22addc;};return _0x4d45();}const _0x5ee6ce={};_0x5ee6ce[_0x58473b(0x180)]=WorkspaceGateway,_0x5ee6ce['validateIdentity']=validateIdentity,module[_0x58473b(0x12c)]=_0x5ee6ce;
@@ -0,0 +1,249 @@
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
3
+ const crypto = require('node:crypto');
4
+
5
+ const PACKAGED = path.basename(__filename) === 'technical-sources-check.js';
6
+ const ROOT = path.resolve(__dirname, PACKAGED ? '.' : '..');
7
+ const columns = ['ID', 'Repository', 'Role', 'Consumer', 'Ref type', 'Pinned ref', 'Resource digest', 'License / notice', 'Last reviewed', 'Refresh policy', 'Compatibility gate', 'Status', 'Notes'];
8
+ const branchColumns = ['Branch', 'Purpose', 'Base commit', 'Tip', 'Status', 'Included in main', 'Release / artifact', 'Last reviewed'];
9
+ const roles = new Set(['managed-backend', 'managed-bundle', 'addon', 'packaged-vendor', 'adapted-reference', 'citation-only']);
10
+ const statuses = new Set(['active', 'reference-only', 'needs-pinning', 'deprecated', 'blocked']);
11
+ const hash = bytes => crypto.createHash('sha256').update(bytes).digest('hex');
12
+ const repositoryKey = url => url.replace(/\/$/, '').replace(/\.git$/, '').toLowerCase();
13
+ const cells = line => line.slice(1, -1).split('|').map(cell => cell.trim());
14
+
15
+ function parseRegistry(markdown) {
16
+ const sources = [], branches = [];
17
+ let section = null, header = null;
18
+ for (const line of markdown.split(/\r?\n/)) {
19
+ if (line.startsWith('## ')) { section = line.slice(3); header = null; }
20
+ if (!line.startsWith('|') || !line.endsWith('|')) continue;
21
+ const values = cells(line);
22
+ if (values.every(value => /^:?-+:?$/.test(value))) continue;
23
+ if (!header) { header = values; continue; }
24
+ if (!['Integrated sources', 'Reviewed references', 'APT internal branches'].includes(section)) continue;
25
+ if (values.length !== header.length) throw new Error(`Invalid table row: ${values[0]}`);
26
+ const row = Object.fromEntries(header.map((key, i) => [key, values[i]]));
27
+ if (section === 'APT internal branches') {
28
+ if (header.join('|') !== branchColumns.join('|')) throw new Error('Invalid branch columns');
29
+ branches.push(row); continue;
30
+ }
31
+ if (header.join('|') !== columns.join('|')) throw new Error(`Invalid registry columns in ${section}`);
32
+ sources.push({ ...row, section });
33
+ }
34
+ if (!sources.length || !branches.length) throw new Error('Source and branch tables are required');
35
+ return { sources, branches };
36
+ }
37
+
38
+ function containedFile(root, relative) {
39
+ if (!relative || path.isAbsolute(relative) || relative.includes('\\') || relative.split('/').includes('..')) throw new Error(`Unsafe resource path: ${relative}`);
40
+ const file = path.resolve(root, relative);
41
+ const actual = fs.realpathSync(file), base = fs.realpathSync(root);
42
+ const delta = path.relative(base, actual);
43
+ if (delta.startsWith('..') || path.isAbsolute(delta) || !fs.statSync(actual).isFile()) throw new Error(`Resource escapes root: ${relative}`);
44
+ return actual;
45
+ }
46
+
47
+ function readJson(root, relative) { return JSON.parse(fs.readFileSync(containedFile(root, relative), 'utf8')); }
48
+
49
+ // Adapted skill snapshots use LF text, so a Windows checkout is the same snapshot.
50
+ function skillDigest(root, ids) {
51
+ const files = {};
52
+ for (const id of [...ids].sort()) {
53
+ const relative = `.agents/skills/${id}/SKILL.md`;
54
+ files[relative] = hash(fs.readFileSync(containedFile(root, relative), 'utf8').replace(/\r\n/g, '\n'));
55
+ }
56
+ return hash(JSON.stringify(files));
57
+ }
58
+
59
+ function bindings(root, packageOnly = false) {
60
+ const manifest = readJson(root, 'docs/upstream-manifest.json');
61
+ const out = (manifest.components || []).map(item => ({ repository: item.source, ref: item.gitRef, version: item.version, digest: item.resourceDigest, license: item.license,
62
+ role: item.status === 'managed-backend' ? 'managed-backend' : item.status === 'offline-skill-bundle' ? 'managed-bundle' : 'adapted-reference' }));
63
+ for (const id of ['ui-ux-pro-max', 'archify']) {
64
+ const item = manifest[id];
65
+ if (!item) throw new Error(`Missing companion manifest: ${id}`);
66
+ out.push({ repository: item.repository, ref: item.commit, version: item.tag, digest: item.resourceDigest, license: item.license, role: 'packaged-vendor' });
67
+ }
68
+ const lock = readJson(root, packageOnly && fs.existsSync(path.join(root, 'source-skills-lock.json')) ? 'source-skills-lock.json' : 'skills-lock.json');
69
+ const groups = {};
70
+ for (const [id, item] of Object.entries(lock.skills || {})) {
71
+ if (item.sourceType !== 'github' || !/^[\w.-]+\/[\w.-]+$/.test(item.source) || !/^[a-f0-9]{64}$/.test(item.computedHash)) throw new Error(`Invalid skill lock: ${id}`);
72
+ if (!item.skillPath || item.skillPath.includes('..') || path.isAbsolute(item.skillPath)) throw new Error(`Unsafe locked skill path: ${id}`);
73
+ (groups[item.source] ||= []).push(id);
74
+ }
75
+ for (const [repo, ids] of Object.entries(groups)) out.push({ repository: `https://github.com/${repo}`, digest: packageOnly ? null : skillDigest(root, ids), roles: ['adapted-reference', 'managed-bundle'] });
76
+ if (packageOnly) return out;
77
+ const profiles = require(path.join(root, 'src/backends/profiles.js'));
78
+ for (const [repo, version] of [
79
+ ['colbymchenry/codegraph', profiles.CODEGRAPH_VERSION], ['tirth8205/code-review-graph', profiles.REVIEW_VERSIONS['code-review-graph']],
80
+ ['modelcontextprotocol/servers', profiles.MEMORY_VERSION], ['microsoft/playwright-mcp', profiles.PLAYWRIGHT_MCP_VERSION],
81
+ ['jlowin/fastmcp', profiles.REVIEW_VERSIONS.fastmcp], ['modelcontextprotocol/python-sdk', profiles.REVIEW_VERSIONS.mcp]
82
+ ]) out.push({ repository: `https://github.com/${repo}`, version });
83
+ const ppt = require(path.join(root, 'src/installer/presentations.js'));
84
+ out.push({ repository: 'https://github.com/hugohe3/ppt-master', ref: ppt.COMMIT, version: ppt.VERSION });
85
+ const pkg = readJson(root, 'package.json'), packageLock = readJson(root, 'package-lock.json');
86
+ if (pkg.version !== packageLock.packages?.['']?.version || pkg.version !== packageLock.version) throw new Error('Package version drift');
87
+ for (const group of ['dependencies', 'devDependencies', 'optionalDependencies']) {
88
+ const declared = pkg[group] || {}, locked = packageLock.packages?.['']?.[group] || {};
89
+ if (Object.keys(declared).length !== Object.keys(locked).length || Object.entries(declared).some(([name, range]) => locked[name] !== range)) throw new Error(`Package lock declarations drift: ${group}`);
90
+ }
91
+ for (const name of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies, ...pkg.optionalDependencies })) {
92
+ const installed = packageLock.packages?.[`node_modules/${name}`];
93
+ if (!installed?.version || !installed.integrity) throw new Error(`Missing package lock integrity: ${name}`);
94
+ out.push({ npm: name, version: installed.version, license: installed.license, role: 'addon' });
95
+ }
96
+ for (const id of ['ui-ux-pro-max', 'archify']) {
97
+ // Required companions cannot disappear from discovery when provenance is removed.
98
+ containedFile(root, `.agents/skills/${id}/provenance.json`);
99
+ }
100
+ const marketing = require(path.join(root, 'scripts/marketing-manifest.js')).validateManifest(path.join(root, '.agents/skills'), path.join(root, '.agents/marketing-manifest.json'));
101
+ out.push({ repository: marketing.upstream.repository, ref: marketing.upstream.commit, version: marketing.upstream.version, digest: marketing.bundleDigest, license: marketing.upstream.license });
102
+ // Discover additional imported companions instead of silently ignoring new provenance.
103
+ for (const item of fs.readdirSync(path.join(root, '.agents/skills'), { withFileTypes: true })) {
104
+ if (!item.isDirectory()) continue;
105
+ const relative = `.agents/skills/${item.name}/provenance.json`;
106
+ if (!fs.existsSync(path.join(root, relative))) continue;
107
+ const provenance = readJson(root, relative);
108
+ if (!provenance.files || !Object.keys(provenance.files).length || !provenance.license) throw new Error(`Incomplete provenance: ${item.name}`);
109
+ for (const [file, expected] of Object.entries(provenance.files)) {
110
+ if (!/^[a-f0-9]{64}$/.test(expected) || hash(fs.readFileSync(containedFile(root, `.agents/skills/${item.name}/vendor/${file}`))) !== expected) throw new Error(`Resource hash drift: ${item.name}/${file}`);
111
+ }
112
+ if (hash(JSON.stringify(provenance.files)) !== provenance.resourceDigest) throw new Error(`Resource digest drift: ${item.name}`);
113
+ out.push({ repository: provenance.repository, ref: provenance.commit, version: provenance.tag, digest: provenance.resourceDigest, license: provenance.license });
114
+ }
115
+ return out;
116
+ }
117
+
118
+ function validate(options = {}) {
119
+ const root = options.root || ROOT;
120
+ const errors = [], warnings = [];
121
+ let registry;
122
+ try { registry = parseRegistry(options.markdown ?? fs.readFileSync(containedFile(root, 'docs/technical-sources.md'), 'utf8')); }
123
+ catch (error) { return { ok: false, errors: [error.message], warnings, sources: [] }; }
124
+ const ids = new Set(), repos = new Map();
125
+ for (const row of registry.sources) {
126
+ const id = row.ID;
127
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id) || ids.has(id)) errors.push(`Invalid or duplicate ID: ${id}`);
128
+ ids.add(id);
129
+ try { const url = new URL(row.Repository); if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash) throw new Error(); }
130
+ catch { errors.push(`Invalid repository URL: ${id}`); }
131
+ const key = repositoryKey(row.Repository);
132
+ if (repos.has(key)) errors.push(`Duplicate repository: ${id}`);
133
+ repos.set(key, row);
134
+ for (const column of columns) if (!row[column]) errors.push(`Missing ${column}: ${id}`);
135
+ if (!roles.has(row.Role) || !statuses.has(row.Status)) errors.push(`Invalid role/status: ${id}`);
136
+ if (!['commit', 'tag', 'version', 'branch', 'unpinned'].includes(row['Ref type'])) errors.push(`Invalid ref type: ${id}`);
137
+ const ref = row['Pinned ref'].split(';')[0].trim();
138
+ if (row['Ref type'] === 'commit' && !/^[a-f0-9]{40}$/.test(ref)) errors.push(`Invalid commit: ${id}`);
139
+ if (row['Ref type'] === 'version' && !/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(ref)) errors.push(`Invalid version: ${id}`);
140
+ if (row['Ref type'] === 'tag' && !/^[^\s;|]+$/.test(ref)) errors.push(`Invalid tag: ${id}`);
141
+ if (['branch', 'unpinned'].includes(row['Ref type'])) {
142
+ if (!['needs-pinning', 'reference-only', 'deprecated', 'blocked'].includes(row.Status)) errors.push(`Floating source cannot be active: ${id}`);
143
+ }
144
+ if (row.Status === 'needs-pinning') warnings.push(`Needs pin/review: ${id}`);
145
+ if (row.section === 'Reviewed references' && (row.Status === 'active' || !['citation-only', 'adapted-reference'].includes(row.Role))) errors.push(`Reference incorrectly marked managed: ${id}`);
146
+ if (row.section === 'Integrated sources' && row.Role === 'citation-only') errors.push(`Citation incorrectly marked integrated: ${id}`);
147
+ const date = Date.parse(row['Last reviewed']);
148
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(row['Last reviewed']) || Number.isNaN(date) || new Date(date).toISOString().slice(0, 10) !== row['Last reviewed']) errors.push(`Invalid review date: ${id}`);
149
+ if (!/^[a-f0-9]{64}$/.test(row['Resource digest']) && row['Resource digest'] !== 'none') errors.push(`Invalid digest: ${id}`);
150
+ if (row['License / notice'] === 'unknown' && row.Status === 'active') errors.push(`License unknown for active source: ${id}`);
151
+ const notice = row['License / notice'].split('@')[1]?.trim();
152
+ if (notice && !notice.startsWith('https://') && !options.packageOnly) { try { containedFile(root, notice); } catch (error) { errors.push(error.message); } }
153
+ }
154
+ const branches = new Set();
155
+ for (const row of registry.branches) {
156
+ const date = Date.parse(row['Last reviewed']);
157
+ if (branchColumns.some(column => !row[column]) || branches.has(row.Branch) || !['active', 'merged', 'archived', 'local-only'].includes(row.Status) || !/^[a-f0-9]{40}$/.test(row['Base commit']) || !/^[a-f0-9]{40}$/.test(row.Tip) || !/^(yes(?: \(committed tip only\))?|no)$/.test(row['Included in main']) || !/^\d{4}-\d{2}-\d{2}$/.test(row['Last reviewed']) || Number.isNaN(date) || new Date(date).toISOString().slice(0, 10) !== row['Last reviewed']) errors.push(`Invalid branch snapshot: ${row.Branch}`);
158
+ branches.add(row.Branch);
159
+ }
160
+ try {
161
+ for (const expected of bindings(root, options.packageOnly)) {
162
+ const row = expected.npm ? registry.sources.find(row => new RegExp(`(?:^|[; ]+)npm=${expected.npm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:[; ]|$)`).test(row.Notes)) : repos.get(repositoryKey(expected.repository || ''));
163
+ if (!row) { errors.push(`Source missing from registry: ${expected.repository || expected.npm}`); continue; }
164
+ if (row.section !== 'Integrated sources' || row.Role === 'citation-only' || expected.role && row.Role !== expected.role || expected.roles && !expected.roles.includes(row.Role)) errors.push(`Integrated source classified incorrectly: ${row.ID}`);
165
+ if (expected.ref && row['Pinned ref'].split(';')[0].trim() !== expected.ref) errors.push(`Ref drift: ${row.ID}`);
166
+ if (expected.version && !row['Pinned ref'].split(';').map(s => s.trim()).includes(`version=${expected.version}`) && row['Pinned ref'] !== expected.version) errors.push(`Version drift: ${row.ID} (${expected.version})`);
167
+ if (expected.digest && row['Resource digest'] !== expected.digest) errors.push(`Digest drift: ${row.ID}`);
168
+ if (expected.license && row['License / notice'].split('@')[0].trim() !== expected.license) errors.push(`License drift: ${row.ID}`);
169
+ }
170
+ } catch (error) { errors.push(error.message); }
171
+ return { ok: errors.length === 0, errors: [...new Set(errors)], warnings: [...new Set(warnings)], sources: registry.sources, branches: registry.branches };
172
+ }
173
+
174
+ async function getJson(url, fetcher = fetch) {
175
+ const response = await fetcher(url, { headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'APT-technical-sources' }, signal: AbortSignal.timeout(15000) });
176
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
177
+ return response.json();
178
+ }
179
+
180
+ async function refresh(options = {}) {
181
+ const local = validate(options);
182
+ const sources = options.source ? local.sources.filter(row => row.ID === options.source) : local.sources;
183
+ if (options.source && !sources.length) throw new Error(`Unknown source ID: ${options.source}`);
184
+ const results = [];
185
+ for (const row of sources) {
186
+ const repo = /^https:\/\/github\.com\/([\w.-]+\/[\w.-]+)$/.exec(row.Repository)?.[1];
187
+ if (!repo) { results.push({ id: row.ID, status: 'manual-review', reason: 'Official documentation source has no repository discovery endpoint' }); continue; }
188
+ try {
189
+ const base = `https://api.github.com/repos/${repo}`;
190
+ const metadata = await getJson(base, options.fetcher);
191
+ const [head, tags] = await Promise.all([getJson(`${base}/commits/${encodeURIComponent(metadata.default_branch)}`, options.fetcher), getJson(`${base}/tags?per_page=20`, options.fetcher)]);
192
+ let release;
193
+ try { release = await getJson(`${base}/releases/latest`, options.fetcher); }
194
+ catch (error) { if (error.message !== 'HTTP 404') throw error; }
195
+ const pin = row['Pinned ref'].split(';')[0].trim();
196
+ const updates = [];
197
+ if (['branch', 'unpinned'].includes(row['Ref type'])) updates.push('pin-review');
198
+ const npm = /(?:^|[; ]+)npm=([^; ]+)/.exec(row.Notes)?.[1];
199
+ let npmLatest = null;
200
+ if (npm) {
201
+ const packageInfo = await getJson(`https://registry.npmjs.org/${encodeURIComponent(npm)}/latest`, options.fetcher);
202
+ npmLatest = packageInfo.version;
203
+ if (npmLatest !== versionFromRow(row)) updates.push('npm-version-changed');
204
+ }
205
+ if (row['Ref type'] === 'commit' && head.sha !== pin) updates.push('branch-head-changed');
206
+ if (row['Ref type'] === 'tag' && tags[0]?.name !== pin) updates.push('tag-changed');
207
+ const version = /(?:^|;)\s*version=([^;]+)/.exec(row['Pinned ref'])?.[1] || (row['Ref type'] === 'version' ? pin : null);
208
+ if (version && release?.tag_name && release.tag_name.replace(/^v/, '') !== version.replace(/^v/, '')) updates.push('release-changed');
209
+ const license = metadata.license?.spdx_id || 'unknown';
210
+ if (license === 'unknown' || row['License / notice'].split('@')[0].trim() !== license) updates.push('license-review');
211
+ let comparison = null;
212
+ if (row['Ref type'] === 'commit') {
213
+ comparison = await getJson(`${base}/compare/${pin}...${head.sha}`, options.fetcher);
214
+ if (comparison.files?.some(file => /(?:^|\/)(?:SKILL\.md|LICENSE[^/]*|package\.json|pyproject\.toml)$/.test(file.filename) || file.status === 'removed' || file.status === 'renamed')) updates.push('structure-or-contract-review');
215
+ }
216
+ results.push({ id: row.ID, status: updates.length ? 'review-required' : 'unchanged', updates,
217
+ floating: ['branch', 'unpinned'].includes(row['Ref type']), canonicalRepository: metadata.html_url,
218
+ branch: metadata.default_branch, head: head.sha, tags: tags.map(tag => ({ name: tag.name, commit: tag.commit?.sha })),
219
+ release: release?.tag_name || null, npmLatest, license,
220
+ localDrift: local.errors.filter(error => error.includes(row.ID)),
221
+ compatibility: 'unverified', comparison: comparison ? { url: comparison.html_url, commits: comparison.total_commits, changedFiles: comparison.files?.length ?? null, filesMayBeTruncated: (comparison.files?.length || 0) >= 300 } : null });
222
+ } catch (error) { results.push({ id: row.ID, status: 'unreachable', error: error.message, compatibility: 'unverified' }); }
223
+ }
224
+ return { checkedAt: new Date().toISOString(), nonMutating: true, localValidation: { ok: local.ok, errors: local.errors, warnings: local.warnings }, results };
225
+ }
226
+
227
+ function versionFromRow(row) { return /(?:^|;)\s*version=([^;]+)/.exec(row['Pinned ref'])?.[1] || (row['Ref type'] === 'version' ? row['Pinned ref'] : null); }
228
+
229
+ async function main(argv = process.argv.slice(2)) {
230
+ const action = argv.shift();
231
+ let source = null, json = false;
232
+ while (argv.length) {
233
+ const arg = argv.shift();
234
+ if (arg === '--json') json = true;
235
+ else if (arg === '--source' && argv[0] && !argv[0].startsWith('--')) source = argv.shift();
236
+ else throw new Error(`Unknown or incomplete option: ${arg}`);
237
+ }
238
+ if (!['validate', 'refresh'].includes(action)) throw new Error('Expected validate or refresh');
239
+ if (action === 'validate' && source) throw new Error('--source is only supported by refresh');
240
+ const report = action === 'validate' ? validate({ packageOnly: PACKAGED }) : await refresh({ source, packageOnly: PACKAGED });
241
+ const failed = action === 'validate' ? !report.ok : !report.localValidation.ok || report.results.some(item => item.status === 'unreachable');
242
+ if (json) console.log(JSON.stringify(report, null, 2));
243
+ else if (action === 'validate') { console.log(`${report.ok ? 'PASS' : 'FAIL'}: ${report.sources.length} sources validated offline`); for (const line of [...report.errors, ...report.warnings]) console.log(line); }
244
+ else { for (const row of report.results) console.log(`${row.id}: ${row.status}${row.error ? ` (${row.error})` : ''}`); console.log('Report only. Pins, skills and runtime were not changed. Compatibility remains unverified.'); }
245
+ process.exitCode = failed ? 1 : 0;
246
+ }
247
+
248
+ if (require.main === module) main().catch(error => { if (process.argv.includes('--json')) console.log(JSON.stringify({ ok: false, error: error.message })); else console.error(error.message); process.exitCode = 1; });
249
+ module.exports = { columns, parseRegistry, containedFile, skillDigest, bindings, validate, refresh, main };