@minhkhoa/aimanagement 0.1.0 → 0.1.1
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.
- package/dist/server/aiteam-server.cjs +190 -176
- package/dist/web/404/index.html +1 -1
- package/dist/web/404.html +1 -1
- package/dist/web/__next.__PAGE__.txt +1 -1
- package/dist/web/__next._full.txt +1 -1
- package/dist/web/__next._tree.txt +1 -1
- package/dist/web/_next/static/chunks/3t_w5gjbvk2iv.js +10 -0
- package/dist/web/_next/static/chunks/42pnuyli0qdjt.js +1 -0
- package/dist/web/_not-found/__next._full.txt +1 -1
- package/dist/web/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/web/_not-found/__next._tree.txt +1 -1
- package/dist/web/_not-found/index.html +1 -1
- package/dist/web/_not-found/index.txt +1 -1
- package/dist/web/index.html +1 -1
- package/dist/web/index.txt +1 -1
- package/dist/web/monitor/__next._full.txt +1 -1
- package/dist/web/monitor/__next._tree.txt +1 -1
- package/dist/web/monitor/__next.monitor.__PAGE__.txt +1 -1
- package/dist/web/monitor/index.html +1 -1
- package/dist/web/monitor/index.txt +1 -1
- package/dist/web/org/__next._full.txt +1 -1
- package/dist/web/org/__next._tree.txt +1 -1
- package/dist/web/org/__next.org.__PAGE__.txt +1 -1
- package/dist/web/org/index.html +1 -1
- package/dist/web/org/index.txt +1 -1
- package/dist/web/settings/__next._full.txt +16 -15
- package/dist/web/settings/__next._tree.txt +1 -1
- package/dist/web/settings/__next.settings.__PAGE__.txt +17 -16
- package/dist/web/settings/index.html +1 -1
- package/dist/web/settings/index.txt +16 -15
- package/dist/web/tasks/__next._full.txt +1 -1
- package/dist/web/tasks/__next._tree.txt +1 -1
- package/dist/web/tasks/__next.tasks.__PAGE__.txt +1 -1
- package/dist/web/tasks/index.html +1 -1
- package/dist/web/tasks/index.txt +1 -1
- package/dist/web/workflows/__next._full.txt +1 -1
- package/dist/web/workflows/__next._tree.txt +1 -1
- package/dist/web/workflows/__next.workflows.__PAGE__.txt +1 -1
- package/dist/web/workflows/index.html +1 -1
- package/dist/web/workflows/index.txt +1 -1
- package/package.json +2 -1
- package/dist/web/_next/static/chunks/3wnxqwb2tnys-.js +0 -10
- /package/dist/web/_next/static/{ijXCyL0v-NhTojj_uhUdh → 2rXlIrJv2_Lt22uNfj2V-}/_buildManifest.js +0 -0
- /package/dist/web/_next/static/{ijXCyL0v-NhTojj_uhUdh → 2rXlIrJv2_Lt22uNfj2V-}/_clientMiddlewareManifest.js +0 -0
- /package/dist/web/_next/static/{ijXCyL0v-NhTojj_uhUdh → 2rXlIrJv2_Lt22uNfj2V-}/_ssgManifest.js +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@minhkhoa/aimanagement",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "AI Team: nền tảng điều phối nhiều agent AI (Claude Code, Codex, Custom API) theo phòng ban, chạy hoàn toàn trên máy.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
"start": "node bin/aiteam.mjs",
|
|
51
51
|
"test:smoke": "node scripts/smoke-test-dist.mjs",
|
|
52
52
|
"check:bundle": "node scripts/check-web-bundle.mjs",
|
|
53
|
+
"measure": "node scripts/measure-runtime.mjs",
|
|
53
54
|
"prepublishOnly": "npm run lint && npm test",
|
|
54
55
|
"prepack": "npm run build && npm run test:smoke && npm run check:bundle"
|
|
55
56
|
},
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,5744,e=>{"use strict";var n=e.i(43476),t=e.i(71645),l=e.i(29628),a=e.i(17770),s=e.i(54275),o=e.i(88872),i=e.i(72648),r=e.i(28833),c=e.i(40742),d=e.i(88002);let u=Array.from({length:i.Q.max-i.Q.min+1},(e,n)=>i.Q.min+n);function m({sectionClassName:e}){let t=(0,l.e)("workspace-settings",c.w),{outcome:i,isPending:h,performAction:g}=(0,r.f)();return(0,n.jsxs)("section",{"aria-labelledby":"workspace-heading",className:e,children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{id:"workspace-heading",className:s.controlStyles.panelTitle,children:"Thư mục làm việc và số agent chạy song song"}),(0,n.jsx)("p",{className:d.default.hint,children:"Task chỉ được làm trong các thư mục bạn chọn từ máy (và thư mục con của chúng). Thêm thư mục bằng hộp chọn thư mục của hệ điều hành; gõ tay không thêm được."})]}),"loading"===t.status&&(0,n.jsx)("p",{className:d.default.hint,children:"Đang tải…"}),"error"===t.status&&(0,n.jsx)(a.x,{outcome:{tone:"error",error:t.error}}),"success"===t.status&&(0,n.jsxs)(n.Fragment,{children:[0===t.result.allowedDirectories.length?(0,n.jsx)("p",{className:d.default.hint,children:"Chưa có thư mục nào được cho phép."}):t.result.allowedDirectories.map(e=>(0,n.jsxs)("div",{className:d.default.fileRow,children:[(0,n.jsx)("span",{className:`${d.default.fileText} ${d.default.monoValue}`,children:e}),(0,n.jsx)("button",{type:"button",className:d.default.iconAction,"aria-label":`Bỏ cho ph\xe9p ${e}`,disabled:h,onClick:()=>void g(()=>(0,c.n)({allowedDirectories:t.result.allowedDirectories.filter(n=>n!==e)}),()=>"Đã bỏ thư mục khỏi danh sách cho phép."),children:(0,n.jsx)(o.f,{path:"M6 6l12 12M18 6L6 18",size:14,strokeWidth:2.2})})]},e)),(0,n.jsx)("div",{className:s.controlStyles.buttonRow,children:(0,n.jsxs)("button",{type:"button",className:s.controlStyles.secondaryButton,disabled:h,onClick:()=>void g(c.s,e=>null===e.path?null:`Đ\xe3 cho ph\xe9p ${e.path}.`),children:[(0,n.jsx)(o.f,{path:"M3 6h6l2 2h10v11H3z",size:16})," Thêm thư mục"]})}),(0,n.jsxs)("label",{className:`${s.controlStyles.field} ${d.default.narrowField}`,children:["Số agent chạy cùng lúc",(0,n.jsx)("select",{value:t.result.maxParallelAgents,disabled:h,onChange:e=>{let n=Number(e.target.value);g(()=>(0,c.n)({maxParallelAgents:n}),()=>`Tối đa ${n} agent chạy c\xf9ng l\xfac.`)},className:s.controlStyles.fieldInput,children:u.map(e=>(0,n.jsxs)("option",{value:e,children:[e," agent"]},e))})]}),(0,n.jsx)("p",{className:d.default.hint,children:"Nhiều agent cùng lúc dùng nhanh hết hạn mức gói Claude / ChatGPT; mặc định 2."})]}),(0,n.jsx)(a.x,{outcome:i})]})}var h=e.i(45137),g=e.i(48646);let p=new Set(["completed","failed","cancelled"]);function x(){let[e,n]=(0,t.useState)("idle"),[l,a]=(0,t.useState)([]),[s,o]=(0,t.useState)(null),i=(0,t.useRef)(null),r=(0,t.useRef)(null),c=(0,t.useCallback)(()=>{i.current?.close(),i.current=null},[]);return(0,t.useEffect)(()=>c,[c]),{phase:e,events:l,startError:s,startTestRun:(0,t.useCallback)(async e=>{let t;c(),a([]),o(null),n("starting");try{t=(await e()).testRunId}catch(e){o(e),n("idle");return}r.current=t,n("running");let l=-1,s=new EventSource(`/api/engine-test-runs/${encodeURIComponent(t)}/events`);i.current=s,s.onmessage=e=>{let t=g.j.safeParse(JSON.parse(e.data));if(!t.success||t.data.sequence<=l)return;l=t.data.sequence;let s=t.data.event;a(e=>[...e,s]),p.has(s.kind)&&(c(),n("finished"))},s.onerror=()=>{s.readyState===EventSource.CLOSED&&n(e=>"running"===e?"finished":e)}},[c]),cancelTestRun:(0,t.useCallback)(async()=>{null!==r.current&&await (0,h._)(r.current)},[])}}var b=e.i(72634);function f({events:e}){let t=function(e){let n=[],t="";for(let l of e)switch(l.kind){case"session_started":n.push({tone:"neutral",text:`▸ Bắt đầu phi\xean${null===l.model?"":` \xb7 ${l.model}`}`});break;case"text_delta":t+=l.text;break;case"message":n.push({tone:"neutral",text:l.text}),t="";break;case"tool_call":n.push({tone:"neutral",text:`⚙ ${l.toolName} ${l.detail}`.trim()});break;case"command":n.push({tone:"neutral",text:`$ ${l.command}${null===l.exitCode?"":` (m\xe3 tho\xe1t ${l.exitCode})`}`});break;case"file_change":n.push({tone:"neutral",text:`✎ ${l.changeKind} ${l.path}`});break;case"usage":n.push({tone:"neutral",text:`Σ ${l.inputTokens} token v\xe0o \xb7 ${l.outputTokens} token ra${null===l.costUsd?"":` \xb7 $${l.costUsd.toFixed(4)}`}`});break;case"completed":n.push({tone:"success",text:"✓ Hoàn thành"});break;case"failed":n.push({tone:"error",text:`✗ ${l.message} [${l.code}${l.retryable?", thử lại được":""}]`});break;case"cancelled":n.push({tone:"error",text:"■ Đã huỷ"})}return""!==t&&n.push({tone:"neutral",text:t}),n}(e);return 0===t.length?null:(0,n.jsx)("div",{className:b.default.runLog,role:"log","aria-live":"polite","aria-label":"Kết quả chạy thử",children:t.map((e,t)=>(0,n.jsx)("div",{className:b.default[`runLine_${e.tone}`],children:e.text},t))})}function j({connection:e,onEdit:l}){let[o,i]=(0,t.useState)(e.defaultModel??e.models[0]??""),[c,d]=(0,t.useState)(!1),{outcome:u,isPending:m,performAction:g}=(0,r.f)(),p=x();return(0,n.jsxs)("article",{className:b.default.connectionCard,"aria-label":e.name,children:[(0,n.jsxs)("div",{className:b.default.engineHeader,children:[(0,n.jsxs)("span",{className:b.default.engineTitle,children:[(0,n.jsx)("span",{className:b.default.engineName,children:e.name}),(0,n.jsx)("span",{className:`${b.default.engineVia} ${b.default.monoText}`,children:e.baseUrl})]}),(0,n.jsx)("span",{className:b.default.formatBadge,children:"anthropic"===e.format?"Anthropic":"OpenAI-compatible"})]}),(0,n.jsxs)("dl",{className:b.default.engineFacts,children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Khoá"}),(0,n.jsx)("dd",{className:b.default.monoText,children:null===e.keyHint?"không có / ẩn":`…${e.keyHint}`})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Model"}),(0,n.jsxs)("dd",{children:[e.models.length," · mặc định"," ",(0,n.jsx)("span",{className:b.default.monoText,children:e.defaultModel??"—"})]})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Agent dùng"}),(0,n.jsx)("dd",{children:0===e.agentNames.length?"chưa có":e.agentNames.join(", ")})]})]}),(0,n.jsxs)("div",{className:s.controlStyles.buttonRow,children:[(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:l,children:"Sửa"}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,disabled:m,onClick:()=>void g(()=>(0,h.C)(e.id),e=>`${e.reachable?"✓":"✗"} ${e.message} (${e.latencyMs} ms)`),children:"Kiểm tra kết nối"}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>d(!0),children:"Xoá…"})]}),(0,n.jsx)(a.x,{outcome:u}),e.models.length>0&&(0,n.jsxs)("div",{className:b.default.inlineInput,children:[(0,n.jsx)("select",{"aria-label":`Model chạy thử cho ${e.name}`,value:o,onChange:e=>i(e.target.value),className:`${s.controlStyles.fieldInput} ${b.default.monoInput}`,children:e.models.map(e=>(0,n.jsx)("option",{value:e,children:e},e))}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.primaryButton,disabled:"starting"===p.phase||"running"===p.phase,onClick:()=>void p.startTestRun(()=>(0,h.o)(e.id,o)),children:"running"===p.phase?"Đang chạy…":"Chạy thử"}),"running"===p.phase&&(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>void p.cancelTestRun(),children:"Huỷ"})]}),null!==p.startError&&(0,n.jsx)(a.x,{outcome:{tone:"error",error:p.startError}}),(0,n.jsx)(f,{events:p.events}),c&&(0,n.jsxs)("div",{className:b.default.confirmBox,role:"group","aria-label":`X\xe1c nhận xo\xe1 ${e.name}`,children:[(0,n.jsxs)("span",{children:["Xoá kết nối ",e.name,"? Khoá đã lưu cũng bị xoá."]}),(0,n.jsxs)("div",{className:s.controlStyles.buttonRow,children:[(0,n.jsx)("button",{type:"button",className:s.controlStyles.dangerButton,disabled:m,onClick:()=>void g(()=>(0,h.v)(e.id).then(()=>!0),()=>null),children:"Xoá kết nối"}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>d(!1),children:"Giữ lại"})]})]})]})}var y=e.i(58236);let k=[{format:"openai",label:"OpenAI-compatible",note:"OpenAI, OpenRouter, vLLM, Ollama…",urlPlaceholder:"https://api.openai.com/v1 hoặc http://localhost:11434/v1"},{format:"anthropic",label:"Anthropic API",note:"Messages API",urlPlaceholder:"https://api.anthropic.com"}];function v({editedConnection:e,onSaved:l,onCancel:o}){let[i,c]=(0,t.useState)(e?.name??""),[d,u]=(0,t.useState)(e?.format??"openai"),[m,p]=(0,t.useState)(e?.baseUrl??""),[x,f]=(0,t.useState)(""),[j,C]=(0,t.useState)(e?.models??[]),[_,S]=(0,t.useState)(new Set(e?.models??[])),[z,$]=(0,t.useState)(e?.defaultModel??null),[T,I]=(0,t.useState)({}),P=(0,r.f)(),w=(0,r.f)(),F=k.find(e=>e.format===d)??k[0],A=async()=>{let n=await P.performAction(()=>(0,h.q)({format:d,baseUrl:m.trim(),...""===x.trim()?{}:{apiKey:x.trim()},...void 0===e?{}:{connectionId:e.id}}),e=>`T\xecm thấy ${e.models.length} model.`);void 0!==n&&C(n.models)},L=async n=>{n.preventDefault();let t=g.r.safeParse({name:i,format:d,baseUrl:m,...""===x.trim()?{}:{apiKey:x},models:[..._],defaultModel:z});t.success?(I({}),void 0!==await w.performAction(()=>void 0===e?(0,h.p)(t.data):(0,h.s)(e.id,t.data),()=>null)&&l()):I((0,y.k)(t.error))};return(0,n.jsx)(a.h,{title:void 0===e?"Thêm kết nối API":`Sửa ${e.name}`,emphasised:!0,children:(0,n.jsxs)("form",{className:b.default.form,onSubmit:e=>void L(e),noValidate:!0,children:[(0,n.jsxs)("label",{className:s.controlStyles.field,children:["Tên kết nối",(0,n.jsx)("input",{type:"text",value:i,onChange:e=>c(e.target.value),className:s.controlStyles.fieldInput,placeholder:"OpenRouter cá nhân"})]}),void 0!==T.name&&(0,n.jsx)("span",{role:"alert",className:s.controlStyles.fieldError,children:T.name}),(0,n.jsx)("div",{role:"radiogroup","aria-label":"Định dạng API",className:b.default.formatChoices,children:k.map(e=>(0,n.jsxs)("button",{type:"button",role:"radio","aria-checked":d===e.format,className:b.default.formatChoice,onClick:()=>u(e.format),children:[(0,n.jsx)("span",{className:b.default.formatLabel,children:e.label}),(0,n.jsx)("span",{className:b.default.engineVia,children:e.note})]},e.format))}),(0,n.jsxs)("label",{className:s.controlStyles.field,children:["Base URL",(0,n.jsx)("input",{type:"url",value:m,onChange:e=>p(e.target.value),className:`${s.controlStyles.fieldInput} ${b.default.monoInput}`,placeholder:F?.urlPlaceholder})]}),void 0!==T.baseUrl&&(0,n.jsx)("span",{role:"alert",className:s.controlStyles.fieldError,children:T.baseUrl}),(0,n.jsxs)("label",{className:s.controlStyles.field,children:["API key",(0,n.jsx)("input",{type:"password",value:x,autoComplete:"off",onChange:e=>f(e.target.value),className:`${s.controlStyles.fieldInput} ${b.default.monoInput}`,placeholder:(e?.keyHint??null)!==null?`Để trống để giữ kho\xe1 hiện tại (…${e?.keyHint??""})`:"Bỏ trống nếu máy chủ không cần khoá (Ollama…)"})]}),(0,n.jsx)("p",{className:b.default.fieldHint,children:"Khoá được mã hoá AES-256-GCM trên máy này; giao diện không bao giờ nhận lại khoá."}),(0,n.jsx)("div",{className:s.controlStyles.buttonRow,children:(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>void A(),disabled:P.isPending||""===m.trim(),children:P.isPending?"Đang tải…":"Tải danh sách model"})}),(0,n.jsx)(a.x,{outcome:P.outcome}),j.length>0&&(0,n.jsxs)("fieldset",{className:b.default.modelPicker,children:[(0,n.jsxs)("legend",{className:b.default.colorLegend,children:["Model cho agent dùng (",_.size," đã chọn)"]}),(0,n.jsx)("div",{className:b.default.modelList,children:j.map(e=>(0,n.jsxs)("label",{className:b.default.modelOption,children:[(0,n.jsx)("input",{type:"checkbox",checked:_.has(e),onChange:()=>{S(n=>{let t=new Set(n);return t.delete(e)||t.add(e),t.has(z??"")||$([...t][0]??null),t})}}),(0,n.jsx)("span",{className:b.default.monoText,children:e})]},e))})]}),_.size>0&&(0,n.jsxs)("label",{className:s.controlStyles.field,children:["Model mặc định",(0,n.jsx)("select",{value:z??"",onChange:e=>$(e.target.value||null),className:s.controlStyles.fieldInput,children:[..._].map(e=>(0,n.jsx)("option",{value:e,children:e},e))})]}),(0,n.jsx)(N,{format:d,baseUrl:m,model:z,hasKey:""!==x.trim()||(e?.keyHint??null)!==null}),(0,n.jsx)(a.x,{outcome:w.outcome}),(0,n.jsxs)("div",{className:s.controlStyles.buttonRow,children:[(0,n.jsx)("button",{type:"submit",className:s.controlStyles.primaryButton,disabled:w.isPending,children:void 0===e?"Lưu kết nối":"Lưu thay đổi"}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:o,children:"Huỷ"})]})]})})}function N({format:e,baseUrl:t,model:l,hasKey:a}){let s=t.trim().replace(/\/+$/,"")||"<base-url>",o=l??"<model>",i="anthropic"===e?[`POST ${s.replace(/\/v1$/,"")}/v1/messages`,...a?["x-api-key: ••••••••"]:[],"anthropic-version: 2026-10-21",`{ "model": "${o}", "max_tokens": 16000, "stream": true,`,' "messages": [{ "role": "user", "content": "<yêu cầu của task>" }] }']:[`POST ${s}/chat/completions`,...a?["Authorization: Bearer ••••••••"]:[],`{ "model": "${o}", "stream": true,`,' "messages": [{ "role": "user", "content": "<yêu cầu của task>" }] }'];return(0,n.jsxs)("section",{"aria-label":"Cách nền tảng gọi API",className:b.default.callPreview,children:[(0,n.jsx)("span",{className:b.default.colorLegend,children:"Cách nền tảng gọi API"}),(0,n.jsx)("pre",{className:b.default.codeBlock,children:i.join("\n")})]})}let C={claude_code:{name:"Claude Code",mark:"CC",via:"claude -p · tài khoản Claude đã đăng nhập",modelSuggestions:["claude-opus-5-5","claude-sonnet-5-5","claude-haiku-5-5"],modelPlaceholder:"Mặc định của Claude Code",commandSafety:{kind:"toggle",label:"Chặn rm -rf, git push, git reset --hard, npm publish khi chạy tự động"},background:"#1C3256",foreground:"#B9D3FF"},codex:{name:"Codex",mark:"CX",via:"codex exec · tài khoản ChatGPT đã đăng nhập",modelSuggestions:[],modelPlaceholder:"Mặc định của Codex",commandSafety:{kind:"note",label:"Lệnh nguy hiểm do sandbox của Codex giới hạn: agent chỉ đọc chạy read-only; agent được sửa chỉ ghi trong thư mục của task, mạng theo công tắc bên dưới. Codex không lọc từng lệnh."},background:"#113329",foreground:"#86E8C4"}};function _({engine:e}){let l=C[e.engine],[o,i]=(0,t.useState)(e.settings.defaultModel??""),[c,d]=(0,t.useState)(null),{outcome:u,isPending:m,performAction:p}=(0,r.f)(),j=x(),y=e.installed&&!1!==e.signedIn;return(0,n.jsxs)("article",{className:b.default.engineCard,"aria-label":l.name,children:[(0,n.jsxs)("div",{className:b.default.engineHeader,children:[(0,n.jsxs)("span",{className:b.default.engineIdentity,children:[(0,n.jsx)("span",{className:b.default.engineMark,style:{background:l.background,color:l.foreground},children:l.mark}),(0,n.jsxs)("span",{className:b.default.engineTitle,children:[(0,n.jsx)("span",{className:b.default.engineName,children:l.name}),(0,n.jsx)("span",{className:b.default.engineVia,children:l.via})]})]}),(0,n.jsx)("span",{className:y?b.default.statusReady:b.default.statusProblem,children:e.installed?!1===e.signedIn?"Chưa đăng nhập":"Sẵn sàng":"Chưa cài"})]}),(0,n.jsxs)("dl",{className:b.default.engineFacts,children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Phiên bản"}),(0,n.jsx)("dd",{children:e.version??"—"})]}),(0,n.jsxs)("div",{children:[(0,n.jsx)("dt",{children:"Tài khoản"}),(0,n.jsx)("dd",{children:e.accountDetail??"—"})]})]}),null!==e.problem&&(0,n.jsx)("p",{className:b.default.engineProblem,children:e.problem}),(0,n.jsxs)("label",{className:s.controlStyles.field,children:["Model mặc định",(0,n.jsxs)("span",{className:b.default.inlineInput,children:[(0,n.jsx)("input",{type:"text",value:o,list:`${e.engine}-models`,onChange:e=>i(e.target.value),placeholder:l.modelPlaceholder,className:`${s.controlStyles.fieldInput} ${b.default.monoInput}`,"aria-invalid":null!==c}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>{let n=o.trim(),t=""===n?null:g.X.safeParse(n);null===t||t.success?(d(null),p(()=>(0,h.X)(e.engine,{defaultModel:null===t?null:t.data}),()=>"Đã lưu model mặc định.")):d(t.error.issues[0]?.message??"Tên model không hợp lệ")},disabled:m,children:"Lưu"})]}),(0,n.jsx)("datalist",{id:`${e.engine}-models`,children:l.modelSuggestions.map(e=>(0,n.jsx)("option",{value:e},e))})]}),null!==c&&(0,n.jsx)("span",{role:"alert",className:s.controlStyles.fieldError,children:c}),"toggle"===l.commandSafety.kind?(0,n.jsx)(a.T,{pressed:e.settings.blockDangerousCommands,accessibleLabel:l.commandSafety.label,visibleLabel:l.commandSafety.label,onToggle:()=>void p(()=>(0,h.X)(e.engine,{blockDangerousCommands:!e.settings.blockDangerousCommands}),()=>null),disabled:m}):(0,n.jsx)("p",{className:b.default.fieldHint,children:l.commandSafety.label}),(0,n.jsx)(a.T,{pressed:e.settings.allowNetwork,accessibleLabel:"Cho phép truy cập mạng (giới hạn trên cho mọi agent dùng engine này)",visibleLabel:"Cho phép truy cập mạng (giới hạn trên cho mọi agent)",onToggle:()=>void p(()=>(0,h.X)(e.engine,{allowNetwork:!e.settings.allowNetwork}),()=>null),disabled:m}),(0,n.jsxs)("span",{className:b.default.engineVia,children:["Agent đang dùng: ",0===e.agentNames.length?"chưa có":e.agentNames.join(", ")]}),(0,n.jsx)(a.x,{outcome:u}),(0,n.jsxs)("div",{className:s.controlStyles.buttonRow,children:[(0,n.jsx)("button",{type:"button",className:s.controlStyles.primaryButton,onClick:()=>void j.startTestRun(()=>(0,h.Q)(e.engine)),disabled:!e.installed||"starting"===j.phase||"running"===j.phase,children:"running"===j.phase?"Đang chạy thử…":"Chạy thử trên máy"}),"running"===j.phase&&(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,onClick:()=>void j.cancelTestRun(),children:"Huỷ"})]}),(0,n.jsx)("p",{className:b.default.fieldHint,children:"Chạy thử: đọc README.md của một thư mục tạm và tóm tắt trong một câu. Chỉ đọc, không mạng."}),null!==j.startError&&(0,n.jsx)(a.x,{outcome:{tone:"error",error:j.startError}}),(0,n.jsx)(f,{events:j.events})]})}let S=`# 1. Claude Code: c\xe0i CLI, rồi đăng nhập bằng t\xe0i khoản Claude
|
|
2
|
-
# (c\xf9ng t\xe0i khoản với Claude Desktop)
|
|
3
|
-
claude # g\xf5 /login trong cửa sổ n\xe0y
|
|
4
|
-
|
|
5
|
-
# 2. Codex: nếu đ\xe3 đăng nhập trong Codex app th\xec bỏ qua, kh\xf4ng th\xec
|
|
6
|
-
npm install -g @openai/codex
|
|
7
|
-
codex login
|
|
8
|
-
|
|
9
|
-
# 3. Kiểm tra cả hai
|
|
10
|
-
aimanagement doctor`;e.s(["SettingsScreen",0,function(){let e=(0,l.e)("local-engines",h.r),i=(0,l.e)("provider-connections",h.l),[r,c]=(0,t.useState)(!1),[d,u]=(0,t.useState)({mode:"closed"});return(0,n.jsxs)("div",{className:b.default.screen,children:[(0,n.jsxs)("section",{"aria-labelledby":"local-engines-heading",className:b.default.sectionCard,children:[(0,n.jsxs)("div",{className:b.default.sectionHeader,children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{id:"local-engines-heading",className:s.controlStyles.panelTitle,children:"Bộ não lập trình: Claude Code và Codex"}),(0,n.jsx)("p",{className:b.default.sectionIntro,children:"Chạy ngay trên máy này bằng tài khoản bạn đã đăng nhập, không dùng API key. Quyền của mỗi lần chạy do từng agent quyết định; cài đặt ở đây là giới hạn trên."})]}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.secondaryButton,"aria-expanded":r,onClick:()=>c(e=>!e),children:r?"Ẩn hướng dẫn cài":"Hướng dẫn cài"})]}),r&&(0,n.jsx)("pre",{className:b.default.codeBlock,children:S}),"loading"===e.status&&(0,n.jsx)("p",{className:b.default.fieldHint,children:"Đang kiểm tra Claude Code và Codex trên máy…"}),"error"===e.status&&(0,n.jsx)(a.x,{outcome:{tone:"error",error:e.error}}),"success"===e.status&&(0,n.jsx)("div",{className:b.default.engineGrid,children:e.result.map(e=>(0,n.jsx)(_,{engine:e},e.engine))})]}),(0,n.jsx)(m,{sectionClassName:b.default.sectionCard??""}),(0,n.jsxs)("section",{"aria-labelledby":"connections-heading",className:b.default.sectionCard,children:[(0,n.jsxs)("div",{className:b.default.sectionHeader,children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{id:"connections-heading",className:s.controlStyles.panelTitle,children:"Kết nối API tuỳ chỉnh"}),(0,n.jsx)("p",{className:b.default.sectionIntro,children:"Agent dùng bộ não “Custom API” gọi qua một kết nối ở đây. Hỗ trợ OpenAI-compatible (OpenAI, OpenRouter, vLLM, Ollama…) và Anthropic API. Ở giai đoạn này agent Custom API chỉ trả lời văn bản."})]}),(0,n.jsx)("button",{type:"button",className:s.controlStyles.primaryButton,onClick:()=>u({mode:"create"}),children:(0,n.jsxs)("span",{className:b.default.buttonIcon,children:[(0,n.jsx)(o.f,{path:"M12 5v14M5 12h14",size:16,strokeWidth:2.2}),"Thêm kết nối"]})})]}),"closed"!==d.mode&&(0,n.jsx)(v,{editedConnection:"edit"===d.mode?d.connection:void 0,onSaved:()=>u({mode:"closed"}),onCancel:()=>u({mode:"closed"})},"edit"===d.mode?d.connection.id:"new"),"error"===i.status&&(0,n.jsx)(a.x,{outcome:{tone:"error",error:i.error}}),"success"===i.status&&0===i.result.length&&"closed"===d.mode&&(0,n.jsx)("p",{className:b.default.fieldHint,children:"Chưa có kết nối nào. Bấm “Thêm kết nối” để thêm OpenAI-compatible hoặc Anthropic API."}),"success"===i.status&&(0,n.jsx)("div",{className:b.default.engineGrid,children:i.result.map(e=>(0,n.jsx)(j,{connection:e,onEdit:()=>u({mode:"edit",connection:e})},e.id))})]})]})}],5744)},72634,e=>{e.v({buttonIcon:"Fee_6W_buttonIcon",callPreview:"Fee_6W_callPreview",codeBlock:"Fee_6W_codeBlock",colorLegend:"Fee_6W_colorLegend",confirmBox:"Fee_6W_confirmBox",connectionCard:"Fee_6W_connectionCard",engineCard:"Fee_6W_engineCard",engineFacts:"Fee_6W_engineFacts",engineGrid:"Fee_6W_engineGrid",engineHeader:"Fee_6W_engineHeader",engineIdentity:"Fee_6W_engineIdentity",engineMark:"Fee_6W_engineMark",engineName:"Fee_6W_engineName",engineProblem:"Fee_6W_engineProblem",engineTitle:"Fee_6W_engineTitle",engineVia:"Fee_6W_engineVia",fieldHint:"Fee_6W_fieldHint",form:"Fee_6W_form",formatBadge:"Fee_6W_formatBadge",formatChoice:"Fee_6W_formatChoice",formatChoices:"Fee_6W_formatChoices",formatLabel:"Fee_6W_formatLabel",inlineInput:"Fee_6W_inlineInput",modelList:"Fee_6W_modelList",modelOption:"Fee_6W_modelOption",modelPicker:"Fee_6W_modelPicker",monoInput:"Fee_6W_monoInput",monoText:"Fee_6W_monoText",runLine_error:"Fee_6W_runLine_error",runLine_neutral:"Fee_6W_runLine_neutral",runLine_success:"Fee_6W_runLine_success",runLog:"Fee_6W_runLog",screen:"Fee_6W_screen",sectionCard:"Fee_6W_sectionCard",sectionHeader:"Fee_6W_sectionHeader",sectionIntro:"Fee_6W_sectionIntro",statusProblem:"Fee_6W_statusProblem",statusReady:"Fee_6W_statusReady"})},45137,48646,58236,e=>{"use strict";var n=e.i(57746),t=e.i(82492),l=e.i(54105),a=e.i(11382),s=e.i(13056),o=e.i(42203),i=e.i(77562),r=e.i(68217),c=e.i(78056),d=e.i(694);let u=t.z.enum(["claude_code","codex"]),m=l.z.string().trim().regex(/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,99}$/,"Tên model không hợp lệ"),h=new Set(["localhost","127.0.0.1","[::1]"]),g=l.z.string().trim().max(300).refine(e=>{if(!URL.canParse(e))return!1;let n=new URL(e),t=h.has(n.hostname);return("https:"===n.protocol||"http:"===n.protocol&&t)&&""===n.username&&""===n.password&&""===n.search&&""===n.hash},"URL phải dùng https (http chỉ cho localhost), không chứa tài khoản, query hay #"),p=a.z.object({defaultModel:m.nullable(),blockDangerousCommands:s.z.boolean(),allowNetwork:s.z.boolean()});p.partial().strict().refine(e=>Object.keys(e).length>0,{message:"Cần ít nhất một trường để cập nhật"});let x=a.z.object({engine:u,installed:s.z.boolean(),version:l.z.string().nullable(),signedIn:s.z.boolean().nullable(),accountDetail:l.z.string().nullable(),problem:l.z.string().nullable(),settings:p,agentNames:o.z.array(l.z.string())}),b=o.z.array(x),f=i.z.discriminatedUnion("kind",[a.z.object({kind:r.z.literal("session_started"),sessionRef:l.z.string().nullable(),model:l.z.string().nullable()}),a.z.object({kind:r.z.literal("text_delta"),text:l.z.string()}),a.z.object({kind:r.z.literal("message"),text:l.z.string()}),a.z.object({kind:r.z.literal("tool_call"),toolName:l.z.string(),detail:l.z.string()}),a.z.object({kind:r.z.literal("command"),command:l.z.string(),exitCode:c.z.number().int().nullable(),output:l.z.string()}),a.z.object({kind:r.z.literal("file_change"),path:l.z.string(),changeKind:t.z.enum(["add","update","delete"])}),a.z.object({kind:r.z.literal("usage"),inputTokens:c.z.number().int().nonnegative(),outputTokens:c.z.number().int().nonnegative(),costUsd:c.z.number().nonnegative().nullable()}),a.z.object({kind:r.z.literal("completed"),summary:l.z.string().nullable()}),a.z.object({kind:r.z.literal("failed"),code:l.z.string(),message:l.z.string(),retryable:s.z.boolean()}),a.z.object({kind:r.z.literal("cancelled")})]),j=a.z.object({sequence:c.z.number().int().nonnegative(),event:f}),y=a.z.object({testRunId:n.D}),k=l.z.string().trim().min(1,"Nhập tên kết nối").max(60),v=a.z.object({id:n.D,name:l.z.string(),format:d.h,baseUrl:l.z.string(),keyHint:l.z.string().nullable(),models:o.z.array(l.z.string()),defaultModel:l.z.string().nullable(),agentNames:o.z.array(l.z.string())}),N=o.z.array(v),C=a.z.object({name:k,format:d.h,baseUrl:g,apiKey:l.z.string().trim().min(1).max(500).optional(),models:o.z.array(m).max(200),defaultModel:m.nullable()}).strict().refine(e=>null===e.defaultModel||e.models.includes(e.defaultModel),{message:"Model mặc định phải nằm trong danh sách model",path:["defaultModel"]});a.z.object({format:d.h,baseUrl:g,apiKey:l.z.string().trim().min(1).max(500).optional(),connectionId:n.D.optional()}).strict();let _=a.z.object({models:o.z.array(l.z.string())}),S=a.z.object({reachable:s.z.boolean(),modelCount:c.z.number().int().nonnegative().nullable(),latencyMs:c.z.number().int().nonnegative(),message:l.z.string()});a.z.object({model:m}).strict();let z=a.z.object({provider:d.U.optional(),connectionId:n.D.nullable().optional(),model:m.nullable().optional(),accessLevel:d.C.optional(),networkAccess:s.z.boolean().optional()}).strict().refine(e=>Object.keys(e).length>0,{message:"Cần ít nhất một trường để cập nhật"});e.s(["y",0,z,"p",0,S,"j",0,j,"d",0,y,"P",0,p,"q",0,b,"m",0,_,"X",0,m,"M",0,N,"A",0,v,"r",0,C],48646);var $=e.i(6706),T=e.i(29628);async function I(e){let n=await e;return(0,T.y)(),n}let P=encodeURIComponent;function w(e){return null===e?[]:[e,...e.children.flatMap(w)]}e.s(["_",0,e=>(0,$.s)("POST",`/api/engine-test-runs/${P(e)}/cancellation`),"w",0,(e,t)=>I((0,$.Q)("PATCH",`/api/agents/${P(e)}/configuration`,t,n.E)),"C",0,e=>(0,$.Q)("POST",`/api/provider-connections/${P(e)}/checks`,void 0,S),"p",0,e=>I((0,$.Q)("POST","/api/provider-connections",e,v)),"v",0,e=>I((0,$.s)("DELETE",`/api/provider-connections/${P(e)}`)),"q",0,e=>(0,$.Q)("POST","/api/provider-connections/model-discovery",e,_),"r",0,()=>(0,$.w)("/api/local-engines",b),"l",0,()=>(0,$.w)("/api/provider-connections",N),"o",0,(e,n)=>(0,$.Q)("POST",`/api/provider-connections/${P(e)}/test-runs`,{model:n},y),"Q",0,e=>(0,$.Q)("POST",`/api/local-engines/${e}/test-runs`,void 0,y),"X",0,(e,n)=>I((0,$.Q)("PATCH",`/api/local-engines/${e}/settings`,n,p)),"s",0,(e,n)=>I((0,$.Q)("PATCH",`/api/provider-connections/${P(e)}`,n,v))],45137),e.s(["b",0,function(e,n){let t=w(e).find(e=>e.positionId===n);return new Set((t?.children??[]).flatMap(w).map(e=>e.positionId))},"k",0,function(e){let n={};for(let t of e.issues){let e=String(t.path[0]??"form");n[e]??=t.message}return n},"l",0,w],58236)},77562,e=>{"use strict";var n=e.i(22219);e.s(["z",0,n])}]);
|
/package/dist/web/_next/static/{ijXCyL0v-NhTojj_uhUdh → 2rXlIrJv2_Lt22uNfj2V-}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/web/_next/static/{ijXCyL0v-NhTojj_uhUdh → 2rXlIrJv2_Lt22uNfj2V-}/_ssgManifest.js
RENAMED
|
File without changes
|