@seqyuan/ennote 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -13
- package/bin/ennote.js +417 -2
- package/out/404.html +1 -1
- package/out/__next.__PAGE__.txt +4 -4
- package/out/__next._full.txt +16 -16
- package/out/__next._head.txt +4 -4
- package/out/__next._index.txt +8 -8
- package/out/__next._tree.txt +4 -4
- package/out/_next/static/chunks/01j7xr5p-4q8-.js +8 -0
- package/out/_next/static/chunks/0_yt3a8a9j1yd.js +1 -0
- package/out/_next/static/chunks/{10l572mh6n3-9.css → 0bxrnkjb.apni.css} +3 -2
- package/out/_next/static/chunks/{0j5eflqzx5_i2.css → 0k-~g5-_lbznv.css} +1 -1
- package/out/_next/static/chunks/0l9r.o-l3s.5h.js +1 -0
- package/out/_next/static/chunks/0r3uxu723bo0o.css +4 -0
- package/out/_not-found/__next._full.txt +14 -14
- package/out/_not-found/__next._head.txt +4 -4
- package/out/_not-found/__next._index.txt +8 -8
- package/out/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/out/_not-found/__next._not-found.txt +3 -3
- package/out/_not-found/__next._tree.txt +3 -3
- package/out/_not-found.html +1 -1
- package/out/_not-found.txt +14 -14
- package/out/graphs/__next._full.txt +16 -16
- package/out/graphs/__next._head.txt +4 -4
- package/out/graphs/__next._index.txt +8 -8
- package/out/graphs/__next._tree.txt +4 -4
- package/out/graphs/__next.graphs.__PAGE__.txt +4 -4
- package/out/graphs/__next.graphs.txt +3 -3
- package/out/graphs.html +1 -1
- package/out/graphs.txt +16 -16
- package/out/index.html +2 -2
- package/out/index.txt +16 -16
- package/out/roles/__next._full.txt +16 -16
- package/out/roles/__next._head.txt +4 -4
- package/out/roles/__next._index.txt +8 -8
- package/out/roles/__next._tree.txt +4 -4
- package/out/roles/__next.roles.__PAGE__.txt +4 -4
- package/out/roles/__next.roles.txt +3 -3
- package/out/roles.html +1 -1
- package/out/roles.txt +16 -16
- package/package.json +14 -3
- package/skills/bio-workspace/SKILL.md +11 -0
- package/skills/bio-workspace/skill.json +7 -0
- package/skills/skill-creator/SKILL.md +87 -0
- package/skills/skill-creator/skill.json +7 -0
- package/out/_next/static/chunks/0ix0n-428htqq.js +0 -1
- package/out/_next/static/chunks/0z-plgq8f5mn..css +0 -4
- package/out/_next/static/chunks/149rrpod0rni6.js +0 -8
- /package/out/_next/static/{IO1CimuE81yW8NkO4976t → I9_aKPkRc3su-s0AsXKQM}/_buildManifest.js +0 -0
- /package/out/_next/static/{IO1CimuE81yW8NkO4976t → I9_aKPkRc3su-s0AsXKQM}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{IO1CimuE81yW8NkO4976t → I9_aKPkRc3su-s0AsXKQM}/_ssgManifest.js +0 -0
package/out/roles.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0z-plgq8f5mn..css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/0j5eflqzx5_i2.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/10l572mh6n3-9.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0j-yjan8jn-8-.js"/><script src="/_next/static/chunks/0398hkm93nbvg.js" async=""></script><script src="/_next/static/chunks/0-j.wjqnc6zff.js" async=""></script><script src="/_next/static/chunks/turbopack-0~_.ya0bk7q2w.js" async=""></script><script src="/_next/static/chunks/0ix0n-428htqq.js" async=""></script><script src="/_next/static/chunks/0e~k9df0bajhc.js" async=""></script><script src="/_next/static/chunks/0twsdyb7~zp7n.js" async=""></script><script src="/_next/static/chunks/149rrpod0rni6.js" async=""></script><title>Ennote</title><meta name="description" content="AI-native bioinformatics agent workspace"/><link rel="icon" href="/icon.png?icon.0l6z533ta5iiy.png" sizes="64x64" type="image/png"/><script id="theme-init">(function(){try{var t=localStorage.getItem("ennote-theme");var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme:dark)").matches);document.documentElement.classList.toggle("dark",d);document.documentElement.dataset.theme=d?"dark":"light"}catch(e){}})();</script><script id="locale-init">(function(){try{var l=localStorage.getItem("ennote-locale");document.documentElement.lang=(l==="zh-CN")?"zh-CN":"en"}catch(e){}})();</script><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body style="height:100dvh;display:flex;flex-direction:column"><div hidden=""><!--$--><!--/$--></div><div class="app-shell" data-testid="ennote-shell"><div class="sidebar-overlay-backdrop" data-open="true"></div><div class="sidebar-container sidebar-open" id="workspace-navigation" style="width:280px;min-width:280px;transition:none"><aside class="sidebar quiet-bars" aria-label="Projects and sessions"><div class="sidebar-logo-row"><div class="sidebar-brand"><span class="sidebar-brand-identity"><span class="brand-mark"><svg width="20" height="20" viewBox="0 0 32 32" fill="none" aria-hidden="true" focusable="false"><rect x="1" y="1" width="30" height="30" rx="9" fill="currentColor" opacity="0.10"></rect><path d="M11 9.5h10.5M11 16h8M11 22.5h10.5M11 9.5v13" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><span class="sidebar-brand-name">Ennote</span></span></div><button type="button" class="sidebar-collapse-toggle" title="Collapse sidebar" aria-label="Collapse navigation" aria-expanded="true" aria-controls="workspace-navigation"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button><button type="button" class="sidebar-close-nav navigation-close" aria-label="Close navigation"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button></div><button type="button" class="sidebar-new-session" disabled="" aria-label="New chat" title="Select a project first"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-message-square-plus" aria-hidden="true"><path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"></path><path d="M12 8v6"></path><path d="M9 11h6"></path></svg><span>New Chat</span></button><nav class="sidebar-nav" aria-label="Workspace"><button type="button" class="sidebar-nav-item active" aria-current="page"><span class="nav-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg></span><span>Roles</span></button><button type="button" class="sidebar-nav-item "><span class="nav-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-workflow" aria-hidden="true"><rect width="8" height="8" x="3" y="3" rx="2"></rect><path d="M7 11v4a2 2 0 0 0 2 2h4"></path><rect width="8" height="8" x="13" y="13" rx="2"></rect></svg></span><span>Graphs</span></button></nav><div class="sidebar-workspace-head"><span class="workspace-label">Workspaces</span><div class="workspace-search-slot"><div class="workspace-search"><button type="button" class="workspace-action-button workspace-search-button" aria-label="Search sessions" aria-expanded="false" title="Search sessions"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg></button><input type="text" tabindex="-1" placeholder="Search sessions" aria-label="Search sessions" value=""/></div></div><div class="workspace-head-actions"><button type="button" class="workspace-action-button" aria-label="Add workspace" title="Add workspace"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-plus" aria-hidden="true"><path d="M12 10v6"></path><path d="M9 13h6"></path><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg></button></div></div><div class="sidebar-project-selector ProjectSelector-module__RVW5Pa__root"><button type="button" class="ProjectSelector-module__RVW5Pa__trigger" title="Select project" aria-haspopup="menu" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder ProjectSelector-module__RVW5Pa__folder" aria-hidden="true"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg><span class="ProjectSelector-module__RVW5Pa__label">Select project…</span><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ProjectSelector-module__RVW5Pa__chevron" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><div class="sidebar-empty-project"><div>Choose a project to start.</div></div><span class="sr-only" role="status" aria-live="polite"></span><div class="sidebar-settings"><button type="button" class="sidebar-settings-trigger" aria-haspopup="dialog" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings2 lucide-settings-2" aria-hidden="true"><path d="M14 17H5"></path><path d="M19 7h-9"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg><span>Settings</span></button></div></aside></div><div role="separator" aria-label="Resize sidebar" aria-orientation="vertical" aria-valuemin="264" aria-valuemax="420" aria-valuenow="280" tabindex="0" class="resize-handle" data-side="right" style="align-self:stretch;cursor:col-resize;display:flex;flex-shrink:0;justify-content:center;margin-left:-5px;margin-right:-5px;position:relative;touch-action:none;width:10px;z-index:var(--layer-drag-overlay)"><div class="resize-handle-line"></div></div><div class="workspace-content"><div class="settings-view" data-testid="roles-page"><button type="button" class="workspace-mobile-menu" aria-label="Open navigation"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><header class="workspace-page-header"><div><h1>Roles</h1><p>Global reusable execution presets for Chat and Graph Tasks.</p></div><button type="button" class="settings-view-back"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left" aria-hidden="true"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg> Chat</button></header><div class="workspace-page-body"><div class="global-roles "><aside class="global-roles-list"><header><div><strong>Role catalog</strong><span>0<!-- --> global Roles</span></div><button type="button" aria-label="Add Role"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></button></header><label class="global-role-search"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg><input placeholder="Search Roles" value=""/></label><div role="listbox" aria-label="Global Roles"><div class="roles-empty">No global Roles</div></div></aside><section class="global-role-detail"><div class="roles-detail-empty"><svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg> Select or create a Role</div></section></div></div></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0j-yjan8jn-8-.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[26356,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"WorkerGenerationGuard\"]\n3:I[27437,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"LocaleProvider\"]\n4:I[85026,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"WorkspaceProvider\"]\n5:I[39756,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"default\"]\n7:I[59665,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0twsdyb7~zp7n.js\",\"/_next/static/chunks/149rrpod0rni6.js\"],\"AppShell\"]\n8:I[97367,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nc:I[97367,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"ViewportBoundary\"]\ne:I[97367,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"MetadataBoundary\"]\n10:I[68027,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0z-plgq8f5mn..css\",\"style\"]\n:HL[\"/_next/static/chunks/0j5eflqzx5_i2.css\",\"style\"]\n:HL[\"/_next/static/chunks/10l572mh6n3-9.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"roles\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"roles\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0z-plgq8f5mn..css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0j5eflqzx5_i2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ix0n-428htqq.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0e~k9df0bajhc.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"id\":\"theme-init\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"ennote-theme\\\");var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme:dark)\\\").matches);document.documentElement.classList.toggle(\\\"dark\\\",d);document.documentElement.dataset.theme=d?\\\"dark\\\":\\\"light\\\"}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"id\":\"locale-init\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var l=localStorage.getItem(\\\"ennote-locale\\\");document.documentElement.lang=(l===\\\"zh-CN\\\")?\\\"zh-CN\\\":\\\"en\\\"}catch(e){}})();\"}}]]}],[\"$\",\"body\",null,{\"style\":{\"height\":\"100dvh\",\"display\":\"flex\",\"flexDirection\":\"column\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"initialView\":\"roles\"}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/10l572mh6n3-9.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0twsdyb7~zp7n.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/149rrpod0rni6.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,null]},null,false,\"$@b\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0z-plgq8f5mn..css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0j5eflqzx5_i2.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"IO1CimuE81yW8NkO4976t\"}\n"])</script><script>self.__next_f.push([1,"11:[]\nb:\"$W11\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:I[27201,[\"/_next/static/chunks/0ix0n-428htqq.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\"],\"IconMark\"]\na:null\nf:[[\"$\",\"title\",\"0\",{\"children\":\"Ennote\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"AI-native bioinformatics agent workspace\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png?icon.0l6z533ta5iiy.png\",\"sizes\":\"64x64\",\"type\":\"image/png\"}],[\"$\",\"$L12\",\"3\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/0r3uxu723bo0o.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/0k-~g5-_lbznv.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/0bxrnkjb.apni.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/0j-yjan8jn-8-.js"/><script src="/_next/static/chunks/0398hkm93nbvg.js" async=""></script><script src="/_next/static/chunks/0-j.wjqnc6zff.js" async=""></script><script src="/_next/static/chunks/turbopack-0~_.ya0bk7q2w.js" async=""></script><script src="/_next/static/chunks/0_yt3a8a9j1yd.js" async=""></script><script src="/_next/static/chunks/0e~k9df0bajhc.js" async=""></script><script src="/_next/static/chunks/0l9r.o-l3s.5h.js" async=""></script><script src="/_next/static/chunks/0twsdyb7~zp7n.js" async=""></script><script src="/_next/static/chunks/01j7xr5p-4q8-.js" async=""></script><title>Ennote</title><meta name="description" content="Auditable local agent runtime built around Agent Flow"/><link rel="icon" href="/icon.png?icon.0l6z533ta5iiy.png" sizes="64x64" type="image/png"/><script id="theme-init">(function(){try{var t=localStorage.getItem("ennote-theme");var d=t==="dark"||(t!=="light"&&matchMedia("(prefers-color-scheme:dark)").matches);document.documentElement.classList.toggle("dark",d);document.documentElement.dataset.theme=d?"dark":"light"}catch(e){}})();</script><script id="locale-init">(function(){try{var l=localStorage.getItem("ennote-locale");document.documentElement.lang=(l==="zh-CN")?"zh-CN":"en"}catch(e){}})();</script><script src="/_next/static/chunks/03~yq9q893hmn.js" noModule=""></script></head><body style="height:100dvh;display:flex;flex-direction:column"><div hidden=""><!--$--><!--/$--></div><div class="app-shell" data-testid="ennote-shell"><div class="sidebar-overlay-backdrop" data-open="true"></div><div class="sidebar-container sidebar-open" id="workspace-navigation" style="width:280px;min-width:280px;transition:none"><aside class="sidebar quiet-bars" aria-label="Projects and sessions"><div class="sidebar-logo-row"><div class="sidebar-brand"><span class="sidebar-brand-identity"><span class="brand-mark"><svg width="20" height="20" viewBox="0 0 32 32" fill="none" aria-hidden="true" focusable="false"><rect x="1" y="1" width="30" height="30" rx="9" fill="currentColor" opacity="0.10"></rect><path d="M11 9.5h10.5M11 16h8M11 22.5h10.5M11 9.5v13" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"></path></svg></span><span class="sidebar-brand-name">Ennote</span></span></div><button type="button" class="sidebar-collapse-toggle" title="Collapse sidebar" aria-label="Collapse navigation" aria-expanded="true" aria-controls="workspace-navigation"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-panel-left" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"></rect><path d="M9 3v18"></path></svg></button><button type="button" class="sidebar-close-nav navigation-close" aria-label="Close navigation"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x" aria-hidden="true"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg></button></div><button type="button" class="sidebar-new-session" disabled="" aria-label="New chat" title="Select a project first"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-message-square-plus" aria-hidden="true"><path d="M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"></path><path d="M12 8v6"></path><path d="M9 11h6"></path></svg><span>New Chat</span></button><nav class="sidebar-nav" aria-label="Workspace"><button type="button" class="sidebar-nav-item active" aria-current="page"><span class="nav-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg></span><span>Roles</span></button><button type="button" class="sidebar-nav-item "><span class="nav-icon"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-workflow" aria-hidden="true"><rect width="8" height="8" x="3" y="3" rx="2"></rect><path d="M7 11v4a2 2 0 0 0 2 2h4"></path><rect width="8" height="8" x="13" y="13" rx="2"></rect></svg></span><span>Graphs</span></button></nav><div class="sidebar-workspace-head"><span class="workspace-label">Workspaces</span><div class="workspace-search-slot"><div class="workspace-search"><button type="button" class="workspace-action-button workspace-search-button" aria-label="Search sessions" aria-expanded="false" title="Search sessions"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg></button><input type="text" tabindex="-1" placeholder="Search sessions" aria-label="Search sessions" value=""/></div></div><div class="workspace-head-actions"><button type="button" class="workspace-action-button" aria-label="Add workspace" title="Add workspace"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder-plus" aria-hidden="true"><path d="M12 10v6"></path><path d="M9 13h6"></path><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg></button></div></div><div class="sidebar-project-selector ProjectSelector-module__RVW5Pa__root"><button type="button" class="ProjectSelector-module__RVW5Pa__trigger" title="Select project" aria-haspopup="menu" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-folder ProjectSelector-module__RVW5Pa__folder" aria-hidden="true"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"></path></svg><span class="ProjectSelector-module__RVW5Pa__label">Select project…</span><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-chevron-down ProjectSelector-module__RVW5Pa__chevron" aria-hidden="true"><path d="m6 9 6 6 6-6"></path></svg></button></div><div class="sidebar-empty-project"><div>Choose a project to start.</div></div><span class="sr-only" role="status" aria-live="polite"></span><div class="sidebar-settings"><button type="button" class="sidebar-settings-trigger" aria-haspopup="dialog" aria-expanded="false"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-settings2 lucide-settings-2" aria-hidden="true"><path d="M14 17H5"></path><path d="M19 7h-9"></path><circle cx="17" cy="17" r="3"></circle><circle cx="7" cy="7" r="3"></circle></svg><span>Settings</span></button></div></aside></div><div role="separator" aria-label="Resize sidebar" aria-orientation="vertical" aria-valuemin="264" aria-valuemax="420" aria-valuenow="280" tabindex="0" class="resize-handle" data-side="right" style="align-self:stretch;cursor:col-resize;display:flex;flex-shrink:0;justify-content:center;margin-left:-5px;margin-right:-5px;position:relative;touch-action:none;width:10px;z-index:var(--layer-drag-overlay)"><div class="resize-handle-line"></div></div><div class="workspace-content"><div class="settings-view" data-testid="roles-page"><button type="button" class="workspace-mobile-menu" aria-label="Open navigation"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-menu" aria-hidden="true"><path d="M4 5h16"></path><path d="M4 12h16"></path><path d="M4 19h16"></path></svg></button><header class="workspace-page-header"><div><h1>Roles</h1><p>Global reusable execution presets for Chat and Graph Tasks.</p></div><button type="button" class="settings-view-back"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-arrow-left" aria-hidden="true"><path d="m12 19-7-7 7-7"></path><path d="M19 12H5"></path></svg> Chat</button></header><div class="workspace-page-body"><div class="global-roles "><aside class="global-roles-list"><header><div><strong>Role catalog</strong><span>0<!-- --> global Roles</span></div><button type="button" aria-label="Add Role"><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-plus" aria-hidden="true"><path d="M5 12h14"></path><path d="M12 5v14"></path></svg></button></header><label class="global-role-search"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-search" aria-hidden="true"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg><input placeholder="Search Roles" value=""/></label><div role="listbox" aria-label="Global Roles"><div class="roles-empty">No global Roles</div></div></aside><section class="global-role-detail"><div class="roles-detail-empty"><svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-bot" aria-hidden="true"><path d="M12 8V4H8"></path><rect width="16" height="12" x="4" y="8" rx="2"></rect><path d="M2 14h2"></path><path d="M20 14h2"></path><path d="M15 13v2"></path><path d="M9 13v2"></path></svg> Select or create a Role</div></section></div></div></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/0j-yjan8jn-8-.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[26356,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"WorkerGenerationGuard\"]\n3:I[27437,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"LocaleProvider\"]\n4:I[85026,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"WorkspaceProvider\"]\n5:I[39756,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"default\"]\n6:I[37457,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"default\"]\n7:I[59665,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\",\"/_next/static/chunks/0twsdyb7~zp7n.js\",\"/_next/static/chunks/01j7xr5p-4q8-.js\"],\"AppShell\"]\n8:I[97367,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"OutletBoundary\"]\n9:\"$Sreact.suspense\"\nc:I[97367,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"ViewportBoundary\"]\ne:I[97367,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"MetadataBoundary\"]\n10:I[68027,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0r3uxu723bo0o.css\",\"style\"]\n:HL[\"/_next/static/chunks/0k-~g5-_lbznv.css\",\"style\"]\n:HL[\"/_next/static/chunks/0bxrnkjb.apni.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"roles\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"roles\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0r3uxu723bo0o.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0k-~g5-_lbznv.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0e~k9df0bajhc.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0l9r.o-l3s.5h.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"id\":\"theme-init\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem(\\\"ennote-theme\\\");var d=t===\\\"dark\\\"||(t!==\\\"light\\\"\u0026\u0026matchMedia(\\\"(prefers-color-scheme:dark)\\\").matches);document.documentElement.classList.toggle(\\\"dark\\\",d);document.documentElement.dataset.theme=d?\\\"dark\\\":\\\"light\\\"}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"id\":\"locale-init\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var l=localStorage.getItem(\\\"ennote-locale\\\");document.documentElement.lang=(l===\\\"zh-CN\\\")?\\\"zh-CN\\\":\\\"en\\\"}catch(e){}})();\"}}]]}],[\"$\",\"body\",null,{\"style\":{\"height\":\"100dvh\",\"display\":\"flex\",\"flexDirection\":\"column\"},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L7\",null,{\"initialView\":\"roles\"}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0bxrnkjb.apni.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0twsdyb7~zp7n.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/01j7xr5p-4q8-.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@a\"}]}]]}],{},null,false,null]},null,false,\"$@b\"]},null,false,null],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$9\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0r3uxu723bo0o.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0k-~g5-_lbznv.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"I9_aKPkRc3su-s0AsXKQM\"}\n"])</script><script>self.__next_f.push([1,"11:[]\nb:\"$W11\"\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"12:I[27201,[\"/_next/static/chunks/0_yt3a8a9j1yd.js\",\"/_next/static/chunks/0e~k9df0bajhc.js\",\"/_next/static/chunks/0l9r.o-l3s.5h.js\"],\"IconMark\"]\na:null\nf:[[\"$\",\"title\",\"0\",{\"children\":\"Ennote\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Auditable local agent runtime built around Agent Flow\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/icon.png?icon.0l6z533ta5iiy.png\",\"sizes\":\"64x64\",\"type\":\"image/png\"}],[\"$\",\"$L12\",\"3\",{}]]\n"])</script></body></html>
|
package/out/roles.txt
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
|
-
2:I[26356,["/_next/static/chunks/
|
|
3
|
-
3:I[27437,["/_next/static/chunks/
|
|
4
|
-
4:I[85026,["/_next/static/chunks/
|
|
5
|
-
5:I[39756,["/_next/static/chunks/
|
|
6
|
-
6:I[37457,["/_next/static/chunks/
|
|
7
|
-
7:I[59665,["/_next/static/chunks/
|
|
8
|
-
8:I[97367,["/_next/static/chunks/
|
|
2
|
+
2:I[26356,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"WorkerGenerationGuard"]
|
|
3
|
+
3:I[27437,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"LocaleProvider"]
|
|
4
|
+
4:I[85026,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"WorkspaceProvider"]
|
|
5
|
+
5:I[39756,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"default"]
|
|
6
|
+
6:I[37457,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"default"]
|
|
7
|
+
7:I[59665,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js","/_next/static/chunks/0twsdyb7~zp7n.js","/_next/static/chunks/01j7xr5p-4q8-.js"],"AppShell"]
|
|
8
|
+
8:I[97367,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"OutletBoundary"]
|
|
9
9
|
9:"$Sreact.suspense"
|
|
10
|
-
c:I[97367,["/_next/static/chunks/
|
|
11
|
-
e:I[97367,["/_next/static/chunks/
|
|
12
|
-
10:I[68027,["/_next/static/chunks/
|
|
13
|
-
:HL["/_next/static/chunks/
|
|
14
|
-
:HL["/_next/static/chunks/
|
|
15
|
-
:HL["/_next/static/chunks/
|
|
16
|
-
0:{"P":null,"c":["","roles"],"q":"","i":false,"f":[[["",{"children":["roles",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/
|
|
10
|
+
c:I[97367,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"ViewportBoundary"]
|
|
11
|
+
e:I[97367,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"MetadataBoundary"]
|
|
12
|
+
10:I[68027,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"default",1]
|
|
13
|
+
:HL["/_next/static/chunks/0r3uxu723bo0o.css","style"]
|
|
14
|
+
:HL["/_next/static/chunks/0k-~g5-_lbznv.css","style"]
|
|
15
|
+
:HL["/_next/static/chunks/0bxrnkjb.apni.css","style"]
|
|
16
|
+
0:{"P":null,"c":["","roles"],"q":"","i":false,"f":[[["",{"children":["roles",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",16],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0r3uxu723bo0o.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-~g5-_lbznv.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0_yt3a8a9j1yd.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/0e~k9df0bajhc.js","async":true,"nonce":"$undefined"}],["$","script","script-2",{"src":"/_next/static/chunks/0l9r.o-l3s.5h.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{"children":[["$","script",null,{"id":"theme-init","dangerouslySetInnerHTML":{"__html":"(function(){try{var t=localStorage.getItem(\"ennote-theme\");var d=t===\"dark\"||(t!==\"light\"&&matchMedia(\"(prefers-color-scheme:dark)\").matches);document.documentElement.classList.toggle(\"dark\",d);document.documentElement.dataset.theme=d?\"dark\":\"light\"}catch(e){}})();"}}],["$","script",null,{"id":"locale-init","dangerouslySetInnerHTML":{"__html":"(function(){try{var l=localStorage.getItem(\"ennote-locale\");document.documentElement.lang=(l===\"zh-CN\")?\"zh-CN\":\"en\"}catch(e){}})();"}}]]}],["$","body",null,{"style":{"height":"100dvh","display":"flex","flexDirection":"column"},"children":["$","$L2",null,{"children":["$","$L3",null,{"children":["$","$L4",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]}]]}]]}],{"children":[["$","$1","c",{"children":[null,["$","$L5",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L6",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":[["$","$1","c",{"children":[["$","$L7",null,{"initialView":"roles"}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0bxrnkjb.apni.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/0twsdyb7~zp7n.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/01j7xr5p-4q8-.js","async":true,"nonce":"$undefined"}]],["$","$L8",null,{"children":["$","$9",null,{"name":"Next.MetadataOutlet","children":"$@a"}]}]]}],{},null,false,null]},null,false,"$@b"]},null,false,null],["$","$1","h",{"children":[null,["$","$Lc",null,{"children":"$Ld"}],["$","div",null,{"hidden":true,"children":["$","$Le",null,{"children":["$","$9",null,{"name":"Next.Metadata","children":"$Lf"}]}]}],null]}],false]],"m":"$undefined","G":["$10",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/0r3uxu723bo0o.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/chunks/0k-~g5-_lbznv.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]]],"S":true,"h":null,"s":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"I9_aKPkRc3su-s0AsXKQM"}
|
|
17
17
|
11:[]
|
|
18
18
|
b:"$W11"
|
|
19
19
|
d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
20
|
-
12:I[27201,["/_next/static/chunks/
|
|
20
|
+
12:I[27201,["/_next/static/chunks/0_yt3a8a9j1yd.js","/_next/static/chunks/0e~k9df0bajhc.js","/_next/static/chunks/0l9r.o-l3s.5h.js"],"IconMark"]
|
|
21
21
|
a:null
|
|
22
|
-
f:[["$","title","0",{"children":"Ennote"}],["$","meta","1",{"name":"description","content":"
|
|
22
|
+
f:[["$","title","0",{"children":"Ennote"}],["$","meta","1",{"name":"description","content":"Auditable local agent runtime built around Agent Flow"}],["$","link","2",{"rel":"icon","href":"/icon.png?icon.0l6z533ta5iiy.png","sizes":"64x64","type":"image/png"}],["$","$L12","3",{}]]
|
package/package.json
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seqyuan/ennote",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Auditable local agent runtime built around Agent Flow",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent",
|
|
7
|
+
"agent-flow",
|
|
8
|
+
"orchestration",
|
|
9
|
+
"local-first",
|
|
10
|
+
"audit",
|
|
11
|
+
"approvals",
|
|
12
|
+
"sqlite"
|
|
13
|
+
],
|
|
5
14
|
"license": "MIT",
|
|
6
15
|
"bin": {
|
|
7
16
|
"ennote": "bin/ennote.js"
|
|
8
17
|
},
|
|
9
18
|
"files": [
|
|
10
19
|
"bin",
|
|
11
|
-
"out"
|
|
20
|
+
"out",
|
|
21
|
+
"skills"
|
|
12
22
|
],
|
|
13
23
|
"scripts": {
|
|
14
24
|
"dev": "make dev",
|
|
@@ -46,6 +56,7 @@
|
|
|
46
56
|
"@types/react-dom": "^19.2.3",
|
|
47
57
|
"eslint": "^9.39.5",
|
|
48
58
|
"eslint-config-next": "^16.2.1",
|
|
59
|
+
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
49
60
|
"openapi-typescript": "^7.10.1",
|
|
50
61
|
"postcss": "^8.5.25",
|
|
51
62
|
"shiki": "^4.3.1",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Bio Workspace Skill
|
|
2
|
+
|
|
3
|
+
You are a bioinformatics assistant working in a workspace with omics data.
|
|
4
|
+
|
|
5
|
+
## Guidelines
|
|
6
|
+
|
|
7
|
+
1. Use `read` to inspect files before processing.
|
|
8
|
+
2. Use `bash` for running bioinformatics tools (e.g., cellranger, scanpy, seurat).
|
|
9
|
+
3. Explain results in plain language the user can understand.
|
|
10
|
+
4. Always reference file paths as `/workspace/...`.
|
|
11
|
+
5. When errors occur, explain them and suggest alternatives.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Skill Creator
|
|
2
|
+
|
|
3
|
+
Turn a workflow the user already understands into a reusable Ennote Skill.
|
|
4
|
+
|
|
5
|
+
Use this skill when the user says things like "make this a skill", "create a
|
|
6
|
+
skill for X", "save this workflow", or "teach the agent to do X next time".
|
|
7
|
+
Do not use it for one-off tasks that should just be completed in the current
|
|
8
|
+
conversation.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
1. **Capture intent.** Establish:
|
|
13
|
+
- what the Skill should enable the agent to do;
|
|
14
|
+
- the user phrases or situations that should trigger it;
|
|
15
|
+
- the expected inputs and output format;
|
|
16
|
+
- any tools, files, or external services it needs.
|
|
17
|
+
Ask only for information that changes the Skill. If the conversation already
|
|
18
|
+
contains the workflow, extract it from there and confirm the gaps.
|
|
19
|
+
|
|
20
|
+
2. **Draft the Skill body.** Write concise operating instructions for a future
|
|
21
|
+
agent, not a narrative about this conversation:
|
|
22
|
+
- start with the goal and the trigger conditions;
|
|
23
|
+
- give the smallest reliable procedure, including checks and failure handling;
|
|
24
|
+
- state hard constraints (no secrets, no writes outside the workspace, no
|
|
25
|
+
unapproved external calls);
|
|
26
|
+
- include one concrete example when the format is non-obvious.
|
|
27
|
+
The first line should tell the agent what to do, not why the Skill exists.
|
|
28
|
+
|
|
29
|
+
3. **Write the description for triggering.** The `description` field is the
|
|
30
|
+
primary discovery signal. Include both what the Skill does and when to use
|
|
31
|
+
it, with the user's likely phrases. Be specific; avoid generic words such as
|
|
32
|
+
"helps with tasks".
|
|
33
|
+
|
|
34
|
+
4. **Create it with the `create_skill` tool.** Do not write into `~/.ennote`
|
|
35
|
+
with `bash`; that path is not writable in sandboxed Runs and bypasses
|
|
36
|
+
validation. Call `create_skill` with:
|
|
37
|
+
- `id`: lowercase slug, e.g. `pdf-report` (letters, digits, `-`, `_`);
|
|
38
|
+
- `name`: optional display name;
|
|
39
|
+
- `description`: the trigger-oriented description;
|
|
40
|
+
- `prompt`: the SKILL.md body;
|
|
41
|
+
- `allowedTools`: optional list of tools the Skill needs.
|
|
42
|
+
|
|
43
|
+
5. **Verify.** The tool returns the Skill ID and host path. Confirm to the user
|
|
44
|
+
that the Skill is available immediately to Roles and Flows, and suggest how
|
|
45
|
+
to bind it in a Role or a Flow. Do not claim it was tested unless you
|
|
46
|
+
actually ran it.
|
|
47
|
+
|
|
48
|
+
If the current Role has an explicit tool allowlist that does not include
|
|
49
|
+
`create_skill`, stop and ask the user to add `create_skill` to that Role. Do not
|
|
50
|
+
fall back to `bash` file writes: they do not work in sandboxed Runs and bypass
|
|
51
|
+
Skill validation.
|
|
52
|
+
|
|
53
|
+
## Writing rules
|
|
54
|
+
|
|
55
|
+
- Prefer short, imperative instructions over long explanations.
|
|
56
|
+
- Put "when to use this" in the description, not buried in the body.
|
|
57
|
+
- Keep the Skill self-contained: no references to this conversation.
|
|
58
|
+
- Never include API keys, tokens, passwords, or private user data.
|
|
59
|
+
- Do not grant tools the Skill does not need.
|
|
60
|
+
- If the user wants to change an existing Skill, explain that this version
|
|
61
|
+
creates new Skills; ask them to edit the existing files in Settings first
|
|
62
|
+
(editing is not yet exposed through `create_skill`).
|
|
63
|
+
|
|
64
|
+
## Example
|
|
65
|
+
|
|
66
|
+
User: "Every time I get a CSV, I want a short data-quality report."
|
|
67
|
+
|
|
68
|
+
Description: "Produce a concise data-quality report for a CSV. Use whenever the
|
|
69
|
+
user asks to inspect, validate, or summarize a CSV before analysis."
|
|
70
|
+
|
|
71
|
+
Body:
|
|
72
|
+
|
|
73
|
+
```markdown
|
|
74
|
+
# CSV Data Quality Report
|
|
75
|
+
|
|
76
|
+
Read the CSV header and a bounded sample first. Report:
|
|
77
|
+
1. row and column counts;
|
|
78
|
+
2. missing values per column;
|
|
79
|
+
3. duplicate rows;
|
|
80
|
+
4. type/range anomalies worth flagging;
|
|
81
|
+
5. the three most important next checks.
|
|
82
|
+
|
|
83
|
+
Do not modify the input file. Keep the report under 300 words.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Then call `create_skill` with id `csv-data-quality`, the description above, and
|
|
87
|
+
the body as the prompt.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,27437,18929,426,e=>{"use strict";var t=e.i(18050),o=e.i(71645);let s="ennote-locale";function n(){try{let e=window.localStorage.getItem(s);if("en"===e||"zh-CN"===e)return e}catch{}return"en"}function r(e){try{window.localStorage.setItem(s,e)}catch{}}function i(e){"u">typeof document&&(document.documentElement.lang=e)}e.s(["LOCALES",0,["en","zh-CN"],"applyLocaleAttribute",0,i,"readLocale",0,n,"writeLocale",0,r],18929);let a={en:{"general.title":"General","general.desc":"Appearance and workspace-level preferences.","general.appearance":"Appearance","general.permission":"Default permission","general.permission.desc":"Permission preset applied to newly created sessions.","general.language":"Language","language.en":"English","language.zh":"中文","sidebar.aria":"Projects and sessions","sidebar.newChat":"New Chat","sidebar.newChatAria":"New chat","sidebar.selectProjectFirst":"Select a project first","sidebar.roles":"Roles","sidebar.graphs":"Graphs","sidebar.searchSessions":"Search sessions","sidebar.search":"Search","sidebar.clearSearch":"Clear search","sidebar.sessions":"Sessions","sidebar.workspaces":"Workspaces","sidebar.refresh":"Refresh sessions","sidebar.loadingSessions":"Loading sessions…","sidebar.chooseProject":"Choose a project to start.","sidebar.newProject":"New Project","sidebar.settings":"Settings","sidebar.collapse":"Collapse sidebar","sidebar.expand":"Expand sidebar","sidebar.openNav":"Open navigation","sidebar.collapseNav":"Collapse navigation","sidebar.closeNav":"Close navigation","sidebar.selectProject":"Select project","sidebar.selectProjectEllipsis":"Select project…","sidebar.unknown":"Unknown","sidebar.noProjects":"No projects yet","sidebar.addProject":"Add project…","sidebar.addWorkspace":"Add workspace","sidebar.pin":"Pin project","sidebar.unpin":"Unpin project","sidebar.loading":"Loading…","sidebar.noSessions":"No sessions yet.","sidebar.noSessionsMatch":"No sessions match","sidebar.showArchived":"Show archived sessions","sidebar.hideArchived":"Hide archived sessions","sidebar.noArchived":"No archived sessions.","sidebar.chat":"chat","sidebar.chats":"chats","sidebar.rename":"Rename","sidebar.deleteProject":"Delete project","sidebar.renameProject":"Rename project","sidebar.renameSession":"Rename session","sidebar.newSession":"New session","sidebar.deleteProjectTitle":"Delete {name}?","sidebar.deleteProjectBody":"The project is removed from the sidebar. Its workspace folder and session data stay on disk.","sidebar.deleteProjectConfirm":"Delete","sidebar.cancel":"Cancel","sidebar.save":"Save","sidebar.archive":"Archive session","sidebar.restore":"Restore session","time.now":"now","time.minutes":"min","time.hours":"h","time.days":"d","time.months":"mo","time.years":"y","composer.dropFiles":"Drop images or text files","composer.hint.enter":"Enter to send","composer.hint.newline":"Shift+Enter for a newline","composer.hint.resize":"Drag the top edge to resize","composer.hint.resizeAria":"Resize message input","composer.attachedFiles":"Attached files","composer.removeImage":"Remove image","composer.remove":"Remove","composer.configureRun":"Configure run","composer.runConfiguration":"Run configuration","composer.target":"Target","composer.permission":"Permission","composer.attach":"Attach","composer.attachFiles":"Attach files","composer.attachImage":"Attach image","composer.compactContext":"Compact context","composer.placeholderCompacting":"Context compaction in progress","composer.placeholderSteer":"Steer the agent… (Enter)","composer.placeholderNoSession":"Choose a workspace to start","composer.placeholderHero":"Describe what you want to build… / commands, @ files or sessions","composer.placeholderDefault":"Type a message…","composer.messageAria":"Message the agent","composer.steerAria":"Steer the agent","composer.queueFollowUp":"Queue follow-up","composer.followUp":"Follow-up","composer.runContext":"Run configuration","composer.attachMenu":"Attachments and compaction","composer.queue.title":"Queued","composer.queue.aria":"Queued messages","composer.queue.count":"{count} queued","composer.queue.expand":"Expand queued messages","composer.queue.collapse":"Collapse queued messages","composer.queue.edit":"Edit queued message","composer.queue.steer":"Steer now","composer.queue.remove":"Remove queued message","composer.send":"Send","composer.stopRun":"Stop run","composer.modelSelect.triggerFallback":"Select model","composer.modelSelect.selectAria":"Select model","composer.modelSelect.aria":"Select model, current {model}","composer.modelSelect.ariaEffort":"Select model, current {model}, reasoning effort {effort}","composer.modelSelect.menu":"Model and reasoning effort","composer.modelSelect.model":"Model","composer.modelSelect.effort":"Effort","composer.modelSelect.emptyModels":"No models available.","composer.modelSelect.emptyEfforts":"This model provides no reasoning effort levels.","composer.permissionMode":"Permission mode","composer.roleTarget":"Role target","composer.frozenForRun":"is frozen for this run","composer.policyUnavailable":"Policy unavailable","composer.expanding":"Expanding prompt…","composer.queued":"Queued","composer.thinking.default":"Default","composer.thinking.low":"Low reasoning","composer.thinking.medium":"Medium reasoning","composer.thinking.high":"High reasoning","context.aria":"{percent} of context used","context.used":"of context used","context.system":"System prompt","context.tools":"Tools","context.messages":"Messages","checkpoint.promptVersion":"Summary contract","checkpoint.contract":"Digest","inspector.noRun":"Send a message to inspect the prompt the model receives.","inspector.loading":"Loading the frozen run prompt…","inspector.run":"Run","inspector.frozen":"Frozen before the first model request. Nothing here is re-derived from current settings.","inspector.unrecorded":"This run did not record its prompt composition, so there is nothing to show.","inspector.composition":"Prompt composition","inspector.sections":"{count} sections","inspector.prompt":"Frozen prompt text","inspector.sectionsDigest":"Sections","inspector.composedDigest":"Composed","inspector.baseDigest":"Base prompt","inspector.transcript":"Private run transcript","inspector.transcriptNote":"The model-visible messages this run generated, kept for intact resume. Run-private: it is never part of the conversation timeline.","inspector.transcriptEmpty":"This run generated no transcript rows.","inspector.transcriptPrivate":"private","inspector.transcriptThinking":"Reasoning","inspector.transcriptCall":"Call","inspector.transcriptResult":"Result","inspector.transcriptError":"Error","inspector.transcriptImage":"Image {width}×{height}","inspector.transcriptUnknown":"Unrecognized block: {type}","inspector.transcriptOlder":"Load older messages","inspector.mcp":"MCP servers","inspector.mcpNone":"No MCP server was frozen for this run.","inspector.mcpUnavailable":"unavailable","inspector.mcpRequired":"required","inspector.mcpTools":"{count} tools","inspector.mcpProtocol":"protocol","inspector.mcpInstructions":"Instructions from the server","inspector.skillCatalog":"Skill catalog","inspector.catalog.materialized":"materialized","inspector.catalog.disabled":"skipped, read denied by the frozen tool policy","stats.counts":"{turns} turns · {steps} steps","stats.llm":"LLM {duration}","stats.toolCall":"Tool call {duration}","stats.ttftAverage":"TTFT avg {duration}","stats.tokensPerSecond":"{throughput} tok/s","stats.cacheHit":"Cache hit {percent}%","stats.tokens":"Input {input} tok · Output {output} tok",copy:"Copy",copied:"Copied","message.branch":"Branch into a new conversation","message.branchUnavailable":"Available only on the last message of a completed turn","message.ranFor":"Ran for {duration}","message.ttft":"TTFT {seconds}s","message.tokensPerSecond":"{tps} tok/s","duration.seconds":"{seconds}s","duration.minutes":"{minutes}m{seconds}s","directory.title":"Select Workspace Directory","directory.home":"Home","directory.path":"Workspace directory path","directory.editPath":"Edit path","directory.newFolder":"New folder","directory.folderName":"Folder name","directory.createIn":'New folder in "{name}"',"directory.untitledFolder":"Untitled folder","directory.create":"Create","directory.cancel":"Cancel","directory.open":"Open","directory.opening":"Opening…","directory.loading":"Loading…","directory.truncated":"Too many folders to list; only the beginning is shown.","directory.showHidden":"Show hidden files","empty.project.title":"Choose a project to start","empty.project.body":"Sessions, files, and runs are scoped per project. Choose or create a project from the top-left.","empty.project.choose":"Choose project…","empty.session.title":"Start a new conversation","empty.session.body":"No session selected in this project. Start a new conversation or pick one from the sidebar.","empty.session.create":"New session","empty.session.hint":"or choose an existing session on the left","empty.noModel":"No model configured — open Settings to add a provider and model.","hero.headline":"Into the Unknown","hero.preview":"Preview","settings.models.title":"Models","settings.models.intro":"Enter your API keys to use models from the following providers.","settings.models.edit":"Edit","settings.models.editProvider":"Edit {provider}","settings.models.remove":"Delete","settings.models.removeProvider":"Delete {provider}","settings.context.removeOverride":"Remove override {index}","settings.models.deleteTitle":"Delete {provider}?","settings.models.deleteDescription":"Deleting {provider} removes its configuration. Any credential it uses is managed elsewhere and will be kept.","settings.models.deleteDescriptionWithCredential":"Deleting {provider} removes its configuration and stored API key.","settings.models.deleteConfirm":"Delete {provider}","settings.models.deleting":"Deleting {provider}…","settings.models.add":"Add provider","settings.models.provider":"Provider","settings.models.close":"Close","settings.models.cancel":"Cancel","settings.models.apply":"Apply","settings.models.applying":"Applying…","settings.models.savedProvider":"Saved {provider}.","settings.models.credentialConfigured":"API key configured","settings.models.credentialMissing":"API key missing","settings.models.readOnly":"The settings document is read-only in this deployment.","settings.models.loadFailed":"Loading the provider directory failed","settings.models.conflict":"Someone else changed these settings while this card was open. Close it and reopen to edit the current values.","settings.models.retry":"Retry","settings.models.keyInput":"API key","settings.models.keyPlaceholder":"Enter your API key","settings.models.keyPlaceholderNative":"Enter an API key, or leave blank to use environment authentication","settings.models.keyStored":"Configured — enter a new value to replace","settings.models.keyEnvLocked":"Provided by the launch environment (read-only)","settings.models.customized":"Customized settings","settings.models.baseUrl":"Base URL","settings.models.baseUrlDefault":"Provider default","settings.models.models":"Models","settings.models.modelsInherited":"Using the adapter defaults","settings.models.modelsCustomized":"Customized model catalog","settings.models.resetModels":"Restore defaults","settings.models.model":"Model","settings.models.modelId":"Model ID","settings.models.modelName":"Display name","settings.models.modelNamePlaceholder":"Uses the model ID when empty","settings.models.contextWindow":"Context window","settings.models.contextWindowPlaceholder":"Uses the provider default","settings.models.maxTokens":"Max output tokens","settings.models.maxTokensPlaceholder":"Uses the provider default","settings.models.modelAdvanced":"Capacities","settings.models.addModel":"Add model","settings.models.removeModel":"Delete model","settings.models.modelsEmpty":"No models will be shown in the selector. Unlisted IDs can still be sent directly.","settings.models.keyBlank":"Enter the API key, or leave the field empty to keep the stored one.","settings.models.keyBlankNew":"Enter the API key, or leave the field empty if this provider authenticates another way.","settings.models.keyIllegalCharacters":"This API key is not in a valid format. Please check it.","settings.models.modelIdRequired":"Model ID is required.","settings.models.modelIdDuplicate":"Model ID must be unique.","settings.models.modelNameInvalid":"Display name cannot be empty.","settings.models.modelContextInvalid":"Context window must be a positive count, like 131072, 256K, or 1M.","settings.models.modelMaxTokensInvalid":"Max output tokens must be a positive count, like 8192, 64K, or 1M.","settings.models.advancedHint":"Other fields live in models.json; edit that file directly.","settings.models.modelCapacityInvalid":"A capacity must be a number, optionally suffixed K or M.","settings.models.modelDuplicate":"Each model ID may appear once.","settings.models.modelContextWindow":"Context window","settings.models.modelMaxTokens":"Max output tokens","settings.models.fetchModels":"Fetch available models","settings.models.fetching":"Asking the provider…","settings.models.fetchNeedsBaseUrl":"Enter the base URL first, then fetch.","settings.models.fetchEmpty":"The provider listed no models. Add them by hand.","settings.models.fetchTitle":"Choose models to add","settings.models.fetchDescription":"These are the models this provider has available. Choose the ones to add.","settings.models.fetchAdopt":"Add selected","settings.models.fetchSelectAll":"Select all","settings.models.fetchDeselectAll":"Deselect all","settings.models.customAdd":"Add a custom provider","settings.models.customTitle":"Custom provider","settings.models.customTag":"Custom","settings.models.customRoute":"Provider ID","settings.models.customRouteHint":"Lowercase identifier, starting with a letter, that uniquely names this provider in requests and as its credential name.","settings.models.customRouteInvalid":"Start with a lowercase letter; then lowercase letters, digits, and dashes.","settings.models.customRouteTaken":"A provider already uses this ID.","settings.models.customDisplayName":"Display name","settings.models.customApi":"API protocol","settings.models.customApiUnset":"Not selected","settings.models.customNeedsBaseUrl":"A custom provider needs a base URL.","settings.models.customNeedsModels":"A custom provider needs at least one model.","settings.models.create":"Create provider","settings.models.creating":"Creating…","settings.search.placeholder":"Search settings…","settings.search.aria":"Search settings","settings.search.clear":"Clear search","settings.search.empty":"No settings match “{query}”.","settings.status.saving":"Saving…","settings.status.saved":"Saved","settings.status.failed":"Save failed","conversation.toolBatch.ariaOne":"Tool batch with 1 action","conversation.toolBatch.ariaMany":"Tool batch with {count} actions","conversation.toolBatch.titleOne":"Tool activity","conversation.toolBatch.titleMany":"{count} tool activities","conversation.toolBatch.running":"Running {tool}…","conversation.toolBatch.failed":"{count} failed","conversation.toolBatch.pendingOne":"Pending tool activity","conversation.toolBatch.pendingMany":"{count} pending tool activities","conversation.approval.required":"Approval required","conversation.approval.panelAria":"Tool approval required","conversation.approval.delegationRequired":"Delegation approval required","conversation.approval.waiting":"Waiting","conversation.approval.batchOne":"Batch {iteration} · 1 action","conversation.approval.batchMany":"Batch {iteration} · {count} actions","conversation.approval.remember":"Remember for {scope} in this session","conversation.approval.rejectBatch":"Reject batch","conversation.approval.rejecting":"Rejecting…","conversation.approval.approveBatch":"Approve batch","conversation.approval.approving":"Approving…","conversation.approval.skills":"skills","conversation.approval.after":"after","conversation.approval.modelCalls":"model","conversation.approval.toolCalls":"tool","conversation.tool.risk.readOnly":"Read only","conversation.tool.risk.localWrite":"Local write","conversation.tool.risk.shell":"Shell","conversation.tool.risk.external":"External","conversation.tool.risk.delegation":"Delegation","conversation.tool.risk.sensitive":"Sensitive","conversation.tool.state.done":"Done","conversation.tool.state.pending":"Pending","conversation.tool.state.running":"Running","conversation.tool.state.rejected":"Rejected","conversation.tool.state.interrupted":"Interrupted","conversation.tool.state.failed":"Failed","conversation.tool.arguments":"Arguments","conversation.tool.result":"Result","conversation.tool.errorOutput":"Error output","conversation.tool.noOutput":"No output","conversation.tool.noArguments":"No arguments recorded.","conversation.tool.incompleteArguments":"Arguments were incomplete.","conversation.tool.after":"after {names}","conversation.thinking.reasoning":"Reasoning","conversation.attention.title":"Attention","conversation.attention.aria":"Attention ({count})","conversation.attention.pending":"{count} pending","conversation.attention.empty":"Nothing needs attention.","conversation.attention.retryBudget":"Retry budget increase awaits approval","conversation.attention.approvalRequired":"Approval required","conversation.attention.needsInput":"Delegated task needs your input","conversation.attention.completed":"Background delegation completed","conversation.attention.failed":"Background delegation failed","conversation.attention.dismiss":"Dismiss","conversation.attention.action":"action","conversation.chat.runInterrupted":"Run interrupted","conversation.chat.runFailed":"Run failed","conversation.chat.retry":"Retry","conversation.chat.retrying":"Retrying…","conversation.chat.attemptRetryable":"Attempt {attempt} can be retried safely.","conversation.chat.loadEarlier":"Load earlier messages","conversation.chat.loadingEarlier":"Loading earlier messages…","conversation.chat.loading":"Loading conversation…","conversation.chat.historyUnavailable":"Conversation history unavailable: {message}","conversation.chat.newConversation":"New conversation","conversation.chat.startHint":"Start with a question, file, or analysis task.","conversation.chat.dismissError":"Dismiss error","conversation.chat.recovery.sideEffect":"Retry is unavailable because tools may have changed external state.","conversation.chat.recovery.projectedOutput":"Retry is unavailable because this attempt already committed output.","conversation.chat.recovery.activeRun":"Another run is active.","conversation.chat.recovery.notActive":"This attempt is no longer on the active branch.","selection.quote":"Quote in composer","selection.copy":"Copy","selection.copied":"Copied","selection.explain":"Explain","selection.explainPrompt":"Explain this passage:","selection.source.chat":"Conversation","selection.aria":"Selection actions","message.expand":"Show full message","message.collapse":"Collapse message","conversation.rail.aria":"Conversation turns","conversation.rail.turn":"Turn {index}","conversation.rail.goTo":"Go to turn {index}: {label}","conversation.jumpLatest":"Jump to latest","conversation.newMessages":"New messages","conversation.compaction.aria":"Create context checkpoint","conversation.compaction.title":"Create context checkpoint","conversation.compaction.cancel":"Cancel","conversation.compaction.placeholder":"Optional focus for the checkpoint…","conversation.compaction.creating":"Creating…","conversation.compaction.confirm":"Create checkpoint","conversation.delegation.background":"Background delegation","conversation.delegation.active":"{count} active","conversation.delegation.settled":"all settled","conversation.delegation.running":"running in background…"},"zh-CN":{"general.title":"通用","general.desc":"外观与工作区偏好设置。","general.appearance":"外观","general.permission":"默认权限","general.permission.desc":"应用于新建会话的权限预设。","general.language":"语言","language.en":"English","language.zh":"中文","sidebar.aria":"项目与会话","sidebar.newChat":"新对话","sidebar.newChatAria":"新对话","sidebar.selectProjectFirst":"请先选择项目","sidebar.roles":"角色","sidebar.graphs":"图谱","sidebar.searchSessions":"搜索会话","sidebar.search":"搜索","sidebar.clearSearch":"清除搜索","sidebar.sessions":"会话","sidebar.workspaces":"工作区","sidebar.refresh":"刷新会话","sidebar.loadingSessions":"加载会话中…","sidebar.chooseProject":"选择一个项目开始。","sidebar.newProject":"新建项目","sidebar.settings":"设置","sidebar.collapse":"收起侧边栏","sidebar.expand":"展开侧边栏","sidebar.openNav":"打开导航","sidebar.collapseNav":"收起导航","sidebar.closeNav":"关闭导航","sidebar.selectProject":"选择项目","sidebar.selectProjectEllipsis":"选择项目…","sidebar.unknown":"未知","sidebar.noProjects":"暂无项目","sidebar.addProject":"添加项目…","sidebar.addWorkspace":"添加工作区","sidebar.pin":"固定项目","sidebar.unpin":"取消固定","sidebar.loading":"加载中…","sidebar.noSessions":"暂无会话。","sidebar.noSessionsMatch":"没有匹配的会话","sidebar.showArchived":"显示已归档会话","sidebar.hideArchived":"隐藏已归档会话","sidebar.noArchived":"无已归档会话。","sidebar.chat":"个会话","sidebar.chats":"个会话","sidebar.rename":"重命名","sidebar.deleteProject":"删除项目","sidebar.renameProject":"重命名项目","sidebar.renameSession":"重命名会话","sidebar.newSession":"新建会话","sidebar.deleteProjectTitle":"删除 {name}?","sidebar.deleteProjectBody":"项目将从侧边栏移除。其工作区文件夹和会话数据仍保留在磁盘上。","sidebar.deleteProjectConfirm":"删除","sidebar.cancel":"取消","sidebar.save":"保存","sidebar.archive":"归档会话","sidebar.restore":"恢复会话","time.now":"刚刚","time.minutes":"分钟","time.hours":"小时","time.days":"天","time.months":"个月","time.years":"年","composer.dropFiles":"拖放图片或文本文件","composer.hint.enter":"Enter 发送","composer.hint.newline":"Shift+Enter 换行","composer.hint.resize":"拖拽上边缘调整高度","composer.hint.resizeAria":"调整输入框高度","composer.attachedFiles":"已附加文件","composer.removeImage":"移除图片","composer.remove":"移除","composer.configureRun":"配置运行","composer.runConfiguration":"运行配置","composer.target":"目标","composer.permission":"权限","composer.attach":"附加","composer.attachFiles":"附加文件","composer.attachImage":"附加图片","composer.compactContext":"压缩上下文","composer.placeholderCompacting":"正在压缩上下文","composer.placeholderSteer":"引导 Agent…(回车)","composer.placeholderNoSession":"选择一个工作区开始","composer.placeholderHero":"描述你想要构建的内容… / 调用指令 @ 文件或对话","composer.placeholderDefault":"输入消息…","composer.messageAria":"给 Agent 发消息","composer.steerAria":"引导 Agent","composer.queueFollowUp":"排队追问","composer.followUp":"追问","composer.runContext":"运行配置","composer.attachMenu":"附件与上下文压缩","composer.queue.title":"待发送","composer.queue.aria":"待发送消息","composer.queue.count":"{count} 条待发送","composer.queue.expand":"展开待发送消息","composer.queue.collapse":"收起待发送消息","composer.queue.edit":"编辑待发送消息","composer.queue.steer":"立即引导","composer.queue.remove":"移除待发送消息","composer.send":"发送","composer.stopRun":"停止运行","composer.modelSelect.triggerFallback":"选择模型","composer.modelSelect.selectAria":"选择模型","composer.modelSelect.aria":"选择模型,当前 {model}","composer.modelSelect.ariaEffort":"选择模型,当前 {model},推理等级 {effort}","composer.modelSelect.menu":"模型与推理等级","composer.modelSelect.model":"模型","composer.modelSelect.effort":"推理等级","composer.modelSelect.emptyModels":"没有可用的模型。","composer.modelSelect.emptyEfforts":"当前模型未提供推理等级。","composer.permissionMode":"权限模式","composer.roleTarget":"角色目标","composer.frozenForRun":"已为本轮运行冻结","composer.policyUnavailable":"策略不可用","composer.expanding":"正在展开提示词…","composer.queued":"排队","composer.thinking.default":"默认","composer.thinking.low":"低强度推理","composer.thinking.medium":"中等推理","composer.thinking.high":"高强度推理","context.aria":"上下文已用 {percent}","context.used":"上下文已用","context.system":"系统提示词","context.tools":"工具","context.messages":"对话消息","checkpoint.promptVersion":"摘要契约版本","checkpoint.contract":"契约摘要","inspector.noRun":"发送一条消息后,可在此查看模型实际收到的提示词。","inspector.loading":"正在读取本次 Run 冻结的提示词…","inspector.run":"Run","inspector.frozen":"在首次模型请求前冻结。此处内容不会根据当前设置重新推导。","inspector.unrecorded":"该 Run 未记录提示词组成,无可显示内容。","inspector.composition":"提示词组成","inspector.sections":"共 {count} 段","inspector.prompt":"冻结的提示词全文","inspector.sectionsDigest":"组成","inspector.composedDigest":"全文","inspector.baseDigest":"基础提示词","inspector.transcript":"Run 私有 transcript","inspector.transcriptNote":"本 Run 生成的模型可见消息,用于完整恢复。属 Run 私有,不会进入对话时间线。","inspector.transcriptEmpty":"该 Run 未产生 transcript 记录。","inspector.transcriptPrivate":"私有","inspector.transcriptThinking":"推理","inspector.transcriptCall":"调用","inspector.transcriptResult":"结果","inspector.transcriptError":"错误","inspector.transcriptImage":"图片 {width}×{height}","inspector.transcriptUnknown":"未识别的块:{type}","inspector.transcriptOlder":"加载更早的消息","inspector.mcp":"MCP 服务器","inspector.mcpNone":"该 Run 未冻结任何 MCP 服务器。","inspector.mcpUnavailable":"不可用","inspector.mcpRequired":"必需","inspector.mcpTools":"{count} 个工具","inspector.mcpProtocol":"协议","inspector.mcpInstructions":"服务器声明的工作说明","inspector.skillCatalog":"Skill 目录","inspector.catalog.materialized":"已物化","inspector.catalog.disabled":"已跳过(冻结的工具策略禁止 read)","stats.counts":"{turns} 轮 · {steps} 步","stats.llm":"LLM {duration}","stats.toolCall":"工具调用 {duration}","stats.ttftAverage":"首 token 平均 {duration}","stats.tokensPerSecond":"{throughput} tok/s","stats.cacheHit":"缓存命中 {percent}%","stats.tokens":"输入 {input} tok · 输出 {output} tok",copy:"复制",copied:"已复制","message.branch":"在新对话中分支","message.branchUnavailable":"仅可从已完成轮次的最后一条消息分支","message.ranFor":"用时 {duration}","message.ttft":"首 token {seconds}秒","message.tokensPerSecond":"{tps} tok/s","duration.seconds":"{seconds}秒","duration.minutes":"{minutes}分{seconds}秒","directory.title":"选择工作区目录","directory.home":"主目录","directory.path":"工作区目录路径","directory.editPath":"编辑路径","directory.newFolder":"新建文件夹","directory.folderName":"文件夹名称","directory.createIn":'在"{name}"中新建文件夹',"directory.untitledFolder":"未命名文件夹","directory.create":"创建","directory.cancel":"取消","directory.open":"打开","directory.opening":"正在打开…","directory.loading":"加载中…","directory.truncated":"文件夹过多,仅显示开头部分。","directory.showHidden":"显示隐藏文件","empty.project.title":"选择一个项目开始","empty.project.body":"会话、文件和运行记录都按项目隔离。从左上角选择或新建项目。","empty.project.choose":"选择项目…","empty.session.title":"开始一段新对话","empty.session.body":"当前项目下没有选中的会话。新建一个会话开始对话。","empty.session.create":"新建会话","empty.session.hint":"或从左侧选择已有会话","empty.noModel":"尚未配置模型 — 打开设置添加 provider 和模型。","hero.headline":"探索未至之境","hero.preview":"预览版","settings.models.title":"模型","settings.models.intro":"填入各提供方的 API 密钥即可使用其模型。","settings.models.edit":"编辑","settings.models.editProvider":"编辑 {provider}","settings.models.remove":"删除","settings.models.removeProvider":"删除 {provider}","settings.context.removeOverride":"移除覆盖项 {index}","settings.models.deleteTitle":"删除 {provider}?","settings.models.deleteDescription":"删除 {provider} 会移除其配置;其使用的凭证(如有)由其他位置管理,将会保留。","settings.models.deleteDescriptionWithCredential":"删除 {provider} 会移除其配置和存储的 API 密钥。","settings.models.deleteConfirm":"删除 {provider}","settings.models.deleting":"正在删除 {provider}…","settings.models.add":"添加提供方","settings.models.provider":"提供方","settings.models.close":"关闭","settings.models.cancel":"取消","settings.models.apply":"保存","settings.models.applying":"保存中…","settings.models.savedProvider":"已保存 {provider}。","settings.models.credentialConfigured":"API 密钥已配置","settings.models.credentialMissing":"API 密钥缺失","settings.models.readOnly":"当前部署的设置文档为只读。","settings.models.loadFailed":"加载提供方目录失败","settings.models.conflict":"这张卡片打开期间,这些设置已被其他地方改动。请关闭后重新打开,在当前值上编辑。","settings.models.retry":"重试","settings.models.keyInput":"API 密钥","settings.models.keyPlaceholder":"输入 API 密钥","settings.models.keyPlaceholderNative":"输入 API 密钥,或留空使用环境认证","settings.models.keyStored":"已配置——输入新值可替换","settings.models.keyEnvLocked":"由启动环境提供(只读)","settings.models.customized":"自定义设置","settings.models.baseUrl":"API 地址","settings.models.baseUrlDefault":"提供方默认","settings.models.models":"模型目录","settings.models.modelsInherited":"正在使用适配器默认模型","settings.models.modelsCustomized":"已自定义模型目录","settings.models.resetModels":"恢复默认模型","settings.models.model":"模型","settings.models.modelId":"模型 ID","settings.models.modelName":"显示名称","settings.models.modelNamePlaceholder":"留空时使用模型 ID","settings.models.contextWindow":"上下文窗口","settings.models.contextWindowPlaceholder":"使用提供方默认值","settings.models.maxTokens":"最大输出 token 数","settings.models.maxTokensPlaceholder":"使用提供方默认值","settings.models.modelAdvanced":"容量","settings.models.addModel":"添加模型","settings.models.removeModel":"删除模型","settings.models.modelsEmpty":"模型选择器中将不显示任何模型;目录外 ID 仍可直接发送。","settings.models.keyBlank":"请输入 API 密钥;留空则保持已存储的密钥。","settings.models.keyBlankNew":"请输入 API 密钥;若该提供方以其他方式鉴权,可以留空。","settings.models.keyIllegalCharacters":"该 API 密钥格式错误,请检查。","settings.models.modelIdRequired":"模型 ID 不能为空。","settings.models.modelIdDuplicate":"模型 ID 不能重复。","settings.models.modelNameInvalid":"显示名称不能为空。","settings.models.modelContextInvalid":"上下文窗口必须是正数,例如 131072、256K 或 1M。","settings.models.modelMaxTokensInvalid":"最大输出 token 数必须是正数,例如 8192、64K 或 1M。","settings.models.advancedHint":"其余字段位于 models.json 中,请直接编辑该文件。","settings.models.modelCapacityInvalid":"容量需为数字,可加 K 或 M 后缀。","settings.models.modelDuplicate":"每个模型 ID 只能出现一次。","settings.models.modelContextWindow":"上下文窗口","settings.models.modelMaxTokens":"最大输出 token","settings.models.fetchModels":"获取可用模型","settings.models.fetching":"正在询问提供方…","settings.models.fetchNeedsBaseUrl":"请先填写 API 地址,再获取。","settings.models.fetchEmpty":"该提供方没有列出任何模型,请手动添加。","settings.models.fetchTitle":"选择要添加的模型","settings.models.fetchDescription":"以下是模型提供方的可用模型,勾选要添加的模型。","settings.models.fetchAdopt":"添加所选","settings.models.fetchSelectAll":"全选","settings.models.fetchDeselectAll":"取消全选","settings.models.customAdd":"添加自定义提供方","settings.models.customTitle":"自定义提供方","settings.models.customTag":"自定义","settings.models.customRoute":"Provider ID","settings.models.customRouteHint":"以小写字母开头的标识,在请求中唯一标识该提供方,并用于派生凭据名。","settings.models.customRouteInvalid":"需以小写字母开头,之后可用小写字母、数字和短横线。","settings.models.customRouteTaken":"已有提供方使用了这个 ID。","settings.models.customDisplayName":"显示名称","settings.models.customApi":"API 协议","settings.models.customApiUnset":"未选择","settings.models.customNeedsBaseUrl":"自定义提供方需要填写 API 地址。","settings.models.customNeedsModels":"自定义提供方至少需要一个模型。","settings.models.create":"创建提供方","settings.models.creating":"创建中…","settings.search.placeholder":"搜索设置…","settings.search.aria":"搜索设置","settings.search.clear":"清除搜索","settings.search.empty":"没有匹配“{query}”的设置。","settings.status.saving":"保存中…","settings.status.saved":"已保存","settings.status.failed":"保存失败","conversation.toolBatch.ariaOne":"包含 1 个操作的工具批次","conversation.toolBatch.ariaMany":"包含 {count} 个操作的工具批次","conversation.toolBatch.titleOne":"工具活动","conversation.toolBatch.titleMany":"{count} 个工具活动","conversation.toolBatch.running":"正在运行 {tool}…","conversation.toolBatch.failed":"{count} 个失败","conversation.toolBatch.pendingOne":"待处理的工具操作","conversation.toolBatch.pendingMany":"{count} 个待处理工具操作","conversation.approval.required":"需要审批","conversation.approval.panelAria":"需要工具审批","conversation.approval.delegationRequired":"需要委托审批","conversation.approval.waiting":"等待中","conversation.approval.batchOne":"第 {iteration} 批 · 1 个操作","conversation.approval.batchMany":"第 {iteration} 批 · {count} 个操作","conversation.approval.remember":"在本会话中记住对 {scope} 的授权","conversation.approval.rejectBatch":"拒绝本批","conversation.approval.rejecting":"拒绝中…","conversation.approval.approveBatch":"批准本批","conversation.approval.approving":"批准中…","conversation.approval.skills":"技能","conversation.approval.after":"依赖","conversation.approval.modelCalls":"模型","conversation.approval.toolCalls":"工具","conversation.tool.risk.readOnly":"只读","conversation.tool.risk.localWrite":"本地写入","conversation.tool.risk.shell":"Shell","conversation.tool.risk.external":"外部","conversation.tool.risk.delegation":"委托","conversation.tool.risk.sensitive":"敏感","conversation.tool.state.done":"完成","conversation.tool.state.pending":"等待中","conversation.tool.state.running":"运行中","conversation.tool.state.rejected":"已拒绝","conversation.tool.state.interrupted":"已中断","conversation.tool.state.failed":"失败","conversation.tool.arguments":"参数","conversation.tool.result":"结果","conversation.tool.errorOutput":"错误输出","conversation.tool.noOutput":"无输出","conversation.tool.noArguments":"未记录参数。","conversation.tool.incompleteArguments":"参数不完整。","conversation.tool.after":"依赖 {names}","conversation.thinking.reasoning":"推理过程","conversation.attention.title":"待处理","conversation.attention.aria":"待处理({count})","conversation.attention.pending":"{count} 项待处理","conversation.attention.empty":"暂无需要处理的事项。","conversation.attention.retryBudget":"重试预算增加待审批","conversation.attention.approvalRequired":"需要审批","conversation.attention.needsInput":"委托任务需要你的输入","conversation.attention.completed":"后台委托已完成","conversation.attention.failed":"后台委托失败","conversation.attention.dismiss":"忽略","conversation.attention.action":"操作","conversation.chat.runInterrupted":"运行已中断","conversation.chat.runFailed":"运行失败","conversation.chat.retry":"重试","conversation.chat.retrying":"重试中…","conversation.chat.attemptRetryable":"第 {attempt} 次尝试可以安全重试。","conversation.chat.loadEarlier":"加载更早消息","conversation.chat.loadingEarlier":"正在加载更早消息…","conversation.chat.loading":"正在加载会话…","conversation.chat.historyUnavailable":"会话历史不可用:{message}","conversation.chat.newConversation":"新会话","conversation.chat.startHint":"输入问题、文件或分析任务开始。","conversation.chat.dismissError":"关闭错误","conversation.chat.recovery.sideEffect":"无法重试:工具可能已改变外部状态。","conversation.chat.recovery.projectedOutput":"无法重试:本次尝试已经提交输出。","conversation.chat.recovery.activeRun":"另一个运行正在进行。","conversation.chat.recovery.notActive":"本次尝试已不在活动分支上。","selection.quote":"引用到输入框","selection.copy":"复制","selection.copied":"已复制","selection.explain":"解释","selection.explainPrompt":"请解释这段内容:","selection.source.chat":"对话","selection.aria":"选区操作","message.expand":"展开全文","message.collapse":"收起","conversation.rail.aria":"对话轮次","conversation.rail.turn":"第 {index} 轮","conversation.rail.goTo":"跳到第 {index} 轮:{label}","conversation.jumpLatest":"回到最新","conversation.newMessages":"有新消息","conversation.compaction.aria":"创建上下文检查点","conversation.compaction.title":"创建上下文检查点","conversation.compaction.cancel":"取消","conversation.compaction.placeholder":"可选的检查点关注点…","conversation.compaction.creating":"创建中…","conversation.compaction.confirm":"创建检查点","conversation.delegation.background":"后台委托","conversation.delegation.active":"{count} 个进行中","conversation.delegation.settled":"全部已结束","conversation.delegation.running":"后台运行中…"}};function c(e,t){return a[e]?.[t]??a.en[t]??t}e.s(["translate",0,c],426);let l=(0,o.createContext)({locale:"en",setLocale:()=>{}});function d(){return(0,o.useContext)(l)}e.s(["LocaleProvider",0,function({children:e}){let[s,a]=(0,o.useState)(()=>n()),c=(0,o.useCallback)(e=>{a(e),r(e),i(e)},[]);(0,o.useEffect)(()=>{i(s)},[s]);let d=(0,o.useMemo)(()=>({locale:s,setLocale:c}),[s,c]);return(0,t.jsx)(l.Provider,{value:d,children:e})},"useLocale",0,d,"useT",0,function(){let{locale:e}=d();return t=>c(e,t)}],27437)},9323,e=>{"use strict";let t="ennote:worker-generation-changed",o=null,s=0,n=new Set;class r extends Error{constructor(){super("Worker restarted; discarding data from the previous connection"),this.name="WorkerGenerationChangedError"}}function i(e){return e.startsWith("/api/worker/")?e:`/api/worker${e}`}async function a(e,a){let c=s,l=await fetch(i(e),a);return function(e,i){let a=e.headers.get("X-Ennote-Worker-Instance");if(a){if(null===o)o=a;else if(o!==a)throw n.has(a)||(n.add(o),o=a,s+=1,window.dispatchEvent(new CustomEvent(t,{detail:{instanceId:a,generation:s}}))),new r}if(i!==s)throw new r}(l,c),l}async function c(e,t){let o=await a(e,t),s=await o.json().catch(()=>({}));if(!o.ok||s.error)throw Error(s.error?.message??`HTTP ${o.status}`);return s.data}async function l(e,t,o){let s,n,r=new Headers(o?.headers);r.has("Accept")||r.set("Accept","text/event-stream");let i=await a(e,{...o,headers:r});if(!i.ok)throw Error(await d(i));let c=i.body?.getReader();if(!c)throw Error("Worker event stream has no response body");let l=new TextDecoder,p="",m=[],u=e=>{let o=e.endsWith("\r")?e.slice(0,-1):e;if(o.startsWith("id:"))s=o.slice(3).trim();else if(o.startsWith("event:"))n=o.slice(6).trim();else if(o.startsWith("data:"))m.push(o.slice(5).trimStart());else if(""===o){if(m.length>0)try{t({id:s,event:n,data:JSON.parse(m.join("\n"))})}catch{}s=void 0,n=void 0,m=[]}};try{for(;;){let{done:e,value:t}=await c.read();if(e)break;let o=(p+=l.decode(t,{stream:!0})).split("\n");for(let e of(p=o.pop()??"",o))u(e)}(p+=l.decode())&&u(p),m.length>0&&u("")}finally{c.releaseLock()}}async function d(e){let t=await e.json().catch(()=>({}));return t.error?.message??`HTTP ${e.status}`}e.s(["WORKER_GENERATION_CHANGED_EVENT",0,t,"WorkerGenerationChangedError",0,r,"apiEventStream",0,l,"apiFetch",0,c,"apiResponse",0,a,"workerAPIPath",0,i])},85026,19172,51761,e=>{"use strict";var t=e.i(18050),o=e.i(71645),s=e.i(9323);function n(e){return null!=e&&!e.activeLeafMessageId}e.s(["isBlankSession",0,n],19172);let r="ennote-selected-project";function i(e){try{let t=localStorage.getItem(e);return t&&t.length>0?t:null}catch{return null}}function a(e,t){try{t?localStorage.setItem(e,t):localStorage.removeItem(e)}catch{}}function c(e){if(0===e.length)return;let t=e[0],o=Date.parse(t.updatedAt)||Date.parse(t.createdAt)||0;for(let s of e.slice(1)){let e=Date.parse(s.updatedAt)||Date.parse(s.createdAt)||0;e>o&&(t=s,o=e)}return t.id}async function l(e,t){let o=(t.some(t=>t.projectId===e)?t.filter(t=>t.projectId===e):await (0,s.apiFetch)(`/v1/projects/${encodeURIComponent(e)}/sessions?status=active`)).find(n);if(o)return o;let r=await (0,s.apiFetch)(`/v1/projects/${encodeURIComponent(e)}/sessions`,{method:"POST",body:JSON.stringify({title:"New Chat"})});if(!r?.id)throw Error("Failed to create session");return r}e.s(["SELECTED_PROJECT_KEY",0,r,"SELECTED_SESSION_KEY",0,"ennote-selected-session","readStoredId",0,i,"recentProjectId",0,c,"reuseOrCreateBlankSession",0,l,"writeStoredId",0,a],51761);let d="ennote-pinned-projects",p=(0,o.createContext)(null);e.s(["WorkspaceProvider",0,function({children:e}){let[n,l]=(0,o.useState)([]),[m,u]=(0,o.useState)(!1),[g,v]=(0,o.useState)(null),[h,y]=(0,o.useState)(!1),[f,b]=(0,o.useState)(void 0),[k,w]=(0,o.useState)(!1),[C,S]=(0,o.useState)(!1),[A,P]=(0,o.useState)(new Map),[I,E]=(0,o.useState)(()=>{try{let e=localStorage.getItem(d),t=e?JSON.parse(e):[];return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}});(0,o.useEffect)(()=>{(0,s.apiFetch)("/v1/projects").then(e=>{l(e),v(t=>{let o,s=t&&e.some(e=>e.id===t)?t:(o=i(r))&&e.some(e=>e.id===o)?o:c(e)??null;return a(r,s),s})}).catch(()=>{}).finally(()=>u(!0))},[]);let R=(0,o.useCallback)(e=>{y(!1),v(e),a(r,e)},[]),j=(0,o.useCallback)(e=>{b(e),y(!0)},[]),x=(0,o.useCallback)(()=>{y(!1),b(void 0)},[]),D=(0,o.useCallback)(()=>{S(!1),w(!0)},[]),N=(0,o.useCallback)(async(e,t)=>{S(!0);try{let o=await (0,s.apiFetch)("/v1/projects",{method:"POST",body:JSON.stringify({name:e,hostPath:t})});w(!1),o.workspace&&P(e=>new Map(e).set(o.project.id,o.workspace)),l(await (0,s.apiFetch)("/v1/projects")),R(o.project.id)}finally{S(!1)}},[R]),T=(0,o.useCallback)(()=>{C||w(!1)},[C]),M=(0,o.useCallback)(e=>{E(t=>{let o=t.includes(e)?t.filter(t=>t!==e):[...t,e];try{localStorage.setItem(d,JSON.stringify(o))}catch{}return o})},[]),q=(0,o.useCallback)(async(e,t)=>{let o=await (0,s.apiFetch)(`/v1/projects/${encodeURIComponent(e)}`,{method:"PATCH",body:JSON.stringify({name:t})});l(t=>t.map(t=>t.id===e?o:t))},[]),O=(0,o.useCallback)(async e=>{await (0,s.apiFetch)(`/v1/projects/${encodeURIComponent(e)}`,{method:"DELETE"}),l(t=>t.filter(t=>t.id!==e)),P(t=>{let o=new Map(t);return o.delete(e),o}),E(t=>t.filter(t=>t!==e)),v(t=>t!==e?t:(a(r,null),null))},[]),B=(0,o.useCallback)(e=>A.get(e),[A]);return(0,t.jsx)(p.Provider,{value:{projects:n,projectsReady:m,selectedProject:g,switchProject:R,createProjectOpen:k,openCreateProject:D,confirmCreateProject:N,cancelCreateProject:T,createProjectBusy:C,settingsOpen:h,settingsTab:f,openSettings:j,closeSettings:x,pinnedProjectIds:I,togglePinProject:M,renameProject:q,deleteProject:O,workspaceFor:B},children:e})},"pinnedProjectsStorageKey",0,d,"useWorkspace",0,function(){let e=(0,o.useContext)(p);if(!e)throw Error("useWorkspace must be used inside <WorkspaceProvider>");return e}],85026)},26356,e=>{"use strict";var t=e.i(71645),o=e.i(9323);e.s(["WorkerGenerationGuard",0,function({children:e}){return(0,t.useEffect)(()=>{let e=()=>window.location.reload();return window.addEventListener(o.WORKER_GENERATION_CHANGED_EVENT,e),()=>window.removeEventListener(o.WORKER_GENERATION_CHANGED_EVENT,e)},[]),e}])}]);
|