@profoundlogic/coderflow-server 0.2.8 → 0.3.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 (143) hide show
  1. package/dist/coder-server.js +1 -1
  2. package/dist/config/cli-models.json +1 -0
  3. package/dist/config.js +1 -1
  4. package/dist/lib/agent-keepalive.js +1 -1
  5. package/dist/lib/api-keys.js +1 -1
  6. package/dist/lib/apiKeys.js +1 -1
  7. package/dist/lib/app-server-ports.js +1 -1
  8. package/dist/lib/auto-judge.js +1 -1
  9. package/dist/lib/basic-auth.js +1 -1
  10. package/dist/lib/build-history.js +1 -1
  11. package/dist/lib/build-output-service.js +1 -1
  12. package/dist/lib/build-scheduler.js +1 -1
  13. package/dist/lib/build-service.js +1 -1
  14. package/dist/lib/ca-certificates.js +1 -1
  15. package/dist/lib/claude-oauth-refresh.js +1 -1
  16. package/dist/lib/cli/build.js +1 -1
  17. package/dist/lib/cli/config-command.js +1 -1
  18. package/dist/lib/cli/config.js +1 -1
  19. package/dist/lib/cli/create-user.js +1 -1
  20. package/dist/lib/cli/init.js +1 -1
  21. package/dist/lib/cli/jira.js +1 -1
  22. package/dist/lib/cli/license.js +1 -1
  23. package/dist/lib/cli/server-manager.js +1 -1
  24. package/dist/lib/container-tokens.js +1 -1
  25. package/dist/lib/data-dir.js +1 -1
  26. package/dist/lib/deployment-history.js +1 -1
  27. package/dist/lib/deployment-service.js +1 -1
  28. package/dist/lib/docker-utils.js +1 -1
  29. package/dist/lib/email.js +1 -1
  30. package/dist/lib/emailTemplates.js +1 -1
  31. package/dist/lib/entitlement.js +1 -1
  32. package/dist/lib/fetch-utils.js +1 -1
  33. package/dist/lib/git-commit-details-route.js +1 -1
  34. package/dist/lib/git-history-diff-guardrails.js +1 -1
  35. package/dist/lib/git-provider-service.js +1 -1
  36. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -1
  37. package/dist/lib/git-provider-setup/index.js +1 -1
  38. package/dist/lib/git-provider-setup/setup-factory.js +1 -1
  39. package/dist/lib/git-provider-setup/setup-interface.js +1 -1
  40. package/dist/lib/git-providers/azure-devops-provider.js +1 -1
  41. package/dist/lib/git-providers/github-app-provider.js +1 -1
  42. package/dist/lib/git-providers/index.js +1 -1
  43. package/dist/lib/git-providers/provider-factory.js +1 -1
  44. package/dist/lib/git-providers/provider-interface.js +1 -1
  45. package/dist/lib/github-urls.js +1 -1
  46. package/dist/lib/group-objective-linking.js +1 -1
  47. package/dist/lib/jira-client.js +1 -1
  48. package/dist/lib/judge-blinding.js +1 -1
  49. package/dist/lib/logger.js +1 -1
  50. package/dist/lib/model-fetcher.js +1 -1
  51. package/dist/lib/notifications.js +1 -1
  52. package/dist/lib/oidc-auth.js +1 -1
  53. package/dist/lib/oidc-device-flow.js +1 -1
  54. package/dist/lib/passwordTokens.js +1 -1
  55. package/dist/lib/pin-cascade.js +1 -1
  56. package/dist/lib/provider-accounts.js +1 -1
  57. package/dist/lib/provider-oauth.js +1 -1
  58. package/dist/lib/provider-profile.js +1 -1
  59. package/dist/lib/provider-token-refresh.js +1 -1
  60. package/dist/lib/request-url.js +1 -1
  61. package/dist/lib/rewind.js +1 -1
  62. package/dist/lib/roles.js +1 -1
  63. package/dist/lib/secrets.js +1 -1
  64. package/dist/lib/setup-repo-git-auth.js +1 -1
  65. package/dist/lib/state-capture.js +1 -1
  66. package/dist/lib/static-files.js +1 -1
  67. package/dist/lib/task-name-generator.js +1 -1
  68. package/dist/lib/user-git-oauth.js +1 -1
  69. package/dist/lib/user-git-tokens.js +1 -1
  70. package/dist/lib/users.js +1 -1
  71. package/dist/middleware/requireAuth.js +1 -1
  72. package/dist/middleware/requireInit.js +1 -1
  73. package/dist/middleware/requirePermission.js +1 -1
  74. package/dist/package.json +1 -1
  75. package/dist/routes/apiKeys.js +1 -1
  76. package/dist/routes/auth-oidc.js +1 -1
  77. package/dist/routes/auth.js +1 -1
  78. package/dist/routes/build.js +1 -1
  79. package/dist/routes/containers.js +1 -1
  80. package/dist/routes/deploy-task.js +1 -1
  81. package/dist/routes/environment-management.js +1 -1
  82. package/dist/routes/environments.js +1 -1
  83. package/dist/routes/external-skills.js +1 -1
  84. package/dist/routes/git-credentials.js +1 -1
  85. package/dist/routes/git-oauth.js +1 -1
  86. package/dist/routes/git-provider-setup.js +1 -1
  87. package/dist/routes/health.js +1 -1
  88. package/dist/routes/jira.js +1 -1
  89. package/dist/routes/objective-management.js +1 -1
  90. package/dist/routes/password.js +1 -1
  91. package/dist/routes/prompt.js +1 -1
  92. package/dist/routes/provider-auth.js +1 -1
  93. package/dist/routes/qa.js +1 -1
  94. package/dist/routes/settings.js +1 -1
  95. package/dist/routes/skill-management.js +1 -1
  96. package/dist/routes/skills.js +1 -1
  97. package/dist/routes/tasks.js +1 -1
  98. package/dist/routes/templates.js +1 -1
  99. package/dist/routes/test-task.js +1 -1
  100. package/dist/routes/test.js +1 -1
  101. package/dist/routes/users.js +1 -1
  102. package/dist/routes/visualizations.js +1 -1
  103. package/dist/scripts/create-user.js +1 -1
  104. package/dist/shipped-skills/skill-editor/SKILL.md +124 -231
  105. package/dist/start.js +1 -1
  106. package/dist/web-ui/public/activity-detail-modal.js +1 -1
  107. package/dist/web-ui/public/activity-feed.js +1 -1
  108. package/dist/web-ui/public/activity-formatters.js +1 -1
  109. package/dist/web-ui/public/agent-event-parser.js +1 -1
  110. package/dist/web-ui/public/app.js +1 -1
  111. package/dist/web-ui/public/approve-dialog.js +1 -1
  112. package/dist/web-ui/public/comments-widget.js +1 -1
  113. package/dist/web-ui/public/diff-utils.js +1 -1
  114. package/dist/web-ui/public/environments.css +81 -1
  115. package/dist/web-ui/public/environments.html +8 -3
  116. package/dist/web-ui/public/environments.js +1 -1
  117. package/dist/web-ui/public/feedback-widget.js +1 -1
  118. package/dist/web-ui/public/git-history-lazy-utils.js +1 -1
  119. package/dist/web-ui/public/git-history.html +1 -1
  120. package/dist/web-ui/public/git-history.js +1 -1
  121. package/dist/web-ui/public/git-status.js +1 -1
  122. package/dist/web-ui/public/index.js +1 -1
  123. package/dist/web-ui/public/login.js +1 -1
  124. package/dist/web-ui/public/markdown-editor.js +1 -1
  125. package/dist/web-ui/public/markdown-file-editor.js +1 -1
  126. package/dist/web-ui/public/modal-maximize.js +1 -1
  127. package/dist/web-ui/public/notifications.js +1 -1
  128. package/dist/web-ui/public/server-health.js +1 -1
  129. package/dist/web-ui/public/settings.js +1 -1
  130. package/dist/web-ui/public/setup-password.js +1 -1
  131. package/dist/web-ui/public/skills.css +110 -3
  132. package/dist/web-ui/public/skills.html +7 -4
  133. package/dist/web-ui/public/skills.js +1 -1
  134. package/dist/web-ui/public/sse-client.js +1 -1
  135. package/dist/web-ui/public/sse-shared-worker.js +1 -1
  136. package/dist/web-ui/public/styles.css +128 -1
  137. package/dist/web-ui/public/task.html +22 -1
  138. package/dist/web-ui/public/task.js +1 -1
  139. package/dist/web-ui/public/terminal.js +1 -1
  140. package/dist/web-ui/public/theme.js +1 -1
  141. package/dist/web-ui/public/users.js +1 -1
  142. package/dist/web-ui/public/variant-grouping.js +1 -1
  143. package/package.json +1 -1
