apt-mcp-agent-setup 3.4.0 → 3.5.2

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 (123) hide show
  1. package/README.md +17 -7
  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 +124 -108
  20. package/package.json +1 -1
  21. package/release-check.js +4 -2
  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/profiles.js +1 -1
  27. package/src/core/admission-fence.js +1 -1
  28. package/src/core/aso-import.js +1 -1
  29. package/src/core/caller-context.js +1 -1
  30. package/src/core/catalog.js +1 -1
  31. package/src/core/claude-caller-authority.js +1 -1
  32. package/src/core/claude-invocation.js +1 -1
  33. package/src/core/claude-native.js +1 -1
  34. package/src/core/claude-plan.js +1 -1
  35. package/src/core/claude-worker-transcript.js +1 -1
  36. package/src/core/codex-host-metadata.js +1 -1
  37. package/src/core/codex-transcript-receipt.js +1 -1
  38. package/src/core/context-metrics.js +1 -1
  39. package/src/core/doctor.js +1 -1
  40. package/src/core/draining-completion.js +1 -1
  41. package/src/core/execution.js +1 -1
  42. package/src/core/git-context.js +1 -0
  43. package/src/core/hook-bridge.js +1 -1
  44. package/src/core/host-adapters.js +1 -1
  45. package/src/core/ipc-envelope.js +1 -1
  46. package/src/core/memory-scope.js +1 -0
  47. package/src/core/memory-store.js +1 -1
  48. package/src/core/model-inventory.js +1 -1
  49. package/src/core/model-routing.js +1 -1
  50. package/src/core/native-dispatch.js +1 -1
  51. package/src/core/node-version.js +1 -1
  52. package/src/core/npm-cli.js +1 -1
  53. package/src/core/owned-command-child.js +1 -0
  54. package/src/core/owned-command.js +1 -0
  55. package/src/core/owned-lock.js +1 -1
  56. package/src/core/owned-process.js +1 -0
  57. package/src/core/presentations.js +1 -1
  58. package/src/core/quality-artifacts.js +1 -1
  59. package/src/core/quality.js +1 -1
  60. package/src/core/read-command.js +1 -0
  61. package/src/core/readonly-skill.js +1 -0
  62. package/src/core/resource-transaction.js +1 -1
  63. package/src/core/run-compatibility.js +1 -1
  64. package/src/core/runtime-info.js +1 -1
  65. package/src/core/runtime-ownership.js +1 -1
  66. package/src/core/session.js +1 -1
  67. package/src/core/skill-companions.js +1 -1
  68. package/src/core/skill-names.js +1 -1
  69. package/src/core/storage-retry.js +1 -0
  70. package/src/core/tool-contracts.js +1 -1
  71. package/src/core/update-control.js +1 -1
  72. package/src/core/upgrade-runs.js +1 -1
  73. package/src/core/upgrade-stop.js +1 -1
  74. package/src/core/windows-job.js +1 -0
  75. package/src/core/windows-job.ps1 +75 -0
  76. package/src/core/workspace-generation.js +1 -1
  77. package/src/core/workspace-path.js +1 -1
  78. package/src/installer/bounded-command.js +1 -1
  79. package/src/installer/candidate-preflight.js +1 -1
  80. package/src/installer/connection-activation.js +1 -1
  81. package/src/installer/connection-supervisor.js +1 -1
  82. package/src/installer/deployment-draft.js +1 -1
  83. package/src/installer/gateway-context.js +1 -1
  84. package/src/installer/gateway-migration.js +1 -1
  85. package/src/installer/gateway-runtime.js +1 -1
  86. package/src/installer/global-setup.js +1 -1
  87. package/src/installer/hook-context-client.js +1 -1
  88. package/src/installer/host-hooks.js +1 -1
  89. package/src/installer/managed-config.js +1 -1
  90. package/src/installer/platform-config.js +1 -1
  91. package/src/installer/prerequisites.js +1 -1
  92. package/src/installer/presentations.js +1 -1
  93. package/src/installer/project-setup.js +1 -1
  94. package/src/installer/registration-closure.js +1 -1
  95. package/src/installer/registration-plan.js +1 -1
  96. package/src/installer/registration-receipt.js +1 -1
  97. package/src/installer/registrations.js +1 -1
  98. package/src/installer/runtime-activation.js +1 -1
  99. package/src/installer/runtime-child.js +1 -1
  100. package/src/installer/runtime-lock.js +1 -1
  101. package/src/installer/runtime-store.js +1 -1
  102. package/src/installer/runtime-supervisor.js +1 -1
  103. package/src/installer/setup-wizard.js +1 -1
  104. package/src/installer/update-addons.js +1 -1
  105. package/src/installer/update-executor.js +1 -1
  106. package/src/installer/workspace-registry.js +1 -1
  107. package/src/installer/workspace-transaction.js +1 -1
  108. package/src/installer/workspace-update.js +1 -1
  109. package/src/license/crypto.js +1 -1
  110. package/src/license/fingerprint.js +1 -1
  111. package/src/license/terms.js +1 -1
  112. package/src/license/verify.js +1 -1
  113. package/src/presets/index.js +1 -1
  114. package/src/proxy/backends.js +1 -1
  115. package/src/proxy/browser-sessions.js +1 -1
  116. package/src/proxy/core-tools.js +1 -1
  117. package/src/proxy/pipeline.js +1 -1
  118. package/src/proxy/public-catalog.js +1 -1
  119. package/src/proxy/router.config.js +1 -1
  120. package/src/proxy/router.js +1 -1
  121. package/src/proxy/server.js +1 -1
  122. package/src/proxy/workspace-gateway.js +1 -1
  123. package/technical-sources-check.js +251 -0
