viba-cli 0.27.0 → 0.28.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 (118) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/fallback-build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +2 -2
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +1 -1
  14. package/.next/server/app/_not-found.rsc +3 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -2
  21. package/.next/server/app/credentials/page/server-reference-manifest.json +7 -7
  22. package/.next/server/app/credentials/page.js.nft.json +1 -1
  23. package/.next/server/app/credentials/page_client-reference-manifest.js +1 -1
  24. package/.next/server/app/credentials.html +1 -1
  25. package/.next/server/app/credentials.rsc +4 -3
  26. package/.next/server/app/credentials.segments/_full.segment.rsc +4 -3
  27. package/.next/server/app/credentials.segments/_head.segment.rsc +1 -1
  28. package/.next/server/app/credentials.segments/_index.segment.rsc +3 -2
  29. package/.next/server/app/credentials.segments/_tree.segment.rsc +3 -2
  30. package/.next/server/app/credentials.segments/credentials/__PAGE__.segment.rsc +2 -2
  31. package/.next/server/app/credentials.segments/credentials.segment.rsc +1 -1
  32. package/.next/server/app/index.html +1 -1
  33. package/.next/server/app/index.rsc +4 -3
  34. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/index.segments/_full.segment.rsc +4 -3
  36. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  37. package/.next/server/app/index.segments/_index.segment.rsc +3 -2
  38. package/.next/server/app/index.segments/_tree.segment.rsc +3 -2
  39. package/.next/server/app/new/page/server-reference-manifest.json +26 -26
  40. package/.next/server/app/new/page.js.nft.json +1 -1
  41. package/.next/server/app/new/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/page/server-reference-manifest.json +26 -26
  43. package/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app/session/[sessionId]/page/server-reference-manifest.json +19 -34
  46. package/.next/server/app/session/[sessionId]/page.js.nft.json +1 -1
  47. package/.next/server/app/session/[sessionId]/page_client-reference-manifest.js +1 -1
  48. package/.next/server/chunks/ssr/[root-of-the-server]__01151db2._.js +3 -0
  49. package/.next/server/chunks/ssr/[root-of-the-server]__01151db2._.js.map +1 -0
  50. package/.next/server/chunks/ssr/[root-of-the-server]__0522f852._.js +1 -1
  51. package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js +1 -1
  52. package/.next/server/chunks/ssr/[root-of-the-server]__30652385._.js.map +1 -1
  53. package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js +1 -1
  54. package/.next/server/chunks/ssr/[root-of-the-server]__352d2b3c._.js.map +1 -1
  55. package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js +1 -1
  56. package/.next/server/chunks/ssr/[root-of-the-server]__4c388861._.js.map +1 -1
  57. package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js +1 -1
  58. package/.next/server/chunks/ssr/[root-of-the-server]__59834c63._.js.map +1 -1
  59. package/.next/server/chunks/ssr/[root-of-the-server]__6c63d5b8._.js +3 -0
  60. package/.next/server/chunks/ssr/[root-of-the-server]__6c63d5b8._.js.map +1 -0
  61. package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js +1 -1
  62. package/.next/server/chunks/ssr/[root-of-the-server]__9201693f._.js.map +1 -1
  63. package/.next/server/chunks/ssr/{[root-of-the-server]__e720c99b._.js → [root-of-the-server]__b2d91bdd._.js} +2 -2
  64. package/.next/server/chunks/ssr/[root-of-the-server]__b2d91bdd._.js.map +1 -0
  65. package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js +1 -1
  66. package/.next/server/chunks/ssr/[root-of-the-server]__c790b631._.js.map +1 -1
  67. package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js +1 -1
  68. package/.next/server/chunks/ssr/[root-of-the-server]__d5eaad6d._.js.map +1 -1
  69. package/.next/server/chunks/ssr/[root-of-the-server]__e5ccf6ef._.js +3 -0
  70. package/.next/server/chunks/ssr/[root-of-the-server]__e5ccf6ef._.js.map +1 -0
  71. package/.next/server/chunks/ssr/{node_modules_8cba5059._.js → node_modules_1924b56e._.js} +2 -2
  72. package/.next/server/chunks/ssr/node_modules_1924b56e._.js.map +1 -0
  73. package/.next/server/chunks/ssr/{node_modules_e604472b._.js → node_modules_4ebcf1df._.js} +2 -2
  74. package/.next/server/chunks/ssr/node_modules_4ebcf1df._.js.map +1 -0
  75. package/.next/server/chunks/ssr/{node_modules_8d27431f._.js → node_modules_9819fed1._.js} +2 -2
  76. package/.next/server/chunks/ssr/node_modules_9819fed1._.js.map +1 -0
  77. package/.next/server/chunks/ssr/{node_modules_61fa9608._.js → node_modules_a6b22d4e._.js} +2 -2
  78. package/.next/server/chunks/ssr/node_modules_a6b22d4e._.js.map +1 -0
  79. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js +1 -1
  80. package/.next/server/chunks/ssr/src_app_credentials_page_tsx_63d8d34a._.js.map +1 -1
  81. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js +1 -1
  82. package/.next/server/chunks/ssr/src_app_session_[sessionId]_SessionPageClient_tsx_dab490d7._.js.map +1 -1
  83. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js +8 -2
  84. package/.next/server/chunks/ssr/src_components_GitRepoSelector_tsx_05c81afa._.js.map +1 -1
  85. package/.next/server/pages/404.html +1 -1
  86. package/.next/server/pages/500.html +2 -2
  87. package/.next/server/server-reference-manifest.js +1 -1
  88. package/.next/server/server-reference-manifest.json +46 -61
  89. package/.next/static/chunks/13c27cbcbed10be4.js +9 -0
  90. package/.next/static/chunks/2473c16c0c2f6b5f.css +2 -0
  91. package/.next/static/chunks/2648731e67ebd2ac.js +1 -0
  92. package/.next/static/chunks/453fc76d2d553c51.js +3 -0
  93. package/.next/static/chunks/63e62f1fed4c4271.js +3 -0
  94. package/.next/static/chunks/afd3fb06f06c56af.js +3 -0
  95. package/.next/static/chunks/d658bac82c8382da.js +3 -0
  96. package/.next/static/chunks/dc6ca47e0eb2b1af.css +1 -0
  97. package/package.json +1 -1
  98. package/.next/server/chunks/ssr/[root-of-the-server]__44008467._.js +0 -3
  99. package/.next/server/chunks/ssr/[root-of-the-server]__44008467._.js.map +0 -1
  100. package/.next/server/chunks/ssr/[root-of-the-server]__d0ecc669._.js +0 -3
  101. package/.next/server/chunks/ssr/[root-of-the-server]__d0ecc669._.js.map +0 -1
  102. package/.next/server/chunks/ssr/[root-of-the-server]__e720c99b._.js.map +0 -1
  103. package/.next/server/chunks/ssr/[root-of-the-server]__f797cdfb._.js +0 -3
  104. package/.next/server/chunks/ssr/[root-of-the-server]__f797cdfb._.js.map +0 -1
  105. package/.next/server/chunks/ssr/node_modules_61fa9608._.js.map +0 -1
  106. package/.next/server/chunks/ssr/node_modules_8cba5059._.js.map +0 -1
  107. package/.next/server/chunks/ssr/node_modules_8d27431f._.js.map +0 -1
  108. package/.next/server/chunks/ssr/node_modules_e604472b._.js.map +0 -1
  109. package/.next/static/chunks/01ea2eea578d04e4.js +0 -3
  110. package/.next/static/chunks/0fe747dafb7e669b.js +0 -3
  111. package/.next/static/chunks/3ed77fc1d432b1ee.css +0 -3
  112. package/.next/static/chunks/6569d5ce24eb155c.js +0 -3
  113. package/.next/static/chunks/9a5719fb5b563570.js +0 -3
  114. package/.next/static/chunks/c8a39071afb558db.js +0 -1
  115. package/.next/static/chunks/f46bab62009fa1fe.js +0 -3
  116. /package/.next/static/{PPdLLbDtsQuxOYX2tF4ds → FS2_5AqvTArHxxuNAA0Or}/_buildManifest.js +0 -0
  117. /package/.next/static/{PPdLLbDtsQuxOYX2tF4ds → FS2_5AqvTArHxxuNAA0Or}/_clientMiddlewareManifest.json +0 -0
  118. /package/.next/static/{PPdLLbDtsQuxOYX2tF4ds → FS2_5AqvTArHxxuNAA0Or}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[12465,a=>{"use strict";var b=a.i(87924),c=a.i(75523),d=a.i(4614),e=a.i(5050);let f=(0,e.createServerReference)("40818589a8b5488fdc8b449ae91cd02633b542f4dc",e.callServer,void 0,e.findSourceMapURL,"removeAgentApiCredential"),g=(0,e.createServerReference)("40e3d3adc79235d05f8c7c9ac393c48c2de47024a3",e.callServer,void 0,e.findSourceMapURL,"removeCredential"),h=(0,e.createServerReference)("707ea44ae363377eda632a417c85f8309fa2e7df88",e.callServer,void 0,e.findSourceMapURL,"saveAgentApiCredential"),i=(0,e.createServerReference)("40296e761b6fef38dcffbcfc1507a7a716c13aa4c8",e.callServer,void 0,e.findSourceMapURL,"saveGitHubCredential"),j=(0,e.createServerReference)("60b0b3dd67ea1c9a5ecdcb89bc631096e6385e1c0f",e.callServer,void 0,e.findSourceMapURL,"saveGitLabCredential");var k=a.i(210),l=a.i(37047),m=a.i(81560),n=a.i(71987),o=a.i(50944),p=a.i(72131);let q="https://gitlab.com",r={github:"https://www.google.com/s2/favicons?domain=github.com&sz=64",gitlab:"https://www.google.com/s2/favicons?domain=gitlab.com&sz=64"},s={codex:"Codex CLI"},t={codex:"sk-..."},u={codex:"https://proxy.example.com/v1"},v=["codex"];function w(a){return"github"===a?"GitHub":"GitLab"}function x({type:a}){return(0,b.jsx)(n.default,{src:r[a],alt:`${w(a)} icon`,width:20,height:20,className:"h-5 w-5 rounded-sm",unoptimized:!0})}function y(){let a=(0,o.useRouter)(),[e,n]=(0,p.useState)([]),[r,y]=(0,p.useState)([]),[z,A]=(0,p.useState)(!0),[B,C]=(0,p.useState)(""),[D,E]=(0,p.useState)(""),[F,G]=(0,p.useState)(q),[H,I]=(0,p.useState)({codex:""}),[J,K]=(0,p.useState)({codex:""}),[L,M]=(0,p.useState)(null),[N,O]=(0,p.useState)(null),[P,Q]=(0,p.useState)(null),[R,S]=(0,p.useState)(null),[T,U]=(0,p.useState)(null),V=(0,p.useMemo)(()=>e.filter(a=>"github"===a.type),[e]),W=(0,p.useMemo)(()=>e.filter(a=>"gitlab"===a.type),[e]),X=(0,p.useMemo)(()=>new Map(r.map(a=>[a.agent,a])),[r]),Y=async()=>{let[a,b]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(!a.success){U({tone:"error",text:a.error}),A(!1);return}if(!b.success){U({tone:"error",text:b.error}),A(!1);return}n(a.credentials),y(b.credentials),K(a=>{let c={...a};for(let a of v)c[a]=b.credentials.find(b=>b.agent===a)?.apiProxy||"";return c}),A(!1)};(0,p.useEffect)(()=>{let a=!0;return(async()=>{let[b,e]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(a){if(!b.success){U({tone:"error",text:b.error}),A(!1);return}if(!e.success){U({tone:"error",text:e.error}),A(!1);return}n(b.credentials),y(e.credentials),K(a=>{let b={...a};for(let a of v)b[a]=e.credentials.find(b=>b.agent===a)?.apiProxy||"";return b}),A(!1)}})(),()=>{a=!1}},[]);let Z=async()=>{U(null),M("github");let a=await i(B);if(!a.success){U({tone:"error",text:a.error}),M(null);return}C(""),U({tone:"success",text:"GitHub credential added."}),await Y(),M(null)},$=async()=>{U(null),M("gitlab");let a=await j(F,D);if(!a.success){U({tone:"error",text:a.error}),M(null);return}E(""),U({tone:"success",text:"GitLab credential added."}),await Y(),M(null)},_=async a=>{U(null),O(a);let b=await h(a,H[a],J[a]);if(!b.success){U({tone:"error",text:b.error}),O(null);return}I(b=>({...b,[a]:""})),K(c=>({...c,[a]:b.credential.apiProxy||""})),U({tone:"success",text:`${s[a]} credential saved.`}),await Y(),O(null)},aa=async a=>{let b=w(a.type);if(!confirm(`Delete this ${b} credential for ${"gitlab"===a.type?`${a.username} @ ${a.serverUrl}`:a.username}?`))return;U(null),Q(a.id);let c=await g(a.id);if(!c.success){U({tone:"error",text:c.error}),Q(null);return}U({tone:"success",text:`${b} credential deleted.`}),await Y(),Q(null)},ab=async a=>{if(!confirm(`Delete the saved ${s[a]} API credential?`))return;U(null),S(a);let b=await f(a);if(!b.success){U({tone:"error",text:b.error}),S(null);return}I(b=>({...b,[a]:""})),K(b=>({...b,[a]:""})),U({tone:"success",text:`${s[a]} credential deleted.`}),await Y(),S(null)};return(0,b.jsx)("main",{className:"min-h-screen bg-base-100 p-4 md:p-10",children:(0,b.jsxs)("div",{className:"mx-auto w-full max-w-6xl space-y-5",children:[(0,b.jsx)("div",{className:"flex items-center justify-between",children:(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsxs)("button",{className:"btn btn-ghost btn-sm",onClick:()=>a.push("/"),children:[(0,b.jsx)(k.ArrowLeft,{className:"h-4 w-4"}),"Back"]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold",children:"Credentials"}),(0,b.jsx)("p",{className:"text-sm opacity-70",children:"Git and coding agent API credentials are stored securely in your system keychain."})]})]})}),T&&(0,b.jsx)("div",{className:`alert ${"error"===T.tone?"alert-error":"alert-success"} text-sm`,children:T.text}),z?(0,b.jsx)("div",{className:"card bg-base-200 shadow-xl",children:(0,b.jsxs)("div",{className:"card-body items-center py-10",children:[(0,b.jsx)("span",{className:"loading loading-spinner loading-md"}),(0,b.jsx)("p",{className:"text-sm opacity-70",children:"Loading credentials..."})]})}):(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("section",{className:"space-y-3",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold uppercase tracking-wide opacity-70",children:"Git Credentials"}),(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-5 lg:grid-cols-2 items-start",children:[(0,b.jsx)("div",{className:"card bg-base-200 shadow-xl",children:(0,b.jsxs)("div",{className:"card-body space-y-4",children:[(0,b.jsxs)("h3",{className:"card-title flex items-center gap-2",children:[(0,b.jsx)(x,{type:"github"}),"GitHub"]}),(0,b.jsxs)("label",{className:"form-control w-full gap-2",children:[(0,b.jsx)("span",{className:"label-text text-xs uppercase tracking-wide opacity-70",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:"input input-bordered w-full",placeholder:"ghp_xxx",value:B,onChange:a=>C(a.target.value),disabled:"github"===L})]}),(0,b.jsx)("div",{className:"card-actions justify-end pt-1",children:(0,b.jsxs)("button",{className:"btn btn-primary btn-sm",onClick:()=>void Z(),disabled:"github"===L,children:["github"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Credential"]})}),(0,b.jsx)("div",{className:"divider my-0"}),0===V.length?(0,b.jsx)("div",{className:"text-sm opacity-60",children:"No GitHub credentials saved."}):(0,b.jsx)("div",{className:"space-y-2",children:V.map(a=>(0,b.jsx)("div",{className:"rounded-md border border-base-300 bg-base-100 p-3",children:(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0 flex items-start gap-2",children:[(0,b.jsx)(x,{type:"github"}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-sm font-medium truncate",children:a.username}),(0,b.jsxs)("div",{className:"text-xs opacity-60",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsxs)("button",{className:"btn btn-error btn-outline btn-xs",onClick:()=>void aa(a),disabled:P===a.id,children:[P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-3.5 w-3.5"}),"Delete"]})]})},a.id))})]})}),(0,b.jsx)("div",{className:"card bg-base-200 shadow-xl",children:(0,b.jsxs)("div",{className:"card-body space-y-4",children:[(0,b.jsxs)("h3",{className:"card-title flex items-center gap-2",children:[(0,b.jsx)(x,{type:"gitlab"}),"GitLab"]}),(0,b.jsxs)("label",{className:"form-control w-full gap-2",children:[(0,b.jsx)("span",{className:"label-text text-xs uppercase tracking-wide opacity-70",children:"Server URL"}),(0,b.jsx)("input",{type:"url",className:"input input-bordered w-full",placeholder:q,value:F,onChange:a=>G(a.target.value),disabled:"gitlab"===L})]}),(0,b.jsxs)("label",{className:"form-control w-full gap-2",children:[(0,b.jsx)("span",{className:"label-text text-xs uppercase tracking-wide opacity-70",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:"input input-bordered w-full",placeholder:"glpat-xxx",value:D,onChange:a=>E(a.target.value),disabled:"gitlab"===L})]}),(0,b.jsx)("div",{className:"card-actions justify-end pt-1",children:(0,b.jsxs)("button",{className:"btn btn-primary btn-sm",onClick:()=>void $(),disabled:"gitlab"===L,children:["gitlab"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Credential"]})}),(0,b.jsx)("div",{className:"divider my-0"}),0===W.length?(0,b.jsx)("div",{className:"text-sm opacity-60",children:"No GitLab credentials saved."}):(0,b.jsx)("div",{className:"space-y-2",children:W.map(a=>(0,b.jsx)("div",{className:"rounded-md border border-base-300 bg-base-100 p-3",children:(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0 flex items-start gap-2",children:[(0,b.jsx)(x,{type:"gitlab"}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"text-sm font-medium truncate",children:a.username}),(0,b.jsx)("div",{className:"text-xs opacity-70 truncate",children:a.serverUrl}),(0,b.jsxs)("div",{className:"text-xs opacity-60",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsxs)("button",{className:"btn btn-error btn-outline btn-xs",onClick:()=>void aa(a),disabled:P===a.id,children:[P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-3.5 w-3.5"}),"Delete"]})]})},a.id))})]})})]})]}),(0,b.jsxs)("section",{className:"space-y-3",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold uppercase tracking-wide opacity-70",children:"Coding Agent API Credential"}),(0,b.jsx)("div",{className:"grid grid-cols-1 gap-5 lg:grid-cols-1 items-start",children:v.map(a=>{let c=X.get(a),d=N===a,e=R===a;return(0,b.jsx)("div",{className:"card bg-base-200 shadow-xl",children:(0,b.jsxs)("div",{className:"card-body space-y-4",children:[(0,b.jsx)("h3",{className:"card-title",children:s[a]}),(0,b.jsxs)("label",{className:"form-control w-full gap-2",children:[(0,b.jsx)("span",{className:"label-text text-xs uppercase tracking-wide opacity-70",children:"API Key"}),(0,b.jsx)("input",{type:"password",className:"input input-bordered w-full",placeholder:t[a],value:H[a],onChange:b=>I(c=>({...c,[a]:b.target.value})),disabled:d||e})]}),(0,b.jsxs)("label",{className:"form-control w-full gap-2",children:[(0,b.jsx)("span",{className:"label-text text-xs uppercase tracking-wide opacity-70",children:"API Proxy (Optional)"}),(0,b.jsx)("input",{type:"url",className:"input input-bordered w-full",placeholder:u[a],value:J[a],onChange:b=>K(c=>({...c,[a]:b.target.value})),disabled:d||e})]}),(0,b.jsxs)("div",{className:"card-actions justify-end",children:[c&&(0,b.jsxs)("button",{className:"btn btn-error btn-outline btn-sm",onClick:()=>void ab(a),disabled:d||e,children:[e?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-3.5 w-3.5"}),"Remove"]}),(0,b.jsxs)("button",{className:"btn btn-primary btn-sm",onClick:()=>void _(a),disabled:d||e,children:[d?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),c?"Update":"Save"]})]}),(0,b.jsx)("div",{className:"rounded-md border border-base-300 bg-base-100 p-3 text-xs opacity-80",children:c?(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("div",{children:"API key configured."}),(0,b.jsxs)("div",{className:"opacity-70",children:["Updated ",new Date(c.updatedAt).toLocaleString()]}),(0,b.jsxs)("div",{className:"opacity-70",children:["Proxy ",c.apiProxy?c.apiProxy:"not set"]})]}):(0,b.jsx)("div",{children:"No API credential saved."})})]})},a)})})]})]})]})})}a.s(["default",()=>y],12465)}];