@@ -1 +1 @@
1
- const _0x38c235=_0x29b8;(function(_0x3b72d9,_0x5f534d){const _0x50269a=_0x29b8,_0x5bb840=_0x3b72d9();while(!![]){try{const _0x507345=-parseInt(_0x50269a(0x1e3))/0x1*(parseInt(_0x50269a(0x1d1))/0x2)+-parseInt(_0x50269a(0x1c6))/0x3+parseInt(_0x50269a(0x1c1))/0x4*(-parseInt(_0x50269a(0x1da))/0x5)+parseInt(_0x50269a(0x1e7))/0x6*(parseInt(_0x50269a(0x1f5))/0x7)+parseInt(_0x50269a(0x1d7))/0x8+parseInt(_0x50269a(0x1ca))/0x9+parseInt(_0x50269a(0x1ed))/0xa;if(_0x507345===_0x5f534d)break;else _0x5bb840['push'](_0x5bb840['shift']());}catch(_0x5466a5){_0x5bb840['push'](_0x5bb840['shift']());}}}(_0x185b,0x9972b));import{initTheme,mountThemeToggle}from'./theme.js';initTheme();const urlParams=new URLSearchParams(window[_0x38c235(0x1ef)][_0x38c235(0x1cc)]),token=urlParams[_0x38c235(0x1ce)](_0x38c235(0x1d8)),loadingEl=document[_0x38c235(0x1c7)](_0x38c235(0x1c4)),setupContentEl=document[_0x38c235(0x1c7)]('setup-content'),setupFormEl=document[_0x38c235(0x1c7)](_0x38c235(0x1d2)),setupMessageEl=document['getElementById'](_0x38c235(0x1bf)),userUsernameEl=document[_0x38c235(0x1c7)](_0x38c235(0x1cb)),userNameEl=document[_0x38c235(0x1c7)](_0x38c235(0x1cf)),passwordInput=document[_0x38c235(0x1c7)](_0x38c235(0x1c5)),confirmPasswordInput=document['getElementById']('confirm-password'),submitButton=setupFormEl?.[_0x38c235(0x1e5)](_0x38c235(0x1e6));function _0x185b(){const _0x30f7dc=['y2XHC3noyw1L','mJi2nJaXmvztsLzRuW','DxnLCI11C2vYBMfTzq','C2vHCMnO','zgLZywjSzwq','z2v0','DxnLCI1Uyw1L','BM9Uzq','mtC1nJa1nezuyNDnva','C2v0DxaTzM9YBq','rMfPBgvKihrVihnLDcbWyxnZD29YzdO','re9nq29UDgvUDeXVywrLza','zxjYB3i','ChjLDMvUDerLzMf1Bhq','mJC2mdmYBM1rA2f2','Dg9Rzw4','C3vJy2vZCW','mZKYnZb4D3fWBKm','l2XVz2LUlMH0BwW','Dgv4DenVBNrLBNq','l3bHC3n3B3jKl3zHBgLKyxrLlxrVA2vUp3rVA2vUpq','yxbWBgLJyxrPB24VANnVBG','DMLZAwjSzq','yMXVy2S','l3bHC3n3B3jKl3nLDhvW','C3r5Bgu','mwnQBLHruq','rMfPBgvKihrVihnLDcbWyxnZD29Yza','CxvLCNLtzwXLy3rVCG','yNv0Dg9Uw3r5Cgu9iNn1yM1PDcjD','mJq5nJC1mejwwfv2tW','BMfTzq','sw52ywXPzcbVCIbLEhbPCMvKihrVA2vUlIbqBgvHC2uGCMvXDwvZDcbHig5LDYbWyxnZD29YzcbZzxr1CcbSAw5RlG','zgLZCgXHEq','C3rYAw5NAwz5','ihzPC2LIBgu','mtKZmJiXndb5Dfblse4','u2v0DgLUzYbWyxnZD29Yzc4UlG','Bg9JyxrPB24','zM9JDxm','DMfSDwu','rMfPBgvKihrVihzHBgLKyxrLihrVA2vUoG','DxnLCM5HBwu','ywrKrxzLBNrmAxn0zw5LCG','n0Hdzwjfvq','C3vIBwL0','rMfPBgvKihrVihnLDcbWyxnZD29Yzc4GugXLyxnLihrYEsbHz2fPBI4','tM8GDg9Rzw4GChjVDMLKzwqUifbSzwfZzsbJAgvJAYb0AguGBgLUAYb5B3uGCMvJzwL2zwqU','C2v0DxaTBwvZC2fNzsa','ugfZC3DVCMrZigrVig5VDcbTyxrJAa','y2XHC3nmAxn0','uMvZzxqGEw91CIbWyxnZD29Yza','C2v0DxaTBwvZC2fNzq','ANnVBG','mJbADvvwv0G','CMvTB3zL','DxnLCG','Bg9HzgLUzW','CgfZC3DVCMq','mZi2nJqWnKLgtgrWsq','z2v0rwXLBwvUDej5swq','ugfZC3DVCMqGC2v0ihn1y2nLC3nMDwXSEseGuMvKAxjLy3rPBMCGDg8GBg9NAw4UlI4'];_0x185b=function(){return _0x30f7dc;};return _0x185b();}function showMessage(_0x348df5,_0x183d42=_0x38c235(0x1d5)){const _0x5a60a2=_0x38c235;setupMessageEl[_0x5a60a2(0x1dc)]=_0x348df5,setupMessageEl[_0x5a60a2(0x1c9)]=_0x5a60a2(0x1bb)+_0x183d42+_0x5a60a2(0x1ec);}function hideMessage(){const _0x487fee=_0x38c235;setupMessageEl[_0x487fee(0x1c9)]=_0x487fee(0x1bf);}function showError(_0x5cffe8){const _0x161246=_0x38c235;loadingEl[_0x161246(0x1bd)]['remove'](_0x161246(0x1df)),setupContentEl[_0x161246(0x1e2)][_0x161246(0x1ea)]='block',document[_0x161246(0x1c7)]('user-info')['style'][_0x161246(0x1ea)]=_0x161246(0x1d0),setupFormEl[_0x161246(0x1e2)][_0x161246(0x1ea)]=_0x161246(0x1d0),showMessage(_0x5cffe8,_0x161246(0x1d5));}async function validateToken(){const _0x337ccb=_0x38c235;if(!token){showError(_0x337ccb(0x1ba));return;}try{const _0x2acbc2=await fetch(_0x337ccb(0x1dd)+encodeURIComponent(token)),_0x347a94=await _0x2acbc2[_0x337ccb(0x1c0)]();if(!_0x347a94['valid']){showError(_0x347a94['error']||_0x337ccb(0x1e9));return;}loadingEl['classList'][_0x337ccb(0x1c2)](_0x337ccb(0x1df)),setupContentEl[_0x337ccb(0x1e2)]['display']=_0x337ccb(0x1e0),userUsernameEl[_0x337ccb(0x1dc)]=_0x347a94['user'][_0x337ccb(0x1f3)],userNameEl[_0x337ccb(0x1dc)]=_0x347a94[_0x337ccb(0x1c3)][_0x337ccb(0x1e8)];const _0x1366ab=document[_0x337ccb(0x1e5)]('.setup-header\x20p');_0x347a94['type']==='reset'?_0x1366ab[_0x337ccb(0x1dc)]=_0x337ccb(0x1be):_0x1366ab[_0x337ccb(0x1dc)]='Create\x20a\x20secure\x20password\x20for\x20your\x20account',passwordInput[_0x337ccb(0x1f0)]();}catch(_0x575c9d){console[_0x337ccb(0x1d5)](_0x337ccb(0x1f2),_0x575c9d),showError('Failed\x20to\x20validate\x20token.\x20Please\x20try\x20again\x20or\x20contact\x20your\x20administrator.');}}async function handleSubmit(_0x3c3870){const _0x2d23d4=_0x38c235;_0x3c3870[_0x2d23d4(0x1d6)](),hideMessage();const _0x478be1=passwordInput[_0x2d23d4(0x1f1)],_0x4770fe=confirmPasswordInput[_0x2d23d4(0x1f1)];if(_0x478be1!==_0x4770fe){showMessage(_0x2d23d4(0x1bc),_0x2d23d4(0x1d5)),confirmPasswordInput[_0x2d23d4(0x1f0)]();return;}if(_0x478be1['length']<0x8){showMessage('Password\x20must\x20be\x20at\x20least\x208\x20characters\x20long',_0x2d23d4(0x1d5)),passwordInput[_0x2d23d4(0x1f0)]();return;}submitButton[_0x2d23d4(0x1cd)]=!![],submitButton[_0x2d23d4(0x1dc)]=_0x2d23d4(0x1ee);try{const _0x3c1f09=await fetch(_0x2d23d4(0x1e1),{'method':'POST','headers':{'Content-Type':_0x2d23d4(0x1de)},'body':JSON[_0x2d23d4(0x1eb)]({'token':token,'password':_0x478be1})}),_0x5a691c=await _0x3c1f09[_0x2d23d4(0x1c0)]();if(!_0x3c1f09['ok'])throw new Error(_0x5a691c[_0x2d23d4(0x1d5)]||_0x2d23d4(0x1e4));showMessage(_0x2d23d4(0x1c8),_0x2d23d4(0x1d9)),setupFormEl['reset'](),setTimeout(()=>{const _0xcd6511=_0x2d23d4;window[_0xcd6511(0x1ef)]['href']=_0xcd6511(0x1db);},0x7d0);}catch(_0x37631f){console[_0x2d23d4(0x1d5)](_0x2d23d4(0x1d3),_0x37631f),showMessage(_0x37631f['message']||_0x2d23d4(0x1f7),'error'),submitButton[_0x2d23d4(0x1cd)]=![],submitButton[_0x2d23d4(0x1dc)]='Set\x20Password';}}function _0x29b8(_0x588763,_0x4c38a5){_0x588763=_0x588763-0x1ba;const _0x185be6=_0x185b();let _0x29b879=_0x185be6[_0x588763];if(_0x29b8['xYZhBv']===undefined){var _0x3461df=function(_0x428b44){const _0x33b4da='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x348df5='',_0x183d42='';for(let _0x5cffe8=0x0,_0x2acbc2,_0x347a94,_0x1366ab=0x0;_0x347a94=_0x428b44['charAt'](_0x1366ab++);~_0x347a94&&(_0x2acbc2=_0x5cffe8%0x4?_0x2acbc2*0x40+_0x347a94:_0x347a94,_0x5cffe8++%0x4)?_0x348df5+=String['fromCharCode'](0xff&_0x2acbc2>>(-0x2*_0x5cffe8&0x6)):0x0){_0x347a94=_0x33b4da['indexOf'](_0x347a94);}for(let _0x575c9d=0x0,_0x3c3870=_0x348df5['length'];_0x575c9d<_0x3c3870;_0x575c9d++){_0x183d42+='%'+('00'+_0x348df5['charCodeAt'](_0x575c9d)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x183d42);};_0x29b8['XWqbkZ']=_0x3461df,_0x29b8['wbWKIH']={},_0x29b8['xYZhBv']=!![];}const _0x3a0b16=_0x185be6[0x0],_0x1c8ca1=_0x588763+_0x3a0b16,_0x422bfd=_0x29b8['wbWKIH'][_0x1c8ca1];return!_0x422bfd?(_0x29b879=_0x29b8['XWqbkZ'](_0x29b879),_0x29b8['wbWKIH'][_0x1c8ca1]=_0x29b879):_0x29b879=_0x422bfd,_0x29b879;}setupFormEl&&setupFormEl[_0x38c235(0x1f4)](_0x38c235(0x1f6),handleSubmit);validateToken(),document[_0x38c235(0x1f4)](_0x38c235(0x1d4),()=>{mountThemeToggle();});
1
+ const _0x3040af=_0x4fd5;(function(_0x3ae6c7,_0x2e92f0){const _0x1ef147=_0x4fd5,_0x5b87b8=_0x3ae6c7();while(!![]){try{const _0xc66def=parseInt(_0x1ef147(0x80))/0x1+-parseInt(_0x1ef147(0x7b))/0x2+-parseInt(_0x1ef147(0x86))/0x3*(-parseInt(_0x1ef147(0x8e))/0x4)+parseInt(_0x1ef147(0x91))/0x5*(-parseInt(_0x1ef147(0xb1))/0x6)+parseInt(_0x1ef147(0xa2))/0x7*(parseInt(_0x1ef147(0xa7))/0x8)+parseInt(_0x1ef147(0xa3))/0x9*(parseInt(_0x1ef147(0x78))/0xa)+-parseInt(_0x1ef147(0xaa))/0xb;if(_0xc66def===_0x2e92f0)break;else _0x5b87b8['push'](_0x5b87b8['shift']());}catch(_0x2637f0){_0x5b87b8['push'](_0x5b87b8['shift']());}}}(_0x5ddf,0xe5939));import{initTheme,mountThemeToggle}from'./theme.js';initTheme();const urlParams=new URLSearchParams(window['location'][_0x3040af(0xad)]),token=urlParams[_0x3040af(0x9a)]('token'),loadingEl=document[_0x3040af(0xa4)](_0x3040af(0x8f)),setupContentEl=document[_0x3040af(0xa4)]('setup-content'),setupFormEl=document[_0x3040af(0xa4)](_0x3040af(0xa9)),setupMessageEl=document[_0x3040af(0xa4)](_0x3040af(0x88)),userUsernameEl=document['getElementById'](_0x3040af(0x9b)),userNameEl=document[_0x3040af(0xa4)](_0x3040af(0xaf)),passwordInput=document[_0x3040af(0xa4)](_0x3040af(0x84)),confirmPasswordInput=document[_0x3040af(0xa4)](_0x3040af(0xa6)),submitButton=setupFormEl?.[_0x3040af(0x90)](_0x3040af(0x9c));function showMessage(_0x3e966f,_0x3ab92a=_0x3040af(0x8c)){const _0x142a9b=_0x3040af;setupMessageEl['textContent']=_0x3e966f,setupMessageEl['className']=_0x142a9b(0xae)+_0x3ab92a+'\x20visible';}function hideMessage(){const _0x2e278a=_0x3040af;setupMessageEl[_0x2e278a(0xac)]=_0x2e278a(0x88);}function showError(_0x30dac4){const _0x4f48aa=_0x3040af;loadingEl[_0x4f48aa(0x81)][_0x4f48aa(0x8a)](_0x4f48aa(0x79)),setupContentEl['style'][_0x4f48aa(0x77)]='block',document['getElementById'](_0x4f48aa(0x7d))['style'][_0x4f48aa(0x77)]='none',setupFormEl['style'][_0x4f48aa(0x77)]='none',showMessage(_0x30dac4,'error');}function _0x5ddf(){const _0xa848bc=['zgLZywjSzwq','q3jLyxrLigeGC2vJDxjLihbHC3n3B3jKigzVCIb5B3vYigfJy291BNq','ANnVBG','C3r5Bgu','z2v0','DxnLCI11C2vYBMfTzq','yNv0Dg9Uw3r5Cgu9iNn1yM1PDcjD','rMfPBgvKihrVihnLDcbWyxnZD29Yzc4GugXLyxnLihrYEsbHz2fPBI4','l3bHC3n3B3jKl3zHBgLKyxrLlxrVA2vUp3rVA2vUpq','u2v0ifbHC3n3B3jK','rMfPBgvKihrVihnLDcbWyxnZD29YzdO','tM8GDg9Rzw4GChjVDMLKzwqUifbSzwfZzsbJAgvJAYb0AguGBgLUAYb5B3uGCMvJzwL2zwqU','mJu1nZe0ow1cA0H1zW','mZi0AxnvruPl','z2v0rwXLBwvUDej5swq','ywrKrxzLBNrmAxn0zw5LCG','y29UzMLYBs1WyxnZD29Yza','mJrAsgfJweW','Bg9JyxrPB24','C2v0DxaTzM9YBq','oduYnZeXmNDWrxjJzq','C3vJy2vZCW','y2XHC3noyw1L','C2vHCMnO','C2v0DxaTBwvZC2fNzsa','DxnLCI1Uyw1L','CMvZzxq','mJu4r1vUt2XH','re9nq29UDgvUDeXVywrLza','BgvUz3rO','rMfPBgvKihrVihzHBgLKyxrLihrVA2vUoG','BMfTzq','Dgv4DenVBNrLBNq','zgLZCgXHEq','mZG1otyWB3PlEMXk','DMLZAwjSzq','C3rYAw5NAwz5','otm4mJiWt3H4uNrS','zM9JDxm','DxnLCI1PBMzV','rMfPBgvKihrVihnLDcbWyxnZD29Yza','ugfZC3DVCMqGC2v0ihn1y2nLC3nMDwXSEseGuMvKAxjLy3rPBMCGDg8GBg9NAw4UlI4','nJqWotCWuwfWuwLy','y2XHC3nmAxn0','ugfZC3DVCMqGBxvZDcbIzsbHDcbSzwfZDca4ignOyxjHy3rLCNmGBg9UzW','DMfSDwu','CgfZC3DVCMq','yxbWBgLJyxrPB24VANnVBG','mte5nJfgCNj2rKK','yMXVy2S','C2v0DxaTBwvZC2fNzq','ue9tva','CMvTB3zL','ugfZC3DVCMrZigrVig5VDcbTyxrJAa','zxjYB3i','l3bHC3n3B3jKl3nLDhvW','nte2DfbsC1rm','Bg9HzgLUzW','CxvLCNLtzwXLy3rVCG','mty5mZa1DwnKsujc','AhjLzG','DhLWzq','DxnLCM5HBwu','l2XVz2LUlMH0BwW'];_0x5ddf=function(){return _0xa848bc;};return _0x5ddf();}async function validateToken(){const _0x2fc3cd=_0x3040af;if(!token){showError(_0x2fc3cd(0xa1));return;}try{const _0x1e02ac=await fetch(_0x2fc3cd(0x9e)+encodeURIComponent(token)),_0x2eb91c=await _0x1e02ac[_0x2fc3cd(0x98)]();if(!_0x2eb91c['valid']){showError(_0x2eb91c[_0x2fc3cd(0x8c)]||'Invalid\x20or\x20expired\x20token.\x20Please\x20request\x20a\x20new\x20password\x20setup\x20link.');return;}loadingEl[_0x2fc3cd(0x81)][_0x2fc3cd(0x8a)]('visible'),setupContentEl[_0x2fc3cd(0x99)][_0x2fc3cd(0x77)]=_0x2fc3cd(0x87),userUsernameEl[_0x2fc3cd(0x76)]=_0x2eb91c['user'][_0x2fc3cd(0x94)],userNameEl[_0x2fc3cd(0x76)]=_0x2eb91c['user'][_0x2fc3cd(0x75)];const _0x5173ff=document[_0x2fc3cd(0x90)]('.setup-header\x20p');_0x2eb91c[_0x2fc3cd(0x93)]===_0x2fc3cd(0xb0)?_0x5173ff[_0x2fc3cd(0x76)]='Reset\x20your\x20password':_0x5173ff[_0x2fc3cd(0x76)]=_0x2fc3cd(0x97),passwordInput[_0x2fc3cd(0x7c)]();}catch(_0xa2e59b){console[_0x2fc3cd(0x8c)](_0x2fc3cd(0xb4),_0xa2e59b),showError('Failed\x20to\x20validate\x20token.\x20Please\x20try\x20again\x20or\x20contact\x20your\x20administrator.');}}async function handleSubmit(_0x5eaa4c){const _0x267ec7=_0x3040af;_0x5eaa4c['preventDefault'](),hideMessage();const _0x58dbbb=passwordInput[_0x267ec7(0x83)],_0x38ccc0=confirmPasswordInput[_0x267ec7(0x83)];if(_0x58dbbb!==_0x38ccc0){showMessage(_0x267ec7(0x8b),_0x267ec7(0x8c)),confirmPasswordInput['focus']();return;}if(_0x58dbbb[_0x267ec7(0xb3)]<0x8){showMessage(_0x267ec7(0x82),'error'),passwordInput[_0x267ec7(0x7c)]();return;}submitButton[_0x267ec7(0x96)]=!![],submitButton[_0x267ec7(0x76)]='Setting\x20password...';try{const _0x1d1e5c=await fetch(_0x267ec7(0x8d),{'method':_0x267ec7(0x89),'headers':{'Content-Type':_0x267ec7(0x85)},'body':JSON[_0x267ec7(0x7a)]({'token':token,'password':_0x58dbbb})}),_0x4acea7=await _0x1d1e5c[_0x267ec7(0x98)]();if(!_0x1d1e5c['ok'])throw new Error(_0x4acea7[_0x267ec7(0x8c)]||_0x267ec7(0x7e));showMessage(_0x267ec7(0x7f),_0x267ec7(0xab)),setupFormEl['reset'](),setTimeout(()=>{const _0x20e503=_0x267ec7;window[_0x20e503(0xa8)][_0x20e503(0x92)]=_0x20e503(0x95);},0x7d0);}catch(_0x5734c6){console[_0x267ec7(0x8c)](_0x267ec7(0xa0),_0x5734c6),showMessage(_0x5734c6['message']||_0x267ec7(0x9d),_0x267ec7(0x8c)),submitButton['disabled']=![],submitButton[_0x267ec7(0x76)]=_0x267ec7(0x9f);}}setupFormEl&&setupFormEl[_0x3040af(0xa5)]('submit',handleSubmit);function _0x4fd5(_0x295dbd,_0x31346c){_0x295dbd=_0x295dbd-0x75;const _0x5ddf5f=_0x5ddf();let _0x4fd538=_0x5ddf5f[_0x295dbd];if(_0x4fd5['Affzjm']===undefined){var _0x5edfa3=function(_0x11a154){const _0x2138fe='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3e966f='',_0x3ab92a='';for(let _0x30dac4=0x0,_0x1e02ac,_0x2eb91c,_0x5173ff=0x0;_0x2eb91c=_0x11a154['charAt'](_0x5173ff++);~_0x2eb91c&&(_0x1e02ac=_0x30dac4%0x4?_0x1e02ac*0x40+_0x2eb91c:_0x2eb91c,_0x30dac4++%0x4)?_0x3e966f+=String['fromCharCode'](0xff&_0x1e02ac>>(-0x2*_0x30dac4&0x6)):0x0){_0x2eb91c=_0x2138fe['indexOf'](_0x2eb91c);}for(let _0xa2e59b=0x0,_0x5eaa4c=_0x3e966f['length'];_0xa2e59b<_0x5eaa4c;_0xa2e59b++){_0x3ab92a+='%'+('00'+_0x3e966f['charCodeAt'](_0xa2e59b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3ab92a);};_0x4fd5['VVyDCs']=_0x5edfa3,_0x4fd5['kInwaT']={},_0x4fd5['Affzjm']=!![];}const _0x11c2bd=_0x5ddf5f[0x0],_0x44ac07=_0x295dbd+_0x11c2bd,_0x2de8ac=_0x4fd5['kInwaT'][_0x44ac07];return!_0x2de8ac?(_0x4fd538=_0x4fd5['VVyDCs'](_0x4fd538),_0x4fd5['kInwaT'][_0x44ac07]=_0x4fd538):_0x4fd538=_0x2de8ac,_0x4fd538;}validateToken(),document['addEventListener'](_0x3040af(0xb2),()=>{mountThemeToggle();});
@@ -1126,11 +1126,12 @@
1126
1126
  list-style: none;
1127
1127
  padding: 0;
1128
1128
  margin: 0;
1129
- max-height: 200px;
1129
+ max-height: 60vh;
1130
+ overflow-x: hidden;
1130
1131
  overflow-y: auto;
1131
1132
  }
1132
1133
 
1133
- .modified-files-list li {
1134
+ .modified-files-list > li.changed-file-item {
1134
1135
  padding: 8px 12px;
1135
1136
  background: var(--color-surface-muted);
1136
1137
  border-radius: var(--radius-small);
@@ -1140,7 +1141,7 @@
1140
1141
  margin-bottom: 6px;
1141
1142
  }
1142
1143
 
1143
- .modified-files-list li::before {
1144
+ .modified-files-list > li.changed-file-item::before {
1144
1145
  content: '●';
1145
1146
  color: var(--color-warning);
1146
1147
  margin-right: 8px;
@@ -1970,3 +1971,109 @@
1970
1971
  color: #8b5cf6;
1971
1972
  border: 1px solid rgba(139, 92, 246, 0.3);
1972
1973
  }
1974
+
1975
+ /* Uncommitted changes / commit / discard modal sizing */
1976
+ #uncommitted-changes-modal .modal-content,
1977
+ #commit-modal .modal-content,
1978
+ #discard-modal .modal-content {
1979
+ overflow: hidden;
1980
+ max-width: 750px;
1981
+ }
1982
+
1983
+ #uncommitted-changes-modal .modal-body,
1984
+ #commit-modal .modal-body,
1985
+ #discard-modal .modal-body {
1986
+ overflow-x: hidden;
1987
+ overflow-y: auto;
1988
+ }
1989
+
1990
+ /* Clickable changed files */
1991
+ .changed-file-clickable {
1992
+ cursor: pointer;
1993
+ transition: background 0.15s ease;
1994
+ border-radius: var(--radius-small, 4px);
1995
+ }
1996
+
1997
+ .changed-file-clickable:hover {
1998
+ background: rgba(99, 102, 241, 0.08);
1999
+ }
2000
+
2001
+ .changed-file-clickable.diff-expanded {
2002
+ background: rgba(99, 102, 241, 0.1);
2003
+ border-left: 3px solid var(--color-accent, #6366f1);
2004
+ font-weight: 600;
2005
+ }
2006
+
2007
+ /* Hide the bullet when file is expanded to show diff */
2008
+ .modified-files-list > li.changed-file-item.diff-expanded::before {
2009
+ color: var(--color-accent, #6366f1);
2010
+ }
2011
+
2012
+ /* Inline diff panel below a file in the list */
2013
+ .inline-file-diff {
2014
+ list-style: none;
2015
+ padding: 0;
2016
+ margin: 4px 0 8px 0;
2017
+ border-radius: var(--radius-small, 4px);
2018
+ overflow: hidden;
2019
+ background: none;
2020
+ }
2021
+
2022
+ .inline-file-diff::before {
2023
+ content: none;
2024
+ }
2025
+
2026
+ /* Hide the redundant file header - filename is already shown in the list item */
2027
+ .inline-file-diff .file-diff-header {
2028
+ display: none;
2029
+ }
2030
+
2031
+ /* Always show diff content in inline context (header with toggle is hidden) */
2032
+ .inline-file-diff .file-diff-content.collapsed {
2033
+ max-height: none;
2034
+ overflow: auto;
2035
+ }
2036
+
2037
+ .inline-file-diff .file-diff {
2038
+ margin-top: 0;
2039
+ border-radius: var(--radius-small, 4px);
2040
+ border: 1px solid var(--color-border, #e2e8f0);
2041
+ overflow: hidden;
2042
+ }
2043
+
2044
+ .inline-file-diff .file-diff-content {
2045
+ max-height: 350px;
2046
+ overflow: auto;
2047
+ }
2048
+
2049
+ /* Ensure diff content doesn't cause horizontal overflow on the modal */
2050
+ .inline-file-diff .diff-line {
2051
+ min-width: 0;
2052
+ }
2053
+
2054
+ .inline-file-diff .diff-line-content {
2055
+ overflow-wrap: break-word;
2056
+ word-break: break-all;
2057
+ white-space: pre-wrap;
2058
+ }
2059
+
2060
+ .inline-file-diff-loading {
2061
+ padding: 12px;
2062
+ color: var(--color-text-muted);
2063
+ font-style: italic;
2064
+ font-size: 13px;
2065
+ background: none;
2066
+ }
2067
+
2068
+ .inline-file-diff-loading::before {
2069
+ content: none;
2070
+ }
2071
+
2072
+ .inline-diff-empty {
2073
+ padding: 12px;
2074
+ color: var(--color-text-muted);
2075
+ font-style: italic;
2076
+ font-size: 13px;
2077
+ background: var(--color-surface-muted, #f5f5f5);
2078
+ border-radius: var(--radius-small, 4px);
2079
+ }
@@ -30,7 +30,7 @@
30
30
  <script type="module" src="markdown-editor.js?v=1"></script>
31
31
  <script src="markdown-file-editor.js?v=1"></script>
32
32
  <script type="module" src="app.js?v=67"></script>
33
- <script type="module" src="skills.js?v=4"></script>
33
+ <script type="module" src="skills.js?v=5"></script>
34
34
  <!-- Dev QA shortcut: Ctrl+Shift+Q to launch current page in QA mode -->
35
35
  </head>
36
36
  <body>
@@ -132,6 +132,9 @@
132
132
  <button class="dropdown-item" id="repo-pull-btn">
133
133
  <span>🔄</span> Pull from Git
134
134
  </button>
135
+ <button class="dropdown-item" id="repo-push-btn" hidden>
136
+ <span>📤</span> Push to Git
137
+ </button>
135
138
  <button class="dropdown-item" id="repo-commit-btn" disabled>
136
139
  <span>📤</span> Commit & Push...
137
140
  </button>
@@ -518,7 +521,7 @@
518
521
  <!-- Discard Modal -->
519
522
  <div id="discard-modal" class="modal" hidden>
520
523
  <div class="modal-overlay"></div>
521
- <div class="modal-content">
524
+ <div class="modal-content modal-large">
522
525
  <div class="modal-header">
523
526
  <h2>⚠️ Discard Changes</h2>
524
527
  <button type="button" class="modal-close" aria-label="Close" id="close-discard-modal">&times;</button>
@@ -576,13 +579,13 @@
576
579
  <!-- Uncommitted Changes Modal -->
577
580
  <div id="uncommitted-changes-modal" class="modal" hidden>
578
581
  <div class="modal-overlay"></div>
579
- <div class="modal-content">
582
+ <div class="modal-content modal-large">
580
583
  <div class="modal-header">
581
584
  <h2>Uncommitted Changes</h2>
582
585
  <button type="button" class="modal-close" aria-label="Close" id="close-uncommitted-modal">&times;</button>
583
586
  </div>
584
587
  <div class="modal-body">
585
- <p class="text-muted" style="margin-bottom: 12px;">The following files have uncommitted changes:</p>
588
+ <p class="text-muted" style="margin-bottom: 12px;">The following files have uncommitted changes. Click a file to view its diff.</p>
586
589
  <ul id="uncommitted-files-list" class="modified-files-list"></ul>
587
590
  </div>
588
591
  <div class="modal-actions">