@@ -1 +1 @@
1
- 'use strict';const _0x484445=_0x512b;(function(_0x37ec24,_0x2c856d){const _0x93c6d0=_0x512b,_0x4023f2=_0x37ec24();while(!![]){try{const _0x14b513=parseInt(_0x93c6d0(0x1d8))/0x1+-parseInt(_0x93c6d0(0x1ca))/0x2+parseInt(_0x93c6d0(0x198))/0x3*(-parseInt(_0x93c6d0(0x1cc))/0x4)+parseInt(_0x93c6d0(0x1b5))/0x5+parseInt(_0x93c6d0(0x1d6))/0x6*(-parseInt(_0x93c6d0(0x1ee))/0x7)+parseInt(_0x93c6d0(0x1b1))/0x8*(-parseInt(_0x93c6d0(0x194))/0x9)+parseInt(_0x93c6d0(0x188))/0xa;if(_0x14b513===_0x2c856d)break;else _0x4023f2['push'](_0x4023f2['shift']());}catch(_0x462501){_0x4023f2['push'](_0x4023f2['shift']());}}}(_0xbc1c,0x76bed));function _0x512b(_0x14fe92,_0x5768d1){_0x14fe92=_0x14fe92-0x186;const _0xbc1c05=_0xbc1c();let _0x512b44=_0xbc1c05[_0x14fe92];if(_0x512b['KSLeOD']===undefined){var _0xbf8178=function(_0x6c31d3){const _0x46ee70='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x5eb0df='',_0x2f776f='';for(let _0x4cb1c3=0x0,_0x45a704,_0x424cc4,_0x318d80=0x0;_0x424cc4=_0x6c31d3['charAt'](_0x318d80++);~_0x424cc4&&(_0x45a704=_0x4cb1c3%0x4?_0x45a704*0x40+_0x424cc4:_0x424cc4,_0x4cb1c3++%0x4)?_0x5eb0df+=String['fromCharCode'](0xff&_0x45a704>>(-0x2*_0x4cb1c3&0x6)):0x0){_0x424cc4=_0x46ee70['indexOf'](_0x424cc4);}for(let _0x25a277=0x0,_0x2002de=_0x5eb0df['length'];_0x25a277<_0x2002de;_0x25a277++){_0x2f776f+='%'+('00'+_0x5eb0df['charCodeAt'](_0x25a277)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2f776f);};_0x512b['azRpVZ']=_0xbf8178,_0x512b['BJQlIK']={},_0x512b['KSLeOD']=!![];}const _0x111606=_0xbc1c05[0x0],_0x2ede86=_0x14fe92+_0x111606,_0x367efc=_0x512b['BJQlIK'][_0x2ede86];return!_0x367efc?(_0x512b44=_0x512b['azRpVZ'](_0x512b44),_0x512b['BJQlIK'][_0x2ede86]=_0x512b44):_0x512b44=_0x367efc,_0x512b44;}const crypto=require(_0x484445(0x1ac)),{WorkspaceRegistry}=require(_0x484445(0x1ab)),{gatewayCatalog}=require('./public-catalog'),{sameWorkspace}=require(_0x484445(0x1f1)),contracts=require('../core/tool-contracts'),fail=(_0x340b9c,_0x57835e=_0x340b9c)=>{const _0x4c265a=_0x484445,_0xb1503b={};_0xb1503b[_0x4c265a(0x195)]=_0x340b9c;throw Object[_0x4c265a(0x199)](new Error(_0x57835e),_0xb1503b);},content=_0x460ba5=>({'content':[{'type':_0x484445(0x1bf),'text':JSON[_0x484445(0x1fa)](_0x460ba5)}]});function _0xbc1c(){const _0x4a2cd9=['C3rVChbLza','mJaYns0WnI0Xoa','CMvWBgfJzq','ChjVBwLZzq','r0furvDbwv9svu5usu1fx1voqvzbsuXbqKXf','C2vZC2LVBL9IB290C3rYyxa','BgLZDa','AxnbCNjHEq','tuLtu0Lor18','D29YA3nWywnLswq','lI4VAw5ZDgfSBgvYl3DVCMTZCgfJzs1YzwDPC3rYEq','BM9KztPJCNLWDg8','yMfJA2vUza','BM93','Dg9tDhjPBMC','C2vZC2LVBKLK','mZa3ndC3nLfzuhHUyq','zgvZy3jPChrPB24','BMfTzq','DhjPBq','mtm5nJK5mfr2qMfjwq','CMvXDwvZDeLK','v09ss1nqqunfx05pvf9sruDju1rfuKve','Dg9VBhmVy2fSBa','Aw5PDgLHBgL6Aw5N','mI4W','CMvNAxn0CNK','y29UBMvJDgLVBKLK','lI4VlI4VCgfJA2fNzs5QC29U','ChjVDg9JB2XwzxjZAw9U','Dgv4Da','yxb0lw1JCc1Hz2vUDa','DgHLBG','CMvQzwn0zwq','Dg9VBhm','C2L6zq','CMvXDwvZDa','BMv4Da','x2j1AwX0Aw4','Aw5WDxrty2HLBwe','C2v0','mtC0mdC0mMLTqLj1tG','CNvUDgLTzuzHy3rVCNK','mJGXntztA2v6tuK','vgHPCYbNyxrLD2f5igHHCYbUBYb2zxjPzMLLzcbJyxrHBg9NigzVCIb0Agf0ihrVB2WU','Ag9ZDa','CgLUzW','CMfUzg9Tvvvjra','yxjNDw1LBNrZ','CMvZB2X2zq','yMLUzgLUz1nLBgvJDgLVBNm','u0vtu0LptL9jrf9srvfvsvjfra','y2XVC2u','nLz1DMT2wG','BwfW','ntm4ndC2BuPmD3jr','DMvYC2LVBG','AgfZ','zgvSzxrL','AgfUzgXL','CMvXDwLYzwq','txv0yxrPB25ZihjLCxvPCMuGDgHLigv4CgXPy2L0BhKGyM91BMqGC2vZC2LVBKLKlG','zw50CMLLCW','BwnWx2fNzw50x2HLywX0Aa','r0furvDbwv9srvfvrvnux0zbsuXfra','Cgf0DgvYBG','mJaYns0WmY0YnG','q2fSBcb3B3jRC3bHy2vFBgLZDcbVBIb0AgLZignVBM5Ly3rPB24Gyw5KihvZzsbPDhmGy3vYCMvUDcbIAw5KAw5Nvg9Rzw4U','Bwv0Ag9K','q2fSBcb3B3jRC3bHy2vFBgLZDcWGDgHLBIbZzxnZAw9Ux2jVB3rZDhjHCcb3AxrOihnLC3nPB25jzcbHBMqGD29YA3nWywnLswqU','C2vSzwn0Aw9U','q0fuquXpr19tq0HftufFq09orKXjq1q','DMfSDwvZ','ugfZCYbZzxnZAw9Uswq7ihrOAxmGy29UBMvJDgLVBIbZzxj2zxmGBxvSDgLWBguGChjVAMvJDcbZzxnZAw9UCY4','CNvUDgLTzq','ChjVzMLSzxm','v09ss1nqqunfx0jjtKrjtKDFq09orKXjq1q','mZq0nJi1nezwAu5TDq','Dg9vChbLCKnHC2u','C3rYAw5N','lI4Vy29Yzs93B3jRC3bHy2uTCgf0Aa','DMfSAwrHDgvjzgvUDgL0Eq','qKfds0vorf9dqvrbte9hx0rju0npvKvswv9srvfvsvjfra','r0furvDbwv9truXfq1rjt05FuKvrvuLsruq','DgvZDa','lI4Vy29Yzs9JywXSzxiTy29UDgv4Da','jdfFjdi','ChvZAa','r0furvDbwv9dte9truq','C3rYAw5NAwz5','DMfSDwu','CgfYyw1Z','D29YA3nWywnL','Aw5PDgLHBgL6zq','BwfWrxHWB3nLzfrVt3jPz2LUywW','z2v0','zMLUza','D29YA3nWywnLx2XPC3q','B2jQzwn0','y2f0ywXVzW','BgvUz3rO','CMvHC29U','DMvYAwz5u2vSzwn0Aw9U','ChjVzMLSzq','zw5HyMXLza','Aw5JBhvKzxm','v29YA3nWywnLr2f0zxDHEq','CMvJB3zLCNK','lI9YB3v0zxi','D29YA3nWywnLugf0Aa','v09ss1nqqunfx0fnqKLhvu9vuW','CNvUswq','B25dyxrHBg9Nq2HHBMDLza','yMLUzgLUz1rVA2vU','ChjVAMvJDfbHDgG','zgvJB3jHDgvhyxrLD2f5vg9VBa','r0furvDbwv9truXfq1rjt05FteLnsvq','zMLSDgvY','mJaYnZK0mdbcrxL3BwG','yMfZzty0DxjS','v09ss1nqqunfx0jjtKrjtKDFuKvrvuLsruq','Dg9VBhmVBgLZDa','DgfZAW','C2vUC2L0AxzLvg9VBa','ywXSu2v0DgXLza','zxHWB3j0CW','mJaYnc0Xms0Wnq','C2vYDMvYl2rPC2nVDMvY','lI9WDwjSAwmTy2f0ywXVzW','BgLZDenOyw5Nzwq','ovrMsgrrsa','y29Kzq','C2vZC2LVBNm','z2f0zxDHEq','mJyXwMTbBufs','yxnZAwDU','zNvUy3rPB24','BM90AwzPy2f0Aw9UCY9PBML0AwfSAxPLza','su5wquXjrf9buKDvtuvovfm','zxHWAxjLC0f0','C2vSzwn0zwq','t25LiefqvcbNyxrLD2f5ihnLCNzLCYbPBNn0ywXSzwqGChjVAMvJDhmUienHBgWGD29YA3nWywnLx2XPC3qSihrOzw4GC2vZC2LVBL9IB290C3rYyxaGD2L0Acb5B3vYihnLC3nPB25jzcbHBMqGDgHLihbYB2PLy3qGD29YA3nWywnLswqUiefSD2f5CYbWyxnZihrOyxqGC2vZC2LVBKLKig9Uihn1yNnLCxvLBNqGy2fSBhmUie5LDMvYigjPBMqGAg9TzsbVCIbZzwXLy3qGysbWCM9Qzwn0igzYB20GCMvJzw5JEs4','BwvZC2fNzq'];_0xbc1c=function(){return _0x4a2cd9;};return _0xbc1c();}function validateIdentity(_0x4382db){const _0x5a6bb0=_0x484445,_0x3a1cab={};_0x3a1cab[_0x5a6bb0(0x1b0)]=contracts[_0x5a6bb0(0x1b0)],_0x3a1cab[_0x5a6bb0(0x1b6)]=contracts[_0x5a6bb0(0x1b6)],_0x3a1cab['task']=contracts[_0x5a6bb0(0x18c)],_0x3a1cab[_0x5a6bb0(0x210)]=contracts[_0x5a6bb0(0x210)];for(const [_0x23185b,_0x20ad62]of Object[_0x5a6bb0(0x1df)](_0x3a1cab)){if(_0x4382db[_0x23185b]===undefined)continue;const _0x6dc452=_0x4382db[_0x23185b];if(typeof _0x6dc452!==_0x5a6bb0(0x1f0)||!_0x6dc452[_0x5a6bb0(0x1b4)]()||_0x6dc452[_0x5a6bb0(0x205)]>_0x20ad62['maxLength']||_0x20ad62[_0x5a6bb0(0x1e2)]&&!new RegExp(_0x20ad62[_0x5a6bb0(0x1e2)])[_0x5a6bb0(0x1f5)](_0x6dc452))fail('INVALID_'+_0x23185b[_0x5a6bb0(0x1a3)](/([a-z])([A-Z])/g,_0x5a6bb0(0x1f7))[_0x5a6bb0(0x1ef)](),_0x20ad62[_0x5a6bb0(0x1b2)]);}}class WorkspaceGateway{constructor(_0xc9556={}){const _0x3707aa=_0x484445;this[_0x3707aa(0x1bb)]=_0xc9556[_0x3707aa(0x1bb)]||new WorkspaceRegistry(),this[_0x3707aa(0x1cb)]=_0xc9556[_0x3707aa(0x1cb)],this[_0x3707aa(0x1ce)]=_0xc9556[_0x3707aa(0x1ce)]||null,this[_0x3707aa(0x1bc)]=_0xc9556[_0x3707aa(0x1bc)]||crypto[_0x3707aa(0x1d0)](),this[_0x3707aa(0x196)]=new Map(),this['initializing']=new Map(),this[_0x3707aa(0x1d3)]=new Map(),this[_0x3707aa(0x204)]=gatewayCatalog(),this[_0x3707aa(0x211)]=_0xc9556[_0x3707aa(0x211)]||(()=>{}),this[_0x3707aa(0x1fe)]=null,this[_0x3707aa(0x1a1)]=![];}async['bind'](_0x2f3e99){const _0x53a05d=_0x484445;if(!_0x2f3e99[_0x53a05d(0x1b0)])fail(_0x53a05d(0x1d4),'Pass\x20the\x20same\x20nonempty\x20sessionId\x20throughout\x20this\x20chat.');const _0x421c4b=this[_0x53a05d(0x196)][_0x53a05d(0x200)](_0x2f3e99[_0x53a05d(0x1b0)]);if(_0x421c4b&&!_0x2f3e99[_0x53a05d(0x1aa)]&&!_0x2f3e99[_0x53a05d(0x20e)])return _0x421c4b;const _0xa3dd84=this[_0x53a05d(0x1b9)][_0x53a05d(0x200)](_0x2f3e99[_0x53a05d(0x1b0)]);if(_0xa3dd84&&!_0x2f3e99[_0x53a05d(0x1aa)]&&!_0x2f3e99[_0x53a05d(0x20e)])return _0xa3dd84[_0x53a05d(0x1a4)];const _0x16ae37=this['registry'][_0x53a05d(0x1d2)](_0x2f3e99,{'host':this[_0x53a05d(0x1ce)]});if(_0x2f3e99['bindingToken'])this[_0x53a05d(0x207)](_0x2f3e99[_0x53a05d(0x212)],_0x16ae37[_0x53a05d(0x1aa)]);if(_0x421c4b){if(!sameWorkspace(_0x16ae37['workspace'],_0x421c4b['workspace']))fail(_0x53a05d(0x1ed));return _0x421c4b;}if(this[_0x53a05d(0x1b9)][_0x53a05d(0x1da)](_0x2f3e99['sessionId'])){const _0x3a83e6=this['initializing'][_0x53a05d(0x200)](_0x2f3e99[_0x53a05d(0x1b0)]);if(!sameWorkspace(_0x3a83e6[_0x53a05d(0x1fd)],_0x16ae37[_0x53a05d(0x1fd)]))fail(_0x53a05d(0x1ed));return _0x3a83e6[_0x53a05d(0x1a4)];}const _0x5da5bf={};_0x5da5bf[_0x53a05d(0x1bc)]=this[_0x53a05d(0x1bc)],_0x5da5bf[_0x53a05d(0x1b0)]=_0x2f3e99[_0x53a05d(0x1b0)],_0x5da5bf[_0x53a05d(0x1fd)]=_0x16ae37[_0x53a05d(0x1fd)],_0x5da5bf[_0x53a05d(0x1aa)]=_0x16ae37[_0x53a05d(0x1aa)],_0x5da5bf['registration']=_0x53a05d(0x1c0),_0x5da5bf['provenance']='caller-selected',_0x5da5bf['nativeIdentity']='unconfirmed';const _0x1a2c76=_0x5da5bf,_0x1b5593=((async()=>{const _0x1f04c4=_0x53a05d;if(typeof this[_0x1f04c4(0x1cb)]!==_0x1f04c4(0x19a))fail(_0x1f04c4(0x1a5));const _0x251ec2=_0x16ae37[_0x1f04c4(0x1ec)]?.[this[_0x1f04c4(0x1ce)]]||{},_0x6fb6c7=await this['runtimeFactory'](_0x1a2c76,this[_0x1f04c4(0x1fe)]||{},_0x251ec2);this[_0x1f04c4(0x1a1)]&&(await _0x6fb6c7[_0x1f04c4(0x1d5)](),fail(_0x1f04c4(0x1f9)));const _0x2024df={..._0x1a2c76};_0x2024df[_0x1f04c4(0x1eb)]=_0x6fb6c7,_0x2024df['profile']=_0x251ec2;const _0x3db439=_0x2024df;return this['sessions'][_0x1f04c4(0x1c9)](_0x2f3e99[_0x1f04c4(0x1b0)],_0x3db439),_0x3db439;})()),_0x1f341f={};_0x1f341f[_0x53a05d(0x1fd)]=_0x16ae37['workspace'],_0x1f341f[_0x53a05d(0x1a4)]=_0x1b5593,this[_0x53a05d(0x1b9)]['set'](_0x2f3e99['sessionId'],_0x1f341f);try{return await _0x1b5593;}finally{this['initializing'][_0x53a05d(0x1db)](_0x2f3e99[_0x53a05d(0x1b0)]);}}[_0x484445(0x1e7)](_0x27defa){const _0xf766c0=_0x484445;for(const [_0x11f7d8,_0x23075e]of this['bindingSelections'])if(_0x23075e[_0xf766c0(0x19d)]<Date['now']())this[_0xf766c0(0x1d3)][_0xf766c0(0x1db)](_0x11f7d8);if(this[_0xf766c0(0x1d3)][_0xf766c0(0x1c4)]>=0x1000)fail(_0xf766c0(0x186));const _0x2b61fa=this['connectionId']+'.'+crypto['randomBytes'](0x20)[_0xf766c0(0x1af)](_0xf766c0(0x189));this[_0xf766c0(0x1d3)]['set'](_0x2b61fa,{'workspaceId':_0x27defa[_0xf766c0(0x1aa)],'expiresAt':Date[_0xf766c0(0x1ae)]()+0xdbba0});const _0x3857e3={};return _0x3857e3[_0xf766c0(0x1aa)]=_0x27defa[_0xf766c0(0x1aa)],_0x3857e3[_0xf766c0(0x1fd)]=_0x27defa[_0xf766c0(0x1fd)],_0x3857e3['bindingToken']=_0x2b61fa,_0x3857e3;}[_0x484445(0x207)](_0x1b7516,_0x18dfa9){const _0x560196=_0x484445,_0x521f03=this[_0x560196(0x1d3)][_0x560196(0x200)](_0x1b7516);if(!_0x521f03||_0x521f03[_0x560196(0x19d)]<Date[_0x560196(0x1ae)]()||_0x521f03['workspaceId']!==_0x18dfa9)fail(_0x560196(0x1f4),_0x560196(0x1e4));return _0x521f03;}[_0x484445(0x19e)](_0x52eb0c){const _0x238644=_0x484445;let _0x433c2b;if(_0x52eb0c[_0x238644(0x1b0)])_0x433c2b=this['sessions']['get'](_0x52eb0c[_0x238644(0x1b0)]);else{if(this['sessions'][_0x238644(0x1c4)]===0x1)_0x433c2b=this[_0x238644(0x196)]['values']()[_0x238644(0x1c6)]()[_0x238644(0x1fb)];else{if(this['sessions'][_0x238644(0x1c4)]>0x1)fail('WORKSPACE_AMBIGUOUS',_0x238644(0x1ea));}}if(!_0x433c2b)fail(_0x238644(0x18a),_0x238644(0x1e6));if(_0x52eb0c[_0x238644(0x1aa)]||_0x52eb0c[_0x238644(0x20e)]){const _0x291251=this[_0x238644(0x1bb)][_0x238644(0x1d2)](_0x52eb0c,{'host':this[_0x238644(0x1ce)]});if(!sameWorkspace(_0x291251['workspace'],_0x433c2b[_0x238644(0x1fd)]))fail(_0x238644(0x1ed));}if(_0x52eb0c[_0x238644(0x213)]&&!sameWorkspace(_0x52eb0c[_0x238644(0x213)],_0x433c2b['workspace']))fail(_0x238644(0x1ed));return _0x433c2b;}async[_0x484445(0x1dc)](_0xec4298){const _0x1b75af=_0x484445;if(this[_0x1b75af(0x1a1)])fail(_0x1b75af(0x1f9));const {id:_0x25d8b4,method:_0x3516ca,params:params={}}=_0xec4298,_0x460268=_0x30a743=>({'jsonrpc':_0x1b75af(0x1ba),'id':_0x25d8b4,'result':_0x30a743});if(_0x3516ca===_0x1b75af(0x1fe)||_0x3516ca===_0x1b75af(0x191)){const _0x32db50=[_0x1b75af(0x190),_0x1b75af(0x1e3),_0x1b75af(0x1a2),'2025-11-25'],_0x5b5530=_0x32db50['includes'](params[_0x1b75af(0x1be)])?params[_0x1b75af(0x1be)]:_0x32db50['at'](-0x1),_0x5c6ab9={...params};_0x5c6ab9[_0x1b75af(0x1be)]=_0x5b5530,this[_0x1b75af(0x1fe)]=_0x5c6ab9;const _0x11ff9a={};_0x11ff9a[_0x1b75af(0x193)]=!![];const _0x19e35b={};return _0x19e35b[_0x1b75af(0x1c3)]=_0x11ff9a,_0x460268({'protocolVersion':_0x5b5530,'capabilities':_0x19e35b,'serverInfo':{'name':_0x1b75af(0x1c0),'version':require(_0x1b75af(0x1bd))['version']},'instructions':_0x1b75af(0x19f)});}if(_0x3516ca===_0x1b75af(0x18b))return _0x460268({'tools':structuredClone(this[_0x1b75af(0x204)])});if(_0x3516ca===_0x1b75af(0x1cf))return _0x460268({});if(_0x3516ca===_0x1b75af(0x19b))return null;const _0x2d41a6={};_0x2d41a6[_0x1b75af(0x195)]=-0x7f59,_0x2d41a6[_0x1b75af(0x1a0)]='Method\x20not\x20found';if(_0x3516ca!==_0x1b75af(0x1b8))return _0x25d8b4===undefined?null:{'jsonrpc':_0x1b75af(0x1ba),'id':_0x25d8b4,'error':_0x2d41a6};try{const _0x206ee1=params[_0x1b75af(0x1d1)]||{};if(Array[_0x1b75af(0x1a8)](_0x206ee1)||typeof _0x206ee1!==_0x1b75af(0x203))fail(_0x1b75af(0x19c));validateIdentity(_0x206ee1);if(params[_0x1b75af(0x1b3)]!=='workspace_list'&&params[_0x1b75af(0x1b3)]!==_0x1b75af(0x1e0)&&require(_0x1b75af(0x1f6))[_0x1b75af(0x18d)](params[_0x1b75af(0x1b3)])&&!_0x206ee1[_0x1b75af(0x1b0)])fail(_0x1b75af(0x1d4),_0x1b75af(0x1de));const _0x4b3b8b=this[_0x1b75af(0x204)][_0x1b75af(0x201)](_0x1d36c2=>_0x1d36c2[_0x1b75af(0x1b3)]===params[_0x1b75af(0x1b3)]);if(!_0x4b3b8b){const _0x4f589f=require(_0x1b75af(0x20d))[_0x1b75af(0x1ff)](params[_0x1b75af(0x1b3)]);if(_0x4f589f&&_0x4f589f[_0x1b75af(0x1ad)]!==_0x1b75af(0x1c7)){const _0x5bf864={};_0x5bf864[_0x1b75af(0x1ad)]=_0x4f589f[_0x1b75af(0x1ad)],_0x5bf864['sessionId']=_0x206ee1[_0x1b75af(0x1b0)];const _0x39d719={};_0x39d719['tool']='mcp_agent_health',_0x39d719[_0x1b75af(0x1d1)]=_0x5bf864;const _0x5f45c3={};_0x5f45c3[_0x1b75af(0x195)]=_0x1b75af(0x1f3),_0x5f45c3[_0x1b75af(0x20c)]=_0x39d719;const _0x1e8ab3=Object['assign'](new Error('This\x20addon\x20needs\x20intentional\x20catalog\x20discovery;\x20call\x20mcp_agent_health\x20with\x20its\x20backend\x20and\x20sessionId.'),_0x5f45c3);throw _0x1e8ab3;}fail('TOOL_NOT_AVAILABLE',_0x1b75af(0x1cd));}if(params[_0x1b75af(0x1b3)]===_0x1b75af(0x202))return _0x460268(content({'workspaces':this[_0x1b75af(0x1bb)][_0x1b75af(0x1a7)]()[_0x1b75af(0x187)](_0x40b647=>!this[_0x1b75af(0x1ce)]||_0x40b647['hosts'][_0x1b75af(0x20a)](this[_0x1b75af(0x1ce)]))[_0x1b75af(0x1d7)](_0xe933ba=>this['selection'](_0xe933ba)),'connectionId':this[_0x1b75af(0x1bc)]}));if(params[_0x1b75af(0x1b3)]===_0x1b75af(0x1e0)&&!_0x206ee1[_0x1b75af(0x1b0)]&&!_0x206ee1[_0x1b75af(0x1ad)])return _0x460268(content({'registration':'apt-mcp-agent','connectionId':this[_0x1b75af(0x1bc)],'boundSessions':this[_0x1b75af(0x196)][_0x1b75af(0x1c4)],'backendsStartedByDiscovery':0x0,'serving':_0x1b75af(0x197),'version':require(_0x1b75af(0x1bd))[_0x1b75af(0x1d9)]}));for(const _0x2c79e9 of _0x4b3b8b[_0x1b75af(0x1c8)]['required']||[])if(_0x206ee1[_0x2c79e9]===undefined&&_0x2c79e9!==_0x1b75af(0x1b0))fail(_0x1b75af(0x1a9)+_0x2c79e9[_0x1b75af(0x1a3)](/([a-z])([A-Z])/g,_0x1b75af(0x1f7))['toUpperCase'](),'Required\x20field:\x20'+_0x2c79e9+'.');const _0x87bf5c=params[_0x1b75af(0x1b3)]==='session_bootstrap'?await this['bind'](_0x206ee1):this[_0x1b75af(0x19e)](_0x206ee1);if(_0x87bf5c[_0x1b75af(0x208)]?.[_0x1b75af(0x1c3)]?.[params['name']]?.[_0x1b75af(0x209)]===![])fail('PROJECT_TOOL_DISABLED');const _0x3e18da={..._0x206ee1};_0x3e18da['sessionId']=_0x87bf5c[_0x1b75af(0x1b0)];const _0x5d575c=_0x3e18da,_0x552d86={...params};_0x552d86['arguments']=_0x5d575c;const _0x520f2a={..._0xec4298};_0x520f2a[_0x1b75af(0x1fc)]=_0x552d86;const _0x2fb8a3=await _0x87bf5c[_0x1b75af(0x1eb)]['request'](_0x520f2a);if(params['name']===_0x1b75af(0x1e0)&&_0x206ee1['backend']&&!_0x2fb8a3['isError']){const _0x544074={};_0x544074[_0x1b75af(0x1e5)]=_0x1b75af(0x18b),_0x544074[_0x1b75af(0x1fc)]={};const _0x294ef3=await _0x87bf5c[_0x1b75af(0x1eb)][_0x1b75af(0x1c5)](_0x544074);let _0x46bc9d=![];for(const _0x148e46 of _0x294ef3['tools']||[]){if(require('./router')[_0x1b75af(0x1ff)](_0x148e46[_0x1b75af(0x1b3)])?.['backend']!==_0x206ee1['backend'])continue;const _0x428933=require(_0x1b75af(0x192))[_0x1b75af(0x214)](structuredClone(_0x148e46)),_0x3f6aa3=this[_0x1b75af(0x204)][_0x1b75af(0x201)](_0x15b4d1=>_0x15b4d1[_0x1b75af(0x1b3)]===_0x428933['name']);if(_0x3f6aa3&&JSON[_0x1b75af(0x1fa)](_0x3f6aa3[_0x1b75af(0x1c8)])!==JSON[_0x1b75af(0x1fa)](_0x428933['inputSchema']))fail(_0x1b75af(0x1e8));!_0x3f6aa3&&(this[_0x1b75af(0x204)][_0x1b75af(0x1f8)](_0x428933),_0x46bc9d=!![]);}if(_0x46bc9d)this[_0x1b75af(0x211)]();}return _0x460268(_0x2fb8a3);}catch(_0x26367d){const _0x5d136b={};return _0x5d136b['tool']=_0x1b75af(0x202),_0x5d136b[_0x1b75af(0x1c1)]=_0x1b75af(0x1a6),_0x5d136b[_0x1b75af(0x1dd)]=[_0x1b75af(0x1b0),_0x1b75af(0x1aa)],_0x460268({...content({'success':![],'code':_0x26367d[_0x1b75af(0x195)]||_0x1b75af(0x1e1),'error':_0x26367d[_0x1b75af(0x1a0)],'recovery':_0x26367d['recovery']||(['WORKSPACE_BINDING_REQUIRED',_0x1b75af(0x20f),_0x1b75af(0x1b7)][_0x1b75af(0x20a)](_0x26367d[_0x1b75af(0x195)])?_0x5d136b:undefined)}),'isError':!![]});}}async[_0x484445(0x1d5)](){const _0x1ba147=_0x484445;this[_0x1ba147(0x1a1)]=!![],await Promise['allSettled']([...this[_0x1ba147(0x1b9)]['values']()]['map'](_0x2090e1=>_0x2090e1[_0x1ba147(0x1a4)]));const _0xed0f50=await Promise[_0x1ba147(0x18e)]([...this[_0x1ba147(0x196)][_0x1ba147(0x1e9)]()][_0x1ba147(0x1d7)](_0x3f1a95=>_0x3f1a95[_0x1ba147(0x1eb)]['close']())),_0x3ca999=_0xed0f50[_0x1ba147(0x201)](_0x31e2a1=>_0x31e2a1['status']===_0x1ba147(0x1c2));if(_0x3ca999)throw _0x3ca999[_0x1ba147(0x206)];this['sessions']['clear']();}}const _0x297a42={};_0x297a42[_0x484445(0x20b)]=WorkspaceGateway,_0x297a42[_0x484445(0x1f2)]=validateIdentity,module[_0x484445(0x18f)]=_0x297a42;
1
+ 'use strict';const _0x762f76=_0x2620;(function(_0x19d6f4,_0x535311){const _0x2ad2e9=_0x2620,_0x121d77=_0x19d6f4();while(!![]){try{const _0x1989df=-parseInt(_0x2ad2e9(0x1b1))/0x1*(-parseInt(_0x2ad2e9(0x1fa))/0x2)+-parseInt(_0x2ad2e9(0x23b))/0x3*(parseInt(_0x2ad2e9(0x1fb))/0x4)+parseInt(_0x2ad2e9(0x1d2))/0x5*(-parseInt(_0x2ad2e9(0x208))/0x6)+-parseInt(_0x2ad2e9(0x21c))/0x7*(parseInt(_0x2ad2e9(0x22c))/0x8)+parseInt(_0x2ad2e9(0x1e6))/0x9+-parseInt(_0x2ad2e9(0x1ff))/0xa*(-parseInt(_0x2ad2e9(0x1de))/0xb)+parseInt(_0x2ad2e9(0x1e7))/0xc;if(_0x1989df===_0x535311)break;else _0x121d77['push'](_0x121d77['shift']());}catch(_0x6b3ace){_0x121d77['push'](_0x121d77['shift']());}}}(_0x3363,0x7f4ee));function _0x3363(){const _0x456a54=['C3rYAw5NAwz5','Dg9vChbLCKnHC2u','Dg9VBa','mJeXodaZm0T6weXfza','mte4nJC4nJH2DLrRC2q','v09ss1nqqunfx0jjtKrjtKDFuKvrvuLsruq','BwfWrxHWB3nLzfrVt3jPz2LUywW','y2fSBgvYlxnLBgvJDgvK','yMfJA2vUza','C2vZC2LVBNm','DMvYC2LVBG','vgHPCYbNyxrLD2f5igHHCYbUBYb2zxjPzMLLzcbJyxrHBg9NigzVCIb0Agf0ihrVB2WU','y2XLyxi','zMLUza','zgvJB3jHDgvhyxrLD2f5vg9VBa','CMvXDwvZDa','y2f0ywXVzW','v09ss1nqqunfx0jjtKrjtKDFq09orKXjq1q','Ag9ZDa','CNvUDgLTzq','z2v0','x2j1AwX0Aw4','BMf0AxzLswrLBNrPDhK','nhPkBvbUva','neHNv2DJAq','ChjVAMvJDfbHDgG','twv0Ag9Kig5VDcbMB3vUza','CMfUzg9Tvvvjra','ota0odu3mgrqD0X6za','C2vZC2LVBL9IB290C3rYyxa','CMvWBgfJzq','q0fuquXpr19tq0HftufFq09orKXjq1q','Aw5JBhvKzxm','yMLUza','ChjVDg9JB2XwzxjZAw9U','D29YA3nWywnLugf0Aa','CMvQzwn0zwq','nty0ndCYmNzovwD5Ea','BMv4Da','mJaYnc0Xms0Wnq','C2L6zq','su5wquXjrf9buKDvtuvovfm','Ag9ZDhm','DMfSAwrHDgvjzgvUDgL0Eq','yxnZAwDU','ve9ptf9ot1rFqvzbsuXbqKXf','CgfYyw1Z','AgfZ','B2jQzwn0','BMfTzq','Cgf0DgvYBG','r0furvDbwv9svu5usu1fx1voqvzbsuXbqKXf','lI9YB3v0zxi','Bwv0Ag9K','C3rHDhvZ','y2XVC2u','u0vtu0LptL9jrf9srvfvsvjfra','mte3mJGZnLPstK5cyW','D29YA3nWywnLx2XPC3q','vgHPCYbHzgrVBIbUzwvKCYbPBNrLBNrPB25HBcbJyxrHBg9NigrPC2nVDMvYEtSGy2fSBcbTy3bFywDLBNrFAgvHBhrOihDPDgGGAxrZigjHy2TLBMqGyw5KihnLC3nPB25jzc4','DMvYAwz5u2vSzwn0Aw9U','D29YA3nWywnL','ChjVzMLSzxm','Dg9VBhm','r0furvDbwv9dte9truq','r0furvDbwv9truXfq1rjt05FuKvrvuLsruq','lI4Vy29Yzs93B3jRC3bHy2uTCgf0Aa','AxnfCNjVCG','C2vUC2L0AxzLvg9VBa','su5wquXjrf8','BM93','zxHWAxjLC0f0','ChjVzMLSzq','ogDWyLjutq','CMvNAxn0CNK','CMvXDwLYzwq','lI4VAw5ZDgfSBgvYl3DVCMTZCgfJzs1YzwDPC3rYEq','zgvZy3jPChrPB24','BM9KztPJCNLWDg8','zw50CMLLCW','BgLZDenOyw5Nzwq','DMfSDwu','jdfFjdi','AxnbCNjHEq','Dg9VBhmVBgLZDa','Dw5JB25MAxjTzwq','mJaYns0Xms0Ynq','C2vYDMvYl2rPC2nVDMvY','mJGWodKZmgrvAwXwtG','v09ss1nqqunfx0fnqKLhvu9vuW','Dg9VBhmVy2fSBa','q2fSBcb3B3jRC3bHy2vFBgLZDcWGDgHLBIbZzxnZAw9Ux2jVB3rZDhjHCcb3AxrOihnLC3nPB25jzcbHBMqGD29YA3nWywnLswqU','yMLUzgLUz1nLBgvJDgLVBNm','ugfZCYbZzxnZAw9Uswq7ihrOAxmGy29UBMvJDgLVBIbZzxj2zxmGBxvSDgLWBguGChjVAMvJDcbZzxnZAw9UCY4','ugfZCYb0AguGC2fTzsbUB25LBxb0EsbZzxnZAw9UswqGDgHYB3vNAg91Dcb0AgLZignOyxqU','z2f0zxDHEq','zxHWB3j0CW','mJe4ndu4C2LtsuTm','DMfSDwvZ','yxb0lw1JCc1Hz2vUDa','BwnWx2fNzw50x2HLywX0Aa','Aw5PDgLHBgL6Aw5N','zgvSzxrL','yMfZzty0DxjS','BwfW','Aw5PDgLHBgL6zq','lI4VlI4VCgfJA2fNzs5QC29U','B25dyxrHBg9Nq2HHBMDLza','DhjPBq','BwvZC2fNzq','CMvJB3zLCNK','y29UBMvJDgLVBKLK','yMLUzgLUz1rVA2vU','CgLUzW','ChjVDMvUyw5Jzq','lI9WDwjSAwmTy2f0ywXVzW','D29YA3nWywnLswq','q2fSBcb3B3jRC3bHy2vFBgLZDcbVBIb0AgLZignVBM5Ly3rPB24Gyw5KihvZzsbPDhmGy3vYCMvUDcbIAw5KAw5Nvg9Rzw4U','y29Kzq','zNvUy3rPB24','C2vSzwn0zwq','lI4Vy29Yzs9JywXSzxiTy29UDgv4Da','tuLtu0Lor18','qKfds0vorf9dqvrbte9hx0rju0npvKvswv9srvfvsvjfra','BgLZDa','yxjNDw1LBNrZ','mI4W','C3rVChbLza','Aw5WDxrty2HLBwe','ChjVBwLZzq','nuXHANnnyq','CNvUDgLTzuzHy3rVCNK','CMvNAxn0CMf0Aw9U','zMLSDgvY','CNvUswq','C2vZC2LVBKLK','ywXSu2v0DgXLza','C3rYAw5N','C2v0','ufjpsKvdvf9ut09mx0rju0fcteve','CMvXDwvZDeLK','lI4Vy29Yzs90B29SlwnVBNrYywn0CW','mtfds2nnAem','CMfUzg9TqNL0zxm','CMvZB2X2zq','mJaYns0WnI0Xoa','C2vSzwn0Aw9U'];_0x3363=function(){return _0x456a54;};return _0x3363();}function _0x2620(_0x1ec129,_0x53abe0){_0x1ec129=_0x1ec129-0x1ad;const _0x33639f=_0x3363();let _0x26204f=_0x33639f[_0x1ec129];if(_0x2620['CsfDGR']===undefined){var _0x3169cf=function(_0x4279dd){const _0x8f08e1='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4dde2e='',_0x10d301='';for(let _0x430ea6=0x0,_0x271065,_0x194d8a,_0x568d03=0x0;_0x194d8a=_0x4279dd['charAt'](_0x568d03++);~_0x194d8a&&(_0x271065=_0x430ea6%0x4?_0x271065*0x40+_0x194d8a:_0x194d8a,_0x430ea6++%0x4)?_0x4dde2e+=String['fromCharCode'](0xff&_0x271065>>(-0x2*_0x430ea6&0x6)):0x0){_0x194d8a=_0x8f08e1['indexOf'](_0x194d8a);}for(let _0x4697a8=0x0,_0x43c3ec=_0x4dde2e['length'];_0x4697a8<_0x43c3ec;_0x4697a8++){_0x10d301+='%'+('00'+_0x4dde2e['charCodeAt'](_0x4697a8)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10d301);};_0x2620['QlhSyH']=_0x3169cf,_0x2620['nDmtOI']={},_0x2620['CsfDGR']=!![];}const _0x13776e=_0x33639f[0x0],_0xde68bc=_0x1ec129+_0x13776e,_0x2b8068=_0x2620['nDmtOI'][_0xde68bc];return!_0x2b8068?(_0x26204f=_0x2620['QlhSyH'](_0x26204f),_0x2620['nDmtOI'][_0xde68bc]=_0x26204f):_0x26204f=_0x2b8068,_0x26204f;}const crypto=require(_0x762f76(0x231)),{WorkspaceRegistry}=require(_0x762f76(0x22f)),{gatewayCatalog}=require('./public-catalog'),{sameWorkspace}=require(_0x762f76(0x225)),contracts=require(_0x762f76(0x1dd)),fail=(_0x55d0c4,_0x560540=_0x55d0c4)=>{const _0x5ba7bf=_0x762f76,_0x39ca27={};_0x39ca27[_0x5ba7bf(0x1c6)]=_0x55d0c4;throw Object[_0x5ba7bf(0x20f)](new Error(_0x560540),_0x39ca27);},content=_0x3f1bcd=>({'content':[{'type':'text','text':JSON[_0x762f76(0x1e3)](_0x3f1bcd)}]});function validateIdentity(_0x17529b){const _0x54da7d=_0x762f76,_0x150703={};_0x150703[_0x54da7d(0x1d7)]=contracts['sessionId'],_0x150703[_0x54da7d(0x1dc)]=contracts[_0x54da7d(0x1dc)],_0x150703['task']=contracts['task'],_0x150703[_0x54da7d(0x1d6)]=contracts['runId'];for(const [_0xc3ff17,_0x1f0c64]of Object[_0x54da7d(0x232)](_0x150703)){if(_0x17529b[_0xc3ff17]===undefined)continue;const _0x3bca32=_0x17529b[_0xc3ff17];if(typeof _0x3bca32!==_0x54da7d(0x1d9)||!_0x3bca32[_0x54da7d(0x1bc)]()||_0x3bca32['length']>_0x1f0c64['maxLength']||_0x1f0c64[_0x54da7d(0x215)]&&!new RegExp(_0x1f0c64['pattern'])['test'](_0x3bca32))fail(_0x54da7d(0x228)+_0xc3ff17['replace'](/([a-z])([A-Z])/g,'$1_$2')[_0x54da7d(0x1e4)](),_0x1f0c64[_0x54da7d(0x230)]);}}class WorkspaceGateway{constructor(_0x1ace89={}){const _0x1ba8a2=_0x762f76;this[_0x1ba8a2(0x22d)]=_0x1ace89[_0x1ba8a2(0x22d)]||new WorkspaceRegistry(),this['runtimeFactory']=_0x1ace89['runtimeFactory'],this[_0x1ba8a2(0x1f5)]=_0x1ace89[_0x1ba8a2(0x1f5)]||null,this[_0x1ba8a2(0x1bf)]=_0x1ace89[_0x1ba8a2(0x1bf)]||crypto[_0x1ba8a2(0x1fe)](),this[_0x1ba8a2(0x1ec)]=new Map(),this[_0x1ba8a2(0x1b5)]=new Map(),this[_0x1ba8a2(0x23f)]=new Map(),this['catalog']=gatewayCatalog(),this[_0x1ba8a2(0x1bb)]=_0x1ace89[_0x1ba8a2(0x1bb)]||(()=>{}),this[_0x1ba8a2(0x1b9)]=null,this[_0x1ba8a2(0x1cf)]=![];}async['bind'](_0x34085f){const _0x19d31e=_0x762f76;if(!_0x34085f[_0x19d31e(0x1d7)])fail(_0x19d31e(0x21b),_0x19d31e(0x1ae));const _0x5df340=this[_0x19d31e(0x1ec)][_0x19d31e(0x1f7)](_0x34085f[_0x19d31e(0x1d7)]);if(_0x5df340&&!_0x34085f[_0x19d31e(0x1c4)]&&!_0x34085f[_0x19d31e(0x206)])return _0x5df340;const _0x6042e0=this[_0x19d31e(0x1b5)][_0x19d31e(0x1f7)](_0x34085f[_0x19d31e(0x1d7)]);if(_0x6042e0&&!_0x34085f[_0x19d31e(0x1c4)]&&!_0x34085f[_0x19d31e(0x206)])return _0x6042e0[_0x19d31e(0x1d1)];const _0x13a044=this[_0x19d31e(0x22d)][_0x19d31e(0x1e0)](_0x34085f,{'host':this[_0x19d31e(0x1f5)]});if(_0x34085f[_0x19d31e(0x1c0)])this[_0x19d31e(0x21f)](_0x34085f[_0x19d31e(0x1c0)],_0x13a044[_0x19d31e(0x1c4)]);if(_0x5df340){if(!sameWorkspace(_0x13a044[_0x19d31e(0x220)],_0x5df340[_0x19d31e(0x220)]))fail(_0x19d31e(0x1f4));return _0x5df340;}if(this[_0x19d31e(0x1b5)][_0x19d31e(0x212)](_0x34085f[_0x19d31e(0x1d7)])){const _0x4d431f=this[_0x19d31e(0x1b5)][_0x19d31e(0x1f7)](_0x34085f['sessionId']);if(!sameWorkspace(_0x4d431f[_0x19d31e(0x220)],_0x13a044[_0x19d31e(0x220)]))fail(_0x19d31e(0x1f4));return _0x4d431f[_0x19d31e(0x1d1)];}const _0x47d520={};_0x47d520['connectionId']=this[_0x19d31e(0x1bf)],_0x47d520[_0x19d31e(0x1d7)]=_0x34085f[_0x19d31e(0x1d7)],_0x47d520[_0x19d31e(0x220)]=_0x13a044['workspace'],_0x47d520[_0x19d31e(0x1c4)]=_0x13a044['workspaceId'],_0x47d520[_0x19d31e(0x1d4)]=_0x19d31e(0x1b3),_0x47d520[_0x19d31e(0x1c2)]=_0x19d31e(0x1ea),_0x47d520[_0x19d31e(0x1f9)]=_0x19d31e(0x238);const _0x348ca3=_0x47d520,_0x2ecadb=((async()=>{const _0x15ceee=_0x19d31e;if(typeof this['runtimeFactory']!==_0x15ceee(0x1c7))fail(_0x15ceee(0x216));const _0x1f7b60=_0x13a044[_0x15ceee(0x221)]?.[this[_0x15ceee(0x1f5)]]||{},_0x420d1a=await this[_0x15ceee(0x1d3)](_0x348ca3,this['initialize']||{},_0x1f7b60);this[_0x15ceee(0x1cf)]&&(await _0x420d1a[_0x15ceee(0x21a)](),fail('GATEWAY_CLOSED'));const _0x47237c={..._0x348ca3};_0x47237c[_0x15ceee(0x1f6)]=_0x420d1a,_0x47237c['profile']=_0x1f7b60;const _0x14e521=_0x47237c;return this[_0x15ceee(0x1ec)]['set'](_0x34085f['sessionId'],_0x14e521),_0x14e521;})()),_0x44370c={};_0x44370c[_0x19d31e(0x220)]=_0x13a044[_0x19d31e(0x220)],_0x44370c['promise']=_0x2ecadb,this[_0x19d31e(0x1b5)][_0x19d31e(0x1da)](_0x34085f[_0x19d31e(0x1d7)],_0x44370c);try{return await _0x2ecadb;}finally{this[_0x19d31e(0x1b5)]['delete'](_0x34085f['sessionId']);}}['selection'](_0xb984ad){const _0x2159d2=_0x762f76;for(const [_0xb49b2b,_0x285e7b]of this[_0x2159d2(0x23f)])if(_0x285e7b['expiresAt']<Date[_0x2159d2(0x229)]())this[_0x2159d2(0x23f)][_0x2159d2(0x1b6)](_0xb49b2b);if(this[_0x2159d2(0x23f)]['size']>=0x1000)fail('GATEWAY_SELECTION_LIMIT');const _0x3177b8=this[_0x2159d2(0x1bf)]+'.'+crypto[_0x2159d2(0x1df)](0x20)['toString'](_0x2159d2(0x1b7));this[_0x2159d2(0x23f)][_0x2159d2(0x1da)](_0x3177b8,{'workspaceId':_0xb984ad[_0x2159d2(0x1c4)],'expiresAt':Date[_0x2159d2(0x229)]()+0xdbba0});const _0x298d7c={};return _0x298d7c['workspaceId']=_0xb984ad[_0x2159d2(0x1c4)],_0x298d7c['workspace']=_0xb984ad[_0x2159d2(0x220)],_0x298d7c[_0x2159d2(0x1c0)]=_0x3177b8,_0x298d7c;}[_0x762f76(0x21f)](_0x4b2461,_0x1127c9){const _0x43e45a=_0x762f76,_0x3b6bde=this[_0x43e45a(0x23f)][_0x43e45a(0x1f7)](_0x4b2461);if(!_0x3b6bde||_0x3b6bde[_0x43e45a(0x22a)]<Date[_0x43e45a(0x229)]()||_0x3b6bde[_0x43e45a(0x1c4)]!==_0x1127c9)fail(_0x43e45a(0x224),_0x43e45a(0x1c5));return _0x3b6bde;}['selected'](_0x4296d4){const _0x93bf80=_0x762f76;let _0x48f445;if(_0x4296d4['sessionId'])_0x48f445=this[_0x93bf80(0x1ec)][_0x93bf80(0x1f7)](_0x4296d4[_0x93bf80(0x1d7)]);else{if(this[_0x93bf80(0x1ec)]['size']===0x1)_0x48f445=this[_0x93bf80(0x1ec)][_0x93bf80(0x1b2)]()[_0x93bf80(0x209)]()[_0x93bf80(0x234)];else{if(this['sessions'][_0x93bf80(0x20b)]>0x1)fail(_0x93bf80(0x23c),_0x93bf80(0x1ad));}}if(!_0x48f445)fail('WORKSPACE_BINDING_REQUIRED',_0x93bf80(0x23e));if(_0x4296d4[_0x93bf80(0x1c4)]||_0x4296d4['workspacePath']){const _0x4697e4=this[_0x93bf80(0x22d)][_0x93bf80(0x1e0)](_0x4296d4,{'host':this[_0x93bf80(0x1f5)]});if(!sameWorkspace(_0x4697e4['workspace'],_0x48f445[_0x93bf80(0x220)]))fail('WORKSPACE_BINDING_CONFLICT');}if(_0x4296d4[_0x93bf80(0x1fc)]&&!sameWorkspace(_0x4296d4[_0x93bf80(0x1fc)],_0x48f445['workspace']))fail('WORKSPACE_BINDING_CONFLICT');return _0x48f445;}async['handle'](_0x300755){const _0x359a1f=_0x762f76;if(this[_0x359a1f(0x1cf)])fail(_0x359a1f(0x223));const {id:_0x51f6db,method:_0x30529f,params:params={}}=_0x300755,_0xb5226=_0x45e547=>({'jsonrpc':'2.0','id':_0x51f6db,'result':_0x45e547});if(_0x30529f===_0x359a1f(0x1b9)||_0x30529f===_0x359a1f(0x23a)){const _0x3c6c8d=[_0x359a1f(0x20a),'2025-03-26',_0x359a1f(0x1e1),_0x359a1f(0x239)],_0x5115e4=_0x3c6c8d[_0x359a1f(0x203)](params[_0x359a1f(0x205)])?params[_0x359a1f(0x205)]:_0x3c6c8d['at'](-0x1),_0x1e0659={...params};_0x1e0659[_0x359a1f(0x205)]=_0x5115e4,this[_0x359a1f(0x1b9)]=_0x1e0659;const _0x2b54db={};_0x2b54db[_0x359a1f(0x233)]=!![];const _0x13856e={};return _0x13856e[_0x359a1f(0x222)]=_0x2b54db,_0xb5226({'protocolVersion':_0x5115e4,'capabilities':_0x13856e,'serverInfo':{'name':_0x359a1f(0x1b3),'version':require(_0x359a1f(0x1ba))[_0x359a1f(0x1ed)]},'instructions':'One\x20APT\x20gateway\x20serves\x20installed\x20projects.\x20Call\x20workspace_list,\x20then\x20session_bootstrap\x20with\x20your\x20sessionId\x20and\x20the\x20project\x20workspaceId.\x20Always\x20pass\x20that\x20sessionId\x20on\x20subsequent\x20calls.\x20Never\x20bind\x20home\x20or\x20select\x20a\x20project\x20from\x20recency.'});}if(_0x30529f===_0x359a1f(0x237))return _0xb5226({'tools':structuredClone(this[_0x359a1f(0x1f3)])});if(_0x30529f===_0x359a1f(0x1c1))return _0xb5226({});if(_0x30529f==='notifications/initialized')return null;const _0x29ba2f={};_0x29ba2f[_0x359a1f(0x1c6)]=-0x7f59,_0x29ba2f[_0x359a1f(0x1bd)]=_0x359a1f(0x1fd);if(_0x30529f!==_0x359a1f(0x23d))return _0x51f6db===undefined?null:{'jsonrpc':_0x359a1f(0x1ce),'id':_0x51f6db,'error':_0x29ba2f};try{const _0x33db8a=params[_0x359a1f(0x1cd)]||{};if(Array[_0x359a1f(0x236)](_0x33db8a)||typeof _0x33db8a!==_0x359a1f(0x213))fail(_0x359a1f(0x20c));validateIdentity(_0x33db8a);if(params[_0x359a1f(0x214)]!==_0x359a1f(0x21d)&&params['name']!==_0x359a1f(0x1b4)&&require(_0x359a1f(0x1c9))[_0x359a1f(0x227)](params['name'])&&!_0x33db8a[_0x359a1f(0x1d7)])fail('SESSION_ID_REQUIRED','Mutations\x20require\x20the\x20explicitly\x20bound\x20sessionId.');const _0x1bad27=this[_0x359a1f(0x1f3)][_0x359a1f(0x1f0)](_0x1841c4=>_0x1841c4['name']===params[_0x359a1f(0x214)]);if(!_0x1bad27){const _0x3c126e=require(_0x359a1f(0x217))['mapExposedToOriginal'](params[_0x359a1f(0x214)]);if(_0x3c126e&&_0x3c126e[_0x359a1f(0x1eb)]!==_0x359a1f(0x1f8)){const _0x1dea14={};_0x1dea14[_0x359a1f(0x1eb)]=_0x3c126e[_0x359a1f(0x1eb)],_0x1dea14['sessionId']=_0x33db8a[_0x359a1f(0x1d7)];const _0x4a4d0b={};_0x4a4d0b[_0x359a1f(0x1e5)]=_0x359a1f(0x1b4),_0x4a4d0b['arguments']=_0x1dea14;const _0x59f2ae={};_0x59f2ae[_0x359a1f(0x1c6)]=_0x359a1f(0x1cb),_0x59f2ae[_0x359a1f(0x1be)]=_0x4a4d0b;const _0x357849=Object[_0x359a1f(0x20f)](new Error(_0x359a1f(0x21e)),_0x59f2ae);throw _0x357849;}fail(_0x359a1f(0x210),_0x359a1f(0x1ee));}if(params[_0x359a1f(0x214)]===_0x359a1f(0x21d))return _0xb5226(content({'workspaces':this[_0x359a1f(0x22d)][_0x359a1f(0x1cc)]()[_0x359a1f(0x1d5)](_0x26a4fe=>!this['host']||_0x26a4fe[_0x359a1f(0x20d)]['includes'](this[_0x359a1f(0x1f5)]))[_0x359a1f(0x1b8)](_0xf9c614=>this[_0x359a1f(0x1e2)](_0xf9c614)),'connectionId':this[_0x359a1f(0x1bf)]}));if(params[_0x359a1f(0x214)]===_0x359a1f(0x1b4)&&!_0x33db8a['sessionId']&&!_0x33db8a[_0x359a1f(0x1eb)])return _0xb5226(content({'registration':'apt-mcp-agent','connectionId':this[_0x359a1f(0x1bf)],'boundSessions':this[_0x359a1f(0x1ec)][_0x359a1f(0x20b)],'backendsStartedByDiscovery':0x0,'serving':_0x359a1f(0x1af),'version':require(_0x359a1f(0x1ba))[_0x359a1f(0x1ed)]}));for(const _0x19aeeb of _0x1bad27['inputSchema']['required']||[])if(_0x33db8a[_0x19aeeb]===undefined&&_0x19aeeb!=='sessionId')fail(_0x359a1f(0x1ca)+_0x19aeeb[_0x359a1f(0x201)](/([a-z])([A-Z])/g,_0x359a1f(0x235))[_0x359a1f(0x1e4)](),'Required\x20field:\x20'+_0x19aeeb+'.');const _0x1364d9=params[_0x359a1f(0x214)]===_0x359a1f(0x200)?await this[_0x359a1f(0x204)](_0x33db8a):this[_0x359a1f(0x1c8)](_0x33db8a);if(_0x1364d9[_0x359a1f(0x22b)]?.[_0x359a1f(0x222)]?.[params[_0x359a1f(0x214)]]?.['enabled']===![])fail(_0x359a1f(0x1db));const _0x5184c0={..._0x33db8a};_0x5184c0['sessionId']=_0x1364d9[_0x359a1f(0x1d7)];const _0x576759=_0x5184c0,_0x15e786={...params};_0x15e786[_0x359a1f(0x1cd)]=_0x576759;const _0xd26f73={..._0x300755};_0xd26f73[_0x359a1f(0x211)]=_0x15e786;const _0x113fd7=await _0x1364d9[_0x359a1f(0x1f6)][_0x359a1f(0x1f2)](_0xd26f73);if(params['name']===_0x359a1f(0x1b4)&&_0x33db8a['backend']&&!_0x113fd7[_0x359a1f(0x226)]){const _0x21282f={};_0x21282f[_0x359a1f(0x218)]='tools/list',_0x21282f[_0x359a1f(0x211)]={};const _0x5c5f2a=await _0x1364d9[_0x359a1f(0x1f6)]['request'](_0x21282f);let _0x228c27=![];for(const _0xe5748 of _0x5c5f2a[_0x359a1f(0x222)]||[]){if(require(_0x359a1f(0x217))[_0x359a1f(0x1e9)](_0xe5748['name'])?.[_0x359a1f(0x1eb)]!==_0x33db8a[_0x359a1f(0x1eb)])continue;const _0x4b2f79=require(_0x359a1f(0x1c3))[_0x359a1f(0x1f1)](structuredClone(_0xe5748)),_0x509932=this[_0x359a1f(0x1f3)]['find'](_0x3fb155=>_0x3fb155[_0x359a1f(0x214)]===_0x4b2f79[_0x359a1f(0x214)]);if(_0x509932&&JSON[_0x359a1f(0x1e3)](_0x509932[_0x359a1f(0x1d0)])!==JSON[_0x359a1f(0x1e3)](_0x4b2f79['inputSchema']))fail(_0x359a1f(0x202));!_0x509932&&(this['catalog']['push'](_0x4b2f79),_0x228c27=!![]);}if(_0x228c27)this[_0x359a1f(0x1bb)]();}return _0xb5226(_0x113fd7);}catch(_0x168ff7){const _0x4f4540={};return _0x4f4540[_0x359a1f(0x1e5)]=_0x359a1f(0x21d),_0x4f4540['then']=_0x359a1f(0x200),_0x4f4540[_0x359a1f(0x22e)]=[_0x359a1f(0x1d7),_0x359a1f(0x1c4)],_0xb5226({...content({'success':![],'code':_0x168ff7[_0x359a1f(0x1c6)]||'GATEWAY_REQUEST_FAILED','error':_0x168ff7[_0x359a1f(0x1bd)],'recovery':_0x168ff7[_0x359a1f(0x1be)]||([_0x359a1f(0x1e8),_0x359a1f(0x23c),'WORKSPACE_NOT_REGISTERED']['includes'](_0x168ff7[_0x359a1f(0x1c6)])?_0x4f4540:undefined)}),'isError':!![]});}}async[_0x762f76(0x21a)](){const _0x1a3204=_0x762f76;this['stopped']=!![],await Promise[_0x1a3204(0x1d8)]([...this[_0x1a3204(0x1b5)][_0x1a3204(0x1b2)]()][_0x1a3204(0x1b8)](_0x314522=>_0x314522[_0x1a3204(0x1d1)]));const _0x540951=await Promise[_0x1a3204(0x1d8)]([...this[_0x1a3204(0x1ec)][_0x1a3204(0x1b2)]()][_0x1a3204(0x1b8)](_0x2edbf5=>_0x2edbf5[_0x1a3204(0x1f6)][_0x1a3204(0x21a)]())),_0x3a2e73=_0x540951[_0x1a3204(0x1f0)](_0x18fe2f=>_0x18fe2f[_0x1a3204(0x219)]===_0x1a3204(0x207));if(_0x3a2e73)throw _0x3a2e73['reason'];this['sessions'][_0x1a3204(0x1ef)]();}}const _0x4c5ca3={};_0x4c5ca3['WorkspaceGateway']=WorkspaceGateway,_0x4c5ca3[_0x762f76(0x20e)]=validateIdentity,module[_0x762f76(0x1b0)]=_0x4c5ca3;
@@ -0,0 +1,251 @@
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) {
87
+ throw new Error(`Package version drift: package.json=${pkg.version}, package-lock.json=${packageLock.version}, package-lock.json packages[""].version=${packageLock.packages?.['']?.version}. Synchronize all three before building.`);
88
+ }
89
+ for (const group of ['dependencies', 'devDependencies', 'optionalDependencies']) {
90
+ const declared = pkg[group] || {}, locked = packageLock.packages?.['']?.[group] || {};
91
+ 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}`);
92
+ }
93
+ for (const name of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies, ...pkg.optionalDependencies })) {
94
+ const installed = packageLock.packages?.[`node_modules/${name}`];
95
+ if (!installed?.version || !installed.integrity) throw new Error(`Missing package lock integrity: ${name}`);
96
+ out.push({ npm: name, version: installed.version, license: installed.license, role: 'addon' });
97
+ }
98
+ for (const id of ['ui-ux-pro-max', 'archify']) {
99
+ // Required companions cannot disappear from discovery when provenance is removed.
100
+ containedFile(root, `.agents/skills/${id}/provenance.json`);
101
+ }
102
+ const marketing = require(path.join(root, 'scripts/marketing-manifest.js')).validateManifest(path.join(root, '.agents/skills'), path.join(root, '.agents/marketing-manifest.json'));
103
+ out.push({ repository: marketing.upstream.repository, ref: marketing.upstream.commit, version: marketing.upstream.version, digest: marketing.bundleDigest, license: marketing.upstream.license });
104
+ // Discover additional imported companions instead of silently ignoring new provenance.
105
+ for (const item of fs.readdirSync(path.join(root, '.agents/skills'), { withFileTypes: true })) {
106
+ if (!item.isDirectory()) continue;
107
+ const relative = `.agents/skills/${item.name}/provenance.json`;
108
+ if (!fs.existsSync(path.join(root, relative))) continue;
109
+ const provenance = readJson(root, relative);
110
+ if (!provenance.files || !Object.keys(provenance.files).length || !provenance.license) throw new Error(`Incomplete provenance: ${item.name}`);
111
+ for (const [file, expected] of Object.entries(provenance.files)) {
112
+ 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}`);
113
+ }
114
+ if (hash(JSON.stringify(provenance.files)) !== provenance.resourceDigest) throw new Error(`Resource digest drift: ${item.name}`);
115
+ out.push({ repository: provenance.repository, ref: provenance.commit, version: provenance.tag, digest: provenance.resourceDigest, license: provenance.license });
116
+ }
117
+ return out;
118
+ }
119
+
120
+ function validate(options = {}) {
121
+ const root = options.root || ROOT;
122
+ const errors = [], warnings = [];
123
+ let registry;
124
+ try { registry = parseRegistry(options.markdown ?? fs.readFileSync(containedFile(root, 'docs/technical-sources.md'), 'utf8')); }
125
+ catch (error) { return { ok: false, errors: [error.message], warnings, sources: [] }; }
126
+ const ids = new Set(), repos = new Map();
127
+ for (const row of registry.sources) {
128
+ const id = row.ID;
129
+ if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id) || ids.has(id)) errors.push(`Invalid or duplicate ID: ${id}`);
130
+ ids.add(id);
131
+ try { const url = new URL(row.Repository); if (url.protocol !== 'https:' || url.username || url.password || url.search || url.hash) throw new Error(); }
132
+ catch { errors.push(`Invalid repository URL: ${id}`); }
133
+ const key = repositoryKey(row.Repository);
134
+ if (repos.has(key)) errors.push(`Duplicate repository: ${id}`);
135
+ repos.set(key, row);
136
+ for (const column of columns) if (!row[column]) errors.push(`Missing ${column}: ${id}`);
137
+ if (!roles.has(row.Role) || !statuses.has(row.Status)) errors.push(`Invalid role/status: ${id}`);
138
+ if (!['commit', 'tag', 'version', 'branch', 'unpinned'].includes(row['Ref type'])) errors.push(`Invalid ref type: ${id}`);
139
+ const ref = row['Pinned ref'].split(';')[0].trim();
140
+ if (row['Ref type'] === 'commit' && !/^[a-f0-9]{40}$/.test(ref)) errors.push(`Invalid commit: ${id}`);
141
+ if (row['Ref type'] === 'version' && !/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(ref)) errors.push(`Invalid version: ${id}`);
142
+ if (row['Ref type'] === 'tag' && !/^[^\s;|]+$/.test(ref)) errors.push(`Invalid tag: ${id}`);
143
+ if (['branch', 'unpinned'].includes(row['Ref type'])) {
144
+ if (!['needs-pinning', 'reference-only', 'deprecated', 'blocked'].includes(row.Status)) errors.push(`Floating source cannot be active: ${id}`);
145
+ }
146
+ if (row.Status === 'needs-pinning') warnings.push(`Needs pin/review: ${id}`);
147
+ if (row.section === 'Reviewed references' && (row.Status === 'active' || !['citation-only', 'adapted-reference'].includes(row.Role))) errors.push(`Reference incorrectly marked managed: ${id}`);
148
+ if (row.section === 'Integrated sources' && row.Role === 'citation-only') errors.push(`Citation incorrectly marked integrated: ${id}`);
149
+ const date = Date.parse(row['Last reviewed']);
150
+ 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}`);
151
+ if (!/^[a-f0-9]{64}$/.test(row['Resource digest']) && row['Resource digest'] !== 'none') errors.push(`Invalid digest: ${id}`);
152
+ if (row['License / notice'] === 'unknown' && row.Status === 'active') errors.push(`License unknown for active source: ${id}`);
153
+ const notice = row['License / notice'].split('@')[1]?.trim();
154
+ if (notice && !notice.startsWith('https://') && !options.packageOnly) { try { containedFile(root, notice); } catch (error) { errors.push(error.message); } }
155
+ }
156
+ const branches = new Set();
157
+ for (const row of registry.branches) {
158
+ const date = Date.parse(row['Last reviewed']);
159
+ 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}`);
160
+ branches.add(row.Branch);
161
+ }
162
+ try {
163
+ for (const expected of bindings(root, options.packageOnly)) {
164
+ const row = expected.npm ? registry.sources.find(row => new RegExp(`(?:^|[; ]+)npm=${expected.npm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?:[; ]|$)`).test(row.Notes)) : repos.get(repositoryKey(expected.repository || ''));
165
+ if (!row) { errors.push(`Source missing from registry: ${expected.repository || expected.npm}`); continue; }
166
+ 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}`);
167
+ if (expected.ref && row['Pinned ref'].split(';')[0].trim() !== expected.ref) errors.push(`Ref drift: ${row.ID}`);
168
+ 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})`);
169
+ if (expected.digest && row['Resource digest'] !== expected.digest) errors.push(`Digest drift: ${row.ID}`);
170
+ if (expected.license && row['License / notice'].split('@')[0].trim() !== expected.license) errors.push(`License drift: ${row.ID}`);
171
+ }
172
+ } catch (error) { errors.push(error.message); }
173
+ return { ok: errors.length === 0, errors: [...new Set(errors)], warnings: [...new Set(warnings)], sources: registry.sources, branches: registry.branches };
174
+ }
175
+
176
+ async function getJson(url, fetcher = fetch) {
177
+ const response = await fetcher(url, { headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'APT-technical-sources' }, signal: AbortSignal.timeout(15000) });
178
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
179
+ return response.json();
180
+ }
181
+
182
+ async function refresh(options = {}) {
183
+ const local = validate(options);
184
+ const sources = options.source ? local.sources.filter(row => row.ID === options.source) : local.sources;
185
+ if (options.source && !sources.length) throw new Error(`Unknown source ID: ${options.source}`);
186
+ const results = [];
187
+ for (const row of sources) {
188
+ const repo = /^https:\/\/github\.com\/([\w.-]+\/[\w.-]+)$/.exec(row.Repository)?.[1];
189
+ if (!repo) { results.push({ id: row.ID, status: 'manual-review', reason: 'Official documentation source has no repository discovery endpoint' }); continue; }
190
+ try {
191
+ const base = `https://api.github.com/repos/${repo}`;
192
+ const metadata = await getJson(base, options.fetcher);
193
+ const [head, tags] = await Promise.all([getJson(`${base}/commits/${encodeURIComponent(metadata.default_branch)}`, options.fetcher), getJson(`${base}/tags?per_page=20`, options.fetcher)]);
194
+ let release;
195
+ try { release = await getJson(`${base}/releases/latest`, options.fetcher); }
196
+ catch (error) { if (error.message !== 'HTTP 404') throw error; }
197
+ const pin = row['Pinned ref'].split(';')[0].trim();
198
+ const updates = [];
199
+ if (['branch', 'unpinned'].includes(row['Ref type'])) updates.push('pin-review');
200
+ const npm = /(?:^|[; ]+)npm=([^; ]+)/.exec(row.Notes)?.[1];
201
+ let npmLatest = null;
202
+ if (npm) {
203
+ const packageInfo = await getJson(`https://registry.npmjs.org/${encodeURIComponent(npm)}/latest`, options.fetcher);
204
+ npmLatest = packageInfo.version;
205
+ if (npmLatest !== versionFromRow(row)) updates.push('npm-version-changed');
206
+ }
207
+ if (row['Ref type'] === 'commit' && head.sha !== pin) updates.push('branch-head-changed');
208
+ if (row['Ref type'] === 'tag' && tags[0]?.name !== pin) updates.push('tag-changed');
209
+ const version = /(?:^|;)\s*version=([^;]+)/.exec(row['Pinned ref'])?.[1] || (row['Ref type'] === 'version' ? pin : null);
210
+ if (version && release?.tag_name && release.tag_name.replace(/^v/, '') !== version.replace(/^v/, '')) updates.push('release-changed');
211
+ const license = metadata.license?.spdx_id || 'unknown';
212
+ if (license === 'unknown' || row['License / notice'].split('@')[0].trim() !== license) updates.push('license-review');
213
+ let comparison = null;
214
+ if (row['Ref type'] === 'commit') {
215
+ comparison = await getJson(`${base}/compare/${pin}...${head.sha}`, options.fetcher);
216
+ 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');
217
+ }
218
+ results.push({ id: row.ID, status: updates.length ? 'review-required' : 'unchanged', updates,
219
+ floating: ['branch', 'unpinned'].includes(row['Ref type']), canonicalRepository: metadata.html_url,
220
+ branch: metadata.default_branch, head: head.sha, tags: tags.map(tag => ({ name: tag.name, commit: tag.commit?.sha })),
221
+ release: release?.tag_name || null, npmLatest, license,
222
+ localDrift: local.errors.filter(error => error.includes(row.ID)),
223
+ compatibility: 'unverified', comparison: comparison ? { url: comparison.html_url, commits: comparison.total_commits, changedFiles: comparison.files?.length ?? null, filesMayBeTruncated: (comparison.files?.length || 0) >= 300 } : null });
224
+ } catch (error) { results.push({ id: row.ID, status: 'unreachable', error: error.message, compatibility: 'unverified' }); }
225
+ }
226
+ return { checkedAt: new Date().toISOString(), nonMutating: true, localValidation: { ok: local.ok, errors: local.errors, warnings: local.warnings }, results };
227
+ }
228
+
229
+ function versionFromRow(row) { return /(?:^|;)\s*version=([^;]+)/.exec(row['Pinned ref'])?.[1] || (row['Ref type'] === 'version' ? row['Pinned ref'] : null); }
230
+
231
+ async function main(argv = process.argv.slice(2)) {
232
+ const action = argv.shift();
233
+ let source = null, json = false;
234
+ while (argv.length) {
235
+ const arg = argv.shift();
236
+ if (arg === '--json') json = true;
237
+ else if (arg === '--source' && argv[0] && !argv[0].startsWith('--')) source = argv.shift();
238
+ else throw new Error(`Unknown or incomplete option: ${arg}`);
239
+ }
240
+ if (!['validate', 'refresh'].includes(action)) throw new Error('Expected validate or refresh');
241
+ if (action === 'validate' && source) throw new Error('--source is only supported by refresh');
242
+ const report = action === 'validate' ? validate({ packageOnly: PACKAGED }) : await refresh({ source, packageOnly: PACKAGED });
243
+ const failed = action === 'validate' ? !report.ok : !report.localValidation.ok || report.results.some(item => item.status === 'unreachable');
244
+ if (json) console.log(JSON.stringify(report, null, 2));
245
+ 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); }
246
+ 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.'); }
247
+ process.exitCode = failed ? 1 : 0;
248
+ }
249
+
250
+ 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; });
251
+ module.exports = { columns, parseRegistry, containedFile, skillDigest, bindings, validate, refresh, main };