1
+ module.exports=[12465,a=>{"use strict";var b=a.i(87924),c=a.i(54653),d=a.i(9809),e=a.i(5050);let f=(0,e.createServerReference)("407dd022f450835e92452755c2187f2759ce65a352",e.callServer,void 0,e.findSourceMapURL,"removeAgentApiCredential"),g=(0,e.createServerReference)("40549b442d0eb35deaec280c1a3ac69584e89086a5",e.callServer,void 0,e.findSourceMapURL,"removeCredential"),h=(0,e.createServerReference)("708a3dd3737dc6efc62a9fa45a820696f5441c8d44",e.callServer,void 0,e.findSourceMapURL,"saveAgentApiCredential"),i=(0,e.createServerReference)("4004a0e7ba2853a497f171ed16037e29939770bf9d",e.callServer,void 0,e.findSourceMapURL,"saveGitHubCredential"),j=(0,e.createServerReference)("60cd0b78e5e61702e931c48bbfdc43d298af6e8439",e.callServer,void 0,e.findSourceMapURL,"saveGitLabCredential");var k=a.i(50522),l=a.i(37047),m=a.i(81560),n=a.i(71987),o=a.i(50944),p=a.i(72131);let q="https://gitlab.com",r={github:"https://www.google.com/s2/favicons?domain=github.com&sz=64",gitlab:"https://www.google.com/s2/favicons?domain=gitlab.com&sz=64"},s={codex:"Codex CLI"},t={codex:"sk-..."},u={codex:"https://proxy.example.com/v1"},v=["codex"];function w(a){return"github"===a?"GitHub":"GitLab"}function x({type:a}){return(0,b.jsx)(n.default,{src:r[a],alt:`${w(a)} icon`,width:20,height:20,className:"h-5 w-5 rounded-sm",unoptimized:!0})}function y(){let a=(0,o.useRouter)(),[e,n]=(0,p.useState)([]),[r,y]=(0,p.useState)([]),[z,A]=(0,p.useState)(!0),[B,C]=(0,p.useState)(""),[D,E]=(0,p.useState)(""),[F,G]=(0,p.useState)(q),[H,I]=(0,p.useState)({codex:""}),[J,K]=(0,p.useState)({codex:""}),[L,M]=(0,p.useState)(null),[N,O]=(0,p.useState)(null),[P,Q]=(0,p.useState)(null),[R,S]=(0,p.useState)(null),[T,U]=(0,p.useState)(null),V=(0,p.useMemo)(()=>e.filter(a=>"github"===a.type),[e]),W=(0,p.useMemo)(()=>e.filter(a=>"gitlab"===a.type),[e]),X=(0,p.useMemo)(()=>new Map(r.map(a=>[a.agent,a])),[r]),Y=async()=>{let[a,b]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(!a.success){U({tone:"error",text:a.error}),A(!1);return}if(!b.success){U({tone:"error",text:b.error}),A(!1);return}n(a.credentials),y(b.credentials),K(a=>{let c={...a};for(let a of v)c[a]=b.credentials.find(b=>b.agent===a)?.apiProxy||"";return c}),A(!1)};(0,p.useEffect)(()=>{let a=!0;return(async()=>{let[b,e]=await Promise.all([(0,d.listCredentials)(),(0,c.listAgentApiCredentials)()]);if(a){if(!b.success){U({tone:"error",text:b.error}),A(!1);return}if(!e.success){U({tone:"error",text:e.error}),A(!1);return}n(b.credentials),y(e.credentials),K(a=>{let b={...a};for(let a of v)b[a]=e.credentials.find(b=>b.agent===a)?.apiProxy||"";return b}),A(!1)}})(),()=>{a=!1}},[]);let Z=async()=>{U(null),M("github");let a=await i(B);if(!a.success){U({tone:"error",text:a.error}),M(null);return}C(""),U({tone:"success",text:"GitHub credential added."}),await Y(),M(null)},$=async()=>{U(null),M("gitlab");let a=await j(F,D);if(!a.success){U({tone:"error",text:a.error}),M(null);return}E(""),U({tone:"success",text:"GitLab credential added."}),await Y(),M(null)},_=async a=>{U(null),O(a);let b=await h(a,H[a],J[a]);if(!b.success){U({tone:"error",text:b.error}),O(null);return}I(b=>({...b,[a]:""})),K(c=>({...c,[a]:b.credential.apiProxy||""})),U({tone:"success",text:`${s[a]} credential saved.`}),await Y(),O(null)},aa=async a=>{let b=w(a.type);if(!confirm(`Delete this ${b} credential for ${"gitlab"===a.type?`${a.username} @ ${a.serverUrl}`:a.username}?`))return;U(null),Q(a.id);let c=await g(a.id);if(!c.success){U({tone:"error",text:c.error}),Q(null);return}U({tone:"success",text:`${b} credential deleted.`}),await Y(),Q(null)},ab=async a=>{if(!confirm(`Delete the saved ${s[a]} API credential?`))return;U(null),S(a);let b=await f(a);if(!b.success){U({tone:"error",text:b.error}),S(null);return}I(b=>({...b,[a]:""})),K(b=>({...b,[a]:""})),U({tone:"success",text:`${s[a]} credential deleted.`}),await Y(),S(null)},ac="overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm",ad="flex flex-col gap-3 border-b border-slate-200 px-6 py-5 md:flex-row md:items-center md:justify-between",ae="block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60",af="inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60",ag="inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60",ah="inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500";return(0,b.jsx)("main",{className:"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12",children:(0,b.jsxs)("div",{className:"mx-auto w-full max-w-4xl space-y-8",children:[(0,b.jsxs)("div",{className:"mb-8",children:[(0,b.jsxs)("div",{className:"mb-2 flex items-center gap-4",children:[(0,b.jsx)("button",{type:"button",className:"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900",onClick:()=>a.push("/"),"aria-label":"Back to home",children:(0,b.jsx)(k.ChevronRight,{className:"h-6 w-6 rotate-180"})}),(0,b.jsx)("h1",{className:"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl",children:"Credential Management"})]}),(0,b.jsx)("p",{className:"ml-14 text-sm text-slate-500 md:text-base",children:"Manage your API keys and access tokens for third-party services safely."})]}),T&&(0,b.jsx)("div",{className:`rounded-lg border px-4 py-3 text-sm ${"error"===T.tone?"border-red-200 bg-red-50 text-red-700":"border-emerald-200 bg-emerald-50 text-emerald-700"}`,children:T.text}),z?(0,b.jsx)("div",{className:`${ac} p-10`,children:(0,b.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,b.jsx)("span",{className:"loading loading-spinner loading-md text-primary"}),(0,b.jsx)("p",{className:"text-sm text-slate-500",children:"Loading credentials..."})]})}):(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900",children:"GitHub Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500",children:"Access private repositories and Gists."})]}),(0,b.jsxs)("button",{className:af,onClick:()=>void Z(),disabled:"github"===L,children:["github"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Token"]})]}),(0,b.jsxs)("div",{className:"border-b border-slate-100 bg-slate-50/40 px-6 py-4",children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"ghp_xxx",value:B,onChange:a=>C(a.target.value),disabled:"github"===L})]}),0===V.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500",children:"No GitHub credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100",children:V.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100",children:(0,b.jsx)(x,{type:"github"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900",children:a.username}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-bold text-slate-900",children:"GitLab Credentials"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-slate-500",children:"Connect to self-hosted or cloud GitLab instances."})]}),(0,b.jsxs)("button",{className:ag,onClick:()=>void $(),disabled:"gitlab"===L,children:["gitlab"===L?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),"Add Instance"]})]}),(0,b.jsxs)("div",{className:"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500",children:"Server URL"}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:q,value:F,onChange:a=>G(a.target.value),disabled:"gitlab"===L})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500",children:"Personal Access Token"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:"glpat-xxx",value:D,onChange:a=>E(a.target.value),disabled:"gitlab"===L})]})]}),0===W.length?(0,b.jsx)("div",{className:"px-6 py-6 text-sm text-slate-500",children:"No GitLab credentials saved."}):(0,b.jsx)("div",{className:"divide-y divide-slate-100",children:W.map(a=>(0,b.jsxs)("div",{className:"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50",children:[(0,b.jsxs)("div",{className:"flex min-w-0 items-center gap-4",children:[(0,b.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50",children:(0,b.jsx)(x,{type:"gitlab"})}),(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-sm font-semibold text-slate-900",children:a.username}),(0,b.jsx)("div",{className:"truncate text-xs text-slate-500",children:a.serverUrl}),(0,b.jsxs)("div",{className:"mt-0.5 text-xs text-slate-500",children:["Updated ",new Date(a.updatedAt).toLocaleString()]})]})]}),(0,b.jsx)("button",{className:`${ah} opacity-0 group-hover:opacity-100 disabled:opacity-40`,onClick:()=>void aa(a),disabled:P===a.id,title:"Delete",children:P===a.id?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"})})]},a.id))})]}),v.map(a=>{let c=X.get(a),d=N===a,e=R===a;return(0,b.jsxs)("section",{className:ac,children:[(0,b.jsxs)("div",{className:ad,children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)("div",{className:"rounded-lg bg-emerald-100 p-1.5 text-emerald-600",children:(0,b.jsx)(l.KeyRound,{className:"h-5 w-5"})}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("h2",{className:"text-lg font-bold text-slate-900",children:[s[a]," Configuration"]}),(0,b.jsx)("p",{className:"text-sm text-slate-500",children:"Configure access for LLM capabilities."})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[c&&(0,b.jsxs)("button",{className:ag,onClick:()=>void ab(a),disabled:d||e,children:[e?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(m.Trash2,{className:"h-4 w-4"}),"Remove"]}),(0,b.jsxs)("button",{className:af,onClick:()=>void _(a),disabled:d||e,children:[d?(0,b.jsx)("span",{className:"loading loading-spinner loading-xs"}):(0,b.jsx)(l.KeyRound,{className:"h-4 w-4"}),c?"Save Changes":"Save"]})]})]}),(0,b.jsxs)("div",{className:"space-y-6 p-6",children:[(0,b.jsxs)("div",{className:"max-w-2xl space-y-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"mb-2 block text-sm font-medium text-slate-700",children:"API Key"}),(0,b.jsx)("input",{type:"password",className:ae,placeholder:t[a],value:H[a],onChange:b=>I(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500",children:"Your API key is stored locally and never shared."})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("label",{className:"mb-2 block text-sm font-medium text-slate-700",children:["API Proxy ",(0,b.jsx)("span",{className:"font-normal text-slate-400",children:"(Optional)"})]}),(0,b.jsx)("input",{type:"url",className:ae,placeholder:u[a],value:J[a],onChange:b=>K(c=>({...c,[a]:b.target.value})),disabled:d||e}),(0,b.jsx)("p",{className:"mt-1 text-xs text-slate-500",children:"Override this when using a proxy or a compatible endpoint."})]})]}),(0,b.jsx)("div",{className:"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600",children:c?(0,b.jsxs)("div",{className:"space-y-1",children:[(0,b.jsx)("div",{children:"API key configured."}),(0,b.jsxs)("div",{children:["Updated ",new Date(c.updatedAt).toLocaleString()]}),(0,b.jsxs)("div",{children:["Proxy ",c.apiProxy?c.apiProxy:"not set"]})]}):(0,b.jsx)("div",{children:"No API credential saved."})})]})]},a)}),(0,b.jsx)("div",{className:"pb-2 pt-4 text-center text-xs text-slate-400",children:"Credentials are encrypted at rest using your system keychain."})]})]})})}a.s(["default",()=>y],12465)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_credentials_page_tsx_63d8d34a._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/credentials/page.tsx","../../../../src/app/actions/data%3Af43da0%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A1590da%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aaf8a7d%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A2e84be%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A32173d%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport {\n listAgentApiCredentials,\n listCredentials,\n removeAgentApiCredential,\n removeCredential,\n saveAgentApiCredential,\n saveGitHubCredential,\n saveGitLabCredential,\n} from '@/app/actions/credentials';\nimport type {\n AgentApiCredential,\n AgentApiCredentialAgent,\n} from '@/lib/agent-api-credentials';\nimport type { Credential, CredentialType, GitLabCredential } from '@/lib/credentials';\nimport { ArrowLeft, KeyRound, Trash2 } from 'lucide-react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_GITLAB_SERVER_URL = 'https://gitlab.com';\nconst PROVIDER_ICON_URLS = {\n github: 'https://www.google.com/s2/favicons?domain=github.com&sz=64',\n gitlab: 'https://www.google.com/s2/favicons?domain=gitlab.com&sz=64',\n} as const;\nconst AGENT_API_LABELS: Record<AgentApiCredentialAgent, string> = {\n codex: 'Codex CLI',\n};\nconst AGENT_API_KEY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'sk-...',\n};\nconst AGENT_API_PROXY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'https://proxy.example.com/v1',\n};\nconst AGENT_API_ORDER: AgentApiCredentialAgent[] = ['codex'];\n\ntype FlashMessage = {\n tone: 'success' | 'error';\n text: string;\n} | null;\n\nfunction formatCredentialSubtitle(credential: Credential): string {\n if (credential.type === 'gitlab') {\n return `${credential.username} @ ${credential.serverUrl}`;\n }\n return credential.username;\n}\n\nfunction formatProviderLabel(type: CredentialType): string {\n return type === 'github' ? 'GitHub' : 'GitLab';\n}\n\nfunction ProviderIcon({ type }: { type: CredentialType }) {\n return (\n <Image\n src={PROVIDER_ICON_URLS[type]}\n alt={`${formatProviderLabel(type)} icon`}\n width={20}\n height={20}\n className=\"h-5 w-5 rounded-sm\"\n unoptimized\n />\n );\n}\n\nexport default function CredentialsPage() {\n const router = useRouter();\n\n const [credentials, setCredentials] = useState<Credential[]>([]);\n const [agentApiCredentials, setAgentApiCredentials] = useState<AgentApiCredential[]>([]);\n const [loading, setLoading] = useState(true);\n\n const [githubToken, setGitHubToken] = useState('');\n const [gitlabToken, setGitLabToken] = useState('');\n const [gitlabServerUrl, setGitLabServerUrl] = useState(DEFAULT_GITLAB_SERVER_URL);\n const [agentApiKeyInputs, setAgentApiKeyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n const [agentApiProxyInputs, setAgentApiProxyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n\n const [savingType, setSavingType] = useState<CredentialType | null>(null);\n const [savingAgent, setSavingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [deletingAgent, setDeletingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [flashMessage, setFlashMessage] = useState<FlashMessage>(null);\n\n const githubCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'github'),\n [credentials],\n );\n\n const gitlabCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'gitlab') as GitLabCredential[],\n [credentials],\n );\n\n const agentApiCredentialMap = useMemo(() => {\n return new Map(agentApiCredentials.map((credential) => [credential.agent, credential]));\n }, [agentApiCredentials]);\n\n const reloadCredentials = async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n };\n\n useEffect(() => {\n let isActive = true;\n\n void (async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n if (!isActive) return;\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n })();\n\n return () => {\n isActive = false;\n };\n }, []);\n\n const handleSaveGitHub = async () => {\n setFlashMessage(null);\n setSavingType('github');\n\n const result = await saveGitHubCredential(githubToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitHubToken('');\n setFlashMessage({ tone: 'success', text: 'GitHub credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveGitLab = async () => {\n setFlashMessage(null);\n setSavingType('gitlab');\n\n const result = await saveGitLabCredential(gitlabServerUrl, gitlabToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitLabToken('');\n setFlashMessage({ tone: 'success', text: 'GitLab credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveAgentApi = async (agent: AgentApiCredentialAgent) => {\n setFlashMessage(null);\n setSavingAgent(agent);\n\n const result = await saveAgentApiCredential(\n agent,\n agentApiKeyInputs[agent],\n agentApiProxyInputs[agent],\n );\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: result.credential.apiProxy || '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential saved.` });\n await reloadCredentials();\n setSavingAgent(null);\n };\n\n const handleDelete = async (credential: Credential) => {\n const providerLabel = formatProviderLabel(credential.type);\n const confirmed = confirm(`Delete this ${providerLabel} credential for ${formatCredentialSubtitle(credential)}?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingId(credential.id);\n\n const result = await removeCredential(credential.id);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingId(null);\n return;\n }\n\n setFlashMessage({ tone: 'success', text: `${providerLabel} credential deleted.` });\n await reloadCredentials();\n setDeletingId(null);\n };\n\n const handleDeleteAgentApi = async (agent: AgentApiCredentialAgent) => {\n const confirmed = confirm(`Delete the saved ${AGENT_API_LABELS[agent]} API credential?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingAgent(agent);\n\n const result = await removeAgentApiCredential(agent);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential deleted.` });\n await reloadCredentials();\n setDeletingAgent(null);\n };\n\n return (\n <main className=\"min-h-screen bg-base-100 p-4 md:p-10\">\n <div className=\"mx-auto w-full max-w-6xl space-y-5\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <button className=\"btn btn-ghost btn-sm\" onClick={() => router.push('/')}>\n <ArrowLeft className=\"h-4 w-4\" />\n Back\n </button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Credentials</h1>\n <p className=\"text-sm opacity-70\">\n Git and coding agent API credentials are stored securely in your system keychain.\n </p>\n </div>\n </div>\n </div>\n\n {flashMessage && (\n <div className={`alert ${flashMessage.tone === 'error' ? 'alert-error' : 'alert-success'} text-sm`}>\n {flashMessage.text}\n </div>\n )}\n\n {loading ? (\n <div className=\"card bg-base-200 shadow-xl\">\n <div className=\"card-body items-center py-10\">\n <span className=\"loading loading-spinner loading-md\"></span>\n <p className=\"text-sm opacity-70\">Loading credentials...</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <section className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold uppercase tracking-wide opacity-70\">Git Credentials</h2>\n <div className=\"grid grid-cols-1 gap-5 lg:grid-cols-2 items-start\">\n <div className=\"card bg-base-200 shadow-xl\">\n <div className=\"card-body space-y-4\">\n <h3 className=\"card-title flex items-center gap-2\">\n <ProviderIcon type=\"github\" />\n GitHub\n </h3>\n\n <label className=\"form-control w-full gap-2\">\n <span className=\"label-text text-xs uppercase tracking-wide opacity-70\">Personal Access Token</span>\n <input\n type=\"password\"\n className=\"input input-bordered w-full\"\n placeholder=\"ghp_xxx\"\n value={githubToken}\n onChange={(event) => setGitHubToken(event.target.value)}\n disabled={savingType === 'github'}\n />\n </label>\n\n <div className=\"card-actions justify-end pt-1\">\n <button\n className=\"btn btn-primary btn-sm\"\n onClick={() => void handleSaveGitHub()}\n disabled={savingType === 'github'}\n >\n {savingType === 'github' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Credential\n </button>\n </div>\n\n <div className=\"divider my-0\"></div>\n\n {githubCredentials.length === 0 ? (\n <div className=\"text-sm opacity-60\">No GitHub credentials saved.</div>\n ) : (\n <div className=\"space-y-2\">\n {githubCredentials.map((credential) => (\n <div key={credential.id} className=\"rounded-md border border-base-300 bg-base-100 p-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-start gap-2\">\n <ProviderIcon type=\"github\" />\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium truncate\">{credential.username}</div>\n <div className=\"text-xs opacity-60\">Updated {new Date(credential.updatedAt).toLocaleString()}</div>\n </div>\n </div>\n <button\n className=\"btn btn-error btn-outline btn-xs\"\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-3.5 w-3.5\" />}\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"card bg-base-200 shadow-xl\">\n <div className=\"card-body space-y-4\">\n <h3 className=\"card-title flex items-center gap-2\">\n <ProviderIcon type=\"gitlab\" />\n GitLab\n </h3>\n\n <label className=\"form-control w-full gap-2\">\n <span className=\"label-text text-xs uppercase tracking-wide opacity-70\">Server URL</span>\n <input\n type=\"url\"\n className=\"input input-bordered w-full\"\n placeholder={DEFAULT_GITLAB_SERVER_URL}\n value={gitlabServerUrl}\n onChange={(event) => setGitLabServerUrl(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </label>\n\n <label className=\"form-control w-full gap-2\">\n <span className=\"label-text text-xs uppercase tracking-wide opacity-70\">Personal Access Token</span>\n <input\n type=\"password\"\n className=\"input input-bordered w-full\"\n placeholder=\"glpat-xxx\"\n value={gitlabToken}\n onChange={(event) => setGitLabToken(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </label>\n\n <div className=\"card-actions justify-end pt-1\">\n <button\n className=\"btn btn-primary btn-sm\"\n onClick={() => void handleSaveGitLab()}\n disabled={savingType === 'gitlab'}\n >\n {savingType === 'gitlab' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Credential\n </button>\n </div>\n\n <div className=\"divider my-0\"></div>\n\n {gitlabCredentials.length === 0 ? (\n <div className=\"text-sm opacity-60\">No GitLab credentials saved.</div>\n ) : (\n <div className=\"space-y-2\">\n {gitlabCredentials.map((credential) => (\n <div key={credential.id} className=\"rounded-md border border-base-300 bg-base-100 p-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0 flex items-start gap-2\">\n <ProviderIcon type=\"gitlab\" />\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium truncate\">{credential.username}</div>\n <div className=\"text-xs opacity-70 truncate\">{credential.serverUrl}</div>\n <div className=\"text-xs opacity-60\">Updated {new Date(credential.updatedAt).toLocaleString()}</div>\n </div>\n </div>\n <button\n className=\"btn btn-error btn-outline btn-xs\"\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-3.5 w-3.5\" />}\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h2 className=\"text-sm font-semibold uppercase tracking-wide opacity-70\">Coding Agent API Credential</h2>\n <div className=\"grid grid-cols-1 gap-5 lg:grid-cols-1 items-start\">\n {AGENT_API_ORDER.map((agent) => {\n const configuredCredential = agentApiCredentialMap.get(agent);\n const isSaving = savingAgent === agent;\n const isDeleting = deletingAgent === agent;\n\n return (\n <div key={agent} className=\"card bg-base-200 shadow-xl\">\n <div className=\"card-body space-y-4\">\n <h3 className=\"card-title\">{AGENT_API_LABELS[agent]}</h3>\n\n <label className=\"form-control w-full gap-2\">\n <span className=\"label-text text-xs uppercase tracking-wide opacity-70\">API Key</span>\n <input\n type=\"password\"\n className=\"input input-bordered w-full\"\n placeholder={AGENT_API_KEY_PLACEHOLDERS[agent]}\n value={agentApiKeyInputs[agent]}\n onChange={(event) => setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: event.target.value }))}\n disabled={isSaving || isDeleting}\n />\n </label>\n\n <label className=\"form-control w-full gap-2\">\n <span className=\"label-text text-xs uppercase tracking-wide opacity-70\">API Proxy (Optional)</span>\n <input\n type=\"url\"\n className=\"input input-bordered w-full\"\n placeholder={AGENT_API_PROXY_PLACEHOLDERS[agent]}\n value={agentApiProxyInputs[agent]}\n onChange={(event) => setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: event.target.value }))}\n disabled={isSaving || isDeleting}\n />\n </label>\n\n <div className=\"card-actions justify-end\">\n {configuredCredential && (\n <button\n className=\"btn btn-error btn-outline btn-sm\"\n onClick={() => void handleDeleteAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isDeleting ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-3.5 w-3.5\" />}\n Remove\n </button>\n )}\n <button\n className=\"btn btn-primary btn-sm\"\n onClick={() => void handleSaveAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isSaving ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n {configuredCredential ? 'Update' : 'Save'}\n </button>\n </div>\n\n <div className=\"rounded-md border border-base-300 bg-base-100 p-3 text-xs opacity-80\">\n {configuredCredential ? (\n <div className=\"space-y-1\">\n <div>API key configured.</div>\n <div className=\"opacity-70\">Updated {new Date(configuredCredential.updatedAt).toLocaleString()}</div>\n <div className=\"opacity-70\">\n Proxy {configuredCredential.apiProxy ? configuredCredential.apiProxy : 'not set'}\n </div>\n </div>\n ) : (\n <div>No API credential saved.</div>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </section>\n </div>\n )}\n </div>\n </main>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"40818589a8b5488fdc8b449ae91cd02633b542f4dc\":\"removeAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"40818589a8b5488fdc8b449ae91cd02633b542f4dc\",callServer,void 0,findSourceMapURL,\"removeAgentApiCredential\");export{$$RSC_SERVER_ACTION_6 as removeAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"40e3d3adc79235d05f8c7c9ac393c48c2de47024a3\":\"removeCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"40e3d3adc79235d05f8c7c9ac393c48c2de47024a3\",callServer,void 0,findSourceMapURL,\"removeCredential\");export{$$RSC_SERVER_ACTION_5 as removeCredential};","/* __next_internal_action_entry_do_not_use__ [{\"707ea44ae363377eda632a417c85f8309fa2e7df88\":\"saveAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"707ea44ae363377eda632a417c85f8309fa2e7df88\",callServer,void 0,findSourceMapURL,\"saveAgentApiCredential\");export{$$RSC_SERVER_ACTION_4 as saveAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"40296e761b6fef38dcffbcfc1507a7a716c13aa4c8\":\"saveGitHubCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"40296e761b6fef38dcffbcfc1507a7a716c13aa4c8\",callServer,void 0,findSourceMapURL,\"saveGitHubCredential\");export{$$RSC_SERVER_ACTION_1 as saveGitHubCredential};","/* __next_internal_action_entry_do_not_use__ [{\"60b0b3dd67ea1c9a5ecdcb89bc631096e6385e1c0f\":\"saveGitLabCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"60b0b3dd67ea1c9a5ecdcb89bc631096e6385e1c0f\",callServer,void 0,findSourceMapURL,\"saveGitLabCredential\");export{$$RSC_SERVER_ACTION_2 as saveGitLabCredential};"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/credentials/page.tsx","../../../../src/app/actions/data%3A3b32f8%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A96058b%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3Aa51241%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A119757%20%3Ctext/javascript%3E","../../../../src/app/actions/data%3A4d6714%20%3Ctext/javascript%3E"],"sourcesContent":["'use client';\n\nimport {\n listAgentApiCredentials,\n listCredentials,\n removeAgentApiCredential,\n removeCredential,\n saveAgentApiCredential,\n saveGitHubCredential,\n saveGitLabCredential,\n} from '@/app/actions/credentials';\nimport type {\n AgentApiCredential,\n AgentApiCredentialAgent,\n} from '@/lib/agent-api-credentials';\nimport type { Credential, CredentialType, GitLabCredential } from '@/lib/credentials';\nimport { ChevronRight, KeyRound, Trash2 } from 'lucide-react';\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { useEffect, useMemo, useState } from 'react';\n\nconst DEFAULT_GITLAB_SERVER_URL = 'https://gitlab.com';\nconst PROVIDER_ICON_URLS = {\n github: 'https://www.google.com/s2/favicons?domain=github.com&sz=64',\n gitlab: 'https://www.google.com/s2/favicons?domain=gitlab.com&sz=64',\n} as const;\nconst AGENT_API_LABELS: Record<AgentApiCredentialAgent, string> = {\n codex: 'Codex CLI',\n};\nconst AGENT_API_KEY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'sk-...',\n};\nconst AGENT_API_PROXY_PLACEHOLDERS: Record<AgentApiCredentialAgent, string> = {\n codex: 'https://proxy.example.com/v1',\n};\nconst AGENT_API_ORDER: AgentApiCredentialAgent[] = ['codex'];\n\ntype FlashMessage = {\n tone: 'success' | 'error';\n text: string;\n} | null;\n\nfunction formatCredentialSubtitle(credential: Credential): string {\n if (credential.type === 'gitlab') {\n return `${credential.username} @ ${credential.serverUrl}`;\n }\n return credential.username;\n}\n\nfunction formatProviderLabel(type: CredentialType): string {\n return type === 'github' ? 'GitHub' : 'GitLab';\n}\n\nfunction ProviderIcon({ type }: { type: CredentialType }) {\n return (\n <Image\n src={PROVIDER_ICON_URLS[type]}\n alt={`${formatProviderLabel(type)} icon`}\n width={20}\n height={20}\n className=\"h-5 w-5 rounded-sm\"\n unoptimized\n />\n );\n}\n\nexport default function CredentialsPage() {\n const router = useRouter();\n\n const [credentials, setCredentials] = useState<Credential[]>([]);\n const [agentApiCredentials, setAgentApiCredentials] = useState<AgentApiCredential[]>([]);\n const [loading, setLoading] = useState(true);\n\n const [githubToken, setGitHubToken] = useState('');\n const [gitlabToken, setGitLabToken] = useState('');\n const [gitlabServerUrl, setGitLabServerUrl] = useState(DEFAULT_GITLAB_SERVER_URL);\n const [agentApiKeyInputs, setAgentApiKeyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n const [agentApiProxyInputs, setAgentApiProxyInputs] = useState<Record<AgentApiCredentialAgent, string>>({\n codex: '',\n });\n\n const [savingType, setSavingType] = useState<CredentialType | null>(null);\n const [savingAgent, setSavingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [deletingAgent, setDeletingAgent] = useState<AgentApiCredentialAgent | null>(null);\n const [flashMessage, setFlashMessage] = useState<FlashMessage>(null);\n\n const githubCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'github'),\n [credentials],\n );\n\n const gitlabCredentials = useMemo(\n () => credentials.filter((credential) => credential.type === 'gitlab') as GitLabCredential[],\n [credentials],\n );\n\n const agentApiCredentialMap = useMemo(() => {\n return new Map(agentApiCredentials.map((credential) => [credential.agent, credential]));\n }, [agentApiCredentials]);\n\n const reloadCredentials = async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n };\n\n useEffect(() => {\n let isActive = true;\n\n void (async () => {\n const [gitResult, agentResult] = await Promise.all([\n listCredentials(),\n listAgentApiCredentials(),\n ]);\n if (!isActive) return;\n\n if (!gitResult.success) {\n setFlashMessage({ tone: 'error', text: gitResult.error });\n setLoading(false);\n return;\n }\n\n if (!agentResult.success) {\n setFlashMessage({ tone: 'error', text: agentResult.error });\n setLoading(false);\n return;\n }\n\n setCredentials(gitResult.credentials);\n setAgentApiCredentials(agentResult.credentials);\n setAgentApiProxyInputs((previous) => {\n const next = { ...previous };\n for (const agent of AGENT_API_ORDER) {\n next[agent] = agentResult.credentials.find((credential) => credential.agent === agent)?.apiProxy || '';\n }\n return next;\n });\n setLoading(false);\n })();\n\n return () => {\n isActive = false;\n };\n }, []);\n\n const handleSaveGitHub = async () => {\n setFlashMessage(null);\n setSavingType('github');\n\n const result = await saveGitHubCredential(githubToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitHubToken('');\n setFlashMessage({ tone: 'success', text: 'GitHub credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveGitLab = async () => {\n setFlashMessage(null);\n setSavingType('gitlab');\n\n const result = await saveGitLabCredential(gitlabServerUrl, gitlabToken);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingType(null);\n return;\n }\n\n setGitLabToken('');\n setFlashMessage({ tone: 'success', text: 'GitLab credential added.' });\n await reloadCredentials();\n setSavingType(null);\n };\n\n const handleSaveAgentApi = async (agent: AgentApiCredentialAgent) => {\n setFlashMessage(null);\n setSavingAgent(agent);\n\n const result = await saveAgentApiCredential(\n agent,\n agentApiKeyInputs[agent],\n agentApiProxyInputs[agent],\n );\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setSavingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: result.credential.apiProxy || '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential saved.` });\n await reloadCredentials();\n setSavingAgent(null);\n };\n\n const handleDelete = async (credential: Credential) => {\n const providerLabel = formatProviderLabel(credential.type);\n const confirmed = confirm(`Delete this ${providerLabel} credential for ${formatCredentialSubtitle(credential)}?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingId(credential.id);\n\n const result = await removeCredential(credential.id);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingId(null);\n return;\n }\n\n setFlashMessage({ tone: 'success', text: `${providerLabel} credential deleted.` });\n await reloadCredentials();\n setDeletingId(null);\n };\n\n const handleDeleteAgentApi = async (agent: AgentApiCredentialAgent) => {\n const confirmed = confirm(`Delete the saved ${AGENT_API_LABELS[agent]} API credential?`);\n if (!confirmed) return;\n\n setFlashMessage(null);\n setDeletingAgent(agent);\n\n const result = await removeAgentApiCredential(agent);\n if (!result.success) {\n setFlashMessage({ tone: 'error', text: result.error });\n setDeletingAgent(null);\n return;\n }\n\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: '' }));\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: '' }));\n setFlashMessage({ tone: 'success', text: `${AGENT_API_LABELS[agent]} credential deleted.` });\n await reloadCredentials();\n setDeletingAgent(null);\n };\n\n const panelClass = 'overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm';\n const sectionHeaderClass = 'flex flex-col gap-3 border-b border-slate-200 px-6 py-5 md:flex-row md:items-center md:justify-between';\n const inputClass = 'block w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2.5 text-sm text-slate-900 placeholder-slate-400 transition-all focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-60';\n const primaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg bg-primary px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-60';\n const secondaryButtonClass = 'inline-flex items-center justify-center gap-2 rounded-lg border border-slate-200 bg-white px-4 py-2 text-sm font-medium text-slate-700 transition-colors hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-60';\n const rowActionButtonClass = 'inline-flex h-8 w-8 items-center justify-center rounded-lg text-slate-400 transition-all hover:bg-red-50 hover:text-red-500';\n\n return (\n <main className=\"min-h-screen bg-[#f6f6f8] px-4 py-8 md:px-8 md:py-12\">\n <div className=\"mx-auto w-full max-w-4xl space-y-8\">\n <div className=\"mb-8\">\n <div className=\"mb-2 flex items-center gap-4\">\n <button\n type=\"button\"\n className=\"flex h-10 w-10 items-center justify-center rounded-lg text-slate-500 transition-colors hover:bg-white hover:text-slate-900\"\n onClick={() => router.push('/')}\n aria-label=\"Back to home\"\n >\n <ChevronRight className=\"h-6 w-6 rotate-180\" />\n </button>\n <h1 className=\"text-3xl font-black tracking-[-0.02em] text-slate-900 md:text-4xl\">Credential Management</h1>\n </div>\n <p className=\"ml-14 text-sm text-slate-500 md:text-base\">\n Manage your API keys and access tokens for third-party services safely.\n </p>\n </div>\n\n {flashMessage && (\n <div\n className={`rounded-lg border px-4 py-3 text-sm ${\n flashMessage.tone === 'error'\n ? 'border-red-200 bg-red-50 text-red-700'\n : 'border-emerald-200 bg-emerald-50 text-emerald-700'\n }`}\n >\n {flashMessage.text}\n </div>\n )}\n\n {loading ? (\n <div className={`${panelClass} p-10`}>\n <div className=\"flex flex-col items-center gap-3\">\n <span className=\"loading loading-spinner loading-md text-primary\"></span>\n <p className=\"text-sm text-slate-500\">Loading credentials...</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-6\">\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900\">GitHub Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500\">Access private repositories and Gists.</p>\n </div>\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveGitHub()}\n disabled={savingType === 'github'}\n >\n {savingType === 'github' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Token\n </button>\n </div>\n\n <div className=\"border-b border-slate-100 bg-slate-50/40 px-6 py-4\">\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"ghp_xxx\"\n value={githubToken}\n onChange={(event) => setGitHubToken(event.target.value)}\n disabled={savingType === 'github'}\n />\n </div>\n\n {githubCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500\">No GitHub credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100\">\n {githubCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-slate-100\">\n <ProviderIcon type=\"github\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900\">{credential.username}</div>\n <div className=\"mt-0.5 text-xs text-slate-500\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n <section className={panelClass}>\n <div className={sectionHeaderClass}>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900\">GitLab Credentials</h2>\n <p className=\"mt-1 text-sm text-slate-500\">Connect to self-hosted or cloud GitLab instances.</p>\n </div>\n <button\n className={secondaryButtonClass}\n onClick={() => void handleSaveGitLab()}\n disabled={savingType === 'gitlab'}\n >\n {savingType === 'gitlab' ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n Add Instance\n </button>\n </div>\n\n <div className=\"space-y-4 border-b border-slate-100 bg-slate-50/40 px-6 py-4\">\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500\">\n Server URL\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={DEFAULT_GITLAB_SERVER_URL}\n value={gitlabServerUrl}\n onChange={(event) => setGitLabServerUrl(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n <div>\n <label className=\"mb-2 block text-xs font-semibold uppercase tracking-wide text-slate-500\">\n Personal Access Token\n </label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder=\"glpat-xxx\"\n value={gitlabToken}\n onChange={(event) => setGitLabToken(event.target.value)}\n disabled={savingType === 'gitlab'}\n />\n </div>\n </div>\n\n {gitlabCredentials.length === 0 ? (\n <div className=\"px-6 py-6 text-sm text-slate-500\">No GitLab credentials saved.</div>\n ) : (\n <div className=\"divide-y divide-slate-100\">\n {gitlabCredentials.map((credential) => (\n <div\n key={credential.id}\n className=\"group flex items-center justify-between gap-4 px-6 py-5 transition-colors hover:bg-slate-50\"\n >\n <div className=\"flex min-w-0 items-center gap-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-orange-50\">\n <ProviderIcon type=\"gitlab\" />\n </div>\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-semibold text-slate-900\">{credential.username}</div>\n <div className=\"truncate text-xs text-slate-500\">{credential.serverUrl}</div>\n <div className=\"mt-0.5 text-xs text-slate-500\">\n Updated {new Date(credential.updatedAt).toLocaleString()}\n </div>\n </div>\n </div>\n <button\n className={`${rowActionButtonClass} opacity-0 group-hover:opacity-100 disabled:opacity-40`}\n onClick={() => void handleDelete(credential)}\n disabled={deletingId === credential.id}\n title=\"Delete\"\n >\n {deletingId === credential.id ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n </button>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {AGENT_API_ORDER.map((agent) => {\n const configuredCredential = agentApiCredentialMap.get(agent);\n const isSaving = savingAgent === agent;\n const isDeleting = deletingAgent === agent;\n\n return (\n <section key={agent} className={panelClass}>\n <div className={sectionHeaderClass}>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-emerald-100 p-1.5 text-emerald-600\">\n <KeyRound className=\"h-5 w-5\" />\n </div>\n <div>\n <h2 className=\"text-lg font-bold text-slate-900\">{AGENT_API_LABELS[agent]} Configuration</h2>\n <p className=\"text-sm text-slate-500\">Configure access for LLM capabilities.</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n {configuredCredential && (\n <button\n className={secondaryButtonClass}\n onClick={() => void handleDeleteAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isDeleting ? <span className=\"loading loading-spinner loading-xs\"></span> : <Trash2 className=\"h-4 w-4\" />}\n Remove\n </button>\n )}\n <button\n className={primaryButtonClass}\n onClick={() => void handleSaveAgentApi(agent)}\n disabled={isSaving || isDeleting}\n >\n {isSaving ? <span className=\"loading loading-spinner loading-xs\"></span> : <KeyRound className=\"h-4 w-4\" />}\n {configuredCredential ? 'Save Changes' : 'Save'}\n </button>\n </div>\n </div>\n\n <div className=\"space-y-6 p-6\">\n <div className=\"max-w-2xl space-y-4\">\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700\">API Key</label>\n <input\n type=\"password\"\n className={inputClass}\n placeholder={AGENT_API_KEY_PLACEHOLDERS[agent]}\n value={agentApiKeyInputs[agent]}\n onChange={(event) =>\n setAgentApiKeyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500\">\n Your API key is stored locally and never shared.\n </p>\n </div>\n\n <div>\n <label className=\"mb-2 block text-sm font-medium text-slate-700\">\n API Proxy <span className=\"font-normal text-slate-400\">(Optional)</span>\n </label>\n <input\n type=\"url\"\n className={inputClass}\n placeholder={AGENT_API_PROXY_PLACEHOLDERS[agent]}\n value={agentApiProxyInputs[agent]}\n onChange={(event) =>\n setAgentApiProxyInputs((previous) => ({ ...previous, [agent]: event.target.value }))\n }\n disabled={isSaving || isDeleting}\n />\n <p className=\"mt-1 text-xs text-slate-500\">\n Override this when using a proxy or a compatible endpoint.\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-slate-200 bg-slate-50 p-3 text-xs text-slate-600\">\n {configuredCredential ? (\n <div className=\"space-y-1\">\n <div>API key configured.</div>\n <div>Updated {new Date(configuredCredential.updatedAt).toLocaleString()}</div>\n <div>Proxy {configuredCredential.apiProxy ? configuredCredential.apiProxy : 'not set'}</div>\n </div>\n ) : (\n <div>No API credential saved.</div>\n )}\n </div>\n </div>\n </section>\n );\n })}\n\n <div className=\"pb-2 pt-4 text-center text-xs text-slate-400\">\n Credentials are encrypted at rest using your system keychain.\n </div>\n </div>\n )}\n </div>\n </main>\n );\n}\n","/* __next_internal_action_entry_do_not_use__ [{\"407dd022f450835e92452755c2187f2759ce65a352\":\"removeAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_6=/*#__PURE__*/createServerReference(\"407dd022f450835e92452755c2187f2759ce65a352\",callServer,void 0,findSourceMapURL,\"removeAgentApiCredential\");export{$$RSC_SERVER_ACTION_6 as removeAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"40549b442d0eb35deaec280c1a3ac69584e89086a5\":\"removeCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_5=/*#__PURE__*/createServerReference(\"40549b442d0eb35deaec280c1a3ac69584e89086a5\",callServer,void 0,findSourceMapURL,\"removeCredential\");export{$$RSC_SERVER_ACTION_5 as removeCredential};","/* __next_internal_action_entry_do_not_use__ [{\"708a3dd3737dc6efc62a9fa45a820696f5441c8d44\":\"saveAgentApiCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_4=/*#__PURE__*/createServerReference(\"708a3dd3737dc6efc62a9fa45a820696f5441c8d44\",callServer,void 0,findSourceMapURL,\"saveAgentApiCredential\");export{$$RSC_SERVER_ACTION_4 as saveAgentApiCredential};","/* __next_internal_action_entry_do_not_use__ [{\"4004a0e7ba2853a497f171ed16037e29939770bf9d\":\"saveGitHubCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_1=/*#__PURE__*/createServerReference(\"4004a0e7ba2853a497f171ed16037e29939770bf9d\",callServer,void 0,findSourceMapURL,\"saveGitHubCredential\");export{$$RSC_SERVER_ACTION_1 as saveGitHubCredential};","/* __next_internal_action_entry_do_not_use__ [{\"60cd0b78e5e61702e931c48bbfdc43d298af6e8439\":\"saveGitLabCredential\"},\"src/app/actions/credentials.ts\",\"\"] */\"use turbopack no side effects\";import{createServerReference,callServer,findSourceMapURL}from\"private-next-rsc-action-client-wrapper\";const $$RSC_SERVER_ACTION_2=/*#__PURE__*/createServerReference(\"60cd0b78e5e61702e931c48bbfdc43d298af6e8439\",callServer,void 0,findSourceMapURL,\"saveGitLabCredential\");export{$$RSC_SERVER_ACTION_2 as saveGitLabCredential};"],"names":[],"mappings":"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"}