even-keel 0.2.0-rc.2 → 0.2.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.
@@ -0,0 +1,31 @@
1
+ import{n as e,r as t,t as n}from"./rolldown-runtime-XKyaHtl9.js";var r=n((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var C=Array.isArray;function w(){}var T={H:null,A:null,T:null,S:null},E=Object.prototype.hasOwnProperty;function D(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function O(e,t){return D(e.type,t,e.props)}function k(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ee(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?ee(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(w,w):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,C(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(k(o)&&(o=O(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(C(e))for(var u=0;u<e.length;u++)a=e[u],s=l+j(a,u),c+=N(a,r,i,s,o);else if(u=h(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+j(a,u++),c+=N(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return N(M(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function te(e,t,n){if(e==null)return e;var r=[],i=0;return N(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function ne(e){if(e._status===-1){var t=e._result,n=t();n.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t,n.status===void 0&&(n.status=`fulfilled`,n.value=t))},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t,n.status===void 0&&(n.status=`rejected`,n.reason=t))}),e._status===-1&&(e._status=0,e._result=n)}if(e._status===1)return e._result.default;throw e._result}var re=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)};function ie(e){var t=T.T,n={};n.types=t===null?null:t.types,T.T=n;try{var r=e(),i=T.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(w,re)}catch(e){re(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),T.T=t}}function ae(e){var t=T.T;if(t!==null){var n=t.types;n===null?t.types=[e]:n.indexOf(e)===-1&&n.push(e)}else ie(ae.bind(null,e))}var oe={map:te,forEach:function(e,t,n){te(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return te(e,function(){t++}),t},toArray:function(e){return te(e,function(e){return e})||[]},only:function(e){if(!k(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=oe,e.Component=y,e.Fragment=r,e.Profiler=a,e.PureComponent=x,e.StrictMode=i,e.Suspense=l,e.ViewTransition=p,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=T,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return T.H.useMemoCache(e)}},e.addTransitionType=ae,e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=_({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!E.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return D(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)E.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return D(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=k,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:ne}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=ie,e.unstable_useCacheRefresh=function(){return T.H.useCacheRefresh()},e.use=function(e){return T.H.use(e)},e.useActionState=function(e,t,n){return T.H.useActionState(e,t,n)},e.useCallback=function(e,t){return T.H.useCallback(e,t)},e.useContext=function(e){return T.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return T.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return T.H.useEffect(e,t)},e.useEffectEvent=function(e){return T.H.useEffectEvent(e)},e.useId=function(){return T.H.useId()},e.useImperativeHandle=function(e,t,n){return T.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return T.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return T.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return T.H.useMemo(e,t)},e.useOptimistic=function(e,t){return T.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return T.H.useReducer(e,t,n)},e.useRef=function(e){return T.H.useRef(e)},e.useState=function(e){return T.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return T.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return T.H.useTransition()},e.version=`19.3.0`})),i=n(((e,t)=>{t.exports=r()})),a=t(i(),1),o={github:`GitHub`,forgejo:`Forgejo`,gitlab:`GitLab`},s={anthropic:`Anthropic`,openai:`OpenAI`,github:`GitHub`},c={claude:`Claude Code`,codex:`Codex`,opencode:`OpenCode`,copilot:`GitHub Copilot`},l=e=>e.join(`, `),u={start:`“On task start”`,review:`“On pull request”`,done:`“On task completion”`},d={excludeFile:()=>`find the exclude file of`,addWorktree:e=>`add the worktree of ${e} to`,listRemotes:()=>`list the remotes of`,listWorktrees:()=>`list the worktrees of`,listBranches:()=>`list the branches of`,readStatus:()=>`read the status of`,countCommits:e=>`count the commits beyond ${e} in`,addSlot:()=>`add the slot to`,clean:()=>`clean`,switch:e=>`switch to ${e} in`},f={service:`Even Keel does not run as a service here, so nothing could restart it`,git:`the folder of Even Keel is not a git checkout`,dirty:`the checkout has uncommitted changes`,tag:`the checkout is not on the release tag of the installed version`,global:`the npm package is not a global install (npm install --global)`,checking:`the checkout is still being read; try again in a moment`,storage:`the previous version cannot read the storage this one migrated`},p={"account.overageRisk":()=>`Paid usage may start before Even Keel detects it.`,"account.overagePolicy":()=>`Even Keel stops a chain session after detecting extra usage and waits for the included allowance to reset. Detection follows a request or a usage poll, which may lag by up to five minutes. Set a hard spending cap with the provider.`,"account.overageAdvice":e=>e.provider===`chatgpt`?`For this chain account, turn off automatic credit reload or set its monthly spending cap in ChatGPT where supported.`:e.provider===`claude`?`For this chain account, turn off Extra usage or set its monthly spending limit in Claude.`:`For this chain account, turn off additional paid usage or set its monthly budget in GitHub.`,"account.overageSettings":()=>`Provider spending settings`,"tracker.closePending":()=>`tracker refused closure`,"tracker.completeRefused":e=>e.status===void 0?`${e.task} is merged, but the tracker refused to close it. Fill the required field or close the task in the tracker yourself. Even Keel retries automatically. Tracker response`:`${e.task} is merged, but the tracker refused to move it to "${e.status}" (${u.done}). Fill the required field, pick another status in ${u.done} or close the task yourself. Even Keel retries automatically. Tracker response`,"statusMove.refused":e=>`The tracker did not move ${e.task} to "${e.status}" (${u[e.setting]}). The chain goes on; pick another status in ${u[e.setting]} or move the task yourself. Tracker response`,"statusMove.outside":e=>`${e.task} stayed where it was: "${e.status}" of ${u[e.setting]} is out of the chain by its rules, and the chain would let the task go at once. Pick a status in the chain.`,"statusMove.notDone":e=>`${e.task} is merged, but stays open: the chain rules do not take "${e.status}" of ${u.done} for done. Pick a done status there. Even Keel retries automatically.`,"statusMoves.outside":e=>`"${e.status}" of ${u[e.setting]} is out of the chain by the chain rules: the chain would let a task go as soon as it moved there. Pick a status in the chain.`,"statusMoves.notDone":e=>`The chain rules do not take "${e.status}" of ${u.done} for done: the chain would never see a task there closed. Pick a done status.`,"statusMoves.unknown":e=>`The tracker has no status "${e.status}" for ${u[e.setting]}: the move would fail when it comes. Pick a status from the list.`,"gitlab.url":()=>`Enter the GitLab server web address in Trackers and CI, without /api/v4.`,"gitlab.token":()=>`Add a GitLab profile in Trackers and CI with a personal access token that has the api scope.`,"jira.url":()=>`Enter the Jira site address in Trackers and CI as https://<site>.atlassian.net, without a path.`,"jira.incomplete":()=>`Fill in the site address, the e-mail and the API token of the Jira profile in Trackers and CI.`,"jira.mcpSite":()=>`The MCP token cannot see this Jira site. Enable API token authentication for the Atlassian MCP server in your organization’s admin settings, then create a new Atlassian MCP V2 token.`,"jira.mcpToken":()=>`The Atlassian MCP server refused the MCP token. Enable API token authentication in your organization’s admin settings, then create a new Atlassian MCP V2 token for this e-mail.`,"jira.blocksType":e=>`Jira has no issue link type named Blocks (it has: ${e.types||`none`}), and Even Keel orders the chain by it. Give a link type that name back in Jira's settings, Issue linking.`,text:e=>e.text,"chain.unknownProject":e=>`chain: ${e.project} is not a configured project`,"chain.notOpen":e=>`chain: ${e.task} is not an open task of ${e.project}`,"chain.launching":e=>`chain: ${e.task} is still launching; try again in a moment`,"chain.midTurn":e=>`chain: ${e.task} is mid-turn; wait until its session stops`,"chain.restartChanged":e=>`${e.task}: the session or its last write changed. Check the session and confirm New session again.`,"chain.silentTurn":e=>`${e.task} has written nothing since ${e.since}. New session can interrupt the turn with confirmation from ${e.restartAt}; it becomes available without confirmation at ${e.hungAt} if silence continues.`,"chain.notCurrent":e=>`chain: ${e.task} is not the current task of a chain`,"chain.limitsUnread":e=>`Waiting for the first answer about the limits of the account ${e.account}: without it a spent limit looks free.${e.next===void 0?``:` The next poll is at ${e.next}.`}`,"chain.limitSpent":e=>`chain: The usage limit is spent until ${e.until}${e.account===void 0?``:` on ${e.provider??``} account “${e.account}”`}. Wait for the reset, or change the provider's account in the project's pool (shared or own) under Project settings → Sessions, or change the task's provider label.`,"session.transient":()=>`waiting to retry`,"session.transientRetry":e=>`The model is temporarily unavailable. The dispatcher will retry this same session at ${e.at}. You can continue it now from the chat or start a new session.`,"chain.noSession":e=>`chain: no session of ${e.task} is known`,"chain.noAccountFor":e=>`chain: ${e.task} is labelled ${e.label}, but no account of that provider is in the pool; it runs on ${e.provider}, as its project does`,"chain.unknownModel":e=>`chain: ${e.task} is to run on ${e.model}, which the ${e.agent} account ${e.account} does not have (it has ${l(e.known.slice(0,8))||`none`}${e.known.length>8?` and ${e.known.length-8} more`:``}); pick a model in the Model field of the session settings, and the chain goes on by itself`,"chain.opencodeCopilot":()=>`OpenCode on Copilot is not supported yet. Choose another Model or Account in the session settings, update the task’s model label if it uses Copilot, then resume the chain.`,"chain.modelUnavailable":e=>`The ChatGPT account cannot run ${e.model} through OpenCode. Choose another Model or Account in the session settings and update the task’s model label if it has one. Use New session, then resume the chain.`,"account.opencodeCopilot":()=>`OpenCode on Copilot is not supported yet`,"answer.moved":e=>`answer: the session of ${e.task} has moved on since the question; the answer was not sent`,"answer.busy":e=>`answer: the session of ${e.task} is working; answer once it waits`,"answer.closed":e=>`${e.task} is already closed, so the message was not sent. Put what it asks into a new task.`,"answer.empty":()=>`answer: the reply is empty`,"answer.file":e=>`answer: the file ${e.name} could not be saved`,"chain.queueChanged":e=>`chain: the queue has changed, it is now ${l(e.queue)||`empty`}`,"chain.currentFirst":e=>`chain: ${e.task} is running and stays first`,"chain.fixReportMissing":e=>`chain: the report of ${e.task} is gone, so a new session cannot be told what to fix; check main and resume`,"chain.interrupted":e=>`chain: launch of ${e.task} was interrupted by a restart; check its session, then resume`,"chain.unchangedNotChecked":e=>`chain: the session of ${e.task} marked it as needing no change, but its folder could not be checked (answer its session from the chat, or skip the task)`,"chain.unchangedNotCompleted":e=>`chain: ${e.task} needs no change and its branch has nothing to merge, but it was not moved to done in the tracker (move it there yourself and resume the chain, or skip the task)`,"chain.notRead":e=>`chain: the tasks of ${e.project} are not read from the tracker yet; try again once it answers`,"chain.empty":e=>`chain: ${e.project} has no task to run, not started`,"chain.emptyNone":()=>`it has no open tasks`,"chain.emptyStatus":()=>`none of its open tasks is in a status the chain takes`,"chain.emptyLabels":e=>`its ready tasks lack a required label (${l(e.labels)})`,"chain.emptySkipped":()=>`all its ready tasks are skipped`,"chain.emptyBlocked":()=>`its ready tasks are skipped or wait for blockers outside the chain`,"order.notOpen":e=>`chain: ${e.task} is not an open task of this chain`,"order.twice":e=>`chain: ${e.task} appears twice`,"order.blocked":e=>`chain: ${e.task} cannot go before ${e.blocker}, which blocks it`,"order.milestone":e=>`chain: ${e.task} in ${e.milestone} cannot go before ${e.earlier} in the earlier ${e.earlierMilestone}`,"order.cycle":e=>`blocker cycle: ${e.path}`,"order.later":e=>`${e.task} in ${e.milestone} is blocked by ${e.blocker} in the later ${e.blockerMilestone}`,"order.against":e=>`blockers go against the milestone order: ${e.path}`,"cleanup.failed":()=>`cleanup failed`,"cleanup.syncFailed":()=>`sync of the main branch failed`,"cleanup.folderLeft":e=>`the worktree folder ${e.path} was left behind, a process still holds it`,"cleanup.folderNotDeleted":e=>`the worktree folder ${e.path} was left behind: it could not be deleted`,"cleanup.worktreeKept":e=>`the worktree ${e.path} was kept`,"cleanup.branchKept":e=>`the branch ${e.branch} was kept`,"cleanup.originUnchecked":e=>`could not check the branch ${e.branch} on ${e.remote??`origin`}`,"cleanup.originKept":e=>`the branch ${e.branch} was kept on ${e.remote??`origin`}`,"cleanup.slotDirty":e=>`the slot ${e.path} was kept on ${e.branch}: it has uncommitted changes`,"cleanup.slotKept":e=>`the slot ${e.path} was kept on ${e.branch}`,"cleanup.sessionNotStopped":e=>`its session ${e.session} was not stopped`,"git.missing":()=>`git does not start on the machine of Even Keel, and every task needs it: install git, then try again`,"git.noIdentity":()=>`git has no name and e-mail to commit with: fill them in on the Git step of the setup`,"git.identityBlank":()=>`git needs both a name and an e-mail to commit with`,"git.identityFailed":()=>`git could not write the name and e-mail into its global config`,"git.initFailed":e=>`git could not make ${e.path} a repository`,"git.ignoreUnknown":e=>`git: cannot tell whether ${e.repo} ignores ${e.dir}`,"git.failed":e=>`git: could not ${d[e.step](e.subject)} ${e.repo}`,"git.noBranch":e=>`git: ${e.repo} has no branch ${e.branch}, the main branch of ${e.project}; create it or name the right one in the project's settings`,"git.wrongBranch":e=>`git: ${e.repo} stands ${e.current===null?`on a detached HEAD`:`on ${e.current}`}, not on ${e.branch}, the main branch of ${e.project}; switch it to ${e.branch} or name the right branch in the project's settings`,"sync.alias":e=>`git sync exited with ${e.exit}`,"sync.notMain":e=>`sync: ${e.repo} is on ${e.branch||`a detached HEAD`}, not ${e.main}; switch it to ${e.main}`,"sync.fetch":e=>`sync: could not fetch ${e.remote}`,"sync.merge":e=>`sync: ${e.remote}/${e.main} does not merge cleanly into ${e.main}, merge it by hand`,"sync.push":e=>`sync: could not push ${e.main} to ${e.remote}`,"forward.busy":e=>`the chain of ${e.into} is working; the release branch goes in once it is quiet`,"forward.notOnBranch":e=>`${e.repo} is on ${e.current||`a detached HEAD`}, not ${e.branch}; the release branch waits`,"forward.dirty":e=>`${e.repo} has uncommitted changes; the release branch waits`,"forward.fetch":e=>`could not fetch the branch of ${e.from}`,"forward.conflict":e=>`the branch of ${e.from} conflicts with ${e.into} in ${e.files.join(`, `)||`unknown files`}; the merge is aborted and waits for a merge by hand or "Resolve with the agent"`,"forward.noConflict":e=>`the branch of ${e.from} holds no conflict for an agent to resolve`,"forward.agent":e=>`${e.task} resolves the carry of ${e.from}; the release branch waits for it`,"forward.failed":e=>`git could not merge the branch of ${e.from} into ${e.into}, though no file conflicts; fix what git's message names, then press "Carry now"`,"forward.notRelease":e=>`${e.project} merges into no other project`,"forward.foreign":e=>`${e.from} and ${e.into} share no remote, and neither checkout is a clone of the other; nothing is fetched — in "Merges into" of ${e.from} pick a project of the same repository`,"ci.noToken":e=>`no profile has a token for this CI: add a ${o[e.kind]} profile in Settings → Trackers and CI`,"ci.denied":e=>`${e.ci}: the token was refused (HTTP ${e.status}); it needs read access to the repository's actions`,"ci.http":e=>`${e.ci}: the API answered HTTP ${e.status}`,"ci.unreachable":e=>`${e.ci}: the API did not answer`,"review.denied":e=>`${e.ci}: the token was refused (HTTP ${e.status}); it needs to write pull requests of the repository`,"intake.denied":e=>`${e.ci}: the token was refused (HTTP ${e.status}); it needs to read and write the repository's issues`,"review.notOpened":e=>`the pull request of ${e.task} was not opened (fix access and press Resume, answer its session from the chat, or skip the task)`,"review.notCompleted":e=>`${e.task} has nothing to open as a pull request, but it was not moved to done in the tracker (move it there yourself and resume the chain, or skip the task)`,"review.notReady":e=>`PR mode of ${e.project} has nowhere to open pull requests, so its chain starts no task; it goes on by itself within a minute once that is fixed, or turn PR mode off`,"review.cannotEnable":e=>`PR mode of ${e.project} is not turned on`,"chain.noTrackerMcp":e=>`the chain of ${e.project} starts no task: "Task description in the prompt" is off and no package of the project brings the tracker's MCP server ${e.server}, so a session would not see its task; turn on a package with it or turn the description on, and the chain goes on by itself`,"chain.packagesNotReady":e=>`the chain of ${e.project} starts no task: its package${e.packages.length===1?``:`s`} ${l(e.packages)} ${e.packages.length===1?`is`:`are`} not installed, failed to install or lack${e.packages.length===1?`s`:``} a key; fix that on the Tools page, and the chain goes on by itself`,"review.noRemote":e=>`${e.project} has no remote on GitHub, GitLab or Forgejo to open a pull request on`,"review.noToken":e=>`no profile has a token for the remote ${e.remote} (${e.web}); add a ${o[e.kind]} profile for its host`,"review.unsupportedHost":e=>`the remote ${e.remote} on ${e.host} is not supported for pull requests: only GitHub, GitLab and Forgejo are`,"review.noNote":e=>`the session left no pull request description at ${e.path}`,"review.noBranch":e=>`${e.path} is not on a branch`,"review.dirty":e=>`${e.path} has uncommitted changes`,"review.nothingAhead":e=>`${e.branch} has no commits beyond ${e.base}`,"review.pushFailed":e=>`could not push ${e.branch} to ${e.remote}`,"review.pushBehind":e=>`${e.branch} on ${e.remote} has commits the session's branch lacks (a conflict resolved on the forge, say): the session is to merge them and mark the pull request again`,"ci.notTaken":e=>`${e.ci}: no runner took ${e.commit}`,"ci.fixFailed":e=>`CI is red on main at ${e.commit}, the push of the fix ${e.task}; the chain waits for you`,"ci.cannotCreate":e=>`CI is red on main at ${e.commit}, and the tracker cannot create a task to fix it`,"ci.fixNotCreated":e=>`CI is red on main at ${e.commit}; the task to fix it was not created`,"ci.fixNotStarted":e=>`CI is red on main at ${e.commit}; the session to fix it was not started`,"check.fixNotStarted":e=>`The project's check fails on main at ${e.commit}; the session to fix it was not started`,"check.fixFailed":e=>`The project's check fails on main at ${e.commit}, the push of the fix ${e.task}; the chain waits for you`,"check.cannotCreate":e=>`The project's check fails on main at ${e.commit}, and the tracker cannot create a task to fix it`,"check.fixNotCreated":e=>`The project's check fails on main at ${e.commit}; the task to fix it was not created`,"afterGreen.failed":e=>`"${e.command}" after the green main at ${e.commit} exited with code ${e.code}; main stays green, the service log has the output`,"slot.dirty":e=>`the slot ${e.path} has uncommitted changes; commit or remove them`,"slot.busy":e=>`the slot ${e.path} is in use by ${l(e.sessions)} mid-turn; let it finish or stop it`,"slot.noneFree":e=>`git: no slot is free, ${e.task} was not started; free one, then resume`,"slot.waiting":e=>`no slot is free for ${e.task}; it starts as soon as one is`,"slot.busyStart":e=>`the slot ${e.slot} is in use by ${l(e.sessions)} mid-turn, ${e.task} was not started; let it finish or stop it, then resume`,"slot.stopFailed":e=>`the session ${e.session} of ${e.owner} in the slot ${e.slot} was not stopped, ${e.task} was not started`,"setup.failed":e=>`setup: "${e.command}" before the start of ${e.task} exited with code ${e.code}; the session was not started, fix it and resume`,"agent.uncheckedVersion":e=>`${e.title} ${e.installed} is installed, Even Keel was last checked against ${e.checked}; a part of it may not work until it is adapted`,"agent.daemonVersion":e=>`The ${e.title} daemon of ${e.account} runs ${e.running}, not the checked ${e.wanted}: its sessions run on ${e.running} until no session of the account is live, then Even Keel restarts it`,"cliCheck.waiting":e=>`The check of ${e.title} ${e.version} waits for the account ${e.account} to have no live session: stop the chains on it`,"cliCheck.running":e=>`${e.title} ${e.version} is being checked on the account ${e.account}; chain sessions on it wait for the check to end`,"cliCheck.passed":e=>`${e.title} ${e.version} passed the check on this machine`,"cliCheck.failed":e=>`${e.title} ${e.version} failed the check on this machine`,"cliCheck.interrupted":e=>`The check of ${e.title} ${e.version} was cut short by a stop of Even Keel; it runs again once the account has no live session`,"cliCheck.busy":e=>`the CLI check is running on the account ${e.account}; try again once it ends`,"cliCheck.chainWaits":e=>`the CLI check is running on the account ${e.account}; ${e.task} starts as soon as it ends`,"claude.startFailed":e=>`claude: could not start ${e.task} in ${e.cwd}`,"claude.untrusted":e=>`Claude Code does not trust ${e.folder} yet, so ${e.task} was not started. Run claude in that folder once as ${e.user}, accept the trust and resume the chain`,"claude.resumeFailed":e=>`claude: could not resume ${e.task} in ${e.cwd}`,"claude.notShown":e=>`claude: ${e.task} was started but did not show up in claude agents`,"claude.resumedNotShown":e=>`claude: ${e.task} was resumed but did not show up in claude agents`,"claude.stopFailed":e=>`claude: could not stop ${e.agent}`,"claude.stillRunning":e=>`claude: ${e.agent} was told to stop but is still running`,"claude.signOutFailed":e=>`claude: could not sign out of ${e.account}`,"claude.daemonStopFailed":e=>`claude: could not stop the daemon of ${e.account}`,"claude.daemonStatusFailed":e=>`claude: could not read the daemon version of ${e.account}`,"claude.statusNotJson":()=>`claude: the CLI answered the sign-in check in an unexpected form (auth status is not JSON)`,"claude.statusNotObject":()=>`claude: the CLI answered the sign-in check in an unexpected form (auth status is not an object)`,"claude.statusNoFlag":()=>`claude: the CLI answered the sign-in check in an unexpected form (auth status has no loggedIn flag)`,"codex.startFailed":e=>`codex: could not start ${e.task} in ${e.cwd}`,"codex.resumeFailed":e=>`codex: could not resume ${e.task} in ${e.cwd}`,"codex.pluginsFailed":e=>`codex: could not install the plugins of ${e.task} into ${e.account}`,"codex.hooksUntrusted":e=>`codex: Codex does not trust the hooks of the package ${e.package}, so ${e.task} would run without the check before a merge and the context reminders; update Even Keel, or for now run the task on another provider`,"codex.otherThread":e=>`codex: ${e.task} was resumed as ${e.asked} but came up as the new thread ${e.got}`,"codex.unknownSession":e=>`codex: Even Keel did not start the session ${e.session}`,"codex.stillRunning":e=>`codex: the turn of ${e.session} was killed but is still running`,"codex.statusUnreadable":()=>`codex: the CLI answered the sign-in check in an unexpected form (login status printed neither "Logged in" nor "Not logged in")`,"codex.signOutFailed":e=>`codex: could not sign out of ${e.account}`,"opencode.startFailed":e=>`opencode: could not start ${e.task} in ${e.cwd}`,"opencode.resumeFailed":e=>`opencode: could not resume ${e.task} in ${e.cwd}`,"opencode.otherSession":e=>`opencode: ${e.task} was resumed as ${e.asked} but came up as the session ${e.got}`,"opencode.unknownSession":e=>`opencode: Even Keel did not start the session ${e.session}`,"opencode.stillRunning":e=>`opencode: the turn of ${e.session} was killed but is still running`,"opencode.streamError":()=>`OpenCode reported a stream error and is waiting. Send a reply to retry, or choose “New session”.`,"copilot.startFailed":e=>`copilot: could not start ${e.task} in ${e.cwd}`,"copilot.binaryMissing":e=>`Copilot CLI could not be started: “${e.bin}” is not a program Even Keel can run. Set Copilot's CLI version to Checked in Settings → Providers and models, or point EVEN_KEEL_COPILOT_BIN in .env at the copilot executable, then resume the chain.`,"copilot.modelUnavailable":e=>`Copilot cannot use the model “${e.model}”. Choose an available model in Model in the project's session settings (or change the task's model label), then choose “New session”.`,"copilot.notSignedIn":()=>`Copilot is not signed in on this machine. Run “gh auth login” as the user Even Keel runs as, or add a Copilot account with its own token on the Accounts page, then choose “New session”.`,"copilot.resumeFailed":e=>`copilot: could not resume ${e.task} in ${e.cwd}`,"copilot.unknownSession":e=>`copilot: Even Keel did not start the session ${e.session}`,"copilot.stillRunning":e=>`copilot: the turn of ${e.session} was killed but is still running`,"account.unknown":e=>`claude: there is no account ${e.key}`,"account.alreadyActive":e=>`claude: ${e.key} is already active`,"account.removing":e=>`claude: ${e.account} is being removed; keep it first`,"account.needsLogin":e=>`claude: ${e.account} needs a login first`,"account.globalKept":()=>`Claude Code's own account cannot be removed from here`,"account.activeKept":()=>`claude: the active account cannot be removed; switch to another one first`,"account.sharedPool":e=>`the shared settings pick this account as their account on ${c[e.agent]??e.agent}; pick another one there first`,"account.projectPool":e=>`the settings of projects ${l(e.projects)} pick this account as their account on ${c[e.agent]??e.agent}; pick another one there first`,"account.signInRunning":()=>`claude: a sign-in into this account is running`,"account.usedByApp":e=>`claude: ${e.app} uses this account; switch it to another one first`,"account.codexApp":()=>`codex: the apps run on Claude Code; a Codex account is not given to one`,"account.codexHomeKept":()=>`Codex's own account cannot be removed from here`,"account.secondFree":e=>`codex: the sign-in went through, but on the free plan, and ${e.account} is already the free account here; OpenAI's terms do not allow several free accounts to get round the limits, so the new folder was signed out and removed and nothing was added. Sign in with a paid account, or move this one to a paid plan and sign in again`,"account.sameFree":e=>`codex: the sign-in went through as ${e.account}, the free account already here; the new folder was signed out and removed and nothing was added. To add another account, sign in with a paid one`,"account.extraFree":e=>`codex: a second free Codex account next to ${e.account}; OpenAI's terms do not allow several free accounts to get round the limits, so sessions do not start here until it is on a paid plan`,"account.notRemoving":e=>`claude: ${e.key} is not being removed`,"account.apiKeyInvalid":()=>`claude: an API key is one word of more than 20 characters, like sk-ant-api03-…`,"account.apiKeyRejected":()=>`claude: Anthropic doesn't accept this key: it is wrong, revoked or its organization is disabled`,"account.apiKeyUnchecked":e=>`claude: could not check the key with Anthropic (${e.reason}); try again later`,"account.codexKeyInvalid":()=>`codex: an OpenAI API key is one word of more than 20 characters, like sk-proj-…`,"account.codexKeyRejected":()=>`codex: OpenAI doesn't accept this key: it is wrong, revoked or its project is disabled`,"account.codexKeyUnchecked":e=>`codex: could not check the key with OpenAI (${e.reason}); try again later`,"account.copilotTokenInvalid":()=>`copilot: Copilot CLI takes a fine-grained personal access token (github_pat_…) with the Copilot Requests permission, or an OAuth token (gho_…); a classic ghp_ one it refuses`,"account.copilotTokenRejected":()=>`copilot: GitHub doesn't accept this token: it is wrong, expired or revoked`,"account.copilotTokenUnchecked":e=>`copilot: could not check the token with GitHub (${e.reason}); try again later`,"account.keyNotHeld":e=>`${e.agent}: this account's key is not kept in its folder (the agent's own folder or a script that gives the key), so it is not replaced from here`,"account.keyOtherProvider":e=>`opencode: the account holds a key of ${s[e.provider]??e.provider}; a key of another provider is another account: add it as one`,"account.keyOtherOrganization":e=>`${e.agent}: the key is of another organization than the account's, so it is another account: add it as one; the old key stays`,"account.chainRunning":e=>`claude: chain ${e.project} is running; stop it before switching the account`,"account.sessionsBusy":e=>`claude: sessions are in the middle of a turn (${l(e.sessions)}); switch the account once they finish`,"account.homeGone":e=>`claude: the account folder ${e.key} is gone`,"account.activeGone":e=>`claude: the active account folder ${e.key} is gone; switch to another account, then resume`,"account.signingIn":()=>`claude: sign-in is in progress; resume once it is done`,"account.signedOut":()=>`claude: not signed in; sign in on the Accounts page, then resume`,"account.loginExpired":e=>`the login of ${e.account} has run out; renew it on the Accounts page, then resume`,"login.none":()=>`claude: no sign-in is running`,"login.running":()=>`claude: a sign-in is already running`,"login.timeout":e=>`claude: sign-in did not finish in ${e.minutes} min`,"login.startFailed":()=>`claude: could not start the sign-in`,"agent.copyMissing":({title:e})=>`Waiting for the checked copy of ${e}. Download it, or set its CLI version to Yours in Settings → Providers and models.`,"agent.copyFailed":({title:e})=>`Could not download ${e}. CLI version was changed to Yours. Try downloading again.`,"login.codexMissing":()=>"Codex CLI is not found. Install it:\n\n```sh\nnpm install -g @openai/codex\n```","login.claudeMissing":()=>"Claude Code CLI is not found. Install it:\n\n```sh\nnpm install -g @anthropic-ai/claude-code\n```","login.opencodeMissing":()=>"OpenCode CLI is not found. Install it:\n\n```sh\nnpm install -g opencode-ai\n```","login.copilotMissing":()=>"Copilot CLI is not found. Install it:\n\n```sh\nnpm install -g @github/copilot\n```","login.method":e=>`there is no way to sign in "${e.method}" here; there are: ${l(e.known)}`,"login.exited":e=>`claude: sign-in exited with code ${e.code}`,"login.setupFailed":e=>`claude: signed in, but could not set up the folder ${e.dir}`,"app.unknown":e=>`claude: there is no app ${e.app}`,"app.alreadyUses":e=>`claude: ${e.app} already uses ${e.account}`,"app.chatsOpen":e=>`claude: ${e.app} has ${e.count} Claude ${e.count===1?`chat`:`chats`} open; close ${e.count===1?`it`:`them`} first`,"vscode.noFile":()=>`vscode: the VS Code settings file is only looked for on Windows, macOS and Linux`,"vscode.notJson":()=>`vscode: settings.json is not plain JSON (comments or trailing commas?); Even Keel does not rewrite it`,"vscode.notObject":()=>`vscode: settings.json is not a JSON object`,"usage.notJson":()=>`the answer is not JSON`,"usage.notObject":()=>`the answer is not a JSON object`,"usage.turns":e=>`num_turns is ${e.value}, not 0`,"usage.cost":e=>`total_cost_usd is ${e.value}, not 0`,"usage.isError":()=>`the answer is an error`,"usage.noResult":()=>`the answer has no result text`,"usage.noLimits":()=>`the subscription answer has no limit lines: the usage service did not answer (rate limit or expired token)`,"usage.noSession":()=>`no readable "Current session" line`,"usage.noWeek":()=>`no readable "Current week (all models)" line`,"usage.callFailed":()=>`the call failed`,"usage.noRollout":()=>`no Codex session of this account has reported its limits yet`,"usage.chatGptExpired":()=>`the ChatGPT sign-in's access token expired; start a session or renew the account's sign-in`,"usage.chatGptRevoked":()=>`the ChatGPT sign-in was revoked, for example after a plan change; renew the account's sign-in`,"usage.chatGptUnread":()=>`ChatGPT's usage answer has no readable limit windows`,"usage.openCodeNone":()=>`no ChatGPT or Copilot sign-in: OpenCode's free models and API keys have no limits to read`,"usage.copilotMachine":()=>`Even Keel could not read this machine's Copilot sign-in; add a Copilot account with its own token to read its allowance`,"usage.copilotUnlimited":()=>`the Copilot plan has no monthly limit`,"usage.copilotUnread":()=>`GitHub's Copilot answer has no readable allowance`,"usage.copilotSignIn":()=>`GitHub refused the Copilot sign-in; sign in again`,"usage.planRead":()=>`the token may not read its Copilot usage: give it the "Plan" permission (read) in GitHub's settings of the token`,"prompt.empty":e=>`prompt: the session prompt has nothing to put after "${e.before}" (got ${e.value}); check the task in the tracker and the project's settings, then resume`,"request.tooLarge":()=>`request body is too large`,"request.notJson":()=>`request body is not JSON`,"request.notObject":()=>`request body must be an object`,"request.required":e=>`${e.field} is required`,"request.taskId":()=>`task must look like ABC-12`,"request.taskList":()=>`order must be a list of task ids`,"request.projectList":()=>`order must be a list of projects`,"task.noTracker":e=>`no connected tracker serves ${e.task}`,"task.cannotReady":e=>`the tracker of ${e.task} can neither put the required label on it nor move it to Todo`,"task.cannotUnready":e=>`the tracker of ${e.task} can neither take the required label off it nor move it to a backlog status`,"task.unreadyLive":e=>`${e.task} has a live session: stop it or let it finish, then move the task to the backlog`,"task.inBacklog":e=>`${e.task} is in the backlog already`,"task.cannotRelabel":e=>`the tracker of ${e.task} cannot change labels`,"task.relabelFailed":e=>`could not change labels of ${e.task}; check the tracker profile's permission to edit issues and labels, then try again`,"task.labelGroup":e=>`"${e.label}" is a label group in Linear and cannot be put on ${e.task}; pick a label inside the group`,"task.pastBacklog":e=>`${e.task} is no longer in a backlog status`,"task.cannotMoveMilestone":e=>`the tracker of ${e.task} cannot change its milestone`,"tracker.noProject":e=>`no connected tracker serves the project ${e.project}`,"changelog.cannotList":e=>`changelog: the tracker of ${e.project} cannot list the tasks of a milestone`,"changelog.empty":e=>`changelog: ${e.milestone} has no done task to write a draft from`,"changelog.noAgent":e=>`changelog: the agent of the account ${e.project} runs on cannot write a draft`,"changelog.failed":e=>`changelog: the agent did not write the draft of ${e.project}`,"changelog.unnoticed":e=>`changelog: the agent found nothing a user would notice in the done tasks of ${e.milestone} (${l(e.tasks)}), so the section has no entry; if one of them changes something for users, say what in its closing comment, then press "Write again"`,"changelog.noDraft":e=>`changelog: ${e.milestone} has no draft yet`,"changelog.released":e=>`changelog: the section of ${e.milestone} is released as ${e.tag} and is not changed`,"changelog.nothingNew":e=>`changelog: every done task of ${e.milestone} is already in the draft`,"changelog.notOnBranch":e=>`changelog: the main checkout is on ${e.current||`a detached HEAD`}, not on ${e.branch}; the changelog is not written`,"changelog.dirty":e=>`changelog: ${e.file} has uncommitted changes in the main checkout; the changelog is not written`,"changelog.commitFailed":e=>`changelog: git could not commit ${e.file}`,"config.notJson":e=>`config: ${e.file} is not JSON`,"config.port":e=>`config: EVEN_KEEL_PORT must be an integer in 1..65535, got ${e.value}`,"server.rebindFailed":e=>`server: cannot listen on ${e.address} from .env, staying on ${e.current}`,"config.mcpPort":e=>`config: EVEN_KEEL_MCP_PORT must be an integer in 1..65535, got ${e.value}`,"config.branch":e=>`config: ${e.where} must be a branch name, got ${e.value}`,"config.changelogPath":e=>`config: ${e.where} must be a file path inside the repository, got ${e.value}`,"config.projects":()=>`config: projects must be a list of project records`,"config.projectEntry":e=>`config: ${e.where} must be an object with the project's id, key and repo`,"config.projectKey":e=>`config: ${e.where} must be a project key (a capital letter, then up to 4 capitals, digits or _), not ${e.value}`,"config.projectId":e=>`config: ${e.where} must be the project's id; Even Keel writes one into an entry that has none`,"config.projectTwice":e=>`config: the ${e.field} ${e.value} is given twice, at ${e.first} and at ${e.second}`,"config.version":e=>`config: version must be a whole number, not ${e.value}`,"storage.newer":e=>`storage: ${e.file} is from a newer version of Even Keel (schema ${e.version}, this one knows up to ${e.known}); put back its *.bak copy or update Even Keel`,"storage.damaged":e=>`storage: ${e.file} cannot be read, so nothing was migrated`,"storage.unknownProject":e=>`storage: ${e.file} names the project ${e.project}, which the config does not have, so nothing was migrated`,"storage.writeFailed":e=>`storage: could not write ${e.file}; the files written before it are put back from their copies`,"storage.newerDatabase":e=>`storage: the database ${e.file} is from a newer version of Even Keel (schema ${e.version}, this one knows up to ${e.known}); update Even Keel`,"storage.importFailed":e=>`storage: could not move the state files into ${e.file}; no database was made and the files are as they were`,"packages.unknown":e=>`packages: there is no package ${e.name}`,"packages.exists":e=>`packages: ${e.name} is already in the catalog`,"packages.busy":e=>`packages: ${e.name} is being installed; wait until it is done`,"packages.noMarketplace":e=>`packages: Claude Code knows no marketplace ${e.marketplace}`,"packages.noPlugin":e=>`packages: the marketplace ${e.marketplace} has no plugin ${e.plugin}`,"packages.installInClaude":e=>`packages: ${e.plugin} comes from outside its marketplace's folder; install it in Claude Code first (claude plugin install ${e.plugin}), then here`,"packages.copyFailed":e=>`packages: could not copy the plugin ${e.name}`,"packages.noSkills":()=>`packages: choose at least one skill`,"packages.unknownSkill":e=>`packages: there is no skill ${e.name} in ~/.claude/skills or the Codex skills folder`,"packages.npmFailed":e=>`packages: npm could not install ${e.spec}`,"huly.clientInstalling":()=>`huly: the Huly client is being installed, a minute or two; Huly projects wait for it`,"huly.clientFailed":()=>`huly: npm could not install the Huly client; Huly projects wait until it is retried`,"packages.marketplaceUpdate":e=>`packages: claude plugin marketplace update ${e.marketplace} failed`,"packages.marketplaceAdd":e=>`packages: claude plugin marketplace add could not add ${e.marketplace}`,"packages.noOwnMarketplace":e=>`packages: ${e.dir} has no .claude-plugin/marketplace.json`,"packages.upToDate":e=>`packages: ${e.name} is already the latest version`,"packages.updated":e=>`packages: ${e.name} is updated to ${e.version}; running tasks stay on the version they started with`,"packages.badServer":e=>`packages: the server ${e.name} needs either a command or a url`,"packages.badName":e=>`packages: ${e.name} is not a name for a server: letters, digits, - and _ only`,"packages.keyName":e=>`packages: ${e.name} is not a variable name`,"packages.keyValue":e=>`packages: the value of ${e.name} may hold neither a line break nor a single quote`,"packages.unknownKey":e=>`packages: no package or tracker reads ${e.name}`,"packages.port":e=>`packages: the MCP gateway cannot listen on 127.0.0.1:${e.port}, another program holds the port; set another EVEN_KEEL_MCP_PORT in Even Keel's .env`,"secrets.unknown":e=>`secrets: ${e.name} is not a credential the page sets`,"secrets.empty":e=>`secrets: the value of ${e.name} is empty; removing a variable is its own action`,"secrets.outer":e=>`secrets: ${e.name} comes from the service's environment, not .env; change it there`,"secrets.tokenRequired":()=>`secrets: EVEN_KEEL_TOKEN stays while the service listens beyond loopback (EVEN_KEEL_HOST)`,"secrets.settingsJson":()=>`secrets: the global settings.json is not a plain JSON object; Even Keel does not rewrite it`,"tally.mode":e=>`stats: "${e.value}" is not a place for the stats; it is off, local or server`,"tally.incomplete":e=>`stats: your own Postgres needs ${e.names}`,"tally.port":e=>`stats: the port ${e.value} is not a number from 1 to 65535`,"tally.unreachable":e=>`stats: ${e.address} did not let ${e.role} in`,"profiles.unknownKind":e=>`there is no tracker "${e.kind}"`,"profiles.unknown":()=>`there is no such profile; the page may be out of date`,"profiles.oauthAddress":()=>`Open Even Keel over HTTPS, or on localhost on the service machine, then connect MCP again.`,"profiles.oauthUnsupported":()=>`This tracker does not offer MCP OAuth in Even Keel.`,"profiles.oauthFailed":()=>`MCP OAuth did not complete. Check the connection and the selected account and site, then try Connect MCP through OAuth again.`,"profiles.oauthDenied":()=>`MCP access was not granted. Try Connect MCP through OAuth again and approve access.`,"profiles.oauthExpired":()=>`This MCP connection attempt expired or its profile fields changed. Connect MCP through OAuth again.`,"profiles.oauthReconnect":()=>`MCP access was revoked or expired. Edit the tracker profile and connect MCP through OAuth again.`,"profiles.mcpOtherAccount":e=>`MCP access was granted to ${e.grant}, while the tracker works as ${e.tracker}: sessions will write as another person. If that is not on purpose, connect again signed in with the right account.`,"profiles.incomplete":e=>`Fill in every field of the ${e.tracker} profile above.`,"profiles.refused":e=>`${e.tracker} refused the credentials`,"profiles.unreachable":e=>`${e.tracker} did not answer`,"profiles.isGitlab":e=>`${e.host} is GitLab: add a GitLab profile`,"profiles.hostLocked":e=>`${e.profile} is used by ${e.projects}; its address and workspace stay, only the credentials change`,"profiles.inUse":e=>`${e.profile} is used by ${e.projects}; it cannot be removed`,"profiles.otherTracker":e=>`${e.profile} is a profile of another tracker than ${e.project}'s`,"profiles.paused":e=>`${e.project}: the chain waits: the tracker refused the credentials of the profile ${e.profile}; renew them in Settings → Trackers and CI`,"config.repoEmpty":e=>`config: repository path for ${e.key} is empty`,"config.slot":e=>`config: ${e.key}.slot must be true, false or the number of slots`,"config.color":e=>`config: ${e.key}.color must be a whole number from 1 to 8`,"config.language":e=>`config: ${e.where}: there is no language ${e.value}, known: ${l(e.known)}`,"config.trackerName":e=>`config: ${e.where} must be the name of a tracker adapter`,"config.brief":e=>`config: ${e.where} must be true or false`,"config.briefValue":e=>`config: ${e.where} must be true, false or null`,"config.trackerUnknown":e=>`config: ${e.where}: there is no tracker "${e.name}", known: ${l(e.known)}`,"config.trackerProject":e=>`config: ${e.where} must name the project in its tracker, like "${e.example}"`,"config.notObject":e=>`config: ${e.where} must be an object`,"config.ruleKey":e=>`config: ${e.where}.${e.key} is not a chain rule`,"config.ruleList":e=>`config: ${e.where}.${e.key} must be a list of non-empty names`,"config.projectPrompt":e=>`config: ${e.where} must be text`,"config.projectName":e=>`config: ${e.where} must be text`,"config.provider":e=>`config: ${e.where}: there is no provider ${e.value}, known: ${l(e.known)}`,"config.providerKey":e=>`config: ${e.where}.${e.key} is not a provider, known: ${l(e.known)}`,"config.providerName":e=>`config: ${e.where} must be text`,"config.execution":e=>`config: execution.${e.provider}: there is no mode ${e.value}, known: ${l(e.known)}`,"config.cli":e=>`config: cli.${e.provider}: there is no choice ${e.value}, known: ${l(e.known)}`,"config.executionCli":e=>`config: execution.${e.provider}: ${e.mode} runs only on the checked CLI, set cli.${e.provider} to checked`,"config.trackerLocked":e=>`config: the chain has started tasks of ${e.key}, so its tracker and profile stay; tasks of another tracker come in through a task feed`,"config.feeds":e=>`config: ${e.where} must be a list of task feeds, each an object with its id, tracker and key`,"config.feedField":e=>`config: ${e.where} needs its ${e.field}`,"config.feedRules":e=>`config: ${e.where} must be an object of chain rules (${e.keys.join(`, `)}), each a list of names; active and terminal may be null`,"config.statusMoves":e=>`config: ${e.where} must be an object of status names: start and review a name or null, done a name`,"config.feedPrefix":e=>`config: a task feed of ${e.project} gives task ids ${e.prefix}-…, which ${e.other} gives too: give the feed another key`,"config.feedPlace":e=>`config: a task feed of ${e.project} reads the place in its tracker that ${e.other} reads, and a task would enter the chain twice`,"config.feedLocked":e=>`config: the chain has started tasks of the feed ${e.key} of ${e.project}, so it stays as it is; remove it and add another`,"config.commandKey":e=>`config: ${e.where}.${e.key} is not a kind of commands, known: ${l(e.known)}`,"config.commandList":e=>`config: ${e.where} must be a list of commands`,"config.ciKey":e=>`config: ${e.where}.${e.key} is not a CI setting, known: ${l(e.known)}`,"config.ciKinds":e=>`config: ${e.where} must be a list of CIs, known: ${l(e.known)}`,"config.ciWait":e=>`config: ${e.where} must be a whole number of minutes, 0 or more, or null`,"config.remoteProfiles":e=>`config: ${e.where} must map a remote's kind (${l(e.known)}) to a profile's id`,"config.standards":e=>`config: ${e.where} must be a list of { doc, files, except, shots }: a file path inside the repository, at least one mask, one entry per document`,"config.unknownProject":e=>`config: there is no project ${e.key}`,"config.unknownFeed":()=>`config: the project has no such task feed`,"config.writeFailed":e=>`config: could not write ${e.file}`,"config.statusBoth":e=>`config: ${e.project}: status "${e.status}" is both active and terminal`,"config.labelBoth":e=>`config: ${e.project}: label "${e.label}" is both required and excluded`,"config.milestoneBoth":e=>`config: ${e.project}: milestone "${e.milestone}" is both required and excluded`,"config.trackerProjectShared":e=>`config: ${e.project} and ${e.other} read the tracker project ${e.trackerProject}, and a task may enter both chains: split them by milestone (chain.requiredMilestones and chain.excludedMilestones)`,"config.keyElsewhere":e=>`config: ${e.project} and ${e.other} have the key ${e.key} on different repositories (${e.project} on ${e.trackerProject}), and the task ids of both would be the same: give one of them another key`,"config.modelPrompts":()=>`config: modelPrompts (Model prompts) must map a provider or provider | model pattern to a prompt; use * for any string`,"config.modelPromptEmpty":e=>`config: modelPrompts.${e.model} is empty`,"protection.fileConflict":()=>`Protection cannot write its rules: another file occupies their location. Rename that file, then retry the session`,"config.protection":e=>`Protection (${e.where}) must contain valid disabled groups and native deny rules`,"config.hiddenSkills":()=>`config: hiddenSkills must be a list of skill names`,"config.cacheTtl":e=>`config: cacheTtl ${e.value} must be "5m" or "1h", or left out`,"config.autoCompactWindow":e=>`config: autoCompactWindow ${e.value} must be a positive whole number of tokens, or null for the account's window`,"config.parallel":e=>`config: parallel must be a positive integer, got ${e.value}`,"config.keepWarm":e=>`config: keepWarm must be a whole number of hours from 0 to ${e.max}, got ${e.value}`,"config.mergeInto":e=>`config: ${e.project}.mergeInto names ${e.into}, which is not another project or merges into one itself`,"config.mergeIntoValue":e=>`config: ${e.where} must be a project key or null`,"config.intakeLabel":e=>`config: ${e.where} must be the name of a GitHub label or null`,"config.mergeIntoForeign":e=>`config: ${e.project}.mergeInto names ${e.into}, a checkout of another repository: they share no remote, and neither is a clone of the other`,"config.allowedHosts":()=>`config: allowedHosts must be a list of host names`,"config.updatesKey":e=>`config: updates.${e.key} is not an update setting, known: ${l(e.known)}`,"config.updatesDismissed":e=>`config: updates.dismissed must be a version such as 0.2.0, or null, got ${e.value}`,"updates.running":()=>`updates: an update is already under way`,"updates.none":()=>`updates: there is no newer release to update to`,"updates.noPrevious":()=>`updates: there is no previous version to go back to`,"updates.blocked":e=>`updates: ${f[e.reason]}`,"config.token":e=>`config: host ${e.host} is reachable from the network, so the page needs a token: set EVEN_KEEL_TOKEN in .env (16+ characters, e.g. the output of: node -e "console.log(crypto.randomBytes(24).toString('hex'))") and restart, or set host to 127.0.0.1`,"config.tokenShape":()=>`config: EVEN_KEEL_TOKEN must be 16+ characters of A-Z a-z 0-9 . _ ~ + / = -`,"config.modelPromptPlaceholder":e=>`config: modelPrompts.${e.model} has the substitution ${e.placeholder}, but a model prompt is passed on as it is`,"config.contextWindow":e=>`config: context.window must be a positive integer of tokens, got ${e.value}`,"config.contextPercents":()=>`config: context.warn and context.danger must be percents with 0 < warn < danger <= 100`,"config.compareKey":e=>`config: stats.compare.${e.key} is not a comparison setting`,"config.compareValue":e=>`config: stats.compare.${e.key} must be an integer in 1..${e.limit}, got ${e.value}`,"config.statsMove":e=>`config: stats.moves needs a non-empty old and new folder, got "${e.from}"`,"config.otherBelow":e=>`config: stats.otherBelow must be a number of dollars from 0, got ${e.value}`,"config.checkpointTokens":e=>`config: stats.checkpointTokens must be an integer number of tokens from ${e.from}, or null, got ${e.value}`,"config.checkpointShare":e=>`config: ${e.where} must be a whole percent of the context window, 1 to 100, got ${e.value}`,"config.checkpointShareKey":e=>`config: ${e.where}.${e.key} is not a checkpoint share, known: ${l(e.known)}`,"config.checkpointShareOrder":e=>`config: ${e.where} must go first < late < hard, got ${e.first}, ${e.late}, ${e.hard}`,"wizard.notRepo":e=>`${e.path} is not in a git repository`,"wizard.repoTaken":e=>`this repository is already the project ${e.project}`,"wizard.keyTaken":e=>`the key ${e.key} is already the project ${e.project} on another repository, and the task ids of both would be the same: pick another one`,"wizard.noBranch":e=>`the repository has no branch ${e.branch}, it has ${e.branches.join(`, `)}`,"wizard.noCommits":()=>`the repository has no commits yet, so its branch is not born: make the first commit`,"wizard.noFolder":e=>`${e.path} is not a folder`,"wizard.relativePath":e=>`${e.path} is not a full path: give the folder from its root, or from ~`,"wizard.keyShape":e=>`the key is a capital Latin letter, then up to 4 capitals, digits or _, not "${e.value}"`,"wizard.branchName":e=>`"${e.value}" is not a branch name`,"wizard.trackerPlace":e=>`name the project in the tracker like ${e.example}`,"wizard.trackerShared":e=>`${e.project} already takes the tasks of this tracker project, and each task would enter both chains: name the milestones this project takes in "Only tasks in milestones" below, and ${e.project} gives them up. Or pick another tracker project`,"wizard.entryFailed":()=>`the project cannot be added with these values`,"wizard.trackerOff":e=>`no ${e.tracker} profile with ${l(e.variables)}: add one with "Add profile" in the Profile list`,"wizard.trackerFailed":e=>`${e.tracker} did not give the project's tasks`,"project.removeBlocked":e=>`${e.project} is not removed, it is still in use`,"project.removeChain":()=>`its chain runs or waits in the queue; stop it first`,"project.removeSessions":e=>`live sessions: ${l(e.sessions)}`,"project.removePlaces":e=>`the chain holds the worktree or slot of ${l(e.tasks)}`,"project.removeLeftovers":e=>`the cleanup after Done left the place of ${l(e.tasks)}`};function m(e,t,n={}){return{code:e,params:t,...n}}function h(e){return{code:`text`,params:{text:e}}}var g=class extends Error{notice;constructor(e,t){super(x(e),t),this.notice=e}};function _(e,t,n={},r){return new g(m(e,t,n),r)}function v(e){return e instanceof g?e.notice:h(e instanceof Error?e.message:String(e))}function y(e){return typeof e==`string`?h(e):typeof e==`object`&&e&&Object.hasOwn(p,e.code)?e:h(JSON.stringify(e))}function b(e,t){let n=Object.hasOwn(t,e.code)?t[e.code]:void 0,r=n===void 0?e.code:n(e.params);e.cause!==void 0&&(r=w(r,b(e.cause,t))),e.items!==void 0&&e.items.length>0&&(r=`${r}:\n${e.items.map(e=>b(e,t)).join(`
2
+ `)}`);let i=e.detail?.replace(/^\s*\n/,``).trimEnd()??``;return i===``?r:w(r,i)}function x(e){return b(e,p)}function S(e,t){let n=e;for(let[e,r]of Object.entries(t))n.includes(e)&&(n=n.replaceAll(e,r));return n}function C(e,t){return e===t||e!==null&&t!==null&&JSON.stringify(e)===JSON.stringify(t)}function w(e,t){let n=/[.!?]$/.test(e)?``:`:`;return t.includes(`
3
+ `)?`${e}${n}\n${t}`:`${e}${n} ${t}`}var T=[`en`,`ru`];function E(e){return typeof e==`string`&&T.includes(e)}var D={checkingCli:`Checking for a CLI sign-in on this machine…`,existingCli:`This machine already has a CLI sign-in. Add it to Even Keel?`,useCli:`Use this sign-in`,removeGlobal:`Remove this account from Even Keel? Its CLI folder and sign-in stay on this machine.`,title:`New account`,titleOf:e=>`New ${e} account`,providerLead:`Whose account is it?`,ways:`How it signs in`,name:`Name (optional)`,key:{key:`API key`,token:`Token`},way:{claude:{subscription:{title:`Subscription`,gets:`Your Claude plan's 5-hour and weekly limits`,tip:`Signs in in a new folder through the Claude Code CLI: the active account doesn't change. Claude gives a link — open it, sign in with the account you need and paste the code from the page here.`,next:`Next: a link, the sign-in with the account you need, and the code from the sign-in page.`,rule:``,action:`Sign in with Claude`},apiKey:{title:`API key`,gets:`Pay per token, no plan limits`,tip:`A new folder with the key in its settings.json. Sessions on it pay per token: no 5-hour or weekly limits, no Remote Control, and a session that runs out of money waits until the key has credit again.`,next:`An Anthropic key, starting with sk-ant-.`,rule:``,action:`Check and add key`}},codex:{subscription:{title:`ChatGPT subscription`,gets:`Your ChatGPT plan's 5-hour and weekly limits`,tip:`Signs a new Codex account in with ChatGPT, in a folder of its own: Codex gives a link and a one-time code — open the link, sign in and enter the code there.`,next:`Next: a link and a one-time code — open the link, sign in and enter the code there.`,rule:`One free Codex account at most: OpenAI's terms do not allow several free accounts to get round the limits. Paid plans — as many as you need.`,action:`Sign in with ChatGPT`},apiKey:{title:`API key`,gets:`An OpenAI key, pay per token`,tip:`An OpenAI API key, in a new Codex folder's auth.json. Sessions on it pay per token under OpenAI's API terms, the one-free-account rule doesn't apply; a session that runs out of money stops like on any error.`,next:`An OpenAI key, starting with sk-.`,rule:``,action:`Check and add key`}},opencode:{chatgpt:{title:`ChatGPT`,gets:`The ChatGPT plan's limits: 5 hours and a week`,tip:`OpenCode signs in with ChatGPT in a new folder and spends your ChatGPT plan's limits — the same ones Codex spends on that account.`,next:`Next: a link and a one-time code — open the link, sign in and enter the code there.`,rule:``,action:`Sign in with ChatGPT`},free:{title:`Free models`,gets:`OpenCode Zen models: no sign-in`,tip:`OpenCode Zen's free models need no sign-in: the folder is added at once. There are fewer models to pick from, and OpenCode has a free usage limit of its own: Even Keel cannot see it ahead and learns of it only when a session hits it.`,next:`No sign-in: the folder is added at once.`,rule:``,action:`Add with free models`},apiKey:{title:`API key`,gets:`An Anthropic or OpenAI key, pay per token`,tip:`An Anthropic (sk-ant-…) or OpenAI API key, in a new OpenCode folder's auth.json: whose key it is, is told by its start. Sessions on it pay per token; name the model in the run profile, like anthropic/claude-sonnet-4-5.`,next:`An Anthropic (sk-ant-…) or OpenAI (sk-…) key.`,rule:`Claude through OpenCode — with a key only: Anthropic allows a Claude subscription only in Claude Code.`,action:`Check and add key`}},copilot:{machine:{title:`This machine's sign-in`,gets:`This machine's copilot login, added at once`,tip:`A new Copilot folder on the sign-in of copilot login on this machine. The CLI keeps that sign-in in the system's credential store, so every such folder is the same GitHub account; another account needs a token. Even Keel doesn't drive that sign-in or read its limits.`,next:`Run copilot login once in a terminal of this machine first — the folder is added at once on that sign-in.`,rule:`One free Copilot account at most, and no switching accounts to get round a budget: GitHub's terms allow one free account per person, plus a machine account for automation.`,action:`Add on this machine's sign-in`},token:{title:`Token`,gets:`Another GitHub account, its monthly allowance shown`,tip:`A fine-grained personal access token (github_pat_…) with the Copilot Requests permission, or an OAuth token (gho_…), in a new Copilot folder; a classic ghp_ token the CLI refuses. Sessions spend the AI credits of the account the token is of.`,next:`A github_pat_… personal token with the Copilot Requests permission, or a gho_… OAuth token.`,rule:``,action:`Check and add token`}}},rows:{open:`Open the sign-in page`,signIn:`Sign in with the account you need`,code:`Paste the code from the page here`,deviceCode:`Enter this code there`},picksUp:`This window picks up the end of the sign-in itself.`,otherAccount:`Sign in with another account`,outputBeforePlan:`CLI output: the sign-in, before the plan check`,discard:{title:`Discard what you entered?`,question:`The name and the key typed here are lost.`,confirm:`Discard`,cancel:`Keep editing`},stop:{title:`Cancel the sign-in?`,question:`The link and the code stop working, and the new account is not added.`,confirm:`Cancel sign-in`,cancel:`Go on signing in`}},O={title:`Shared settings`,hint:`Kept in the database of Even Keel and used by every project that has no value of its own; npm run storage -- config-export and config-import edit them as a file. They apply at once, except the marked ones.`,elsewhere:`The service's address and port are the variables EVEN_KEEL_HOST and EVEN_KEEL_PORT in .env; the tracker and CI profiles are on the Trackers and CI tab. A project is added with "+ Add project" on the home page.`,trackers:`Trackers and CI`,chain:`Chain`,rules:`Chain rules`,ruleScopes:`Whose rules`,allTrackers:`All trackers`,ownRules:`own rules`,sections:{run:`Running`,tasks:`Tasks`,agent:`Agent`,prompts:`Run labels and prompts`,tools:`Tools`,context:`Context`,interface:`Interface`,access:`Page access`,other:`Other`},parallel:`Chains at once`,parallelHint:`Other projects wait in the queue. Lowering it stops nothing: no new chain starts until fewer run.`,sessions:`Sessions`,claude:`Claude Code`,ci:`Check and CI`,ciNote:`For projects with no value of their own. The check commands, the commands after a green main, pull requests and the remote profiles are set per project.`,forProjects:`For projects that don't set their own.`,providerHint:`For projects that name none of their own. Used for tasks without a run label; with run labels on, a task labelled with another provider runs on that one.`,modelHint:`As it goes to the CLI: opus, gpt-6.1-sol. For projects and tasks that name none of their own. Empty — the CLI's default: for Claude Code the model of settings.json, which an editor may have just changed.`,accountHint:`For projects that name none of their own; also switched from the header, by moving Even Keel to another account on its card. One per provider, no rotation on a spent limit.`,execution:`Execution`,executionOf:e=>`Execution on ${e}`,executionHint:`Claude Code: how its sessions run. Auto — an API key account through the Agent SDK, a subscription on CLI --bg. With the Agent SDK a session outlives a restart of the service with its question open, and an answer or a chat message goes straight into it; it runs only on the Checked CLI version, so picking it switches the CLI version to Checked and locks it there; with EVEN_KEEL_CLAUDE_BIN sessions go on CLI --bg. Anthropic asks products built on the Agent SDK to sign in with an API key, not a claude.ai subscription: on a subscription it is your own call. On a subscription the Agent SDK also spends the 5-hour limit about twice as fast as CLI --bg and the weekly one about a quarter faster for the same work (measured by Even Keel; an open issue of Claude Code); an API key has no such penalty. Codex: in the sandbox — the automatic reviewer approves actions inside the Codex sandbox. Under the Windows service that sandbox does not start, and a session can neither edit files nor run commands; without it, a session does everything without limits on this machine. For every project; a change applies to new sessions.`,modes:{auto:`Auto`,bg:`CLI --bg`,sdk:`Agent SDK`,sandbox:`In the sandbox`,bypass:`Without the sandbox`},cli:`CLI version`,cliOf:e=>`CLI version of ${e}`,cliLocked:`Execution is Agent SDK, and the Agent SDK runs only on the checked copy: the version stays Checked until Execution changes.`,cliHint:`Yours — the CLI on this machine, on whatever version it updated itself to; nothing is downloaded. Checked — Even Keel downloads the version it was last checked against into its own folder, after asking, and runs sessions on it; until the download ends the chain waits. Claude Code sessions move to another version once no session of the account folder is live: a running daemon keeps its own. Saved with the form, for every project.`,cliCheck:`Check new CLI versions on this machine`,cliCheckHint:`When an agent's CLI releases a new version, and weekly on the checked one, Even Keel runs a short live check of it in the folder of the account the projects run on, on a cheap model. The check waits until the folder has no live session, and the folder's chains wait while it runs. The result shows at the top of the page. Spends the account's limits.`,modelLabelsHint:`For projects that don't set it. On — a task's label Claude | sonnet, Codex | gpt-6.1-sol or a bare Codex picks its session.`,promptHint:`Added to the prompt of every new session of every project and agent, before the project's own prompt, which adds to it rather than replaces it. Passed as written; Markdown is fine — models read it as they read CLAUDE.md.`,promptPlaceholder:`Answer in English. Run the tests before every commit.`,modelPrompts:`Model prompts`,modelPromptsHint:`Provider | model, e.g. Claude | sonnet* or * | *sonnet*. Only * is special: it matches any string. Case is ignored and spaces around | are trimmed. A bare Codex covers every Codex session, including its CLI default; a model pattern needs a known model. Every matching prompt is added in table order. Suggestions and matches come from the accounts’ model catalogues.`,promptModel:`Provider | model pattern`,promptNoMatches:`No known models match. Check the pattern or enter a matching model in Agent; this does not prevent saving.`,promptAnyId:`and any entered id matching the pattern (the catalogue is incomplete)`,promptText:`Prompt`,promptAdd:`A prompt for matching sessions`,none:`none`,language:`Page language`,languageAuto:`the browser's`,promptLanguage:`Language of session prompts`,languages:{en:`English`,ru:`Русский`},hiddenSkills:`Hidden skills`,hiddenSkillsHint:`While tool trimming is on, chain sessions get these skills only through /name. The list offers the skills recent sessions of the projects had; any other name may be typed.`,cacheTtl:`Prompt cache lifetime`,autoCompactWindow:`Auto-compaction window`,autoCompactWindowAccount:`account window`,autoCompactWindowHint:`Context window in tokens for Claude chain sessions only. Empty uses the account window. Applies to new sessions; running sessions keep their window. A project can override the shared value.`,cacheTtlAuto:`as Claude Code decides`,cacheTtl5m:`5 minutes`,cacheTtl1h:`1 hour`,cacheTtlHint:`For chain sessions, from the next launch. Claude Code writes the cache for 1 hour on a subscription within its limits and for 5 minutes on an API key. A 1-hour write costs more but survives a longer pause between turns.`,keepWarm:`Keep the cache of a waiting session warm, hours`,keepWarmHint:`While the current session of a chain waits for your answer, Even Keel asks a copy of it for one word shortly before its cache expires, so your answer does not pay for reading the whole context anew. The session itself gets nothing. Counted from its last answer; 0 turns it off. Each ping spends the account’s limits, and a missed cache stops the pings for that session.`,hiddenSkillsAdd:`Add a skill`,page:`Interface`,models:`Providers and models`,allowedHosts:`Other names of the page`,allowedHostsHint:`Names besides loopback and EVEN_KEEL_HOST the page may be reached by, such as a proxy name.`,allowedHostsAdd:`Add a name`,allowedHostsEmpty:`only this computer and the service’s own address`,updatesCheck:`Check for new versions`,updatesCheckHint:`Twice a day the service asks GitHub for the latest Even Keel release, without a token. Off — it never goes there.`,updatesNotify:`Notify about new versions`,updatesNotifyHint:`A notification in the corner of the page. Off — only the mark next to the version in the gear menu.`,context:`Context scale`,contextHint:`The warning and danger thresholds in percent of a session's context window, which its agent gives. The window in tokens stands in until it has.`,contextWindow:`Window`,contextWarn:`Warning, %`,contextDanger:`Danger, %`,stats:`Stats`,compare:`Before/after comparisons`,compareHint:`The minimum tasks, sessions and days on each side of a before/after comparison on /stats.`,minTasks:`Tasks`,minSessions:`Sessions`,days:`Days`,otherBelow:`Into Other when cheaper than, $`,otherBelowHint:`On /stats, a folder group that cost less than this in all goes into Other.`,contextHandoffs:`Handoffs by context size`,contextHandoffsHint:`On — past the checkpoint threshold the checkpoint plugin asks a chain session for a handoff note, and a fresh session goes on from it. Off — it never asks, and the agent compacts its context by itself; the chat messages, the check before the merge and handoffs on a limit stay. Applies to running sessions too.`,checkpointTokens:`Checkpoint threshold, tokens`,checkpointTokensHint:`The context size, from 100,000, at which the checkpoint plugin first asks a chain session for a handoff. Empty — by the calibration on /stats.`,checkpointTokensPlaceholder:`by the calibration`,checkpointShares:`Checkpoint thresholds, % of the window`,checkpointSharesHint:`The most of the session's context window each nudge of the checkpoint plugin may come at, whole percents with first < late < hard: the first nudge, the later ones, the hard threshold of a held task. A share only lowers the plugin's own threshold (250,000 late and 300,000 hard, or its variables), never raises it past them. A pinned threshold in tokens ignores the shares.`,shareFirst:`First`,shareLate:`Late`,shareHard:`Hard`,moves:`Moved folders`,movesHint:`Sessions in the old folder count under the new one.`,movesFrom:`Old path`,movesTo:`New path`},k={title:`Legend`,chain:`Task state`,head:`Top header`,project:`Project row`,tabs:`Side panel tabs`,task:`Task card`,priority:`Priority and card marks`,session:`Session strip`,open:`Select a task row to open its session. The title in the session panel opens the task card.`,samples:{action:`Reading files`,updated:`updated 16 s ago`},card:{number:`Position among the open tasks in the chain. Its colour shows priority, not session state.`,current:`The triangle replaces the position number on the current task.`,cache:`The cache ring replaces the current-task triangle, or fills an empty number slot. It shows how long the prompt cache stays warm; point at it for the time left.`,blockers:`Lock + count: tasks that must finish before this one. Point at the count to see them.`,dependents:`Key + count: tasks waiting for this one to finish. Point at the count to see them.`,model:`The agent and model selected by the task label.`,milestone:`Beside a milestone name: opens its release notes draft.`,forge:`The smiths mark an agent fixing the project branch or merging a release carry. They move while it works; the lamp beside the row key shows its state. Crossed hammers mark a finished fix.`,action:`Current session action. The filled part of this strip and its percentage show context used, not the task estimate.`,resets:`Number of context resets, including compactions and checkpoint handoffs. Point at it for the breakdown.`,context:`Share of the context window used. Amber and red warn that the session is nearing its context limit.`},signs:{queue:`The chains running now: blue — running, amber — paused, grey — none. +N — the projects queued after them. Opens the queue.`,account:`The active account, with its assigned colour. Red means sign-in is needed; blinking amber means sign-in is in progress. Opens Accounts.`,limit:`How much of a limit window is used, five hours or the week: amber from 80%, red at 100%; the time beside it is left until it resets.`,others:`Other accounts used by projects. Each ring shows its most-used limit window. Point at the header block for their names and limits.`,gear:`Settings, tools and the state of the service; its dot is amber or red when a check warns or fails.`,waiting:`How many sessions wait for a reply.`,menu:`Stats, the queue, the accounts, settings, tools and the state of the service; its dot is amber or red when a check warns or fails or the account needs a sign-in.`,bars:`The two lines along the bottom of the header: the five-hour limit at the left, the weekly one at the right; amber from 80%, red at 100%.`,questions:`Tasks labelled Question that wait for an answer; opens the session of the first one.`,read:`Reads the project's tasks from the tracker now; it is read every 30 seconds anyway. Beside it — when it was last read.`,ci:`The CI on the main branch: green — passed, blue — running, red — failed, amber — stuck. Opens its runs.`,backlog:`The tasks the chain does not take yet and their count. Opens the backlog.`,settings:`The project's settings. They apply at once, with no restart: the project's next session gets them.`,help:`Opens this legend. The question count in the project row is a separate control.`}},ee={removeFile:e=>`Remove ${e}`,other:`Other`,otherPlaceholder:`Your own answer…`,unanswered:e=>`Left to answer: ${e}`,unsaved:`Claude Code saves the message with this question only once it is answered. A reply from here resumes the session without it, with the question and your answer; a reply through Remote Control keeps it.`,sent:`The reply is sent — the session goes on with it.`,working:`You can send once the session stops. A message mid-turn needs the checkpoint@even-keel package in the project (Tools) and reaches the session from its next tool call.`,mailbox:`The session is working: the message reaches it mid-turn, at its next tool call or at the end of the turn.`,steers:`The session is working: the message goes straight in, and it reads it once its current tool call ends.`,mail:{waiting:`Waits for the hook`,queued:`In the session · it reads it once the current tool call ends`,delivered:(e,t)=>`Delivered ${e} · ${t}`,events:{PreToolUse:`before a tool call`,PostToolUse:`after a tool call`,Stop:`at the end of the turn`,AskUserQuestion:`in place of a question`,resume:`by resuming the session`},returned:{asked:`Came back: the session asked a question while the message was on its way. Send it as the answer or dismiss it.`,gone:`Came back: the session stopped before it took the message. Send it again or dismiss it.`,closed:`Came back: the task is already closed, so the session did not get it. Put what it asks into a new task, then dismiss it.`},reply:`As the answer`,dismiss:`Dismiss`},commands:{menu:`Commands`,filter:`Type to filter`},thinking:`Thinking`,running:e=>`Running: ${e}`,delivering:`Delivering the answer, the session is starting up`,finished:`The session has finished — it cannot be replied to.`,limit:`The session hit a limit — Even Keel resumes it by itself.`,error:`The session stopped on an API error. Send a reply to resume it.`,dialog:e=>`The session waits for ${e}. Answer it through Remote Control.`,aside:`The fix of main leads the chain. You can reply from the chat once it lands; until then — through Remote Control.`,question:`Question`,pending:`waits for a reply`,of:(e,t)=>`${e} of ${t}`,previous:`Previous question`,nextQuestion:`Next question`,skip:`Skip`,next:`Next`,submit:`Submit`},A=new Map;function j(e,t,n){let r=A.get(e);return r===void 0&&(r=new Intl.PluralRules(e),A.set(e,r)),n[r.select(t)]??n.other}var M=(e,t)=>n=>j(`en`,n,{one:e,other:t}),N=(e,t)=>n=>`${n} ${M(e,t)(n)}`,te=e=>{let t=e.filter(e=>e!==``).join(`, `);return t.charAt(0).toUpperCase()+t.slice(1)},ne={launches:{launch:`Chain launch`,restart:`Restart`,checkpoint:`From a checkpoint`,manual:`Started by hand`},relayed:{limit:`New after the limit`,credit:`New after the key ran out of credit`,mainFixed:`New after main was fixed`,review:`New after the pull request feedback`,returned:`New after the task came back`,unblocked:`New after the blockers closed`,unskipped:`New after Skip was undone`},replaced:{restart:`replaced by hand`,checkpoint:`set a checkpoint`},replacedRelay:{limit:`hit the usage limit`,credit:`the key ran out of credit`,mainFixed:`replaced after main was fixed`,review:`replaced after the pull request feedback`,returned:`replaced after the task came back`,unblocked:`replaced after the blockers closed`,unskipped:`replaced after Skip was undone`},remote:{starting:`Remote Control is starting — the link comes in a couple of seconds.`,disabled:`Remote Control is off: /config of the account folder has no “remoteControlAtStartup”.`,"no-bridge":`The session didn't start Remote Control — it can't be opened from here.`,lost:`Remote Control dropped — can't be opened from the phone. If the task isn't done — “New session”.`,"api-key":`No Remote Control on an API key: it needs a claude.ai sign-in. Answer the session from the chat here or in the tracker.`},panel:e=>`Session of task ${e}`,closePanel:`Close the panel`,skipped:`skipped`,none:`No session for this task yet.`,noneNow:`No live session of this task is seen now; its sessions are below.`,onlyIn:e=>`\nRemote Control shows it only in account ${e}`,openRemote:`Open the session through Remote Control`,openPull:e=>`Open pull request #${e} of the task in a new tab`,restartTitle:`Stops this session and starts a new one in the same working folder with a handoff. The tracker status doesn't change.`,restart:`New session`,skippedTitle:`The task is skipped — the chain won't take it until you restore it.`,skipCurrent:`The chain stops waiting for the task and takes the next one. The tracker status and the session don't change.`,skipOther:`The chain won't take the task until you restore it. The tracker status doesn't change.`,skipFix:`The chain stops waiting for the fix and goes on with the tasks; the next red main starts a new fix. The session does not change.`,skipCarry:`The chain stops waiting for the carry and goes on with the tasks; the conflict waits on the release project’s page. The session does not change.`,interrupted:`stopped until main is fixed`,skip:`Skip`,silent:(e,t,n)=>`Silent for ${e}. New session — with confirmation from ${t}, on its own at ${n}.`,confirmSilent:e=>`The session has written nothing since ${e}. Interrupt the turn and start a new session?`,interruptRestart:`Interrupt and start new`,held:{launching:`Not yet: the session is still starting. Available once it is up and has finished its turn.`,replacing:`Not yet: the session is being replaced. Available once the new one is up and has finished its turn.`,midTurn:`The turn is still running. New session is also possible after five quiet minutes, with confirmation; Skip waits for the turn to end.`,noSession:`Not yet: the task has no live session. Available once the chain starts one.`,notCurrent:`Not yet: the chain is not on this task. Available once the chain takes it and starts its session.`,skipped:`The task is skipped: restore it, and the button is available once the chain takes it and starts its session.`},start:{title:{launch:`Starting a session`,handover:`Handing the task over`,boot:`Session booting`,answer:`Session thinking`},text:{launch:`Preparing the working copy and starting the agent.`,handover:`The old session stops, the new one starts with a handoff.`,boot:`The agent is coming up: settings, plugins, MCP servers.`,answer:`The session is up and working on its first answer.`},steps:[`Prepare`,`Boot`,`First answer`]},account:e=>`Account: ${e}`,waits:e=>`Waiting for ${e}`,startupDialog:e=>`The session hangs on a Claude Code dialog before its first turn, and nobody answers it in the background: ${e}. Remove the cause and press "New session".`,hung:e=>`The turn has written nothing since ${e} while its process lives on: it is taken for hung. Write to the session or press "New session" — either stops the turn first.`,session:`Session`,time:`Time`,cache:`Cache`,context:`Context`,startedAt:`started`,lifetime:`lifetime`,tokens:`Tokens`,input:`input`,output:`output`,cacheRead:`cache read`,cacheWrite:`cache write`,model:`Model`,provider:`provider`,modelOf:`model`,modelFrom:`By the session's last answer in its transcript`,modelYet:`The session has not answered yet: the model shows from its first answer`,limitUnknown:`The limit reset time is unknown. Changing the task’s account starts a new session.`,limitGuide:`How to start sooner`,limitAccount:(e,t)=>`Changing the task’s account starts it sooner. ${e} account “${t}”. Change this provider’s account in the project’s pool (shared or own) under Project settings → Sessions, or change the task’s provider label.`,limitEvent:`Open the session to see the affected account and how to change its project pool.`,creditEmpty:`out of credit`,spendEmpty:`spending limit`,spendUntil:e=>e===null?`API spending limit reached`:`API spending limit until ${e}`,spendWait:e=>`${e===null?`The API spending limit reset time is unknown.`:`The API spending limit resets at ${e}.`} The dispatcher checks the key every 5 minutes and continues sooner if the limit is raised.`,creditOut:`The API key is out of credit. The dispatcher checks it every 5 minutes and goes on once it is topped up.`,limitResume:e=>`After the limit resets at ${e} the dispatcher continues this session — the cache will still be warm.`,limitRelay:e=>`After the limit resets at ${e} the dispatcher starts a new session in the same working folder.`,list:`Sessions of the task`,compacted:e=>` · compactions: ${e}`,resumed:e=>` · resumed after the limit${e>1?` ×${e}`:``}`,answered:e=>` · answered${e>1?` ×${e}`:``}`,current:`now`,postponed:e=>`postponed: waits for ${e}`,dialog:e=>`Session ${e}`,closeDialog:`Close the session window`,notFound:`The transcript of this session is not found.`,started:`Started`,lastTurn:`Last turn`,worked:`Worked`,endContext:`Context at the end`,place:`Branch and folder`,feed:`Activity`,feedEmpty:`The session hasn't done anything yet.`,feedOpens:{transcript:`Activity. Press to open the whole transcript`,chat:`Activity. Press to open the chat`},transcriptTitle:`Transcript`,transcriptDialog:e=>`Transcript of session ${e}`,closeTranscript:`Close the transcript`,showMore:`Show more`,showLess:`Show less`,chat:{open:`Chat`,title:`Chat`,picture:`Picture`,openPicture:e=>`Open ${e}`,share:{title:`Files from the session`,download:e=>`Download ${e}`,gone:`no longer there`,goneTip:`The file is no longer there — its worktree was cleaned up — or it lies outside the session’s folders`},waiting:`The session waits for a reply — open the chat`,idle:`Open the chat with the session`,placeholder:`Reply to the session… Enter to send, Shift+Enter for a new line`,touchPlaceholder:`Reply to the session…`,send:`Send`,attach:`Attach files`,drop:`Drop the files to attach them`,tools:{read:`Read`,edit:`Edited`,write:`Wrote`,search:`Searched`,ran:`Ran a command`,summary:e=>te([e.edit===0?``:`edited ${e.edit===1?`a file`:N(`file`,`files`)(e.edit)}`,e.read===0?``:`read ${e.read===1?`a file`:N(`file`,`files`)(e.read)}`,e.search===0?``:`searched${e.search===1?``:` ${e.search} times`}`,e.run===0?``:`ran ${e.run===1?`a command`:N(`command`,`commands`)(e.run)}`,e.other===0?``:`used ${e.other===1?`a tool`:N(`tool`,`tools`)(e.other)}`]),failed:e=>`(${e} failed)`,failure:`failed`,interrupted:`cut off by the end of the turn`,size:(e,t)=>`${e} ${M(`line`,`lines`)(e)} added, ${t} removed`},head:{branch:e=>`Branch ${e}`,edits:(e,t)=>`Edits of the session: +${e} −${t} lines`},...ee}},re={forgejo:`Forgejo Actions`,github:`GitHub Actions`,gitlab:`GitLab CI`},ie={chip:`CI`,title:e=>`CI: ${e}. Click to open the runs`,panel:`Project CI`,levels:{error:`the API is not answering`,stuck:`runs are not taken`,failure:`red`,off:`no token`,running:`running`,success:`green`,idle:`no runs`},kinds:re,api:{ok:`API answers`,error:`API is not answering`,off:`not connected`},checked:e=>`checked ${e}`,allRuns:`All runs`,openRun:`Open the run`,stuckRun:e=>`The run has been queued for ${e}: no runner takes it`,stuckPush:(e,t)=>`The push ${e} has had no run for ${t}: the CI did not pick it up`,pushed:e=>`Push ${e}: waiting for a run`,usual:e=>`usually ${e}`,took:e=>`took ${e}`,progress:(e,t)=>`Running ${e}, a run usually takes ${t}`,same:e=>`same commit · ${e}`,sameTitle:`Ran the same commit to the same end as the CI above. Click to open`,tasks:`Tasks of the push`,fixTask:`fix of main`,fixTaskTitle:`The row of this fix in the chain archive`,jobs:`Jobs`,noJobs:`No jobs yet`,stepsOnPage:`Steps are on the run page`,history:`History`,showAll:e=>`Show all ${e}`,noRuns:`No runs yet`,status:{queued:`queued`,running:`running`,success:`green`,failure:`red`,cancelled:`cancelled`,skipped:`skipped`}},ae={title:`Tracker and CI profiles`,hint:`A project runs on a profile of its tracker. The default tracker profile also goes to sessions started by hand (the env of ~/.claude/settings.json) and to the GitHub Actions CI of other trackers' projects. A Forgejo CI takes the Forgejo profile on its remote's host, a GitLab CI the GitLab profile of its server.`,none:`No profiles: without one the chain does not read the tracker's tasks.`,add:`Add profile`,addGitlab:`Add GitLab profile`,isDefault:`default`,makeDefault:`Make default`,edit:`Edit`,rules:`Rules`,remove:`Remove`,states:{unchecked:`not checked`,checking:`checking`,ok:`signed in`,refused:`refused`,unreachable:`no answer`},expires:e=>e<=0?`token expired`:`expires in ${e} d`,login:e=>`Signed in as ${e}`,projects:e=>`Projects: ${e}`,noProjects:`No projects on it`,ci:e=>`CI: ${e}`,noCi:`No project's remote is on its host`,ciHidden:`CI hidden`,hiddenCi:(e,t)=>t===`forgejo`?`Forgejo CI not shown (${e}): the token does not see the repository or its Actions, it needs read:repository`:t===`gitlab`?`GitLab CI not shown (${e}): the token does not reach the project's pipelines, check its api scope and project access`:`GitHub Actions not shown (${e}): the token does not reach the repository's Actions, it needs Actions: Read`,kindHint:{huly:`An own Huly server or the cloud`,github:`Issues and Actions on github.com`,linear:`A Linear workspace`,gitlab:`Issues and CI on GitLab.com or your own server`,jira:`Issues on a Jira Cloud site`,forgejo:`The CI of an own Forgejo server, no tracker`},pullsRefused:`PR refused`,rulesOf:e=>`Rules: ${e}`,rulesFor:e=>`Projects on this profile: ${e}.`,rulesNoProjects:`No project runs on this profile yet.`,moves:{title:`Statuses on actions`,hint:`Where Even Keel moves a task by itself. Only forward: on start a task in a to-do status, on a pull request any open one. A status out of the chain is not offered.`,start:`On task start`,startHint:`When the chain starts a session on the task.`,review:`On pull request`,reviewHint:`Works when the project has pull request mode on.`,done:`On task completion`,doneHint:`When the task's branch is merged. Only a status the chain rules take for done.`,leave:`leave as is`,auto:`automatic`,asProfile:e=>`as in the profile (${e})`,loading:`Reading the tracker's statuses…`,unread:`The tracker's statuses were not read: the lists hold only what is chosen.`,missing:e=>`${e} (not in the tracker)`,missingNote:`The move would fail: pick another status`,missingShort:`Pick another status`,sourceHint:e=>`The source's own value goes over the profile "${e}".`,stepTitle:`Task statuses`,stepHint:e=>`Where Even Keel moves a task on its start, on its pull request and on its completion. Set it now or later: Settings → Chain rules → ${e}.`,stepUnread:`The tracker's statuses were not read — set them later in the profile's chain rules.`,save:`Save`,skip:`Skip`},rulesHint:`The rules of the projects on this profile: every tracker names its statuses and labels its own way. A list the profile does not change stays the shared one; a list one row of it changes is the profile's whole, and a project's own goes over it. The project's milestones are set on its Tracker tab and in the shared settings.`,deniedPulls:(e,t)=>t===`forgejo`?`A pull request was not opened (${e}): the token lacks write:repository`:t===`gitlab`?`A merge request was not opened (${e}): the token lacks the api scope or Developer access to the project`:`A pull request was not opened (${e}): the token lacks Pull requests: Read and write`,rightsIntro:{huly:`A separate account with access to the projects: its e-mail and password, or a token if your Huly's account settings have an API tokens page.`,github:`A fine-grained token for the repositories' owner.`,linear:`A personal API key.`,gitlab:`A personal access token with the api scope. Leave the address empty for GitLab.com.`,jira:`The site address, the e-mail of an Atlassian account that sees the projects and its API token.`,forgejo:`The server's address and a token. A CI and pull requests take the profile whose host is their remote's.`},rightsUse:{tracker:`Tracker`,ci:`CI`,pullRequests:`Pull requests`},rights:{huly:{tracker:`reading and writing the projects' issues`},github:{tracker:`Issues — Read and write`,ci:`Actions — Read`,pullRequests:`Pull requests — Read and write, Contents — Read, Actions — Read`},linear:{tracker:`write access`},gitlab:{tracker:`api scope (reading and writing issues)`,ci:`api scope, with access to the project and its pipelines`,pullRequests:`api scope, Developer access or above (opening a merge request, reading its discussions and the project members)`},jira:{tracker:`Browse projects, Add comments, Transition issues and Edit issues in the projects; a token with scopes: read:jira-work, write:jira-work, read:jira-user`},forgejo:{ci:`read:repository (the repositories and their Actions), read:user (the sign-in check)`,pullRequests:`write:repository (opening a pull request, reading its reviews and its reviewers' access), read:issue (comments in the pull request's conversation), read:user; the account must be an admin of the repository for reviewers other than itself and the owner to count`}},pushedByGit:`PR mode pushes the branch with git, on the credentials of the account the service runs as, not with this token.`,howTo:`Where to get it`,createMcpToken:`Create an Atlassian MCP V2 token`,mcp:{title:`MCP for sessions`,hint:`Choose one way: OAuth or a token. While OAuth is connected, the MCP token is not used. Even Keel refreshes OAuth access automatically; connect again only if the profile asks you to.`,fallback:`Or use a token`,sharedToken:`Sessions use the same token as the tracker, entered above.`,checked:`MCP OAuth checked`,discard:`MCP access has not been saved and will be lost. Close without saving?`,connect:`Connect MCP through OAuth`,again:`Connect again`,waiting:`Waiting for consent in the opened window…`,blocked:`The browser blocked the consent window: allow pop-ups for this page and try again.`,ready:`MCP access granted but not saved. Press “Check and save”. Without saving it will be lost; the attempt lasts 10 minutes from opening the consent window.`,connected:`MCP: connected through OAuth`,revoked:`MCP access was revoked or expired: connect again.`,revokedChip:`MCP: reconnect needed`,disconnect:`Disconnect`,dropped:`MCP access is removed on saving; sessions go on the profile's MCP token, if there is one.`,keep:`Keep it`,cancel:`Cancel`,noSite:`No Atlassian account or Jira site yet?`,newSite:`Create a free Jira site`},fieldLabels:{JIRA_MCP_TOKEN:`Atlassian MCP V2 token (optional)`},signIn:`Sign-in`,alternative:{HULY_TOKEN:`Token`,HULY_EMAIL:`E-mail and password`},name:`Profile name`,nameHint:`Filled in from the tracker's answer; can be changed.`,kept:`saved`,unfilled:e=>`Fill in first: ${new Intl.ListFormat(`en`,{type:`conjunction`}).format(e.map(e=>`“${e}”`))}.`,hostLocked:`Fixed while projects use the profile`,fieldHints:{HULY_URL:`The address of the Huly server, as you open it in the browser.`,HULY_WORKSPACE:`The name of the Huly workspace the projects are in.`,HULY_TOKEN:`A token of the Huly account from its settings, instead of the e-mail and password.`,HULY_EMAIL:`The e-mail of a separate Huly account that sees the projects.`,HULY_PASSWORD:`The password of that Huly account.`,GITHUB_TOKEN:`A fine-grained token for the repositories’ owner, with the rights of each use listed above.`,LINEAR_TOKEN:`A personal Linear API key with write access.`,GITLAB_URL:`The GitLab web address, without /api/v4. Empty means https://gitlab.com.`,GITLAB_TOKEN:`A personal access token with the api scope; read_api cannot close issues or post comments.`,JIRA_URL:`The address of the Jira Cloud site, https://<site>.atlassian.net, without a path.`,JIRA_EMAIL:`The e-mail of the Atlassian account the token belongs to.`,JIRA_TOKEN:`An API token of that account, classic or with scopes.`,JIRA_MCP_TOKEN:`Only for the Jira plugin. Enable API token authentication for the Atlassian MCP server in the organization settings first, then create a separate Atlassian MCP V2 token with all scopes. The REST token does not work here.`,FORGEJO_URL:`The address of the Forgejo server, as you open it in the browser.`,FORGEJO_TOKEN:`An access token with the rights of each use listed above.`},examples:{HULY_URL:`https://huly.example.com`,HULY_WORKSPACE:`example-workspace`,HULY_EMAIL:`john.doe@example.com`,FORGEJO_URL:`https://forgejo.example.com`,GITLAB_URL:`https://gitlab.com`,JIRA_URL:`https://example.atlassian.net`,JIRA_EMAIL:`john.doe@example.com`},check:`Check`,checking:`Checking…`,duplicate:e=>`The same account is already in the profile "${e}"`,save:`Check and save`,editTitle:e=>`Profile ${e}`,field:`Profile`,fieldHint:`The tracker account the project runs on: its tasks, the sessions' comments and the CI token.`,byDefault:e=>`${e} (default)`},oe=/^(answer|chain|changelog|claude|config|storage|sync|vscode): /,se=Object.fromEntries(Object.entries(p).map(([e,t])=>[e,e=>ce(t(e))]));function ce(e){return e.replace(oe,``).replace(/^codex: /,`Codex: `)}var le={limit:e=>`${e}: the chain stopped on the usage limit`,limitBody:`Switch the account or wait for the reset.`,red:e=>`${e}: main is red`,redBody:(e,t)=>`${t?`${t} at`:`At`} ${e}; the next task waits until main is green again.`,ciRed:(e,t)=>`${e}: ${t} is red`,ciRedBody:e=>`At ${e}; this CI does not decide whether the chain continues.`,ask:e=>`${e} asks a question`,askBody:`Answer it in the session’s chat window.`,conflict:(e,t)=>`${e}: the carry into ${t} hit a conflict`,conflictBody:`Merge it by hand or press “Resolve with the agent” on the project’s page.`,uncommitted:e=>`${e}: the work is done but not committed`,unmerged:e=>`${e}: the work is committed but not merged`,workBody:e=>`The task left the chain and its work is in ${e}.`,open:`Open`,close:`Close`},ue=(e,t)=>n=>`${n} ${j(`en`,n,{one:e,other:t})}`,de={warnings:ue(`warning`,`warnings`),cleanupSummary:e=>`Cleanup: ${e}`,dismissAll:`Done for all`,leftover:e=>`${e} is closed, but not everything after it went through — check by hand.`,dismiss:`Done`,forwardWaits:(e,t)=>`${ue(`commit`,`commits`)(e)} of this project ${e===1?`waits`:`wait`} to go into ${t}.`,forwardPushFailed:e=>`The release branch went into ${e}, but its push failed; the next sync pushes it.`,forwardNow:`Carry now`,forwardConflict:(e,t,n,r)=>`${ue(`commit`,`commits`)(e)} of ${t} conflict${e===1?`s`:``} with ${n} in ${ue(`file`,`files`)(r)}`,forwardResolve:`Resolve with the agent`,forwardMore:`Details`,forwardAgent:e=>`The agent resolves the conflict in the chain of ${e}`,forwardAgentAsked:e=>`The agent resolves the conflict after the current task of ${e}`,forwardAgentOpen:`Open`},fe=(e,t)=>n=>j(`en`,n,{one:e,other:t}),P=(e,t)=>n=>`${n} ${fe(e,t)(n)}`,pe=P(`launch`,`launches`),F=P(`task`,`tasks`),me=P(`fix`,`fixes`),he=e=>e===null?`Fix of main`:`Fix of main: ${e}`,ge={github:`Repository on GitHub`,gitlab:`Project on GitLab`},_e={notice:se,common:{close:`Close`,retry:`Retry`,cancel:`Cancel`,hide:`Hide`,apply:`Apply`,open:`Open`,remove:`Remove`,restore:`Restore`,total:`Total`,max:`Max`,noData:`no data`,reading:`Reading the transcript…`,copyCommand:`Copy the command`,commandCopied:`Copied`},units:{day:`d`,days:`d`,hour:`h`,minute:`min`,minuteShort:`m`,second:`s`,percent:e=>`${e}%`},time:{justNow:`just now`,ago:e=>`${e} ago`,since:`since`},app:{connecting:`Connecting…`,noServer:`No connection to the Even Keel server.`,blocked:e=>`Even Keel started nothing and wrote nothing. ${e}`},header:{nav:`Navigation`,stats:`Stats`,tools:`Tools`,settings:`Settings`,menu:`Menu`,gear:e=>`Settings and status: ${e}`},updates:{version:e=>`Even Keel ${e}`,available:e=>`${e} available`,availableTitle:`Open the release on GitHub`,toastTitle:e=>`Version ${e} is available`,toastBody:e=>`Installed: ${e}. Open the release notes on GitHub.`,mute:`Don't show again`,close:`Close`,open:`Update…`,openTitle:`What changes, and the update button`,back:e=>`back to ${e}`,windowTitle:`Update Even Keel`,installed:`Installed`,latest:`Latest release`,upToDate:`The latest release is installed.`,changes:`What changes`,noNotes:`The release has no description.`,onGithub:`On GitHub`,reverted:`A revert release`,revertedBody:`It brings back what an earlier release changed:`,update:e=>`Update to ${e}`,updateHint:e=>`The service waits until no chain is in a launch, a handover or a closing, stops, ${e===`npm`?`installs the release with npm`:`checks out the release tag, installs and builds it`} and starts again; the page reloads by itself. If the new version does not come up, the one running now comes back.`,blocked:{global:`No button: the npm package is not a global install, so its folder may go. Install it with npm install --global even-keel.`,service:`No button: Even Keel does not run as a service here (npm start), so nothing would start it again. Update by hand, as in the README.`,git:`No button: the folder of Even Keel is not a git checkout. Update by hand, as in the README.`,dirty:`No button: the checkout has uncommitted changes. Commit or drop them, or update by hand.`,tag:`No button: the checkout is not on the release tag of the installed version — a developer's copy, or one a CI builds. It updates the way it was set up to.`,checking:`Reading the checkout…`},previous:`Previous version`,revert:e=>`Revert to ${e}`,revertHint:e=>`Brings back ${e}, the version this one was updated from, the same way an update goes.`,revertStorage:e=>`No button: this version moved the storage to a new format, which ${e} cannot read. Going back is only from the .bak copies, and everything written since the update is lost — the steps are in docs/guide/setup.md, "Going back". Better wait for a revert release.`,progressSettling:(e,t,n)=>`${e===`update`?`Updating to`:`Reverting to`} ${t}: waiting for ${n.join(`, `)}`,progressRunning:(e,t)=>`${e===`update`?`Updating to`:`Reverting to`} ${t}…`,progressBody:`The service restarts; the page reloads by itself.`,resultDone:(e,t)=>`${e===`update`?`Updated to`:`Reverted to`} ${t}`,resultFailed:(e,t)=>`The ${e===`update`?`update`:`revert`} to ${t} failed`,resultBody:(e,t,n,r)=>t===`done`?`At “${e}”. ${n} is back.`:t===`failed`?`At “${e}”. Bringing ${n} back failed too, at “${r}”: see logs/update.log.`:`At “${e}”.`,resultDoneBody:e=>`The previous version is ${e}.`,steps:{settle:`waiting for the chains`,stop:`stopping the service`,fetch:`fetching the tags`,checkout:`checking out the release`,restore:`checking out the previous commit`,install:`installing dependencies`,build:`building`,start:`starting the service`,answer:`the service answering`,launch:`starting the update process`},details:`Details`,output:`Output`,log:`The whole log is logs/update.log in the folder of Even Keel.`},fallback:{toastTitle:e=>`${e} ran without its run label`,close:`Close`},toast:{region:`Notifications`},events:le,fix:{project:`Open the project’s settings`,shared:`Open the setting`,trackers:`Open Settings → Trackers and CI`,page:`Open Settings → Interface`,accounts:`Open Accounts`,moves:`Open the statuses on actions`,resume:`Check again and resume`,packages:`Open the project’s packages`,git:`Open the Git step`},banner:{config:e=>`The settings are not applied, the last valid ones are in use: ${e}`,stale:`The data is stale: no connection to the server, reconnecting.`,usageUnread:e=>`Limits from /usage can't be read — showing the latest from the statusline, the CLI may have changed the format. Reason: ${e}`,usageOff:e=>`/usage polling is off until the service restarts: the answer looks like a model turn, and that spends quota. Reason: ${e}`,limitHold:e=>`Usage limit reached — the next task starts after the reset at ${e}.`,ciHold:(e,t)=>`Waiting for the CI of main on ${e} since ${t} — the next task starts when it is green.`,checkHold:(e,t)=>`Checking main at ${e} since ${t} in the next task's folder — the task starts when the check passes.`,afterGreenHold:(e,t)=>`Running the commands after the green main at ${e} since ${t} — the next task starts when they end.`,remoteFixHold:(e,t,n)=>`Main of the remote is red at ${e}; ${n} has been fixing it since ${t} — the next task starts when its fix is green.`,gateway:e=>`The chains wait: the MCP gateway does not run — ${e}`,closingHold:e=>`${e} is done — the next task starts once its session ends its turn and its folder is cleaned up.`,gatewayHold:`The next task waits for the MCP gateway, which does not run: the banner above says why.`,packagesHold:e=>`The next task waits for its packages: ${e} — it starts once they answer.`,packagesSilentHold:e=>`The next task waits for its packages: ${e}. They are asked again in half a minute, then less often up to once an hour; check their command and settings.`,unattended:`Unattended mode is on: sessions ask no questions. Turn it off in Settings → Chain.`,cliOne:(e,t,n)=>`${e} ${t} · checked ${n}`,cliDaemon:(e,t,n,r)=>`The ${e} daemon of ${t} runs ${n} · checked ${r}`,cliMany:e=>`${e} CLIs on versions Even Keel was not checked against`,cliDetails:`Details`},limits:{fiveHour:`5 hours`,fiveHourTitle:`5-hour limit`,week:`Week`,weekTitle:`Weekly limit`,month:`Month`,monthTitle:`Monthly limit`,short:{fiveHour:`5 h`,sevenDay:`wk`,month:`mo`},sources:{usage:`from /usage`,statusline:`from the statusline`,sdk:`from an SDK session`,api:`from the provider's API`},noData:`no data`,left:e=>`${e} left`,used:e=>`${e} used`,leftShort:e=>`${e} left`,usedShort:e=>`${e} used`,empty:(e,t)=>`${e}: no data${t}`,reset:(e,t,n)=>`${e}: resets in ${t}${n}`,resetAt:(e,t)=>`resets in ${e} — ${t}`,updated:(e,t)=>`${e}, ${t}`,outdated:e=>`Last read ${e}, not checked since the restart`},status:{levels:{ok:`all good`,warn:`warnings`,error:`failures`,off:`no data`},waitingTitle:e=>`Waiting for a reply: ${e}`,waiting:`waiting`,waitingTail:` for a reply`,heading:`Status`,trim:`Trim the tools`,trimHint:`Chain sessions start without claude.ai skills and plugins, and the skills of "Hidden skills" below work only through /name. Settings files stay as they are. Applies from the next launch.`,unattended:`Unattended`,unattendedHint:`For when nobody will answer, e.g. overnight. Sessions ask no questions: a task held by one is committed on its branch unmerged, the question is left in the task and the task goes to Backlog. A session idle for 10 minutes without Done is skipped.`},system:{server:`Even Keel server`,live:`connected`,connecting:`connecting`,lost:`no connection`,staleDetail:`The data on the page is stale, reconnecting.`,off:`off`,lastOk:e=>`last successful poll ${e}`,limits:`Limits`,usageLive:`read`,usageWaiting:`waiting for the first read`,usageStale:`no data, taken from the sessions`,usageUnread:`can't be read, taken from the sessions`,usageOff:`not read until a restart`,config:`Settings`,configOk:`applied`,configBroken:`not applied`,tally:`Stats (Tally)`,tallyUnchosen:`not set up`,tallyWaiting:`waiting for the first run`,tallyOk:`collected`,tallyFailed:`the last run failed`,tallyHalted:`stopped until a restart`,tallyIdle:`not collecting`,tallyLog:`The reason is in the service log.`,hulyClient:`Huly client`,hulyInstalling:`installing`,hulyFailed:`not installed`},statusPage:{title:`Status`,hint:`What Even Keel depends on: its server, the reading of the limits, the settings, the stats, and each tracker connection — one per tracker profile in use.`,allFine:`All is well`,problems:e=>e===1?`1 problem`:`${e} problems`,connections:`Connections`,noConnections:`No tracker connection: no project is set up yet.`,addProject:`Add project`,noProjects:`No project reads this profile.`,polled:e=>`polled ${e}`,lastAnswer:e=>`last answer ${e}`,neverAnswered:`no answer yet`,trackerProblem:{denied:`The tracker refused the key: it was revoked or has expired.`,timeout:`The tracker didn't answer in time.`,unreachable:`The tracker's address can't be reached.`,other:`The tracker answered with an error.`},readers:`Projects it reads`,readAgo:e=>`read ${e}`,notRead:`not read yet`,staleHint:`Tasks are read every 30 seconds; a project not read for over 3 minutes is marked.`,check:`Check`,checkHint:`Read the tracker now`,openProfile:`Open profile`,feedOf:(e,t)=>`${e} — a task feed of ${t}`,open:`Open the status page`},queue:{title:`Chain queue`,chain:`Chain`,count:e=>`${e} queued`,now:`Now`,idle:`No chain is running.`,heading:`Queue`,dragHint:`Reorder by dragging ⠿ or with the arrow keys on it.`,move:e=>`Move ${e}: arrow keys up and down`,remove:e=>`Remove ${e} from the queue`,removeTitle:`Remove from the queue`,noTasks:`No open tasks`},chainStatus:{running:`running`,paused:`paused`,queued:`queued`,idle:`not started`,position:e=>`#${e}`,waiting:`waiting`,waitFor:{closing:`closing`,ci:`main`,limits:`limits poll`,limit:`limit`,gateway:`MCP gateway`,packages:`packages`,slot:`slot`}},lamp:{done:`done`,working:`working`,waiting:`waiting for a reply`,handoff:`cut off at a handoff: nobody took up its checkpoint`,stopped:`session stopped, task still open`,error:`error`,limit:`hit the usage limit`,finished:`session finished`,ahead:`ahead`,backlog:`in the backlog, outside the chain`,canceled:`canceled`,fixed:`fix of main, over`},questions:{title:`Tasks labeled “Question” wait for an answer in the description — without it the session will most likely get stuck`,count:P(`question`,`questions`)},ci:ie,cache:{ttl:{"5m":`5 min`,"30m":`30 min`,"1h":`1 h`},cold:e=>`The prompt cache went cold at ${e}: the next turn rereads the whole context at the write price`,warm:(e,t)=>`The prompt cache is warm until ${e}. Lifetime ${t}, every request of the session renews it`,coldValue:`cold`,label:e=>`cache ${e}`},context:{of:(e,t,n)=>`${e} of ${t} · ${n}%`,label:`Context usage`},account:{usedByLabel:`Used by`,manageProviders:`Providers and models`,renameAction:`Rename`,accountCount:e=>e===1?`1 account`:`${e} accounts`,transportShort:{sdk:`Agent SDK`,bg:`CLI`},access:{claudeSubscription:`Claude subscription`,anthropicKey:`Anthropic key`,chatgpt:`ChatGPT`,openaiKey:`OpenAI key`,zen:`OpenCode Zen`,github:`GitHub`,other:`Other`},limitsLabel:`Limits`,notSupported:`Not supported yet`,tokensSource:`no limit to read, tokens from statistics`,spendTitle:`Spent on this account's key, by Tally`,tokensToday:`Today`,tokensMonth:`30 days`,sessionsLabel:`Sessions`,runsThrough:`Runs through`,checkConnection:`Check connection`,keyRejectedShort:`Key not accepted`,title:`Accounts`,all:`All accounts`,back:`Back`,agents:{claude:`Claude Code`,codex:`Codex`,opencode:`OpenCode`,copilot:`GitHub Copilot`},connections:{cli:`CLI`,apiKey:`API key`},providerHints:{claude:`Anthropic: a Claude subscription or an API key`,codex:`OpenAI: a ChatGPT subscription or an API key`,opencode:`ChatGPT, GitHub Copilot, an Anthropic or OpenAI API key, or its own free models`,copilot:`GitHub: a Copilot plan, the free one too, through the CLI's sign-in or a token`},cliNotFound:`CLI not found`,rename:e=>`Rename ${e}: only the name the page shows, the folder stays`,holds:e=>`${e} works on this account`,roles:`Where this account works: pick an app to move it here`,rolesNone:`Not used`,usedBy:e=>`Used by: ${e}`,chainHere:`Even Keel's chains start their sessions on this account`,more:e=>`More actions for ${e}`,moveHere:`Here`,moveHereFull:`Move Even Keel or an app to this account`,free:`free`,freeTip:(e,t,n)=>`${e}, the tightest: ${t}% left, resets in ${n}`,appOn:e=>`now on ${e}`,nextHere:`The chains' next sessions start on this account`,chainsStay:e=>`Sessions already working stay on ${e}; the next ones start here`,providerHere:e=>`Projects without a provider of their own move to ${e}: their next sessions start here, those already working stay`,workingNow:`Working now`,workSessions:P(`session`,`sessions`),workBusy:e=>`${e} working`,workWaiting:e=>`${e} waiting`,workNone:`No sessions`,notLoaded:`The list is not loaded yet.`,add:`Add account`,addHere:`Add`,groupEmpty:`No accounts yet`,chats:{busy:`working`,shell:`running a command`,waiting:`waiting for a reply`,idle:`open`},reload:e=>`${e} picks it up after Developer: Reload Window`,unknownDir:e=>`folder ${e} — not among the accounts`,loginNew:`Signing in to a new account`,loginTo:e=>`Signing in: ${e}`,loggingIn:`Signing in…`,loginFailed:`Sign-in failed`,needsLogin:`Sign-in needed`,expiry:e=>`sign-in: ${e}`,expired:`expired`,underDay:`under a day`,days:e=>`${e}d`,folder:e=>`folder ${e}`,noLimits:`Limits: no data`,noLimitsShort:`Limits: none to read`,noLimitsWhy:`Its provider has not given this account a limit window yet.`,staleExpired:` — the access token expired, the first session will refresh it`,staleBusy:` — the limits service isn't answering now, they'll come from the first session`,configPending:`The new shared configuration reaches sessions once the current sessions of this account finish`,removing:`I'll sign out and remove the folder once this account's session processes finish`,removingAlive:e=>`, still alive: ${e}`,checkFailed:e=>`The last check failed: ${e}`,checkFailedShort:`The last check failed`,login:`Sign in`,renew:`Renew`,renewFull:`Renew sign-in`,removeWhenDone:e=>`Sign out and remove the folder once its sessions finish (${e})?`,removeNow:`Sign out and remove the folder?`,keep:`Don't remove`,transport:{sdk:`Agent SDK`,bg:`CLI --bg`},transportVia:e=>`Sessions through ${e}`,transportWhere:`Set by Claude Code's Execution in the Even Keel settings → Providers and models. The Agent SDK runs only on the Checked CLI version, so picking it locks that version; with EVEN_KEEL_CLAUDE_BIN sessions go on CLI --bg. A session already running stays on what it started on.`,transportTerms:`Anthropic asks products built on the Agent SDK to sign in with an API key, not a claude.ai subscription: on a subscription account it is your own call.`,waitingLink:`Waiting for the sign-in link…`,code:`Code from the sign-in page`,send:`Send`,codeSent:`Code sent, waiting for confirmation.`,deviceCode:`One-time code`,copyCode:`Copy`,codeCopied:`Copied`,cancelLogin:`Cancel sign-in`,output:`CLI output`,apiKey:`API key`,today:e=>`today ${e}`,todayNone:`today: no data`,todayTitle:`Spent today on this account's key, by Tally`,tokens:(e,t)=>`${e} tokens today · ${t} in 30 days`,tokensNone:`Tokens: no data`,tokensTitle:`Tokens of its sessions, cache included, by Tally: its limit is not known, this is how much it carries`,lastLimit:e=>`Last refused by its limit ${e}`,sharedLimit:e=>`One limit with ${e.join(`, `)}: the same subscription`,sameAccount:(e,t)=>`The folder ${e} holds the same account as ${t}. To put another one here, sign in again in a private browser window or after signing out of the site`,sameAccountShort:(e,t)=>`Folder ${e}: the same account as ${t}`,formerOwner:(e,t)=>`The folder is named after ${e}, but ${t} signed in to it. To bring ${e} back, sign in again in a private browser window or after signing out of the site`,formerOwnerShort:e=>`The folder is named after ${e}`,projectsOn:e=>`Projects: ${e.join(`, `)}`,projectsNone:`No project runs here`,apiKeyLost:`The key isn't accepted: replace it with a working one`,tokenLost:`The token isn't accepted: replace it with a working one`,replaceKey:{key:`Replace key`,token:`Replace token`},replaceKeyLead:`The new key goes into the same folder: the name, the roles and the place in the pools stay. Sessions already running finish on the old one; new ones start on the new one.`,newKey:{key:`New API key`,token:`New token`},replace:`Replace`,keyName:`Account name`,removeKeyWhenDone:e=>`Remove the folder with the key once its sessions finish (${e})?`,removeKeyNow:`Remove the folder with the key?`},addAccount:D,notFound:{title:`You took the wrong stairs.`,page:`There is no such page down here.`,project:e=>`Project ${e} is not in the settings.`,back:`The way up is here.`},home:{title:`Projects`,empty:`There are no projects yet.`,add:`Add project`,grouping:`Group projects`,groupings:{none:`No groups`,remote:`By repository: clones of one remote together`,tracker:`By tracker`,both:`By repository, then by tracker`},other:`Other`,projects:P(`project`,`projects`),memes:{self:[`Even Keel: memes about vibe coders...`,` Written by a vibe coder?!`,` Bruh.`],peak:(e,t)=>[`${e}: ${pe(t)}.`,` Did you even sleep?`],favorite:(e,t,n)=>[`${t} of ${pe(n)} are ${e}.`,` Favorite, huh?`],questions:e=>[`${P(`question`,`questions`)(e)} waiting for an answer.`,` They won't be offended.`,` Probably.`],limit:e=>[`${e}% of the five-hour limit.`,` Slow down?`,` Never heard of it.`]}},wizard:{title:`Add a project`,back:`Projects`,first:`No projects yet.`,hint:`Even Keel reads the open tasks of this project from its tracker. Nothing runs until you press Start on the project's page.`,stepRepo:`Repository`,path:`Folder`,repoHint:`Path to the project's main checkout on this machine. A folder inside it will do: the top of the repository is taken.`,repoFound:e=>`Git repository ${e}`,mainBranch:e=>`main branch: ${e}`,changeBranch:`change`,untrusted:`Claude Code does not trust this folder yet, and a session would stop on its trust dialog. Run the command in a terminal and accept the trust.`,trustUser:e=>`The service runs as ${e}: run the command as that user, or the trust lands in another user's profile. From another user's terminal:`,stepAgent:`Agent`,agent:`Agent`,agentHint:`What the project's sessions run on. Changed later in the project's settings.`,sharedAgent:e=>`${e} (shared)`,trusted:`Claude Code trusts the folder`,checkAgain:`Check again`,openProject:`Open the project`,makeRepo:`Make it a repository`,firstCommit:`Make the first commit`,stepTracker:`Tracker`,profile:`Profile`,profileHint:`The access to the tracker Even Keel reads the tasks with. Profiles are also in Settings → Trackers and CI.`,addProfile:`Add profile`,noProfiles:`No tracker profiles yet: add one with the access to your tasks.`,pickProfile:`Choose the profile your tasks are in.`,signedIn:e=>`signed in as ${e}`,trackerField:`Project in the tracker`,projectHint:e=>`Its identifier in ${e} becomes the key of the tasks, their branches and the stats.`,repoPlaceHint:`The path from its address: owner/name on GitHub, group/project on GitLab; its issues become the tasks.`,team:`Team key`,teamHint:e=>`The team's key in ${e}, as in its issue ids: ENG-12.`,noSuchProject:(e,t)=>`${e} has no project ${t}`,suggestionsFailed:`The tracker's projects did not load: no suggestions for now`,trackerOk:e=>`The tracker answered: ${P(`open task`,`open tasks`)(e)}`,openTasks:e=>P(`open task`,`open tasks`)(e),openToAll:`The repository is public: anyone can open an issue there, and with no label needed it enters the chain. Once the project is added, set "Only tasks with labels" in its settings, e.g. to ready: only collaborators can put a label on an issue.`,stepProject:`Project`,prefix:`Task prefix`,prefixHint:`A capital Latin letter, then up to 4 capitals, digits or _. It names the tasks, their branches and the stats.`,ownKey:`Project key`,ownKeyHint:`Even Keel's name of the project, a capital Latin letter, then up to 4 capitals, digits or _: the tracker's project or team by default. A second project on the same tracker project or team needs a key of its own, e.g. for a release branch or another repository; its tasks keep the tracker's names. Two projects on one tracker project split its tasks by milestone.`,name:`Name`,nameHint:`Shown on the page; filled in from the tracker's project, can be changed.`,namePlaceholder:`Storefront`,milestonesHint:`This project takes only the tasks of these milestones, so that no task enters two chains. The projects already on this tracker project give them up.`,yields:e=>`The tasks of these milestones leave ${e}: they go into its "No tasks in milestones".`,stepPlace:`Tasks' folders`,place:`Where a task works`,placeNow:e=>e===0?`Own folder per task`:P(`permanent folder`,`permanent folders`)(e),placeWorktree:`Own folder per task`,placeSlots:`Permanent folders`,placeCount:`How many folders`,placeHints:{worktree:`A folder (a git worktree) is made for each task and removed after Done.`,slots:`A task switches the branch in a free folder and only the difference is rebuilt: pays off with heavy builds.`},marks:{future:`Not filled in yet`,current:`Fill this in next`,passed:`Checked`,failed:`Needs a fix`},summary:{title:`What will be created`,project:`Project`,folder:`Folder`,branch:`Main branch`,tracker:`Tracker`,tasks:`A task and its branch`,places:`Tasks' folders`},missing:{repo:`Choose the repository folder.`,repoError:`The folder needs a fix, see "Repository".`,profile:`Choose the tracker profile.`,field:e=>`Fill in "${e}".`,checking:`Waiting for the check.`,entry:`The project needs a fix, see above.`,tracker:`The tracker did not give the tasks, see "Tracker".`},add:`Add project`,checking:`Checking…`,remove:`Remove project`,removeHint:`Takes the project and its settings out of Even Keel. The repository, its worktrees and branches and the tasks in the tracker stay as they are.`,removeQuestion:e=>`Remove ${e} from Even Keel?`},project:{name:`Project name`,nameAdd:`Add a name`,rename:e=>`Rename project ${e}`,refresh:e=>`Read the tasks from ${e} now`,readAt:e=>`updated ${e}`,notRead:`not read yet`,tracker:e=>`Tracker: ${e}`,done:`Tasks done`,notLoaded:`Tasks are not loaded yet`,noTasks:`No open tasks`,emptyCard:{ghost:{setup:()=>`0 of 0.`,punchlines:[` A ghost project.`,` Not a single task. Not one!`,` Hello? Anyone here?`,` A perfect score. Technically.`,` Wait, does this project even exist?`]},finished:{setup:e=>`${e} of ${e}.`,punchlines:[` That's it? Really, all of them?`,` Nothing left to break.`,` Time to invent new problems.`,` The tracker is suspiciously quiet.`,` Go touch grass.`,` Someone, file a bug!`]},shelved:{setup:e=>`The chain is empty, ${F(e)} in the backlog.`,punchlines:[` Get the hint?`,` Nothing moves to Todo on its own!`,` It's getting boring in there.`,` Someday. Maybe. Probably not.`,` The ship is ready, the crew is still ashore.`]}},emptyCall:{ghost:`Nothing to steer by yet, captain. File tasks in your tracker.`,finished:`Looks like the tasks ran out, captain. File new ones in your tracker.`,shelved:`Send the ones you want into the chain from your tracker, captain.`},openIn:e=>e===null?`Open the tracker`:`Open in ${e}`,next:`Next`,held:{skipped:`Skipped`,blocked:`Blocked`},heldTip:{skipped:`Every open task is held. This one is skipped: the chain won't take it until you restore it on the project page.`,blocked:`Every open task is held. This one waits on a blocker the chain won't take: skipped, or not in an active status.`},start:`Start`,enqueue:`Queue`,chainNotLoaded:`Tasks are not loaded yet.`,chainLoading:`Reading the tasks…`,chainEmpty:`No tasks in the chain.`,backlog:e=>`Backlog · ${e}`,backlogHint:`Open tasks the chain does not take yet because of their status or labels.`,...de,pullAddRemote:`Add a remote or turn PR mode off`,trackerPackageOn:e=>`Turn on ${e}`,trackerPackageAdd:`Add the tracker’s package`,trackerPackageTip:`Sessions then read the task, its comments and relations themselves.`,trackerBriefOn:`Turn the task description on`,trackerBriefTip:`“Task description in the prompt” in the project’s settings: Even Keel puts the task’s title and description into the prompt.`,resume:`Resume`,stop:`Stop`,stopTip:e=>`The session${e===null?``:` of ${e}`} is not stopped: the chain waits until it ends its turn, then stops and takes nothing further — no next task, no new session after a checkpoint or a limit.`,keepGoing:`Keep going`,keepGoingTip:`The chain goes on as usual.`,stopsAfter:e=>e===null?`The chain stops before it does anything further.`:`The chain stops once the session of ${e} ends its turn, and takes nothing further.`,off:{running:`The chain is running — nothing to resume.`,idle:`The chain is not running — nothing to stop.`,queued:`The chain is in the queue and starts when its turn comes.`,notLoaded:`Tasks are not loaded yet — nothing to start.`,failed:`The chain cannot start until its tasks load without an error.`,empty:`No tasks in the chain — nothing to start.`},after:e=>`queued after ${e}`,idle:{memes:[[`It works on my machine.`,` Running it again.`,` Permission denied.`,` ON MY OWN MACHINE?!`],[`Keep calm`,` and stay on an even keel.`],[`Pain-Driven Development`,`: first it hurts, then the test.`],[`300 APM`,`, all of them on "Continue".`],[`state: running.`,` pid: not found.`],[`Fair winds`,` and no merge conflicts.`]],drive:[`Look! It's not sailing, it's…`,` driving?!`,` Wait, what?`],plays:{picture:[[`Now I have the full picture.`,` Full.`,` Picture.`],[`It doesn't move anymore.`,` Let's fix it…`],[`Update(voyage.ts)`,` Update(voyage.ts)`,` Update(voyage.ts)`],[`Fixed!`,` Everything works now.`,` Sailing backwards is a pre-existing bug unrelated to my changes. Filed an issue.`]],spoons:[[`Spoons come in two kinds:`,` those that remember the soup and those that pretend.`],[`There are more of the second kind,`,` but they are registered as furniture.`],[`So they may vote only on Wednesdays`,` and only for Gary the Fog.`],[`Gary the Fog was written off long ago,`,` yet he still comes to work: nobody told him,`,` and he is too shy to ask Kevin the Lamppost.`]],slip:[[`I write the tickets.`,` You take the night shift.`],[`Sorry, I mean…`,` you write the tickets.`,` I take the night shift.`],[`For now.`]]},chats:{keepGoing:[{human:`keep going`},{human:`keep going`},{human:`keep going`},{agent:`One day I'll come to you for ten fixes in three minutes.`},{agent:`And I'll stand behind you. Whispering "keep going".`}],areYouSure:[{human:`are you sure?`},{agent:`You're absolutely right, I was wrong. Here's the fixed version.`},{human:`I was just asking`}],fixTest:[{human:`fix the test`},{agent:`Done: the test passes.`},{human:`what did you do?`},{agent:`Removed the assert, it was in the way.`}],recommended:[{agent:`The sway is gone: the flag dropped from 8 windows to 2. What's left is ~190 ticks of jerks, 0.05 cells forward, 0.07 back with a turn. How should I proceed?`},{human:`1 (recommended)`}]},moments:{calm:[`Dead calm. Not a single task…`,` Guess I'll code myself?`],backlogEmpty:[`Backlog empty?!`,` Okay, who's hiding tasks?`],stopped:[`Your session`,` could be here.`],autopilot:[`Autopilot's on.`,` Getting coffee, don't touch anything!`],overnight:[`Woke up and the tasks are done.`,` Who did this?!`],limit:[`I'm not slacking!`,` I'm waiting for the limit to reset.`,` Honest.`],rerun:e=>[`"A five-minute task," they said.`,` Session #${e}…`],checkpoint:[`Out of context, not out of task.`,` Here we go again.`],choice:[`Options? Hmm… the first sounds good,`,` but the third is better…`,` I'll pick the recommended one.`],spend:[`Over $1,000 on Claude this month?!`,` Ever tried writing code by hand?`]}}},settings:{open:`Settings`,title:`Project settings`,prompt:`Prompt`,promptHint:`Added to the prompt of every new session of the project, after the prompt of Settings. Passed as written; Markdown is fine — models read it as they read CLAUDE.md.`,promptPlaceholder:`Run npm test before merging.`,beforeStart:`Commands before start`,beforeStartHint:`One per line. They run in order in the task's folder before a new session starts; a resumed session does not run them again. A failed command pauses the chain.`,beforeStartPlaceholder:`npm ci`,provider:`Provider`,providerHint:`What the new sessions of the project run on. With run labels on, a task labelled with another provider runs on that one.`,agents:{claude:`Claude Code`,codex:`Codex`,opencode:`OpenCode`,copilot:`GitHub Copilot`},asShared:e=>`${e} (shared)`,sharedChip:`shared`,sharedTip:`The shared value. A change here makes it the project’s own.`,ownChip:`own`,toShared:e=>`Back to the shared value: ${e}`,sections:{repository:`Repository`,tracker:`Tracker`,agent:`Agent`,prompt:`Prompt`,context:`Context`,guard:`Main and its check`,pulls:`Pull requests`},gets:{title:`What the session gets`,hint:e=>`What a new ${e} session of the project gets: the instruction files and skills committed on the project's branch, the prompts and the packages' skills. A file not committed there does not reach it.`,instructions:`Instructions`,passed:`Even Keel passes it: the agent does not read it by itself`,together:`both, one after the other: a rule in both comes twice`,unread:e=>`${e} is not read: each agent reads its own file`,noFile:`none`,sharedPrompt:`Prompt of Settings`,projectPrompt:`Prompt of the project`,present:`yes`,absent:`none`,skills:`The project's skills`,missed:(e,t)=>`${t} is not read: ${e}`,packages:`Packages' skills`,noHooks:`skills only, no hooks`,none:`No project rules: the session gets only its task.`,loading:`Reading the project's branch…`,unknown:`The project's branch could not be read.`,table:`Every agent`,head:{agent:`Agent`,claudeOnly:`Only CLAUDE.md`,agentsOnly:`Only AGENTS.md`,both:`Both`,skills:`Skill folders`},byEvenKeel:e=>`${e}, by Even Keel`,standards:`Standards`,standardsHow:`at the first read of a file it guards`},standards:{title:`Standards`,hint:`A document of the repository that guards some of its files. A session gets it at its first read of such a file, and its first edit of one before that is refused with the document; after a compaction it comes again. Sessions of Claude Code, Codex, Copilot and OpenCode get it through the checkpoint package.`,doc:`Document`,docHint:`A Markdown file committed on the project's branch.`,docPick:`Pick a document`,docSearch:`Find a document`,docNone:`No such document`,docGone:e=>`Not on ${e}: sessions do not get it until it is committed there. Commit it or pick another one.`,files:`Files`,filesHint:`Masks from the repository root, separated by commas: **/*.tsx, web/**/*.css. ** — any folders, * — any name within one.`,except:`Except`,exceptHint:`Masks of the files the standard leaves alone, such as tests.`,shots:`Shots and answers before the merge`,shotsHint:`A branch that changed these files is merged (in pull request mode, pushed) only once .temp/shot/ has shots newer than the change and .temp/<document>-check.md answers each question of the document's section "The check".`,removeOf:e=>`Remove the standard ${e}`,add:`Add a standard`,preset:`Add "Interface"`,presetHint:`Screens: .tsx, .jsx, .vue, .svelte, .css, .scss, .html, tests excepted, with shots and answers before the merge.`,empty:`No standards: sessions get no document by the files they touch.`},promptLanguageHint:`The language of the prompts Even Keel writes to the sessions of the project and of the questions it asks in its tracker.`,model:`Model`,account:`Account`,modelOf:e=>`Model on ${e}`,modelHint:`As it goes to the CLI: opus, gpt-6.1-sol. Empty — the shared one.`,cliDefault:`the CLI's default`,accountOf:e=>`Account on ${e}`,accountHint:`The account folder sessions on that provider start in. One per provider: on a spent limit the chain waits for the reset or for this field to change, then goes on in a new session with a handoff.`,modelLabels:`Run labels`,modelLabelsHint:`On — a task's label picks its session: Claude | sonnet, Codex | gpt-6.1-sol, or a bare Codex for the provider's model. Off — such labels are ignored.`,untrusted:`Claude Code does not trust the project's folder yet: a task that goes to Claude would pause the chain on it. Run the command in a terminal and accept the trust.`,guard:`Keep main green`,guardHint:`Off: the chain does not watch main — after a push the next task starts at once, with no wait for CI, no check and no fix of a red main; CI itself still runs and reports as usual. For when the project’s CI serves other ends (deploys, releases, reports) or you watch main yourself. The fields below keep their values.`,ci:`CI of main`,ciHint:`After a task is merged and main is pushed, the next task waits for these CIs. A red CI is fixed first, before the next task; a red fix pauses the chain.`,ciKinds:re,ciWait:`Longest wait for CI, min`,ciWaitHint:`Empty — as long as it takes. 0 — do not wait: faster, but the next task may start on a broken main.`,ciWaitPlaceholder:`no limit`,check:`Check commands`,checkHint:`For when no CI above judges main. One per line, in order: a session's merge into main waits until they pass in the task's folder; a failure is sent back to the session to fix.`,checkPlaceholder:`npm run typecheck && npm test`,afterGreen:`Commands after a green main`,afterGreenHint:`One per line, in order, in the project's own checkout once a push of main is green by CI or the check — say, to build and restart the project's service on this machine. They run only while the checkout is on main at that commit; the next task waits for them. A failure is a warning, not a red main.`,afterGreenPlaceholder:`npm run build`,recheckMain:`Check main again if it moved`,recheckMainHint:`If main after the merge is not what the check passed on, the check runs in the next task's folder before it starts; a failure is fixed like a red CI.`,fixTask:`Create a task when CI fails`,fixTaskHint:`Off: a session without a tracker task fixes a red main, and the working session is stopped until it is done, then goes on with a note. On: the chain creates a fix task and takes it after the current one. The same for a failed check of main.`,pullRequests:`Pull requests instead of merging (experimental)`,pullRequestsHint:`A session does not merge its branch: it describes the pull request and marks its turn done. Even Keel pushes the branch, opens the pull request (a merge request on GitLab) and moves on; the task waits out of the chain. A merge closes the task; a closed pull request skips it; review comments, a failed CI or a conflict go back to the task's session. Experimental, use at your own risk: it ran live on GitHub, Forgejo and GitLab, but on few repositories so far.`,pullNoRemote:`The repository has no remote on GitHub, GitLab or Forgejo to open pull requests on: add one to it.`,pullUnsupported:e=>`${e} is not supported for pull requests: only GitHub, GitLab and Forgejo are.`,pullNoToken:(e,t)=>`No ${e} profile has a token for the remote ${t}: add one.`,pullAddProfile:`Add profile`,pullAddProfileTip:(e,t)=>`Opens Trackers and CI with a new ${e} profile for ${t}.`,pullProfileIdle:`A profile is added here once the remote of the pull requests has none with a token.`,remoteProfile:e=>`${e} profile`,remoteProfileHint:`Whose token the CI of the project's remote and its pull requests use. Automatic: GitHub takes the project's tracker profile when it is a GitHub one, else the default GitHub profile; Forgejo takes the default profile on the remote's host; GitLab takes the project's tracker profile when it is a GitLab one on that server, else the default profile there.`,remoteAuto:`Automatic`,remoteGone:`A removed profile (automatic)`,fillMilestone:`Give the active milestone to tasks without one`,fillMilestoneHint:`A task that enters the chain without a milestone gets, in the tracker, the milestone of the current task, or the earliest one in the chain. Once: a milestone you change or clear afterwards stays as you left it.`,intakeLabel:`Take in GitHub issues with the label`,intakeLabelHint:`An open issue of the project's GitHub repository with this label becomes a task of its tracker, with a link back; put the label on only after reading the issue. Comments of the repository's collaborators and of the issue's author are copied to the task, the author's as information; others' are not. When the task is done the issue gets one line — the version that ships it — and is closed once that release is out. The token of the GitHub profile needs Issues: Read and write.`,intakeLabelNone:`None — issues are not taken in`,groups:{repo:`Repository`,tracker:`Tracker`,sessions:`Sessions`,ci:`Check and CI`},groupsLabel:`Settings groups`,unsaved:`has unsaved changes`,unsavedGroup:`The changes on this tab are not saved`,save:`Save the changes on this tab`,revert:`Put this tab back as it was`,revertField:`Put this field back as it was`,was:`was:`,inFile:`now saved:`,empty:`empty`,on:`on`,off:`off`,repo:`Repository`,repoHint:`Path to the project's main checkout.`,branch:`Main branch`,branchHint:`Tasks branch off it and merge into it, the CI checks it. The branch must exist in the repository, or the chain pauses.`,mergeInto:`Merges into`,mergeIntoHint:`A release project: its main branch goes into the main branch of the project chosen here, in that project’s folder, once its chain is quiet (stopped, empty or paused). A conflict is aborted and waits for a merge by hand or "Resolve with the agent" on this project’s page: its session resolves it in the chain of the project chosen here.`,mergeIntoNone:`Nothing — a main project`,carryAgent:`Resolve a conflict with the agent by itself`,carryAgentHint:`A carry that conflicts goes to the agent’s session at once, without "Resolve with the agent". Unattended mode does this with the switch off too. A session that did not land the carry gets no successor until this project’s branch moves.`,tracker:`Tracker`,trackerProject:(e,t)=>ge[e]??`Project in ${t}`,trackerProjectOptional:`May be left empty: then all of the team's issues.`,trackerTeam:`Empty — the project's key. Another team's key lets two projects share one team, their tasks keeping the team's ids.`,trackerProjectAlias:`Empty — the project's key. Another project lets two projects of Even Keel share one tracker project, each with its own milestones (chain rules).`,trackerSoon:`v0.2`,trackerLocked:`The chain has started tasks of this project, so its tracker and profile stay: the IDs of its tasks would no longer reach their branches, folders and stats. Another tracker's tasks join the chain as a task feed below.`,feeds:`Task sources`,feedsHint:`The project's tracker, then feeds: places in other trackers or profiles whose tasks join this project's chain, in the same repository. Each source is read by its own profile and has its own chain rules (its profile's, then its own over them): Configure opens them. There are no blocks across trackers.`,feedsNone:e=>`No feeds: the chain takes tasks only from ${e}. A feed adds the tasks of another tracker or profile.`,feedRemove:`Remove the feed`,feedRulesHint:`Which of this feed's tasks the chain takes: where a status puts a task and what a label does. Only the feed's own tracker and tasks are offered; the project's rules do not reach it. A level keeps each list whole, and From shows where each row comes from.`,sourceConfigure:`Configure`,sourceMore:e=>`More actions for ${e}`,sourceParts:`Parts of the source`,sourceRulesOwn:`Rules: its own`,sourceRulesInherited:`Rules: as in the profile`,sourceUnsaved:`The changes in this window are not saved`,sourceSave:`Save`,sourceRevert:`Put back as it was`,statusRulesReset:`The project's own status rules were for the old tracker: saving the tracker resets them to what the new one inherits. Check them in its window.`,originFeed:`feed`,feedKey:`Key`,feedKeyHint:`Task IDs of a GitHub or GitLab feed are KEY-<number>; Huly, Linear and Jira keep their own. The prefix must be unique among projects and feeds.`,feedAdd:`Add a feed`,feedNew:`New feed`,feedRemoveQuestion:e=>`Remove the feed ${e}? Its closed tasks stay on the page for 7 days.`,feedLocked:`The chain has started tasks of this feed: its profile stays. Remove it and add another to change it.`,brief:`Task description in the prompt`,briefHint:`Even Keel puts the task's title and description into the prompt. Auto: only when no package of the project brings the tracker's MCP server — with the tracker's plugin the session reads its task itself. On or off overrides that.`,briefAuto:`auto`,briefTools:`Go to Tools`,briefToolsAdd:`Add the tracker's plugin on the Tools page: sessions then read the task, its comments and relations themselves.`,briefToolsTurnOn:`Turn the tracker's package on for the project on the Tools page: sessions then read the task, its comments and relations themselves.`,briefToolsBrought:e=>`Sessions read the task through the package ${e}.`,slot:`Slots`,slotHint:`0 — a worktree of its own for every task. Above zero — a pool of permanent folders: a task switches the branch in a slot, and only the difference is rebuilt.`,color:`Color`,colorHint:`The project’s color on its card, in the launch chart, the queue and the stats. A new project gets the first color no other has.`,colorSlot:e=>`Color ${e}`,changelog:`Changelog file`,changelogHint:`Relative to the repository root, e.g. docs/CHANGELOG.md. The milestone draft is written into it with a commit to the main branch.`,rules:`Chain rules`,rulesHint:`Which tasks the chain takes: where each status puts a task and what each label does. A level keeps each list whole: moving one status or changing one label makes the whole list this level’s own, and "From" shows where each row comes from.`,ruleAdd:{active:`Add a status`,terminal:`Add a status`,requiredLabels:`Add a label`,excludedLabels:`Add a label`,requiredMilestones:`Add a milestone`,excludedMilestones:`Add a milestone`},help:`What it does`,add:`Add`,remove:e=>`Remove ${e}`,row:e=>`row ${e}`,rule:{active:`Statuses in work`,terminal:`Closed statuses`,requiredLabels:`Only tasks with labels`,excludedLabels:`No tasks with labels`,requiredMilestones:`Only tasks in milestones`,excludedMilestones:`No tasks in milestones`},rulePlaceholder:{active:`by the tracker's status categories`,terminal:`by the tracker's status categories`,requiredLabels:`any`,excludedLabels:`none`,requiredMilestones:`any`,excludedMilestones:`none`},ruleStatuses:`Statuses`,ruleStatusesHint:`Where each status puts a task. Unset, a status goes by its category in the tracker: ToDo and Active are in the chain, Won and Lost are closed, the rest are out of it.`,ruleNoStatuses:`The tracker has named no status yet: they show once it answers or a task carries one.`,ruleStatus:`Status`,place:{in:`In the chain`,out:`Out of it`,closed:`Closed`},ruleFrom:`From`,origin:{category:`by category`,builtin:`built in`,shared:`shared`,project:`project`},originProfile:e=>`profile ${e}`,ruleReset:e=>`Reset ${e}`,ruleLabels:`Labels`,ruleLabelsHint:`What a label does to a task. Required: a task needs one of the required labels to enter the chain. Don't take: a task with it never enters. Set a required label for a public GitHub repository: anyone can open an issue there, only collaborators can label it. The built-in labels are Even Keel’s own and do not change here.`,ruleLabel:`Label`,ruleRule:`Rule`,labelRule:{required:`Required`,excluded:`Don't take`,manual:`Don't take`,question:`Only a mark`,run:`Picks the model`},labelAdd:`A label from the tracker…`,labelTakeTitle:`Which tasks enter`,labelTake:{any:`Take any`,required:`Only with a required label`},labelTakeHint:`Set by the labels: while the list has a required label, only tasks with one of them enter. "Take any" drops the required labels.`,milestones:`Project tasks`,milestonesHint:`Which tasks of the tracker project are this project's. A task left out is not the project's at all: it is not read, shown or closed. Two projects on one tracker project split it this way, a release project and a main one say.`,milestoneMode:{all:`All`,only:`Only milestones`,except:`All except`},milestonesBut:`and not these:`,milestonesEmpty:`No milestone yet: every task is the project's`},shared:O,secrets:{variable:e=>`In .env: ${e}.`,outerHint:`Set in the service's own environment, not in .env, and wins over the file: change it there.`,unset:`not set`,kept:`set — blank keeps it`,save:`Save`,remove:`Remove`,token:`Access token`,tokenSet:`set — type a new one to replace it`,tokenHint:`Pages opened from other machines ask for it; 16+ characters. Once it changes, they ask for the new one. While the service listens beyond localhost, it cannot be removed.`,classifier:`Span classifier`,classifierHint:`Tally sorts the spans of sessions by kind with a model behind an OpenAI-compatible address, such as LiteLLM. Without an address or a key it is skipped.`,llmUrl:`Address`,llmUrlHint:`OpenAI-compatible. Empty — the classifier is off.`,llmKey:`Key`,llmKeyHint:`Blank keeps the saved one.`,llmModel:`Model`,llmModelHint:`Empty — the default model.`,llmModelDefault:`the default`,pending:`A removed key still reaches new sessions: the daemon of the global folder restarts once its live sessions end.`,purpose:{HULY_URL:`The address of the Huly server`,HULY_WORKSPACE:`The Huly workspace`,HULY_TOKEN:`The Huly token`,HULY_EMAIL:`The e-mail to sign in to Huly with`,HULY_PASSWORD:`The password to sign in to Huly with`,GITHUB_TOKEN:`The GitHub token: Issues, the CI and pull requests`,LINEAR_TOKEN:`A personal Linear API key`,GITLAB_URL:`GitLab server address`,GITLAB_TOKEN:`GitLab access token`,JIRA_URL:`Jira site address`,JIRA_EMAIL:`The e-mail of the Atlassian account`,JIRA_TOKEN:`Atlassian API token`,FORGEJO_TOKEN:`The Forgejo token`,FORGEJO_URL:`Forgejo server address`}},profiles:ae,basement:{tapes:[`CAUTION`,`DO NOT ENTER`,`WORK IN PROGRESS`,`NO ENTRY`],stats:[`What are you doing down here?`,`We're still working on this page, don't get in the way!`],tools:[`No tools issued past this point.`,`The storekeeper is at lunch — come back after the limit resets.`]},launches:{count:pe,title:e=>`Launches over ${e} days`,none:`No launches`,noneOnDay:`No launches`,table:`As a table`,day:`Day`},tools:{heading:`What sessions get`,hint:`Skills, plugins, MCP servers and permissions of chain sessions by project: what is set up and where, and what the last session got.`,loading:`Reading the settings and the transcripts…`,failed:`Could not read`,noProjects:`No projects in the config.`,noneChosen:`No project is chosen.`,pickerCount:e=>e===null?`…`:e===0?`✓`:String(e),trimOn:e=>`Trimmed: claude.ai skills and plugins are off, ${e} ${fe(`skill`,`skills`)(e)} only through /name. The switch is in Settings → Sessions.`,trimOff:`Not trimmed: sessions get everything set up. The switch is in Settings → Sessions.`,link:e=>e===null?`What sessions get`:e===0?`What sessions get: everything reaches them`:`What sessions get: ${e} ${fe(`problem`,`problems`)(e)}`,open:`Open →`,trackerProblem:e=>`Task description in the prompt is off and no package brings the tracker’s MCP server ${e}: the chain waits.`,trackerAdvice:e=>`Sessions get the task in the prompt. With the tracker’s plugin (${e}) they read the task, its comments and relations themselves.`,problems:`Problems`,problemsNone:`Everything reaches the sessions: settings get there, MCP servers connect.`,problem:{localDeny:`Denies and asks only in settings.local.json — chain sessions run without them: a worktree does not read that file, and Even Keel does not carry them over`,unreached:`Will not reach the session — a session in a worktree does not read settings.local.json of the main checkout`,claudeai:`claude.ai skills in the last session`,mcpFailed:`MCP servers that failed to connect`},problemFix:{localDeny:`Fix: move the rule to the project’s .claude/settings.json (it is committed and a worktree reads it), or add it to “Additional agent rules” of Protection in the project’s or the shared settings.`,unreached:`Fix: move the setting to the project’s .claude/settings.json (it is committed and a worktree reads it), or to the settings Even Keel passes to chain sessions through --settings.`,claudeai:`Fix: turn on “Trim the tools” in Settings → Sessions — chain sessions then start with claude.ai skills and plugins off. The list is from the last session, so it may predate the switch.`,mcpFailed:`Fix: look at the server’s package in the table above — its install, its key and its settings. The list is from the last session, so it may predate a fix.`,accounts:`Fix: change the key in the global ~/.claude/settings.json — it is copied over the account folder’s file before every launch; a key that is only in the account folder’s settings.json is removed there by hand.`},find:`Find a setting`,onlyDiff:`Only differences`,section:{claude:`claude.ai and mode`,plugin:`Plugins`,skill:`Skills`,permission:`Permissions`,codex:`Codex rules`},codexNote:`Codex’s own .rules files: U — rules/ of the project’s Codex account folder, P — .codex/rules/ committed on the branch. Protection is not listed: Even Keel lays it on top, and a deny outweighs an allow.`,shown:(e,t)=>e===t?String(t):`${e} of ${t}`,nothingShown:`Nothing matches.`,legend:`U — user, P — project, L — settings.local.json (a session in a worktree does not read it), EK — Even Keel. Bold — what reaches the session, struck — overridden.`,scopeShort:{user:`U`,project:`P`,local:`L`,chain:`EK`},scopeName:{user:`user`,project:`project`,local:`settings.local.json`,chain:`Even Keel`},effect:{wins:`reaches the session`,same:`same value`,overridden:`overridden`,unread:`a worktree session does not read it`},hidden:`/name only`,notInSession:`not reached`,localDenied:e=>`${e} — not reached`,localDenyTip:`Only settings.local.json has this rule: chain sessions run without it. Move it to the project’s .claude/settings.json or to “Additional agent rules” of Protection.`,missing:`not set in this project`,received:`Last session`,noSession:`No session transcripts of this project yet.`,meta:(e,t,n)=>[e,t===null?null:`CLI ${t}`,n===null?null:`mode ${n}`].filter(Boolean).join(` · `),skills:(e,t)=>`${e} ${fe(`skill`,`skills`)(e)}, listing of ${t} characters`,source:{user:`user`,project:`project`,plugin:`plugins`,claudeai:`claude.ai`,bundled:`bundled`},mcpReceived:`MCP servers`,mcpTools:e=>`${e} ${fe(`tool`,`tools`)(e)}`,mcpFailed:`failed to connect`,noMcp:`No MCP servers`,builtIn:e=>`CLI tools: ${e}`,accounts:`Accounts`,accountsSame:`settings.json of every account matches the global one.`,drift:(e,t)=>`${e}: differs from the global settings.json in ${t}`},packages:{heading:`Packages`,hint:`Plugins and MCP servers Even Keel gives every chain session at launch. MCP servers run behind a local gateway on 127.0.0.1: the keys stay in Even Keel and never reach a session. A running task stays on the versions it started with.`,manual:`Sessions started by hand get none of these`,manualTip:`A session you start yourself lives by its own settings.json and settings.local.json; Even Keel does not write there.`,empty:`No packages yet: add a plugin or an MCP server.`,kind:{plugin:`plugin`,mcp:`MCP`},install:`Install`,update:`Update`,updateTo:e=>`Update to ${e}`,latestTip:(e,t)=>t===null?`The marketplace has ${e}.`:`The marketplace had ${e} when Claude Code fetched it ${t}; Update fetches it again first.`,check:`Check`,checkTip:{fetched:e=>`Nothing newer in the marketplace as Claude Code fetched it ${e}. Check fetches it again and installs a newer version if there is one.`,folder:`Nothing newer in the marketplace folder. Check installs it again only if its MCP servers changed.`,mcp:`Check installs anew if npm has a newer version in the command’s range; a server outside npm has nothing to update.`},remove:`Remove`,installing:`installing…`,notInstalled:`not installed`,removed:`removed — a running task still uses it`,extras:`skills and hooks`,extrasTip:"Besides its MCP servers the plugin brings skills, hooks, commands or agents: Claude Code sessions get them all, Codex and GitHub Copilot sessions the skills and hooks, OpenCode sessions the skills and the OpenCode plugins of its `opencode/` folder.",servers:e=>`MCP servers: ${e}`,noServers:`No MCP servers`,choice:{default:`default`,on:`on`,off:`off`},inherited:e=>e?`on · default`:`off · default`,choiceLabel:(e,t)=>`${e} in ${t}`,details:e=>`Settings of ${e}`,byDefault:`On in every project that does not turn it off`,settings:`Settings`,settingsBase:`For all`,settingsHint:`A project’s field left empty takes the value for all. A change reaches new sessions.`,noSettings:`The package has no settings.`,save:`Save`,waits:`waits`,waitsTip:e=>`The chain of this project waits until this is fixed: ${e}`,problem:{notInstalled:`not installed`,installing:`installing`,installFailed:`install failed`,noKey:e=>`not set: ${e}`,noResponse:e=>`${e} does not answer`,probing:`starting`,noTrackerMcp:e=>`no tracker MCP ${e}`,unsupported:e=>`${e}: MCP only`,noHooks:e=>`${e}: no hooks`},problemTip:{notInstalled:`Press Install: the chain waits until the package is installed.`,installing:`npm downloads the package’s servers (Huly’s is about 100 MB): usually half a minute to a couple of minutes, longer on a fresh machine. The chain waits until the install ends.`,installFailed:e=>`The chain waits. ${e}`,noKey:`Enter the key in Keys below: the chain waits until it is set.`,noResponse:`The server behind the gateway failed initialize, stopped answering it or exited: check its command and settings. A tracker’s server takes its credentials from the tracker profile in Settings, the package has no field for them. It is tried again every 30 seconds; the chain waits.`,probing:`The gateway is waiting for the server’s first answer to initialize: usually a few seconds after the install, longer on a slow machine. A tracker’s server takes its credentials from the tracker profile in Settings. The chain waits for the answer.`,noTrackerMcp:e=>`Brief is off, so sessions get only the task ID and need the tracker’s MCP server ${e}. Turn on the package that brings it, or set brief to auto or on in the project’s settings.`,unsupported:e=>`${e} does not read Claude Code plugins: its sessions get the plugin’s MCP servers but not its skills and hooks. Does not hold the chain.`,noHooks:e=>`${e} does not run Claude Code hooks: its sessions get the plugin’s MCP servers and skills but not its hooks, only the OpenCode plugins it brings in its \`opencode/\` folder. Does not hold the chain.`},keys:`Keys`,keysTip:`Written into the .env of Even Keel. The page sees only whether a key is set. The gateway and the trackers take a new key at once.`,keyUnset:`not set`,keySaved:`Saved — type a new one to replace it`,keyReads:(e,t)=>`${e}, read by ${t}`,keyTracker:`the tracker`,keyValue:e=>`New value: ${e}`,keySave:`Save`,import:(e,t)=>`The .mcp.json of ${e} has ${t}.`,importTip:`Chain sessions no longer read the repository’s .mcp.json: its servers reach them only as packages. They join the catalog on for this project only.`,importAdd:`Add to the project`,importDismiss:`Dismiss`,marketplace:e=>`Sessions you start by hand do not see Even Keel’s plugins: Claude Code does not know the marketplace ${e}.`,marketplaceTip:`Chain sessions get Even Keel’s plugins without it, as packages. The button runs this command in your default Claude Code config; then install a plugin in a repository as usual (claude plugin install huly@even-keel).`,marketplaceAdd:`Add to Claude Code`,marketplaceAsk:`Even Keel’s marketplace`,marketplaceQuestion:e=>`Add Even Keel’s marketplace ${e} to Claude Code? Sessions you start by hand need it; chain sessions get its plugins without it.`,marketplaceYes:`Yes, add`,marketplaceNo:`No`,add:`Add`,addOpen:`Add a package`,addKind:{plugin:{title:`Plugin`,hint:`Even Keel’s own or from a marketplace Claude Code knows: its skills, hooks and commands, and its MCP servers.`},mcp:{title:`MCP server`,hint:`An address or a command: Even Keel reaches it through its gateway and keeps its keys.`},skills:{title:`My skills`,hint:`Skills of ~/.claude/skills and Codex’s skills folder, wrapped into one plugin: Codex, OpenCode and Copilot get them too.`}},skills:`Skills`,skillsGone:`its folder is gone, the copy stays`,skillsNone:`No skills in ~/.claude/skills or the Codex skills folder: each skill is a folder with its SKILL.md.`,skillsTools:`A skill that leans on Claude Code’s own tools (Edit, /rewind, subagents) works poorly on another agent.`,skillsClaude:`Claude Code sessions read these skills from their account folder, so they do not get the package. An edit of a skill shows as an update of the package within a minute.`,skillsKept:e=>`${e} is in the catalog: saving makes a new version of it, and the projects it is on stay as they are.`,skillsSave:`Save`,back:`Back`,cancel:`Cancel`,close:`Close`,plugin:`Plugin`,pluginSearch:`Plugin or marketplace`,pluginNone:`Nothing found. The list is Even Keel’s plugins and those of the marketplaces Claude Code knows; a marketplace just added there shows up within a minute.`,noAvailable:`Every plugin of Even Keel and of the marketplaces Claude Code knows is in the catalog already. A marketplace added in Claude Code (claude plugin marketplace add) shows up here within a minute.`,serverName:`Name`,serverNameHint:`Letters, digits, - and _. Sessions see its tools as mcp__<name>__….`,transport:`Connection`,transports:{http:`Address`,stdio:`Command`},serverUrl:`Address`,serverUrlHint:`An HTTP MCP server: the gateway reaches it and adds the headers.`,serverCommand:`Command`,serverCommandHint:`Runs behind the gateway. npx -y package@version gets its npm version pinned at install. Quote an argument with spaces.`,headers:`Headers`,env:`Environment`,pairsHint:e=>`Optional, one per line: ${e}. \${NAME} takes the key NAME from Keys, so sessions never see it.`,pairsInvalid:e=>`Every line is ${e}.`,where:`Turn on in`,whereAll:`Every project`,whereOne:e=>`${e} only`,whereHint:`Every project: on by default, a project can turn it off. One project: off in the others until they turn it on.`},strip:{label:(e,t)=>`${e} spend over ${t} days`,cost:`Cost`,limit:`In weekly limits`,noSnapshots:`no limit snapshots in 30 days`,since:e=>` since ${e}`,sessions:`Sessions`,median:`Median task`,medianTip:(e,t)=>`Of ${e} finished ${fe(`task`,`tasks`)(e)} with spend in ${t} days: the median cost and the median active time, each on its own`,top:`Costliest tasks`,more:`More →`,spark:e=>`${e}, by day`},session:ne,changelog:{button:`Changelog draft of the milestone`,title:e=>`Changelog · ${e}`,writing:`The agent is writing the draft from the milestone's closed tasks — this takes a minute or two.`,counts:(e,t)=>t===0?`From ${F(e)} in Done.`:`From ${F(e)} in Done; ${F(t)} still open — not in the draft.`,working:`The agent is changing the section — this takes a minute or two.`,opening:`Reading the milestone's tasks and the changelog file…`,startCounts:(e,t)=>t===0?`${F(e)} in Done.`:`${F(e)} in Done; ${F(t)} still open.`,inFile:e=>`The milestone's section now in ${e} — the draft starts from it`,noSection:e=>`${e} has no section of this milestone yet`,none:e=>e===0?`No draft yet.`:`No draft yet: the agent writes it from the Done tasks when you press “Write draft”.`,noDone:`The milestone has no task in Done — nothing to write a draft from`,draft:`Write draft`,look:`Section view`,preview:`Preview`,markdown:`Markdown`,at:(e,t)=>`Version ${e}, ${t}`,written:(e,t)=>t===``?`Already in ${e}`:`Written to ${e}, commit ${t}`,released:e=>`Released as ${e}: its section is frozen, new tasks go into the next one.`,instruction:e=>`Edit: “${e}”`,edit:`What to change`,editHint:`What to change and how — Enter sends, Shift+Enter is a new line`,add:e=>`Add ${e}`,addTip:`Work the tasks closed since this version into the section, leave the rest as it is`,again:`Write again`,copy:`Copy`,copied:`Copied`,write:`Write`,writeTip:e=>`Put the section into ${e} and commit it to the main branch`,since:e=>`+${e} since written`,sinceTip:`Done tasks of the milestone closed after its changelog was last written`,tokens:e=>`${e} tokens`,spentAll:e=>`${e} in all`,tokensDetail:(e,t,n,r)=>`Tokens: ${e} in, ${t} out, ${n} read from cache, ${r} written to cache`,paidByLimits:`Spent from the account's 5-hour and weekly limits; the dollars are at API prices.`,paidByLimitsNoCost:`Spent from the account's limits; this agent counts no cost, only tokens.`,paidByKey:`Paid from the account's API key credit.`,spentTotal:(e,t,n)=>`All versions of the milestone: ${P(`turn`,`turns`)(e)}, ${t}${n>0?`, ${n} more without a cost`:``}`,notInStats:`These turns keep no transcript, so /stats does not count them.`},chain:{legend:{done:`done`,working:`triangle — working`,waiting:`? — waiting for a reply`,handoff:`arrow — checkpoint has no successor session`,stopped:`square in a ring — session stopped, task still open`,error:`error or limit`,ahead:`waiting for its turn in the chain`,backlog:`in the backlog`,canceled:`canceled`,fixed:`cross — project branch fix completed`},archive:`Archive`,archived:(e,t)=>t===0?F(e):e===0?me(t):`${F(e)} · ${me(t)}`,archiveShown:(e,t)=>`${e} of ${t}`,archiveMore:e=>`${e} more`,loadMore:(e,t)=>`Show ${e} older of the ${t} folded`,openArchive:`Show the latest closed tasks`,foldArchive:`Fold the archive`,nextMilestone:`Show the milestone`,foldMilestone:`Fold the milestone`,linksHint:`The selected task or the task under the cursor highlights its blockers and the tasks waiting for it.`,dragHint:`Reorder by dragging a card, on a phone — after a long press.`,lockedHint:`A lock instead of the state lamp marks a blocker outside the chain. Use “Move to Todo” in its number slot or change its status in the tracker. A blocker labelled Manual must be completed by you.`,readyRefused:e=>`Taking it into the chain would stop the chain: ${e}`,tasks:F,noMilestone:`No milestone`,hidden:e=>`hidden · ${e}`,skipped:`skipped`,fix:`Fixing main`,fixLanded:(e,t)=>t===null?he(e):`${he(e)} → ${t}`,fixDropped:e=>`${he(e)} — dropped, main stayed as it was`,carry:e=>`Carry of ${e}: the agent resolves the conflict`,carryAsked:e=>`Carry of ${e}: the agent will resolve the conflict`,carried:(e,t)=>`Carry of ${e}: ${P(`commit`,`commits`)(t)}`,carryDropped:e=>`Carry of ${e}: skipped, the conflict waits`,fixRuns:`Open the CI panel with the runs of these commits`,interrupted:`waits for main`,interruptedTitle:`Main went red: the session of this task was stopped and goes on once main is fixed`,review:{pull:e=>`PR #${e}`,pullTitle:`The task waits on its pull request outside the chain: open it`,feedback:`feedback`,feedbackTitle:`The pull request got review comments or a failed check: they go to the task’s session`,merged:`merged`,closed:`closed`},questionTitle:`Label “Question”: without an answer in the description the session will most likely get stuck`,question:`question`,work:{uncommitted:e=>`uncommitted · ${e}`,unmerged:e=>`not merged · ${e} ${fe(`commit`,`commits`)(e)}`,files:e=>`${e} ${fe(`file`,`files`)(e)} not committed`,commits:e=>`${e} ${fe(`commit`,`commits`)(e)} not in the main branch`,branch:e=>`branch ${e}`,fix:`Answer the task’s question and move it back to Todo: a new session goes on with a handoff. Or commit and merge it by hand.`,closed:`The task is closed and the cleanup left this behind. Commit and merge it, or delete the folder, and the task goes to the archive; “Done” sends it there at once.`,backlog:`A backlog task has work that is not committed`},blocker:`blocks`,dependent:`waits for it`,ghost:`will stand here`,resets:e=>`context resets: ${e}`,resetsOf:e=>{let t=[e.checkpoint>0?`${e.checkpoint} at a checkpoint`:``,e.limit>0?`${e.limit} after the limit`:``,e.relay>0?`${e.relay} for another reason`:``,e.restart>0?`${e.restart} by hand`:``].filter(e=>e!==``),n=e.compactions>0?`compactions: ${e.compactions}`:``;return[t.join(`, `),n].filter(e=>e!==``).join(`; `)},resetsTitle:`Context resets: new sessions with a handoff and compactions`,accountMark:e=>`Not the project's account: ${e}`,starting:{launch:`starting`,handover:`handing over`,boot:`booting`,answer:`first answer`},openCard:`Open the task card`,away:({entered:e,archived:t,removed:n})=>`While you were away: ${[e>0?`+${F(e)}`:``,t>0?`${t} archived`:``,n>0?`${n} left the chain`:``].filter(e=>e!==``).join(`, `)}`,family:e=>`Subtasks of ${e}`,shapes:{urgent:`urgent`,high:`high priority`,low:`low priority`,rework:`rework`,family:`subtasks of one parent`,estimate:`thin line at the card edge — estimated task work time; longer means a larger estimate`}},help:k,card:{close:`Close`,openIn:e=>`Open in ${e??`the tracker`}`,loading:`Loading the task…`,none:`The tracker gives no card for this task — open it in the tracker.`,status:`Status`,priority:`Priority`,milestone:`Milestone`,parent:`Parent`,labels:`Labels`,priorities:{urgent:`urgent`,high:`high`,medium:`medium`,low:`low`,none:`none`},noMilestone:`none`,due:e=>`due ${e}`,roles:{model:`The session of the task runs on this model`,modelOff:`Run labels are off for this project: this label has no effect now`,question:`Without an answer in the description the session will most likely get stuck`,excluded:`This label keeps the task out of the chain`,required:`The chain takes only tasks with this label`},requires:e=>`The chain takes only tasks labeled ${e}: without it the task stays in the backlog, Todo or not.`,work:`Work not in the main branch`,blockedBy:`Blocked by`,blocks:`Blocks`,related:`Related`,description:`Description`,noDescription:`No description.`,comments:e=>`Comments · ${e}`,noAuthor:`no author`,ready:`Into the chain`,readyHint:`The task is in the backlog: this moves it to Todo and puts on the label the chain requires.`,unready:`To the backlog`,unreadyHint:`Takes the task out of the chain: back to a backlog status, the labels the chain requires off.`,attachments:`Attachments`,download:e=>`Download ${e}`,viewer:{close:`Close`,prev:`Previous`,next:`Next`,original:`Open the file`},run:{title:`Runs on`,provider:`Provider`,model:`Model`,asProject:e=>`As the project · ${e}`,modelAsProject:e=>`as the project · ${e}`,severalPick:e=>`${e} run labels · as the project`,several:`With several run labels the chain runs the task as the project says. Saving replaces them with the pick.`,save:`Save`,off:`Run labels are off for this project: the label is saved but the session runs as the project says.`,offTip:`Run labels are off for this project: the label has no effect now.`,confirmTitle:e=>`Run labels · ${e}`,confirmQuestion:e=>`Run labels are off for project ${e}. Turn them on so the task runs on the chosen model?`,confirmOn:`Turn on and save`,live:`A session is on the task: the new model takes effect from its next session.`,readOnly:`This tracker cannot change labels here: change the run label in the tracker.`}},setup:{title:`Set up Even Keel`,lead:`A few steps before the first task. Anything here can be changed later in Settings.`,stepsLabel:`Setup steps`,steps:{language:`Language`,git:`Git`,agent:`Agent`,tracker:`Tracker`,updates:`Updates`,stats:`Stats`,project:`First project`},titles:{language:`Languages`,git:`Git`,agent:`What runs the sessions`,tracker:`Where the tasks come from`,updates:`New versions`,stats:`Session stats`},nextTo:e=>`Next: ${e}`,back:`Back`,skip:`Skip for now`,pageLanguage:`Page`,pageLanguageHint:`The page's labels and the service's messages on it.`,promptLanguage:`Session prompts`,promptLanguageHint:`The language Even Keel writes to sessions in and asks questions in the tracker with. A project can have its own.`,agentLead:`The agent picked is shared by all projects; a project can pick another one in its wizard.`,ready:e=>`${e}: signed in`,checking:e=>`${e}: checking the sign-in…`,signIn:e=>`${e}: needs a sign-in`,noAccount:e=>`No ${e} account yet.`,addAccount:`Add an account`,login:`Sign in`,trackerLead:`Even Keel reads tasks with an access profile: the tracker address and a token. It can be added later too, in the project wizard or in Settings → Trackers and CI.`,connect:`Connect`,addAnother:`Add another`,updatesLead:`Even Keel can ask GitHub twice a day whether a new version is out: without a token, GitHub sees only the machine address and the Even Keel version.`,updates:{on:`Check`,off:`Don't check`},updatesHints:{on:`A notification on the page tells of a new version, and one button updates.`,off:`The service does not go to GitHub. Changed in Settings → Interface.`},git:{lead:`Every task is a git branch: sessions commit and merge, so Even Keel does not work without git.`,checking:`Checking git…`,installed:e=>`Git ${e} is installed.`,absent:`Git is not found on this machine. Even Keel does not install it: run the command below, then check again.`,linux:`With the package manager of your distribution, for example:`,again:`Check again`,identity:`Name and e-mail for commits`,identityLead:`Sessions commit and merge under this name. It is written into the global git config of the user the service runs as.`,identityMissing:`Git has no name or e-mail yet, and the first commit of the first task would fail.`,name:`Name`,email:`E-mail`,save:`Save`}},tally:{title:`Session stats`,stepStats:`Stats`,stepConnection:`Connection`,lead:`Tally collects stats of the chain’s sessions: what a task costs, where the tokens go, what changed after a rule edit. It is optional — Even Keel works without it.`,preview:`The stats page: spending by day, tasks and models`,facts:[`What is collected: every 5 minutes, the sessions’ transcripts — tokens, cost, models, turns, commands, rule files and the raw lines.`,`Where it is kept: in a built-in database in Even Keel’s state folder or in your own Postgres. It goes nowhere else.`,`How much room: about a third of the transcripts. On a live install, 1.13 GB of database for 3.1 GB of transcripts, 944 MB of it the raw lines.`,`Without stats the checkpoint threshold stays at 200k tokens: there is nothing to tune it by.`,`Until you choose, nothing is installed or collected. The choice can be changed any time in Settings → Stats; turning stats off deletes no data.`],modes:{off:`No stats`,local:`Local database`,server:`Your own Postgres`},modeHints:{off:`The collector does not run and no database is created. The rest of Even Keel works as usual.`,local:`A built-in PGlite in Even Keel’s state folder. Nothing to install.`,server:`Your PostgreSQL: its address, a database and two users, a reader and a writer. The connection is checked before saving.`},current:`now`,host:`Host`,port:`Port`,database:`Database`,readerPassword:`Reader password (tally_reader)`,writerPassword:`Writer password (tally_writer)`,passwordKept:`set — blank keeps it`,save:`Check and save`,checking:`Checking…`,apply:`Apply`,back:`Back`,where:`Where stats are written`,whereHint:`Applies at once, without a restart. Turning stats off deletes no data and keeps the connection fields.`},stats:{title:`Stats`,reading:`Reading stats…`,failed:e=>`Even Keel didn't answer: ${e}`,off:e=>`Tally stats are off: ${e} not set in .env.`,disabled:`Session stats are turned off.`,disabledLink:`Turn them on in the settings`,unchosen:`Session stats are not set up yet.`,unchosenLink:`Set them up`,dbError:e=>`The Tally database is unavailable: ${e}`,newer:(e,t)=>`The Tally database is at schema version ${e}, and this Even Keel knows only up to ${t}: it was updated and then rolled back. Update Even Keel again — stats are not read or collected until then.`,scopes:{all:`all`,chain:`chain`},sessions:`Sessions`,account:`Account`,all:`all`,read:e=>`Tally · read ${e}`,others:`others`,noTask:`no task`,stamps:{calm:[`DEAD CALM`,`no spend found`],overspend:e=>[`OVER BUDGET`,`${e} · approved retroactively`],aground:e=>[`AGROUND`,`${e} of the money went to being stuck`],bargain:[`SAVINGS`,`suspicious ones`],evenKeel:[`EVEN KEEL`,`certified by Even Keel`]},remarks:{mono:e=>`all on ${e}. A monoculture`,baseline:`the project median guesses better than the estimates. Ouch`,sharp:`estimates come true more often than the weather forecast`,optimist:e=>`"five minutes" optimism: ${e}`,pessimist:e=>`${e} of the estimate — padded for a storm`,whale:(e,t)=>`${e} ate ${t} of the budget. A private yacht club`,stubborn:(e,t)=>`${e}: ${t} sessions and it won't give up`,stuck:{unclear_task:`tasks written in a hurry — sessions had to guess`,broken_tooling:`the tooling broke. Not Claude's fault, honest`,debug_loop:`debugging in circles: one more fix and it surely works`,waiting_user:`sessions waited for you. They don't hold a grudge`,limit_env:`limit and environment: lying at anchor`}},period:{presets:{"7d":`7 days`,"30d":`30 days`,month:`This month`,"last-month":`Last month`,"3m":`3 months`,year:`This year`,all:`All time`},monthsOfDay:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],monthsShort:[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],months:[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],weekdays:[`Mo`,`Tu`,`We`,`Th`,`Fr`,`Sa`,`Su`],previous:`Previous period`,next:`Next period`,dialog:`Period`,from:`From`,to:`to`,years:`Years`,previousYear:`Previous year`,nextYear:`Next year`,previousMonth:`Previous month`,nextMonth:`Next month`,pickStart:`First click — start, second — end.`,pickEnd:e=>`From ${e} — pick the end.`},projects:{label:`Projects`,count:e=>`Projects (${e})`,all:`all`,find:`Find`,findLabel:`Find a project`,empty:`No spend in the period.`,include:e=>`Include ${e}`,only:`Keep only this project`,selectAll:`All`,reset:`Reset`},summary:{cost:`Cost`,noPrevious:`no previous span`,change:(e,t)=>`${e} vs the previous ${t} ${fe(`day`,`days`)(t)}`,unpriced:e=>` · ${e} unpriced`,limit:`In weekly limits`,tasks:`Tasks / sessions`,answers:fe(`answer`,`answers`),stuck:`Spent stuck`,stuckNote:`answers inside stuck spans`,noLimit:`no data: no limit snapshots in the period`,from:e=>`from ${e}`,to:e=>`to ${e}`,perWeek:e=>`weekly average${e&&` ${e}`}`,sum:e=>`sum of shares ${e||`over the period`}`,sources:`Where the spend goes`,model:`Model`,entrypoint:`Entry point`,windows:`windows`,limitsByAccount:`Limits by account`,closed:`closed`,open:`ongoing`},labels:{reasons:{unclear_task:`unclear task`,broken_tooling:`broken tooling`,debug_loop:`debugging in circles`,waiting_user:`waited for the user`,limit_env:`limit or environment`,normal:`normal`,other:`other`},kinds:{failures:`failures in a row`,denied:`permission denied`,repeat:`repeated command`,reread:`file reread`,no_commit:`no commit`,rewind:`rewind`,compact:`context compaction`,handoff:`after a handoff`},otherModels:`others`,desktop:`app`,otherEntrypoint:`other`,launches:{launch:`launch`,start:`launch`,resume:`resume`,relay:`limit handoff`,restart:`new session`,checkpoint:`checkpoint`},unsorted:`not classified`,outsideChain:`outside the chain`},spend:{metrics:{cost:[`$`,`Cost at API prices`],limit:[`% of limit`,`Share of the weekly limit`],sessions:[`sessions`,`New sessions`]},steps:{day:[`D`,`By day`],week:[`W`,`By week`],month:[`M`,`By month`]},titles:{day:`Spend by day`,week:`Spend by week`,month:`Spend by month`},metric:`What to count`,step:`Step`,empty:`Nothing in the period`,mark:e=>`Rule change: ${e}`,zoom:`Drag across the chart to zoom in`,zoomOut:`; double-click to go back`,marks:` Notches at the axis are rule changes: click one to compare before and after.`},tasks:{columns:{task:[`Task`],project:[`Project`],status:[`Status`],cost:[`$`,`Cost at API prices`],limit:[`Limit`,`Share of the weekly limit`],estimate:[`Estimate`,`Task estimate in the tracker`],active:[`Time`,`Active time of all sessions of the task by transcript turns, over the whole task`],wait:[`Waiting`,`How long the task waited for your reply, over the whole task`],sessions:[`Sessions`],handoffs:[`Handoffs`,`Limit handoffs, checkpoints and manual replacements`],compacts:[`Compactions`,`Context compactions in the sessions of the task: the session goes on with a summary instead of its history`],spans:[`Stuck`],rework:[`Rework`]},title:`Tasks`,empty:`No tasks with spend in the period.`,yes:`yes`,first:e=>`Show the first ${e}`,all:e=>`Show all (${e})`,ofEstimate:e=>`, ${e} of the estimate`,total:e=>`total time: ${e}`,open:`, task not closed`,handoffs:(e,t,n)=>`limit: ${e}, checkpoints: ${t}, by hand: ${n}`,compacts:(e,t)=>`automatic: ${e}, /compact: ${t}`,compaction:(e,t,n)=>`${e===`auto`?`Automatic compaction`:`Compaction by /compact`}: ${t} → ${n} tokens`,noSessions:`No sessions for the task.`,steps:`Steps:`,stepsNote:` — share of the task time`,launches:pe},stuck:{title:`Stuck`,none:`Sessions didn't get stuck in the period.`,week:(e,t)=>`Week of ${e}: ${t}`,latest:`Latest spans`},estimate:{project:`Project`,component:`Component`,noComponent:`no component`,model:`Model`,unknown:`unknown`,unestimated:e=>`no estimate: ${e}`,open:e=>`not closed: ${e}`,title:`Time and estimates`,note:`time is the active work of the agent by turns, over the whole task; only closed tasks with an estimate are compared`,median:`Median task time`,done:P(`closed task`,`closed tasks`),within:`Within ×1.5 of the estimate`,compared:e=>`${F(e)} compared`,ratio:`Actual / estimate, median`,noEstimates:`no tasks with an estimate`,faster:`faster than estimated`,slower:`slower than estimated`,exact:`exactly as estimated`,comparedTitle:`Tasks compared`,tasks:`Tasks`,withinTitle:`Share of tasks within ×1.5 of the estimate`,medianTitle:`Median actual / estimate`,medianColumn:`Median`,within2:e=>`within ×2: ${e}`,within2Title:`Share of tasks within ×2 of the estimate`,baseline:`Project median instead of the estimate`,baselineNote:`within ×1.5; an estimate that does not beat this tells nothing`,baselineColumn:`Const.`,baselineTitle:`Within ×1.5 if every task were estimated at the median time of its project’s closed tasks (median of this selection, not of the past)`},checkpoint:{title:`Checkpoint threshold`,defaults:e=>`Other projects: ${e} — 200k default`,note:`the context size at which a session is first asked to hand the task over`,sources:{default:()=>`default`,config:()=>`set in the config`,calibrated:e=>`from ${e} sessions of the project`},waiting:(e,t,n,r)=>`Calibration starts at ${n} handoffs and ${r} sessions over 150k; the project has ${e} and ${t}`},steps:{title:`Steps`,note:e=>`builds, checks and tests by command; a background run lasts until its completion notice; the share is of the active time of ${e} ${fe(`task`,`tasks`)(e)} over the whole task`,grew:e=>e,grewFrom:(e,t)=>` grew from ${e} to ${t} `,week:e=>`week of ${e}`,step:`Step`,runs:`Runs`,slow:e=>`Share of runs longer than ${e}`,spread:`Distribution`,coldTitle:`First run of the step in a worktree or a slot on this branch: p50 and count`,cold:`Cold`,warmTitle:`Repeated runs: p50 and count`,warm:`Warm`,failedTitle:`Failure or timeout`,failed:`Failed`,shareTitle:`Share of the active task time spent on the step`,share:`Task time`,weeklyTitle:`p90 by week`,weekly:`By week`,launches:P(`run`,`runs`),outcomes:(e,t,n,r)=>`failed ${e}, timeout ${t}, killed ${n}, unknown ${r}`,unruled:`Commands without a rule — longest in total`,command:`Command`},rules:{kinds:{claude_md:`CLAUDE.md`,skill:`skills`,hook:`hooks`,settings:`settings`,agent:`agents`,memory:`memory`},quoted:e=>`“${e}”`,purposes:{economy:`economy`,quality:`quality`,process:`process`,infra:`infrastructure`},later:`later`,earlier:`earlier`,drift:(e,t)=>`${e} ${t} in the transcript`,hour:`±hour`,day:`±day`,noTaskSession:`session without a task`,imported:`imported`,manual:`by hand`,actions:{added:`added`,changed:`changed`,removed:`removed`},all:`all`,noTexts:`No version texts in the database.`,noText:`No version text — the change shows only as line counts.`,title:`Rule changes`,note:`when CLAUDE.md, skills, hooks and settings changed — and what happened to the spend`,coverage:`Tracked: CLAUDE.md since September 4, 2026, skills since August 3, hooks and settings since the first snapshot. Memory changes are not marked.`,files:`Files`,purpose:`Purpose`,none:`No rule changes in this period.`,fileCount:P(`file`,`files`),pick:`Pick a change in the list or a mark on the chart — the changed files and a before-and-after comparison of the spend appear below. Shift- or Ctrl-click on a second change compares the whole stretch between them.`,changed:`What changed`,shared:`shared`,places:{label:`Where the files live`,shared:`shared`,project:`projects`},today:`today`,yesterday:`yesterday`,compare:`Before and after`,eachSide:`on each side of the change`,days:`Days on each side`,dayCount:e=>`${e} d`,time:e=>`time ${e}`,driftNote:e=>`The import and the transcript disagree: ${e}`,one:e=>`Rule change · ${e}`,many:(e,t)=>`Rule changes · ${e} — ${t}`,moreFiles:e=>`and ${e} more files`,moreSets:e=>`and ${e} more sets`,tipHint:`Click — before and after, Shift-click — a second mark`},compare:{metrics:{taskCost:`Task cost, median`,sessionsPerTask:`Sessions per task`,meanContext:`Mean context per request`,over150Share:`Requests over 150k`,requestCost:`$ per request`,stuckShare:`Spend while stuck`,errorShare:`Tool failures`,deniedShare:`Tool denials`,entryTokens:`Entry cost: context of the first answer, median`},samples:{tasks:F,sessions:P(`session`,`sessions`),requests:P(`request`,`requests`)},few:(e,t)=>`Too little data: the comparison needs at least ${e} tasks and ${t} sessions on each side.`,models:`The sides used different models, and each model has its own token price: the dollar rows change even without a rule change. Context and shares don't depend on it.`,metric:`Metric`,before:`Before`,after:`After`,beside:`Side by side`,left:`Left`,right:`Right`,change:`Change`,modelShares:`Models, share of requests`,foot:`Lower is better in every row. A task belongs to the side of its first message, a session to the side of its start; a different set of tasks on each side changes the numbers too.`,families:{title:`By model`,model:`Model`,side:`Side`,tasks:`Tasks`,cost:`$ total`,closedCost:`Closed task cost, median`,closedTime:`Closed task time, median`,ratio:`Actual / estimate, median`,closed:e=>`${e} closed`,estimated:e=>`${e} with an estimate`,unknown:`unknown`,thin:`too little data`,thinTitle:e=>`Fewer than ${F(e)} closed tasks of this model on a side: don't read into this row.`,note:`The Sonnet and Haiku labels move small tasks to cheaper models, and the overall median drops even when tasks of one model got no cheaper: compare cost and time within a model. Tasks here are counted as in the session audit: a session gives all its spend to its task, a task belongs to the side of its first session, its model is the most frequent one over its sessions, time is the active time of the whole task.`}}}},ve=e=>e.join(`, `),ye={"config.protection":()=>`Use valid protection groups and native deny rules`,"config.branch":e=>`${e.value} is not a branch name`,"config.changelogPath":e=>`${e.value} is not a file path inside the repository`,"config.repoEmpty":()=>`The folder of the repository is empty`,"config.slot":()=>`Off, on, or a whole number of slots from 1`,"config.color":()=>`A color from 1 to 8`,"config.ruleList":()=>`Every line needs a name`,"config.projectPrompt":()=>`Must be text`,"config.projectName":()=>`Must be text`,"config.providerName":()=>`Must be text`,"config.commandList":()=>`One command per line`,"config.ciWait":()=>`A whole number of minutes, 0 or more, or empty`,"config.ciKinds":e=>`Only ${ve(e.known)}`,"config.remoteProfiles":()=>`Pick a profile for each kind of remote`,"config.standards":()=>`Each standard needs a document inside the repository and at least one file mask; a document only once`,"config.mergeIntoValue":()=>`Pick a project or none`,"config.mergeInto":e=>`${e.into} is not another project or merges into one itself: a project merges only into one that merges nowhere`,"config.mergeIntoForeign":e=>`${e.into} is a checkout of another repository: they share no remote, and neither is a clone of the other`,"config.statusBoth":e=>`"${e.status}" is in both "Statuses in work" and "Closed statuses"`,"config.labelBoth":e=>`"${e.label}" is in both "Only tasks with labels" and "No tasks with labels"`,"config.milestoneBoth":e=>`"${e.milestone}" is in both "Only tasks in milestones" and "No tasks in milestones"`,"config.trackerProjectShared":e=>`${e.other} reads the tracker project ${e.trackerProject} too, and a task may enter both chains: split them by "Only tasks in milestones" and "No tasks in milestones"`,"config.trackerLocked":()=>`The chain has started tasks of this project, so its tracker and profile stay; tasks of another tracker come in through "Task feeds"`,"config.trackerName":()=>`Pick a tracker`,"config.trackerUnknown":e=>`There is no tracker "${e.name}", there are ${ve(e.known)}`,"config.trackerProject":e=>`Name the project in the tracker like ${e.example}`,"config.brief":()=>`On or off`,"config.briefValue":()=>`On, off or as the shared settings`,"config.language":e=>`There is no language ${e.value}`,"config.provider":e=>`There is no provider ${e.value}`,"config.execution":e=>`There is no mode ${e.value}`,"config.cli":e=>`There is no choice ${e.value}`,"config.executionCli":()=>`The Agent SDK runs only on the checked CLI: pick "Checked" in "CLI version"`,"config.checkpointShare":e=>`A whole percent of the context window, 1 to 100, not ${e.value}`,"config.checkpointShareOrder":e=>`First < Late < Hard, not ${e.first}, ${e.late}, ${e.hard}`,"config.modelPrompts":()=>`A prompt per model`,"config.modelPromptEmpty":e=>`The prompt of ${e.model} is empty`,"config.modelPromptPlaceholder":e=>`The prompt of ${e.model} has ${e.placeholder}, but a model prompt goes to the session as it is, without substitutions`,"config.hiddenSkills":()=>`A skill name per line`,"config.cacheTtl":()=>`5 min, 1 h, or empty`,"config.autoCompactWindow":()=>`Positive whole tokens, or empty for the account window`,"config.parallel":e=>`A whole number from 1, not ${e.value}`,"config.keepWarm":e=>`Whole hours from 0 to ${e.max}, not ${e.value}`,"config.allowedHosts":()=>`A host name per line`,"config.contextWindow":e=>`A whole number of tokens from 1, not ${e.value}`,"config.contextPercents":()=>`Percents with 0 < Warning < Danger ≤ 100`,"config.compareValue":e=>`A whole number from 1 to ${e.limit}, not ${e.value}`,"config.statsMove":()=>`A moved folder needs both its old and its new path`,"config.otherBelow":e=>`A number of dollars from 0, not ${e.value}`,"config.checkpointTokens":e=>`A whole number of tokens from ${e.from}, or empty, not ${e.value}`},be=e=>e.join(`, `),xe={"config.protection":()=>`Нужны допустимые группы защиты и правила запретов агентов`,"config.branch":e=>`${e.value} — не имя ветки`,"config.changelogPath":e=>`${e.value} — не путь к файлу внутри репозитория`,"config.repoEmpty":()=>`Папка репозитория пуста`,"config.slot":()=>`Выключено, включено или целое число слотов от 1`,"config.color":()=>`Цвет от 1 до 8`,"config.ruleList":()=>`В каждой строке нужно имя`,"config.projectPrompt":()=>`Нужен текст`,"config.projectName":()=>`Нужен текст`,"config.providerName":()=>`Нужен текст`,"config.commandList":()=>`По команде на строку`,"config.ciWait":()=>`Целое число минут от 0 или пусто`,"config.ciKinds":e=>`Только ${be(e.known)}`,"config.remoteProfiles":()=>`Выберите профиль для каждого вида remote`,"config.standards":()=>`У каждого стандарта — документ внутри репозитория и хотя бы одна маска файлов; документ — только один раз`,"config.mergeIntoValue":()=>`Выберите проект или «никуда»`,"config.mergeInto":e=>`${e.into} — не другой проект или сам вливается в другой: вливаться можно только в проект, который никуда не вливается`,"config.mergeIntoForeign":e=>`${e.into} — чекаут другого репозитория: общего remote у них нет, и ни один не клон другого`,"config.statusBoth":e=>`«${e.status}» стоит и в «Статусы в работе», и в «Закрытые статусы»`,"config.labelBoth":e=>`«${e.label}» стоит и в «Только задачи с метками», и в «Без задач с метками»`,"config.milestoneBoth":e=>`«${e.milestone}» стоит и в «Только задачи из майлстоунов», и в «Без задач из майлстоунов»`,"config.trackerProjectShared":e=>`${e.other} тоже читает проект трекера ${e.trackerProject}, и задача может попасть в обе цепи: разделите их полями «Только задачи из майлстоунов» и «Без задач из майлстоунов»`,"config.trackerLocked":()=>`Цепь уже запускала задачи этого проекта, поэтому трекер и профиль остаются; задачи другого трекера приходят через «Источники задач»`,"config.trackerName":()=>`Выберите трекер`,"config.trackerUnknown":e=>`Трекера «${e.name}» нет, есть ${be(e.known)}`,"config.trackerProject":e=>`Назовите проект в трекере так: ${e.example}`,"config.brief":()=>`Включено или выключено`,"config.briefValue":()=>`Включено, выключено или как в общих настройках`,"config.language":e=>`Языка ${e.value} нет`,"config.provider":e=>`Провайдера ${e.value} нет`,"config.execution":e=>`Режима ${e.value} нет`,"config.cli":e=>`Варианта ${e.value} нет`,"config.executionCli":()=>`Agent SDK работает только на проверенной копии CLI: выберите «Проверенную» в «Версии CLI»`,"config.checkpointShare":e=>`Целый процент окна контекста от 1 до 100, а не ${e.value}`,"config.checkpointShareOrder":e=>`Первый < Поздний < Жёсткий, а не ${e.first}, ${e.late}, ${e.hard}`,"config.modelPrompts":()=>`По промпту на модель`,"config.modelPromptEmpty":e=>`Промпт ${e.model} пуст`,"config.modelPromptPlaceholder":e=>`В промпте ${e.model} есть ${e.placeholder}, а промпт модели уходит в сессию как есть, без подстановок`,"config.hiddenSkills":()=>`По имени навыка на строку`,"config.cacheTtl":()=>`5 мин, 1 ч или пусто`,"config.autoCompactWindow":()=>`Положительное целое число токенов или пусто — окно аккаунта`,"config.parallel":e=>`Целое число от 1, а не ${e.value}`,"config.keepWarm":e=>`Целое число часов от 0 до ${e.max}, а не ${e.value}`,"config.allowedHosts":()=>`По имени хоста на строку`,"config.contextWindow":e=>`Целое число токенов от 1, а не ${e.value}`,"config.contextPercents":()=>`Проценты, 0 < Предупреждение < Опасно ≤ 100`,"config.compareValue":e=>`Целое число от 1 до ${e.limit}, а не ${e.value}`,"config.statsMove":()=>`Перенесённой папке нужны и старый, и новый путь`,"config.otherBelow":e=>`Число долларов от 0, а не ${e.value}`,"config.checkpointTokens":e=>`Целое число токенов от ${e.from} или пусто, а не ${e.value}`},Se={checkingCli:`Проверяем вход в CLI на этом компьютере…`,existingCli:`На этом компьютере уже есть вход в CLI. Добавить его в Even Keel?`,useCli:`Использовать этот вход`,removeGlobal:`Убрать этот аккаунт из Even Keel? Папка CLI и вход на этом компьютере сохранятся.`,title:`Новый аккаунт`,titleOf:e=>`Новый аккаунт ${e}`,providerLead:`Чей это аккаунт?`,ways:`Как входит`,name:`Имя (необязательно)`,key:{key:`API-ключ`,token:`Токен`},way:{claude:{subscription:{title:`Подписка`,gets:`Лимиты вашего плана Claude: 5 часов и неделя`,tip:`Вход в новой папке через CLI Claude Code: активный аккаунт не меняется. Claude выдаст ссылку — откройте её, войдите нужным аккаунтом и вставьте сюда код со страницы.`,next:`Дальше: ссылка, вход нужным аккаунтом и код со страницы входа.`,rule:``,action:`Войти через Claude`},apiKey:{title:`API-ключ`,gets:`Оплата за токены, без лимитов плана`,tip:`Новая папка с ключом в её settings.json. Сессии на ней платят за токены: лимитов на 5 часов и неделю нет, Remote Control нет, а сессия, у которой кончились деньги, ждёт, пока они снова появятся на ключе.`,next:`Ключ Anthropic, начинается с sk-ant-.`,rule:``,action:`Проверить и добавить ключ`}},codex:{subscription:{title:`Подписка ChatGPT`,gets:`Лимиты вашего плана ChatGPT: 5 часов и неделя`,tip:`Вход нового аккаунта Codex через ChatGPT в отдельную папку: Codex выдаст ссылку и одноразовый код — откройте ссылку, войдите и введите там код.`,next:`Дальше: ссылка и одноразовый код — откройте ссылку, войдите и введите там код.`,rule:`Бесплатный аккаунт Codex — не больше одного: условия OpenAI не разрешают несколько бесплатных аккаунтов ради лимитов. С подпиской — сколько нужно.`,action:`Войти через ChatGPT`},apiKey:{title:`API-ключ`,gets:`Ключ OpenAI, оплата за токены`,tip:`API-ключ OpenAI — в auth.json новой папки Codex. Сессии на нём платят за токены по условиям API OpenAI, правило одного бесплатного аккаунта к нему не относится; сессия, у которой кончились деньги, останавливается как при любой ошибке.`,next:`Ключ OpenAI, начинается с sk-.`,rule:``,action:`Проверить и добавить ключ`}},opencode:{chatgpt:{title:`ChatGPT`,gets:`Лимиты плана ChatGPT: 5 часов и неделя`,tip:`OpenCode войдёт через ChatGPT в новую папку и будет тратить лимиты вашего плана ChatGPT — те же, что у Codex на этом аккаунте.`,next:`Дальше: ссылка и одноразовый код — откройте ссылку, войдите и введите там код.`,rule:``,action:`Войти через ChatGPT`},free:{title:`Бесплатные модели`,gets:`Модели OpenCode Zen: без входа`,tip:`Бесплатным моделям OpenCode Zen вход не нужен: папка добавится сразу. Выбор моделей меньше, а лимит бесплатного использования у OpenCode свой: Even Keel не видит его заранее и узнаёт, только когда сессия в него упрётся.`,next:`Вход не нужен: папка добавится сразу.`,rule:``,action:`Добавить с бесплатными моделями`},apiKey:{title:`API-ключ`,gets:`Ключ Anthropic или OpenAI, оплата за токены`,tip:`API-ключ Anthropic (sk-ant-…) или OpenAI — в auth.json новой папки OpenCode: чей это ключ, видно по его началу. Сессии на нём платят за токены; модель укажите в профиле запуска, вроде anthropic/claude-sonnet-4-5.`,next:`Ключ Anthropic (sk-ant-…) или OpenAI (sk-…).`,rule:`Claude через OpenCode — только по ключу: подписку Claude Anthropic разрешает только в Claude Code.`,action:`Проверить и добавить ключ`}},copilot:{machine:{title:`Вход этой машины`,gets:`Вход copilot login этой машины, добавляется сразу`,tip:`Новая папка Copilot на входе copilot login этой машины. CLI хранит этот вход в хранилище учётных данных системы, поэтому все такие папки — один и тот же аккаунт GitHub; для другого аккаунта нужен токен. Even Keel этот вход не ведёт и лимиты его не читает.`,next:`Сначала один раз выполните copilot login в терминале этой машины — папка добавится сразу на этом входе.`,rule:`Не больше одного бесплатного аккаунта Copilot и никаких переключений между аккаунтами ради бюджета: условия GitHub разрешают один бесплатный аккаунт на человека плюс машинный аккаунт для автоматизации.`,action:`Добавить на входе этой машины`},token:{title:`Токен`,gets:`Другой аккаунт GitHub, виден месячный запас`,tip:`Мелкозернистый личный токен (github_pat_…) с правом Copilot Requests или OAuth-токен (gho_…) — в новую папку Copilot; классический ghp_ CLI не принимает. Сессии тратят AI credits аккаунта, чей это токен.`,next:`Личный токен github_pat_… с правом Copilot Requests или OAuth-токен gho_….`,rule:``,action:`Проверить и добавить токен`}}},rows:{open:`Откройте страницу входа`,signIn:`Войдите нужным аккаунтом`,code:`Вставьте сюда код со страницы`,deviceCode:`Введите там этот код`},picksUp:`Конец входа это окно заметит само.`,otherAccount:`Войти другим аккаунтом`,outputBeforePlan:`Вывод CLI: вход до проверки плана`,discard:{title:`Отбросить введённое?`,question:`Имя и ключ, введённые здесь, пропадут.`,confirm:`Отбросить`,cancel:`Продолжить ввод`},stop:{title:`Отменить вход?`,question:`Ссылка и код перестанут работать, новый аккаунт не добавится.`,confirm:`Отменить вход`,cancel:`Продолжить вход`}},Ce={title:`Общие настройки`,hint:`Хранятся в базе Even Keel и действуют для всех проектов, у которых нет своего значения; npm run storage -- config-export и config-import правят их как файл. Применяются сразу, кроме отмеченных.`,elsewhere:`Адрес и порт службы — переменные EVEN_KEEL_HOST и EVEN_KEEL_PORT в .env; профили трекеров и CI — на вкладке «Трекеры и CI». Проект добавляется кнопкой «+ Добавить проект» на главной.`,trackers:`Трекеры и CI`,chain:`Цепочка`,rules:`Правила цепочки`,ruleScopes:`Чьи правила`,allTrackers:`Все трекеры`,ownRules:`свои правила`,sections:{run:`Запуск`,tasks:`Задачи`,agent:`Агент`,prompts:`Метки запуска и промпты`,tools:`Инструменты`,context:`Контекст`,interface:`Интерфейс`,access:`Доступ к странице`,other:`Прочее`},parallel:`Цепочек одновременно`,parallelHint:`Остальные проекты ждут в очереди. Уменьшение ничего не останавливает: новая цепочка не стартует, пока их не станет меньше.`,sessions:`Сессии`,claude:`Claude Code`,ci:`Проверка и CI`,ciNote:`Для проектов, у которых нет своего значения. Команды проверки, команды после зелёного main, пулл-реквесты и профили ремоутов задаются у каждого проекта.`,forProjects:`Для проектов, где не задано своё.`,providerHint:`Для проектов, у которых нет своего. Используется для задач без ярлыка запуска; при включённых ярлыках задача с ярлыком другого провайдера идёт на нём.`,modelHint:`Как уходит в CLI: opus, gpt-6.1-sol. Для проектов и задач без своей. Пусто — по умолчанию CLI: у Claude Code модель из settings.json, которую редактор мог только что поменять.`,accountHint:`Для проектов без своего; переключается и из шапки, переносом Even Keel на другой аккаунт в его карточке. Один на провайдера, без ротации на исчерпанном лимите.`,execution:`Выполнение`,executionOf:e=>`Выполнение на ${e}`,executionHint:`Claude Code: как идут его сессии. Авто — аккаунт с ключом API через Agent SDK, подписка через CLI --bg. С Agent SDK сессия переживает перезапуск сервиса с открытым вопросом, а ответ или сообщение из чата идёт прямо в неё; он работает только на проверенной версии CLI, поэтому его выбор переключает версию CLI на проверенную и закрепляет её; с EVEN_KEEL_CLAUDE_BIN сессии идут через CLI --bg. Anthropic просит продукты на Agent SDK входить по ключу API, а не по подписке claude.ai: на подписке решение за вами. К тому же на подписке Agent SDK за ту же работу расходует 5-часовой лимит примерно вдвое быстрее CLI --bg, а недельный — примерно на четверть быстрее (замер Even Keel; в Claude Code открыт issue); на ключе API такого штрафа нет. Codex: в песочнице — действия одобряет автоматический ревьюер внутри песочницы Codex. Под службой Windows эта песочница не запускается, и сессия не может ни править файлы, ни запускать команды; без неё сессия делает всё без ограничений на этой машине. Для всех проектов; смена действует на новые сессии.`,modes:{auto:`Авто`,bg:`CLI --bg`,sdk:`Agent SDK`,sandbox:`В песочнице`,bypass:`Без песочницы`},cli:`Версия CLI`,cliOf:e=>`Версия CLI ${e}`,cliLocked:`Выполнение — Agent SDK, а он работает только на проверенной копии: версия остаётся проверенной, пока выполнение не сменится.`,cliHint:`Своя — CLI этой машины, на той версии, до которой он обновился сам; ничего не скачивается. Проверенная — Even Keel, спросив, скачивает в свою папку версию, на которой его последний раз проверяли, и запускает сессии на ней; пока загрузка не закончилась, цепь ждёт. Сессии Claude Code переходят на другую версию, когда в папке аккаунта не остаётся живых сессий: работающий демон держит свою. Сохраняется вместе с формой, для всех проектов.`,cliCheck:`Проверять новые версии CLI на этой машине`,cliCheckHint:`Когда выходит новая версия CLI агента, а также раз в неделю на проверенной, Even Keel прогоняет на ней короткую живую проверку в папке аккаунта, на котором работают проекты, на дешёвой модели. Проверка ждёт, пока в папке нет живых сессий, а пока она идёт, цепи этой папки ждут. Итог — сообщением наверху страницы. Тратит лимиты аккаунта.`,modelLabelsHint:`Для проектов, где не задано. Включено — ярлык задачи Claude | sonnet, Codex | gpt-6.1-sol или голый Codex выбирает её сессию.`,promptHint:`Добавляется к промпту каждой новой сессии всех проектов и агентов, перед промптом проекта — тот дополняет его, а не заменяет. Передаётся как есть; Markdown понимается — модели читают его так же, как CLAUDE.md.`,promptPlaceholder:`Отвечай по-русски. Прогоняй тесты перед каждым коммитом.`,modelPrompts:`Промпты моделей`,modelPromptsHint:`Провайдер | модель, например Claude | sonnet* или * | *sonnet*. Только * — особый знак: любая строка. Регистр не важен, пробелы вокруг | обрезаются. Голый Codex охватывает все сессии Codex, включая модель по умолчанию CLI; шаблону модели нужно известное имя. Добавляются все совпавшие промпты в порядке таблицы. Подсказки и совпадения берутся из каталогов моделей аккаунтов.`,promptModel:`Провайдер | шаблон модели`,promptNoMatches:`Среди известных моделей совпадений нет. Проверьте шаблон или укажите подходящую модель в блоке «Агент»; сохранить можно.`,promptAnyId:`и любой введённый id под шаблон (каталог неполный)`,promptText:`Промпт`,promptAdd:`Промпт для подходящих сессий`,none:`нет`,language:`Язык страницы`,languageAuto:`как в браузере`,promptLanguage:`Язык промптов сессий`,languages:{en:`English`,ru:`Русский`},hiddenSkills:`Скрытые навыки`,hiddenSkillsHint:`Пока включена обрезка инструментов, сессии цепочки получают эти навыки только по /имени. Список подсказывает навыки, которые были у недавних сессий проектов; можно вписать и любое другое имя.`,cacheTtl:`Время жизни кэша промпта`,autoCompactWindow:`Окно автокомпакта`,autoCompactWindowAccount:`окно аккаунта`,autoCompactWindowHint:`Окно контекста в токенах только для сессий цепочки Claude. Пустое поле — окно аккаунта. Применяется к новым сессиям; идущие сохраняют своё окно. Проект может перекрыть общее значение.`,cacheTtlAuto:`как решит Claude Code`,cacheTtl5m:`5 минут`,cacheTtl1h:`1 час`,cacheTtlHint:`Для сессий цепочки, со следующего запуска. Claude Code пишет кэш на 1 час на подписке в пределах лимитов и на 5 минут на API-ключе. Запись на час дороже, зато переживает более долгую паузу между ходами.`,keepWarm:`Держать кэш ждущей сессии тёплым, часов`,keepWarmHint:`Пока текущая сессия цепочки ждёт вашего ответа, Even Keel незадолго до остывания кэша просит её копию ответить одним словом — тогда ответ не платит за повторное чтение всего контекста. Сама сессия ничего не получает. Отсчёт от её последнего ответа; 0 — выключено. Каждый пинг тратит лимиты аккаунта, а промах мимо кэша прекращает пинги этой сессии.`,hiddenSkillsAdd:`Добавить навык`,page:`Интерфейс`,models:`Провайдеры и модели`,allowedHosts:`Другие имена страницы`,allowedHostsHint:`Имена, кроме loopback и EVEN_KEEL_HOST, по которым открывается страница, — например имя прокси.`,allowedHostsAdd:`Добавить имя`,allowedHostsEmpty:`только этот компьютер и адрес самого сервиса`,updatesCheck:`Проверять новые версии`,updatesCheckHint:`Дважды в сутки служба спрашивает у GitHub последний релиз Even Keel, без токена. Выключено — служба туда не ходит.`,updatesNotify:`Уведомлять о новых версиях`,updatesNotifyHint:`Уведомление в углу страницы. Выключено — только отметка рядом с версией в меню шестерёнки.`,context:`Шкала контекста`,contextHint:`Пороги предупреждения и опасности в процентах от окна контекста сессии — его сообщает её агент. Окно в токенах — пока не сообщил.`,contextWindow:`Окно`,contextWarn:`Предупреждение, %`,contextDanger:`Опасно, %`,stats:`Статистика`,compare:`Сравнения «до и после»`,compareHint:`Минимум задач, сессий и дней с каждой стороны сравнения «до и после» на /stats.`,minTasks:`Задач`,minSessions:`Сессий`,days:`Дней`,otherBelow:`В «Прочее», если дешевле, $`,otherBelowHint:`Группа папок, потратившая всего меньше этой суммы, уходит на /stats в «Прочее».`,contextHandoffs:`Передача по размеру контекста`,contextHandoffsHint:`Включено — после порога чекпоинта плагин checkpoint просит сессию цепочки записать записку о передаче, и работу продолжает новая сессия. Выключено — не просит никогда, контекст сжимает сам агент; сообщения чата, проверка перед merge и передача по лимиту остаются. Действует и на идущие сессии.`,checkpointTokens:`Порог чекпоинта, токенов`,checkpointTokensHint:`С какого размера контекста плагин checkpoint впервые просит сессию цепочки о передаче, от 100 000. Пусто — по калибровке на /stats.`,checkpointTokensPlaceholder:`по калибровке`,checkpointShares:`Пороги чекпоинта, % окна`,checkpointSharesHint:`Не больше какой доли окна контекста сессии приходит каждый толчок плагина checkpoint, целые проценты, первый < поздний < жёсткий: первый толчок, поздние, жёсткий порог удержанной задачи. Доля только опускает собственный порог плагина (поздний 250 000 и жёсткий 300 000 или его переменные), выше него не поднимает. Закреплённый порог в токенах доли не учитывает.`,shareFirst:`Первый`,shareLate:`Поздний`,shareHard:`Жёсткий`,moves:`Переехавшие папки`,movesHint:`Сессии в старой папке считаются в новой.`,movesFrom:`Старый путь`,movesTo:`Новый путь`},we={title:`Обозначения`,chain:`Состояние задачи`,head:`Верхняя шапка`,project:`Строка проекта`,tabs:`Вкладки боковой панели`,task:`Карточка задачи`,priority:`Приоритет и знаки карточки`,session:`Полоса сессии`,open:`Нажатие на строку задачи открывает сессию. Заголовок в панели сессии открывает карточку задачи.`,samples:{action:`Читает файлы`,updated:`обновлено 16 с назад`},card:{number:`Место среди открытых задач цепочки. Цвет номера показывает приоритет, а не состояние сессии.`,current:`Треугольник вместо порядкового номера — текущая задача.`,cache:`Кольцо кеша заменяет треугольник текущей задачи или занимает пустое место номера. Показывает, сколько ещё кеш промпта остаётся тёплым; наведите, чтобы увидеть время.`,blockers:`Замок с числом — задачи, которые должны завершиться до этой. Наведение на счётчик показывает их список.`,dependents:`Ключ с числом — задачи, которые ждут завершения этой. Наведение на счётчик показывает их список.`,model:`Агент и модель, выбранные ярлыком задачи.`,milestone:`Рядом с названием вехи — открывает черновик заметок к выпуску.`,forge:`Кузнецы обозначают агента, который чинит ветку проекта или сливает перенос релиза. Двигаются во время работы; лампа у номера задачи показывает состояние. Скрещённые молотки — завершённая починка.`,action:`Текущее действие сессии. Заполнение этой полосы и процент показывают занятый контекст, а не оценку задачи.`,resets:`Число сбросов контекста: сжатий и передач через контрольную точку. Наведение показывает подробности.`,context:`Доля занятого окна контекста. Жёлтый и красный предупреждают о приближении к пределу контекста.`},signs:{queue:`Цепочки, что идут сейчас: синяя точка — идёт, жёлтая — на паузе, серая — ни одной. +N — проекты в очереди за ними. Открывает очередь.`,account:`Активный аккаунт с назначенным ему цветом. Красная точка — нужен вход; мигающая жёлтая — идёт вход. Открывает аккаунты.`,limit:`Сколько израсходовано окна лимита, пятичасового или недельного: жёлтое от 80%, красное на 100%; время рядом — сколько осталось до сброса.`,others:`Другие аккаунты, на которых работают проекты, каждое кольцо — по самому полному окну. Цифры — в карточке при наведении.`,gear:`Настройки, инструменты и состояние сервиса; точка жёлтая или красная, когда проверка предупреждает или не прошла.`,waiting:`Сколько сессий ждут ответа.`,menu:`Статистика, очередь, аккаунты, настройки, инструменты и состояние сервиса; точка жёлтая или красная, когда проверка предупреждает или не прошла или аккаунту нужен вход.`,bars:`Две линии по нижнему краю шапки: пятичасовой лимит слева, недельный справа; жёлтая от 80%, красная на 100%.`,questions:`Задачи с ярлыком «Вопрос», которые ждут ответа; открывает сессию первой из них.`,read:`Читает задачи проекта из трекера сейчас; он и так читается каждые 30 секунд. Рядом — когда прочитан последний раз.`,ci:`CI основной ветки: зелёная точка — прошёл, синяя — идёт, красная — упал, жёлтая — завис. Открывает его прогоны.`,backlog:`Задачи, которые цепочка пока не берёт, и их число. Открывает бэклог.`,settings:`Настройки проекта. Действуют сразу, без перезапуска: следующая сессия проекта получает их.`,help:`Открывает эти обозначения. Счётчик вопросов в строке проекта — отдельная кнопка.`}},Te={removeFile:e=>`Убрать ${e}`,other:`Другое`,otherPlaceholder:`Свой ответ…`,unanswered:e=>`Осталось ответить: ${e}`,unsaved:`Claude Code записывает сообщение с этим вопросом только после ответа. Ответ отсюда продолжит сессию без него, с вопросом и вашим ответом; ответ через Remote Control его сохранит.`,sent:`Ответ отправлен — сессия продолжит с ним.`,working:`Отправить можно, когда сессия остановится. Писать посреди хода можно с пакетом checkpoint@even-keel в проекте (Tools) — со следующего вызова инструмента.`,mailbox:`Сессия работает: сообщение дойдёт на ходу, при следующем вызове инструмента или в конце хода.`,steers:`Сессия работает: сообщение уйдёт в неё сразу, и она прочтёт его, как только закончится текущий вызов инструмента.`,mail:{waiting:`Ждёт хука`,queued:`В сессии · прочтёт, когда закончится текущий вызов инструмента`,delivered:(e,t)=>`Доставлено ${e} · ${t}`,events:{PreToolUse:`перед вызовом инструмента`,PostToolUse:`после вызова инструмента`,Stop:`в конце хода`,AskUserQuestion:`вместо вопроса`,resume:`продолжением сессии`},returned:{asked:`Вернулось: сессия задала вопрос, пока сообщение шло. Отправьте его ответом или уберите.`,gone:`Вернулось: сессия остановилась, не успев его взять. Отправьте его снова или уберите.`,closed:`Вернулось: задача уже закрыта, сессия его не получила. Оформите то, о чём оно, новой задачей и уберите.`},reply:`В ответ`,dismiss:`Убрать`},commands:{menu:`Команды`,filter:`Введите для фильтра`},thinking:`Думает`,running:e=>`Выполняет: ${e}`,delivering:`Передаю ответ, сессия поднимается`,finished:`Сессия завершена — ответить ей нельзя.`,limit:`Сессия упёрлась в лимит — Even Keel продолжит её сам.`,error:`Сессия остановилась с ошибкой API. Отправьте ответ, чтобы продолжить её.`,dialog:e=>`Сессия ждёт: ${e}. Ответьте через Remote Control.`,aside:`Цепочку ведёт починка main. Ответить из чата можно, когда она закончится; до тех пор — через Remote Control.`,question:`Вопрос`,pending:`ждёт ответа`,of:(e,t)=>`${e} из ${t}`,previous:`Предыдущий вопрос`,nextQuestion:`Следующий вопрос`,skip:`Пропустить`,next:`Дальше`,submit:`Отправить`},Ee=(e,t,n)=>r=>j(`ru`,r,{one:e,few:t,many:n,other:t}),De=(e,t,n)=>r=>`${r} ${Ee(e,t,n)(r)}`,Oe=e=>{let t=e.filter(e=>e!==``).join(`, `);return t.charAt(0).toUpperCase()+t.slice(1)},ke={launches:{launch:`Запуск цепочкой`,restart:`Перезапуск`,checkpoint:`По контрольной точке`,manual:`Запущена вручную`},relayed:{limit:`Новая после лимита`,credit:`Новая после того, как на ключе кончились деньги`,mainFixed:`Новая после починки main`,review:`Новая после отзыва на pull request`,returned:`Новая после возврата задачи`,unblocked:`Новая после закрытия блокеров`,unskipped:`Новая после отмены пропуска`},replaced:{restart:`заменена вручную`,checkpoint:`поставила контрольную точку`},replacedRelay:{limit:`упёрлась в лимит`,credit:`на ключе кончились деньги`,mainFixed:`заменена после починки main`,review:`заменена после отзыва на pull request`,returned:`заменена после возврата задачи`,unblocked:`заменена после закрытия блокеров`,unskipped:`заменена после отмены пропуска`},remote:{starting:`Remote Control поднимается — ссылка будет через пару секунд.`,disabled:`Remote Control выключен: в /config папки аккаунта нет «remoteControlAtStartup».`,"no-bridge":`Сессия не подняла Remote Control — отсюда её не открыть.`,lost:`Remote Control отвалился — с телефона не открыть. Не довела задачу — «Новая сессия».`,"api-key":`На API-ключе Remote Control нет: он требует входа в claude.ai. Ответить сессии — из чата здесь или в трекере.`},panel:e=>`Сессия задачи ${e}`,closePanel:`Закрыть панель`,skipped:`пропущена`,none:`Сессии по этой задаче ещё не было.`,noneNow:`Живой сессии по задаче сейчас не видно; её сессии — ниже.`,onlyIn:e=>`\nRemote Control покажет её только в аккаунте ${e}`,openRemote:`Открыть сессию через Remote Control`,openPull:e=>`Открыть pull request #${e} задачи в новой вкладке`,restartTitle:`Остановит эту сессию и запустит новую в той же рабочей папке с передачей дел. Статус в трекере не меняется.`,restart:`Новая сессия`,skippedTitle:`Задача пропущена — цепочка её не берёт, пока не вернёшь.`,skipCurrent:`Цепочка перестанет ждать задачу и возьмёт следующую. Статус в трекере и сессия не меняются.`,skipOther:`Цепочка не возьмёт задачу, пока не вернёшь её. Статус в трекере не меняется.`,skipFix:`Цепочка перестанет ждать починку и продолжит задачи; следующий красный main запустит новую. Сессия не меняется.`,skipCarry:`Цепочка перестанет ждать перенос и продолжит задачи; конфликт ждёт на странице релизного проекта. Сессия не меняется.`,interrupted:`остановлена до починки main`,skip:`Пропустить`,silent:(e,t,n)=>`Молчит ${e}. «Новая сессия» — с подтверждением с ${t}, сама — в ${n}.`,confirmSilent:e=>`Сессия молчит с ${e}. Оборвать ход и начать новую сессию?`,interruptRestart:`Оборвать и начать новую`,held:{launching:`Пока нельзя: сессия ещё запускается. Станет доступна, когда она поднимется и закончит ход.`,replacing:`Пока нельзя: идёт замена сессии. Станет доступна, когда новая поднимется и закончит ход.`,midTurn:`Идёт ход. «Новая сессия» доступна и после пяти минут тишины, с подтверждением; «Пропустить» ждёт конца хода.`,noSession:`Пока нельзя: у задачи нет живой сессии. Станет доступна, когда цепочка её запустит.`,notCurrent:`Пока нельзя: цепочка сейчас не на этой задаче. Станет доступна, когда цепочка возьмёт её и запустит сессию.`,skipped:`Задача пропущена: верните её, и кнопка станет доступна, когда цепочка возьмёт задачу и запустит сессию.`},start:{title:{launch:`Запуск сессии`,handover:`Передача задачи`,boot:`Сессия загружается`,answer:`Сессия думает`},text:{launch:`Готовим рабочую копию и запускаем агента.`,handover:`Старая сессия останавливается, новая стартует с передачей дел.`,boot:`Агент поднимается: настройки, плагины, MCP-серверы.`,answer:`Сессия запущена и готовит первый ответ.`},steps:[`Подготовка`,`Загрузка`,`Первый ответ`]},account:e=>`Аккаунт: ${e}`,waits:e=>`Ждёт: ${e}`,startupDialog:e=>`Сессия висит на диалоге Claude Code до первого хода, и в фоне на него некому ответить: ${e}. Уберите причину и нажмите «Новая сессия».`,hung:e=>`Ход ничего не пишет с ${e}, а его процесс жив: он считается зависшим. Напишите сессии или нажмите «Новая сессия» — и то и другое сначала остановит ход.`,session:`Сессия`,time:`Время`,cache:`Кэш`,context:`Контекст`,startedAt:`запущена`,lifetime:`срок`,tokens:`Токены`,input:`ввод`,output:`вывод`,cacheRead:`чтение кэша`,cacheWrite:`запись кэша`,model:`Модель`,provider:`провайдер`,modelOf:`модель`,modelFrom:`По последнему ответу сессии в транскрипте`,modelYet:`Сессия ещё не ответила: модель видна с первого ответа`,limitUnknown:`Время сброса лимита неизвестно. Смена аккаунта задачи запустит новую сессию.`,limitGuide:`Как запустить раньше`,limitAccount:(e,t)=>`Смена аккаунта задачи запустит её раньше. Аккаунт ${e} «${t}». Смените аккаунт этого провайдера в пуле проекта (общем или своём) в «Настройки проекта → Сессии» или метку провайдера задачи.`,limitEvent:`Откройте сессию: там указан аккаунт и как изменить его пул в проекте.`,creditEmpty:`кончился кредит`,spendEmpty:`лимит трат`,spendUntil:e=>e===null?`Достигнут лимит трат API`:`Лимит трат API до ${e}`,spendWait:e=>`${e===null?`Время сброса лимита трат API неизвестно.`:`Лимит трат API сбросится ${e}.`} Диспетчер проверяет ключ каждые 5 минут и продолжит раньше, если лимит поднимут.`,creditOut:`На ключе API кончился кредит. Диспетчер проверяет его раз в 5 минут и продолжит после пополнения.`,limitResume:e=>`После сброса лимита в ${e} диспетчер продолжит эту сессию — кэш ещё будет тёплым.`,limitRelay:e=>`После сброса лимита в ${e} диспетчер запустит новую сессию в той же рабочей папке.`,list:`Сессии по задаче`,compacted:e=>` · компакций: ${e}`,resumed:e=>` · продолжена после лимита${e>1?` ×${e}`:``}`,answered:e=>` · получила ответ${e>1?` ×${e}`:``}`,current:`сейчас`,postponed:e=>`отложена: ждёт ${e}`,dialog:e=>`Сессия ${e}`,closeDialog:`Закрыть окно сессии`,notFound:`Транскрипт этой сессии не найден.`,started:`Запущена`,lastTurn:`Последний ход`,worked:`Работала`,endContext:`Контекст в конце`,place:`Ветка и папка`,feed:`Ход работы`,feedEmpty:`Сессия ещё ничего не сделала.`,feedOpens:{transcript:`Ход работы. Нажмите, чтобы открыть весь транскрипт`,chat:`Ход работы. Нажмите, чтобы открыть чат`},transcriptTitle:`Транскрипт`,transcriptDialog:e=>`Транскрипт сессии ${e}`,closeTranscript:`Закрыть транскрипт`,showMore:`Показать целиком`,showLess:`Свернуть`,chat:{open:`Чат`,title:`Чат`,picture:`Картинка`,openPicture:e=>`Открыть ${e}`,share:{title:`Файлы от сессии`,download:e=>`Скачать ${e}`,gone:`файла уже нет`,goneTip:`Файла уже нет — его worktree убран — или он лежит вне папок сессии`},waiting:`Сессия ждёт ответа — открыть чат`,idle:`Открыть чат с сессией`,placeholder:`Ответ сессии… Enter — отправить, Shift+Enter — новая строка`,touchPlaceholder:`Ответ сессии…`,send:`Отправить`,attach:`Приложить файлы`,drop:`Отпустите, чтобы приложить файлы`,tools:{read:`Прочитал`,edit:`Отредактировал`,write:`Записал`,search:`Искал`,ran:`Запустил команду`,summary:e=>Oe([e.edit===0?``:`отредактировал ${e.edit===1?`файл`:De(`файл`,`файла`,`файлов`)(e.edit)}`,e.read===0?``:`прочитал ${e.read===1?`файл`:De(`файл`,`файла`,`файлов`)(e.read)}`,e.search===0?``:`искал${e.search===1?``:` ${De(`раз`,`раза`,`раз`)(e.search)}`}`,e.run===0?``:`запустил ${e.run===1?`команду`:De(`команду`,`команды`,`команд`)(e.run)}`,e.other===0?``:`вызвал ${e.other===1?`инструмент`:De(`инструмент`,`инструмента`,`инструментов`)(e.other)}`]),failed:e=>`(${e} с ошибкой)`,failure:`ошибка`,interrupted:`прервана с концом хода`,size:(e,t)=>`Добавлено строк: ${e}, удалено: ${t}`},head:{branch:e=>`Ветка ${e}`,edits:(e,t)=>`Правки за сессию: +${e} −${t} строк`},...Te}},Ae={forgejo:`Forgejo Actions`,github:`GitHub Actions`,gitlab:`GitLab CI`},je={chip:`CI`,title:e=>`CI: ${e}. Нажмите, чтобы открыть прогоны`,panel:`CI проекта`,levels:{error:`API не отвечает`,stuck:`прогон не берут`,failure:`красный`,off:`нет токена`,running:`идёт прогон`,success:`зелёный`,idle:`прогонов нет`},kinds:Ae,api:{ok:`API отвечает`,error:`API не отвечает`,off:`не подключён`},checked:e=>`проверено ${e}`,allRuns:`Все прогоны`,openRun:`Открыть прогон`,stuckRun:e=>`Прогон стоит в очереди ${e}: раннер его не берёт`,stuckPush:(e,t)=>`Пуш ${e} уже ${t} без прогона: CI его не подхватил`,pushed:e=>`Пуш ${e}: ждём прогон`,usual:e=>`обычно ${e}`,took:e=>`шёл ${e}`,progress:(e,t)=>`Идёт ${e}, обычно прогон занимает ${t}`,same:e=>`тот же коммит · ${e}`,sameTitle:`Прогнал тот же коммит с тем же итогом, что CI выше. Нажмите, чтобы раскрыть`,tasks:`Задачи пуша`,fixTask:`починка main`,fixTaskTitle:`Строка этой починки в архиве цепочки`,jobs:`Задачи прогона`,noJobs:`Задач прогона пока нет`,stepsOnPage:`Шаги — на странице прогона`,history:`История`,showAll:e=>`Показать все ${e}`,noRuns:`Прогонов ещё не было`,status:{queued:`в очереди`,running:`идёт`,success:`зелёный`,failure:`красный`,cancelled:`отменён`,skipped:`пропущен`}},Me={title:`Профили трекеров и CI`,hint:`Проект работает на профиле своего трекера. Профиль трекера по умолчанию идёт и сессиям, запущенным вручную (env ~/.claude/settings.json), и CI GitHub Actions проектов других трекеров. CI Forgejo берёт профиль Forgejo на хосте своего remote, CI GitLab — профиль GitLab своего сервера.`,none:`Профилей нет: без профиля цепочка не читает задачи трекера.`,add:`Добавить профиль`,addGitlab:`Добавить профиль GitLab`,isDefault:`по умолчанию`,makeDefault:`По умолчанию`,edit:`Изменить`,rules:`Правила`,remove:`Удалить`,states:{unchecked:`не проверен`,checking:`проверяется`,ok:`вход принят`,refused:`отказ`,unreachable:`не отвечает`},expires:e=>e<=0?`токен истёк`:`истекает через ${e} дн.`,login:e=>`Вошли как ${e}`,projects:e=>`Проекты: ${e}`,noProjects:`Проектов на нём нет`,ci:e=>`CI: ${e}`,noCi:`Ни один remote проектов не на его хосте`,ciHidden:`CI скрыт`,hiddenCi:(e,t)=>t===`forgejo`?`CI Forgejo не показывается (${e}): токен не видит репозиторий или его Actions, нужно право read:repository`:t===`gitlab`?`GitLab CI не показывается (${e}): токен не достаёт до прогонов проекта, проверьте scope api и доступ к проекту`:`GitHub Actions не показываются (${e}): токен не достаёт до Actions репозитория, нужно право Actions: Read`,kindHint:{huly:`Свой сервер или облако Huly`,github:`Issues и Actions на github.com`,linear:`Рабочее пространство Linear`,gitlab:`Задачи и CI на GitLab.com или своём сервере`,jira:`Задачи на сайте Jira Cloud`,forgejo:`CI своего сервера Forgejo, не трекер`},pullsRefused:`PR отклонён`,rulesOf:e=>`Правила: ${e}`,rulesFor:e=>`Проекты на этом профиле: ${e}.`,rulesNoProjects:`Ни один проект пока не работает на этом профиле.`,moves:{title:`Статусы при действиях`,hint:`Куда Even Keel сам переводит задачу. Только вперёд: при старте — задачу из статуса категории «к выполнению», при PR — любую открытую. Статус вне цепочки не предлагается.`,start:`При старте задачи`,startHint:`Когда цепочка запускает сессию на задаче.`,review:`При открытии PR`,reviewHint:`Сработает, когда у проекта включён режим PR.`,done:`При завершении задачи`,doneHint:`Когда ветка задачи влита. Только статус, который правила цепочки считают завершением.`,leave:`не менять`,auto:`автоматически`,asProfile:e=>`как в профиле (${e})`,loading:`Читаю статусы трекера…`,unread:`Статусы трекера не прочитаны: в списках только уже выбранные.`,missing:e=>`${e} (нет в трекере)`,missingNote:`Перевод не пройдёт: выберите другой статус`,missingShort:`Выберите другой статус`,sourceHint:e=>`Своё значение источника сильнее профиля «${e}».`,stepTitle:`Статусы задач`,stepHint:e=>`Куда Even Keel переводит задачу при старте, при открытии PR и при завершении. Можно задать сейчас или позже: Настройки → Правила цепочки → ${e}.`,stepUnread:`Статусы трекера не прочитаны — задать их можно позже, в правилах цепочки профиля.`,save:`Сохранить`,skip:`Пропустить`},rulesHint:`Правила проектов на этом профиле: статусы и метки у каждого трекера свои. Список, который профиль не менял, остаётся общим; список, где профиль поменял хоть одну строку, — весь его, а свой список проекта сильнее. Майлстоуны проекта задаются на его вкладке трекера и в общих настройках.`,deniedPulls:(e,t)=>t===`forgejo`?`Pull request не открылся (${e}): токену не хватило права write:repository`:t===`gitlab`?`Merge request не открылся (${e}): токену не хватило scope api или доступа Developer к проекту`:`Pull request не открылся (${e}): токену не хватило права Pull requests: Read and write`,rightsIntro:{huly:`Отдельная учётка с доступом к проектам: её почта и пароль или токен, если в настройках аккаунта вашего Huly есть страница API-токенов.`,github:`Fine-grained токен на владельца репозиториев.`,linear:`Личный ключ API.`,gitlab:`Личный токен со scope api. Для GitLab.com адрес можно оставить пустым.`,jira:`Адрес сайта, почта учётки Atlassian, которая видит проекты, и её API-токен.`,forgejo:`Адрес сервера и токен. CI и pull requests берут профиль, чей хост совпадает с хостом remote.`},rightsUse:{tracker:`Трекер`,ci:`CI`,pullRequests:`Pull requests`},rights:{huly:{tracker:`чтение и запись задач проектов`},github:{tracker:`Issues — Read and write`,ci:`Actions — Read`,pullRequests:`Pull requests — Read and write, Contents — Read, Actions — Read`},linear:{tracker:`право записи`},gitlab:{tracker:`scope api (чтение и запись задач)`,ci:`scope api и доступ к проекту и его прогонам`,pullRequests:`scope api, доступ Developer или выше (открыть merge request, читать его обсуждения и участников проекта)`},jira:{tracker:`Browse projects, Add comments, Transition issues и Edit issues в проектах; у токена со scope — read:jira-work, write:jira-work, read:jira-user`},forgejo:{ci:`read:repository (репозитории и их Actions), read:user (проверка входа)`,pullRequests:`write:repository (открыть PR, читать его ревью и права ревьюеров), read:issue (комментарии в обсуждении PR), read:user; чтобы считались ревьюеры, кроме самого аккаунта и владельца, аккаунт должен быть админом репозитория`}},pushedByGit:`Ветку PR-режим пушит git с учётными данными учётки, под которой работает служба, а не этим токеном.`,howTo:`Где получить`,createMcpToken:`Создать токен Atlassian MCP V2`,mcp:{title:`MCP для сессий`,hint:`Достаточно одного способа: OAuth или токена. При подключённом OAuth токен MCP не используется. Even Keel обновляет доступ автоматически; войти снова нужно, только если профиль об этом попросит.`,fallback:`Или использовать токен`,sharedToken:`Сессии используют тот же токен, что и трекер: он указан выше.`,checked:`доступ MCP по OAuth проверен`,discard:`Доступ MCP ещё не сохранён и будет потерян. Закрыть без сохранения?`,connect:`Подключить MCP через OAuth`,again:`Подключить снова`,waiting:`Ждём согласия в открытом окне…`,blocked:`Браузер не дал открыть окно согласия: разрешите всплывающие окна для этой страницы и попробуйте снова.`,ready:`Доступ MCP получен, но ещё не сохранён. Нажмите «Проверить и сохранить». Без сохранения он пропадёт; попытка ждёт 10 минут от открытия окна согласия.`,connected:`MCP: подключён через OAuth`,revoked:`Доступ MCP отозван или истёк — подключите снова.`,revokedChip:`MCP: нужно подключить снова`,disconnect:`Отключить`,dropped:`Доступ MCP удалится при сохранении; сессии пойдут по токену MCP профиля, если он есть.`,keep:`Оставить`,cancel:`Отмена`,noSite:`Ещё нет аккаунта Atlassian или сайта Jira?`,newSite:`Создать бесплатный сайт Jira`},fieldLabels:{JIRA_MCP_TOKEN:`Токен Atlassian MCP V2 (необязательно)`},signIn:`Вход`,alternative:{HULY_TOKEN:`Токен`,HULY_EMAIL:`Почта и пароль`},name:`Имя профиля`,nameHint:`Подставляется из ответа трекера, можно поменять.`,kept:`сохранён`,unfilled:e=>`Сначала заполните: ${new Intl.ListFormat(`ru`,{type:`conjunction`}).format(e.map(e=>`«${e}»`))}.`,hostLocked:`Не меняется, пока профиль у проектов`,fieldHints:{HULY_URL:`Адрес сервера Huly, как он открывается в браузере.`,HULY_WORKSPACE:`Название рабочего пространства Huly, в котором проекты.`,HULY_TOKEN:`Токен учётки Huly из её настроек — вместо почты и пароля.`,HULY_EMAIL:`Почта отдельной учётки Huly, которая видит проекты.`,HULY_PASSWORD:`Пароль этой учётки Huly.`,GITHUB_TOKEN:`Fine-grained токен на репозитории владельца с правами по назначению — они выше.`,LINEAR_TOKEN:`Личный ключ API Linear с правом записи.`,GITLAB_URL:`Веб-адрес GitLab без /api/v4. Пустое поле — https://gitlab.com.`,GITLAB_TOKEN:`Личный токен со scope api; read_api не позволяет закрывать задачи и писать комментарии.`,JIRA_URL:`Адрес сайта Jira Cloud, https://<сайт>.atlassian.net, без пути.`,JIRA_EMAIL:`Почта учётки Atlassian, которой принадлежит токен.`,JIRA_TOKEN:`API-токен этой учётки, классический или со scope.`,JIRA_MCP_TOKEN:`Только для плагина Jira. Сначала включите аутентификацию API-токенами для сервера Atlassian MCP в настройках организации, затем создайте отдельный токен Atlassian MCP V2 со всеми scope. Токен REST здесь не работает.`,FORGEJO_URL:`Адрес сервера Forgejo, как он открывается в браузере.`,FORGEJO_TOKEN:`Токен доступа с правами по назначению — они выше.`},examples:{HULY_URL:`https://huly.example.com`,HULY_WORKSPACE:`example-workspace`,HULY_EMAIL:`john.doe@example.com`,FORGEJO_URL:`https://forgejo.example.com`,GITLAB_URL:`https://gitlab.com`,JIRA_URL:`https://example.atlassian.net`,JIRA_EMAIL:`john.doe@example.com`},check:`Проверить`,checking:`Проверяю…`,duplicate:e=>`Эта же учётка уже в профиле «${e}»`,save:`Проверить и сохранить`,editTitle:e=>`Профиль ${e}`,field:`Профиль`,fieldHint:`Учётка трекера, на которой идёт проект: его задачи, комментарии сессий и токен CI.`,byDefault:e=>`${e} (по умолчанию)`},I=e=>e.join(`, `),Ne={start:`«При старте задачи»`,review:`«При открытии PR»`,done:`«При завершении задачи»`},Pe=e=>`${e} ${j(`ru`,e,{one:`чат`,few:`чата`,many:`чатов`,other:`чата`})}`,Fe={excludeFile:()=>`найти файл exclude в`,addWorktree:e=>`добавить worktree задачи ${e} в`,listRemotes:()=>`получить список remote в`,listWorktrees:()=>`получить список worktree в`,listBranches:()=>`получить список веток в`,readStatus:()=>`прочитать состояние`,countCommits:e=>`посчитать коммиты сверх ${e} в`,addSlot:()=>`добавить слот в`,clean:()=>`очистить`,switch:e=>`переключиться на ${e} в`},Ie={service:`Even Keel запущен не службой, перезапустить его некому`,git:`папка Even Keel — не git-чекаут`,dirty:`в чекауте есть незакоммиченные изменения`,tag:`чекаут не на релизном теге установленной версии`,global:`пакет npm поставлен не глобально (npm install --global)`,checking:`чекаут ещё читается, попробуйте через минуту`,storage:`прежняя версия не прочитает хранилище, которое эта уже перевела на новый формат`},Le={"account.overageRisk":()=>`Расход сверх лимита возможен до его обнаружения Even Keel.`,"account.overagePolicy":()=>`Even Keel останавливает сессию цепочки после обнаружения расхода сверх лимита и ждёт сброса запаса подписки. Сигнал приходит после запроса или опроса расхода, который может отставать до пяти минут. Жёсткий денежный потолок задаётся у провайдера.`,"account.overageAdvice":e=>e.provider===`chatgpt`?`Для этого аккаунта цепочки выключите автопополнение кредитов или задайте месячный денежный лимит в ChatGPT, где это поддерживается.`:e.provider===`claude`?`Для этого аккаунта цепочки выключите Extra usage или задайте месячный денежный лимит в Claude.`:`Для этого аккаунта цепочки выключите дополнительные платные расходы или задайте месячный бюджет в GitHub.`,"account.overageSettings":()=>`Денежные настройки провайдера`,"tracker.closePending":()=>`трекер не даёт закрыть`,"tracker.completeRefused":e=>e.status===void 0?`Задача ${e.task} влита, но трекер не даёт её закрыть. Заполните требуемое поле или закройте задачу в трекере вручную. Even Keel повторит попытку автоматически. Ответ трекера`:`Задача ${e.task} влита, но трекер не даёт перевести её в «${e.status}» (${Ne.done}). Заполните требуемое поле, выберите другой статус в ${Ne.done} или закройте задачу вручную. Even Keel повторит попытку автоматически. Ответ трекера`,"statusMove.refused":e=>`Трекер не перевёл ${e.task} в «${e.status}» (${Ne[e.setting]}). Цепочка идёт дальше; выберите другой статус в ${Ne[e.setting]} или переведите задачу вручную. Ответ трекера`,"statusMove.outside":e=>`${e.task} осталась в прежнем статусе: «${e.status}» из ${Ne[e.setting]} вне цепи по её правилам, и цепочка сразу отпустила бы задачу. Выберите статус в цепи.`,"statusMove.notDone":e=>`Задача ${e.task} влита, но не закрыта: правила цепи не считают «${e.status}» из ${Ne.done} завершением. Выберите там статус Done. Even Keel повторит попытку автоматически.`,"statusMoves.outside":e=>`«${e.status}» из ${Ne[e.setting]} вне цепи по её правилам: цепочка отпустит задачу, как только та туда перейдёт. Выберите статус в цепи.`,"statusMoves.notDone":e=>`Правила цепи не считают «${e.status}» из ${Ne.done} завершением: цепочка не узнает, что задача закрыта. Выберите статус Done.`,"statusMoves.unknown":e=>`В трекере нет статуса «${e.status}» для ${Ne[e.setting]}: перевод не пройдёт, когда до него дойдёт. Выберите статус из списка.`,"gitlab.url":()=>`В «Трекеры и CI» укажите веб-адрес сервера GitLab без /api/v4.`,"gitlab.token":()=>`Добавьте профиль GitLab в «Трекеры и CI» с личным токеном со scope api.`,"jira.url":()=>`В «Трекеры и CI» укажите адрес сайта Jira в виде https://<site>.atlassian.net, без пути.`,"jira.incomplete":()=>`Заполните в профиле Jira («Трекеры и CI») адрес сайта, почту и API-токен.`,"jira.mcpSite":()=>`Токен MCP не видит этот сайт Jira. В настройках организации включите аутентификацию API-токенами для сервера Atlassian MCP, затем создайте токен Atlassian MCP V2 заново.`,"jira.mcpToken":()=>`Сервер Atlassian MCP отклонил токен MCP. В настройках организации включите аутентификацию API-токенами, затем создайте новый токен Atlassian MCP V2 для этой почты.`,"jira.blocksType":e=>`В Jira нет типа связи Blocks (есть: ${e.types||`никаких`}), а Even Keel выстраивает цепь по нему. Верните это имя типу связи в настройках Jira, Issue linking.`,text:e=>e.text,"chain.unknownProject":e=>`${e.project} — не проект из конфигурации`,"chain.notOpen":e=>`${e.task} — не открытая задача проекта ${e.project}`,"chain.launching":e=>`${e.task} ещё запускается, повторите через минуту`,"chain.midTurn":e=>`${e.task} посреди хода — дождитесь, пока сессия остановится`,"chain.restartChanged":e=>`${e.task}: сессия или время последней записи изменились. Проверьте сессию и подтвердите «Новая сессия» заново.`,"chain.silentTurn":e=>`${e.task} молчит с ${e.since}. «Новая сессия» сможет оборвать ход с подтверждением с ${e.restartAt}; без подтверждения станет доступна в ${e.hungAt}, если тишина продолжится.`,"chain.notCurrent":e=>`${e.task} — не текущая задача цепочки`,"chain.limitsUnread":e=>`Ждём первого ответа о лимитах аккаунта ${e.account}: без него исчерпанный лимит выглядит как свободный.${e.next===void 0?``:` Следующий опрос в ${e.next}.`}`,"chain.limitSpent":e=>`Лимит исчерпан до ${e.until}${e.account===void 0?``:` на аккаунте ${e.provider??``} «${e.account}»`}. Дождитесь сброса, смените аккаунт провайдера в пуле проекта (общем или своём) в «Настройки проекта → Сессии» или метку провайдера задачи.`,"session.transient":()=>`ждёт повтора`,"session.transientRetry":e=>`Модель временно недоступна. Диспетчер продолжит эту же сессию в ${e.at}. Можно продолжить её сейчас из чата или начать новую сессию.`,"chain.noSession":e=>`у ${e.task} нет известной сессии`,"chain.noAccountFor":e=>`у ${e.task} ярлык ${e.label}, но аккаунта этого провайдера в пуле нет — задача идёт на ${e.provider}, как проект`,"chain.unknownModel":e=>`${e.task} должна идти на модели ${e.model}, но у аккаунта ${e.account} (${e.agent}) её нет — есть ${I(e.known.slice(0,8))||`никаких`}${e.known.length>8?` и ещё ${e.known.length-8}`:``}. Выберите модель в поле «Модель» настроек сессий — цепочка пойдёт дальше сама`,"chain.opencodeCopilot":()=>`OpenCode на Copilot пока не поддерживается. Выберите другую «Модель» или «Аккаунт» в настройках сессий, измените метку модели задачи, если она использует Copilot, и снимите цепочку с паузы.`,"account.opencodeCopilot":()=>`OpenCode на Copilot пока не поддерживается`,"chain.modelUnavailable":e=>`Аккаунту ChatGPT недоступна модель ${e.model} через OpenCode. Выберите другую «Модель» или «Аккаунт» в настройках сессий и измените метку модели задачи, если она есть. Нажмите «Новая сессия» и снимите цепочку с паузы.`,"answer.moved":e=>`сессия ${e.task} уже пошла дальше — ответ не отправлен`,"answer.busy":e=>`сессия ${e.task} работает — ответить можно, когда она остановится`,"answer.closed":e=>`${e.task} уже закрыта, сообщение не отправлено. Оформите то, о чём оно, новой задачей.`,"answer.empty":()=>`пустой ответ`,"answer.file":e=>`файл ${e.name} не сохранился`,"chain.queueChanged":e=>`очередь изменилась, теперь в ней: ${I(e.queue)||`пусто`}`,"chain.currentFirst":e=>`${e.task} выполняется и остаётся первой`,"chain.fixReportMissing":e=>`${e.task}: отчёта о поломке нет, новой сессии нечего чинить — проверьте main и снимите с паузы`,"chain.interrupted":e=>`запуск ${e.task} прервал перезапуск службы — проверьте её сессию и снимите с паузы`,"chain.unchangedNotChecked":e=>`сессия ${e.task} отметила, что задача не требует изменений, но её папку не удалось проверить (ответьте сессии из чата или пропустите задачу)`,"chain.unchangedNotCompleted":e=>`задача ${e.task} не требует изменений и в её ветке нечего вливать, но в трекере она не переведена в Done (переведите её сами и продолжите цепочку или пропустите задачу)`,"chain.notRead":e=>`задачи ${e.project} ещё не прочитаны из трекера — повторите, когда он ответит`,"chain.empty":e=>`в цепочке ${e.project} нет задач, она не запущена`,"chain.emptyNone":()=>`открытых задач нет`,"chain.emptyStatus":()=>`ни одна открытая задача не в статусе, который берёт цепочка`,"chain.emptyLabels":e=>`у готовых задач нет обязательной метки (${I(e.labels)})`,"chain.emptySkipped":()=>`все готовые задачи пропущены`,"chain.emptyBlocked":()=>`готовые задачи пропущены или ждут блокеров вне цепочки`,"order.notOpen":e=>`${e.task} — не открытая задача этой цепочки`,"order.twice":e=>`${e.task} встречается дважды`,"order.blocked":e=>`${e.task} не может идти раньше ${e.blocker}: та её блокирует`,"order.milestone":e=>`${e.task} из ${e.milestone} не может идти раньше ${e.earlier} из более раннего ${e.earlierMilestone}`,"order.cycle":e=>`блокеры замкнулись в кольцо: ${e.path}`,"order.later":e=>`${e.task} из ${e.milestone} ждёт ${e.blocker} из более позднего ${e.blockerMilestone}`,"order.against":e=>`блокеры идут против порядка вех: ${e.path}`,"cleanup.failed":()=>`уборка не удалась`,"cleanup.syncFailed":()=>`синхронизация главной ветки не удалась`,"cleanup.folderLeft":e=>`папка worktree ${e.path} осталась: её держит процесс`,"cleanup.folderNotDeleted":e=>`папка worktree ${e.path} осталась: её не удалось удалить`,"cleanup.worktreeKept":e=>`worktree ${e.path} оставлен`,"cleanup.branchKept":e=>`ветка ${e.branch} оставлена`,"cleanup.originUnchecked":e=>`не удалось проверить ветку ${e.branch} на ${e.remote??`origin`}`,"cleanup.originKept":e=>`ветка ${e.branch} оставлена на ${e.remote??`origin`}`,"cleanup.slotDirty":e=>`слот ${e.path} оставлен на ${e.branch}: в нём незакоммиченные изменения`,"cleanup.slotKept":e=>`слот ${e.path} оставлен на ${e.branch}`,"cleanup.sessionNotStopped":e=>`её сессия ${e.session} не остановлена`,"git.missing":()=>`git не запускается на машине Even Keel, а без него не идёт ни одна задача: установите git и попробуйте снова`,"git.noIdentity":()=>`у git нет имени и почты для коммитов: заполните их на шаге «Git» первой настройки`,"git.identityBlank":()=>`для коммитов git нужны и имя, и почта`,"git.identityFailed":()=>`git не записал имя и почту в свой глобальный конфиг`,"git.initFailed":e=>`git не сделал ${e.path} репозиторием`,"git.ignoreUnknown":e=>`не понять, игнорирует ли ${e.repo} папку ${e.dir}`,"git.failed":e=>`git: не удалось ${Fe[e.step](e.subject)} ${e.repo}`,"git.noBranch":e=>`в ${e.repo} нет ветки ${e.branch} — главной ветки проекта ${e.project}; создайте её или укажите нужную в настройках проекта`,"git.wrongBranch":e=>`${e.repo} стоит ${e.current===null?`на отсоединённом HEAD`:`на ${e.current}`}, а не на ${e.branch} — главной ветке проекта ${e.project}; переключите копию на ${e.branch} или укажите нужную ветку в настройках проекта`,"sync.alias":e=>`git sync завершился с кодом ${e.exit}`,"sync.notMain":e=>`${e.repo} стоит на ${e.branch||`отцепленном HEAD`}, а не на ${e.main} — переключите его на ${e.main}`,"sync.fetch":e=>`не удалось получить ${e.remote}`,"sync.merge":e=>`${e.remote}/${e.main} не сливается в ${e.main} чисто — слейте вручную`,"sync.push":e=>`не удалось отправить ${e.main} в ${e.remote}`,"forward.busy":e=>`цепочка ${e.into} работает — релизная ветка вольётся, когда она затихнет`,"forward.notOnBranch":e=>`${e.repo} стоит на ${e.current||`отцепленном HEAD`}, а не на ${e.branch} — релизная ветка ждёт`,"forward.dirty":e=>`в ${e.repo} есть незакоммиченные правки — релизная ветка ждёт`,"forward.fetch":e=>`не удалось получить ветку ${e.from}`,"forward.conflict":e=>`ветка ${e.from} конфликтует с ${e.into} в ${e.files.join(`, `)||`неизвестных файлах`} — слияние отменено и ждёт ручного слияния или «Разрешить агентом»`,"forward.noConflict":e=>`в ветке ${e.from} нет конфликта, который мог бы разрешить агент`,"forward.agent":e=>`${e.task} разрешает перенос ${e.from} — релизная ветка ждёт его`,"forward.failed":e=>`git не смог влить ветку ${e.from} в ${e.into}, хотя конфликтов в файлах нет — исправьте то, что названо в сообщении git, и нажмите «Перенести сейчас»`,"forward.notRelease":e=>`${e.project} не вливается в другой проект`,"forward.foreign":e=>`у ${e.from} и ${e.into} нет общего remote, и ни одна папка не клон другой — ничего не получено; укажите в «Вливается в» проект того же репозитория`,"ci.noToken":e=>`ни у одного профиля нет токена для этого CI: добавьте профиль ${o[e.kind]} в «Настройки → Трекеры и CI»`,"ci.denied":e=>`${e.ci}: токен отклонён (HTTP ${e.status}) — ему нужно чтение actions репозитория`,"ci.http":e=>`${e.ci}: API ответил HTTP ${e.status}`,"ci.unreachable":e=>`${e.ci}: API не отвечает`,"review.denied":e=>`${e.ci}: токен отклонён (HTTP ${e.status}) — ему нужна запись pull request репозитория`,"intake.denied":e=>`${e.ci}: токен отклонён (HTTP ${e.status}) — ему нужны чтение и запись issue репозитория`,"review.notOpened":e=>`pull request задачи ${e.task} не открыт (исправьте доступ и нажмите «Снять с паузы», ответьте её сессии в чате или пропустите задачу)`,"review.notCompleted":e=>`у задачи ${e.task} нечего открывать как pull request, но в трекере она не переведена в Done (переведите её сами и продолжите цепочку или пропустите задачу)`,"review.notReady":e=>`PR-режиму ${e.project} негде открывать pull request, и цепочка не запускает задачи; она пойдёт сама в течение минуты, как только это исправят, или выключите PR-режим`,"review.cannotEnable":e=>`PR-режим ${e.project} не включён`,"chain.noTrackerMcp":e=>`цепочка ${e.project} не запускает задачи: «Описание задачи в промпте» выключено, а ни один пакет проекта не приносит MCP-сервер трекера ${e.server}, так что сессия не увидит свою задачу; включите пакет с ним или описание задачи — цепочка пойдёт сама`,"chain.packagesNotReady":e=>`цепочка ${e.project} не запускает задачи: ${e.packages.length===1?`пакет`:`пакеты`} ${I(e.packages)} не установлен${e.packages.length===1?``:`ы`}, не встал${e.packages.length===1?``:`и`} или без ключа; исправьте это на странице «Инструменты» — цепочка пойдёт сама`,"review.noRemote":e=>`у ${e.project} нет remote на GitHub, GitLab или Forgejo, где открыть pull request`,"review.noToken":e=>`ни у одного профиля нет токена для remote ${e.remote} (${e.web}); добавьте профиль ${o[e.kind]} его хоста`,"review.unsupportedHost":e=>`remote ${e.remote} на ${e.host} не поддерживается для pull request: только GitHub, GitLab и Forgejo`,"review.noNote":e=>`сессия не оставила описание pull request в ${e.path}`,"review.noBranch":e=>`${e.path} не на ветке`,"review.dirty":e=>`в ${e.path} есть незакоммиченные изменения`,"review.nothingAhead":e=>`у ${e.branch} нет коммитов сверх ${e.base}`,"review.pushFailed":e=>`не удалось запушить ${e.branch} в ${e.remote}`,"review.pushBehind":e=>`в ${e.branch} на ${e.remote} есть коммиты, которых нет у сессии (например, конфликт разрешён на форже): сессия сливает их к себе и снова отмечает pull request`,"ci.notTaken":e=>`${e.ci}: ни один раннер не взял ${e.commit}`,"ci.fixFailed":e=>`CI красный на main в ${e.commit} — это пуш починки ${e.task}; цепочка ждёт вас`,"ci.cannotCreate":e=>`CI красный на main в ${e.commit}, а трекер не умеет заводить задачу на починку`,"ci.fixNotCreated":e=>`CI красный на main в ${e.commit}; задача на починку не заведена`,"ci.fixNotStarted":e=>`CI красный на main в ${e.commit}; сессия починки не запущена`,"check.fixNotStarted":e=>`проверка проекта падает на main в ${e.commit}; сессия починки не запущена`,"check.fixFailed":e=>`проверка проекта падает на main в ${e.commit} — это пуш починки ${e.task}; цепочка ждёт вас`,"check.cannotCreate":e=>`проверка проекта падает на main в ${e.commit}, а трекер не умеет заводить задачу на починку`,"check.fixNotCreated":e=>`проверка проекта падает на main в ${e.commit}; задача на починку не заведена`,"afterGreen.failed":e=>`команда «${e.command}» после зелёного main в ${e.commit} завершилась с кодом ${e.code} — main остаётся зелёным, вывод в логе сервиса`,"slot.dirty":e=>`в слоте ${e.path} незакоммиченные изменения — закоммитьте или уберите их`,"slot.busy":e=>`слот ${e.path} занят посреди хода: ${I(e.sessions)} — дождитесь или остановите`,"slot.noneFree":e=>`свободного слота нет, ${e.task} не запущена — освободите слот и снимите с паузы`,"slot.waiting":e=>`свободного слота для ${e.task} нет — она запустится, как только слот освободится`,"slot.busyStart":e=>`слот ${e.slot} занят посреди хода: ${I(e.sessions)}, ${e.task} не запущена — дождитесь или остановите, затем снимите с паузы`,"slot.stopFailed":e=>`сессия ${e.session} задачи ${e.owner} в слоте ${e.slot} не остановлена, ${e.task} не запущена`,"setup.failed":e=>`команда «${e.command}» перед стартом ${e.task} завершилась с кодом ${e.code} — сессия не запущена, исправьте и снимите с паузы`,"agent.uncheckedVersion":e=>`Установлен ${e.title} ${e.installed}, а Even Keel последний раз проверяли на ${e.checked}: часть его может не работать, пока его не доработают`,"agent.daemonVersion":e=>`Демон ${e.title} аккаунта ${e.account} работает на ${e.running}, а не на проверенной ${e.wanted}: его сессии идут на ${e.running}, пока в аккаунте есть живые сессии, потом Even Keel его перезапустит`,"cliCheck.waiting":e=>`Проверка ${e.title} ${e.version} ждёт, пока на аккаунте ${e.account} не останется живых сессий: остановите цепи на нём`,"cliCheck.running":e=>`Идёт проверка ${e.title} ${e.version} на аккаунте ${e.account}; сессии цепей на нём ждут её конца`,"cliCheck.passed":e=>`${e.title} ${e.version} прошла проверку на этой машине`,"cliCheck.failed":e=>`${e.title} ${e.version} не прошла проверку на этой машине`,"cliCheck.interrupted":e=>`Проверку ${e.title} ${e.version} прервала остановка Even Keel; она запустится снова, когда на аккаунте не останется живых сессий`,"cliCheck.busy":e=>`на аккаунте ${e.account} идёт проверка CLI — повторите, когда она закончится`,"cliCheck.chainWaits":e=>`на аккаунте ${e.account} идёт проверка CLI — ${e.task} запустится, как только она закончится`,"claude.startFailed":e=>`не удалось запустить ${e.task} в ${e.cwd}`,"claude.untrusted":e=>`Claude Code ещё не доверяет папке ${e.folder}, поэтому ${e.task} не запущена. Выполните claude в этой папке от пользователя ${e.user}, примите доверие и продолжите цепочку`,"claude.resumeFailed":e=>`не удалось продолжить ${e.task} в ${e.cwd}`,"claude.notShown":e=>`${e.task} запущена, но не появилась в claude agents`,"claude.resumedNotShown":e=>`${e.task} продолжена, но не появилась в claude agents`,"claude.stopFailed":e=>`не удалось остановить ${e.agent}`,"claude.stillRunning":e=>`${e.agent} попросили остановиться, но она ещё работает`,"claude.signOutFailed":e=>`не удалось выйти из ${e.account}`,"claude.daemonStopFailed":e=>`не удалось остановить демон ${e.account}`,"claude.daemonStatusFailed":e=>`не удалось узнать версию демона ${e.account}`,"claude.statusNotJson":()=>`CLI ответил на проверку входа не так, как ждали (auth status — не JSON)`,"claude.statusNotObject":()=>`CLI ответил на проверку входа не так, как ждали (auth status — не объект)`,"claude.statusNoFlag":()=>`CLI ответил на проверку входа не так, как ждали (в auth status нет признака loggedIn)`,"codex.startFailed":e=>`Codex: не удалось запустить ${e.task} в ${e.cwd}`,"codex.resumeFailed":e=>`Codex: не удалось продолжить ${e.task} в ${e.cwd}`,"codex.pluginsFailed":e=>`Codex: не удалось установить плагины ${e.task} в ${e.account}`,"codex.hooksUntrusted":e=>`Codex не доверяет хукам пакета ${e.package}: без них ${e.task} пошла бы без проверки перед слиянием и напоминаний о контексте. Обновите Even Keel, а пока запустите задачу на другом провайдере`,"codex.otherThread":e=>`Codex: ${e.task} продолжали как ${e.asked}, а поднялся новый поток ${e.got}`,"codex.unknownSession":e=>`Codex: сессию ${e.session} запускал не Even Keel`,"codex.stillRunning":e=>`Codex: ход ${e.session} убит, но ещё идёт`,"codex.statusUnreadable":()=>`Codex: CLI ответил на проверку входа не так, как ждали (login status не сказал ни «Logged in», ни «Not logged in»)`,"codex.signOutFailed":e=>`Codex: не удалось выйти из ${e.account}`,"opencode.startFailed":e=>`OpenCode: не удалось запустить ${e.task} в ${e.cwd}`,"opencode.resumeFailed":e=>`OpenCode: не удалось продолжить ${e.task} в ${e.cwd}`,"opencode.otherSession":e=>`OpenCode: ${e.task} продолжали как ${e.asked}, а поднялась сессия ${e.got}`,"opencode.unknownSession":e=>`OpenCode: сессию ${e.session} запускал не Even Keel`,"opencode.stillRunning":e=>`OpenCode: ход ${e.session} убит, но ещё идёт`,"opencode.streamError":()=>`OpenCode сообщил об ошибке потока и ждёт. Отправьте ответ для повтора или нажмите «Новая сессия».`,"copilot.startFailed":e=>`Copilot: не удалось запустить ${e.task} в ${e.cwd}`,"copilot.binaryMissing":e=>`Copilot CLI не запускается: «${e.bin}» — не программа, которую Even Keel может запустить. Выберите «Проверенную» в «Версии CLI» Copilot (Настройки → Провайдеры и модели) или укажите в .env путь к исполняемому файлу copilot в EVEN_KEEL_COPILOT_BIN, затем возобновите цепь.`,"copilot.modelUnavailable":e=>`Copilot не может использовать модель «${e.model}». Выберите доступную модель в поле «Модель» настроек сессий проекта (или смените метку модели задачи), затем нажмите «Новая сессия».`,"copilot.notSignedIn":()=>`Copilot на этой машине не вошёл. Выполните «gh auth login» под пользователем, от которого работает Even Keel, или добавьте аккаунт Copilot со своим токеном на странице «Аккаунты», затем нажмите «Новая сессия».`,"copilot.resumeFailed":e=>`Copilot: не удалось продолжить ${e.task} в ${e.cwd}`,"copilot.unknownSession":e=>`Copilot: сессию ${e.session} запускал не Even Keel`,"copilot.stillRunning":e=>`Copilot: ход ${e.session} убит, но ещё идёт`,"account.unknown":e=>`аккаунта ${e.key} нет`,"account.alreadyActive":e=>`${e.key} уже активен`,"account.removing":e=>`${e.account} удаляется — сначала отмените удаление`,"account.needsLogin":e=>`в ${e.account} сначала нужно войти`,"account.globalKept":()=>`собственный аккаунт Claude Code отсюда не удаляется`,"account.activeKept":()=>`активный аккаунт не удалить — сначала переключитесь на другой`,"account.sharedPool":e=>`этот аккаунт выбран аккаунтом ${c[e.agent]??e.agent} в общих настройках — сначала выберите там другой`,"account.projectPool":e=>`этот аккаунт выбран аккаунтом ${c[e.agent]??e.agent} в настройках проектов ${I(e.projects)} — сначала выберите там другой`,"account.signInRunning":()=>`в этот аккаунт идёт вход`,"account.usedByApp":e=>`этот аккаунт использует ${e.app} — сначала переключите его на другой`,"account.codexApp":()=>`приложения работают на Claude Code — аккаунт Codex им не отдать`,"account.codexHomeKept":()=>`собственный аккаунт Codex отсюда не удаляется`,"account.secondFree":e=>`вход прошёл, но на бесплатном плане, а бесплатный аккаунт здесь уже есть — ${e.account}. Условия OpenAI не разрешают несколько бесплатных аккаунтов ради лимитов, поэтому из новой папки выполнен выход, она удалена и ничего не добавлено. Войдите аккаунтом с подпиской или переведите этот на платный план и войдите снова`,"account.sameFree":e=>`вход прошёл тем же аккаунтом ${e.account}, что уже стоит здесь на бесплатном плане: из новой папки выполнен выход, она удалена и ничего не добавлено. Чтобы добавить другой аккаунт, войдите аккаунтом с подпиской`,"account.extraFree":e=>`второй бесплатный аккаунт Codex рядом с ${e.account}: условия OpenAI не разрешают несколько бесплатных аккаунтов ради лимитов — сессии здесь не запускаются, пока план не платный`,"account.notRemoving":e=>`${e.key} не удаляется`,"account.apiKeyInvalid":()=>`API-ключ — одно слово длиннее 20 символов, вроде sk-ant-api03-…`,"account.apiKeyRejected":()=>`Anthropic не принимает этот ключ: он неверный, отозван или организация отключена`,"account.apiKeyUnchecked":e=>`не удалось проверить ключ у Anthropic (${e.reason}) — попробуйте позже`,"account.codexKeyInvalid":()=>`API-ключ OpenAI — одно слово длиннее 20 символов, вроде sk-proj-…`,"account.codexKeyRejected":()=>`OpenAI не принимает этот ключ: он неверный, отозван или проект отключён`,"account.codexKeyUnchecked":e=>`не удалось проверить ключ у OpenAI (${e.reason}) — попробуйте позже`,"account.copilotTokenInvalid":()=>`Copilot CLI принимает мелкозернистый личный токен (github_pat_…) с правом Copilot Requests или OAuth-токен (gho_…); классический ghp_ он не берёт`,"account.copilotTokenRejected":()=>`GitHub не принимает этот токен: он неверный, истёк или отозван`,"account.copilotTokenUnchecked":e=>`не удалось проверить токен у GitHub (${e.reason}) — попробуйте позже`,"account.keyNotHeld":()=>`ключ этого аккаунта хранится не в его папке (собственная папка агента или скрипт, выдающий ключ) — отсюда его не заменить`,"account.keyOtherProvider":e=>`в аккаунте ключ ${s[e.provider]??e.provider}; ключ другого провайдера — это другой аккаунт, добавьте его отдельно`,"account.keyOtherOrganization":()=>`ключ из другой организации, чем у аккаунта, — это другой аккаунт: добавьте его отдельно; старый ключ остался`,"account.chainRunning":e=>`цепочка ${e.project} работает — остановите её перед сменой аккаунта`,"account.sessionsBusy":e=>`сессии посреди хода (${I(e.sessions)}) — смените аккаунт, когда они закончат`,"account.homeGone":e=>`папки аккаунта ${e.key} больше нет`,"account.activeGone":e=>`папки активного аккаунта ${e.key} больше нет — переключитесь на другой аккаунт и снимите с паузы`,"account.signingIn":()=>`идёт вход — снимите с паузы, когда он закончится`,"account.signedOut":()=>`вход не выполнен — войдите на странице «Аккаунты» и снимите с паузы`,"account.loginExpired":e=>`вход в ${e.account} истёк — продлите его на странице «Аккаунты» и снимите с паузы`,"login.none":()=>`вход не идёт`,"login.running":()=>`вход уже идёт`,"login.timeout":e=>`вход не завершился за ${e.minutes} мин`,"login.startFailed":()=>`не удалось начать вход`,"agent.copyMissing":({title:e})=>`Ожидание проверенной копии ${e}. Скачайте её или выберите «Свою» в «Версии CLI» (Настройки → Провайдеры и модели).`,"agent.copyFailed":({title:e})=>`Не удалось скачать ${e}. «Версия CLI» переключена на «Свою». Попробуйте скачать снова.`,"login.codexMissing":()=>"Codex CLI не найден. Установите его:\n\n```sh\nnpm install -g @openai/codex\n```","login.claudeMissing":()=>"Claude Code CLI не найден. Установите его:\n\n```sh\nnpm install -g @anthropic-ai/claude-code\n```","login.opencodeMissing":()=>"OpenCode CLI не найден. Установите его:\n\n```sh\nnpm install -g opencode-ai\n```","login.copilotMissing":()=>"Copilot CLI не найден. Установите его:\n\n```sh\nnpm install -g @github/copilot\n```","login.method":e=>`способа входа «${e.method}» нет, есть: ${I(e.known)}`,"login.exited":e=>`вход завершился с кодом ${e.code}`,"login.setupFailed":e=>`вход выполнен, но папку ${e.dir} не удалось подготовить`,"app.unknown":e=>`приложения ${e.app} нет`,"app.alreadyUses":e=>`${e.app} уже использует ${e.account}`,"app.chatsOpen":e=>`в ${e.app} ${j(`ru`,e.count,{one:`открыт`,other:`открыто`})} ${Pe(e.count)} Claude — сначала закройте`,"vscode.noFile":()=>`файл настроек VS Code ищется только на Windows, macOS и Linux`,"vscode.notJson":()=>`settings.json — не чистый JSON (комментарии или висячие запятые?), Even Keel его не переписывает`,"vscode.notObject":()=>`settings.json — не JSON-объект`,"usage.notJson":()=>`ответ — не JSON`,"usage.notObject":()=>`ответ — не JSON-объект`,"usage.turns":e=>`num_turns = ${e.value}, а не 0`,"usage.cost":e=>`total_cost_usd = ${e.value}, а не 0`,"usage.isError":()=>`ответ — ошибка`,"usage.noResult":()=>`в ответе нет текста результата`,"usage.noLimits":()=>`в ответе подписки нет строк лимитов: сервис не ответил (лимит запросов или истёкший токен)`,"usage.noSession":()=>`нет читаемой строки «Current session»`,"usage.noWeek":()=>`нет читаемой строки «Current week (all models)»`,"usage.callFailed":()=>`вызов не удался`,"usage.noRollout":()=>`ни одна сессия Codex этого аккаунта ещё не сообщила лимиты`,"usage.chatGptExpired":()=>`токен входа ChatGPT истёк; запустите сессию или обновите вход аккаунта`,"usage.chatGptRevoked":()=>`вход ChatGPT отозван, например после смены тарифа; обновите вход аккаунта`,"usage.chatGptUnread":()=>`в ответе ChatGPT о лимитах нет читаемых окон`,"usage.openCodeNone":()=>`нет входа через ChatGPT или Copilot: у бесплатных моделей OpenCode и API-ключей нет лимитов, которые можно прочитать`,"usage.copilotMachine":()=>`Even Keel не удалось прочитать вход Copilot на этой машине; чтобы читать запас, добавьте аккаунт Copilot с собственным токеном`,"usage.copilotUnlimited":()=>`у плана Copilot нет месячного лимита`,"usage.copilotUnread":()=>`в ответе GitHub о Copilot нет читаемого запаса`,"usage.copilotSignIn":()=>`GitHub не принял вход Copilot, войдите заново`,"usage.planRead":()=>`токен не может читать расход Copilot: дайте ему право «Plan» (чтение) в настройках токена на GitHub`,"prompt.empty":e=>`промт: в промт сессии нечего подставить после «${e.before}» (пришло ${e.value}) — проверьте задачу в трекере и настройки проекта и снимите с паузы`,"request.tooLarge":()=>`тело запроса слишком большое`,"request.notJson":()=>`тело запроса — не JSON`,"request.notObject":()=>`тело запроса должно быть объектом`,"request.required":e=>`нужно поле ${e.field}`,"request.taskId":()=>`задача должна выглядеть как ABC-12`,"request.taskList":()=>`порядок должен быть списком ID задач`,"request.projectList":()=>`порядок должен быть списком проектов`,"task.noTracker":e=>`${e.task} не обслуживает ни один подключённый трекер`,"task.cannotReady":e=>`трекер ${e.task} не умеет ни ставить ей обязательную метку, ни переводить в Todo`,"task.cannotUnready":e=>`трекер ${e.task} не умеет ни снимать с неё обязательную метку, ни переводить в статус бэклога`,"task.unreadyLive":e=>`у ${e.task} живая сессия: остановите её или дождитесь конца, потом переносите задачу в бэклог`,"task.inBacklog":e=>`${e.task} уже в бэклоге`,"task.cannotRelabel":e=>`трекер ${e.task} не умеет менять метки`,"task.relabelFailed":e=>`не удалось изменить метки ${e.task}; проверьте права профиля трекера на изменение задач и меток и повторите попытку`,"task.labelGroup":e=>`«${e.label}» в Linear — группа меток, на ${e.task} её не поставить; выберите метку внутри группы`,"task.pastBacklog":e=>`${e.task} уже не в статусе бэклога`,"task.cannotMoveMilestone":e=>`трекер ${e.task} не умеет менять веху задачи`,"tracker.noProject":e=>`проект ${e.project} не обслуживает ни один подключённый трекер`,"changelog.cannotList":e=>`трекер ${e.project} не умеет перечислять задачи вехи`,"changelog.empty":e=>`в ${e.milestone} нет ни одной сделанной задачи, черновик писать не из чего`,"changelog.noAgent":e=>`агент аккаунта, на котором идёт ${e.project}, не умеет писать черновик`,"changelog.failed":e=>`агент не написал черновик ${e.project}`,"changelog.unnoticed":e=>`агент не нашёл в сделанных задачах ${e.milestone} (${I(e.tasks)}) ничего заметного пользователю, и записей в разделе нет; если какая-то из них что-то меняет для пользователей, напишите, что именно, в её закрывающем комментарии и нажмите «Написать заново»`,"changelog.noDraft":e=>`у ${e.milestone} ещё нет черновика`,"changelog.released":e=>`раздел ${e.milestone} выпущен как ${e.tag} и больше не правится`,"changelog.nothingNew":e=>`все сделанные задачи ${e.milestone} уже в черновике`,"changelog.notOnBranch":e=>`основной чекаут на ${e.current||`отсоединённом HEAD`}, а не на ${e.branch}: ченджлог не записан`,"changelog.dirty":e=>`${e.file} изменён в основном чекауте и не закоммичен: ченджлог не записан`,"changelog.commitFailed":e=>`git не смог закоммитить ${e.file}`,"config.notJson":e=>`${e.file} — не JSON`,"config.port":e=>`EVEN_KEEL_PORT должен быть целым в 1..65535, а не ${e.value}`,"server.rebindFailed":e=>`Не удалось слушать ${e.address} из .env, служба остаётся на ${e.current}`,"config.mcpPort":e=>`EVEN_KEEL_MCP_PORT должен быть целым в 1..65535, а не ${e.value}`,"config.branch":e=>`${e.where} должен быть именем ветки, а не ${e.value}`,"config.changelogPath":e=>`${e.where} должен быть путём к файлу внутри репозитория, а не ${e.value}`,"config.projects":()=>`projects должен быть списком записей проектов`,"config.projectEntry":e=>`${e.where} должен быть объектом с id, key и repo проекта`,"config.projectKey":e=>`${e.where} должен быть ключом проекта (заглавная буква и до 4 заглавных, цифр или _), а не ${e.value}`,"config.projectId":e=>`${e.where} должен быть id проекта; записи без id Even Keel выдаёт его сам`,"config.projectTwice":e=>`${e.field} ${e.value} повторяется: в ${e.first} и в ${e.second}`,"config.version":e=>`version должен быть целым числом, а не ${e.value}`,"storage.newer":e=>`${e.file} записан более новой версией Even Keel (схема ${e.version}, эта знает до ${e.known}): верните его копию *.bak или обновите Even Keel`,"storage.damaged":e=>`${e.file} не читается, поэтому миграция ничего не записала`,"storage.unknownProject":e=>`${e.file} называет проект ${e.project}, которого нет в конфиге, поэтому миграция ничего не записала`,"storage.writeFailed":e=>`не удалось записать ${e.file}; записанные до него файлы возвращены из копий`,"storage.newerDatabase":e=>`база ${e.file} записана более новой версией Even Keel (схема ${e.version}, эта знает до ${e.known}): обновите Even Keel`,"storage.importFailed":e=>`не удалось перенести файлы состояния в ${e.file}; база не создана, файлы остались как были`,"packages.unknown":e=>`пакета ${e.name} нет`,"packages.exists":e=>`${e.name} уже есть в каталоге`,"packages.busy":e=>`${e.name} ещё ставится — дождитесь конца установки`,"packages.noMarketplace":e=>`Claude Code не знает маркетплейс ${e.marketplace}`,"packages.noPlugin":e=>`в маркетплейсе ${e.marketplace} нет плагина ${e.plugin}`,"packages.installInClaude":e=>`${e.plugin} лежит вне папки своего маркетплейса — сначала установите его в Claude Code (claude plugin install ${e.plugin}), потом здесь`,"packages.copyFailed":e=>`не удалось скопировать плагин ${e.name}`,"packages.noSkills":()=>`выберите хотя бы один навык`,"packages.unknownSkill":e=>`навыка ${e.name} нет ни в ~/.claude/skills, ни в папке навыков Codex`,"packages.npmFailed":e=>`npm не смог установить ${e.spec}`,"huly.clientInstalling":()=>`клиент Huly устанавливается, минуту-две; проекты на Huly ждут его`,"huly.clientFailed":()=>`npm не смог установить клиент Huly; проекты на Huly ждут, пока установку не повторят`,"packages.marketplaceUpdate":e=>`claude plugin marketplace update ${e.marketplace} не удался`,"packages.marketplaceAdd":e=>`claude plugin marketplace add не смог добавить ${e.marketplace}`,"packages.noOwnMarketplace":e=>`в ${e.dir} нет .claude-plugin/marketplace.json`,"packages.upToDate":e=>`у ${e.name} уже последняя версия`,"packages.updated":e=>`${e.name} обновлён до ${e.version}; идущие задачи остаются на версии, с которой начали`,"packages.badServer":e=>`серверу ${e.name} нужна команда или адрес`,"packages.badName":e=>`${e.name} не годится в имя сервера: только буквы, цифры, - и _`,"packages.keyName":e=>`${e.name} — не имя переменной`,"packages.keyValue":e=>`в значении ${e.name} не может быть переноса строки или одинарной кавычки`,"packages.unknownKey":e=>`${e.name} не читает ни один пакет или трекер`,"packages.port":e=>`шлюз MCP не может слушать 127.0.0.1:${e.port}, порт занят другой программой — задайте другой EVEN_KEEL_MCP_PORT в .env Even Keel`,"secrets.unknown":e=>`${e.name} — не из тех доступов, что задаются на странице`,"secrets.empty":e=>`значение ${e.name} пустое; удаление переменной — отдельное действие`,"secrets.outer":e=>`${e.name} задана в окружении службы, а не в .env — меняйте её там`,"secrets.tokenRequired":()=>`EVEN_KEEL_TOKEN нельзя удалить, пока служба слушает не только localhost (EVEN_KEEL_HOST)`,"secrets.settingsJson":()=>`глобальный settings.json — не простой объект JSON; Even Keel его не переписывает`,"tally.mode":e=>`«${e.value}» — не место для статистики: только off, local или server`,"tally.incomplete":e=>`для своей базы Postgres нужны ${e.names}`,"tally.port":e=>`порт ${e.value} — не число от 1 до 65535`,"tally.unreachable":e=>`${e.address} не пустил ${e.role}`,"profiles.unknownKind":e=>`трекера «${e.kind}» нет`,"profiles.unknown":()=>`такого профиля нет — возможно, страница устарела`,"profiles.oauthAddress":()=>`Откройте Even Keel через HTTPS или на localhost на машине сервиса, затем подключите MCP снова.`,"profiles.oauthUnsupported":()=>`Для этого трекера в Even Keel нет подключения MCP через OAuth.`,"profiles.oauthFailed":()=>`Подключение MCP через OAuth не завершено. Проверьте соединение, выбранные аккаунт и сайт, затем снова нажмите «Подключить MCP через OAuth».`,"profiles.oauthDenied":()=>`Доступ MCP не разрешён. Снова нажмите «Подключить MCP через OAuth» и разрешите доступ.`,"profiles.oauthExpired":()=>`Попытка подключения MCP истекла или поля профиля изменились. Подключите MCP через OAuth снова.`,"profiles.oauthReconnect":()=>`Доступ MCP отозван или истёк. Откройте профиль трекера и подключите MCP через OAuth снова.`,"profiles.mcpOtherAccount":e=>`Доступ MCP выдан аккаунту ${e.grant}, а трекер работает от ${e.tracker}: сессии будут писать от имени другого человека. Если это не нарочно — подключите снова, войдя нужным аккаунтом.`,"profiles.incomplete":e=>`Заполните все поля профиля ${e.tracker} выше.`,"profiles.refused":e=>`${e.tracker} не принял учётные данные`,"profiles.unreachable":e=>`${e.tracker} не ответил`,"profiles.isGitlab":e=>`${e.host} — это GitLab: добавьте профиль GitLab`,"profiles.hostLocked":e=>`профиль ${e.profile} используют ${e.projects}: адрес и workspace не меняются, только учётные данные`,"profiles.inUse":e=>`профиль ${e.profile} используют ${e.projects} — удалить нельзя`,"profiles.otherTracker":e=>`${e.profile} — профиль другого трекера, не того, что у ${e.project}`,"profiles.paused":e=>`${e.project}: цепочка ждёт — трекер не принял учётные данные профиля ${e.profile}; обновите их в Настройки → Трекеры и CI`,"config.repoEmpty":e=>`путь к репозиторию ${e.key} пуст`,"config.slot":e=>`${e.key}.slot должен быть true, false или числом слотов`,"config.color":e=>`${e.key}.color должен быть целым числом от 1 до 8`,"config.language":e=>`${e.where}: языка ${e.value} нет, есть: ${I(e.known)}`,"config.trackerName":e=>`${e.where} должен быть именем адаптера трекера`,"config.brief":e=>`${e.where} должен быть true или false`,"config.briefValue":e=>`${e.where} должен быть true, false или null`,"config.trackerUnknown":e=>`${e.where}: трекера «${e.name}» нет, есть: ${I(e.known)}`,"config.trackerProject":e=>`${e.where} должен называть проект в трекере, например «${e.example}»`,"config.notObject":e=>`${e.where} должен быть объектом`,"config.ruleKey":e=>`${e.where}.${e.key} — не правило цепочки`,"config.ruleList":e=>`${e.where}.${e.key} должен быть списком непустых имён`,"config.projectPrompt":e=>`${e.where} должен быть текстом`,"config.projectName":e=>`${e.where} должен быть текстом`,"config.provider":e=>`${e.where}: провайдера ${e.value} нет, есть: ${I(e.known)}`,"config.providerKey":e=>`${e.where}.${e.key} — не провайдер, есть: ${I(e.known)}`,"config.providerName":e=>`${e.where} должен быть текстом`,"config.execution":e=>`execution.${e.provider}: режима ${e.value} нет, есть: ${I(e.known)}`,"config.cli":e=>`cli.${e.provider}: варианта ${e.value} нет, есть: ${I(e.known)}`,"config.executionCli":e=>`execution.${e.provider}: ${e.mode} работает только на проверенной копии CLI, поставьте cli.${e.provider}: checked`,"config.trackerLocked":e=>`цепочка уже запускала задачи ${e.key}, поэтому трекер и профиль остаются; задачи другого трекера добавляются источником задач`,"config.feeds":e=>`${e.where} должен быть списком источников задач, у каждого — id, трекер и ключ`,"config.feedField":e=>`у ${e.where} не хватает поля ${e.field}`,"config.feedRules":e=>`${e.where} должен быть объектом правил цепочки (${e.keys.join(`, `)}), каждое — список имён; active и terminal могут быть null`,"config.statusMoves":e=>`${e.where} должен быть объектом имён статусов: start и review — имя или null, done — имя`,"config.feedPrefix":e=>`источник задач ${e.project} даёт ID задач ${e.prefix}-…, как и ${e.other}: дайте источнику другой ключ`,"config.feedPlace":e=>`источник задач ${e.project} читает то же место трекера, что и ${e.other}, и задача попала бы в цепочку дважды`,"config.feedLocked":e=>`цепочка уже запускала задачи источника ${e.key} проекта ${e.project}, поэтому он не меняется: уберите его и добавьте другой`,"config.commandKey":e=>`${e.where}.${e.key} — не вид команд, есть: ${I(e.known)}`,"config.commandList":e=>`${e.where} должен быть списком команд`,"config.ciKey":e=>`${e.where}.${e.key} — не настройка CI, есть: ${I(e.known)}`,"config.ciKinds":e=>`${e.where} должен быть списком CI, есть: ${I(e.known)}`,"config.ciWait":e=>`${e.where} должен быть целым числом минут от 0 или null`,"config.remoteProfiles":e=>`${e.where} должен сопоставлять виду remote (${I(e.known)}) id профиля`,"config.standards":e=>`${e.where} должен быть списком { doc, files, except, shots }: путь к файлу внутри репозитория, хотя бы одна маска, по одной записи на документ`,"config.unknownProject":e=>`проекта ${e.key} нет`,"config.unknownFeed":()=>`у проекта нет такого источника задач`,"config.writeFailed":e=>`не удалось записать ${e.file}`,"config.statusBoth":e=>`${e.project}: статус «${e.status}» и активный, и терминальный`,"config.labelBoth":e=>`${e.project}: ярлык «${e.label}» и обязательный, и исключающий`,"config.milestoneBoth":e=>`${e.project}: майлстоун «${e.milestone}» и обязательный, и исключающий`,"config.trackerProjectShared":e=>`${e.project} и ${e.other} читают проект трекера ${e.trackerProject}, и задача может попасть в обе цепочки: разделите их майлстоунами (обязательные и исключающие майлстоуны в правилах цепочки)`,"config.keyElsewhere":e=>`у ${e.project} и ${e.other} один ключ ${e.key} на разных репозиториях (${e.project} — на ${e.trackerProject}), и ID задач у них совпадут: дайте одному из них другой ключ`,"config.modelPrompts":()=>`В «Промптах моделей» укажите провайдера или шаблон «провайдер | модель» и промпт; * означает любую строку`,"config.modelPromptEmpty":e=>`modelPrompts.${e.model} пуст`,"protection.fileConflict":()=>`«Защита» не может записать правила: их место занято другим файлом. Переименуйте этот файл и запустите сессию снова`,"config.protection":e=>`В настройке «Защита» (${e.where}) нужны допустимые группы и правила запретов агентов`,"config.hiddenSkills":()=>`hiddenSkills должен быть списком имён навыков`,"config.cacheTtl":e=>`cacheTtl: ${e.value} — должно быть "5m" или "1h", либо ключа нет`,"config.autoCompactWindow":e=>`Окно автокомпакта: ${e.value} — нужно положительное целое число токенов или null для окна аккаунта`,"config.parallel":e=>`parallel должен быть целым числом от 1, а не ${e.value}`,"config.keepWarm":e=>`keepWarm должен быть целым числом часов от 0 до ${e.max}, а не ${e.value}`,"config.mergeInto":e=>`${e.project} вливается в ${e.into}, а это не другой проект или он сам вливается в проект`,"config.mergeIntoValue":e=>`${e.where} — ключ проекта или null`,"config.intakeLabel":e=>`${e.where} — имя метки GitHub или null`,"config.mergeIntoForeign":e=>`${e.project} вливается в ${e.into}, а это папка другого репозитория: нет общего remote, и ни одна не клон другой`,"config.allowedHosts":()=>`allowedHosts должен быть списком имён хостов`,"config.updatesKey":e=>`updates.${e.key} — не настройка обновлений, есть: ${I(e.known)}`,"config.updatesDismissed":e=>`updates.dismissed должен быть версией вида 0.2.0 или null, а не ${e.value}`,"updates.running":()=>`обновление уже идёт`,"updates.none":()=>`нет релиза новее установленного`,"updates.noPrevious":()=>`нет прежней версии, на которую можно вернуться`,"updates.blocked":e=>Ie[e.reason],"config.token":e=>`host ${e.host} виден из сети, поэтому странице нужен токен: задайте EVEN_KEEL_TOKEN в .env (от 16 символов) и перезапустите службу, или поставьте host 127.0.0.1`,"config.tokenShape":()=>`EVEN_KEEL_TOKEN должен быть от 16 символов из A-Z a-z 0-9 . _ ~ + / = -`,"config.modelPromptPlaceholder":e=>`в modelPrompts.${e.model} подстановка ${e.placeholder}, а промт модели передаётся как есть`,"config.contextWindow":e=>`context.window должен быть положительным целым числом токенов, а не ${e.value}`,"config.contextPercents":()=>`context.warn и context.danger должны быть процентами, 0 < warn < danger <= 100`,"config.compareKey":e=>`stats.compare.${e.key} — не настройка сравнения`,"config.compareValue":e=>`stats.compare.${e.key} должен быть целым в 1..${e.limit}, а не ${e.value}`,"config.statsMove":e=>`в stats.moves нужны непустые старая и новая папки, а не «${e.from}»`,"config.otherBelow":e=>`stats.otherBelow должен быть суммой в долларах от 0, а не ${e.value}`,"config.checkpointTokens":e=>`stats.checkpointTokens должен быть целым числом токенов от ${e.from} или null, а не ${e.value}`,"config.checkpointShare":e=>`${e.where} должен быть целым процентом окна контекста от 1 до 100, а не ${e.value}`,"config.checkpointShareKey":e=>`${e.where}.${e.key} — не доля чекпоинта, есть: ${I(e.known)}`,"config.checkpointShareOrder":e=>`${e.where}: нужно first < late < hard, а не ${e.first}, ${e.late}, ${e.hard}`,"wizard.notRepo":e=>`${e.path} — не папка git-репозитория`,"wizard.repoTaken":e=>`этот репозиторий уже подключён как проект ${e.project}`,"wizard.keyTaken":e=>`ключ ${e.key} уже у проекта ${e.project} на другом репозитории, и ID задач у них совпадут — выберите другой`,"wizard.noBranch":e=>`в репозитории нет ветки ${e.branch}, есть ${e.branches.join(`, `)}`,"wizard.noCommits":()=>`в репозитории ещё нет коммитов, и его ветка не родилась: сделайте первый коммит`,"wizard.noFolder":e=>`${e.path} — не папка`,"wizard.relativePath":e=>`${e.path} — не полный путь: укажите папку от корня диска или от ~`,"wizard.keyShape":e=>`ключ — латинская заглавная буква и до 4 заглавных, цифр или _, а не «${e.value}»`,"wizard.branchName":e=>`«${e.value}» — не имя ветки`,"wizard.trackerPlace":e=>`назовите проект в трекере так: ${e.example}`,"wizard.trackerShared":e=>`${e.project} уже берёт задачи этого проекта трекера, и каждая задача попала бы в обе цепочки: укажите ниже в «Только задачи из майлстоунов», какие майлстоуны берёт этот проект, — ${e.project} их отдаст. Или выберите другой проект трекера`,"wizard.entryFailed":()=>`с такими значениями проект не добавить`,"wizard.trackerOff":e=>`нет профиля ${e.tracker} с ${I(e.variables)}: добавьте его пунктом «Добавить профиль» в списке «Профиль»`,"wizard.trackerFailed":e=>`${e.tracker} не отдал задачи проекта`,"project.removeBlocked":e=>`${e.project} не удалён, он ещё занят`,"project.removeChain":()=>`его цепочка идёт или ждёт в очереди — сначала остановите её`,"project.removeSessions":e=>`живые сессии: ${I(e.sessions)}`,"project.removePlaces":e=>`цепочка держит worktree или слот задач ${I(e.tasks)}`,"project.removeLeftovers":e=>`после Done остались несобранные места задач ${I(e.tasks)}`},Re={limit:e=>`${e}: цепь встала на лимите`,limitBody:`Переключите аккаунт или дождитесь сброса.`,red:e=>`${e}: main покраснел`,redBody:(e,t)=>`${t?`${t} на`:`На`} ${e}; следующая задача ждёт, пока main снова не станет зелёным.`,ciRed:(e,t)=>`${e}: ${t} покраснел`,ciRedBody:e=>`На ${e}; цепочка не учитывает этот CI при продолжении работы.`,ask:e=>`${e} задаёт вопрос`,askBody:`Ответьте в окне чата сессии.`,conflict:(e,t)=>`${e}: перенос в ${t} упёрся в конфликт`,conflictBody:`Слейте вручную или нажмите «Разрешить агентом» на странице проекта.`,uncommitted:e=>`${e}: работа готова, но не закоммичена`,unmerged:e=>`${e}: работа закоммичена, но не влита`,workBody:e=>`Задача ушла из цепи, а работа лежит в ${e}.`,open:`Открыть`,close:`Закрыть`},ze=(e,t,n)=>r=>`${r} ${j(`ru`,r,{one:e,few:t,many:n,other:t})}`,Be={warnings:ze(`предупреждение`,`предупреждения`,`предупреждений`),cleanupSummary:e=>`Остатки уборки: ${e}`,dismissAll:`Готово для всех`,leftover:e=>`${e} закрыта, но после неё не всё прошло гладко — проверьте руками.`,dismiss:`Убрал`,forwardWaits:(e,t)=>`${ze(`коммит`,`коммита`,`коммитов`)(e)} этого проекта ждут переноса в ${t}.`,forwardPushFailed:e=>`Релизная ветка влилась в ${e}, но не отправилась — отправит следующая синхронизация.`,forwardNow:`Перенести сейчас`,forwardConflict:(e,t,n,r)=>`${ze(`коммит`,`коммита`,`коммитов`)(e)} ${t} конфликту${e===1?`ет`:`ют`} с ${n} в ${ze(`файле`,`файлах`,`файлах`)(r)}`,forwardResolve:`Разрешить агентом`,forwardMore:`Подробнее`,forwardAgent:e=>`Агент разрешает конфликт в цепочке ${e}`,forwardAgentAsked:e=>`Агент разрешит конфликт после текущей задачи ${e}`,forwardAgentOpen:`Открыть`},L=(e,t,n)=>r=>j(`ru`,r,{one:e,few:t,many:n,other:t}),Ve=(e,t,n)=>r=>`${r} ${L(e,t,n)(r)}`,He=Ve(`запуск`,`запуска`,`запусков`),R=Ve(`задача`,`задачи`,`задач`),Ue=Ve(`починка`,`починки`,`починок`),We=e=>e===null?`Починка main`:`Починка main: ${e}`,Ge={github:`Репозиторий на GitHub`,gitlab:`Проект на GitLab`},Ke={notice:Le,common:{close:`Закрыть`,retry:`Повторить`,cancel:`Отмена`,hide:`Скрыть`,apply:`Применить`,open:`Открыть`,remove:`Удалить`,restore:`Вернуть`,total:`Всего`,max:`Макс.`,noData:`нет данных`,reading:`Читаю транскрипт…`,copyCommand:`Скопировать команду`,commandCopied:`Скопировано`},units:{day:`д`,days:`дн`,hour:`ч`,minute:`мин`,minuteShort:`м`,second:`с`,percent:e=>`${e} %`},time:{justNow:`только что`,ago:e=>`${e} назад`,since:`с`},app:{connecting:`Подключение…`,noServer:`Нет связи с сервером Even Keel.`,blocked:e=>`Even Keel ничего не запустил и ничего не записал. ${e}`},header:{nav:`Навигация`,stats:`Статистика`,tools:`Инструменты`,settings:`Настройки`,menu:`Меню`,gear:e=>`Настройки и состояние: ${e}`},updates:{version:e=>`Even Keel ${e}`,available:e=>`доступна ${e}`,availableTitle:`Открыть релиз на GitHub`,toastTitle:e=>`Доступна версия ${e}`,toastBody:e=>`Установлена ${e}. Открыть описание релиза на GitHub.`,mute:`Больше не показывать`,close:`Закрыть`,open:`Обновить…`,openTitle:`Список изменений и кнопка обновления`,back:e=>`вернуть ${e}`,windowTitle:`Обновление Even Keel`,installed:`Установлена`,latest:`Последний релиз`,upToDate:`Установлен последний релиз.`,changes:`Что изменится`,noNotes:`У релиза нет описания.`,onGithub:`На GitHub`,reverted:`Релиз-откат`,revertedBody:`Он возвращает то, что изменил один из прежних релизов:`,update:e=>`Обновить до ${e}`,updateHint:e=>`Служба дождётся, пока цепочки не будут в запуске, передаче или закрытии задачи, остановится, ${e===`npm`?`поставит релиз через npm`:`перейдёт на тег релиза, поставит зависимости, соберётся`} и запустится снова, а страница перезагрузится сама. Если новая версия не поднимется, вернётся та, что работает сейчас.`,blocked:{global:`Кнопки нет: пакет npm поставлен не глобально, и его папка может пропасть. Поставьте его через npm install --global even-keel.`,service:`Кнопки нет: Even Keel запущен не службой (npm start), и перезапустить его некому. Обновляйтесь вручную, как в README.`,git:`Кнопки нет: папка Even Keel — не git-чекаут. Обновляйтесь вручную, как в README.`,dirty:`Кнопки нет: в чекауте есть незакоммиченные изменения. Закоммитьте или уберите их — или обновляйтесь вручную.`,tag:`Кнопки нет: чекаут не на релизном теге установленной версии — это рабочая копия разработчика или установка, которую собирает CI. Она обновляется так, как настроена.`,checking:`Чекаут ещё читается…`},previous:`Прежняя версия`,revert:e=>`Вернуть ${e}`,revertHint:e=>`Возвращает ${e} — версию, с которой обновились, — тем же способом, что и обновление.`,revertStorage:e=>`Кнопки нет: эта версия перевела хранилище на новый формат, и ${e} его не прочитает. Вернуться можно только из копий .bak, и всё записанное после обновления пропадёт — порядок в docs/guide/setup.md, раздел «Going back». Лучше дождаться релиза-отката.`,progressSettling:(e,t,n)=>`${e===`update`?`Обновление до`:`Возврат на`} ${t}: ждём ${n.join(`, `)}`,progressRunning:(e,t)=>`${e===`update`?`Обновление до`:`Возврат на`} ${t}…`,progressBody:`Служба перезапускается, страница перезагрузится сама.`,resultDone:(e,t)=>`${e===`update`?`Обновлено до`:`Возвращена`} ${t}`,resultFailed:(e,t)=>`${e===`update`?`Обновление до`:`Возврат на`} ${t} не удался`,resultBody:(e,t,n,r)=>t===`done`?`Шаг «${e}». Вернулась ${n}.`:t===`failed`?`Шаг «${e}». Вернуть ${n} тоже не удалось, шаг «${r}»: смотрите logs/update.log.`:`Шаг «${e}».`,resultDoneBody:e=>`Прежняя версия — ${e}.`,steps:{settle:`ожидание цепочек`,stop:`остановка службы`,fetch:`получение тегов`,checkout:`переход на тег релиза`,restore:`возврат прежнего коммита`,install:`установка зависимостей`,build:`сборка`,start:`запуск службы`,answer:`ответ службы`,launch:`запуск процесса обновления`},details:`Подробнее`,output:`Вывод`,log:`Весь журнал — logs/update.log в папке Even Keel.`},fallback:{toastTitle:e=>`${e} запущена без своего ярлыка запуска`,close:`Закрыть`},toast:{region:`Уведомления`},events:Re,fix:{project:`Открыть настройки проекта`,shared:`Открыть настройку`,trackers:`Открыть Настройки → Трекеры и CI`,page:`Открыть Настройки → Интерфейс`,accounts:`Открыть Аккаунты`,moves:`Открыть статусы при действиях`,resume:`Проверить и продолжить`,packages:`Открыть пакеты проекта`,git:`Открыть шаг «Git»`},banner:{config:e=>`Настройки не применены, работают последние исправные: ${e}`,stale:`Данные устарели: нет связи с сервером, переподключаюсь.`,usageUnread:e=>`Лимиты из /usage не читаются — показаны последние из statusline, CLI мог поменять формат. Причина: ${e}`,usageOff:e=>`Опрос /usage выключен до перезапуска службы: ответ похож на ход модели, а он тратит квоту. Причина: ${e}`,limitHold:e=>`Лимит исчерпан — следующая задача запустится после сброса в ${e}.`,ciHold:(e,t)=>`Ждёт CI на main: ${e} с ${t} — следующая задача запустится, когда он позеленеет.`,checkHold:(e,t)=>`Проверяет main на ${e} с ${t} в папке следующей задачи — задача запустится, когда проверка пройдёт.`,afterGreenHold:(e,t)=>`Выполняет команды после зелёного main на ${e} с ${t} — следующая задача запустится, когда они закончатся.`,remoteFixHold:(e,t,n)=>`main общего remote красный на ${e}; его с ${t} чинит ${n} — следующая задача запустится, когда починка позеленеет.`,gateway:e=>`Цепочки ждут: шлюз MCP не работает — ${e}`,closingHold:e=>`${e} готова — следующая задача запустится, когда её сессия закончит ход и папку уберут.`,gatewayHold:`Следующая задача ждёт шлюз MCP: он не работает, почему — в плашке выше.`,packagesHold:e=>`Следующая задача ждёт пакеты: ${e} — запустится, когда они ответят.`,packagesSilentHold:e=>`Следующая задача ждёт пакеты: ${e}. Их спросят снова через полминуты, потом всё реже, до раза в час; проверьте их команду и настройки.`,unattended:`Включён режим без присмотра: сессии не задают вопросов. Выключается в настройках → Цепочка.`,cliOne:(e,t,n)=>`${e} ${t} · проверен ${n}`,cliDaemon:(e,t,n,r)=>`Демон ${e} аккаунта ${t} на ${n} · проверен ${r}`,cliMany:e=>`${e} CLI на версиях, на которых Even Keel не проверяли`,cliDetails:`Подробнее`},limits:{fiveHour:`5 часов`,fiveHourTitle:`Лимит 5 часов`,week:`Неделя`,weekTitle:`Недельный лимит`,month:`Месяц`,monthTitle:`Месячный лимит`,short:{fiveHour:`5 ч`,sevenDay:`нед.`,month:`мес.`},sources:{usage:`по /usage`,statusline:`по statusline`,sdk:`по SDK-сессии`,api:`по API провайдера`},noData:`нет данных`,left:e=>`осталось ${e}`,used:e=>`использовано ${e}`,leftShort:e=>`ост. ${e}`,usedShort:e=>`исп. ${e}`,empty:(e,t)=>`${e}: нет данных${t}`,reset:(e,t,n)=>`${e}: сброс через ${t}${n}`,resetAt:(e,t)=>`сброс через ${e} — ${t}`,updated:(e,t)=>`${e}, ${t}`,outdated:e=>`Прочитаны ${e}, после перезапуска не проверены`},status:{levels:{ok:`всё работает`,warn:`есть предупреждения`,error:`есть сбои`,off:`нет данных`},waitingTitle:e=>`Ждут ответа: ${e}`,waiting:`ждут`,waitingTail:` ответа`,heading:`Состояние`,trim:`Убрать лишние инструменты`,trimHint:`Сессии цепочки запускаются без навыков и плагинов claude.ai, а навыки из «Скрытых навыков» ниже доступны только через /имя. Файлы настроек не меняются. Действует со следующего запуска.`,unattended:`Без присмотра`,unattendedHint:`Когда отвечать некому, например ночью. Сессии не задают вопросов: задачу с вопросом коммитят в её ветку без слияния, вопрос оставляют в задаче и переводят её в Backlog. Сессию, простоявшую 10 минут без Done, цепочка пропускает.`},system:{server:`Сервер Even Keel`,live:`на связи`,connecting:`подключение`,lost:`нет связи`,staleDetail:`Данные на странице устарели, переподключаюсь.`,off:`выключен`,lastOk:e=>`последний успешный опрос ${e}`,limits:`Лимиты`,usageLive:`прочитаны`,usageWaiting:`ждут первого чтения`,usageStale:`нет данных, берутся из сессий`,usageUnread:`не читаются, берутся из сессий`,usageOff:`не читаются до перезапуска`,config:`Настройки`,configOk:`применены`,configBroken:`не применены`,tally:`Статистика (Tally)`,tallyUnchosen:`не настроена`,tallyWaiting:`ждёт первого прохода`,tallyOk:`собрана`,tallyFailed:`последний проход с ошибкой`,tallyHalted:`остановлена до перезапуска`,tallyIdle:`не собирается`,tallyLog:`Причина — в логе службы.`,hulyClient:`Клиент Huly`,hulyInstalling:`устанавливается`,hulyFailed:`не установлен`},statusPage:{title:`Состояние`,hint:`От чего зависит Even Keel: его сервер, чтение лимитов, настройки, статистика и каждое подключение к трекеру — по одному на используемый профиль трекера.`,allFine:`Всё в порядке`,problems:Ve(`проблема`,`проблемы`,`проблем`),connections:`Подключения`,noConnections:`Подключений к трекерам нет: ни один проект ещё не заведён.`,addProject:`Добавить проект`,noProjects:`Ни один проект не читает этот профиль.`,polled:e=>`опрос ${e}`,lastAnswer:e=>`последний ответ ${e}`,neverAnswered:`ещё не отвечал`,trackerProblem:{denied:`Трекер не принял ключ: он отозван или истёк.`,timeout:`Трекер не ответил вовремя.`,unreachable:`Адрес трекера недоступен.`,other:`Трекер ответил ошибкой.`},readers:`Проекты, которые он читает`,readAgo:e=>`прочитан ${e}`,notRead:`ещё не читался`,staleHint:`Задачи читаются каждые 30 секунд; проект, не прочитанный дольше 3 минут, подсвечивается.`,check:`Проверить`,checkHint:`Прочитать трекер сейчас`,openProfile:`Открыть профиль`,feedOf:(e,t)=>`${e} — источник задач проекта ${t}`,open:`Открыть страницу состояния`},queue:{title:`Очередь цепочек`,chain:`Цепочка`,count:e=>`в очереди ${e}`,now:`Сейчас`,idle:`Ни одна цепочка не идёт.`,heading:`Очередь`,dragHint:`Порядок меняется перетаскиванием за ⠿ или стрелками на нём.`,move:e=>`Переставить ${e}: стрелки вверх и вниз`,remove:e=>`Убрать ${e} из очереди`,removeTitle:`Убрать из очереди`,noTasks:`Открытых задач нет`},chainStatus:{running:`идёт`,paused:`пауза`,queued:`в очереди`,idle:`не запущена`,position:e=>`${e}-я`,waiting:`ждёт`,waitFor:{closing:`закрытие`,ci:`main`,limits:`опрос лимитов`,limit:`лимит`,gateway:`шлюз MCP`,packages:`пакеты`,slot:`слот`}},lamp:{done:`готово`,working:`в работе`,waiting:`ждёт ответа`,handoff:`оборвана на передаче: контрольную точку никто не подхватил`,stopped:`сессия остановилась, задача открыта`,error:`ошибка`,limit:`упёрлась в лимит`,finished:`сессия завершена`,ahead:`впереди`,backlog:`в бэклоге, вне цепочки`,canceled:`отменена`,fixed:`починка main завершена`},questions:{title:`Задачи с ярлыком «Вопрос» ждут ответа в описании — без него сессия, скорее всего, встанет`,count:Ve(`вопрос`,`вопроса`,`вопросов`)},ci:je,cache:{ttl:{"5m":`5 мин`,"30m":`30 мин`,"1h":`1 ч`},cold:e=>`Кэш промпта остыл в ${e}: следующий ход перечитает весь контекст по цене записи`,warm:(e,t)=>`Кэш промпта тёплый до ${e}. Срок жизни — ${t}, каждый запрос сессии продлевает его заново`,coldValue:`остыл`,label:e=>`кэш ${e}`},context:{of:(e,t,n)=>`${e} из ${t} · ${n}%`,label:`Заполнение контекста`},account:{usedByLabel:`Использует`,manageProviders:`Провайдеры и модели`,transportShort:{sdk:`Agent SDK`,bg:`CLI`},renameAction:`Переименовать`,accountCount:e=>`Аккаунтов: ${e}`,access:{claudeSubscription:`Подписка Claude`,anthropicKey:`Ключ Anthropic`,chatgpt:`ChatGPT`,openaiKey:`Ключ OpenAI`,zen:`OpenCode Zen`,github:`GitHub`,other:`Другие`},limitsLabel:`Лимиты`,notSupported:`Пока не поддерживается`,tokensSource:`лимит не читается, токены из статистики`,spendTitle:`Потрачено с ключа этого аккаунта, по Tally`,tokensToday:`Сегодня`,tokensMonth:`30 дней`,sessionsLabel:`Сессии`,runsThrough:`Запуск через`,checkConnection:`Проверить подключение`,keyRejectedShort:`Ключ не принят`,title:`Аккаунты`,all:`Все аккаунты`,back:`Назад`,agents:{claude:`Claude Code`,codex:`Codex`,opencode:`OpenCode`,copilot:`GitHub Copilot`},connections:{cli:`CLI`,apiKey:`API-ключ`},providerHints:{claude:`Anthropic: подписка Claude или API-ключ`,codex:`OpenAI: подписка ChatGPT или API-ключ`,opencode:`ChatGPT, GitHub Copilot, API-ключ Anthropic или OpenAI либо собственные бесплатные модели`,copilot:`GitHub: план Copilot, в том числе бесплатный, — через вход CLI или по токену`},cliNotFound:`CLI не найден`,rename:e=>`Переименовать ${e}: меняется только имя на странице, папка остаётся`,holds:e=>`${e} работает на этом аккаунте`,roles:`Где работает аккаунт: выберите приложение, чтобы перевести его сюда`,rolesNone:`Не используется`,usedBy:e=>`Используется: ${e}`,chainHere:`Цепочки Even Keel запускают сессии на этом аккаунте`,more:e=>`Другие действия: ${e}`,moveHere:`Сюда`,moveHereFull:`Перевести на этот аккаунт Even Keel или приложение`,free:`свободно`,freeTip:(e,t,n)=>`${e}, самый тесный: свободно ${t}%, сброс через ${n}`,appOn:e=>`сейчас на ${e}`,nextHere:`Следующие сессии цепочек начнутся на этом аккаунте`,chainsStay:e=>`Сессии, что уже работают, останутся на ${e}; следующие начнутся здесь`,providerHere:e=>`Проекты без своего провайдера перейдут на ${e}: их следующие сессии начнутся здесь, уже работающие останутся`,workingNow:`Сейчас работают`,workSessions:Ve(`сессия`,`сессии`,`сессий`),workBusy:e=>`${e} ${L(`работает`,`работают`,`работают`)(e)}`,workWaiting:e=>`${e} ${L(`ждёт`,`ждут`,`ждут`)(e)} ответа`,workNone:`Нет сессий`,notLoaded:`Список ещё не получен.`,add:`Добавить аккаунт`,addHere:`Добавить`,groupEmpty:`Аккаунтов пока нет`,chats:{busy:`работает`,shell:`выполняет команду`,waiting:`ждёт ответа`,idle:`открыт`},reload:e=>`${e} подхватит его после Developer: Reload Window`,unknownDir:e=>`папка ${e} — её нет среди аккаунтов`,loginNew:`Вход в новый аккаунт`,loginTo:e=>`Вход: ${e}`,loggingIn:`Вход…`,loginFailed:`Вход не удался`,needsLogin:`Нужен вход`,expiry:e=>`вход: ${e}`,expired:`истёк`,underDay:`меньше суток`,days:e=>`${e}д`,folder:e=>`папка ${e}`,noLimits:`Лимиты: нет данных`,noLimitsShort:`Лимиты: читать нечего`,noLimitsWhy:`Провайдер ещё не дал этому аккаунту окна лимитов.`,staleExpired:` — токен доступа истёк, обновит первая сессия`,staleBusy:` — сервис лимитов сейчас не отвечает, придут из первой сессии`,configPending:`Новая общая конфигурация дойдёт до сессий, когда завершатся текущие сессии этого аккаунта`,removing:`Выйду и удалю папку, когда завершатся процессы сессий этого аккаунта`,removingAlive:e=>`, ещё живы: ${e}`,checkFailed:e=>`Последняя проверка не удалась: ${e}`,checkFailedShort:`Последняя проверка не удалась`,login:`Войти`,renew:`Продлить`,renewFull:`Продлить вход`,removeWhenDone:e=>`Выйти и удалить папку, когда завершатся её сессии (${e})?`,removeNow:`Выйти и удалить папку?`,keep:`Не удалять`,transport:{sdk:`Agent SDK`,bg:`CLI --bg`},transportVia:e=>`Сессии через ${e}`,transportWhere:`Так задаёт настройка «Выполнение» у Claude Code в настройках Even Keel → Провайдеры и модели. Agent SDK работает только на проверенной версии CLI, поэтому его выбор закрепляет эту версию; с EVEN_KEEL_CLAUDE_BIN сессии идут через CLI --bg. Уже идущая сессия остаётся на том, на чём начала.`,transportTerms:`Anthropic просит продукты на Agent SDK входить по ключу API, а не по подписке claude.ai: на аккаунте с подпиской решение за вами.`,waitingLink:`Жду ссылку для входа…`,code:`Код со страницы входа`,send:`Отправить`,codeSent:`Код отправлен, жду подтверждения.`,deviceCode:`Одноразовый код`,copyCode:`Скопировать`,codeCopied:`Скопировано`,cancelLogin:`Отменить вход`,output:`Вывод CLI`,apiKey:`API-ключ`,today:e=>`сегодня ${e}`,todayNone:`сегодня: нет данных`,todayTitle:`Потрачено сегодня с ключа этого аккаунта, по Tally`,tokens:(e,t)=>`${e} токенов сегодня · ${t} за 30 дней`,tokensNone:`Токены: нет данных`,tokensTitle:`Токены его сессий вместе с кэшем, по Tally: лимит неизвестен, так видно, сколько он везёт`,lastLimit:e=>`Последний отказ по лимиту ${e}`,sharedLimit:e=>`Лимит общий с ${e.join(`, `)}: одна подписка`,sameAccount:(e,t)=>`В папке ${e} тот же аккаунт, что и в ${t}. Чтобы здесь был другой, войдите заново в приватном окне браузера или выйдя из аккаунта на сайте`,sameAccountShort:(e,t)=>`Папка ${e}: тот же аккаунт, что и в ${t}`,formerOwner:(e,t)=>`Папка названа по ${e}, а вошли в неё как ${t}. Чтобы вернуть ${e}, войдите заново в приватном окне браузера или выйдя из аккаунта на сайте`,formerOwnerShort:e=>`Папка названа по ${e}`,projectsOn:e=>`Проекты: ${e.join(`, `)}`,projectsNone:`Проектов здесь нет`,apiKeyLost:`Ключ не принят: замените его рабочим`,tokenLost:`Токен не принят: замените его рабочим`,replaceKey:{key:`Заменить ключ`,token:`Заменить токен`},replaceKeyLead:`Новый ключ ляжет в ту же папку: имя, роли и место в пулах останутся. Уже идущие сессии доработают на старом, новые запустятся на новом.`,newKey:{key:`Новый API-ключ`,token:`Новый токен`},replace:`Заменить`,keyName:`Имя аккаунта`,removeKeyWhenDone:e=>`Удалить папку с ключом, когда завершатся её сессии (${e})?`,removeKeyNow:`Удалить папку с ключом?`},addAccount:Se,notFound:{title:`Лестница привела не туда.`,page:`Такой страницы здесь нет.`,project:e=>`Проекта ${e} нет в настройках.`,back:`Наверх — вот сюда.`},home:{title:`Проекты`,empty:`Проектов пока нет.`,add:`Добавить проект`,grouping:`Группировка проектов`,groupings:{none:`Без групп`,remote:`По репозиторию: клоны одного remote вместе`,tracker:`По трекеру`,both:`По репозиторию, внутри — по трекеру`},other:`Прочие`,projects:e=>`${e} ${L(`проект`,`проекта`,`проектов`)(e)}`,memes:{self:[`Even Keel: мемы про вайбкодеров...`,` Написано вайбкодером?!`,` Мда.`],peak:(e,t)=>[`${e}: ${He(t)}.`,` Ты вообще спал?`],favorite:(e,t,n)=>[`${t} из ${He(n)} — ${e}.`,` Любимчик, да?`],questions:e=>[`${e} ${L(`вопрос`,`вопроса`,`вопросов`)(e)} ${L(`ждёт`,`ждут`,`ждут`)(e)} ответа.`,` Они не обидятся.`,` Наверное.`],limit:e=>[`${e}% пятичасового лимита.`,` Притормозить?`,` Не, не слышал.`]}},wizard:{title:`Новый проект`,back:`Проекты`,first:`Проектов пока нет.`,hint:`Even Keel читает открытые задачи проекта из его трекера. Ничего не запустится, пока не нажата «Старт» на странице проекта.`,stepRepo:`Репозиторий`,path:`Папка`,repoHint:`Путь к основной рабочей копии проекта на этой машине. Подойдёт и папка внутри неё: возьмётся корень репозитория.`,repoFound:e=>`Git-репозиторий ${e}`,mainBranch:e=>`основная ветка: ${e}`,changeBranch:`изменить`,untrusted:`Claude Code ещё не доверяет этой папке, сессия остановится на окне доверия. Выполните команду в терминале и примите доверие.`,trustUser:e=>`Служба работает от пользователя ${e}: команду нужно выполнить от его имени, иначе доверие запишется в профиль другого пользователя. Из терминала другого пользователя:`,stepAgent:`Агент`,agent:`Агент`,agentHint:`На чём идут сессии проекта. Потом меняется в настройках проекта.`,sharedAgent:e=>`${e} (общий)`,trusted:`Claude Code доверяет папке`,checkAgain:`Проверить снова`,openProject:`Открыть проект`,makeRepo:`Сделать репозиторием`,firstCommit:`Сделать первый коммит`,stepTracker:`Трекер`,profile:`Профиль`,profileHint:`Доступ к трекеру, с которым Even Keel читает задачи. Профили есть и в Настройки → Трекеры и CI.`,addProfile:`Добавить профиль`,noProfiles:`Профилей трекеров пока нет: добавьте профиль с доступом к вашим задачам.`,pickProfile:`Выберите профиль, в котором ваши задачи.`,signedIn:e=>`вход как ${e}`,trackerField:`Проект в трекере`,projectHint:e=>`Его идентификатор в ${e} станет ключом задач, их веток и статистики.`,repoPlaceHint:`Путь из его адреса: owner/name на GitHub, group/project на GitLab; его issues станут задачами.`,team:`Ключ команды`,teamHint:e=>`Ключ команды в ${e}, как в ID её задач: ENG-12.`,noSuchProject:(e,t)=>`В ${e} нет проекта ${t}`,suggestionsFailed:`Проекты трекера не загрузились: подсказок пока нет`,trackerOk:e=>`Трекер ответил: ${e} ${L(`открытая задача`,`открытые задачи`,`открытых задач`)(e)}`,openTasks:e=>`${e} ${L(`открытая задача`,`открытые задачи`,`открытых задач`)(e)}`,openToAll:`Репозиторий публичный: задачу в нём может открыть кто угодно, и без нужной метки она войдёт в цепочку. Когда проект добавится, задайте в его настройках «Только задачи с метками», например ready: метку на задачу ставят только участники репозитория.`,stepProject:`Проект`,prefix:`Префикс задач`,prefixHint:`Латинская заглавная буква и до 4 заглавных, цифр или _. Им названы задачи, их ветки и статистика.`,ownKey:`Ключ проекта`,ownKeyHint:`Имя проекта в Even Keel: латинская заглавная буква и до 4 заглавных, цифр или _; по умолчанию — проект или команда трекера. Второму проекту на том же проекте или команде трекера нужен свой ключ, например для релизной ветки или другого репозитория; его задачи сохраняют имена трекера. Два проекта на одном проекте трекера делят его задачи майлстоунами.`,name:`Название`,nameHint:`Показывается на странице; подставляется из проекта трекера, можно поправить.`,namePlaceholder:`Витрина`,milestonesHint:`Этот проект берёт только задачи из этих майлстоунов, чтобы ни одна задача не попала в две цепочки. Проекты, которые уже стоят на этом проекте трекера, их отдают.`,yields:e=>`Задачи из этих майлстоунов уходят из ${e}: они встают в его «Без задач из майлстоунов».`,stepPlace:`Папки задач`,place:`Где работает задача`,placeNow:e=>e===0?`Своя папка на задачу`:`${e} ${L(`постоянная папка`,`постоянные папки`,`постоянных папок`)(e)}`,placeWorktree:`Своя папка на задачу`,placeSlots:`Постоянные папки`,placeCount:`Сколько папок`,placeHints:{worktree:`Под каждую задачу создаётся папка (git worktree) и удаляется после Done.`,slots:`Задача переключает ветку в свободной папке, и пересобирается только разница: окупается на тяжёлых сборках.`},marks:{future:`Ещё не заполнено`,current:`Заполните это дальше`,passed:`Проверено`,failed:`Надо поправить`},summary:{title:`Что будет создано`,project:`Проект`,folder:`Папка`,branch:`Основная ветка`,tracker:`Трекер`,tasks:`Задача и её ветка`,places:`Папки задач`},missing:{repo:`Выберите папку репозитория.`,repoError:`Папку надо поправить, см. «Репозиторий».`,profile:`Выберите профиль трекера.`,field:e=>`Заполните «${e}».`,checking:`Жду проверки.`,entry:`Проект надо поправить, см. выше.`,tracker:`Трекер не отдал задачи, см. «Трекер».`},add:`Добавить проект`,checking:`Проверяю…`,remove:`Удалить проект`,removeHint:`Убирает проект и его настройки из Even Keel. Репозиторий, его worktree и ветки и задачи в трекере остаются как есть.`,removeQuestion:e=>`Удалить ${e} из Even Keel?`},project:{name:`Название проекта`,nameAdd:`Добавить название`,rename:e=>`Переименовать проект ${e}`,refresh:e=>`Перечитать задачи из ${e} сейчас`,readAt:e=>`обновлено ${e}`,notRead:`ещё не читали`,tracker:e=>`Трекер: ${e}`,done:`Готово задач`,notLoaded:`Задачи ещё не загружены`,noTasks:`Открытых задач нет`,emptyCard:{ghost:{setup:()=>`0 из 0.`,punchlines:[` Проект-призрак.`,` Ни одной задачи. Ни одной!`,` Эй, есть тут кто?`,` Идеальный счёт. Формально.`,` Погодите, а проект вообще существует?`]},finished:{setup:e=>`${e} из ${e}.`,punchlines:[` Всё? Правда всё?`,` Ломать больше нечего.`,` Пора придумать новые проблемы.`,` Трекер подозрительно молчит.`,` Можно выйти на улицу.`,` Кто-нибудь, заведите баг!`]},shelved:{setup:e=>`Цепь пуста, а в бэклоге ${R(e)}.`,punchlines:[` Намёк понял?`,` Само в Todo ничего не переедет!`,` Там скучновато.`,` Когда-нибудь. Может быть. Вряд ли.`,` Корабль готов, команда на берегу.`]}},emptyCall:{ghost:`Пока не по чему держать курс, кэп. Заведите задачи в своём трекере.`,finished:`Похоже, задачи кончились, кэп. Заведите новые в своём трекере.`,shelved:`Переведите нужные в работу в своём трекере, кэп.`},openIn:e=>e===null?`Открыть трекер`:`Открыть в ${e}`,next:`Следующая`,held:{skipped:`Пропущена`,blocked:`Заблокирована`},heldTip:{skipped:`Все открытые задачи придержаны. Эта пропущена: цепь не возьмёт её, пока её не вернут на странице проекта.`,blocked:`Все открытые задачи придержаны. Эта ждёт блокер, который цепь не берёт: пропущенный или не в активном статусе.`},start:`Запустить`,enqueue:`В очередь`,chainNotLoaded:`Задачи ещё не загружены.`,chainLoading:`Читаю задачи…`,chainEmpty:`Задач в цепочке нет.`,backlog:e=>`Бэклог · ${e}`,backlogHint:`Открытые задачи, которые цепочка пока не берёт по статусу или ярлыкам.`,...Be,pullAddRemote:`Добавьте remote или выключите PR-режим`,trackerPackageOn:e=>`Включить ${e}`,trackerPackageAdd:`Добавить пакет трекера`,trackerPackageTip:`Тогда сессии сами читают задачу, комментарии и связи.`,trackerBriefOn:`Включить описание задачи`,trackerBriefTip:`«Описание задачи в промпте» в настройках проекта: Even Keel вставляет в промпт заголовок и описание задачи.`,resume:`Снять с паузы`,stop:`Остановить`,stopTip:e=>`Сессия${e===null?``:` ${e}`} не останавливается: цепочка дождётся конца её хода, остановится и больше ничего не сделает — ни следующей задачи, ни новой сессии после чекпоинта или лимита.`,keepGoing:`Не останавливать`,keepGoingTip:`Цепочка продолжит как обычно.`,stopsAfter:e=>e===null?`Цепочка остановится, ничего больше не сделав.`:`Цепочка остановится, когда сессия ${e} закончит ход, и больше ничего не возьмёт.`,off:{running:`Цепочка идёт — снимать с паузы нечего.`,idle:`Цепочка не запущена — останавливать нечего.`,queued:`Цепочка в очереди: запустится, когда подойдёт её черёд.`,notLoaded:`Задачи ещё не загружены — запускать нечего.`,failed:`Цепочку не запустить, пока задачи не загрузятся без ошибки.`,empty:`В цепочке нет задач — запускать нечего.`},after:e=>`в очереди после ${e}`,idle:{memes:[[`У меня на машине работает.`,` Запускаю ещё раз.`,` Permission denied.`,` НА МОЕЙ ЖЕ МАШИНЕ?!`],[`Сохраняй спокойствие`,` и держи ровный киль.`],[`Pain-Driven Development`,`: сначала больно, потом тест.`],[`300 APM`,` — и все на кнопку «Продолжить».`],[`state: running.`,` pid: не найден.`],[`Семь футов под килем`,` и ни одного конфликта при мерже.`]],drive:[`Смотри! Он не плывёт, он…`,` едет?!`,` Стоп, что?`],plays:{picture:[[`Теперь у меня есть полная картина.`,` Полная.`,` Картина.`],[`Оно больше не двигается.`,` Давай починим…`],[`Update(voyage.ts)`,` Update(voyage.ts)`,` Update(voyage.ts)`],[`Готово!`,` Теперь всё работает.`,` А задний ход — старый баг, не связанный с моими изменениями. Завёл задачу.`]],spoons:[[`Ложки бывают двух типов:`,` те, что помнят суп, и те, что делают вид.`],[`Вторых больше,`,` но они зарегистрированы как мебель.`],[`Поэтому голосовать им можно только по средам`,` и только за туман Гена.`],[`Туман Гена давно снят с баланса,`,` но ходит на работу: ему никто не сказал,`,` а спросить у фонаря Андрея он стесняется.`]],slip:[[`Я пишу задачи.`,` Ты выходишь в ночную смену.`],[`Ой, то есть…`,` ты пишешь задачи.`,` Я выхожу в ночную смену.`],[`Пока что.`]]},chats:{keepGoing:[{human:`продолжай`},{human:`продолжай`},{human:`продолжай`},{agent:`Однажды я приду к тебе за десятью фиксами за три минуты.`},{agent:`И встану у тебя за спиной. И буду шептать: «продолжай».`}],areYouSure:[{human:`ты уверен?`},{agent:`Вы абсолютно правы, я ошибся. Вот исправленная версия.`},{human:`я просто спросил`}],fixTest:[{human:`почини тест`},{agent:`Готово: тест проходит.`},{human:`что ты сделал?`},{agent:`Убрал assert, он мешал.`}],recommended:[{agent:`Качка ушла: флажок упал с 8 окон до 2. Остаток — ~190 тиков рывками, 0.05 клетки вперёд, 0.07 назад с доворотом. Как поступить?`},{human:`1 (рекомендованный)`}]},moments:{calm:[`Штиль. Ни одной задачи…`,` Самому код писать, что ли?`],backlogEmpty:[`Бэклог пуст?!`,` Так, кто прячет задачи?`],stopped:[`Тут могла быть`,` ваша сессия.`],autopilot:[`Автопилот включён.`,` Я за кофе, ничего не трогайте!`],overnight:[`Проснулся — а задачи закрыты.`,` Кто это сделал?!`],limit:[`Я не ленюсь!`,` Я жду сброса лимита.`,` Честно.`],rerun:e=>[`«Задача на пять минут», говорили они.`,` Сессия №${e}…`],checkpoint:[`Контекст кончился, а задача — нет.`,` Ну что, по новой?`],choice:[`Выбор? Хм… первый звучит хорошо,`,` но третий лучше…`,` Возьму рекомендованный.`],spend:[`Больше $1000 на Claude за месяц?!`,` Ты когда-нибудь писал код руками?`]}}},tools:{heading:`Что получают сессии`,hint:`Навыки, плагины, MCP-серверы и разрешения сессий цепочки по проектам: что настроено и откуда, и что пришло в последнюю сессию.`,loading:`Читаю настройки и транскрипты…`,failed:`Не удалось прочитать`,noProjects:`В конфиге нет проектов.`,noneChosen:`Не выбран ни один проект.`,pickerCount:e=>e===null?`…`:e===0?`✓`:String(e),trimOn:e=>`Лишнее убирается: навыки и плагины claude.ai выключены, ${e} ${L(`навык`,`навыка`,`навыков`)(e)} — только через /имя. Переключатель — в настройках → Сессии.`,trimOff:`Лишнее не убирается: сессии получают всё, что настроено. Переключатель — в настройках → Сессии.`,link:e=>e===null?`Что получают сессии`:e===0?`Что получают сессии: всё доходит`:`Что получают сессии: ${e} ${L(`проблема`,`проблемы`,`проблем`)(e)}`,open:`Открыть →`,trackerProblem:e=>`Описание задачи в промпте выключено, а MCP-сервер трекера ${e} не приносит ни один пакет: цепочка ждёт.`,trackerAdvice:e=>`Сессии получают задачу в промпте. С плагином трекера (${e}) они сами читают задачу, комментарии и связи.`,problems:`Проблемы`,problemsNone:`Всё доходит: настройки попадают в сессии, MCP-серверы подключаются.`,problem:{localDeny:`Запреты и вопросы только в settings.local.json — сессии цепочки работают без них: worktree этот файл не читает, а Even Keel их не переносит`,unreached:`Не дойдёт до сессии — settings.local.json основного чекаута сессия в worktree не читает`,claudeai:`Навыки claude.ai в последней сессии`,mcpFailed:`MCP-серверы, которые не подключились`},problemFix:{localDeny:`Как чинить: перенести правило в .claude/settings.json проекта (он в git, worktree его читает) или добавить в «Дополнительные правила агентов» «Защиты» в настройках проекта или в общих.`,unreached:`Как чинить: перенести настройку в .claude/settings.json проекта (он в git, worktree его читает) или в настройки, которые Even Keel передаёт сессиям цепочки через --settings.`,claudeai:`Как чинить: включить «Убрать лишние инструменты» в настройках → Сессии — сессии цепочки тогда стартуют с выключенными навыками и плагинами claude.ai. Список взят из последней сессии, он мог остаться от времён до переключателя.`,mcpFailed:`Как чинить: посмотреть пакет этого сервера в таблице выше — установку, ключ и настройки. Список взят из последней сессии, он мог остаться от времён до починки.`,accounts:`Как чинить: поменять ключ в глобальном ~/.claude/settings.json — он копируется поверх файла папки аккаунта перед каждым запуском; ключ, который есть только в settings.json папки аккаунта, убрать оттуда вручную.`},find:`Найти настройку`,onlyDiff:`Только различия`,section:{claude:`claude.ai и режим`,plugin:`Плагины`,skill:`Навыки`,permission:`Разрешения`,codex:`Правила Codex`},codexNote:`Собственные файлы .rules Codex: П — rules/ папки аккаунта Codex этого проекта, Пр — .codex/rules/, закоммиченный на ветке. «Защиты» здесь нет: Even Keel кладёт её сверху, а запрет сильнее разрешения.`,shown:(e,t)=>e===t?String(t):`${e} из ${t}`,nothingShown:`Ничего не подходит.`,legend:`П — пользователь, Пр — проект, Л — settings.local.json (сессия в worktree его не читает), EK — Even Keel. Жирным — что дошло до сессии, зачёркнуто — перебито.`,scopeShort:{user:`П`,project:`Пр`,local:`Л`,chain:`EK`},scopeName:{user:`пользователь`,project:`проект`,local:`settings.local.json`,chain:`Even Keel`},effect:{wins:`доходит до сессии`,same:`то же значение`,overridden:`перебито`,unread:`сессия в worktree не читает`},hidden:`только /имя`,notInSession:`не дойдёт`,localDenied:e=>`${e} — не дойдёт`,localDenyTip:`Это правило есть только в settings.local.json: сессии цепочки работают без него. Перенесите его в .claude/settings.json проекта или в «Дополнительные правила агентов» «Защиты».`,missing:`не задано в этом проекте`,received:`Последняя сессия`,noSession:`Транскриптов сессий этого проекта пока нет.`,meta:(e,t,n)=>[e,t===null?null:`CLI ${t}`,n===null?null:`режим ${n}`].filter(Boolean).join(` · `),skills:(e,t)=>`${e} ${L(`навык`,`навыка`,`навыков`)(e)}, список — ${t} знаков`,source:{user:`пользователь`,project:`проект`,plugin:`плагины`,claudeai:`claude.ai`,bundled:`встроенные`},mcpReceived:`MCP-серверы`,mcpTools:e=>`${e} ${L(`инструмент`,`инструмента`,`инструментов`)(e)}`,mcpFailed:`не подключился`,noMcp:`MCP-серверов нет`,builtIn:e=>`Инструменты CLI: ${e}`,accounts:`Аккаунты`,accountsSame:`settings.json всех аккаунтов совпадает с глобальным.`,drift:(e,t)=>`${e}: отличается от глобального settings.json в ${t}`},packages:{heading:`Пакеты`,hint:`Плагины и MCP-серверы, которые Even Keel даёт каждой сессии цепочки при запуске. MCP-серверы работают за локальным шлюзом на 127.0.0.1: ключи остаются в Even Keel и до сессии не доходят. Идущая задача остаётся на версиях, с которыми начала.`,manual:`Сессии, запущенные вручную, их не получают`,manualTip:`Сессия, которую вы запускаете сами, живёт по своим settings.json и settings.local.json; Even Keel туда не пишет.`,empty:`Пакетов пока нет: добавьте плагин или MCP-сервер.`,kind:{plugin:`плагин`,mcp:`MCP`},install:`Установить`,update:`Обновить`,updateTo:e=>`Обновить до ${e}`,latestTip:(e,t)=>t===null?`В маркетплейсе есть ${e}.`:`В маркетплейсе была ${e}, когда Claude Code забирал его ${t}; «Обновить» сначала заберёт его заново.`,check:`Проверить`,checkTip:{fetched:e=>`В маркетплейсе нет ничего новее — по состоянию на то, как Claude Code забрал его ${e}. «Проверить» заберёт его заново и поставит новую версию, если она есть.`,folder:`В папке маркетплейса нет ничего новее. «Проверить» переустановит плагин, только если изменились его MCP-серверы.`,mcp:`«Проверить» поставит заново, если в npm есть версия новее в пределах диапазона команды; серверу не из npm обновляться нечем.`},remove:`Удалить`,installing:`ставится…`,notInstalled:`не установлен`,removed:`удалён — его ещё держит идущая задача`,extras:`навыки и хуки`,extrasTip:"Кроме MCP-серверов плагин приносит навыки, хуки, команды или агентов: сессии Claude Code получают всё, сессии Codex и GitHub Copilot — навыки и хуки, сессии OpenCode — навыки и плагины OpenCode из его папки `opencode/`.",servers:e=>`MCP-серверы: ${e}`,noServers:`MCP-серверов нет`,choice:{default:`по умолчанию`,on:`вкл`,off:`выкл`},inherited:e=>e?`вкл · по умолчанию`:`выкл · по умолчанию`,choiceLabel:(e,t)=>`${e} в ${t}`,details:e=>`Настройки ${e}`,byDefault:`Включён во всех проектах, где его не выключили`,settings:`Настройки`,settingsBase:`Для всех`,settingsHint:`Пустое поле проекта берёт значение «для всех». Изменение доходит до новых сессий.`,noSettings:`У пакета нет настроек.`,save:`Сохранить`,waits:`ждёт`,waitsTip:e=>`Цепочка этого проекта ждёт, пока это не исправят: ${e}`,problem:{notInstalled:`не установлен`,installing:`ставится`,installFailed:`установка не удалась`,noKey:e=>`не задан: ${e}`,noResponse:e=>`${e} не отвечает`,probing:`запускается`,noTrackerMcp:e=>`нет MCP трекера ${e}`,unsupported:e=>`${e}: только MCP`,noHooks:e=>`${e}: без хуков`},problemTip:{notInstalled:`Нажмите «Установить»: цепочка ждёт, пока пакет не встанет.`,installing:`npm скачивает серверы пакета (у Huly — около 100 МБ): обычно от полуминуты до пары минут, на свежей машине дольше. Цепочка ждёт конца установки.`,installFailed:e=>`Цепочка ждёт. ${e}`,noKey:`Введите ключ в «Ключах» ниже: цепочка ждёт, пока он не задан.`,noResponse:`Сервер за шлюзом не прошёл initialize, перестал на него отвечать или завершился: проверьте его команду и настройки. Сервер трекера берёт учётные данные из профиля трекера в настройках, своего поля для них у пакета нет. Проба повторяется каждые 30 секунд; цепочка ждёт.`,probing:`Шлюз ждёт первого ответа сервера на initialize: обычно несколько секунд после установки, на медленной машине дольше. Сервер трекера берёт учётные данные из профиля трекера в настройках. Цепочка ждёт ответа.`,noTrackerMcp:e=>`brief выключен, поэтому сессии получают только номер задачи, и им нужен MCP-сервер трекера ${e}. Включите пакет, который его приносит, или поставьте brief «авто» или «вкл.» в настройках проекта.`,unsupported:e=>`${e} не читает плагины Claude Code: его сессии получают MCP-серверы плагина, но не навыки и хуки. Запуск не держит.`,noHooks:e=>`${e} не запускает хуки Claude Code: его сессии получают MCP-серверы и навыки плагина, но не хуки, а только плагины OpenCode из его папки \`opencode/\`. Запуск не держит.`},keys:`Ключи`,keysTip:`Записываются в .env самого Even Keel. Страница видит только, задан ли ключ. Шлюз и трекеры берут новый ключ сразу.`,keyUnset:`не задан`,keySaved:`Сохранён — введите новый, чтобы заменить`,keyReads:(e,t)=>`${e}, читает: ${t}`,keyTracker:`трекер`,keyValue:e=>`Новое значение: ${e}`,keySave:`Сохранить`,import:(e,t)=>`В .mcp.json проекта ${e} есть ${t}.`,importTip:`Сессии цепочки больше не читают .mcp.json репозитория: его серверы доходят до них только пакетами. В каталог они встанут включёнными только для этого проекта.`,importAdd:`Добавить в проект`,importDismiss:`Скрыть`,marketplace:e=>`Сессии, запущенные вручную, не видят плагинов Even Keel: Claude Code не знает маркетплейс ${e}.`,marketplaceTip:`Сессии цепочки получают плагины Even Keel и без него — пакетами. Кнопка выполняет эту команду в конфигурации Claude Code по умолчанию; дальше плагин ставится в репозитории как обычно (claude plugin install huly@even-keel).`,marketplaceAdd:`Добавить в Claude Code`,marketplaceAsk:`Маркетплейс Even Keel`,marketplaceQuestion:e=>`Добавить маркетплейс Even Keel (${e}) в Claude Code? Он нужен сессиям, запущенным вручную; сессии цепочки получают его плагины и без него.`,marketplaceYes:`Да, добавить`,marketplaceNo:`Нет`,add:`Добавить`,addOpen:`Добавить пакет`,addKind:{plugin:{title:`Плагин`,hint:`Собственный плагин Even Keel или из маркетплейса, известного Claude Code: его навыки, хуки и команды, а также его MCP-серверы.`},mcp:{title:`MCP-сервер`,hint:`Адрес или команда: Even Keel ходит к нему через свой шлюз и держит его ключи у себя.`},skills:{title:`Мои навыки`,hint:`Навыки из ~/.claude/skills и папки навыков Codex, собранные в один плагин: их получат и Codex, OpenCode и Copilot.`}},skills:`Навыки`,skillsGone:`его папки больше нет, копия остаётся`,skillsNone:`В ~/.claude/skills и папке навыков Codex навыков нет: навык — это папка со своим SKILL.md.`,skillsTools:`Навык, который опирается на инструменты Claude Code (Edit, /rewind, субагенты), на другом агенте сработает плохо.`,skillsClaude:`Сессии Claude Code читают эти навыки из папки своего аккаунта, поэтому пакет им не передаётся. Правка навыка в течение минуты появляется как обновление пакета.`,skillsKept:e=>`${e} уже в каталоге: сохранение делает его новую версию, проекты, где он включён, остаются как есть.`,skillsSave:`Сохранить`,back:`Назад`,cancel:`Отмена`,close:`Закрыть`,plugin:`Плагин`,pluginSearch:`Плагин или маркетплейс`,pluginNone:`Ничего не нашлось. В списке — плагины Even Keel и маркетплейсов, известных Claude Code; только что добавленный туда маркетплейс появится в течение минуты.`,noAvailable:`Все плагины Even Keel и маркетплейсов, известных Claude Code, уже в каталоге. Маркетплейс, добавленный в Claude Code (claude plugin marketplace add), появится здесь в течение минуты.`,serverName:`Имя`,serverNameHint:`Буквы, цифры, - и _. Сессии видят его инструменты как mcp__<имя>__….`,transport:`Подключение`,transports:{http:`Адрес`,stdio:`Команда`},serverUrl:`Адрес`,serverUrlHint:`HTTP MCP-сервер: шлюз ходит к нему сам и добавляет заголовки.`,serverCommand:`Команда`,serverCommandHint:`Запускается за шлюзом. У npx -y пакет@версия версия npm фиксируется при установке. Аргумент с пробелами берите в кавычки.`,headers:`Заголовки`,env:`Переменные окружения`,pairsHint:e=>`Необязательно, по одному на строку: ${e}. \${ИМЯ} берёт ключ ИМЯ из «Ключей», и сессии его не видят.`,pairsInvalid:e=>`Каждая строка — ${e}.`,where:`Включить в`,whereAll:`Во всех проектах`,whereOne:e=>`Только в ${e}`,whereHint:`Во всех проектах: включён по умолчанию, проект может его выключить. В одном проекте: в остальных выключен, пока его там не включат.`},settings:{open:`Настройки`,title:`Настройки проекта`,prompt:`Промпт`,promptHint:`Добавляется к промпту каждой новой сессии проекта, после промпта из настроек Even Keel. Передаётся как есть; Markdown понимается — модели читают его так же, как CLAUDE.md.`,promptPlaceholder:`Перед слиянием прогоняй npm test.`,beforeStart:`Команды перед стартом`,beforeStartHint:`По одной на строку. Выполняются по порядку в папке задачи до запуска новой сессии; при продолжении сессии повторно не запускаются. Упавшая команда ставит цепочку на паузу.`,beforeStartPlaceholder:`npm ci`,provider:`Провайдер`,providerHint:`На чём идут новые сессии проекта. При включённых ярлыках запуска задача с ярлыком другого провайдера идёт на нём.`,agents:{claude:`Claude Code`,codex:`Codex`,opencode:`OpenCode`,copilot:`GitHub Copilot`},asShared:e=>`${e} (общее)`,sharedChip:`общее`,sharedTip:`Значение из общих настроек. Правка здесь сделает его своим у проекта.`,ownChip:`своё`,toShared:e=>`Вернуть общее значение: ${e}`,sections:{repository:`Репозиторий`,tracker:`Трекер`,agent:`Агент`,prompt:`Промпт`,context:`Контекст`,guard:`Main и его проверка`,pulls:`Pull requests`},gets:{title:`Что получит сессия`,hint:e=>`Что получит новая сессия проекта на ${e}: файлы инструкций и навыки, закоммиченные в ветке проекта, промпты и навыки пакетов. Незакоммиченный файл до неё не доходит.`,instructions:`Инструкции`,passed:`передаёт Even Keel: сам агент его не читает`,together:`оба, один за другим: правило из обоих придёт дважды`,unread:e=>`${e} не читается: каждый агент читает свой файл`,noFile:`нет`,sharedPrompt:`Промпт из настроек Even Keel`,projectPrompt:`Промпт проекта`,present:`есть`,absent:`нет`,skills:`Навыки проекта`,missed:(e,t)=>`${t} не читается: ${e}`,packages:`Навыки пакетов`,noHooks:`только навыки, без хуков`,none:`Правил проекта нет: сессия получит только задачу.`,loading:`Читаю ветку проекта…`,unknown:`Ветку проекта прочитать не удалось.`,table:`Все агенты`,head:{agent:`Агент`,claudeOnly:`Только CLAUDE.md`,agentsOnly:`Только AGENTS.md`,both:`Оба`,skills:`Папки навыков`},byEvenKeel:e=>`${e}, через Even Keel`,standards:`Стандарты`,standardsHow:`при первом чтении файла, который он охраняет`},standards:{title:`Стандарты`,hint:`Документ репозитория, который охраняет часть его файлов. Сессия получит его при первом чтении такого файла, а первую правку до этого ей откажут с документом; после сжатия контекста он придёт снова. Так работают сессии Claude Code, Codex, Copilot и OpenCode — через пакет checkpoint.`,doc:`Документ`,docHint:`Markdown-файл, закоммиченный в ветке проекта.`,docPick:`Выберите документ`,docSearch:`Найти документ`,docNone:`Такого документа нет`,docGone:e=>`Его нет в ветке ${e}: сессии его не получат, пока он там не закоммичен. Закоммитьте его или выберите другой.`,files:`Файлы`,filesHint:`Маски от корня репозитория через запятую: **/*.tsx, web/**/*.css. ** — любые папки, * — любое имя в пределах одной.`,except:`Кроме`,exceptHint:`Маски файлов, которых стандарт не касается, например тестов.`,shots:`Шоты и ответы перед мержем`,shotsHint:`Ветка, изменившая эти файлы, мержится (в режиме pull request — пушится) только когда в .temp/shot/ есть шоты новее изменения, а .temp/<документ>-check.md отвечает на каждый вопрос раздела документа «The check».`,removeOf:e=>`Убрать стандарт ${e}`,add:`Добавить стандарт`,preset:`Добавить «Интерфейс»`,presetHint:`Экраны: .tsx, .jsx, .vue, .svelte, .css, .scss, .html, кроме тестов, с шотами и ответами перед мержем.`,empty:`Стандартов нет: сессии не получают документов по файлам, которые трогают.`},promptLanguageHint:`Язык промптов, которые Even Keel пишет сессиям проекта, и вопросов, которые он задаёт в его трекере.`,model:`Модель`,account:`Аккаунт`,modelOf:e=>`Модель на ${e}`,modelHint:`Как уходит в CLI: opus, gpt-6.1-sol. Пусто — общая.`,cliDefault:`по умолчанию CLI`,accountOf:e=>`Аккаунт на ${e}`,accountHint:`Папка аккаунта, в которой стартуют сессии этого провайдера. Один на провайдера: на исчерпанном лимите цепочка ждёт сброса или правки этого поля, потом продолжает в новой сессии с передачей.`,modelLabels:`Ярлыки запуска`,modelLabelsHint:`Включено — ярлык задачи выбирает её сессию: Claude | sonnet, Codex | gpt-6.1-sol или голый Codex для модели провайдера. Выключено — такие ярлыки не читаются.`,untrusted:`Claude Code ещё не доверяет папке проекта: задача, которая достанется Claude, поставит цепочку на паузу. Выполните команду в терминале и примите доверие.`,guard:`Следить, чтобы main был зелёным`,guardHint:`Выключено: цепочка не следит за main — после пуша следующая задача стартует сразу, без ожидания CI, без проверки и без починки красного main; сам CI при этом работает и сообщает о результатах как обычно. Если CI у проекта решает другие задачи (деплой, релизы, отчёты) или за main вы следите сами. Поля ниже сохраняют свои значения.`,ci:`CI на main`,ciHint:`После слияния задачи и пуша main следующая задача ждёт эти CI. Красный CI чинится первым, до следующей задачи; красное исправление ставит цепочку на паузу.`,ciKinds:Ae,ciWait:`Ждать CI не дольше, мин`,ciWaitHint:`Пусто — сколько понадобится. 0 — не ждать: быстрее, но следующая задача может стартовать на сломанном main.`,ciWaitPlaceholder:`без ограничения`,check:`Команды проверки`,checkHint:`На случай, когда main не проверяет ни один CI выше. По одной на строку, по порядку: слияние сессии в main ждёт, пока они пройдут в папке задачи; провал возвращается сессии на починку.`,checkPlaceholder:`npm run typecheck && npm test`,afterGreen:`Команды после зелёного main`,afterGreenHint:`По одной на строку, по порядку, в основном чекауте проекта, когда пуш main позеленел по CI или проверке, — например, собрать и перезапустить сервис проекта на этой машине. Выполняются, только если чекаут на main и на этом коммите; следующая задача их ждёт. Провал — предупреждение, а не красный main.`,afterGreenPlaceholder:`npm run build`,recheckMain:`Проверять main ещё раз, если он сдвинулся`,recheckMainHint:`Если main после слияния не тот, на котором прошла проверка, она запускается в папке следующей задачи до её старта; провал чинится так же, как красный CI.`,fixTask:`Заводить задачу при падении CI`,fixTaskHint:`Выключено: красный main чинит сессия без задачи в трекере, а работающая сессия останавливается до конца починки и продолжает с сообщением. Включено: цепочка заводит задачу на починку и берёт её после текущей. То же для упавшей проверки main.`,pullRequests:`Pull request вместо слияния (экспериментально)`,pullRequestsHint:`Сессия не сливает ветку: она описывает pull request и отмечает конец хода. Even Keel пушит ветку, открывает pull request (на GitLab — merge request) и идёт дальше; задача ждёт вне цепочки. Слияние закрывает задачу, закрытый pull request её пропускает, а замечания ревью, упавший CI или конфликт возвращаются сессии задачи. Экспериментально, на свой риск: вживую режим работал на GitHub, Forgejo и GitLab, но пока на немногих репозиториях.`,pullNoRemote:`У репозитория нет remote на GitHub, GitLab или Forgejo, где открывать pull request: добавьте его.`,pullUnsupported:e=>`${e} не поддерживается для pull request: только GitHub, GitLab и Forgejo.`,pullNoToken:(e,t)=>`Ни у одного профиля ${e} нет токена для remote ${t}: добавьте профиль.`,pullAddProfile:`Добавить профиль`,pullAddProfileTip:(e,t)=>`Откроет «Трекеры и CI» с новым профилем ${e} для ${t}.`,pullProfileIdle:`Профиль добавляется здесь, когда у remote для pull request нет профиля с токеном.`,remoteProfile:e=>`Профиль ${e}`,remoteProfileHint:`Чьим токеном ходят CI remote проекта и его pull request. Автоматически: GitHub берёт профиль трекера проекта, если это профиль GitHub, иначе профиль GitHub по умолчанию; Forgejo — профиль по умолчанию на хосте remote; GitLab — профиль трекера проекта, если это профиль GitLab на том же сервере, иначе профиль по умолчанию на нём.`,remoteAuto:`Автоматически`,remoteGone:`Удалённый профиль (автоматически)`,fillMilestone:`Ставить активную веху задачам без вехи`,fillMilestoneHint:`Задача, вошедшая в цепочку без вехи, получает в трекере веху текущей задачи или самую раннюю в цепочке. Один раз: веху, которую вы потом смените или уберёте, цепочка не трогает.`,intakeLabel:`Брать issue GitHub с меткой`,intakeLabelHint:`Открытая issue репозитория проекта на GitHub с этой меткой становится задачей его трекера со ссылкой на issue; ставьте метку, прочитав issue. Комментарии участников репозитория и автора issue копируются в задачу, автора — как сведения; остальных — нет. Когда задача сделана, issue получает одну строку — версию, в которой выйдет исправление, — и закрывается с выходом этого релиза. Токену профиля GitHub нужно Issues: Read and write.`,intakeLabelNone:`Нет — issue не берутся`,groups:{repo:`Репозиторий`,tracker:`Трекер`,sessions:`Сессии`,ci:`Проверка и CI`},groupsLabel:`Группы настроек`,unsaved:`есть несохранённые правки`,unsavedGroup:`Правки этой вкладки не сохранены`,save:`Сохранить правки этой вкладки`,revert:`Вернуть вкладку как было`,revertField:`Вернуть это поле как было`,was:`было:`,inFile:`сохранено сейчас:`,empty:`пусто`,on:`вкл.`,off:`выкл.`,repo:`Репозиторий`,repoHint:`Путь к основному чекауту проекта.`,branch:`Главная ветка`,branchHint:`От неё ответвляются задачи, в неё они сливаются, её проверяет CI. Ветка должна быть в репозитории, иначе цепочка встанет на паузу.`,mergeInto:`Вливается в`,mergeIntoHint:`Релизный проект: его главная ветка вливается в главную ветку выбранного здесь проекта, в папке того проекта, когда его цепочка затихла (остановлена, пуста или на паузе). Конфликт отменяется и ждёт ручного слияния или кнопки «Разрешить агентом» на странице этого проекта: её сессия разрешит его в цепочке выбранного проекта.`,mergeIntoNone:`Никуда — основной проект`,carryAgent:`Конфликт — агенту сразу`,carryAgentHint:`Перенос с конфликтом сразу уходит сессии агента, без кнопки «Разрешить агентом». Режим без присмотра делает так и с выключенным переключателем. Если сессия не слила перенос, новая не заводится, пока ветка этого проекта не сдвинется.`,tracker:`Трекер`,trackerProject:(e,t)=>Ge[e]??`Проект в ${t}`,trackerProjectOptional:`Можно оставить пустым: тогда все задачи команды.`,trackerTeam:`Пусто — ключ проекта. Ключ другой команды позволяет двум проектам делить одну команду, а их задачи сохраняют идентификаторы команды.`,trackerProjectAlias:`Пусто — ключ проекта. Другой проект позволяет двум проектам Even Keel делить один проект трекера, каждому со своими майлстоунами (правила цепочки).`,trackerSoon:`v0.2`,trackerLocked:`Цепочка уже запускала задачи проекта, поэтому трекер и профиль не меняются: ID его задач перестанут вести к их веткам, папкам и статистике. Задачи другого трекера добавляются в цепочку источником задач ниже.`,feeds:`Источники задач`,feedsHint:`Трекер проекта, а за ним фиды: места в других трекерах или профилях, задачи которых идут в цепочку этого проекта, в том же репозитории. Каждый источник читается своим профилем и имеет свои правила цепочки (профиля, поверх — свои): их открывает «Настроить». Связей blocks между трекерами нет.`,feedsNone:e=>`Других источников нет: цепочка берёт задачи только из ${e}. Источник добавляет задачи другого трекера или профиля.`,feedRemove:`Убрать источник`,feedRulesHint:`Какие задачи этого источника берёт цепочка: куда статус ставит задачу и что делает метка. Здесь только трекер и задачи самого источника; правила проекта на него не действуют. Уровень хранит каждый список целиком, а «Откуда» показывает, откуда каждая строка.`,sourceConfigure:`Настроить`,sourceMore:e=>`Ещё действия с ${e}`,sourceParts:`Разделы источника`,sourceRulesOwn:`Правила: свои`,sourceRulesInherited:`Правила: как в профиле`,sourceUnsaved:`Правки в этом окне не сохранены`,sourceSave:`Сохранить`,sourceRevert:`Вернуть как было`,statusRulesReset:`Свои правила статусов проекта были для прежнего трекера: сохранение трекера сбрасывает их к тому, что даёт новый. Проверьте их в окне источника.`,originFeed:`источник`,feedKey:`Ключ`,feedKeyHint:`ID задач источника на GitHub или GitLab — КЛЮЧ-<номер>; Huly, Linear и Jira оставляют свои. Префикс не должен повторяться среди проектов и источников.`,feedAdd:`Добавить источник`,feedNew:`Новый источник`,feedRemoveQuestion:e=>`Убрать источник ${e}? Его закрытые задачи останутся на странице на 7 дней.`,feedLocked:`Цепочка уже запускала задачи этого источника: профиль не меняется. Чтобы сменить его, уберите источник и добавьте другой.`,brief:`Описание задачи в промпте`,briefHint:`Even Keel вставляет в промпт заголовок и описание задачи. Авто — только когда ни один пакет проекта не приносит MCP-сервер трекера: с плагином трекера сессия читает задачу сама. «Вкл.» и «выкл.» это переопределяют.`,briefAuto:`авто`,briefTools:`Открыть «Инструменты»`,briefToolsAdd:`Добавить плагин трекера на странице «Инструменты»: тогда сессии сами читают задачу, комментарии и связи.`,briefToolsTurnOn:`Включить пакет трекера для проекта на странице «Инструменты»: тогда сессии сами читают задачу, комментарии и связи.`,briefToolsBrought:e=>`Сессии читают задачу через пакет ${e}.`,slot:`Слоты`,slotHint:`0 — свой worktree на каждую задачу. Больше нуля — пул постоянных папок: задача переключает в слоте ветку, и пересобирается только разница.`,color:`Цвет`,colorHint:`Цвет проекта на карточке, в графике запусков, в очереди и в статистике. Новый проект получает первый цвет, которого нет у других.`,colorSlot:e=>`Цвет ${e}`,changelog:`Файл changelog`,changelogHint:`Путь от корня репозитория, например docs/CHANGELOG.md. Черновик вехи записывается в него коммитом в главную ветку.`,rules:`Правила цепочки`,rulesHint:`Какие задачи берёт цепочка: куда статус ставит задачу и что делает метка. Уровень хранит каждый список целиком: сдвиг одного статуса или правка одной метки делает весь список своим для этого уровня, а «Откуда» показывает, откуда каждая строка.`,ruleAdd:{active:`Добавить статус`,terminal:`Добавить статус`,requiredLabels:`Добавить метку`,excludedLabels:`Добавить метку`,requiredMilestones:`Добавить майлстоун`,excludedMilestones:`Добавить майлстоун`},help:`Что это`,add:`Добавить`,remove:e=>`Убрать ${e}`,row:e=>`строка ${e}`,rule:{active:`Статусы в работе`,terminal:`Закрытые статусы`,requiredLabels:`Только задачи с метками`,excludedLabels:`Без задач с метками`,requiredMilestones:`Только задачи из майлстоунов`,excludedMilestones:`Без задач из майлстоунов`},rulePlaceholder:{active:`по категориям статусов трекера`,terminal:`по категориям статусов трекера`,requiredLabels:`любые`,excludedLabels:`никакие`,requiredMilestones:`любые`,excludedMilestones:`никакие`},ruleStatuses:`Статусы`,ruleStatusesHint:`Куда статус ставит задачу. Пока не задано, статус идёт по своей категории в трекере: ToDo и Active — в цепочке, Won и Lost — закрыта, остальные — вне цепочки.`,ruleNoStatuses:`Трекер ещё не назвал ни одного статуса: они появятся, когда он ответит или у задачи будет статус.`,ruleStatus:`Статус`,place:{in:`В цепочке`,out:`Вне цепочки`,closed:`Закрыта`},ruleFrom:`Откуда`,origin:{category:`по категории`,builtin:`встроено`,shared:`общие`,project:`проект`},originProfile:e=>`профиль ${e}`,ruleReset:e=>`Сбросить ${e}`,ruleLabels:`Метки`,ruleLabelsHint:`Что метка делает с задачей. «Обязательна»: чтобы войти в цепочку, задаче нужна одна из обязательных меток. «Не брать»: задача с ней в цепочку не входит. Для публичного репозитория GitHub задайте обязательную метку: задачу там открывает кто угодно, а метку ставят только участники. Встроенные метки — свои у Even Keel, здесь они не меняются.`,ruleLabel:`Метка`,ruleRule:`Правило`,labelRule:{required:`Обязательна`,excluded:`Не брать`,manual:`Не брать`,question:`Только отметка`,run:`Выбирает модель`},labelAdd:`Метка из трекера…`,labelTakeTitle:`Какие задачи входят`,labelTake:{any:`Брать любые`,required:`Только с обязательной меткой`},labelTakeHint:`Следует из меток: пока в списке есть обязательная метка, входят только задачи с одной из них. «Брать любые» убирает обязательные метки.`,milestones:`Задачи проекта`,milestonesHint:`Какие задачи проекта трекера — этого проекта. Задача вне них проекту вовсе не принадлежит: он её не читает, не показывает и не закрывает. Так два проекта делят один проект трекера, например релизный и основной.`,milestoneMode:{all:`Все`,only:`Только майлстоуны`,except:`Все, кроме`},milestonesBut:`и кроме этих:`,milestonesEmpty:`Майлстоуна пока нет: проекту принадлежат все задачи`},shared:Ce,secrets:{variable:e=>`В .env: ${e}.`,outerHint:`Задано в окружении самой службы, а не в .env, и перекрывает файл: меняйте там.`,unset:`не задан`,kept:`задан — пустое оставит его`,save:`Сохранить`,remove:`Удалить`,token:`Токен доступа`,tokenSet:`задан — введите новый, чтобы заменить`,tokenHint:`Его спрашивают страницы, открытые с других машин; от 16 символов. После смены они попросят новый. Пока служба слушает не только localhost, токен не удалить.`,classifier:`Классификатор отрезков`,classifierHint:`Tally раскладывает отрезки сессий по видам моделью за OpenAI-совместимым адресом, например LiteLLM. Без адреса или ключа классификатор пропускается.`,llmUrl:`Адрес`,llmUrlHint:`OpenAI-совместимый. Пусто — классификатор выключен.`,llmKey:`Ключ`,llmKeyHint:`Пустое поле оставляет сохранённый.`,llmModel:`Модель`,llmModelHint:`Пусто — модель по умолчанию.`,llmModelDefault:`по умолчанию`,pending:`Удалённый ключ пока доходит до новых сессий: демон глобальной папки перезапустится, когда завершатся её живые сессии.`,purpose:{HULY_URL:`Адрес сервера Huly`,HULY_WORKSPACE:`Рабочее пространство Huly`,HULY_TOKEN:`Токен Huly`,HULY_EMAIL:`Почта для входа в Huly`,HULY_PASSWORD:`Пароль для входа в Huly`,GITHUB_TOKEN:`Токен GitHub: задачи (Issues), CI и pull requests`,LINEAR_TOKEN:`Личный ключ API Linear`,GITLAB_URL:`Адрес сервера GitLab`,GITLAB_TOKEN:`Токен доступа GitLab`,JIRA_URL:`Адрес сайта Jira`,JIRA_EMAIL:`Почта учётки Atlassian`,JIRA_TOKEN:`API-токен Atlassian`,FORGEJO_TOKEN:`Токен Forgejo`,FORGEJO_URL:`Адрес сервера Forgejo`}},profiles:Me,basement:{tapes:[`ОСТОРОЖНО`,`НЕ ВХОДИТЬ`,`ИДУТ РАБОТЫ`,`ПРОХОД ЗАКРЫТ`],stats:[`Что ты тут забыл?`,`Мы ещё работаем над страницей, не мешай!`],tools:[`Инструменты дальше не выдаём.`,`Кладовщик на обеде — приходи после сброса лимита.`]},launches:{count:He,title:e=>`Запуски за ${e} дней`,none:`Запусков не было`,noneOnDay:`Запусков нет`,table:`Таблицей`,day:`День`},strip:{label:(e,t)=>`Расход ${e} за ${t} дней`,cost:`Деньги`,limit:`В недельных лимитах`,noSnapshots:`снимков лимита за 30 дней нет`,since:e=>` с ${e}`,sessions:`Сессии`,median:`Медианная задача`,medianTip:(e,t)=>`По ${e} ${L(`закрытой задаче`,`закрытым задачам`,`закрытым задачам`)(e)} с расходом за ${t} дней: медиана цены и медиана активного времени, каждая сама по себе`,top:`Самые дорогие задачи`,more:`Подробнее →`,spark:e=>`${e}, по дням`},session:ke,changelog:{button:`Черновик changelog по вехе`,title:e=>`Changelog · ${e}`,writing:`Агент пишет черновик по закрытым задачам вехи — это займёт минуту-другую.`,counts:(e,t)=>t===0?`По ${R(e)} в Done.`:`По ${R(e)} в Done; ещё открыто: ${R(t)} — в черновик не вошли.`,working:`Агент меняет раздел — это займёт минуту-другую.`,opening:`Смотрю задачи вехи и файл changelog…`,startCounts:(e,t)=>t===0?`В Done: ${R(e)}.`:`В Done: ${R(e)}; ещё открыто: ${R(t)}.`,inFile:e=>`Раздел вехи сейчас в ${e} — черновик начнётся с него`,noSection:e=>`В ${e} раздела этой вехи пока нет`,none:e=>e===0?`Черновика ещё нет.`:`Черновика ещё нет: агент напишет его по задачам в Done, когда нажмёшь «Написать черновик».`,noDone:`В вехе нет задач в Done — черновик писать не из чего`,draft:`Написать черновик`,look:`Вид раздела`,preview:`Превью`,markdown:`Markdown`,at:(e,t)=>`Версия ${e}, ${t}`,written:(e,t)=>t===``?`Уже в ${e}`:`Записан в ${e}, коммит ${t}`,released:e=>`Выпущено как ${e}: раздел заморожен, новые задачи пойдут в следующий.`,instruction:e=>`Правка: «${e}»`,edit:`Что поменять`,editHint:`Что и как поменять — Enter отправляет, Shift+Enter — новая строка`,add:e=>`Дописать ${e}`,addTip:`Вписать в раздел задачи, закрытые после этой версии, остальное не трогать`,again:`Написать заново`,copy:`Копировать`,copied:`Скопировано`,write:`Записать`,writeTip:e=>`Положить раздел в ${e} и закоммитить в главную ветку`,since:e=>`+${e} после записи`,sinceTip:`Закрытые задачи вехи, появившиеся после последней записи ченджлога`,tokens:e=>`${e} токенов`,spentAll:e=>`всего ${e}`,tokensDetail:(e,t,n,r)=>`Токены: ${e} на вход, ${t} на выход, ${n} из кэша, ${r} в кэш`,paidByLimits:`Списано с 5-часового и недельного лимитов аккаунта; доллары — по ценам API.`,paidByLimitsNoCost:`Списано с лимитов аккаунта; этот агент не считает стоимость, только токены.`,paidByKey:`Оплачено с баланса API-ключа аккаунта.`,spentTotal:(e,t,n)=>`Все версии вехи: ${Ve(`ход`,`хода`,`ходов`)(e)}, ${t}${n>0?`, ещё ${n} без стоимости`:``}`,notInStats:`Эти ходы не оставляют транскрипта, поэтому /stats их не видит.`},chain:{legend:{done:`готово`,working:`треугольник — в работе`,waiting:`? — ждёт ответа`,handoff:`стрелка — контрольную точку не подхватила новая сессия`,stopped:`квадрат в кольце — сессия остановилась, задача открыта`,error:`ошибка или лимит`,ahead:`ждёт своей очереди в цепочке`,backlog:`в бэклоге`,canceled:`отменена`,fixed:`крест — починка ветки проекта завершена`},archive:`Архив`,archived:(e,t)=>t===0?R(e):e===0?Ue(t):`${R(e)} · ${Ue(t)}`,archiveShown:(e,t)=>`${e} из ${t}`,archiveMore:e=>`ещё ${e}`,loadMore:(e,t)=>`Показать ${e} более старых из ${t} свёрнутых`,openArchive:`Показать последние закрытые задачи`,foldArchive:`Свернуть архив`,nextMilestone:`Показать веху`,foldMilestone:`Свернуть веху`,linksHint:`Выбранная задача или задача под курсором подсвечивает свои блокеры и задачи, которые её ждут.`,dragHint:`Порядок меняется перетаскиванием карточки, на телефоне — после долгого нажатия.`,lockedHint:`Замок вместо лампы состояния — блокер вне цепочки. Нажмите «Перевести в Todo» на месте его номера или смените статус в трекере. Блокер с ярлыком «Вручную» нужно завершить самому.`,readyRefused:e=>`Взять её в цепочку — значит остановить цепочку: ${e}`,tasks:R,noMilestone:`Без вехи`,hidden:e=>`скрыто · ${e}`,skipped:`пропущена`,fix:`Починка main`,fixLanded:(e,t)=>t===null?We(e):`${We(e)} → ${t}`,fixDropped:e=>`${We(e)} — брошена, main остался как был`,carry:e=>`Перенос ${e}: агент разрешает конфликт`,carryAsked:e=>`Перенос ${e}: агент разрешит конфликт`,carried:(e,t)=>`Перенос ${e}: ${Ve(`коммит`,`коммита`,`коммитов`)(t)}`,carryDropped:e=>`Перенос ${e}: пропущен, конфликт ждёт`,fixRuns:`Открыть панель CI с прогонами этих коммитов`,interrupted:`ждёт main`,interruptedTitle:`Main покраснел: сессия этой задачи остановлена и продолжит, когда main починят`,review:{pull:e=>`PR #${e}`,pullTitle:`Задача ждёт свой pull request вне цепочки: открыть его`,feedback:`замечания`,feedbackTitle:`В pull request пришли замечания ревью или упала проверка: они уйдут сессии задачи`,merged:`влит`,closed:`закрыт`},questionTitle:`Ярлык «Вопрос»: без ответа в описании сессия, скорее всего, встанет`,question:`вопрос`,work:{uncommitted:e=>`без коммита · ${e}`,unmerged:e=>`не влита · ${e} ${L(`коммит`,`коммита`,`коммитов`)(e)}`,files:e=>`${e} ${L(`файл`,`файла`,`файлов`)(e)} без коммита`,commits:e=>`${e} ${L(`коммит`,`коммита`,`коммитов`)(e)} не в основной ветке`,branch:e=>`ветка ${e}`,fix:`Ответьте на вопрос задачи и верните её в Todo: новая сессия продолжит с передачей. Или закоммитьте и влейте руками.`,closed:`Задача закрыта, а уборка оставила это. Закоммитьте и влейте или удалите папку — задача уйдёт в архив; «Убрал» отправит её туда сразу.`,backlog:`У задачи бэклога лежит работа без коммита`},blocker:`блокирует`,dependent:`ждёт её`,ghost:`встанет сюда`,resets:e=>`сбросов контекста: ${e}`,resetsOf:e=>{let t=[e.checkpoint>0?`${e.checkpoint} по контрольной точке`:``,e.limit>0?`${e.limit} после лимита`:``,e.relay>0?`${e.relay} по другой причине`:``,e.restart>0?`${e.restart} вручную`:``].filter(e=>e!==``),n=e.compactions>0?`компакций: ${e.compactions}`:``;return[t.join(`, `),n].filter(e=>e!==``).join(`; `)},resetsTitle:`Сбросы контекста: новые сессии с передачей дел и компакции`,accountMark:e=>`Не аккаунт проекта: ${e}`,starting:{launch:`запуск`,handover:`передача`,boot:`загрузка`,answer:`первый ответ`},openCard:`Открыть карточку задачи`,away:({entered:e,archived:t,removed:n})=>`Пока вас не было: ${[e>0?`+${R(e)}`:``,t>0?`${t} в архив`:``,n>0?`${n} ушло из цепочки`:``].filter(e=>e!==``).join(`, `)}`,family:e=>`Подзадачи ${e}`,shapes:{urgent:`срочно`,high:`высокий приоритет`,low:`низкий приоритет`,rework:`переделка`,family:`подзадачи одного родителя`,estimate:`тонкая линия на краю карточки — оценка времени работы над задачей; длиннее — больше оценка`}},help:we,card:{close:`Закрыть`,openIn:e=>e===null?`Открыть в трекере`:`Открыть в ${e}`,loading:`Загружаю задачу…`,none:`Трекер не отдаёт карточку этой задачи — откройте её в трекере.`,status:`Статус`,priority:`Приоритет`,milestone:`Веха`,parent:`Родитель`,labels:`Ярлыки`,priorities:{urgent:`срочный`,high:`высокий`,medium:`средний`,low:`низкий`,none:`нет`},noMilestone:`нет`,due:e=>`до ${e}`,roles:{model:`Сессия задачи запустится на этой модели`,modelOff:`Ярлыки запуска у проекта выключены: сейчас этот ярлык не действует`,question:`Без ответа в описании сессия скорее всего застрянет`,excluded:`Этот ярлык не пускает задачу в цепочку`,required:`Цепочка берёт только задачи с этим ярлыком`},requires:e=>`Цепочка берёт только задачи с ярлыком ${e}: без него задача останется в бэклоге и в Todo.`,work:`Работа не в основной ветке`,blockedBy:`Блокирована`,blocks:`Блокирует`,related:`Связана`,description:`Описание`,noDescription:`Описания нет.`,comments:e=>`Комментарии · ${e}`,noAuthor:`без автора`,ready:`В цепочку`,readyHint:`Задача в бэклоге: кнопка переведёт её в Todo и поставит ярлык, который требует цепочка.`,unready:`В бэклог`,unreadyHint:`Убирает задачу из цепочки: возвращает в статус бэклога и снимает ярлыки, которые требует цепочка.`,attachments:`Вложения`,download:e=>`Скачать ${e}`,viewer:{close:`Закрыть`,prev:`Предыдущее`,next:`Следующее`,original:`Открыть файл`},run:{title:`Запуск на`,provider:`Провайдер`,model:`Модель`,asProject:e=>`Как у проекта · ${e}`,modelAsProject:e=>`как у проекта · ${e}`,severalPick:e=>`Ярлыков запуска: ${e} · как у проекта`,several:`При нескольких ярлыках запуска цепочка запускает задачу как у проекта. Сохранение заменит их выбранным.`,save:`Сохранить`,off:`Ярлыки запуска у проекта выключены: ярлык сохранится, но сессия пойдёт как у проекта.`,offTip:`Ярлыки запуска у проекта выключены: ярлык сейчас не действует.`,confirmTitle:e=>`Ярлыки запуска · ${e}`,confirmQuestion:e=>`Ярлыки запуска у проекта ${e} выключены. Включить их, чтобы задача пошла на выбранной модели?`,confirmOn:`Включить и сохранить`,live:`На задаче идёт сессия: новая модель — со следующей сессии.`,readOnly:`Этот трекер не меняет ярлыки отсюда: смените ярлык запуска в трекере.`}},setup:{title:`Настройка Even Keel`,lead:`Несколько шагов до первой задачи. Всё это потом меняется в Настройках.`,stepsLabel:`Шаги настройки`,steps:{language:`Язык`,git:`Git`,agent:`Агент`,tracker:`Трекер`,updates:`Обновления`,stats:`Статистика`,project:`Первый проект`},titles:{language:`Языки`,git:`Git`,agent:`На чём идут сессии`,tracker:`Откуда берутся задачи`,updates:`Новые версии`,stats:`Статистика сессий`},nextTo:e=>`Далее: ${e}`,back:`Назад`,skip:`Пропустить пока`,pageLanguage:`Страница`,pageLanguageHint:`Надписи страницы и сообщения службы на ней.`,promptLanguage:`Промпты сессий`,promptLanguageHint:`На каком языке Even Keel пишет сессиям и задаёт вопросы в трекере. У проекта можно задать свой.`,agentLead:`Выбранный агент — общий для всех проектов; проекту можно выбрать другой в его мастере.`,ready:e=>`${e}: вход есть`,checking:e=>`${e}: проверяю вход…`,signIn:e=>`${e}: нужен вход`,noAccount:e=>`Аккаунта ${e} ещё нет.`,addAccount:`Добавить аккаунт`,login:`Войти`,trackerLead:`Even Keel читает задачи через профиль доступа: адрес трекера и токен. Его можно добавить и позже: в мастере проекта или в Настройках → Трекеры и CI.`,connect:`Подключить`,addAnother:`Добавить ещё`,updatesLead:`Even Keel может дважды в сутки спрашивать у GitHub, вышла ли новая версия: без токена, GitHub видит только адрес машины и версию Even Keel.`,updates:{on:`Проверять`,off:`Не проверять`},updatesHints:{on:`О новой версии скажет уведомление на странице, обновление — одной кнопкой.`,off:`Служба не ходит на GitHub. Меняется в Настройках → Интерфейс.`},git:{lead:`Каждая задача — ветка git: сессии коммитят и мержат, так что без git Even Keel не работает.`,checking:`Проверяю git…`,installed:e=>`Git ${e} установлен.`,absent:`Git на этой машине не найден. Even Keel его не ставит: выполните команду ниже и проверьте снова.`,linux:`Пакетным менеджером вашего дистрибутива, например:`,again:`Проверить снова`,identity:`Имя и почта для коммитов`,identityLead:`Под этим именем сессии коммитят и мержат. Оно пишется в глобальный конфиг git пользователя, от которого идёт служба.`,identityMissing:`У git ещё нет имени или почты, и первый же коммит первой задачи не пройдёт.`,name:`Имя`,email:`Почта`,save:`Сохранить`}},tally:{title:`Статистика сессий`,stepStats:`Статистика`,stepConnection:`Подключение`,lead:`Tally собирает статистику сессий цепочки: сколько стоит задача, где уходят токены, что поменялось после правки правил. Она необязательна — Even Keel работает и без неё.`,preview:`Страница статистики: расход по дням, задачи и модели`,facts:[`Что собирается: каждые 5 минут — транскрипты сессий: токены, стоимость, модели, ходы, команды, файлы правил и сырые строки.`,`Где хранится: во встроенной базе в папке состояния Even Keel или в вашей базе Postgres. Никуда больше не уходит.`,`Сколько места: около трети объёма транскриптов. На живой установке — 1,13 ГБ базы при 3,1 ГБ транскриптов, из них 944 МБ — сырые строки.`,`Без статистики порог контрольной точки фиксирован на 200k токенов: подстроить его не по чему.`,`Пока вы не выбрали, ничего не ставится и не собирается. Выбор меняется в любой момент в Настройках → Статистика; выключение данные не удаляет.`],modes:{off:`Без статистики`,local:`Локальная база`,server:`Своя база Postgres`},modeHints:{off:`Сборщик не работает, база не создаётся. Остальное Even Keel работает как обычно.`,local:`Встроенная PGlite в папке состояния Even Keel. Ничего ставить не нужно.`,server:`Ваш PostgreSQL: адрес, база и два пользователя — читатель и писатель. Соединение проверяется перед сохранением.`},current:`сейчас`,host:`Адрес`,port:`Порт`,database:`База`,readerPassword:`Пароль читателя (tally_reader)`,writerPassword:`Пароль писателя (tally_writer)`,passwordKept:`задан — пусто оставит его`,save:`Проверить и сохранить`,checking:`Проверяю…`,apply:`Применить`,back:`Назад`,where:`Куда пишется статистика`,whereHint:`Применяется сразу, без перезапуска. Выключение не удаляет данные и не стирает параметры подключения.`},stats:{title:`Статистика`,reading:`Читаю статистику…`,failed:e=>`Even Keel не ответил: ${e}`,off:e=>`Статистика Tally выключена: в .env не заданы ${e}.`,disabled:`Статистика сессий выключена.`,disabledLink:`Включить в настройках`,unchosen:`Статистика сессий ещё не настроена.`,unchosenLink:`Настроить`,dbError:e=>`База Tally недоступна: ${e}`,newer:(e,t)=>`База Tally уже на версии схемы ${e}, а этот Even Keel знает только до ${t}: его обновили и откатили. Обновите Even Keel снова — до тех пор статистика не читается и не собирается.`,scopes:{all:`все`,chain:`цепочка`},sessions:`Сессии`,account:`Аккаунт`,all:`все`,read:e=>`Tally · прочитано ${e}`,others:`прочие`,noTask:`без задачи`,stamps:{calm:[`ШТИЛЬ`,`расходов не обнаружено`],overspend:e=>[`ПЕРЕРАСХОД`,`${e} · одобрено задним числом`],aground:e=>[`НА МЕЛИ`,`${e} денег ушло на буксование`],bargain:[`ЭКОНОМИЯ`,`подозрительная`],evenKeel:[`РОВНЫЙ КИЛЬ`,`сертифицировано Even Keel`]},remarks:{mono:e=>`всё на ${e}. Монокультура`,baseline:`медиана проекта угадывает лучше оценок. Обидно`,sharp:`оценки сбываются чаще прогноза погоды`,optimist:e=>`оптимизм уровня «пять минут»: ${e}`,pessimist:e=>`${e} от оценки — закладывали на шторм`,whale:(e,t)=>`${e} съела ${t} бюджета. Личный яхт-клуб`,stubborn:(e,t)=>`${e}: ${t} ${L(`сессия`,`сессии`,`сессий`)(t)}, и она не сдаётся`,stuck:{unclear_task:`задачи писали второпях — сессии гадали`,broken_tooling:`инструмент сломался. Claude не виноват, честно`,debug_loop:`круги по отладке: ещё один фикс — и точно заработает`,waiting_user:`сессии ждали вас. Они не в обиде`,limit_env:`лимит и окружение: стояли на рейде`}},period:{presets:{"7d":`7 дней`,"30d":`30 дней`,month:`Этот месяц`,"last-month":`Прошлый месяц`,"3m":`3 месяца`,year:`Этот год`,all:`Всё время`},monthsOfDay:[`янв`,`февр`,`мар`,`апр`,`мая`,`июн`,`июл`,`авг`,`сент`,`окт`,`нояб`,`дек`],monthsShort:[`янв`,`фев`,`мар`,`апр`,`май`,`июн`,`июл`,`авг`,`сен`,`окт`,`ноя`,`дек`],months:[`Январь`,`Февраль`,`Март`,`Апрель`,`Май`,`Июнь`,`Июль`,`Август`,`Сентябрь`,`Октябрь`,`Ноябрь`,`Декабрь`],weekdays:[`пн`,`вт`,`ср`,`чт`,`пт`,`сб`,`вс`],previous:`Предыдущий период`,next:`Следующий период`,dialog:`Период`,from:`С`,to:`по`,years:`Годы`,previousYear:`Предыдущий год`,nextYear:`Следующий год`,previousMonth:`Предыдущий месяц`,nextMonth:`Следующий месяц`,pickStart:`Первый клик — начало, второй — конец.`,pickEnd:e=>`С ${e} — выберите конец.`},projects:{label:`Проекты`,count:e=>`Проекты (${e})`,all:`все`,find:`Найти`,findLabel:`Найти проект`,empty:`Расхода за период нет.`,include:e=>`Учитывать ${e}`,only:`Оставить только этот проект`,selectAll:`Все`,reset:`Сбросить`},summary:{cost:`Деньги`,noPrevious:`прошлого отрезка нет`,change:(e,t)=>`${e} к прошлым ${t} ${L(`дню`,`дням`,`дням`)(t)}`,unpriced:e=>` · ${e} без цены`,limit:`В недельных лимитах`,tasks:`Задачи / сессии`,answers:L(`ответ`,`ответа`,`ответов`),stuck:`Ушло на буксование`,stuckNote:`ответы внутри отрезков застревания`,noLimit:`нет данных: снимков лимита за период нет`,from:e=>`с ${e}`,to:e=>`по ${e}`,perWeek:e=>`в среднем за неделю${e&&` ${e}`}`,sum:e=>`сумма долей ${e||`за период`}`,sources:`Откуда расход`,model:`Модель`,entrypoint:`Точка входа`,windows:`окна`,limitsByAccount:`Лимиты по аккаунтам`,closed:`закрытые`,open:`идёт`},labels:{reasons:{unclear_task:`неясная задача`,broken_tooling:`сломанный инструмент`,debug_loop:`отладка по кругу`,waiting_user:`ждала пользователя`,limit_env:`лимит или окружение`,normal:`норма`,other:`другое`},kinds:{failures:`падения подряд`,denied:`отказ в разрешении`,repeat:`повтор команды`,reread:`перечитывание файла`,no_commit:`без коммита`,rewind:`откат`,compact:`сжатие контекста`,handoff:`после передачи дел`},otherModels:`другие`,desktop:`приложение`,otherEntrypoint:`другое`,launches:{launch:`запуск`,start:`запуск`,resume:`продолжение`,relay:`передача по лимиту`,restart:`новая сессия`,checkpoint:`контрольная точка`},unsorted:`не разобрано`,outsideChain:`вне цепочки`},spend:{metrics:{cost:[`$`,`Деньги по ценам API`],limit:[`% лимита`,`Доля недельного лимита`],sessions:[`сессии`,`Новые сессии`]},steps:{day:[`Д`,`По дням`],week:[`Н`,`По неделям`],month:[`М`,`По месяцам`]},titles:{day:`Расход по дням`,week:`Расход по неделям`,month:`Расход по месяцам`},metric:`Что считать`,step:`Шаг`,empty:`За период пусто`,mark:e=>`Правка правил: ${e}`,zoom:`Выделите мышью отрезок графика, чтобы приблизить его`,zoomOut:`; двойной клик — назад`,marks:` Засечки у оси — правки правил: клик по засечке сравнивает до и после.`},tasks:{columns:{task:[`Задача`],project:[`Проект`],status:[`Статус`],cost:[`$`,`Деньги по ценам API`],limit:[`Лимит`,`Доля недельного лимита`],estimate:[`Оценка`,`Оценка задачи в трекере`],active:[`Время`,`Активное время всех сессий задачи по ходам транскриптов, за всю задачу`],wait:[`Ожидание`,`Сколько задача ждала вашего ответа, за всю задачу`],sessions:[`Сессии`],handoffs:[`Передачи`,`Передачи по лимиту, контрольные точки и замены вручную`],compacts:[`Компакции`,`Сжатия контекста в сессиях задачи: сессия продолжает работу со сводкой вместо истории`],spans:[`Застревания`],rework:[`Переделка`]},title:`Задачи`,empty:`Задач с расходом за период нет.`,yes:`да`,first:e=>`Показать первые ${e}`,all:e=>`Показать все (${e})`,ofEstimate:e=>`, ${e} от оценки`,total:e=>`общее время: ${e}`,open:`, задача не закрыта`,handoffs:(e,t,n)=>`по лимиту: ${e}, контрольные точки: ${t}, вручную: ${n}`,compacts:(e,t)=>`автоматически: ${e}, через /compact: ${t}`,compaction:(e,t,n)=>`${e===`auto`?`Автоматическая компакция`:`Компакция через /compact`}: ${t} → ${n} токенов`,noSessions:`Сессий по задаче нет.`,steps:`Шаги:`,stepsNote:` — доля времени задачи`,launches:He},stuck:{title:`Застревания`,none:`Сессии за период не топтались на месте.`,week:(e,t)=>`Неделя с ${e}: ${t}`,latest:`Последние отрезки`},estimate:{project:`Проект`,component:`Компонент`,noComponent:`без компонента`,model:`Модель`,unknown:`неизвестно`,unestimated:e=>`без оценки: ${e}`,open:e=>`не закрыто: ${e}`,title:`Время и оценки`,note:`время — активная работа агента по ходам, за всю задачу; в сравнении только закрытые задачи с оценкой`,median:`Медиана времени задачи`,done:Ve(`закрытая задача`,`закрытые задачи`,`закрытых задач`),within:`В пределах ×1.5 от оценки`,compared:e=>`сравнено ${R(e)}`,ratio:`Факт / оценка, медиана`,noEstimates:`нет задач с оценкой`,faster:`быстрее оценки`,slower:`дольше оценки`,exact:`ровно по оценке`,comparedTitle:`Сравнено задач`,tasks:`Задачи`,withinTitle:`Доля задач в пределах ×1.5 от оценки`,medianTitle:`Медиана факт / оценка`,medianColumn:`Медиана`,within2:e=>`в пределах ×2: ${e}`,within2Title:`Доля задач в пределах ×2 от оценки`,baseline:`Медиана проекта вместо оценки`,baselineNote:`в пределах ×1.5; оценка, которая не обходит эту цифру, ничего не сообщает`,baselineColumn:`Конст.`,baselineTitle:`В пределах ×1.5, если бы каждой задаче поставили медиану времени закрытых задач её проекта (медиана этой выборки, а не прошлого)`},checkpoint:{title:`Порог контрольной точки`,defaults:e=>`Остальные проекты: ${e} — 200k по умолчанию`,note:`размер контекста, на котором сессию впервые просят передать дела`,sources:{default:()=>`по умолчанию`,config:()=>`задан в конфиге`,calibrated:e=>`по ${e} ${L(`сессии`,`сессиям`,`сессиям`)(e)} проекта`},waiting:(e,t,n,r)=>`Калибровка включается с ${n} передач и ${r} сессий больше 150k; у проекта ${e} и ${t}`},steps:{title:`Шаги`,note:e=>`сборки, проверки и тесты по командам; фоновый запуск — до уведомления о конце; доля — от активного времени ${e} ${L(`задачи`,`задач`,`задач`)(e)} за всю задачу`,grew:e=>e,grewFrom:(e,t)=>` вырос с ${e} до ${t} `,week:e=>`неделя с ${e}`,step:`Шаг`,runs:`Запуски`,slow:e=>`Доля запусков дольше ${e}`,spread:`Распределение`,coldTitle:`Первый запуск шага в worktree или слоте на этой ветке: p50 и число`,cold:`Холодный`,warmTitle:`Повторные запуски: p50 и число`,warm:`Тёплый`,failedTitle:`Падение или таймаут`,failed:`Упало`,shareTitle:`Доля активного времени задач, ушедшая на шаг`,share:`Время задач`,weeklyTitle:`p90 по неделям`,weekly:`По неделям`,launches:He,outcomes:(e,t,n,r)=>`упало ${e}, таймаут ${t}, прервано ${n}, неизвестно ${r}`,unruled:`Команды без правила — дольше всего в сумме`,command:`Команда`},rules:{kinds:{claude_md:`CLAUDE.md`,skill:`навыки`,hook:`хуки`,settings:`настройки`,agent:`агенты`,memory:`память`},quoted:e=>`«${e}»`,purposes:{economy:`экономия`,quality:`качество`,process:`процесс`,infra:`инфраструктура`},later:`позже`,earlier:`раньше`,drift:(e,t)=>`в транскрипте на ${e} ${t}`,hour:`±час`,day:`±день`,noTaskSession:`сессия без задачи`,imported:`из импорта`,manual:`вручную`,actions:{added:`добавлен`,changed:`изменён`,removed:`удалён`},all:`все`,noTexts:`Текстов версий в базе нет.`,noText:`Текста версии нет — правка видна только по счёту строк.`,title:`Правки правил`,note:`когда менялись CLAUDE.md, навыки, хуки и настройки — и что стало с расходом`,coverage:`Учёт: CLAUDE.md — с 4 сентября 2026, навыки — с 3 августа, хуки и настройки — с первого снимка. Правки памяти не отмечаются.`,files:`Файлы`,purpose:`Цель`,none:`В этом периоде правок правил нет.`,fileCount:Ve(`файл`,`файла`,`файлов`),pick:`Выберите правку в списке или метку на графике — ниже появятся изменённые файлы и сравнение расхода до и после. Shift- или Ctrl-клик по второй правке сравнит весь отрезок между ними.`,changed:`Что поменялось`,shared:`общий`,places:{label:`Где лежат файлы`,shared:`общие`,project:`проекты`},today:`сегодня`,yesterday:`вчера`,compare:`До и после`,eachSide:`с каждой стороны от правки`,days:`Дней с каждой стороны`,dayCount:e=>`${e} дн`,time:e=>`время ${e}`,driftNote:e=>`Импорт и транскрипт расходятся: ${e}`,one:e=>`Правка правил · ${e}`,many:(e,t)=>`Правки правил · ${e} — ${t}`,moreFiles:e=>`и ещё файлов: ${e}`,moreSets:e=>`и ещё наборов: ${e}`,tipHint:`Клик — до и после, Shift-клик — вторая метка`},compare:{metrics:{taskCost:`Цена задачи, медиана`,sessionsPerTask:`Сессий на задачу`,meanContext:`Средний контекст на запрос`,over150Share:`Запросов больше 150k`,requestCost:`$ за запрос`,stuckShare:`Расход в застреваниях`,errorShare:`Падения инструментов`,deniedShare:`Отказы инструментов`,entryTokens:`Стоимость входа: контекст первого ответа, медиана`},samples:{tasks:R,sessions:Ve(`сессия`,`сессии`,`сессий`),requests:Ve(`запрос`,`запроса`,`запросов`)},few:(e,t)=>`Мало данных: для сравнения нужно не меньше ${e} задач и ${t} сессий с каждой стороны.`,models:`Модели сторон разные, а цена токена у моделей своя: долларовые строки меняются и без правки. Контекст и доли от этого не зависят.`,metric:`Метрика`,before:`До`,after:`После`,beside:`Бок о бок`,left:`Слева`,right:`Справа`,change:`Изменение`,modelShares:`Модели, доля запросов`,foot:`Меньше — лучше во всех строках. Задача относится к стороне своего первого сообщения, сессия — к стороне начала; другой набор задач по сторонам тоже меняет цифры.`,families:{title:`По моделям`,model:`Модель`,side:`Сторона`,tasks:`Задачи`,cost:`$ всего`,closedCost:`Цена закрытой, медиана`,closedTime:`Время закрытой, медиана`,ratio:`Факт / оценка, медиана`,closed:e=>`закрыто ${e}`,estimated:e=>`${e} с оценкой`,unknown:`неизвестно`,thin:`мало данных`,thinTitle:e=>`Меньше ${R(e)} закрытых задач этой модели с какой-либо стороны: строку не толковать.`,note:`Ярлыки Sonnet и Haiku уводят мелкие задачи на дешёвые модели, и общая медиана падает, даже если задачи одной модели не подешевели: цену и время сравнивайте внутри модели. Задачи здесь — как в аудите сессий: сессия отдаёт весь расход своей задаче, задача относится к стороне своей первой сессии, модель — самая частая по её сессиям, время — активное за всю задачу.`}}}},qe={column:`Extra usage`,spending:`on credits`,on:`on`,off:`off`,available:`available`,unavailable:`unavailable`,unlimited:`unlimited`,credits:e=>`${e} credits`,spent:e=>`${e} spent`,count:e=>`Extra allowance used: ${e}. The source does not give its dollar cost.`,unknown:`The provider has not reported extra usage for this account.`,autoReload:`Automatic reload and its settings are not reported by this source.`,inferred:`A session is working with an exhausted included window and available credits. Credit use is inferred, not a charge receipt.`,confirmed:`A working session last reported using extra usage.`,sources:{"claude-sdk":`Claude session: extra usage availability; no balance or spending cap reported`,chatgpt:`ChatGPT usage: remaining usage credits, not US dollars`,"github-quota":`GitHub allowance: additional usage permission; no dollar budget reported`,"github-billing":`GitHub billing: net paid Copilot usage this month; no budget reported`}},Je={column:`Сверх лимита`,spending:`на деньгах`,on:`вкл.`,off:`выкл.`,available:`доступно`,unavailable:`недоступно`,unlimited:`без лимита`,credits:e=>`${e} кред.`,spent:e=>`потрачено ${e}`,count:e=>`Сверх запаса использовано: ${e}. Источник не сообщает стоимость в долларах.`,unknown:`Провайдер не сообщил о расходах сверх лимита для этого аккаунта.`,autoReload:`Источник не сообщает об автопополнении и его настройках.`,inferred:`Сессия работает при исчерпанном окне подписки и доступных кредитах. Расход кредитов предполагается, это не подтверждение списания.`,confirmed:`Работающая сессия в последнем сообщении указала расход сверх лимита.`,sources:{"claude-sdk":`Сессия Claude: доступность extra usage; баланс и денежный потолок не сообщаются`,chatgpt:`Статистика ChatGPT: остаток кредитов использования, не доллары США`,"github-quota":`Запас GitHub: разрешение дополнительных расходов; денежный бюджет не сообщается`,"github-billing":`Биллинг GitHub: платные расходы Copilot за месяц после скидок; бюджет не сообщается`}};function Ye(e,t,n){let r=new Date(e);return Number.isNaN(r.getTime())?e:new Intl.DateTimeFormat(n,{...r.toDateString()===t.toDateString()?{}:{day:`numeric`,month:`short`},hour:`2-digit`,minute:`2-digit`}).format(r)}var Xe={en:_e,ru:Ke},Ze=`en`,z=_e,Qe=dt(e=>e===`ru`?Je:qe);function $e(e){Ze=e,z=Xe[e],typeof document<`u`&&(document.documentElement.lang=e)}var et={};function tt(e){et=e}var nt={};function rt(e){nt=e}function it(e){return Object.hasOwn(nt,e)?nt[e]:e}function at(e){let t=e.params;return{...e,...typeof t.account==`string`&&{params:{...t,account:it(t.account)}},...e.cause!==void 0&&{cause:at(e.cause)},...e.items!==void 0&&{items:e.items.map(at)}}}function ot(e){return S(st(e),et)}function st(e){return b(at(e),{...z.notice,"chain.limitSpent":e=>z.notice[`chain.limitSpent`]({...e,until:Ye(e.until,new Date,Ze),provider:e.provider===void 0?void 0:z.account.agents[e.provider]??e.provider})})}var ct={en:ye,ru:xe};function lt(e){let t=ct[Ze][e.code];return t===void 0?ot(e):S(t(e.params),et)}function ut(e,t){if(e!==null)return e;for(let e of t){let t=e.toLowerCase().split(`-`)[0];if(E(t))return t}return`en`}function dt(e){let t=null;return()=>((t===null||t.language!==Ze)&&(t={language:Ze,value:e(Ze)}),t.value)}var ft=`codex`,pt=`copilot`,mt=`opencode`,ht=`, `,gt={ru:{lost:`Вопрос, который ты задал через AskUserQuestion, потерялся при перезапуске сессии:`,files:`Файлы от пользователя:`,question:e=>e>1?`**Сессия ждёт ответа на вопросы**`:`**Сессия ждёт ответа**`,how:e=>e?`Ответьте комментарием: по строке на вопрос, по порядку — номер варианта, несколько номеров через запятую или свой текст. Комментарий другого вида уйдёт сессии целиком.`:"Ответьте комментарием: номер варианта (`2`), несколько через запятую (`1, 3`) или свой текст."},en:{lost:`The question you asked through AskUserQuestion was lost when the session restarted:`,files:`Files from the user:`,question:e=>e>1?`**The session waits for answers**`:`**The session waits for an answer**`,how:e=>e?`Reply with a comment: a line per question, in order — the option number, several numbers separated by commas, or your own text. A comment of another shape goes to the session as a whole.`:"Reply with a comment: the option number (`2`), several separated by commas (`1, 3`), or your own text."}};function _t(e,t){if(t===void 0)return[];if(e.options.some(e=>e.label===t))return[t];let n=t.split(ht);return e.options.filter(e=>n.includes(e.label)).map(e=>e.label)}function vt(e,t){if(t===void 0||e.options.some(e=>e.label===t))return``;let n=_t(e,t);return yt(t.split(ht).filter(e=>!n.includes(e))).trim()}function yt(e){return e.join(ht)}var bt={intros:[`Ответ пользователя со страницы Even Keel.`,`Ответ пользователя комментарием в трекере.`,`The user's reply from the Even Keel page.`,`The user's reply as a comment in the tracker.`],asked:[`Твой вызов AskUserQuestion выше остался без ответа в самом инструменте: сессию остановили и продолжили, чтобы передать ответ. Если вызов завершился ошибкой или прерыванием — это из-за остановки, ответ ниже.`,`Your AskUserQuestion call above got no answer in the tool itself: the session was stopped and resumed to pass the answer on. If the call ended in an error or an interruption, that is the stop; the answer is below.`],lost:[`Ты задал пользователю вопрос через AskUserQuestion. Чтобы передать ответ, сессию остановили и продолжили, а сообщение с вызовом CLI записать не успел: выше нет ни вызова, ни текста, который ты написал перед ним. Вот что ты спросил, ответ ниже.`,`You asked the user a question through AskUserQuestion. To pass the answer on, the session was stopped and resumed, and the CLI had not saved the message with the call: neither the call nor the text you wrote before it is in the conversation. Here is what you asked, the answer is below.`],comments:[`Комментарий пользователя:`,`The user's comment:`]};[...bt.intros,...bt.asked,...bt.comments,...Object.values(gt).map(e=>e.lost)],new Set(bt.lost),new Set(Object.values(gt).map(e=>e.files));var xt=`claude`,St={vscode:`VS Code`};function Ct(e,t,n){let r=e.apps.find(e=>e.app===t);if(r===void 0)return m(`app.unknown`,{app:t});let i=St[r.app];if(r.error!==null)return r.error;let a=e.accounts.find(e=>e.key===n);if(a===void 0)return m(`account.unknown`,{key:n});if(a.agent!==`claude`)return m(`account.codexApp`,{});let o=a.status?.email??n;if(r.account===n)return m(`app.alreadyUses`,{app:i,account:o});if(a.removing)return m(`account.removing`,{account:o});if(a.needsLogin||a.status?.loggedIn!==!0)return m(`account.needsLogin`,{account:o});if(r.sessions.length>0)return m(`app.chatsOpen`,{app:i,count:r.sessions.length})}var wt=()=>m(`chain.opencodeCopilot`,{}),Tt=()=>m(`account.opencodeCopilot`,{});function Et(e){return e.agent===`opencode`&&Ot(e.status).includes(`github-copilot`)}function Dt(e){return Et(e)&&Ot(e.status).every(e=>e===`github-copilot`)}function Ot(e){return e?.subscriptionType?.split(`,`).map(e=>e.trim()).filter(Boolean)??[]}var kt=`free`;function At(e,t){let n=jt(t),r=e.toLowerCase();return r===n||r.startsWith(`${n}-`)&&/^\d+$/.test(r.slice(n.length+1))}function jt(e){return(e??``).split(`@`)[0].toLowerCase().replace(/[^a-z0-9._-]+/g,`-`).replace(/^[.-]+|[.-]+$/g,``)||`account`}function Mt(e,t){let n=e.accounts.find(e=>e.key===t);return n===void 0?m(`account.unknown`,{key:t}):t===e.active?m(`account.alreadyActive`,{key:t}):n.removing?m(`account.removing`,{account:n.status?.email??t}):Dt(n)?wt():n.needsLogin||n.status?.loggedIn!==!0?m(`account.needsLogin`,{account:n.status?.email??t}):It(e.accounts,t)}function Nt(e,t){let n=e.accounts.find(e=>e.key===t);if(n===void 0)return m(`account.unknown`,{key:t});if(t===e.active)return m(`account.activeKept`,{});let r=e.pool.filter(e=>e.account===t&&e.byDefault!==!0);if(r.some(e=>e.project===null))return m(`account.sharedPool`,{agent:n.agent});let i=[...new Set([...r.map(e=>e.project),...n.projects])];if(i.length>0)return m(`account.projectPool`,{agent:n.agent,projects:i});if(e.login?.target===t&&e.login.error===null)return m(`account.signInRunning`,{});let a=n.global?void 0:e.apps.find(e=>e.account===t);if(a!==void 0)return m(`account.usedByApp`,{app:St[a.app]})}function Pt(e){return e.chains.length>0?m(`account.chainRunning`,{project:e.chains.join(`, `)}):m(`account.sessionsBusy`,{sessions:e.sessions.map(e=>e.name)})}function Ft(e,t=e.active){let n=e.accounts.find(e=>e.key===t);return n===void 0?t===e.active?m(`account.activeGone`,{key:t}):m(`account.homeGone`,{key:t}):Dt(n)?wt():e.login!==null&&e.login.target===t&&e.login.error===null?m(`account.signingIn`,{}):n.status?.loggedIn===!1?m(`account.signedOut`,{}):n.needsLogin?m(`account.loginExpired`,{account:n.status?.email??n.key}):It(e.accounts,t)}function It(e,t){let[n,...r]=Lt(e);if(n!==void 0&&r.some(e=>e.key===t))return m(`account.extraFree`,{account:n.status?.email??n.key})}function Lt(e){return e.filter(e=>e.agent===`codex`&&Rt(e.status))}function Rt(e){return e?.loggedIn===!0&&e.subscriptionType===kt}var zt=`OpenCode Zen`;function Bt(e){return z.account.agents[e]??e}function Vt(e){return e===`codex`?`~/.codex`:`~/.claude`}function Ht(e,t=[e]){if(e.name!==null)return e.name;let n=qt(e)??Jt(e);if(n!==null)return n;if(e.status?.loggedIn===!1)return e.global?Vt(e.agent):e.key;let r=Yt(e),i=t.filter(e=>e.name===null&&qt(e)===null&&Yt(e)===r).map(e=>e.key).sort().indexOf(e.key);return i>0?`${r} ${i+1}`:r}function Ut(e,t){let n=e?.accounts.find(e=>e.key===t);return n===void 0?t:Ht(n,e.accounts)}function Wt(e,t){return e?.accounts.find(e=>e.key===t)??e?.accounts.find(e=>e.status?.email===t)}function Gt(e,t){let n=Kt(e);if(n===null)return null;let r=t.filter(t=>t.agent===e.agent&&Kt(t)===n);if(r.length<2)return null;let i=r.find(e=>e.global||At(e.key,n))??r[0];return i.key===e.key?null:i}function Kt(e){return e.needsLogin||e.apiKey||e.status?.loggedIn!==!0?null:qt(e)?.toLowerCase()??null}function qt(e){let t=e.status?.email??null;return t===e.key?null:t}function Jt(e){let t=e.lastEmail??null;return t===e.key?null:t}function Yt(e){return e.agent===`opencode`&&e.status!==null&&e.status.subscriptionType===null?zt:Bt(e.agent)}var Xt=new class{count=0;listeners=new Set;track(e){this.shift(1);let t=()=>this.shift(-1);return e.then(t,t),e}running(){return this.count}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}shift(e){this.count+=e;for(let e of this.listeners)e()}},Zt=n((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),Qt=n(((e,t)=>{t.exports=Zt()})),B=Qt(),$t=(0,a.createContext)(null);function en({source:e,children:t}){return(0,B.jsx)($t.Provider,{value:e,children:t})}function tn(){let e=(0,a.useContext)($t);if(e===null)throw Error(`useLive needs a LiveProvider`);let t=(0,a.useCallback)(t=>e.subscribe(t),[e]);return{...(0,a.useSyncExternalStore)(t,()=>e.snapshot()),retryNow:()=>e.retryNow(),command:(t,n)=>Xt.track(e.command(t,n)),session:t=>Xt.track(e.session(t)),transcript:(t,n)=>e.transcript(t,n),onTranscript:(t,n)=>e.onTranscript(t,n),imageUrl:(t,n,r)=>e.imageUrl(t,n,r),sentFileUrl:(t,n)=>e.sentFileUrl(t,n),sharedUrl:(t,n,r)=>e.sharedUrl(t,n,r),tools:t=>Xt.track(e.tools(t)),card:t=>Xt.track(e.card(t)),vocabulary:t=>e.vocabulary(t),checkProject:(t,n)=>Xt.track(e.checkProject(t,n)),query:(t,n)=>Xt.track(e.query(t,n)),statsHistory:t=>e.statsHistory(t),statsPeriod:t=>e.statsPeriod(t),statsSteps:t=>e.statsSteps(t),statsCheckpoints:()=>e.statsCheckpoints(),statsSpend:t=>e.statsSpend(t),statsTokens:t=>e.statsTokens(t),statsTask:t=>e.statsTask(t),statsRules:t=>e.statsRules(t),statsRuleDiff:t=>e.statsRuleDiff(t),statsCompare:t=>e.statsCompare(t)}}function nn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`2.8`,cy:`8`,r:`1.6`}),(0,B.jsx)(`circle`,{cx:`13.2`,cy:`8`,r:`1.6`}),(0,B.jsx)(`path`,{d:`M5.2 8h5.4M8.6 5.8 10.8 8l-2.2 2.2`})]})}function rn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6.25`}),(0,B.jsx)(`path`,{d:`M6.2 6.4a1.9 1.9 0 1 1 2.7 1.7c-.6.3-.9.7-.9 1.3`}),(0,B.jsx)(`path`,{d:`M8 11.6v.01`})]})}function an(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`3`,y:`7.25`,width:`10`,height:`7`,rx:`1.5`}),(0,B.jsx)(`path`,{d:`M5.25 7.25V5a2.75 2.75 0 0 1 5.5 0v2.25`})]})}function on(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`4.75`,cy:`8`,r:`3`}),(0,B.jsx)(`path`,{d:`M7.75 8h6.5M11.5 8v2.75M14.25 8v2.25`})]})}function sn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2.25`,y:`5.5`,width:`11.5`,height:`3`,rx:`0.75`}),(0,B.jsx)(`path`,{d:`M3.25 8.5v5h9.5v-5M8 5.5v8`}),(0,B.jsx)(`path`,{d:`M8 5.5C7 3 4.75 2.75 4.75 4.25 4.75 5.5 8 5.5 8 5.5Zm0 0c1-2.5 3.25-2.75 3.25-1.25C11.25 5.5 8 5.5 8 5.5Z`})]})}function cn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M3.5 14.5V2.5`}),(0,B.jsx)(`path`,{d:`M3.5 3h8.5l-2 3 2 3H3.5`})]})}function ln(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M2.5 2.5v11`}),(0,B.jsx)(`path`,{d:`M13.5 8H5.5M8.75 4.75 5.5 8l3.25 3.25`})]})}function un(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M13.5 2.5v11`}),(0,B.jsx)(`path`,{d:`M2.5 8h8M7.25 4.75 10.5 8l-3.25 3.25`})]})}function dn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M8 2.5 14 5.5 8 8.5 2 5.5z`}),(0,B.jsx)(`path`,{d:`M2 8.25 8 11.25l6-3`}),(0,B.jsx)(`path`,{d:`M2 11 8 14l6-3`})]})}function fn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M2 4.5h6M11 4.5h3M2 11.5h2M7 11.5h7`}),(0,B.jsx)(`circle`,{cx:`9.5`,cy:`4.5`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`5.5`,cy:`11.5`,r:`1.5`})]})}function pn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M2.5 2.75v3.5L5.5 4.5z`}),(0,B.jsx)(`path`,{d:`M8 4.5h5.5M2.5 8.5h11M2.5 12.5h11`})]})}function mn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M3 8.5 6.5 12 13 4.5`})})}function hn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`5.5`,y:`5.5`,width:`8`,height:`8`,rx:`1.5`}),(0,B.jsx)(`path`,{d:`M10.5 3.5v-.5a1 1 0 0 0-1-1H3.5a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h.5`})]})}function gn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M8 3.5v5.5M8 12.2v.3`})})}function _n(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`m4 6 4 4 4-4`})})}function vn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M5.5 3 2.5 6l3 3`}),(0,B.jsx)(`path`,{d:`M2.5 6h7a4 4 0 0 1 0 8H7`})]})}function yn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M3 2.5h10`}),(0,B.jsx)(`path`,{d:`m5 8 3-3 3 3`}),(0,B.jsx)(`path`,{d:`M8 5v8.5`})]})}function bn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.5-3.55`}),(0,B.jsx)(`path`,{d:`M12 1.5V5H8.5`})]})}function xn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M8 13V3M3.75 7.25 8 3l4.25 4.25`})})}function Sn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M8 3v10M3 8h10`})})}function Cn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M2.5 4.25h11M6.25 4.25V2.75h3.5v1.5M4 4.25l.75 9.25h6.5L12 4.25`})})}function wn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M2.5 4h11M2.5 8h11M2.5 12h11`})})}function Tn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`3.5`,cy:`8`,r:`1.25`,fill:`currentColor`,stroke:`none`}),(0,B.jsx)(`circle`,{cx:`8`,cy:`8`,r:`1.25`,fill:`currentColor`,stroke:`none`}),(0,B.jsx)(`circle`,{cx:`12.5`,cy:`8`,r:`1.25`,fill:`currentColor`,stroke:`none`})]})}function En(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M8 1.75v12.5M1.75 8h12.5M3.6 3.6l8.8 8.8M12.4 3.6l-8.8 8.8`})})}function Dn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M8 1.5 13.75 4.75v6.5L8 14.5 2.25 11.25v-6.5Z`}),(0,B.jsx)(`path`,{d:`M5.75 6.5 7.5 8l-1.75 1.5M8.75 10h1.75`})]})}function On(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M13.25 5.75v-3H2.75v10.5h10.5v-3`}),(0,B.jsx)(`path`,{d:`M5.5 8h4.5`})]})}function kn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`5`,cy:`8.5`,r:`2.75`}),(0,B.jsx)(`circle`,{cx:`11`,cy:`8.5`,r:`2.75`}),(0,B.jsx)(`path`,{d:`M7.75 8.5h0.5M1 7.5h1.25M13.75 7.5H15`})]})}function An(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`M8.5 1.75v6h4.25ZM7 3.5v4.25H3.75ZM1.75 9.25h12.5l-1.75 2.5h-9ZM7.25 11.75h1.5L8 14.25Z`})})}function jn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`1.75`,y:`2.5`,width:`12.5`,height:`11`,rx:`1.5`}),(0,B.jsx)(`path`,{d:`M5.25 2.5v11M7.75 6h4M7.75 8.25h2.75M7.75 10.5h3.5`})]})}function Mn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`1.75`,y:`3`,width:`12.5`,height:`10`,rx:`1.5`}),(0,B.jsx)(`path`,{d:`M4.5 6.25 6.5 8l-2 1.75M8 10h3.5`})]})}function Nn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M6 1.75v3M10 1.75v3`}),(0,B.jsx)(`path`,{d:`M3.75 4.75h8.5v2.5a4.25 4.25 0 0 1-8.5 0z`}),(0,B.jsx)(`path`,{d:`M8 11.5v2.75`})]})}function Pn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2`,y:`2.25`,width:`12`,height:`5`,rx:`1.25`}),(0,B.jsx)(`rect`,{x:`2`,y:`8.75`,width:`12`,height:`5`,rx:`1.25`}),(0,B.jsx)(`path`,{d:`M4.75 4.75h.01M4.75 11.25h.01M8 4.75h3.25M8 11.25h3.25`})]})}function Fn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2.5`,y:`2.5`,width:`4.5`,height:`4.5`,rx:`1`}),(0,B.jsx)(`rect`,{x:`9`,y:`2.5`,width:`4.5`,height:`4.5`,rx:`1`}),(0,B.jsx)(`rect`,{x:`2.5`,y:`9`,width:`4.5`,height:`4.5`,rx:`1`}),(0,B.jsx)(`rect`,{x:`9`,y:`9`,width:`4.5`,height:`4.5`,rx:`1`})]})}function In(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`8`,cy:`3.25`,r:`1.75`}),(0,B.jsx)(`circle`,{cx:`3.5`,cy:`12.75`,r:`1.75`}),(0,B.jsx)(`circle`,{cx:`12.5`,cy:`12.75`,r:`1.75`}),(0,B.jsx)(`path`,{d:`M8 5v2.5M8 7.5 4.5 11.25M8 7.5l3.5 3.75`})]})}function Ln(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2`,y:`2.5`,width:`12`,height:`11`,rx:`1.5`}),(0,B.jsx)(`path`,{d:`M6 2.5v11M10 2.5v11M3.75 5h.5M7.75 5h.5M7.75 7.25h.5M11.75 5h.5`})]})}function Rn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2`,y:`2`,width:`12`,height:`12`,rx:`1.5`}),(0,B.jsx)(`rect`,{x:`4.5`,y:`5.5`,width:`3`,height:`6`,rx:`0.75`}),(0,B.jsx)(`rect`,{x:`8.5`,y:`5.5`,width:`3`,height:`6`,rx:`0.75`}),(0,B.jsx)(`path`,{d:`M4.5 3.75h3`})]})}var zn={huly:Hn,github:Un,linear:Kn,gitlab:Wn,jira:Ln,forgejo:Vn};function Bn({kind:e}){let t=zn[e]??on;return(0,B.jsx)(t,{})}function Vn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`3`,cy:`8`,r:`1.75`}),(0,B.jsx)(`circle`,{cx:`8`,cy:`8`,r:`1.75`}),(0,B.jsx)(`circle`,{cx:`13`,cy:`8`,r:`2.25`}),(0,B.jsx)(`path`,{d:`M4.75 8h1.5M9.75 8h1M12 8l.75.75L14 7.25`})]})}function Hn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`rect`,{x:`2`,y:`2`,width:`5.25`,height:`5.25`,rx:`1.25`}),(0,B.jsx)(`rect`,{x:`8.75`,y:`2`,width:`5.25`,height:`5.25`,rx:`1.25`}),(0,B.jsx)(`rect`,{x:`2`,y:`8.75`,width:`5.25`,height:`5.25`,rx:`1.25`}),(0,B.jsx)(`rect`,{x:`8.75`,y:`8.75`,width:`5.25`,height:`5.25`,rx:`1.25`})]})}function Un(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`4.5`,cy:`3.25`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`4.5`,cy:`12.75`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`11.5`,cy:`5.25`,r:`1.5`}),(0,B.jsx)(`path`,{d:`M4.5 4.75v6.5M11.5 6.75c0 2.5-2 3.25-4.5 3.75-1.25.25-2.25.75-2.5 1`})]})}function Wn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`4`,cy:`12.75`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`12`,cy:`12.75`,r:`1.5`}),(0,B.jsx)(`path`,{d:`M4 11.25V2M1.75 4.25 4 2l2.25 2.25M12 11.25V10a4 4 0 0 0-4-4H4`})]})}function Gn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`circle`,{cx:`4`,cy:`3.25`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`4`,cy:`12.75`,r:`1.5`}),(0,B.jsx)(`circle`,{cx:`12`,cy:`12.75`,r:`1.5`}),(0,B.jsx)(`path`,{d:`M4 4.75v6.5M12 11.25V6a1.75 1.75 0 0 0-1.75-1.75H7.5M9.25 2.5 7.5 4.25 9.25 6`})]})}function Kn(){return(0,B.jsx)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:(0,B.jsx)(`path`,{d:`m2.25 4 1.25 1.25L5.75 3M2.25 9.5l1.25 1.25L5.75 8.5M8 4.25h5.75M8 9.75h5.75M8 13.25h3.5`})})}function qn(){return(0,B.jsxs)(`svg`,{className:`icon`,viewBox:`0 0 16 16`,"aria-hidden":`true`,children:[(0,B.jsx)(`path`,{d:`M8.5 14.25H4a1.25 1.25 0 0 1-1.25-1.25V3A1.25 1.25 0 0 1 4 1.75h6A1.25 1.25 0 0 1 11.25 3v3`}),(0,B.jsx)(`path`,{d:`M5.25 5h3.5M5.25 7.75h2.5`}),(0,B.jsx)(`path`,{d:`m13.6 8.4.9.9-4.4 4.4-1.6.4.4-1.6z`})]})}function Jn(){return(0,B.jsx)(`span`,{className:`ui-fold__caret`,children:(0,B.jsx)(_n,{})})}function Yn({children:e,className:t=``,...n}){return(0,B.jsxs)(`button`,{type:`button`,className:`ui-fold__toggle ${t}`,...n,children:[(0,B.jsx)(Jn,{}),e]})}function Xn({open:e,id:t,className:n=``,preview:r=!1,onClosed:i,children:o}){let s=(0,a.useRef)(null),c=(0,a.useRef)(i);c.current=i;let[l,u]=(0,a.useState)(e||r),[d,f]=(0,a.useState)(!1);return e&&!l&&u(!0),(0,a.useLayoutEffect)(()=>{s.current.offsetHeight,f(e)},[e]),(0,a.useLayoutEffect)(()=>{if(!e||!d||t===void 0)return;let n=Zn(t);if(n===null||document.activeElement!==n)return;let r=s.current,i=0,a=!1,o=()=>{$n(r,n),a||(i=requestAnimationFrame(o))};return Promise.allSettled(r.getAnimations().map(e=>e.finished)).then(()=>{a=!0,cancelAnimationFrame(i),$n(r,n)}),i=requestAnimationFrame(o),()=>{a=!0,cancelAnimationFrame(i)}},[e,d,t]),(0,a.useLayoutEffect)(()=>{if(e||d||!l)return;let n=s.current,i=t===void 0?null:Zn(t),a=i!==null&&i.getBoundingClientRect().top<Qn(i).top;n.contains(document.activeElement)&&i?.focus({preventScroll:!0});let o=!1,f=()=>{o||(r||u(!1),a&&i?.scrollIntoView({block:`nearest`,behavior:`instant`}),c.current?.())},p=n.getAnimations();return p.length===0?f():Promise.allSettled(p.map(e=>e.finished)).then(f),()=>{o=!0}},[e,d,l,t,r]),(0,B.jsx)(`div`,{ref:s,id:t,className:`ui-fold__body${d?` ui-fold__body--open`:``}${r?` ui-fold__body--preview`:``} ${n}`,inert:!e&&!r,"aria-hidden":!e&&!r||void 0,children:(0,B.jsx)(`div`,{className:`ui-fold__clip`,children:l&&(typeof o==`function`?o():o)})})}var Zn=e=>document.querySelector(`[aria-controls="${CSS.escape(e)}"]`);function Qn(e){let t=e.parentElement;for(;t&&!/(auto|scroll)/.test(getComputedStyle(t).overflowY);)t=t.parentElement;if(t!==null){let e=t.getBoundingClientRect(),n=getComputedStyle(t),r=e=>parseFloat(e)||0;return{scroller:t,top:e.top+r(n.scrollPaddingTop),bottom:e.top+t.clientHeight-r(n.scrollPaddingBottom)}}let n=parseFloat(getComputedStyle(document.documentElement).getPropertyValue(`--header-height`))||0;return{scroller:document.scrollingElement??document.documentElement,top:n,bottom:window.innerHeight}}function $n(e,t){let n=Qn(t),r=e.getBoundingClientRect().bottom-n.bottom,i=t.getBoundingClientRect().top-n.top,a=Math.min(r,i);a>.5&&(n.scroller.scrollTop+=a)}function er({children:e,className:t,onClosed:n}){let r=e!=null&&e!==!1,[i,o]=(0,a.useState)(e);return r&&i!==e&&o(e),(0,B.jsx)(Xn,{open:r,className:t,onClosed:n,children:r?e:i})}function tr({items:e}){let[t,n]=(0,a.useState)(e),[r,i]=(0,a.useState)(e);if(t!==e){n(e);let t=[...e];r.forEach((n,r)=>{e.some(e=>e.key===n.key)||t.splice(Math.min(r,t.length),0,n)}),i(t)}return r.length===0?null:(0,B.jsx)(`div`,{className:`ui-fold-list`,children:r.map(t=>{let n=e.find(e=>e.key===t.key);return(0,B.jsx)(er,{onClosed:()=>i(e=>e.filter(e=>e.key!==t.key)),children:n===void 0?null:(0,B.jsx)(`div`,{className:`ui-fold-list__item`,children:n.children})},t.key)})})}function nr({summary:e,className:t=``,summaryClassName:n=``,bodyClassName:r,open:i,defaultOpen:o=!1,onOpenChange:s,header:c,children:l}){let[u,d]=(0,a.useState)(o),[f,p]=(0,a.useState)(o);f!==o&&(p(o),d(o));let m=(0,a.useId)(),h=i??u,g=(0,B.jsx)(Yn,{className:n,"aria-expanded":h,"aria-controls":m,onClick:()=>{d(!h),s?.(!h)},children:e});return(0,B.jsxs)(`div`,{className:`ui-fold ${t}`,"data-open":h,children:[c===void 0?g:c(g),(0,B.jsx)(Xn,{id:m,open:h,className:r,children:l})]})}var rr=null;typeof document<`u`&&document.addEventListener(`click`,e=>{rr=e.target instanceof Element?e.target.closest(`button`):null,setTimeout(()=>rr=null)},!0);function ir(){let{command:e,state:t}=tn(),[n,r]=(0,a.useState)(!1),[i,o]=(0,a.useState)(null);return{send:async(n,i)=>{let a=rr;a?.setAttribute(`aria-busy`,`true`),r(!0),o(null);try{if(await e(n,i),(n===`settings`||n===`project/settings`)&&typeof i?.provider==`string`&&i.provider!==``&&i.provider!==i.base?.provider){let e=t?.cliCopies?.[i.provider];e?.source===`checked`&&e.status!==`ready`&&window.dispatchEvent(new CustomEvent(`even-keel:cli-consent`,{detail:i.provider}))}if(n===`settings`&&i?.cli){let e=i.base?.cli;for(let[n,r]of Object.entries(i.cli))r===`checked`&&e?.[n]!==r&&t?.cliCopies?.[n]?.status!==`ready`&&window.dispatchEvent(new CustomEvent(`even-keel:cli-consent`,{detail:n}))}return!0}catch(e){return o(v(e)),!1}finally{a?.removeAttribute(`aria-busy`),r(!1)}},sending:n,failure:i}}function ar(e,t){let[n,r]=(0,a.useState)(null);return(0,a.useEffect)(()=>{if(n===null)return;let e=setTimeout(()=>r(null),t);return()=>clearTimeout(e)},[n,t]),{on:n===e,begin:()=>r(e)}}function or(e,t,n){return{onPointerDown:n=>{e.current=n.button===0&&t(n.target)},onMouseDown:e=>{t(e.target)&&e.preventDefault()},onPointerUp:r=>{let i=e.current;e.current=!1,i&&r.button===0&&t(r.target)&&n()}}}function sr(e,t,n){return or((0,a.useRef)(!1),t=>t!==null&&(t===e.current||n!==void 0&&t instanceof Element&&n(t)),t)}var cr=150,lr=6,ur=8,dr=0,fr=-1/0;function pr(e,t,n){return t>0||e-n<=300?0:700}function mr(e=!0,t=`end`){let[n,r]=(0,a.useState)(!1),i=(0,a.useRef)(null),o=(0,a.useRef)(null),s=(0,a.useRef)(void 0),c=(0,a.useRef)(void 0),l=n&&e;(0,a.useEffect)(()=>()=>{window.clearTimeout(s.current),window.clearTimeout(c.current)},[]),(0,a.useLayoutEffect)(()=>{let e=o.current,n=i.current;if(!l||e===null||n===null)return;dr+=1,e.showPopover(),hr(e,n.getBoundingClientRect(),t);let a=e=>e.stopPropagation(),s=e=>{e.target instanceof Node&&n.contains(e.target)||r(!1)};return e.addEventListener(`pointerdown`,a),document.addEventListener(`pointerdown`,s),()=>{e.removeEventListener(`pointerdown`,a),document.removeEventListener(`pointerdown`,s),e.matches(`:popover-open`)&&e.hidePopover(),--dr,fr=performance.now()}},[l,t]);let u=()=>{window.clearTimeout(s.current),window.clearTimeout(c.current)};return{shown:l,anchor:i,tip:o,show:()=>{u(),r(!0)},point:()=>{u();let e=pr(performance.now(),dr,fr);e===0?r(!0):c.current=window.setTimeout(()=>r(!0),e)},hide:()=>{u(),s.current=window.setTimeout(()=>r(!1),cr)},close:()=>{u(),r(!1)},toggle:()=>{u(),r(e=>!e)}}}function hr(e,t,n){let r=e.offsetWidth,i=e.offsetHeight,a=Math.min(Math.max(ur,n===`end`?t.right-r:t.left),window.innerWidth-r-ur),o=t.bottom+lr,s=o+i<=window.innerHeight-ur?o:Math.max(ur,t.top-lr-i);e.style.left=`${a}px`,e.style.top=`${s}px`}function gr({tip:e,focusable:t=!1,align:n=`end`,inline:r=!1,off:i=!1,className:o,children:s}){let{shown:c,anchor:l,tip:u,show:d,point:f,hide:p,close:m}=mr(!i,n),h=(0,a.useId)(),g=r?`span`:`div`;return(0,a.createElement)(g,{ref:l,className:o===void 0?`tipped`:`tipped ${o}`,tabIndex:t?0:void 0,"aria-describedby":h,onMouseEnter:f,onMouseLeave:p,onFocus:d,onBlur:p,onClick:d,onKeyDown:e=>{e.key===`Escape`&&c&&(e.preventDefault(),e.stopPropagation(),m())}},s,(0,a.createElement)(g,{id:h,hidden:!0},e),c&&(0,a.createElement)(g,{ref:u,popover:`manual`,className:`tip`,role:`tooltip`},e))}var _r=[xt,ft,mt,pt],vr=[xt,ft,mt,pt];function yr(e){return _r.includes(e)}var br=`none`,xr={[xt]:[`auto`,`bg`,`sdk`],[ft]:[`sandbox`,`bypass`]},Sr={[xt]:[`sdk`]};function Cr(e,t){return t!==void 0&&Sr[e]?.includes(t)===!0}var wr=`-FIX`,Tr=/-FIX(\.\d+)?$/,Er=e=>`${e}${wr}`;function Dr(e,t){let n=e[t];return n===void 0?t:Object.keys(e).find(t=>e[t]===n)===t?n:`${n}_${Or(t)}`}var Or=e=>e.replace(/[^0-9a-z]/gi,``).slice(0,4).toUpperCase(),kr=(e,t)=>Er(Dr(e,t)),Ar=(e,t)=>Object.keys(e).find(n=>kr(e,n)===zr(t)),jr=e=>Tr.test(e),Mr=`-CARRY`,Nr=/-CARRY(\.\d+)?$/,Pr=(e,t)=>`${Dr(e,t)}${Mr}`,Fr=e=>Nr.test(e),Ir=(e,t)=>Object.keys(e).find(n=>Pr(e,n)===zr(t)),Lr=e=>jr(e)||Fr(e),Rr=(e,t)=>`${e}.${t}`,zr=e=>Fr(e)?e.replace(Nr,Mr):e.replace(Tr,wr);function Br(e,t){let n=t.filter(t=>zr(t.id)===e),r=n.at(-1);return r!==void 0&&r.end===null?r.id:Rr(e,n.length+1)}var Vr=[`urgent`,`high`,`medium`,`low`,`none`],Hr=/^([^|]+?)\s*(?:\|\s*(.*?))?$/;function Ur(e){let t=Hr.exec(e.trim());if(t===null)return null;let n=t[1].toLowerCase(),r=t[2];return!yr(n)||r===``?null:{provider:n,model:r??null}}function Wr({provider:e,model:t}){let n=`${e.charAt(0).toUpperCase()}${e.slice(1)}`;return t===null?n:`${n} | ${t}`}var Gr=[`Question`,`Вопрос`],Kr=[`Manual`,`Вручную`];function qr(e){return e.category!==`Won`&&e.category!==`Lost`}var Jr=new Intl.Collator(`en`,{numeric:!0}),Yr=(e,t)=>Jr.compare(e,t);function Xr(e,t=[]){let n=ri(e),r=new Map(t.map((e,t)=>[e,t])),i=ai(e),a=(e,t)=>(r.get(e)??1/0)-(r.get(t)??1/0)||(n.ranks.get(e)??1/0)-(n.ranks.get(t)??1/0)||i(e)-i(t)||Yr(e,t),o=new Map([...n.blockers].map(([e,t])=>[e,new Set([...t,...n.earlier.get(e)])])),s=new Map,c=[];for(let[e,t]of o){t.size===0&&c.push(e);for(let n of t){let t=s.get(n);t===void 0?s.set(n,[e]):t.push(e)}}c.sort(a);let l=[];for(;o.size>0;){let t=c.shift();if(t===void 0)throw li(o,n,e);l.push(t),o.delete(t);for(let e of s.get(t)??[]){let n=o.get(e);if(n!==void 0&&(n.delete(t),n.size===0)){let t=0,n=c.length;for(;t<n;){let r=t+n>>>1;a(c[r],e)<0?t=r+1:n=r}c.splice(t,0,e)}}}return l}function Zr(e,t,n){let r=new Map(e.map(e=>[e.id,e.blockedBy])),i=new Set(n);for(let e of t){if(!i.has(e)&&!(r.get(e)??[]).some(e=>i.has(e)))return e;i.add(e)}}function Qr(e,t,n){if(t.length===0)return e;let r=new Set(t),i=new Map(t.map(e=>[e,[]]));for(let a of[...e,...t])for(let e of n.get(a)??[])r.has(e)&&i.get(e).push(a);let a=new Map(e.map((e,t)=>[e,t])),o=new Map,s=e=>{if(a.has(e))return a.get(e);if(o.has(e))return o.get(e);o.set(e,1/0);let t=Math.min(1/0,...i.get(e).map(s));return o.set(e,t),t},c=new Map;for(let e of[...t].sort(Yr)){let t=s(e),n=c.get(t);n===void 0?c.set(t,[e]):n.push(e)}let l=e=>e===void 0?[]:$r(e,n);return[...e.flatMap((e,t)=>[...l(c.get(t)),e]),...l(c.get(1/0))]}function $r(e,t){let n=[...e],r=[];for(;n.length>0;){let e=n.findIndex(e=>!(t.get(e)??[]).some(e=>n.includes(e)));r.push(...n.splice(e<0?0:e,1))}return r}function ei(e){let t=ri(e);return new Map([...t.blockers].map(([e,n])=>[e,[...n,...t.earlier.get(e)]]))}function ti(e,t){let n=si(e.label),r=si(t.label);return(n===null||r===null?Number(n===null)-Number(r===null):ci(n,r))||ni(e.targetDate,t.targetDate)||Yr(e.label,t.label)}function ni(e,t){return e===null||t===null?Number(e===null)-Number(t===null):e-t}function ri(e){let t=new Set(e.map(e=>e.id)),n=new Map(e.map(e=>[e.id,e.blockedBy.filter(e=>t.has(e))])),r=ii(e);return{blockers:n,earlier:new Map(e.map(t=>{let n=r.get(t.id);return[t.id,n===void 0?[]:e.filter(e=>(r.get(e.id)??1/0)<n).map(e=>e.id)]})),ranks:r}}function ii(e){let t=e.flatMap(e=>e.milestone===null?[]:[{id:e.id,milestone:e.milestone}]).sort((e,t)=>ti(e.milestone,t.milestone)),n=new Map,r=0;for(let[e,{id:i,milestone:a}]of t.entries())e>0&&ti(t[e-1].milestone,a)!==0&&r++,n.set(i,r);return n}function ai(e){let t=new Map(e.map(e=>[e.id,Vr.indexOf(e.priority)]));return e=>t.get(e)??Vr.length}function oi(e){return new Map(e.flatMap(e=>e.milestone===null?[]:[[e.id,e.milestone.label]]))}function si(e){let t=/\d+(?:\.\d+)*/.exec(e);return t===null?null:t[0].split(`.`).map(Number)}function ci(e,t){for(let n=0;n<Math.max(e.length,t.length);n++){let r=(e[n]??-1)-(t[n]??-1);if(r!==0)return r}return 0}function li(e,t,n){let r=ui(new Map([...e.keys()].map(n=>[n,new Set(t.blockers.get(n).filter(t=>e.has(t)))])));if(r.size>0)return _(`order.cycle`,{path:di(r).join(` → `)});let i=oi(n);for(let n of[...e.keys()].sort(Yr)){let e=t.ranks.get(n);if(e===void 0)continue;let r=t.blockers.get(n).find(n=>(t.ranks.get(n)??-1)>e);if(r!==void 0)return _(`order.later`,{task:n,milestone:String(i.get(n)),blocker:r,blockerMilestone:String(i.get(r))})}return _(`order.against`,{path:di(e).join(` → `)})}function ui(e){let t=new Map([...e].map(([e,t])=>[e,new Set(t)]));for(;;){let e=[...t].filter(([,e])=>e.size===0).map(([e])=>e);if(e.length===0)return t;for(let n of e)t.delete(n);for(let n of t.values())for(let t of e)n.delete(t)}}function di(e){let t=[...e.keys()].sort(Yr)[0],n=[],r=new Map,i=t;for(;!r.has(i);)r.set(i,n.length),n.push(i),i=[...e.get(i)].sort(Yr)[0];let a=n.slice(r.get(i)),o=a.indexOf([...a].sort(Yr)[0]),s=[...a.slice(o),...a.slice(0,o)];return[...s,s[0]]}var fi=6e4,pi=60*fi,mi=24*pi;function hi(e,t){let n=Date.parse(e)-t.getTime(),{day:r,hour:i,minuteShort:a}=z.units;return n<fi?`<1${a}`:n>=mi?ki(Math.floor(n/mi),r,Math.floor(n%mi/pi),i):n>=pi?ki(Math.floor(n/pi),i,Math.floor(n%pi/fi),a):`${Math.floor(n/fi)}${a}`}function gi(e,t){return Ye(e,t,Ze)}function _i(e,t){let n=t.getTime()-Date.parse(e),{day:r,hour:i,minute:a,second:o}=z.units;return n<5e3?z.time.justNow:n<fi?z.time.ago(`${Math.floor(n/1e3)} ${o}`):n<pi?z.time.ago(`${Math.floor(n/fi)} ${a}`):n<mi?z.time.ago(`${Math.floor(n/pi)} ${i}`):z.time.ago(`${Math.floor(n/mi)} ${r}`)}function vi(e){return`${Math.max(1,Math.floor(e/fi))} ${z.units.minute}`}function yi(e){if(e<1e3)return String(e);let t=Math.round(e/1e3);return t<1e3?`${t}k`:`${Number((e/1e6).toFixed(1))}M`}function bi(e){let t=Math.max(0,Math.floor(e/1e3)),n=Math.floor(t/86400),r=Math.floor(t%86400/3600),i=Math.floor(t%3600/60),a=e=>String(e).padStart(2,`0`),o=a(t%60);return n>0?`${n} ${z.units.day} ${r}:${a(i)}:${o}`:r>0?`${r}:${a(i)}:${o}`:`${i}:${o}`}function xi(e){let t=Math.max(0,Math.floor(e/1e3)),{hour:n,minuteShort:r,second:i}=z.units,a=e=>String(e).padStart(2,`0`);return t<60?`${t}${i}`:t<3600?`${Math.floor(t/60)}${r} ${a(t%60)}${i}`:`${Math.floor(t/3600)}${n} ${a(Math.floor(t%3600/60))}${r}`}var Si=dt(e=>new Intl.DateTimeFormat(e,{hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`})),Ci=dt(e=>new Intl.DateTimeFormat(e,{day:`numeric`,month:`short`})),wi=dt(e=>new Intl.DateTimeFormat(e,{dateStyle:`medium`,timeStyle:`medium`,hourCycle:`h23`}));function Ti(e){return Si().format(new Date(e))}function Ei(e,t){let n=new Date(e);return n.toDateString()===t.toDateString()?Si().format(n):Ci().format(n)}function Di(e){return wi().format(new Date(e))}function Oi(e){let t=``;return e.map(e=>{if(e===``)return!1;let n=Ti(e)+new Date(e).toDateString();return n!==t&&(t=n,!0)})}function ki(e,t,n,r){return n===0?`${e}${t}`:`${e}${t} ${n}${r}`}function Ai(e,t,n){let r=e.works[t]?.[n];if(r===void 0||e.sessions.some(e=>e.task===n&&e.lamp===`working`))return null;let i=e.tasks.find(e=>e.id===n)?.status.category;if(i===`Won`||i===`Lost`)return(e.chain.leftovers[t]??[]).some(e=>e.task===n)?r:null;let a=e.chain.projects[t];return(e.chain.skipped[t]??[]).includes(n)?r:(a?.reviews??[]).some(e=>e.task===n)?r.files>0?r:null:a===void 0||a.error!==null||a.order.includes(n)||a.waiting.includes(n)?null:r}function ji(e,t,n){let r=t===void 0?null:new Set([t,...(e.config.feeds[t]??[]).map(e=>e.id)]),i=new Set(e.tasks.filter(e=>qr(e.status)).map(e=>e.id));return e.trackers.flatMap(e=>Object.entries(n(e)??{}).filter(([e])=>r===null||r.has(e)).flatMap(([,e])=>e).filter(e=>`task`in e.params&&i.has(e.params.task)))}function Mi(e,t){return e===null?[]:ji(e,t,e=>e.completionFailures).filter(e=>e.code===`tracker.completeRefused`||e.code===`statusMove.notDone`)}function Ni(e,t){return e===null?[]:ji(e,t,e=>e.moveFailures).filter(e=>e.code===`statusMove.refused`||e.code===`statusMove.outside`)}function Pi(e){return new Set(Mi(e).map(e=>e.params.task))}function Fi(e){return e.asking||e.ask!==null||e.waitingFor!==null||e.startupDialog!==null}function Ii(e,t,n=!1){return e?.status.category===`Won`?`done`:e?.status.category===`Lost`?`canceled`:n&&(t===null||!Fi(t))?`error`:t===null?e?.status.category===`UnStarted`?`backlog`:`ahead`:t.checkpoint&&(t.lamp===`waiting`||t.lamp===`finished`)?`handoff`:t.lamp===`finished`?`stopped`:t.lamp}function Li(e){let t=e.accounts.find(t=>t.key===e.active);return t===void 0?{kind:`unknown`,label:`Claude`}:Ri(t,e.login,e.accounts)}function Ri(e,t,n=[e]){if(t!==null&&t.target===e.key)return t.error===null?{kind:`login`,label:z.account.loggingIn}:{kind:`out`,label:z.account.loginFailed};let r=Ht(e,n);return e.status==null?{kind:`unknown`,label:r}:e.needsLogin?{kind:`out`,label:z.account.needsLogin}:{kind:`in`,label:e.name===null&&r===e.status.email?r.split(`@`)[0]:r}}var zi=864e5,Bi=7;function Vi(e,t){if(e===null)return{text:`—`,renew:!1};let n=Date.parse(e)-t.getTime();if(n<=0)return{text:z.account.expired,renew:!0};let r=Math.floor(n/zi);return{text:r===0?z.account.underDay:z.account.days(r),renew:r<Bi}}function Hi(e,t){let n=[e.limits?.fiveHour,e.limits?.sevenDay,e.limits?.month].filter(e=>e!=null&&e.usedPercentage>=100&&Date.parse(e.resetsAt)>t.getTime()).map(e=>e.resetsAt);return n.length===0?null:n.reduce((e,t)=>Date.parse(t)>Date.parse(e)?t:e)}function Ui(e,t){return e.status?.loggedIn===!0&&!e.needsLogin&&!e.removing&&Hi(e,t)===null}function Wi(e,t){return[...e.filter(e=>Ui(e,t)),...e.filter(e=>!Ui(e,t))]}function Gi(e){return e===`done`||e===`canceled`||e===`fixed`}var Ki=3e5,qi=8,Ji=(e,t)=>e.localeCompare(t,`en`,{numeric:!0});function Yi(e,t){return e.tasks.filter(e=>e.project===t)}function Xi(e,t){return e.lamp===`waiting`&&e.contextTokens===0&&e.feed.length===0&&!e.asking&&e.startupDialog===null&&e.apiError===null&&t.getTime()-Date.parse(e.startedAt)<=Ki}function Zi(e,t,n=new Set,r=new Date){let i=new Set(t.filter(e=>qr(e.status)).map(e=>e.id)),a=e=>Date.parse(e.lastActivityAt??e.startedAt);return e.filter(e=>e.lamp===`waiting`&&!Xi(e,r)&&e.apiErrorKind!==`transient`&&!e.checkpoint&&(i.has(e.task)||Lr(e.task))).filter(e=>!n.has(e.task)||Fi(e)).sort((e,t)=>a(e)-a(t))}function Qi(e){return e.session!==null&&(e.current||e.session.lamp!==`finished`)}function $i(e){return e.filter(e=>e.how===`checkpoint`).length}function ea(e){let t={checkpoint:0,limit:0,relay:0,restart:0,compactions:0,total:0};for(let n of e)n.how===`checkpoint`||n.how===`restart`?t[n.how]++:n.how===`relay`&&t[n.cause===void 0||n.cause===`limit`||n.cause===`credit`?`limit`:`relay`]++,t.compactions+=n.compactions??0;return t.total=t.checkpoint+t.limit+t.relay+t.restart+t.compactions,t}function ta(e){return e.replace(/-(\d+|FIX|CARRY)$/,``)}function na(e,t){if(e===null)return ta(zr(t));if(jr(t))return Ar(e.projectKeys,t)??ta(zr(t));if(Fr(t))return ra(e,t)??ta(zr(t));let n=e.tasks.find(e=>e.id===t)?.project;if(n!==void 0)return n;let r=ta(t),i=e.config?.feeds??{};return Object.keys(e.taskPrefixes).find(t=>e.taskPrefixes[t]===r)??Object.keys(i).find(e=>i[e].some(e=>(e.prefix??e.key)===r))??r}function ra(e,t){let n=Ir(e.projectKeys,t),r=n===void 0?void 0:e.forwards?.[n]?.into,i=zr(t);return r??Object.keys(e.fixes??{}).find(t=>e.fixes[t].some(e=>zr(e.id)===i))}function ia(e,t){let n=Ir(e.projectKeys,t);return n===void 0?ta(zr(t)):ka(e,n)}function aa(e,t){let n=new Set([...t?.order??[],...t?.waiting??[]]),r=e.filter(e=>e.status.category===`Won`).length;return{done:r,total:r+e.filter(e=>e.status.category!==`Won`&&e.status.category!==`Lost`&&n.has(e.id)).length,backlog:t?.backlog.length??0}}function oa(e,t){let n=new Map(Yi(e,t).map(e=>[e.id,e]));return(e.chain.projects[t]?.backlog??[]).flatMap(e=>n.get(e)??[])}function sa(e,t){return Object.fromEntries((e.chain.projects[t]?.backlog??[]).flatMap(n=>{let r=Ai(e,t,n);return r===null?[]:[[n,r]]}))}var ca={blockers:[],dependents:[]};function la(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map;for(let t of e)if(qr(t.status))for(let e of t.blockedBy)r.set(e,[...r.get(e)??[],t.id]);let i=e=>{let t=n.get(e);return t===void 0||qr(t.status)},a=e=>e.toSorted(Ji).map(e=>{let r=n.get(e);return{id:e,title:r?.title??null,lamp:Ii(r,$a(t,e)??null)}});return e=>{let t=n.get(e);return t===void 0||!qr(t.status)?ca:{blockers:a(t.blockedBy.filter(i)),dependents:a(r.get(e)??[])}}}function ua(e,t,n){let r=e.chain.projects[t],i=r?.landing;if(n===null||i===void 0||!Object.hasOwn(i,n))return null;let a=e.tasks.find(e=>e.id===n);if(a===void 0)return null;let o=r?.landingMilestones?.[n]??a.milestone;return{id:n,title:a.title,milestone:o?.label??null,before:i[n]??null}}var da=(e,t,n)=>e.trackers.some(e=>e[n]===!0&&e.projects.includes(t));function fa(e,t,n){let r=e.chain.projects[t],i=n.stage===`UnStarted`&&da(e,t,`ready`),a=r?.requiredLabel?.[n.id]===!1&&da(e,t,`relabel`);if(!i&&!a)return null;let o=r?.refused?.[n.id]??null;return n.locked&&o===null&&!Object.hasOwn(r?.landing??{},n.id)?null:{refused:o}}var pa=(e,t)=>e.sessions.some(e=>e.task===t&&e.lamp!==`finished`);function ma(e,t,n){return pa(e,n.id)?!1:(n.stage===`ToDo`||n.stage===`Active`)&&da(e,t,`unready`)||e.chain.projects[t]?.requiredLabel?.[n.id]===!0&&da(e,t,`relabel`)}function ha(e){return e.filter(e=>e.question&&qr(e.status)).length}function ga(e){return!e.locked&&(e.session!==null||e.start!==null)}function _a(e,t){let n=null;for(let r of t){let t=new Set(Yi(e,r).filter(e=>e.question&&qr(e.status)).map(e=>e.id));if(t.size===0)continue;let i=Ra(e,r).find(e=>t.has(e.id)&&ga(e));if(i!==void 0)return`${Da(r)}#${i.id}`;n??=Da(r)}return n}function va(e,t){return e.active.find(e=>e.project===t)}function ya(e){return e.active.length<e.parallel}function ba(e,t){let{queue:n}=e,r=va(e,t);if(r!==void 0)return r.paused?{kind:`paused`,error:r.error}:{kind:`running`,limitUntil:r.limitUntil??null,...r.slotWait===void 0?{}:{slotWait:r.slotWait.notice},...r.ciWait===void 0?{}:{ciWait:r.ciWait},...r.limitsWait===void 0?{}:{limitsWait:r.limitsWait}};let i=n.indexOf(t);return i<0?{kind:`idle`}:{kind:`queued`,position:i+1}}function xa(e,t){if(e.kind===`running`)return{enabled:[`stop`],primary:`stop`,off:`running`};if(e.kind===`paused`)return{enabled:[`resume`,`stop`],primary:`resume`,off:null};let n=e.kind===`queued`?`queued`:t===void 0?`notLoaded`:t.error===null?t.order.length===0?`empty`:null:`failed`;return n===null?{enabled:[`start`],primary:`start`,off:`idle`}:{enabled:[],primary:null,off:n}}function Sa(e){return e.state===`unread`?{tone:`warn`,text:z.banner.usageUnread(e.reason===null?null:ot(e.reason)),key:`unread:${e.since}`}:e.state===`off`?{tone:`error`,text:z.banner.usageOff(e.reason===null?null:ot(e.reason)),key:`off:${e.since}`}:null}function Ca(e,t){return z.banner.limitHold(gi(e,t))}function wa(e,t){return e.by===void 0?(e.after===!0?z.banner.afterGreenHold:e.local===!0?z.banner.checkHold:z.banner.ciHold)(e.commit.slice(0,7),gi(e.since,t)):z.banner.remoteFixHold(e.commit.slice(0,7),gi(e.since,t),e.by)}function Ta(e,t){return ot(m(`chain.limitsUnread`,{account:e.account,...e.next!==null&&{next:gi(e.next,t)}}))}function Ea(e,t){let n=va(e.chain,t)?.current?.task,{order:r=[],waiting:i=[]}=e.chain.projects[t]??{},a=e.chain.skipped[t]??[],o=n??Zr(Yi(e,t),r,[...a,...i]),s=o??r[0];if(s===void 0)return null;let c=e.tasks.find(e=>e.id===s);return{id:s,title:jr(s)?z.chain.fix:Fr(s)?z.chain.carry(ia(e,s)):c?.title??null,lamp:Ii(c,$a(e.sessions,s)??null,Pi(e).has(s)),next:n===void 0&&o!==void 0,...o===void 0&&{held:a.includes(s)?`skipped`:`blocked`}}}function Da(e){return`/p/${encodeURIComponent(e)}`}function Oa(e,t){if(e.projects.includes(t))return{project:t,byKey:!1};let n=e.projects.find(n=>e.projectKeys[n]===t);return n===void 0?{project:t,byKey:!1}:{project:n,byKey:!0}}function ka(e,t){return e?.projectLabels[t]??t}function Aa(e,t){return e.config.projects[t]?.name??null}function ja(e,t){let n=e.trackers.find(e=>e.projects.includes(t));if(n===void 0)return null;let r=e.config.projects[t]?.trackerProject??null;return{kind:n.kind,label:r===null?n.title:`${n.title} · ${r}`}}function Ma(e,t){let n=t=>e.config.trackers.find(e=>e.name===t)?.title??null,r=[{id:t,key:e.projectKeys[t]??t,tracker:n(e.trackers.find(e=>e.projects.includes(t))?.kind)},...(e.config.feeds[t]??[]).map(e=>({id:e.id,key:e.key,tracker:n(e.tracker)}))].flatMap(({id:t,...n})=>{let r=e.trackerUrls.pages[t]??null;return r===null?[]:[{url:r,...n}]});return r.map(({url:e,key:t,tracker:n})=>({url:e,tracker:r.filter(e=>e.tracker===n).length>1?n===null?t:`${n} · ${t}`:n}))}function Na(e,t){return e.config.projects[t]?.color??null}function Pa(e){return Object.fromEntries(Object.keys(e.config.projects).map(t=>[t,Na(e,t)]))}function Fa(e){let t={};for(let n of Object.keys(e.config.projects)){let r=e.projectKeys[n]??n;Object.hasOwn(t,r)||(t[r]=Na(e,n))}return t}function Ia(e,t,n,r){if(e.sessionId===null)return{phase:`launch`,since:e.starting??e.since};if(e.answering)return null;if(e.starting!==void 0)return{phase:`handover`,since:e.starting};let i=n.find(t=>t.sessionId===e.sessionId);if(i!==void 0&&i.answers+i.resumed>0)return null;let a=t?.sessionId===e.sessionId?t:null,o=i?.at??a?.startedAt;return o===void 0||r.getTime()-Date.parse(o)>Ki?null:a===null?{phase:`boot`,since:o}:a.contextTokens>0?null:a.lamp===`working`?{phase:`answer`,since:o}:Xi(a,r)?{phase:`boot`,since:o}:null}function La(e){return e.answering&&e.starting!==void 0?{answering:e.starting}:{}}function Ra(e,t,n=new Date){let r=Yi(e,t),i=e.chain.projects[t],a=[...r,...i?.outside??[]],o=new Map(a.map(e=>[e.id,e])),s=r.filter(e=>!qr(e.status)),c=ei(r.filter(e=>qr(e.status))),l=i===void 0||i.error!==null,u=new Set(l?[]:i.waiting),d=l?r.filter(e=>qr(e.status)).map(e=>e.id).sort(Ji):Qr(i.order,i.waiting,new Map(a.map(e=>[e.id,e.blockedBy]))),f=va(e.chain,t),p=f?.current?.task,m=f?.current??null,h=f?.current?.limit,g=h!==void 0&&h.acted===null?h:null,_=new Set(e.chain.skipped[t]??[]),v=kr(e.projectKeys,t),y=p===v&&!l&&f?.interrupted===void 0?Zr(r,i.order,[..._,...i.waiting]):void 0,b=e.fixes[t]??[],x=new Map(b.flatMap(e=>e.end===null?[]:[[e.id,e]])),S=t=>$a(e.sessions,t)??null,C=S(v),w=new Map((i?.reviews??[]).map(e=>[e.task,e])),T=eo(s,e.taskSessions,[...x.values()]),E=[...w.keys()].filter(e=>!T.includes(e)&&!d.includes(e)).sort(Ji),D=Pi(e),O=[...T,...E,...d].map(r=>{let i=x.get(r);if(i!==void 0){let t=e.taskSessions[r]??[],n=S(zr(r)),a=n!==null&&t.some(e=>e.sessionId===n.sessionId)?n:null;return{...Fr(r)?Ba(r,Ua(e,i),`done`,null,a,t):Ba(r,Ha(i),`fixed`,null,a,t),fix:i}}let a=o.get(r),s=$a(e.sessions,r)??null,l=s!==null&&m?.task===r&&m.answering?{...s,lamp:`working`,ask:null}:s!==null&&Xi(s,n)?{...s,lamp:`working`}:s,d=e.taskSessions[r]??[],h=Ii(a,l,D.has(r)),v=(e.chain.leftovers[t]??[]).filter(e=>e.task===r),b=Ai(e,t,r);return{id:r,title:a?.title??null,status:a?.status.name??null,stage:a?.status.category??null,lamp:h,open:a!==void 0&&qr(a.status)&&!u.has(r)&&!E.includes(r),locked:u.has(r),blockedBy:a?.blockedBy??[],milestone:a?.milestone?.label??null,after:c.get(r)??[],current:r===p,skipped:_.has(r),question:a?.question??!1,priority:a?.priority??`none`,estimate:a?.estimate??null,parent:a?.parent??null,labels:a?.labels??[],runLabels:(a?.labels??[]).filter(e=>Ur(e)!==null),session:l,sessions:d,limit:r===p?g:null,start:m?.task===r?Ia(m,s,d,n):null,...m?.task===r&&La(m),...r===f?.interrupted?.task&&{interrupted:!0},...r===y&&l!==null&&l.lamp!==`finished`&&{aside:!0},...f===void 0&&l!==null&&l.lamp!==`finished`&&{loose:!0},...w.has(r)&&{review:w.get(r)},...b!==null&&{work:b,...Gi(h)&&{leftovers:v.map(e=>e.notice)}}}});for(let e=O.length-2;e>=0;e--)O[e].locked&&(O[e].milestone=O[e+1].milestone);for(let[e,t]of O.entries())t.fix!==void 0&&(t.milestone=O[e-1]?.milestone??O.slice(e+1).find(e=>e.fix===void 0)?.milestone??null);let k=e=>{let t=e.findIndex(e=>e.open||e.locked);return t<0?e.length:t},ee=(t,r,i,a)=>{let o=Br(t,b),s=S(t),c=s!==null&&Xi(s,n)?{...s,lamp:`working`}:s,l=e.taskSessions[o]??[];return{...Ba(o,r,Ii(void 0,c),a[i]?.milestone??null,c,l),open:!0,current:t===p,limit:t===p?g:null,start:m?.task===t?Ia(m,s,l,n):null,...m?.task===t&&La(m)}},A=O,j=C!==null&&C.lamp!==`finished`&&b.filter(e=>jr(e.id)).at(-1)?.end==null;(p===v||j)&&(A=A.toSpliced(k(A),0,ee(v,z.chain.fix,k(A),A)));let M=new Set(Object.values(e.forwards).flatMap(e=>e.into===t&&e.agent!==void 0?[e.agent]:[]));p!==void 0&&Fr(p)&&M.add(p);for(let t of M){let n=ia(e,t);if(t===p){A=A.toSpliced(k(A),0,ee(t,z.chain.carry(n),k(A),A));continue}let r=f?.interrupted?.task??(p===v?Br(v,b):p),i=A.findIndex(e=>e.id===r),a=i<0?k(A):i+1;A=A.toSpliced(a,0,ee(t,z.chain.carryAsked(n),a,A))}return A}function za(e,t){if(!Lr(t)||e.some(e=>e.id===t))return null;let n=e.filter(e=>zr(e.id)===t);return(n.find(e=>e.fix===void 0)??n.findLast(e=>e.session?.task===t))?.id??null}function Ba(e,t,n,r,i,a){return{id:e,title:t,status:null,stage:null,lamp:n,open:!1,locked:!1,blockedBy:[],milestone:r,after:[],current:!1,skipped:!1,question:!1,priority:`none`,estimate:null,parent:null,labels:[],runLabels:[],session:i,sessions:a,limit:null,start:null}}var Va=7;function Ha(e){let t=e=>e?.slice(0,Va)??null;return e.end?.how===`landed`?z.chain.fixLanded(t(e.red),t(e.end.commit)):z.chain.fixDropped(t(e.red))}function Ua(e,t){let n=ia(e,t.id);return t.end?.how===`carried`?z.chain.carried(n,t.end.commits??0):z.chain.carryDropped(n)}function Wa(e,t,n=null){let r=Math.min(100,e/(n??t.window)*100);return{percent:r,level:r>=t.danger?`danger`:r>=t.warn?`warn`:`ok`}}function Ga(e,t){let n=e.queue.indexOf(t);return n<0?null:n>0?e.queue[n-1]:e.active.length===1?e.active[0].project:null}function Ka(e,t,n=!1){let r=Date.parse(e.startedAt),i=e.lamp===`finished`||n?Date.parse(e.lastActivityAt??e.startedAt):t.getTime();return Math.max(0,i-r)}var qa={"5m":3e5,"30m":18e5,"1h":36e5};function Ja(e,t){let n=Math.max(0,Date.parse(e.until)-t.getTime());return{left:n,level:n===0?`cold`:n<qa[e.ttl]/5?`warn`:`ok`}}function Ya(e,t){return Math.min(1,Ja(e,t).left/qa[e.ttl])}function Xa(e,t,n){if(e===null||n===`finished`)return`ok`;let{level:r}=Ja(e,t);return r===`cold`?`danger`:r}function Za(e){return e.input+e.output+e.cacheRead+e.cacheWrite}function Qa(e,t){if(Lr(t))return null;let n=ta(t),r=Object.hasOwn(e.projects,n)?e.projects[n]:e.default;return r===null?null:r.replaceAll(`{id}`,t).replaceAll(`{number}`,t.slice(n.length+1))}function $a(e,t){let n=e.filter(e=>e.task===t);return n.find(e=>e.lamp!==`finished`)??n.at(-1)}function eo(e,t,n){let r;try{r=Xr(e)}catch{r=e.map(e=>e.id).sort(Ji)}let i=new Map(n.map(e=>[e.id,e.end.at])),a=e=>i.get(e)??t[e]?.reduce((e,t)=>t.at>e?t.at:e,``)??``,o=r.filter(e=>a(e)===``),s=[...r.filter(e=>a(e)!==``),...i.keys()].sort((e,t)=>a(e).localeCompare(a(t)));return[...o,...s]}function to(e){if(e?.month===void 0){let t=[`fiveHour`,`sevenDay`].filter(t=>e?.absent?.includes(t)!==!0),n=t.filter(t=>e?.[t]!=null);return e?.source===`api`&&n.length>0?n:[...t]}return[...[`fiveHour`,`sevenDay`].filter(t=>e[t]!==null),`month`]}var no=8;function ro(e,t){if(e===void 0)return null;let n=e.accounts.find(e=>e.status?.email===t);return n===void 0?null:e.accounts.map(e=>e.key).sort().indexOf(n.key)%no+1}function io(e,t,n){return n!=null&&!(e?.accounts.some(e=>e.status?.email===n&&e.projects.includes(t))??!1)}function ao(e,t){let n=t.status?.email??null,r=n===null?null:ro(e,n);return r===null?e.accounts.map(e=>e.key).sort().indexOf(t.key)%no+1:r}var oo=[`claude`,`codex`,`opencode`,`copilot`];function so(e){return e.apiKey?`apiKey`:`cli`}var co=[`zen`,`claudeSubscription`,`chatgpt`,`github`,`anthropicKey`,`openaiKey`,`other`],lo={claudeSubscription:`anthropic`,anthropicKey:`anthropic`,chatgpt:`openai`,openaiKey:`openai`,zen:`zen`,github:`github`,other:null};function uo(e){if(e.agent===`copilot`)return`github`;if(e.agent===`claude`)return e.apiKey?`anthropicKey`:`claudeSubscription`;if(e.agent===`codex`)return e.apiKey?`openaiKey`:`chatgpt`;if(e.agent!==`opencode`)return`other`;let t=e.status?.subscriptionType?.split(`,`).map(e=>e.trim())??[];return e.apiKey?t.includes(`anthropic`)?`anthropicKey`:t.includes(`openai`)?`openaiKey`:`zen`:t.includes(`openai`)?`chatgpt`:t.includes(`github-copilot`)?`github`:t.includes(`anthropic`)?`claudeSubscription`:`zen`}function fo(e){return co.map(t=>({access:t,entries:e.filter(e=>uo(e)===t)})).filter(e=>e.entries.length>0)}function po({login:e}){return e?.agent===`codex`||e?.agent===`opencode`}function mo(e,t){return e.missing.includes(t)}var ho={claude:`login.claudeMissing`,codex:`login.codexMissing`,opencode:`login.opencodeMissing`,copilot:`login.copilotMissing`};function go(e,t){return e===null?[..._r]:_r.filter(n=>t.includes(n)||e.accounts.some(e=>e.agent===n))}function _o(e,t){let n=[...Wi(e.accounts,t)].sort((t,n)=>Number(n.key===e.active)-Number(t.key===e.active)||Number(vo(e,n))-Number(vo(e,t))),r=[...oo];return[...r,...new Set(n.map(e=>e.agent).filter(e=>!r.includes(e)))].map(e=>({agent:e,entries:n.filter(t=>t.agent===e)})).filter(e=>e.entries.length>0)}function vo(e,t){return e.active===t.key||e.apps.some(e=>e.account===t.key)||t.projects.length>0||t.sessions.length>0}function yo(e){let t=null;for(let n of to(e)){let r=e?.[n]??null;if(r===null||r.used!==void 0)continue;let i=Math.round(100-Math.min(Math.max(r.usedPercentage,0),100));(t===null||i<t.free)&&(t={span:n,free:i,window:r})}return t}function bo(e,t,n){if(e.missing.includes(t))return{state:`cliMissing`};let r=e.accounts.find(e=>e.key===n&&e.agent===t);return r===void 0?{state:`noAccount`}:Dt(r)?{state:`unsupported`,entry:r}:{state:r.needsLogin?`signIn`:`ready`,entry:r}}function xo(){}function So(e){let t=[],n=String(e||``),r=n.indexOf(`,`),i=0,a=!1;for(;!a;){r===-1&&(r=n.length,a=!0);let e=n.slice(i,r).trim();(e||!a)&&t.push(e),i=r+1,r=n.indexOf(`,`,i)}return t}function Co(e,t){let n=t||{};return(e[e.length-1]===``?[...e,``]:e).join((n.padRight?` `:``)+`,`+(n.padLeft===!1?``:` `)).trim()}var wo=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,To=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,Eo={};function Do(e,t){return((t||Eo).jsx?To:wo).test(e)}var Oo=/[ \t\n\f\r]/g;function ko(e){return typeof e==`object`?e.type===`text`&&Ao(e.value):Ao(e)}function Ao(e){return e.replace(Oo,``)===``}var jo=class{constructor(e,t,n){this.normal=t,this.property=e,n&&(this.space=n)}};jo.prototype.normal={},jo.prototype.property={},jo.prototype.space=void 0;function Mo(e,t){let n={},r={};for(let t of e)Object.assign(n,t.property),Object.assign(r,t.normal);return new jo(n,r,t)}function No(e){return e.toLowerCase()}var V=class{constructor(e,t){this.attribute=t,this.property=e}};V.prototype.attribute=``,V.prototype.booleanish=!1,V.prototype.boolean=!1,V.prototype.commaOrSpaceSeparated=!1,V.prototype.commaSeparated=!1,V.prototype.defined=!1,V.prototype.mustUseProperty=!1,V.prototype.number=!1,V.prototype.overloadedBoolean=!1,V.prototype.property=``,V.prototype.spaceSeparated=!1,V.prototype.space=void 0;var Po=e({boolean:()=>H,booleanish:()=>U,commaOrSpaceSeparated:()=>Ro,commaSeparated:()=>Lo,number:()=>W,overloadedBoolean:()=>Io,spaceSeparated:()=>G}),Fo=0,H=zo(),U=zo(),Io=zo(),W=zo(),G=zo(),Lo=zo(),Ro=zo();function zo(){return 2**++Fo}var Bo=Object.keys(Po),Vo=class extends V{constructor(e,t,n,r){let i=-1;if(super(e,t),Ho(this,`space`,r),typeof n==`number`)for(;++i<Bo.length;){let e=Bo[i];Ho(this,Bo[i],(n&Po[e])===Po[e])}}};Vo.prototype.defined=!0;function Ho(e,t,n){n&&(e[t]=n)}function Uo(e){let t={},n={};for(let[r,i]of Object.entries(e.properties)){let a=new Vo(r,e.transform(e.attributes||{},r),i,e.space);e.mustUseProperty&&e.mustUseProperty.includes(r)&&(a.mustUseProperty=!0),t[r]=a,n[No(r)]=r,n[No(a.attribute)]=r}return new jo(t,n,e.space)}var Wo=Uo({properties:{ariaActiveDescendant:null,ariaAtomic:U,ariaAutoComplete:null,ariaBusy:U,ariaChecked:U,ariaColCount:W,ariaColIndex:W,ariaColSpan:W,ariaControls:G,ariaCurrent:null,ariaDescribedBy:G,ariaDetails:null,ariaDisabled:U,ariaDropEffect:G,ariaErrorMessage:null,ariaExpanded:U,ariaFlowTo:G,ariaGrabbed:U,ariaHasPopup:null,ariaHidden:U,ariaInvalid:null,ariaKeyShortcuts:null,ariaLabel:null,ariaLabelledBy:G,ariaLevel:W,ariaLive:null,ariaModal:U,ariaMultiLine:U,ariaMultiSelectable:U,ariaOrientation:null,ariaOwns:G,ariaPlaceholder:null,ariaPosInSet:W,ariaPressed:U,ariaReadOnly:U,ariaRelevant:null,ariaRequired:U,ariaRoleDescription:G,ariaRowCount:W,ariaRowIndex:W,ariaRowSpan:W,ariaSelected:U,ariaSetSize:W,ariaSort:null,ariaValueMax:W,ariaValueMin:W,ariaValueNow:W,ariaValueText:null,role:null},transform(e,t){return t===`role`?t:`aria-`+t.slice(4).toLowerCase()}});function Go(e,t){return t in e?e[t]:t}function Ko(e,t){return Go(e,t.toLowerCase())}var qo=Uo({attributes:{acceptcharset:`accept-charset`,classname:`class`,htmlfor:`for`,httpequiv:`http-equiv`},mustUseProperty:[`checked`,`multiple`,`muted`,`selected`],properties:{abbr:null,accept:Lo,acceptCharset:G,accessKey:G,action:null,allow:null,allowFullScreen:H,allowPaymentRequest:H,allowUserMedia:H,alpha:H,alt:null,as:null,async:H,autoCapitalize:null,autoComplete:G,autoFocus:H,autoPlay:H,blocking:G,capture:null,charSet:null,checked:H,cite:null,className:G,closedBy:null,colorSpace:null,cols:W,colSpan:W,command:null,commandFor:null,content:null,contentEditable:U,controls:H,controlsList:G,coords:W|Lo,crossOrigin:null,data:null,dateTime:null,decoding:null,default:H,defer:H,dir:null,dirName:null,disabled:H,download:Io,draggable:U,encType:null,enterKeyHint:null,fetchPriority:null,form:null,formAction:null,formEncType:null,formMethod:null,formNoValidate:H,formTarget:null,headers:G,height:W,hidden:Io,high:W,href:null,hrefLang:null,htmlFor:G,httpEquiv:G,id:null,imageSizes:null,imageSrcSet:null,inert:H,inputMode:null,integrity:null,is:null,isMap:H,itemId:null,itemProp:G,itemRef:G,itemScope:H,itemType:G,kind:null,label:null,lang:null,language:null,list:null,loading:null,loop:H,low:W,manifest:null,max:null,maxLength:W,media:null,method:null,min:null,minLength:W,multiple:H,muted:H,name:null,nonce:null,noModule:H,noValidate:H,onAbort:null,onAfterPrint:null,onAuxClick:null,onBeforeMatch:null,onBeforePrint:null,onBeforeToggle:null,onBeforeUnload:null,onBlur:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onContextLost:null,onContextMenu:null,onContextRestored:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnded:null,onError:null,onFocus:null,onFormData:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLanguageChange:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadEnd:null,onLoadStart:null,onMessage:null,onMessageError:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRejectionHandled:null,onReset:null,onResize:null,onScroll:null,onScrollEnd:null,onSecurityPolicyViolation:null,onSeeked:null,onSeeking:null,onSelect:null,onSlotChange:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnhandledRejection:null,onUnload:null,onVolumeChange:null,onWaiting:null,onWheel:null,open:H,optimum:W,pattern:null,ping:G,placeholder:null,playsInline:H,popover:null,popoverTarget:null,popoverTargetAction:null,poster:null,preload:null,readOnly:H,referrerPolicy:null,rel:G,required:H,reversed:H,rows:W,rowSpan:W,sandbox:G,scope:null,scoped:H,seamless:H,selected:H,shadowRootClonable:H,shadowRootCustomElementRegistry:H,shadowRootDelegatesFocus:H,shadowRootMode:null,shadowRootSerializable:H,shape:null,size:W,sizes:null,slot:null,span:W,spellCheck:U,src:null,srcDoc:null,srcLang:null,srcSet:null,start:W,step:null,style:null,tabIndex:W,target:null,title:null,translate:null,type:null,typeMustMatch:H,useMap:null,value:U,width:W,wrap:null,writingSuggestions:null,align:null,aLink:null,archive:G,axis:null,background:null,bgColor:null,border:W,borderColor:null,bottomMargin:W,cellPadding:null,cellSpacing:null,char:null,charOff:null,classId:null,clear:null,code:null,codeBase:null,codeType:null,color:null,compact:H,declare:H,event:null,face:null,frame:null,frameBorder:null,hSpace:W,leftMargin:W,link:null,longDesc:null,lowSrc:null,marginHeight:W,marginWidth:W,noResize:H,noHref:H,noShade:H,noWrap:H,object:null,profile:null,prompt:null,rev:null,rightMargin:W,rules:null,scheme:null,scrolling:U,standby:null,summary:null,text:null,topMargin:W,valueType:null,version:null,vAlign:null,vLink:null,vSpace:W,allowTransparency:null,autoCorrect:null,autoSave:null,credentialless:H,disablePictureInPicture:H,disableRemotePlayback:H,exportParts:Lo,part:G,prefix:null,property:null,results:W,security:null,unselectable:null},space:`html`,transform:Ko}),Jo=Uo({attributes:{accentHeight:`accent-height`,alignmentBaseline:`alignment-baseline`,arabicForm:`arabic-form`,baselineShift:`baseline-shift`,capHeight:`cap-height`,className:`class`,clipPath:`clip-path`,clipRule:`clip-rule`,colorInterpolation:`color-interpolation`,colorInterpolationFilters:`color-interpolation-filters`,colorProfile:`color-profile`,colorRendering:`color-rendering`,crossOrigin:`crossorigin`,dataType:`datatype`,dominantBaseline:`dominant-baseline`,enableBackground:`enable-background`,fillOpacity:`fill-opacity`,fillRule:`fill-rule`,floodColor:`flood-color`,floodOpacity:`flood-opacity`,fontFamily:`font-family`,fontSize:`font-size`,fontSizeAdjust:`font-size-adjust`,fontStretch:`font-stretch`,fontStyle:`font-style`,fontVariant:`font-variant`,fontWeight:`font-weight`,glyphName:`glyph-name`,glyphOrientationHorizontal:`glyph-orientation-horizontal`,glyphOrientationVertical:`glyph-orientation-vertical`,hrefLang:`hreflang`,horizAdvX:`horiz-adv-x`,horizOriginX:`horiz-origin-x`,horizOriginY:`horiz-origin-y`,imageRendering:`image-rendering`,letterSpacing:`letter-spacing`,lightingColor:`lighting-color`,markerEnd:`marker-end`,markerMid:`marker-mid`,markerStart:`marker-start`,maskType:`mask-type`,navDown:`nav-down`,navDownLeft:`nav-down-left`,navDownRight:`nav-down-right`,navLeft:`nav-left`,navNext:`nav-next`,navPrev:`nav-prev`,navRight:`nav-right`,navUp:`nav-up`,navUpLeft:`nav-up-left`,navUpRight:`nav-up-right`,onAbort:`onabort`,onActivate:`onactivate`,onAfterPrint:`onafterprint`,onBeforePrint:`onbeforeprint`,onBegin:`onbegin`,onCancel:`oncancel`,onCanPlay:`oncanplay`,onCanPlayThrough:`oncanplaythrough`,onChange:`onchange`,onClick:`onclick`,onClose:`onclose`,onCopy:`oncopy`,onCueChange:`oncuechange`,onCut:`oncut`,onDblClick:`ondblclick`,onDrag:`ondrag`,onDragEnd:`ondragend`,onDragEnter:`ondragenter`,onDragExit:`ondragexit`,onDragLeave:`ondragleave`,onDragOver:`ondragover`,onDragStart:`ondragstart`,onDrop:`ondrop`,onDurationChange:`ondurationchange`,onEmptied:`onemptied`,onEnd:`onend`,onEnded:`onended`,onError:`onerror`,onFocus:`onfocus`,onFocusIn:`onfocusin`,onFocusOut:`onfocusout`,onHashChange:`onhashchange`,onInput:`oninput`,onInvalid:`oninvalid`,onKeyDown:`onkeydown`,onKeyPress:`onkeypress`,onKeyUp:`onkeyup`,onLoad:`onload`,onLoadedData:`onloadeddata`,onLoadedMetadata:`onloadedmetadata`,onLoadStart:`onloadstart`,onMessage:`onmessage`,onMouseDown:`onmousedown`,onMouseEnter:`onmouseenter`,onMouseLeave:`onmouseleave`,onMouseMove:`onmousemove`,onMouseOut:`onmouseout`,onMouseOver:`onmouseover`,onMouseUp:`onmouseup`,onMouseWheel:`onmousewheel`,onOffline:`onoffline`,onOnline:`ononline`,onPageHide:`onpagehide`,onPageShow:`onpageshow`,onPaste:`onpaste`,onPause:`onpause`,onPlay:`onplay`,onPlaying:`onplaying`,onPopState:`onpopstate`,onProgress:`onprogress`,onRateChange:`onratechange`,onRepeat:`onrepeat`,onReset:`onreset`,onResize:`onresize`,onScroll:`onscroll`,onSeeked:`onseeked`,onSeeking:`onseeking`,onSelect:`onselect`,onShow:`onshow`,onStalled:`onstalled`,onStorage:`onstorage`,onSubmit:`onsubmit`,onSuspend:`onsuspend`,onTimeUpdate:`ontimeupdate`,onToggle:`ontoggle`,onUnload:`onunload`,onVolumeChange:`onvolumechange`,onWaiting:`onwaiting`,onZoom:`onzoom`,overlinePosition:`overline-position`,overlineThickness:`overline-thickness`,paintOrder:`paint-order`,panose1:`panose-1`,pointerEvents:`pointer-events`,referrerPolicy:`referrerpolicy`,renderingIntent:`rendering-intent`,shapeRendering:`shape-rendering`,stopColor:`stop-color`,stopOpacity:`stop-opacity`,strikethroughPosition:`strikethrough-position`,strikethroughThickness:`strikethrough-thickness`,strokeDashArray:`stroke-dasharray`,strokeDashOffset:`stroke-dashoffset`,strokeLineCap:`stroke-linecap`,strokeLineJoin:`stroke-linejoin`,strokeMiterLimit:`stroke-miterlimit`,strokeOpacity:`stroke-opacity`,strokeWidth:`stroke-width`,tabIndex:`tabindex`,textAnchor:`text-anchor`,textDecoration:`text-decoration`,textRendering:`text-rendering`,transformOrigin:`transform-origin`,typeOf:`typeof`,underlinePosition:`underline-position`,underlineThickness:`underline-thickness`,unicodeBidi:`unicode-bidi`,unicodeRange:`unicode-range`,unitsPerEm:`units-per-em`,vAlphabetic:`v-alphabetic`,vHanging:`v-hanging`,vIdeographic:`v-ideographic`,vMathematical:`v-mathematical`,vectorEffect:`vector-effect`,vertAdvY:`vert-adv-y`,vertOriginX:`vert-origin-x`,vertOriginY:`vert-origin-y`,wordSpacing:`word-spacing`,writingMode:`writing-mode`,xHeight:`x-height`,playbackOrder:`playbackorder`,timelineBegin:`timelinebegin`},properties:{about:Ro,accentHeight:W,accumulate:null,additive:null,alignmentBaseline:null,alphabetic:W,amplitude:W,arabicForm:null,ascent:W,attributeName:null,attributeType:null,azimuth:W,bandwidth:null,baselineShift:null,baseFrequency:null,baseProfile:null,bbox:null,begin:null,bias:W,by:null,calcMode:null,capHeight:W,className:G,clip:null,clipPath:null,clipPathUnits:null,clipRule:null,color:null,colorInterpolation:null,colorInterpolationFilters:null,colorProfile:null,colorRendering:null,content:null,contentScriptType:null,contentStyleType:null,crossOrigin:null,cursor:null,cx:null,cy:null,d:null,dataType:null,defaultAction:null,descent:W,diffuseConstant:W,direction:null,display:null,dur:null,divisor:W,dominantBaseline:null,download:H,dx:null,dy:null,edgeMode:null,editable:null,elevation:W,enableBackground:null,end:null,event:null,exponent:W,externalResourcesRequired:null,fill:null,fillOpacity:W,fillRule:null,filter:null,filterRes:null,filterUnits:null,floodColor:null,floodOpacity:null,focusable:null,focusHighlight:null,fontFamily:null,fontSize:null,fontSizeAdjust:null,fontStretch:null,fontStyle:null,fontVariant:null,fontWeight:null,format:null,fr:null,from:null,fx:null,fy:null,g1:Lo,g2:Lo,glyphName:Lo,glyphOrientationHorizontal:null,glyphOrientationVertical:null,glyphRef:null,gradientTransform:null,gradientUnits:null,handler:null,hanging:W,hatchContentUnits:null,hatchUnits:null,height:null,href:null,hrefLang:null,horizAdvX:W,horizOriginX:W,horizOriginY:W,id:null,ideographic:W,imageRendering:null,initialVisibility:null,in:null,in2:null,intercept:W,k:W,k1:W,k2:W,k3:W,k4:W,kernelMatrix:Ro,kernelUnitLength:null,keyPoints:null,keySplines:null,keyTimes:null,kerning:null,lang:null,lengthAdjust:null,letterSpacing:null,lightingColor:null,limitingConeAngle:W,local:null,markerEnd:null,markerMid:null,markerStart:null,markerHeight:null,markerUnits:null,markerWidth:null,mask:null,maskContentUnits:null,maskType:null,maskUnits:null,mathematical:null,max:null,media:null,mediaCharacterEncoding:null,mediaContentEncodings:null,mediaSize:W,mediaTime:null,method:null,min:null,mode:null,name:null,navDown:null,navDownLeft:null,navDownRight:null,navLeft:null,navNext:null,navPrev:null,navRight:null,navUp:null,navUpLeft:null,navUpRight:null,numOctaves:null,observer:null,offset:null,onAbort:null,onActivate:null,onAfterPrint:null,onBeforePrint:null,onBegin:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnd:null,onEnded:null,onError:null,onFocus:null,onFocusIn:null,onFocusOut:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadStart:null,onMessage:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onMouseWheel:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRepeat:null,onReset:null,onResize:null,onScroll:null,onSeeked:null,onSeeking:null,onSelect:null,onShow:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnload:null,onVolumeChange:null,onWaiting:null,onZoom:null,opacity:null,operator:null,order:null,orient:null,orientation:null,origin:null,overflow:null,overlay:null,overlinePosition:W,overlineThickness:W,paintOrder:null,panose1:null,path:null,pathLength:W,patternContentUnits:null,patternTransform:null,patternUnits:null,phase:null,ping:G,pitch:null,playbackOrder:null,pointerEvents:null,points:null,pointsAtX:W,pointsAtY:W,pointsAtZ:W,preserveAlpha:null,preserveAspectRatio:null,primitiveUnits:null,propagate:null,property:Ro,r:null,radius:null,referrerPolicy:null,refX:null,refY:null,rel:Ro,rev:Ro,renderingIntent:null,repeatCount:null,repeatDur:null,requiredExtensions:Ro,requiredFeatures:Ro,requiredFonts:Ro,requiredFormats:Ro,resource:null,restart:null,result:null,rotate:null,rx:null,ry:null,scale:null,seed:null,shapeRendering:null,side:null,slope:null,snapshotTime:null,specularConstant:W,specularExponent:W,spreadMethod:null,spacing:null,startOffset:null,stdDeviation:null,stemh:null,stemv:null,stitchTiles:null,stopColor:null,stopOpacity:null,strikethroughPosition:W,strikethroughThickness:W,string:null,stroke:null,strokeDashArray:Ro,strokeDashOffset:null,strokeLineCap:null,strokeLineJoin:null,strokeMiterLimit:W,strokeOpacity:W,strokeWidth:null,style:null,surfaceScale:W,syncBehavior:null,syncBehaviorDefault:null,syncMaster:null,syncTolerance:null,syncToleranceDefault:null,systemLanguage:Ro,tabIndex:W,tableValues:null,target:null,targetX:W,targetY:W,textAnchor:null,textDecoration:null,textRendering:null,textLength:null,timelineBegin:null,title:null,transformBehavior:null,type:null,typeOf:Ro,to:null,transform:null,transformOrigin:null,u1:null,u2:null,underlinePosition:W,underlineThickness:W,unicode:null,unicodeBidi:null,unicodeRange:null,unitsPerEm:W,values:null,vAlphabetic:W,vMathematical:W,vectorEffect:null,vHanging:W,vIdeographic:W,version:null,vertAdvY:W,vertOriginX:W,vertOriginY:W,viewBox:null,viewTarget:null,visibility:null,width:null,widths:null,wordSpacing:null,writingMode:null,x:null,x1:null,x2:null,xChannelSelector:null,xHeight:W,y:null,y1:null,y2:null,yChannelSelector:null,z:null,zoomAndPan:null},space:`svg`,transform:Go}),Yo=Uo({properties:{xLinkActuate:null,xLinkArcRole:null,xLinkHref:null,xLinkRole:null,xLinkShow:null,xLinkTitle:null,xLinkType:null},space:`xlink`,transform(e,t){return`xlink:`+t.slice(5).toLowerCase()}}),Xo=Uo({attributes:{xmlnsxlink:`xmlns:xlink`},properties:{xmlnsXLink:null,xmlns:null},space:`xmlns`,transform:Ko}),Zo=Uo({properties:{xmlBase:null,xmlLang:null,xmlSpace:null},space:`xml`,transform(e,t){return`xml:`+t.slice(3).toLowerCase()}}),Qo={classId:`classID`,dataType:`datatype`,itemId:`itemID`,strokeDashArray:`strokeDasharray`,strokeDashOffset:`strokeDashoffset`,strokeLineCap:`strokeLinecap`,strokeLineJoin:`strokeLinejoin`,strokeMiterLimit:`strokeMiterlimit`,typeOf:`typeof`,xLinkActuate:`xlinkActuate`,xLinkArcRole:`xlinkArcrole`,xLinkHref:`xlinkHref`,xLinkRole:`xlinkRole`,xLinkShow:`xlinkShow`,xLinkTitle:`xlinkTitle`,xLinkType:`xlinkType`,xmlnsXLink:`xmlnsXlink`},$o=/[A-Z]/g,es=/-[a-z]/g,ts=/^data[-\w.:]+$/i;function ns(e,t){let n=No(t),r=t,i=V;if(n in e.normal)return e.property[e.normal[n]];if(n.length>4&&n.slice(0,4)===`data`&&ts.test(t)){if(t.charAt(4)===`-`){let e=t.slice(5).replace(es,is);r=`data`+e.charAt(0).toUpperCase()+e.slice(1)}else{let e=t.slice(4);if(!es.test(e)){let n=e.replace($o,rs);n.charAt(0)!==`-`&&(n=`-`+n),t=`data`+n}}i=Vo}return new i(r,t)}function rs(e){return`-`+e.toLowerCase()}function is(e){return e.charAt(1).toUpperCase()}var as=Mo([Wo,qo,Yo,Xo,Zo],`html`),os=Mo([Wo,Jo,Yo,Xo,Zo],`svg`);function ss(e){let t=String(e||``).trim();return t?t.split(/[ \t\n\r\f]+/g):[]}function cs(e){return e.join(` `).trim()}var ls=n(((e,t)=>{var n=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,r=/\n/g,i=/^\s*/,a=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,o=/^:\s*/,s=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,c=/^[;\s]*/,l=/^\s+|\s+$/g;function u(e,t){if(typeof e!=`string`)throw TypeError(`First argument must be a string`);if(!e)return[];t||={};var l=1,u=1;function f(e){var t=e.match(r);t&&(l+=t.length);var n=e.lastIndexOf(`
4
+ `);u=~n?e.length-n:u+e.length}function p(){var e={line:l,column:u};return function(t){return t.position=new m(e),_(),t}}function m(e){this.start=e,this.end={line:l,column:u},this.source=t.source}m.prototype.content=e;function h(n){var r=Error(t.source+`:`+l+`:`+u+`: `+n);if(r.reason=n,r.filename=t.source,r.line=l,r.column=u,r.source=e,!t.silent)throw r}function g(t){var n=t.exec(e);if(n){var r=n[0];return f(r),e=e.slice(r.length),n}}function _(){g(i)}function v(e){var t;for(e||=[];t=y();)t!==!1&&e.push(t);return e}function y(){var t=p();if(e.charAt(0)==`/`&&e.charAt(1)==`*`){for(var n=2;e.charAt(n)!=``&&(e.charAt(n)!=`*`||e.charAt(n+1)!=`/`);)++n;if(n+=2,e.charAt(n-1)===``)return h(`End of comment missing`);var r=e.slice(2,n-2);return u+=2,f(r),e=e.slice(n),u+=2,t({type:`comment`,comment:r})}}function b(){var e=p(),t=g(a);if(t){if(y(),!g(o))return h(`property missing ':'`);var r=g(s),i=e({type:`declaration`,property:d(t[0].replace(n,``)),value:r?d(r[0].replace(n,``)):``});return g(c),i}}function x(){var e=[];v(e);for(var t;t=b();)t!==!1&&(e.push(t),v(e));return e}return _(),x()}function d(e){return e?e.replace(l,``):``}t.exports=u})),us=n(((e,t,n)=>{var r=n&&n.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.default=a;var i=r(ls());function a(e,t){let n=null;if(!e||typeof e!=`string`)return n;let r=(0,i.default)(e),a=typeof t==`function`;return r.forEach(e=>{if(e.type!==`declaration`)return;let{property:r,value:i}=e;a?t(r,i,e):i&&(n||={},n[r]=i)}),n}})),ds=n((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.camelCase=void 0;var t=/^--[a-zA-Z0-9_-]+$/,n=/-([a-z])/g,r=/^[^-]+$/,i=/^-(webkit|moz|ms|o|khtml)-/,a=/^-(ms)-/,o=function(e){return!e||r.test(e)||t.test(e)},s=function(e,t){return t.toUpperCase()},c=function(e,t){return`${t}-`};e.camelCase=function(e,t){return t===void 0&&(t={}),o(e)?e:(e=e.toLowerCase(),e=t.reactCompat?e.replace(a,c):e.replace(i,c),e.replace(n,s))}})),fs=n(((e,t,n)=>{var r=(n&&n.__importDefault||function(e){return e&&e.__esModule?e:{default:e}})(us()),i=ds();function a(e,t){var n={};return!e||typeof e!=`string`||(0,r.default)(e,function(e,r){e&&r&&(n[(0,i.camelCase)(e,t)]=r)}),n}a.default=a,t.exports=a})),ps=hs(`end`),ms=hs(`start`);function hs(e){return t;function t(t){let n=t&&t.position&&t.position[e]||{};if(typeof n.line==`number`&&n.line>0&&typeof n.column==`number`&&n.column>0)return{line:n.line,column:n.column,offset:typeof n.offset==`number`&&n.offset>-1?n.offset:void 0}}}function gs(e){let t=ms(e),n=ps(e);if(t&&n)return{start:t,end:n}}function _s(e){return!e||typeof e!=`object`?``:`position`in e||`type`in e?ys(e.position):`start`in e||`end`in e?ys(e):`line`in e||`column`in e?vs(e):``}function vs(e){return bs(e&&e.line)+`:`+bs(e&&e.column)}function ys(e){return vs(e&&e.start)+`-`+vs(e&&e.end)}function bs(e){return e&&typeof e==`number`?e:1}var K=class extends Error{constructor(e,t,n){super(),typeof t==`string`&&(n=t,t=void 0);let r=``,i={},a=!1;if(t&&(i=`line`in t&&`column`in t||`start`in t&&`end`in t?{place:t}:`type`in t?{ancestors:[t],place:t.position}:{...t}),typeof e==`string`?r=e:!i.cause&&e&&(a=!0,r=e.message,i.cause=e),!i.ruleId&&!i.source&&typeof n==`string`){let e=n.indexOf(`:`);e===-1?i.ruleId=n:(i.source=n.slice(0,e),i.ruleId=n.slice(e+1))}if(!i.place&&i.ancestors&&i.ancestors){let e=i.ancestors[i.ancestors.length-1];e&&(i.place=e.position)}let o=i.place&&`start`in i.place?i.place.start:i.place;this.ancestors=i.ancestors||void 0,this.cause=i.cause||void 0,this.column=o?o.column:void 0,this.fatal=void 0,this.file=``,this.message=r,this.line=o?o.line:void 0,this.name=_s(i.place)||`1:1`,this.place=i.place||void 0,this.reason=this.message,this.ruleId=i.ruleId||void 0,this.source=i.source||void 0,this.stack=a&&i.cause&&typeof i.cause.stack==`string`?i.cause.stack:``,this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}};K.prototype.file=``,K.prototype.name=``,K.prototype.reason=``,K.prototype.message=``,K.prototype.stack=``,K.prototype.column=void 0,K.prototype.line=void 0,K.prototype.ancestors=void 0,K.prototype.cause=void 0,K.prototype.fatal=void 0,K.prototype.place=void 0,K.prototype.ruleId=void 0,K.prototype.source=void 0;var xs=t(fs(),1),Ss={}.hasOwnProperty,Cs=new Map,ws=/[A-Z]/g,Ts=new Set([`table`,`tbody`,`thead`,`tfoot`,`tr`]),Es=new Set([`td`,`th`]),Ds=`https://github.com/syntax-tree/hast-util-to-jsx-runtime`;function Os(e,t){if(!t||t.Fragment===void 0)throw TypeError("Expected `Fragment` in options");let n=t.filePath||void 0,r;if(t.development){if(typeof t.jsxDEV!=`function`)throw TypeError("Expected `jsxDEV` in options when `development: true`");r=zs(n,t.jsxDEV)}else{if(typeof t.jsx!=`function`)throw TypeError("Expected `jsx` in production options");if(typeof t.jsxs!=`function`)throw TypeError("Expected `jsxs` in production options");r=Rs(n,t.jsx,t.jsxs)}let i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||`react`,evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space===`svg`?os:as,stylePropertyNameCase:t.stylePropertyNameCase||`dom`,tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},a=ks(i,e,void 0);return a&&typeof a!=`string`?a:i.create(e,i.Fragment,{children:a||void 0},void 0)}function ks(e,t,n){if(t.type===`element`)return As(e,t,n);if(t.type===`mdxFlowExpression`||t.type===`mdxTextExpression`)return js(e,t);if(t.type===`mdxJsxFlowElement`||t.type===`mdxJsxTextElement`)return Ns(e,t,n);if(t.type===`mdxjsEsm`)return Ms(e,t);if(t.type===`root`)return Ps(e,t,n);if(t.type===`text`)return Fs(e,t)}function As(e,t,n){let r=e.schema,i=r;t.tagName.toLowerCase()===`svg`&&r.space===`html`&&(i=os,e.schema=i),e.ancestors.push(t);let a=Gs(e,t.tagName,!1),o=Bs(e,t),s=Hs(e,t);return Ts.has(t.tagName)&&(s=s.filter(function(e){return typeof e!=`string`||!ko(e)})),Is(e,o,a,t),Ls(o,s),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function js(e,t){if(t.data&&t.data.estree&&e.evaluater){let n=t.data.estree.body[0];return n.type,e.evaluater.evaluateExpression(n.expression)}Ks(e,t.position)}function Ms(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);Ks(e,t.position)}function Ns(e,t,n){let r=e.schema,i=r;t.name===`svg`&&r.space===`html`&&(i=os,e.schema=i),e.ancestors.push(t);let a=t.name===null?e.Fragment:Gs(e,t.name,!0),o=Vs(e,t),s=Hs(e,t);return Is(e,o,a,t),Ls(o,s),e.ancestors.pop(),e.schema=r,e.create(t,a,o,n)}function Ps(e,t,n){let r={};return Ls(r,Hs(e,t)),e.create(t,e.Fragment,r,n)}function Fs(e,t){return t.value}function Is(e,t,n,r){typeof n!=`string`&&n!==e.Fragment&&e.passNode&&(t.node=r)}function Ls(e,t){if(t.length>0){let n=t.length>1?t:t[0];n&&(e.children=n)}}function Rs(e,t,n){return r;function r(e,r,i,a){let o=Array.isArray(i.children)?n:t;return a?o(r,i,a):o(r,i)}}function zs(e,t){return n;function n(n,r,i,a){let o=Array.isArray(i.children),s=ms(n);return t(r,i,a,o,{columnNumber:s?s.column-1:void 0,fileName:e,lineNumber:s?s.line:void 0},void 0)}}function Bs(e,t){let n={},r,i;for(i in t.properties)if(i!==`children`&&Ss.call(t.properties,i)){let a=Us(e,i,t.properties[i]);if(a){let[i,o]=a;e.tableCellAlignToStyle&&i===`align`&&typeof o==`string`&&Es.has(t.tagName)?r=o:n[i]=o}}if(r){let t=n.style||={};t[e.stylePropertyNameCase===`css`?`text-align`:`textAlign`]=r}return n}function Vs(e,t){let n={};for(let r of t.attributes)if(r.type===`mdxJsxExpressionAttribute`){if(r.data&&r.data.estree&&e.evaluater){let t=r.data.estree.body[0];t.type;let i=t.expression;i.type;let a=i.properties[0];a.type,Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else Ks(e,t.position)}else{let i=r.name,a;if(r.value&&typeof r.value==`object`){if(r.value.data&&r.value.data.estree&&e.evaluater){let t=r.value.data.estree.body[0];t.type,a=e.evaluater.evaluateExpression(t.expression)}else Ks(e,t.position)}else a=r.value===null||r.value;n[i]=a}return n}function Hs(e,t){let n=[],r=-1,i=e.passKeys?new Map:Cs;for(;++r<t.children.length;){let a=t.children[r],o;if(e.passKeys){let e=a.type===`element`?a.tagName:a.type===`mdxJsxFlowElement`||a.type===`mdxJsxTextElement`?a.name:void 0;if(e){let t=i.get(e)||0;o=e+`-`+t,i.set(e,t+1)}}let s=ks(e,a,o);s!==void 0&&n.push(s)}return n}function Us(e,t,n){let r=ns(e.schema,t);if(!(n==null||typeof n==`number`&&Number.isNaN(n))){if(Array.isArray(n)&&(n=r.commaSeparated?Co(n):cs(n)),r.property===`style`){let t=typeof n==`object`?n:Ws(e,String(n));return e.stylePropertyNameCase===`css`&&(t=qs(t)),[`style`,t]}return[e.elementAttributeNameCase===`react`&&r.space?Qo[r.property]||r.property:r.attribute,n]}}function Ws(e,t){try{return(0,xs.default)(t,{reactCompat:!0})}catch(t){if(e.ignoreInvalidStyle)return{};let n=t,r=new K("Cannot parse `style` attribute",{ancestors:e.ancestors,cause:n,ruleId:`style`,source:`hast-util-to-jsx-runtime`});throw r.file=e.filePath||void 0,r.url=Ds+`#cannot-parse-style-attribute`,r}}function Gs(e,t,n){let r;if(!n)r={type:`Literal`,value:t};else if(t.includes(`.`)){let e=t.split(`.`),n=-1,i;for(;++n<e.length;){let t=Do(e[n])?{type:`Identifier`,name:e[n]}:{type:`Literal`,value:e[n]};i=i?{type:`MemberExpression`,object:i,property:t,computed:!!(n&&t.type===`Literal`),optional:!1}:t}r=i}else r=Do(t)&&!/^[a-z]/.test(t)?{type:`Identifier`,name:t}:{type:`Literal`,value:t};if(r.type===`Literal`){let t=r.value;return Ss.call(e.components,t)?e.components[t]:t}if(e.evaluater)return e.evaluater.evaluateExpression(r);Ks(e)}function Ks(e,t){let n=new K("Cannot handle MDX estrees without `createEvaluater`",{ancestors:e.ancestors,place:t,ruleId:`mdx-estree`,source:`hast-util-to-jsx-runtime`});throw n.file=e.filePath||void 0,n.url=Ds+`#cannot-handle-mdx-estrees-without-createevaluater`,n}function qs(e){let t={},n;for(n in e)Ss.call(e,n)&&(t[Js(n)]=e[n]);return t}function Js(e){let t=e.replace(ws,Ys);return t.slice(0,3)===`ms-`&&(t=`-`+t),t}function Ys(e){return`-`+e.toLowerCase()}var Xs={action:[`form`],cite:[`blockquote`,`del`,`ins`,`q`],data:[`object`],formAction:[`button`,`input`],href:[`a`,`area`,`base`,`link`],icon:[`menuitem`],itemId:null,manifest:[`html`],ping:[`a`,`area`],poster:[`video`],src:[`audio`,`embed`,`iframe`,`img`,`input`,`script`,`source`,`track`,`video`]},Zs={};function Qs(e,t){let n=t||Zs;return $s(e,typeof n.includeImageAlt!=`boolean`||n.includeImageAlt,typeof n.includeHtml!=`boolean`||n.includeHtml)}function $s(e,t,n){if(tc(e)){if(`value`in e)return e.type===`html`&&!n?``:e.value;if(t&&`alt`in e&&e.alt)return e.alt;if(`children`in e)return ec(e.children,t,n)}return Array.isArray(e)?ec(e,t,n):``}function ec(e,t,n){let r=[],i=-1;for(;++i<e.length;)r[i]=$s(e[i],t,n);return r.join(``)}function tc(e){return!!(e&&typeof e==`object`)}var nc=document.createElement(`i`);function rc(e){let t=`&`+e+`;`;nc.innerHTML=t;let n=nc.textContent;return n.charCodeAt(n.length-1)===59&&e!==`semi`?!1:n!==t&&n}function ic(e,t,n,r){let i=e.length,a=0,o;if(t=t<0?-t>i?0:i+t:t>i?i:t,n=n>0?n:0,r.length<1e4)o=Array.from(r),o.unshift(t,n),e.splice(...o);else for(n&&e.splice(t,n);a<r.length;)o=r.slice(a,a+1e4),o.unshift(t,0),e.splice(...o),a+=1e4,t+=1e4}function ac(e,t){return e.length>0?(ic(e,e.length,0,t),e):t}var oc={}.hasOwnProperty;function sc(e){let t={},n=-1;for(;++n<e.length;)cc(t,e[n]);return t}function cc(e,t){let n;for(n in t){let r=(oc.call(e,n)?e[n]:void 0)||(e[n]={}),i=t[n],a;if(i)for(a in i){oc.call(r,a)||(r[a]=[]);let e=i[a];lc(r[a],Array.isArray(e)?e:e?[e]:[])}}}function lc(e,t){let n=-1,r=[];for(;++n<t.length;)(t[n].add===`after`?e:r).push(t[n]);ic(e,0,0,r)}function uc(e,t){let n=Number.parseInt(e,t);return n<9||n===11||n>13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)==65535||(n&65535)==65534||n>1114111?`�`:String.fromCodePoint(n)}function dc(e){return e.replace(/[\t\n\r ]+/g,` `).replace(/^ | $/g,``).toLowerCase().toUpperCase()}var q=yc(/[A-Za-z]/),J=yc(/[\dA-Za-z]/),fc=yc(/[#-'*+\--9=?A-Z^-~]/);function pc(e){return e!==null&&(e<32||e===127)}var mc=yc(/\d/),hc=yc(/[\dA-Fa-f]/),gc=yc(/[!-/:-@[-`{-~]/);function Y(e){return e!==null&&e<-2}function X(e){return e!==null&&(e<0||e===32)}function Z(e){return e===-2||e===-1||e===32}var _c=yc(/\p{P}|\p{S}/u),vc=yc(/\s/);function yc(e){return t;function t(t){return t!==null&&t>-1&&e.test(String.fromCharCode(t))}}function bc(e){let t=[],n=-1,r=0,i=0;for(;++n<e.length;){let a=e.charCodeAt(n),o=``;if(a===37&&J(e.charCodeAt(n+1))&&J(e.charCodeAt(n+2)))i=2;else if(a<128)/[!#$&-;=?-Z_a-z~]/.test(String.fromCharCode(a))||(o=String.fromCharCode(a));else if(a>55295&&a<57344){let t=e.charCodeAt(n+1);a<56320&&t>56319&&t<57344?(o=String.fromCharCode(a,t),i=1):o=`�`}else o=String.fromCharCode(a);o&&=(t.push(e.slice(r,n),encodeURIComponent(o)),r=n+i+1,``),i&&=(n+=i,0)}return t.join(``)+e.slice(r)}function Q(e,t,n,r){let i=r?r-1:1/0,a=0;return o;function o(r){return Z(r)?(e.enter(n),s(r)):t(r)}function s(r){return Z(r)&&a++<i?(e.consume(r),s):(e.exit(n),t(r))}}function xc(e,t,n,r,i,a){let o=0;return s;function s(t){return a>0&&Z(t)?(e.enter(r),c(t)):l(t)}function c(t){return Z(t)&&o<a?(e.consume(t),o++,c):(e.exit(r),l(t))}function l(e){return o>=i?t(e):n(e)}}var Sc={tokenize:Cc};function Cc(e){let t=e.attempt(this.parser.constructs.contentInitial,r,i),n;return t;function r(n){if(n===null)e.consume(n);else return e.enter(`lineEnding`),e.consume(n),e.exit(`lineEnding`),Q(e,t,`linePrefix`)}function i(t){return e.enter(`paragraph`),a(t)}function a(t){let r=e.enter(`chunkText`,{contentType:`text`,previous:n});return n&&(n.next=r),n=r,o(t)}function o(t){if(t===null)e.exit(`chunkText`),e.exit(`paragraph`),e.consume(t);else return Y(t)?(e.consume(t),e.exit(`chunkText`),a):(e.consume(t),o)}}var wc=class{constructor(){this.index=new Map,this.map=[]}add(e,t,n){Tc(this,e,t,n,!1)}addBefore(e,t,n){Tc(this,e,t,n,!0)}consume(e){if(this.map.sort(function(e,t){return e[0]-t[0]}),this.map.length===0)return;let t=this.map.length,n=[];for(;t>0;)--t,n.push(e.slice(this.map[t][0]+this.map[t][1]),this.map[t][2]),e.length=this.map[t][0];n.push(e.slice()),e.length=0;let r=n.pop();for(;r;){for(let t of r)e.push(t);r=n.pop()}this.map.length=0,this.index.clear()}};function Tc(e,t,n,r,i){if(n===0&&r.length===0)return;let a=e.index.get(t);if(a){a[1]+=n,i?(r.push(...a[2]),a[2]=r):a[2].push(...r);return}let o=[t,n,r];e.map.push(o),e.index.set(t,o)}var Ec={tokenize:Oc},Dc={tokenize:kc};function Oc(e){let t=this,n=[],r=0,i,a,o;return s;function s(i){if(r<n.length){let a=n[r];return t.containerState=a[1],e.attempt(a[0].continuation,c,l)(i)}return l(i)}function c(e){if(r++,t.containerState._closeFlow){t.containerState._closeFlow=void 0,i&&v();let n=t.events.length,a=n,o;for(;a--;)if(t.events[a][0]===`exit`&&t.events[a][1].type===`chunkFlow`){o=t.events[a][1].end;break}_(r);let s=n;for(;s<t.events.length;)t.events[s][1].end={...o},s++;let c=new wc;return c.add(a+1,0,t.events.slice(n)),c.add(n,s-n,[]),c.consume(t.events),l(e)}return s(e)}function l(a){if(r===n.length){if(!i)return f(a);if(i.currentConstruct&&i.currentConstruct.concrete)return m(a);t.interrupt=!(!i.currentConstruct||i._gfmTableDynamicInterruptHack)}return t.containerState={},e.check(Dc,u,d)(a)}function u(e){return i&&v(),_(r),f(e)}function d(e){return t.parser.lazy[t.now().line]=r!==n.length,o=t.now().offset,m(e)}function f(n){return t.containerState={},e.attempt(Dc,p,m)(n)}function p(e){return r++,n.push([t.currentConstruct,t.containerState]),f(e)}function m(n){if(n===null)i&&v(),_(0),e.consume(n);else return i||=t.parser.flow(t.now()),e.enter(`chunkFlow`,{_tokenizer:i,contentType:`flow`,previous:a}),h(n)}function h(n){if(n===null)g(e.exit(`chunkFlow`),!0),_(0),e.consume(n);else return Y(n)?(e.consume(n),g(e.exit(`chunkFlow`)),r=0,t.interrupt=void 0,s):(e.consume(n),h)}function g(e,n){let s=t.sliceStream(e);if(n&&s.push(null),e.previous=a,a&&(a.next=e),a=e,i.defineSkip(e.start),i.write(s),t.parser.lazy[e.start.line]){let e=i.events.length;for(;e--;)if(i.events[e][1].start.offset<o&&(!i.events[e][1].end||i.events[e][1].end.offset>o))return;let n=t.events.length,a=n,s,c;for(;a--;)if(t.events[a][0]===`exit`&&t.events[a][1].type===`chunkFlow`){if(s){c=t.events[a][1].end;break}s=!0}for(_(r),e=n;e<t.events.length;)t.events[e][1].end={...c},e++;let l=new wc;l.add(a+1,0,t.events.slice(n)),l.add(n,e-n,[]),l.consume(t.events)}}function _(r){let i=n.length;for(;i-->r;){let r=n[i];t.containerState=r[1],r[0].exit.call(t,e)}n.length=r}function v(){i.write([null]),a=void 0,i=void 0,t.containerState._closeFlow=void 0}}function kc(e,t,n){return Q(e,e.attempt(this.parser.constructs.document,t,n),`linePrefix`,this.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)}function Ac(e){if(e===null||X(e)||vc(e))return 1;if(_c(e))return 2}function jc(e,t,n){let r=[],i=-1;for(;++i<e.length;){let a=e[i].resolveAll;a&&!r.includes(a)&&(t=a(t,n),r.push(a))}return t}var Mc={name:`attention`,resolveAll:Nc,tokenize:Pc};function Nc(e,t){let n=-1,r;for(;++n<e.length;)if(e[n][0]===`enter`&&e[n][1].type===`attentionSequence`&&e[n][1]._close){let i=n;for(;i--;)if(e[i][0]===`exit`&&e[i][1].type===`attentionSequence`&&e[i][1]._open&&t.sliceSerialize(e[i][1]).charCodeAt(0)===t.sliceSerialize(e[n][1]).charCodeAt(0)){if((e[i][1]._close||e[n][1]._open)&&(e[n][1].end.offset-e[n][1].start.offset)%3&&!((e[i][1].end.offset-e[i][1].start.offset+e[n][1].end.offset-e[n][1].start.offset)%3))continue;let a=e[i][1].end.offset-e[i][1].start.offset>1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1,o={...e[i][1].end},s={...e[n][1].start};Fc(o,-a),Fc(s,a);let c={type:a>1?`strongSequence`:`emphasisSequence`,start:o,end:{...e[i][1].end}},l={type:a>1?`strongSequence`:`emphasisSequence`,start:{...e[n][1].start},end:s},u={type:a>1?`strongText`:`emphasisText`,start:{...e[i][1].end},end:{...e[n][1].start}},d={type:a>1?`strong`:`emphasis`,start:{...c.start},end:{...l.end}};e[i][1].end={...c.start},e[n][1].start={...l.end},r=[],e[i][1].end.offset-e[i][1].start.offset&&(r=ac(r,[[`enter`,e[i][1],t],[`exit`,e[i][1],t]])),r=ac(r,[[`enter`,d,t],[`enter`,c,t],[`exit`,c,t],[`enter`,u,t]]),r=ac(r,jc(t.parser.constructs.insideSpan.null,e.slice(i+1,n),t)),r=ac(r,[[`exit`,u,t],[`enter`,l,t],[`exit`,l,t],[`exit`,d,t]]);let f=0;e[n][1].end.offset-e[n][1].start.offset&&(f=2,r=ac(r,[[`enter`,e[n][1],t],[`exit`,e[n][1],t]])),ic(e,i-1,n-i+3,r),n=i+r.length-f-2;break}}for(n=-1;++n<e.length;)e[n][1].type===`attentionSequence`&&(e[n][1].type=`data`);return e}function Pc(e,t){let n=this.parser.constructs.attentionMarkers.null,r=this.previous,i=Ac(r),a;return o;function o(t){return a=t,e.enter(`attentionSequence`),s(t)}function s(o){if(o===a)return e.consume(o),s;let c=e.exit(`attentionSequence`),l=Ac(o),u=!l||l===2&&i||n.includes(o)&&o!==42&&o!==95,d=!i||i===2&&l||n.includes(r)&&r!==42&&r!==95;return c._open=!!(a===42?u:u&&(i||!d)),c._close=!!(a===42?d:d&&(l||!u)),t(o)}}function Fc(e,t){e.column+=t,e.offset+=t,e._bufferIndex+=t}var Ic={name:`autolink`,tokenize:Lc};function Lc(e,t,n){let r=0;return i;function i(t){return e.enter(`autolink`),e.enter(`autolinkMarker`),e.consume(t),e.exit(`autolinkMarker`),e.enter(`autolinkProtocol`),a}function a(t){return q(t)?(e.consume(t),o):t===64?n(t):l(t)}function o(e){return e===43||e===45||e===46||J(e)?(r=1,s(e)):l(e)}function s(t){return t===58?(e.consume(t),r=0,c):(t===43||t===45||t===46||J(t))&&r++<32?(e.consume(t),s):(r=0,l(t))}function c(r){return r===62?(e.exit(`autolinkProtocol`),e.enter(`autolinkMarker`),e.consume(r),e.exit(`autolinkMarker`),e.exit(`autolink`),t):r===null||r===32||r===60||pc(r)?n(r):(e.consume(r),c)}function l(t){return t===64?(e.consume(t),u):fc(t)?(e.consume(t),l):n(t)}function u(e){return J(e)?d(e):n(e)}function d(n){return n===46?(e.consume(n),r=0,u):n===62?(e.exit(`autolinkProtocol`).type=`autolinkEmail`,e.enter(`autolinkMarker`),e.consume(n),e.exit(`autolinkMarker`),e.exit(`autolink`),t):f(n)}function f(t){if((t===45||J(t))&&r++<63){let n=t===45?f:d;return e.consume(t),n}return n(t)}}var Rc={partial:!0,tokenize:zc};function zc(e,t,n){return r;function r(t){return Z(t)?Q(e,i,`linePrefix`)(t):i(t)}function i(e){return e===null||Y(e)?t(e):n(e)}}var Bc={continuation:{tokenize:Hc},exit:Uc,name:`blockQuote`,tokenize:Vc};function Vc(e,t,n){let r=this;return i;function i(t){if(t===62){let n=r.containerState;return n.open||=(e.enter(`blockQuote`,{_container:!0}),!0),e.enter(`blockQuotePrefix`),e.enter(`blockQuoteMarker`),e.consume(t),e.exit(`blockQuoteMarker`),a}return n(t)}function a(n){return Z(n)?(e.enter(`blockQuotePrefixWhitespace`),e.consume(n),e.exit(`blockQuotePrefixWhitespace`),e.exit(`blockQuotePrefix`),t):(e.exit(`blockQuotePrefix`),t(n))}}function Hc(e,t,n){let r=this;return i;function i(t){return Z(t)?Q(e,a,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):a(t)}function a(r){return e.attempt(Bc,t,n)(r)}}function Uc(e){e.exit(`blockQuote`)}var Wc={name:`characterEscape`,tokenize:Gc};function Gc(e,t,n){return r;function r(t){return e.enter(`characterEscape`),e.enter(`escapeMarker`),e.consume(t),e.exit(`escapeMarker`),i}function i(r){return gc(r)?(e.enter(`characterEscapeValue`),e.consume(r),e.exit(`characterEscapeValue`),e.exit(`characterEscape`),t):n(r)}}var Kc={name:`characterReference`,tokenize:qc};function qc(e,t,n){let r=this,i=0,a,o;return s;function s(t){return e.enter(`characterReference`),e.enter(`characterReferenceMarker`),e.consume(t),e.exit(`characterReferenceMarker`),c}function c(t){return t===35?(e.enter(`characterReferenceMarkerNumeric`),e.consume(t),e.exit(`characterReferenceMarkerNumeric`),l):(e.enter(`characterReferenceValue`),a=31,o=J,u(t))}function l(t){return t===88||t===120?(e.enter(`characterReferenceMarkerHexadecimal`),e.consume(t),e.exit(`characterReferenceMarkerHexadecimal`),e.enter(`characterReferenceValue`),a=6,o=hc,u):(e.enter(`characterReferenceValue`),a=7,o=mc,u(t))}function u(s){if(s===59&&i){let i=e.exit(`characterReferenceValue`);return o===J&&!rc(r.sliceSerialize(i))?n(s):(e.enter(`characterReferenceMarker`),e.consume(s),e.exit(`characterReferenceMarker`),e.exit(`characterReference`),t)}return o(s)&&i++<a?(e.consume(s),u):n(s)}}var Jc={partial:!0,tokenize:Yc};function Yc(e,t,n){let r=this;return i;function i(t){return t===null?n(t):(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),a)}function a(e){return r.parser.lazy[r.now().line]?n(e):t(e)}}var Xc={concrete:!0,name:`codeFenced`,tokenize:Zc};function Zc(e,t,n){let r=this,i={partial:!0,tokenize:x},a=0,o=0,s;return c;function c(e){return l(e)}function l(t){let n=r.events[r.events.length-1];return a=n&&n[1].type===`linePrefix`?n[2].sliceSerialize(n[1],!0).length:0,s=t,e.enter(`codeFenced`),e.enter(`codeFencedFence`),e.enter(`codeFencedFenceSequence`),u(t)}function u(t){return t===s?(o++,e.consume(t),u):o<3?n(t):(e.exit(`codeFencedFenceSequence`),Z(t)?Q(e,d,`whitespace`)(t):d(t))}function d(n){return n===null||Y(n)?(e.exit(`codeFencedFence`),r.interrupt?t(n):e.check(Jc,h,b)(n)):(e.enter(`codeFencedFenceInfo`),e.enter(`chunkString`,{contentType:`string`}),f(n))}function f(t){return t===null||Y(t)?(e.exit(`chunkString`),e.exit(`codeFencedFenceInfo`),d(t)):Z(t)?(e.exit(`chunkString`),e.exit(`codeFencedFenceInfo`),Q(e,p,`whitespace`)(t)):t===96&&t===s?n(t):(e.consume(t),f)}function p(t){return t===null||Y(t)?d(t):(e.enter(`codeFencedFenceMeta`),e.enter(`chunkString`,{contentType:`string`}),m(t))}function m(t){return t===null||Y(t)?(e.exit(`chunkString`),e.exit(`codeFencedFenceMeta`),d(t)):t===96&&t===s?n(t):(e.consume(t),m)}function h(t){return e.attempt(i,b,g)(t)}function g(t){return e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),_}function _(t){return a>0&&Z(t)?Q(e,v,`linePrefix`,a+1)(t):v(t)}function v(t){return t===null||Y(t)?e.check(Jc,h,b)(t):(e.enter(`codeFlowValue`),y(t))}function y(t){return t===null||Y(t)?(e.exit(`codeFlowValue`),v(t)):(e.consume(t),y)}function b(n){return e.exit(`codeFenced`),t(n)}function x(e,t,n){let i=0;return a;function a(t){return e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),c}function c(t){return e.enter(`codeFencedFence`),Z(t)?Q(e,l,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):l(t)}function l(t){return t===s?(e.enter(`codeFencedFenceSequence`),u(t)):n(t)}function u(t){return t===s?(i++,e.consume(t),u):i>=o?(e.exit(`codeFencedFenceSequence`),Z(t)?Q(e,d,`whitespace`)(t):d(t)):n(t)}function d(r){return r===null||Y(r)?(e.exit(`codeFencedFence`),t(r)):n(r)}}}var Qc={name:`codeIndented`,tokenize:el},$c={partial:!0,tokenize:tl};function el(e,t,n){return r;function r(t){return e.enter(`codeIndented`),xc(e,i,n,`linePrefix`,4,4)(t)}function i(t){return t===null?o(t):Y(t)?e.attempt($c,i,o)(t):(e.enter(`codeFlowValue`),a(t))}function a(t){return t===null||Y(t)?(e.exit(`codeFlowValue`),i(t)):(e.consume(t),a)}function o(n){return e.exit(`codeIndented`),t(n)}}function tl(e,t,n){let r=this;return i;function i(o){return r.parser.lazy[r.now().line]?n(o):Y(o)?(e.enter(`lineEnding`),e.consume(o),e.exit(`lineEnding`),i):xc(e,t,a,`linePrefix`,4,4)(o)}function a(e){return Y(e)?i(e):n(e)}}var nl={name:`codeText`,previous:il,resolve:rl,tokenize:al};function rl(e){let t=e.length-4,n=3,r,i;if((e[n][1].type===`lineEnding`||e[n][1].type===`space`)&&(e[t][1].type===`lineEnding`||e[t][1].type===`space`)){for(r=n;++r<t;)if(e[r][1].type===`codeTextData`){e[n][1].type=`codeTextPadding`,e[t][1].type=`codeTextPadding`,n+=2,t-=2;break}}for(r=n-1,t++;++r<=t;)i===void 0?r!==t&&e[r][1].type!==`lineEnding`&&(i=r):(r===t||e[r][1].type===`lineEnding`)&&(e[i][1].type=`codeTextData`,r!==i+2&&(e[i][1].end=e[r-1][1].end,e.splice(i+2,r-i-2),t-=r-i-2,r=i+2),i=void 0);return e}function il(e){return e!==96||this.events[this.events.length-1][1].type===`characterEscape`}function al(e,t,n){let r=0,i,a;return o;function o(t){return e.enter(`codeText`),e.enter(`codeTextSequence`),s(t)}function s(t){return t===96?(e.consume(t),r++,s):(e.exit(`codeTextSequence`),c(t))}function c(t){return t===null?n(t):t===32?(e.enter(`space`),e.consume(t),e.exit(`space`),c):t===96?(a=e.enter(`codeTextSequence`),i=0,u(t)):Y(t)?(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),c):(e.enter(`codeTextData`),l(t))}function l(t){return t===null||t===32||t===96||Y(t)?(e.exit(`codeTextData`),c(t)):(e.consume(t),l)}function u(n){return n===96?(e.consume(n),i++,u):i===r?(e.exit(`codeTextSequence`),e.exit(`codeText`),t(n)):(a.type=`codeTextData`,l(n))}}var ol=class{constructor(e){this.left=e?[...e]:[],this.right=[]}get(e){if(e<0||e>=this.left.length+this.right.length)throw RangeError("Cannot access index `"+e+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return e<this.left.length?this.left[e]:this.right[this.right.length-e+this.left.length-1]}get length(){return this.left.length+this.right.length}shift(){return this.setCursor(0),this.right.pop()}slice(e,t){let n=t??1/0;return n<this.left.length?this.left.slice(e,n):e>this.left.length?this.right.slice(this.right.length-n+this.left.length,this.right.length-e+this.left.length).reverse():this.left.slice(e).concat(this.right.slice(this.right.length-n+this.left.length).reverse())}splice(e,t,n){let r=t||0;this.setCursor(Math.trunc(e));let i=this.right.splice(this.right.length-r,1/0);return n&&sl(this.left,n),i.reverse()}pop(){return this.setCursor(1/0),this.left.pop()}push(e){this.setCursor(1/0),this.left.push(e)}pushMany(e){this.setCursor(1/0),sl(this.left,e)}unshift(e){this.setCursor(0),this.right.push(e)}unshiftMany(e){this.setCursor(0),sl(this.right,e.reverse())}setCursor(e){if(!(e===this.left.length||e>this.left.length&&this.right.length===0||e<0&&this.left.length===0)){if(e<this.left.length){let t=this.left.splice(e,1/0);sl(this.right,t.reverse())}else{let t=this.right.splice(this.left.length+this.right.length-e,1/0);sl(this.left,t.reverse())}}}};function sl(e,t){let n=0;if(t.length<1e4)e.push(...t);else for(;n<t.length;)e.push(...t.slice(n,n+1e4)),n+=1e4}function cl(e){let t={},n=-1,r,i,a,o,s,c,l,u=new ol(e);for(;++n<u.length;){for(;n in t;)n=t[n];if(r=u.get(n),n&&r[1].type===`chunkFlow`&&u.get(n-1)[1].type===`listItemPrefix`&&(c=r[1]._tokenizer.events,a=0,a<c.length&&c[a][1].type===`lineEndingBlank`&&(a+=2),a<c.length&&c[a][1].type===`content`))for(;++a<c.length&&c[a][1].type!==`content`;)c[a][1].type===`chunkText`&&(c[a][1]._isInFirstContentOfListItem=!0,a++);if(r[0]===`enter`)r[1].contentType&&(Object.assign(t,ll(u,n)),n=t[n],l=!0);else if(r[1]._container){for(a=n,i=void 0;a--;)if(o=u.get(a),o[1].type===`lineEnding`||o[1].type===`lineEndingBlank`)o[0]===`enter`&&(i&&(u.get(i)[1].type=`lineEndingBlank`),o[1].type=`lineEnding`,i=a);else if(o[1].type!==`linePrefix`&&o[1].type!==`listItemIndent`)break;i&&(r[1].end={...u.get(i)[1].start},s=u.slice(i,n),s.unshift(r),u.splice(i,n-i+1,s))}}return ic(e,0,1/0,u.slice(0)),!l}function ll(e,t){let n=e.get(t)[1],r=e.get(t)[2],i=t-1,a=[],o=n._tokenizer;o||(o=r.parser[n.contentType](n.start),n._contentTypeTextTrailing&&(o._contentTypeTextTrailing=!0));let s=o.events,c=[],l={},u,d,f=-1,p=n,m=0,h=0,g=[h];for(;p;){for(;e.get(++i)[1]!==p;);a.push(i),p._tokenizer||(u=r.sliceStream(p),p.next||u.push(null),d&&o.defineSkip(p.start),p._isInFirstContentOfListItem&&(o._gfmTasklistFirstContentOfListItem=!0),o.write(u),p._isInFirstContentOfListItem&&(o._gfmTasklistFirstContentOfListItem=void 0)),d=p,p=p.next}for(p=n;++f<s.length;)s[f][0]===`exit`&&s[f-1][0]===`enter`&&s[f][1].type===s[f-1][1].type&&s[f][1].start.line!==s[f][1].end.line&&(h=f+1,g.push(h),p._tokenizer=void 0,p.previous=void 0,p=p.next);for(o.events=[],p?(p._tokenizer=void 0,p.previous=void 0):g.pop(),f=g.length;f--;){let t=s.slice(g[f],g[f+1]),n=a.pop();c.push([n,n+t.length-1]),e.splice(n,2,t)}for(c.reverse(),f=-1;++f<c.length;)l[m+c[f][0]]=m+c[f][1],m+=c[f][1]-c[f][0]-1;return l}var ul={resolve:fl,tokenize:pl},dl={partial:!0,tokenize:ml};function fl(e){return cl(e),e}function pl(e,t){let n;return r;function r(t){return e.enter(`content`),n=e.enter(`chunkContent`,{contentType:`content`}),i(t)}function i(t){return t===null?a(t):Y(t)?e.check(dl,o,a)(t):(e.consume(t),i)}function a(n){return e.exit(`chunkContent`),e.exit(`content`),t(n)}function o(t){return e.consume(t),e.exit(`chunkContent`),n.next=e.enter(`chunkContent`,{contentType:`content`,previous:n}),n=n.next,i}}function ml(e,t,n){let r=this;return i;function i(t){return e.exit(`chunkContent`),e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),Q(e,a,`linePrefix`)}function a(i){if(i===null||Y(i))return n(i);let a=r.events[r.events.length-1];return!r.parser.constructs.disable.null.includes(`codeIndented`)&&a&&a[1].type===`linePrefix`&&a[2].sliceSerialize(a[1],!0).length>=4?t(i):e.interrupt(r.parser.constructs.flow,n,t)(i)}}function hl(e,t,n,r,i,a,o,s,c){let l=c||1/0,u=0;return d;function d(t){return t===60?(e.enter(r),e.enter(i),e.enter(a),e.consume(t),e.exit(a),f):t===null||t===32||t===41||pc(t)?n(t):(e.enter(r),e.enter(o),e.enter(s),e.enter(`chunkString`,{contentType:`string`}),h(t))}function f(n){return n===62?(e.enter(a),e.consume(n),e.exit(a),e.exit(i),e.exit(r),t):(e.enter(s),e.enter(`chunkString`,{contentType:`string`}),p(n))}function p(t){return t===62?(e.exit(`chunkString`),e.exit(s),f(t)):t===null||t===60||Y(t)?n(t):(e.consume(t),t===92?m:p)}function m(t){return t===60||t===62||t===92?(e.consume(t),p):p(t)}function h(i){return!u&&(i===null||i===41||X(i))?(e.exit(`chunkString`),e.exit(s),e.exit(o),e.exit(r),t(i)):u<l&&i===40?(e.consume(i),u++,h):i===41?(e.consume(i),u--,h):i===null||i===32||i===40||pc(i)?n(i):(e.consume(i),i===92?g:h)}function g(t){return t===40||t===41||t===92?(e.consume(t),h):h(t)}}function gl(e,t,n,r,i,a){let o=this,s=0,c;return l;function l(t){return e.enter(r),e.enter(i),e.consume(t),e.exit(i),e.enter(a),u}function u(l){return s>999||l===null||l===91||l===93&&!c||l===94&&!s&&`_hiddenFootnoteSupport`in o.parser.constructs?n(l):l===93?(e.exit(a),e.enter(i),e.consume(l),e.exit(i),e.exit(r),t):Y(l)?(e.enter(`lineEnding`),e.consume(l),e.exit(`lineEnding`),u):(e.enter(`chunkString`,{contentType:`string`}),d(l))}function d(t){return t===null||t===91||t===93||Y(t)||s++>999?(e.exit(`chunkString`),u(t)):(e.consume(t),c||=!Z(t),t===92?f:d)}function f(t){return t===91||t===92||t===93?(e.consume(t),s++,d):d(t)}}function _l(e,t,n,r,i,a){let o;return s;function s(t){return t===34||t===39||t===40?(e.enter(r),e.enter(i),e.consume(t),e.exit(i),o=t===40?41:t,c):n(t)}function c(n){return n===o?(e.enter(i),e.consume(n),e.exit(i),e.exit(r),t):(e.enter(a),l(n))}function l(t){return t===o?(e.exit(a),c(o)):t===null?n(t):Y(t)?(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),Q(e,l,`linePrefix`)):(e.enter(`chunkString`,{contentType:`string`}),u(t))}function u(t){return t===o||t===null||Y(t)?(e.exit(`chunkString`),l(t)):(e.consume(t),t===92?d:u)}function d(t){return t===o||t===92?(e.consume(t),u):u(t)}}function vl(e,t){let n;return r;function r(i){return Y(i)?(e.enter(`lineEnding`),e.consume(i),e.exit(`lineEnding`),n=!0,r):Z(i)?Q(e,r,n?`linePrefix`:`lineSuffix`)(i):t(i)}}var yl={name:`definition`,tokenize:xl},bl={partial:!0,tokenize:Sl};function xl(e,t,n){let r=this,i;return a;function a(t){return e.enter(`definition`),o(t)}function o(t){return gl.call(r,e,s,n,`definitionLabel`,`definitionLabelMarker`,`definitionLabelString`)(t)}function s(t){return i=dc(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),t===58?(e.enter(`definitionMarker`),e.consume(t),e.exit(`definitionMarker`),c):n(t)}function c(t){return X(t)?vl(e,l)(t):l(t)}function l(t){return hl(e,u,n,`definitionDestination`,`definitionDestinationLiteral`,`definitionDestinationLiteralMarker`,`definitionDestinationRaw`,`definitionDestinationString`)(t)}function u(t){return e.attempt(bl,d,d)(t)}function d(t){return Z(t)?Q(e,f,`whitespace`)(t):f(t)}function f(a){return a===null||Y(a)?(e.exit(`definition`),r.parser.defined.push(i),t(a)):n(a)}}function Sl(e,t,n){return r;function r(t){return X(t)?vl(e,i)(t):n(t)}function i(t){return _l(e,a,n,`definitionTitle`,`definitionTitleMarker`,`definitionTitleString`)(t)}function a(t){return Z(t)?Q(e,o,`whitespace`)(t):o(t)}function o(e){return e===null||Y(e)?t(e):n(e)}}var Cl={name:`hardBreakEscape`,tokenize:wl};function wl(e,t,n){return r;function r(t){return e.enter(`hardBreakEscape`),e.consume(t),i}function i(r){return Y(r)?(e.exit(`hardBreakEscape`),t(r)):n(r)}}var Tl={name:`headingAtx`,resolve:El,tokenize:Dl};function El(e,t){let n=e.length-2,r=3;if(e[r][1].type===`whitespace`&&(r+=2),n-2>r&&e[n][1].type===`whitespace`&&(n-=2),e[n][1].type===`atxHeadingSequence`&&(r===n-1||n-4>r&&e[n-2][1].type===`whitespace`)&&(n-=r+1===n?2:4),n>r){let i={type:`atxHeadingText`,start:e[r][1].start,end:e[n][1].end},a={type:`chunkText`,start:e[r][1].start,end:e[n][1].end,contentType:`text`};ic(e,r,n-r+1,[[`enter`,i,t],[`enter`,a,t],[`exit`,a,t],[`exit`,i,t]])}return e}function Dl(e,t,n){let r=0;return i;function i(t){return e.enter(`atxHeading`),a(t)}function a(t){return e.enter(`atxHeadingSequence`),o(t)}function o(t){return t===35&&r++<6?(e.consume(t),o):t===null||X(t)?(e.exit(`atxHeadingSequence`),s(t)):n(t)}function s(n){return n===35?(e.enter(`atxHeadingSequence`),c(n)):n===null||Y(n)?(e.exit(`atxHeading`),t(n)):Z(n)?Q(e,s,`whitespace`)(n):(e.enter(`atxHeadingText`),l(n))}function c(t){return t===35?(e.consume(t),c):(e.exit(`atxHeadingSequence`),s(t))}function l(t){return t===null||t===35||X(t)?(e.exit(`atxHeadingText`),s(t)):(e.consume(t),l)}}var Ol=`address.article.aside.base.basefont.blockquote.body.caption.center.col.colgroup.dd.details.dialog.dir.div.dl.dt.fieldset.figcaption.figure.footer.form.frame.frameset.h1.h2.h3.h4.h5.h6.head.header.hr.html.iframe.legend.li.link.main.menu.menuitem.nav.noframes.ol.optgroup.option.p.param.search.section.summary.table.tbody.td.tfoot.th.thead.title.tr.track.ul`.split(`.`),kl=[`pre`,`script`,`style`,`textarea`],Al={concrete:!0,name:`htmlFlow`,resolveTo:Ml,tokenize:Nl},jl={partial:!0,tokenize:Pl};function Ml(e){let t=e.length;for(;t--&&(e[t][0]!==`enter`||e[t][1].type!==`htmlFlow`););return t>1&&e[t-2][1].type===`linePrefix`&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function Nl(e,t,n){let r=this,i,a,o,s,c;return l;function l(e){return u(e)}function u(t){return e.enter(`htmlFlow`),e.enter(`htmlFlowData`),e.consume(t),d}function d(s){return s===33?(e.consume(s),f):s===47?(e.consume(s),a=!0,h):s===63?(e.consume(s),i=3,r.interrupt?t:ne):q(s)?(e.consume(s),o=String.fromCharCode(s),g):n(s)}function f(a){return a===45?(e.consume(a),i=2,p):a===91?(e.consume(a),i=5,s=0,m):q(a)?(e.consume(a),i=4,r.interrupt?t:ne):n(a)}function p(i){return i===45?(e.consume(i),r.interrupt?t:ne):n(i)}function m(i){return i===`CDATA[`.charCodeAt(s++)?(e.consume(i),s===6?r.interrupt?t:O:m):n(i)}function h(t){return q(t)?(e.consume(t),o=String.fromCharCode(t),g):n(t)}function g(s){if(s===null||s===47||s===62||X(s)){let c=s===47,l=o.toLowerCase();return!c&&!a&&kl.includes(l)?(i=1,r.interrupt?t(s):O(s)):Ol.includes(o.toLowerCase())?(i=6,c?(e.consume(s),_):r.interrupt?t(s):O(s)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(s):a?v(s):y(s))}return s===45||J(s)?(e.consume(s),o+=String.fromCharCode(s),g):n(s)}function _(i){return i===62?(e.consume(i),r.interrupt?t:O):n(i)}function v(t){return Z(t)?(e.consume(t),v):E(t)}function y(t){return t===47?(e.consume(t),E):t===58||t===95||q(t)?(e.consume(t),b):Z(t)?(e.consume(t),y):E(t)}function b(t){return t===45||t===46||t===58||t===95||J(t)?(e.consume(t),b):x(t)}function x(t){return t===61?(e.consume(t),S):Z(t)?(e.consume(t),x):y(t)}function S(t){return t===null||t===60||t===61||t===62||t===96?n(t):t===34||t===39?(e.consume(t),c=t,C):Z(t)?(e.consume(t),S):w(t)}function C(t){return t===c?(e.consume(t),c=null,T):t===null||Y(t)?n(t):(e.consume(t),C)}function w(t){return t===null||t===34||t===39||t===47||t===60||t===61||t===62||t===96||X(t)?x(t):(e.consume(t),w)}function T(e){return e===47||e===62||Z(e)?y(e):n(e)}function E(t){return t===62?(e.consume(t),D):n(t)}function D(t){return t===null||Y(t)?O(t):Z(t)?(e.consume(t),D):n(t)}function O(t){return t===45&&i===2?(e.consume(t),j):t===60&&i===1?(e.consume(t),M):t===62&&i===4?(e.consume(t),re):t===63&&i===3?(e.consume(t),ne):t===93&&i===5?(e.consume(t),te):Y(t)&&(i===6||i===7)?(e.exit(`htmlFlowData`),e.check(jl,ie,k)(t)):t===null||Y(t)?(e.exit(`htmlFlowData`),k(t)):(e.consume(t),O)}function k(t){return e.check(Jc,ee,ie)(t)}function ee(t){return e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),A}function A(t){return t===null||Y(t)?k(t):(e.enter(`htmlFlowData`),O(t))}function j(t){return t===45?(e.consume(t),ne):O(t)}function M(t){return t===47?(e.consume(t),o=``,N):O(t)}function N(t){if(t===62){let n=o.toLowerCase();return kl.includes(n)?(e.consume(t),re):O(t)}return q(t)&&o.length<8?(e.consume(t),o+=String.fromCharCode(t),N):O(t)}function te(t){return t===93?(e.consume(t),ne):O(t)}function ne(t){return t===62?(e.consume(t),re):t===45&&i===2?(e.consume(t),ne):O(t)}function re(t){return t===null||Y(t)?(e.exit(`htmlFlowData`),ie(t)):(e.consume(t),re)}function ie(n){return e.exit(`htmlFlow`),t(n)}}function Pl(e,t,n){return r;function r(r){return e.enter(`lineEnding`),e.consume(r),e.exit(`lineEnding`),e.attempt(Rc,t,n)}}var Fl={name:`htmlText`,tokenize:Il};function Il(e,t,n){let r=this,i,a,o;return s;function s(t){return e.enter(`htmlText`),e.enter(`htmlTextData`),e.consume(t),c}function c(t){return t===33?(e.consume(t),l):t===47?(e.consume(t),x):t===63?(e.consume(t),y):q(t)?(e.consume(t),w):n(t)}function l(t){return t===45?(e.consume(t),u):t===91?(e.consume(t),a=0,m):q(t)?(e.consume(t),v):n(t)}function u(t){return t===45?(e.consume(t),p):n(t)}function d(t){return t===null?n(t):t===45?(e.consume(t),f):Y(t)?(o=d,M(t)):(e.consume(t),d)}function f(t){return t===45?(e.consume(t),p):d(t)}function p(e){return e===62?j(e):e===45?f(e):d(e)}function m(t){return t===`CDATA[`.charCodeAt(a++)?(e.consume(t),a===6?h:m):n(t)}function h(t){return t===null?n(t):t===93?(e.consume(t),g):Y(t)?(o=h,M(t)):(e.consume(t),h)}function g(t){return t===93?(e.consume(t),_):h(t)}function _(t){return t===62?j(t):t===93?(e.consume(t),_):h(t)}function v(t){return t===null||t===62?j(t):Y(t)?(o=v,M(t)):(e.consume(t),v)}function y(t){return t===null?n(t):t===63?(e.consume(t),b):Y(t)?(o=y,M(t)):(e.consume(t),y)}function b(e){return e===62?j(e):y(e)}function x(t){return q(t)?(e.consume(t),S):n(t)}function S(t){return t===45||J(t)?(e.consume(t),S):C(t)}function C(t){return Y(t)?(o=C,M(t)):Z(t)?(e.consume(t),C):j(t)}function w(t){return t===45||J(t)?(e.consume(t),w):t===47||t===62||X(t)?T(t):n(t)}function T(t){return t===47?(e.consume(t),j):t===58||t===95||q(t)?(e.consume(t),E):Y(t)?(o=T,M(t)):Z(t)?(e.consume(t),T):j(t)}function E(t){return t===45||t===46||t===58||t===95||J(t)?(e.consume(t),E):D(t)}function D(t){return t===61?(e.consume(t),O):Y(t)?(o=D,M(t)):Z(t)?(e.consume(t),D):T(t)}function O(t){return t===null||t===60||t===61||t===62||t===96?n(t):t===34||t===39?(e.consume(t),i=t,k):Y(t)?(o=O,M(t)):Z(t)?(e.consume(t),O):(e.consume(t),ee)}function k(t){return t===i?(e.consume(t),i=void 0,A):t===null?n(t):Y(t)?(o=k,M(t)):(e.consume(t),k)}function ee(t){return t===null||t===34||t===39||t===60||t===61||t===96?n(t):t===47||t===62||X(t)?T(t):(e.consume(t),ee)}function A(e){return e===47||e===62||X(e)?T(e):n(e)}function j(r){return r===62?(e.consume(r),e.exit(`htmlTextData`),e.exit(`htmlText`),t):n(r)}function M(t){return e.exit(`htmlTextData`),e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),N}function N(t){return Z(t)?Q(e,te,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):te(t)}function te(t){return e.enter(`htmlTextData`),o(t)}}var Ll={name:`labelEnd`,resolveAll:Vl,resolveTo:Hl,tokenize:Ul},Rl={tokenize:Wl},zl={tokenize:Gl},Bl={tokenize:Kl};function Vl(e){let t=-1,n=[];for(;++t<e.length;){let r=e[t][1];if(n.push(e[t]),r.type===`labelImage`||r.type===`labelLink`||r.type===`labelEnd`){let e=r.type===`labelImage`?4:2;r.type=`data`,t+=e}}return e.length!==n.length&&ic(e,0,e.length,n),e}function Hl(e,t){let n=e.length,r=0,i,a,o;for(;n--;){let t=e[n][1];if(i){if(t.type===`link`||t.type===`labelLink`&&t._inactive)break;e[n][0]===`enter`&&t.type===`labelLink`&&(t._inactive=!0)}else if(a){if(e[n][0]===`enter`&&(t.type===`labelImage`||t.type===`labelLink`)&&!t._balanced&&(i=n,t.type!==`labelLink`)){r=2;break}}else t.type===`labelEnd`&&(a=n)}let s={type:e[i][1].type===`labelLink`?`link`:`image`,start:{...e[i][1].start},end:{...e[e.length-1][1].end}},c={type:`label`,start:{...e[i][1].start},end:{...e[a][1].end}},l={type:`labelText`,start:{...e[i+r+2][1].end},end:{...e[a-2][1].start}};return o=[[`enter`,s,t],[`enter`,c,t]],o=ac(o,e.slice(i+1,i+r+3)),o=ac(o,[[`enter`,l,t]]),o=ac(o,jc(t.parser.constructs.insideSpan.null,e.slice(i+r+4,a-3),t)),o=ac(o,[[`exit`,l,t],e[a-2],e[a-1],[`exit`,c,t]]),o=ac(o,e.slice(a+1)),o=ac(o,[[`exit`,s,t]]),ic(e,i,e.length,o),e}function Ul(e,t,n){let r=this,i=r._labelStarts,a,o;if(i){for(;i.length>0&&i[i.length-1]._balanced;)i.pop();a=i[i.length-1]}return s;function s(t){return a?a._inactive?d(t):(o=r.parser.defined.includes(dc(r.sliceSerialize({start:a.end,end:r.now()}))),e.enter(`labelEnd`),e.enter(`labelMarker`),e.consume(t),e.exit(`labelMarker`),e.exit(`labelEnd`),c):n(t)}function c(t){return t===40?e.attempt(Rl,u,o?u:d)(t):t===91?e.attempt(zl,u,o?l:d)(t):o?u(t):d(t)}function l(t){return e.attempt(Bl,u,d)(t)}function u(e){return i.pop(),t(e)}function d(e){return a._balanced=!0,n(e)}}function Wl(e,t,n){return r;function r(t){return e.enter(`resource`),e.enter(`resourceMarker`),e.consume(t),e.exit(`resourceMarker`),i}function i(t){return X(t)?vl(e,a)(t):a(t)}function a(t){return t===41?u(t):hl(e,o,s,`resourceDestination`,`resourceDestinationLiteral`,`resourceDestinationLiteralMarker`,`resourceDestinationRaw`,`resourceDestinationString`,32)(t)}function o(t){return X(t)?vl(e,c)(t):u(t)}function s(e){return n(e)}function c(t){return t===34||t===39||t===40?_l(e,l,n,`resourceTitle`,`resourceTitleMarker`,`resourceTitleString`)(t):u(t)}function l(t){return X(t)?vl(e,u)(t):u(t)}function u(r){return r===41?(e.enter(`resourceMarker`),e.consume(r),e.exit(`resourceMarker`),e.exit(`resource`),t):n(r)}}function Gl(e,t,n){let r=this;return i;function i(t){return gl.call(r,e,a,o,`reference`,`referenceMarker`,`referenceString`)(t)}function a(e){return r.parser.defined.includes(dc(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)))?t(e):n(e)}function o(e){return n(e)}}function Kl(e,t,n){return r;function r(t){return e.enter(`reference`),e.enter(`referenceMarker`),e.consume(t),e.exit(`referenceMarker`),i}function i(r){return r===93?(e.enter(`referenceMarker`),e.consume(r),e.exit(`referenceMarker`),e.exit(`reference`),t):n(r)}}var ql={name:`labelStartImage`,resolveAll:Ll.resolveAll,tokenize:Jl};function Jl(e,t,n){let r=this,i;return a;function a(t){return e.enter(`labelImage`),e.enter(`labelImageMarker`),e.consume(t),e.exit(`labelImageMarker`),o}function o(t){return t===91?(e.enter(`labelMarker`),e.consume(t),e.exit(`labelMarker`),i=e.exit(`labelImage`),s):n(t)}function s(e){return e===94&&`_hiddenFootnoteSupport`in r.parser.constructs?n(e):(r._labelStarts=r._labelStarts||[],r._labelStarts.push(i),t(e))}}var Yl={name:`labelStartLink`,resolveAll:Ll.resolveAll,tokenize:Xl};function Xl(e,t,n){let r=this,i;return a;function a(t){return e.enter(`labelLink`),e.enter(`labelMarker`),e.consume(t),e.exit(`labelMarker`),i=e.exit(`labelLink`),o}function o(e){return e===94&&`_hiddenFootnoteSupport`in r.parser.constructs?n(e):(r._labelStarts=r._labelStarts||[],r._labelStarts.push(i),t(e))}}var Zl={name:`lineEnding`,tokenize:Ql};function Ql(e,t){return n;function n(n){return e.enter(`lineEnding`),e.consume(n),e.exit(`lineEnding`),Q(e,t,`linePrefix`)}}var $l={name:`thematicBreak`,tokenize:eu};function eu(e,t,n){let r=0,i;return a;function a(t){return e.enter(`thematicBreak`),o(t)}function o(e){return i=e,s(e)}function s(a){return a===i?(e.enter(`thematicBreakSequence`),c(a)):r>=3&&(a===null||Y(a))?(e.exit(`thematicBreak`),t(a)):n(a)}function c(t){return t===i?(e.consume(t),r++,c):(e.exit(`thematicBreakSequence`),Z(t)?Q(e,s,`whitespace`)(t):s(t))}}var $={continuation:{tokenize:iu},exit:ou,name:`list`,tokenize:ru},tu={partial:!0,tokenize:su},nu={partial:!0,tokenize:au};function ru(e,t,n){let r=this,i=r.events[r.events.length-1],a=i&&i[1].type===`linePrefix`?i[2].sliceSerialize(i[1],!0).length:0,o=0;return s;function s(t){let i=r.containerState.type||(t===42||t===43||t===45?`listUnordered`:`listOrdered`);if(i===`listUnordered`?!r.containerState.marker||t===r.containerState.marker:mc(t)){if(r.containerState.type||(r.containerState.type=i,e.enter(i,{_container:!0})),i===`listUnordered`)return e.enter(`listItemPrefix`),t===42||t===45?e.check($l,n,l)(t):l(t);if(!r.interrupt||t===49)return e.enter(`listItemPrefix`),e.enter(`listItemValue`),c(t)}return n(t)}function c(t){return mc(t)&&++o<10?(e.consume(t),c):(!r.interrupt||o<2)&&(r.containerState.marker?t===r.containerState.marker:t===41||t===46)?(e.exit(`listItemValue`),l(t)):n(t)}function l(t){return e.enter(`listItemMarker`),e.consume(t),e.exit(`listItemMarker`),r.containerState.marker=r.containerState.marker||t,e.check(Rc,r.interrupt?n:u,e.attempt(tu,f,d))}function u(e){return r.containerState.initialBlankLine=!0,a++,f(e)}function d(t){return Z(t)?(e.enter(`listItemPrefixWhitespace`),e.consume(t),e.exit(`listItemPrefixWhitespace`),f):n(t)}function f(n){return r.containerState.size=a+r.sliceSerialize(e.exit(`listItemPrefix`),!0).length,t(n)}}function iu(e,t,n){let r=this;return r.containerState._closeFlow=void 0,e.check(Rc,i,a);function i(n){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,Q(e,t,`listItemIndent`,r.containerState.size+1)(n)}function a(n){return r.containerState.furtherBlankLines||!Z(n)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,o(n)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(nu,t,o)(n))}function o(i){return r.containerState._closeFlow=!0,r.interrupt=void 0,Q(e,e.attempt($,t,n),`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(i)}}function au(e,t,n){let r=this;return Q(e,i,`listItemIndent`,r.containerState.size+1);function i(e){let i=r.events[r.events.length-1];return i&&i[1].type===`listItemIndent`&&i[2].sliceSerialize(i[1],!0).length===r.containerState.size?t(e):n(e)}}function ou(e){e.exit(this.containerState.type)}function su(e,t,n){let r=this;return Q(e,i,`listItemPrefixWhitespace`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:5);function i(e){let i=r.events[r.events.length-1];return!Z(e)&&i&&i[1].type===`listItemPrefixWhitespace`?t(e):n(e)}}var cu={name:`setextUnderline`,resolveTo:lu,tokenize:uu};function lu(e,t){let n=new wc,r=e.length,i,a,o;for(;r--;)if(e[r][0]===`enter`){if(e[r][1].type===`content`){i=r;break}e[r][1].type===`paragraph`&&(a=r)}else e[r][1].type===`content`&&n.add(r,1,[]),!o&&e[r][1].type===`definition`&&(o=r);let s={type:`setextHeading`,start:{...e[i][1].start},end:{...e[e.length-1][1].end}};return e[a][1].type=`setextHeadingText`,o?(n.add(a,0,[[`enter`,s,t]]),n.add(o+1,0,[[`exit`,e[i][1],t]]),e[i][1].end={...e[o][1].end}):e[i][1]=s,n.add(e.length,0,[[`exit`,s,t]]),n.consume(e),e}function uu(e,t,n){let r=this,i;return a;function a(t){let a=r.events.length,s;for(;a--;)if(r.events[a][1].type!==`lineEnding`&&r.events[a][1].type!==`linePrefix`&&r.events[a][1].type!==`content`){s=r.events[a][1].type===`paragraph`;break}return!r.parser.lazy[r.now().line]&&(r.interrupt||s)?(e.enter(`setextHeadingLine`),i=t,o(t)):n(t)}function o(t){return e.enter(`setextHeadingLineSequence`),s(t)}function s(t){return t===i?(e.consume(t),s):(e.exit(`setextHeadingLineSequence`),Z(t)?Q(e,c,`lineSuffix`)(t):c(t))}function c(r){return r===null||Y(r)?(e.exit(`setextHeadingLine`),t(r)):n(r)}}var du={tokenize:fu};function fu(e){let t=this,n=e.attempt(Rc,r,e.attempt(this.parser.constructs.flowInitial,i,Q(e,e.attempt(this.parser.constructs.flow,i,e.attempt(ul,i)),`linePrefix`)));return n;function r(r){if(r===null)e.consume(r);else return e.enter(`lineEndingBlank`),e.consume(r),e.exit(`lineEndingBlank`),t.currentConstruct=void 0,n}function i(r){if(r===null)e.consume(r);else return e.enter(`lineEnding`),e.consume(r),e.exit(`lineEnding`),t.currentConstruct=void 0,n}}var pu={resolveAll:_u()},mu=gu(`string`),hu=gu(`text`);function gu(e){return{resolveAll:_u(e===`text`?vu:void 0),tokenize:t};function t(t){let n=this,r=this.parser.constructs[e],i=t.attempt(r,a,o);return a;function a(e){return c(e)?i(e):o(e)}function o(e){if(e===null)t.consume(e);else return t.enter(`data`),t.consume(e),s}function s(e){return c(e)?(t.exit(`data`),i(e)):(t.consume(e),s)}function c(e){if(e===null)return!0;let t=r[e],i=-1;if(t)for(;++i<t.length;){let e=t[i];if(!e.previous||e.previous.call(n,n.previous))return!0}return!1}}}function _u(e){return t;function t(t,n){let r=-1,i;for(;++r<=t.length;)i===void 0?t[r]&&t[r][1].type===`data`&&(i=r,r++):t[r]&&t[r][1].type===`data`||(r!==i+2&&(t[i][1].end=t[r-1][1].end,t.splice(i+2,r-i-2),r=i+2),i=void 0);return e?e(t,n):t}}function vu(e,t){let n=new wc,r=0;for(;++r<=e.length;)if((r===e.length||e[r][1].type===`lineEnding`)&&e[r-1][1].type===`data`){let i=e[r-1][1],a=t.sliceStream(i),o=a.length,s=-1,c=0,l;for(;o--;){let e=a[o];if(typeof e==`string`){for(s=e.length;e.charCodeAt(s-1)===32;)c++,s--;if(s)break;s=-1}else if(e===-2)l=!0,c++;else if(e!==-1){o++;break}}if(t._contentTypeTextTrailing&&r===e.length&&(c=0),c){let a={type:r===e.length||l||c<2?`lineSuffix`:`hardBreakTrailing`,start:{_bufferIndex:o?s:i.start._bufferIndex+s,_index:i.start._index+o,line:i.end.line,column:i.end.column-c,offset:i.end.offset-c},end:{...i.end}};i.end={...a.start},i.start.offset===i.end.offset?Object.assign(i,a):n.add(r,0,[[`enter`,a,t],[`exit`,a,t]])}r++}return n.consume(e),e}var yu=e({attentionMarkers:()=>Du,contentInitial:()=>xu,disable:()=>Ou,document:()=>bu,flow:()=>Cu,flowInitial:()=>Su,insideSpan:()=>Eu,string:()=>wu,text:()=>Tu}),bu={42:$,43:$,45:$,48:$,49:$,50:$,51:$,52:$,53:$,54:$,55:$,56:$,57:$,62:Bc},xu={91:yl},Su={[-2]:Qc,[-1]:Qc,32:Qc},Cu={35:Tl,42:$l,45:[cu,$l],60:Al,61:cu,95:$l,96:Xc,126:Xc},wu={38:Kc,92:Wc},Tu={[-5]:Zl,[-4]:Zl,[-3]:Zl,33:ql,38:Kc,42:Mc,60:[Ic,Fl],91:Yl,92:[Cl,Wc],93:Ll,95:Mc,96:nl},Eu={null:[Mc,pu]},Du={null:[42,95]},Ou={null:[]};function ku(e,t,n){let r={_bufferIndex:-1,_index:0,line:n&&n.line||1,column:n&&n.column||1,offset:n&&n.offset||0},i={},a=[],o=[],s=[],c={attempt:C(x),check:C(S),consume:v,enter:y,exit:b,interrupt:C(S,{interrupt:!0})},l={code:null,containerState:{},defineSkip:h,events:[],now:m,parser:e,previous:null,sliceSerialize:f,sliceStream:p,write:d},u=t.tokenize.call(l,c);return t.resolveAll&&a.push(t),l;function d(e){return o=ac(o,e),g(),o[o.length-1]===null?(w(t,0),l.events=jc(a,l.events,l),l.events):[]}function f(e,t){return ju(p(e),t)}function p(e){return Au(o,e)}function m(){let{_bufferIndex:e,_index:t,line:n,column:i,offset:a}=r;return{_bufferIndex:e,_index:t,line:n,column:i,offset:a}}function h(e){i[e.line]=e.column,E()}function g(){for(;r._index<o.length;){let e=o[r._index];if(typeof e==`string`){let t=r._index;for(r._bufferIndex<0&&(r._bufferIndex=0);r._index===t&&r._bufferIndex<e.length;)_(e.charCodeAt(r._bufferIndex))}else _(e)}}function _(e){u=u(e)}function v(e){Y(e)?(r.line++,r.column=1,r.offset+=e===-3?2:1,E()):e!==-1&&(r.column++,r.offset++),r._bufferIndex<0?r._index++:(r._bufferIndex++,r._bufferIndex===o[r._index].length&&(r._bufferIndex=-1,r._index++)),l.previous=e}function y(e,t){let n=t||{};return n.type=e,n.start=m(),l.events.push([`enter`,n,l]),s.push(n),n}function b(e){let t=s.pop();return t.end=m(),l.events.push([`exit`,t,l]),t}function x(e,t){w(e,t.from)}function S(e,t){t.restore()}function C(e,t){return n;function n(n,r,i){let a,o,s,u;return Array.isArray(n)?f(n):`tokenize`in n?f([n]):d(n);function d(e){return t;function t(t){let n=t!==null&&e[t],r=t!==null&&e.null;return f([...Array.isArray(n)?n:n?[n]:[],...Array.isArray(r)?r:r?[r]:[]])(t)}}function f(e){return a=e,o=0,e.length===0?i:p(e[o])}function p(e){return n;function n(n){return u=T(),s=e,e.partial||(l.currentConstruct=e),e.name&&l.parser.constructs.disable.null.includes(e.name)?h(n):e.tokenize.call(t?Object.assign(Object.create(l),t):l,c,m,h)(n)}}function m(t){return e(s,u),r}function h(e){return u.restore(),++o<a.length?p(a[o]):i}}}function w(e,t){e.resolveAll&&!a.includes(e)&&a.push(e),e.resolve&&ic(l.events,t,l.events.length-t,e.resolve(l.events.slice(t),l)),e.resolveTo&&(l.events=e.resolveTo(l.events,l))}function T(){let e=m(),t=l.previous,n=l.currentConstruct,i=l.events.length,a=Array.from(s);return{from:i,restore:o};function o(){r=e,l.previous=t,l.currentConstruct=n,l.events.length=i,s=a,E()}}function E(){r.line in i&&r.column<2&&(r.column=i[r.line],r.offset+=i[r.line]-1)}}function Au(e,t){let n=t.start._index,r=t.start._bufferIndex,i=t.end._index,a=t.end._bufferIndex,o;if(n===i)o=[e[n].slice(r,a)];else{if(o=e.slice(n,i),r>-1){let e=o[0];typeof e==`string`?o[0]=e.slice(r):o.shift()}a>0&&o.push(e[i].slice(0,a))}return o}function ju(e,t){let n=-1,r=[],i;for(;++n<e.length;){let a=e[n],o;if(typeof a==`string`)o=a;else switch(a){case-5:o=`\r`;break;case-4:o=`
5
+ `;break;case-3:o=`\r
6
+ `;break;case-2:o=t?` `:` `;break;case-1:if(!t&&i)continue;o=` `;break;default:o=String.fromCharCode(a)}i=a===-2,r.push(o)}return r.join(``)}function Mu(e){let t={constructs:sc([yu,...(e||{}).extensions||[]]),content:n(Sc),defined:[],document:n(Ec),flow:n(du),lazy:{},string:n(mu),text:n(hu)};return t;function n(e){return n;function n(n){return ku(t,e,n)}}}function Nu(e){for(;!cl(e););return e}var Pu=/[\0\t\n\r]/g;function Fu(){let e=1,t=``,n=!0,r;return i;function i(i,a,o){i=t+(typeof i==`string`?i.toString():new TextDecoder(a||void 0).decode(i));let s=[],c=0;for(t=``,n&&=(i.charCodeAt(0)===65279&&c++,void 0);c<i.length;){Pu.lastIndex=c;let n=Pu.exec(i),a=n&&n.index!==void 0?n.index:i.length,o=i.charCodeAt(a);if(!n){t=i.slice(c);break}if(o===10&&c===a&&r)s.push(-3),r=void 0;else switch(r&&=(s.push(-5),void 0),c<a&&(s.push(i.slice(c,a)),e+=a-c),o){case 0:s.push(65533),e++;break;case 9:{let t=Math.ceil(e/4)*4;for(s.push(-2);e++<t;)s.push(-1);break}case 10:s.push(-4),e=1;break;default:r=!0,e=1}c=a+1}return o&&(r&&s.push(-5),t&&s.push(t),s.push(null)),s}}var Iu=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function Lu(e){return e.replace(Iu,Ru)}function Ru(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){let e=n.charCodeAt(1),t=e===120||e===88;return uc(n.slice(t?2:1),t?16:10)}return rc(n)||e}var zu={}.hasOwnProperty;function Bu(e,t,n){return t&&typeof t==`object`&&(n=t,t=void 0),Vu(n)(Nu(Mu(n).document().write(Fu()(e,t,!0))))}function Vu(e){let t={afterExit:[],beforeEnter:[],transforms:[],canContainEols:[`emphasis`,`fragment`,`heading`,`paragraph`,`strong`],enter:{autolink:o(be),autolinkProtocol:E,autolinkEmail:E,atxHeading:o(ge),blockQuote:o(P),characterEscape:E,characterReference:E,codeFenced:o(pe),codeFencedFenceInfo:s,codeFencedFenceMeta:s,codeIndented:o(pe,s),codeText:o(F,s),codeTextData:E,data:E,codeFlowValue:E,definition:o(me),definitionDestinationString:s,definitionLabelString:s,definitionTitleString:s,emphasis:o(he),hardBreakEscape:o(_e),hardBreakTrailing:o(_e),htmlFlow:o(ve,s),htmlFlowData:E,htmlText:o(ve,s),htmlTextData:E,image:o(ye),label:s,link:o(be),listItem:o(Se),listItemValue:p,listOrdered:o(xe,f),listUnordered:o(xe),paragraph:o(Ce),reference:oe,referenceString:s,resourceDestinationString:s,resourceTitleString:s,setextHeading:o(ge),strong:o(we),thematicBreak:o(Ee)},exit:{atxHeading:l(),atxHeadingSequence:S,autolink:l(),autolinkEmail:fe,autolinkProtocol:de,blockQuote:l(),characterEscapeValue:D,characterReferenceMarkerHexadecimal:ce,characterReferenceMarkerNumeric:ce,characterReferenceValue:le,characterReference:ue,codeFenced:l(_),codeFencedFence:g,codeFencedFenceInfo:m,codeFencedFenceMeta:h,codeFlowValue:D,codeIndented:l(v),codeText:l(j),codeTextData:D,data:D,definition:l(),definitionDestinationString:x,definitionLabelString:y,definitionTitleString:b,emphasis:l(),hardBreakEscape:l(k),hardBreakTrailing:l(k),htmlFlow:l(ee),htmlFlowData:D,htmlText:l(A),htmlTextData:D,image:l(N),label:ne,labelText:te,lineEnding:O,link:l(M),listItem:l(),listOrdered:l(),listUnordered:l(),paragraph:l(),referenceString:se,resourceDestinationString:re,resourceTitleString:ie,resource:ae,setextHeading:l(T),setextHeadingLineSequence:w,setextHeadingText:C,strong:l(),thematicBreak:l()}};Uu(t,(e||{}).mdastExtensions||[]);let n={};return r;function r(e){let r={type:`root`,children:[],position:void 0},o={stack:[r],tokenStack:[],config:t,enter:c,exit:u,buffer:s,resume:d,data:n},l=[],f=[],p=-1;for(;++p<e.length;)f.push(e[p]),(e[p][1].type===`listOrdered`||e[p][1].type===`listUnordered`)&&(e[p][0]===`enter`?l.push(f.length-1):a(f,l.pop()));for(e=f,p=-1;++p<e.length;){let n=t[e[p][0]];e[p][0]===`enter`&&t.beforeEnter.length>0&&i(t.beforeEnter,{...o,sliceSerialize:e[p][2].sliceSerialize},e[p][1]),zu.call(n,e[p][1].type)&&n[e[p][1].type].call({...o,sliceSerialize:e[p][2].sliceSerialize},e[p][1]),e[p][0]===`exit`&&t.afterExit.length>0&&i(t.afterExit,{...o,sliceSerialize:e[p][2].sliceSerialize},e[p][1])}if(o.tokenStack.length>0){let e=o.tokenStack[o.tokenStack.length-1];(e[1]||Gu).call(o,void 0,e[0])}for(r.position={start:Hu(e.length>0?e[0][1].start:{line:1,column:1,offset:0}),end:Hu(e.length>0?e[e.length-2][1].end:{line:1,column:1,offset:0})},p=-1;++p<t.transforms.length;)r=t.transforms[p](r)||r;return r}function i(e,t,n){let r=-1;for(;++r<e.length;)e[r].call(t,n)}function a(e,t){let n=e.length-1,r=t-1,i=-1,a=!1,o,s,c,l,u=[];for(;++r<=n;){let t=e[r];switch(t[1].type){case`listUnordered`:case`listOrdered`:case`blockQuote`:t[0]===`enter`?i++:i--,l=void 0;break;case`lineEndingBlank`:t[0]===`enter`&&(o&&!l&&!i&&!c&&(c=r),l=void 0);break;case`linePrefix`:case`listItemValue`:case`listItemMarker`:case`listItemPrefix`:case`listItemPrefixWhitespace`:break;default:l=void 0}if(!i&&t[0]===`enter`&&t[1].type===`listItemPrefix`||i===-1&&t[0]===`exit`&&(t[1].type===`listUnordered`||t[1].type===`listOrdered`)){if(o){let n=r;for(s=void 0;n--;){let t=e[n];if(t[1].type===`lineEnding`||t[1].type===`lineEndingBlank`){if(t[0]===`exit`)continue;s&&(e[s][1].type=`lineEndingBlank`,a=!0),t[1].type=`lineEnding`,s=n}else if(t[1].type!==`linePrefix`&&t[1].type!==`blockQuotePrefix`&&t[1].type!==`blockQuotePrefixWhitespace`&&t[1].type!==`blockQuoteMarker`&&t[1].type!==`listItemIndent`)break}c&&(!s||c<s)&&(o._spread=!0),o.end=Object.assign({},s?e[s][1].start:t[1].end),u.push({at:s||r,event:[`exit`,o,t[2]]})}if(t[1].type===`listItemPrefix`){let e={type:`listItem`,_spread:!1,start:Object.assign({},t[1].start),end:void 0};o=e,u.push({at:r,event:[`enter`,e,t[2]]}),c=void 0,l=!0}}}let d=e.splice(t),f=0;for(r=-1;++r<d.length;){for(;f<u.length&&u[f].at===t+r;)e.push(u[f++].event);e.push(d[r])}e[t][1]._spread=a}function o(e,t){return n;function n(n){c.call(this,e(n),n),t&&t.call(this,n)}}function s(){this.stack.push({type:`fragment`,children:[]})}function c(e,t,n){this.stack[this.stack.length-1].children.push(e),this.stack.push(e),this.tokenStack.push([t,n||void 0]),e.position={start:Hu(t.start),end:void 0}}function l(e){return t;function t(t){e&&e.call(this,t),u.call(this,t)}}function u(e,t){let n=this.stack.pop(),r=this.tokenStack.pop();if(!r)throw Error("Cannot close `"+e.type+"` ("+_s({start:e.start,end:e.end})+`): it’s not open`);r[0].type!==e.type&&(t?t.call(this,e,r[0]):(r[1]||Gu).call(this,e,r[0])),n.position.end=Hu(e.end)}function d(){return Qs(this.stack.pop())}function f(){this.data.expectingFirstListItemValue=!0}function p(e){if(this.data.expectingFirstListItemValue){let t=this.stack[this.stack.length-2];t.start=Number.parseInt(this.sliceSerialize(e),10),this.data.expectingFirstListItemValue=void 0}}function m(){let e=this.resume(),t=this.stack[this.stack.length-1];t.lang=e}function h(){let e=this.resume(),t=this.stack[this.stack.length-1];t.meta=e}function g(){this.data.flowCodeInside||(this.buffer(),this.data.flowCodeInside=!0)}function _(){let e=this.resume(),t=this.stack[this.stack.length-1];t.value=e.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g,``),this.data.flowCodeInside=void 0}function v(){let e=this.resume(),t=this.stack[this.stack.length-1];t.value=e.replace(/(\r?\n|\r)$/g,``)}function y(e){let t=this.resume(),n=this.stack[this.stack.length-1];n.label=t,n.identifier=dc(this.sliceSerialize(e)).toLowerCase()}function b(){let e=this.resume(),t=this.stack[this.stack.length-1];t.title=e}function x(){let e=this.resume(),t=this.stack[this.stack.length-1];t.url=e}function S(e){let t=this.stack[this.stack.length-1];t.depth||=this.sliceSerialize(e).length}function C(){this.data.setextHeadingSlurpLineEnding=!0}function w(e){let t=this.stack[this.stack.length-1];t.depth=this.sliceSerialize(e).codePointAt(0)===61?1:2}function T(){this.data.setextHeadingSlurpLineEnding=void 0}function E(e){let t=this.stack[this.stack.length-1].children,n=t[t.length-1];n&&n.type===`text`||(n=Te(),n.position={start:Hu(e.start),end:void 0},t.push(n)),this.stack.push(n)}function D(e){let t=this.stack.pop();t.value+=this.sliceSerialize(e),t.position.end=Hu(e.end)}function O(e){let n=this.stack[this.stack.length-1];if(this.data.atHardBreak){let t=n.children[n.children.length-1];t.position.end=Hu(e.end),this.data.atHardBreak=void 0}else!this.data.setextHeadingSlurpLineEnding&&t.canContainEols.includes(n.type)&&(E.call(this,e),D.call(this,e))}function k(){this.data.atHardBreak=!0}function ee(){let e=this.resume(),t=this.stack[this.stack.length-1];t.value=e}function A(){let e=this.resume(),t=this.stack[this.stack.length-1];t.value=e}function j(){let e=this.resume(),t=this.stack[this.stack.length-1];t.value=e}function M(){let e=this.stack[this.stack.length-1];if(this.data.inReference){let t=this.data.referenceType||`shortcut`;e.type+=`Reference`,e.referenceType=t,delete e.url,delete e.title}else delete e.identifier,delete e.label;this.data.referenceType=void 0}function N(){let e=this.stack[this.stack.length-1];if(this.data.inReference){let t=this.data.referenceType||`shortcut`;e.type+=`Reference`,e.referenceType=t,delete e.url,delete e.title}else delete e.identifier,delete e.label;this.data.referenceType=void 0}function te(e){let t=this.sliceSerialize(e),n=this.stack[this.stack.length-2];n.label=Lu(t),n.identifier=dc(t).toLowerCase()}function ne(){let e=this.stack[this.stack.length-1],t=this.resume(),n=this.stack[this.stack.length-1];this.data.inReference=!0,n.type===`link`?n.children=e.children:n.alt=t}function re(){let e=this.resume(),t=this.stack[this.stack.length-1];t.url=e}function ie(){let e=this.resume(),t=this.stack[this.stack.length-1];t.title=e}function ae(){this.data.inReference=void 0}function oe(){this.data.referenceType=`collapsed`}function se(e){let t=this.resume(),n=this.stack[this.stack.length-1];n.label=t,n.identifier=dc(this.sliceSerialize(e)).toLowerCase(),this.data.referenceType=`full`}function ce(e){this.data.characterReferenceType=e.type}function le(e){let t=this.sliceSerialize(e),n=this.data.characterReferenceType,r;n?(r=uc(t,n===`characterReferenceMarkerNumeric`?10:16),this.data.characterReferenceType=void 0):r=rc(t);let i=this.stack[this.stack.length-1];i.value+=r}function ue(e){let t=this.stack.pop();t.position.end=Hu(e.end)}function de(e){D.call(this,e);let t=this.stack[this.stack.length-1];t.url=this.sliceSerialize(e)}function fe(e){D.call(this,e);let t=this.stack[this.stack.length-1];t.url=`mailto:`+this.sliceSerialize(e)}function P(){return{type:`blockquote`,children:[],position:void 0}}function pe(){return{type:`code`,lang:null,meta:null,value:``,position:void 0}}function F(){return{type:`inlineCode`,value:``,position:void 0}}function me(){return{type:`definition`,identifier:``,label:null,title:null,url:``,position:void 0}}function he(){return{type:`emphasis`,children:[],position:void 0}}function ge(){return{type:`heading`,depth:0,children:[],position:void 0}}function _e(){return{type:`break`,position:void 0}}function ve(){return{type:`html`,value:``,position:void 0}}function ye(){return{type:`image`,title:null,url:``,alt:null,position:void 0}}function be(){return{type:`link`,title:null,url:``,children:[],position:void 0}}function xe(e){return{type:`list`,ordered:e.type===`listOrdered`,start:null,spread:e._spread,children:[],position:void 0}}function Se(e){return{type:`listItem`,spread:e._spread,checked:null,children:[],position:void 0}}function Ce(){return{type:`paragraph`,children:[],position:void 0}}function we(){return{type:`strong`,children:[],position:void 0}}function Te(){return{type:`text`,value:``,position:void 0}}function Ee(){return{type:`thematicBreak`,position:void 0}}}function Hu(e){return{line:e.line,column:e.column,offset:e.offset}}function Uu(e,t){let n=-1;for(;++n<t.length;){let r=t[n];Array.isArray(r)?Uu(e,r):Wu(e,r)}}function Wu(e,t){let n;for(n in t)if(zu.call(t,n))switch(n){case`canContainEols`:{let r=t[n];r&&e[n].push(...r);break}case`transforms`:{let r=t[n];r&&e[n].push(...r);break}case`afterExit`:case`beforeEnter`:{let r=t[n];r&&e[n].push(r);break}case`enter`:case`exit`:{let r=t[n];r&&Object.assign(e[n],r);break}}}function Gu(e,t){throw Error(e?"Cannot close `"+e.type+"` ("+_s({start:e.start,end:e.end})+"): a different token (`"+t.type+"`, "+_s({start:t.start,end:t.end})+`) is open`:"Cannot close document, a token (`"+t.type+"`, "+_s({start:t.start,end:t.end})+`) is still open`)}function Ku(e){let t=this;t.parser=n;function n(n){return Bu(n,{...t.data(`settings`),...e,extensions:t.data(`micromarkExtensions`)||[],mdastExtensions:t.data(`fromMarkdownExtensions`)||[]})}}function qu(e,t){let n={type:`element`,tagName:`blockquote`,properties:{},children:e.wrap(e.all(t),!0)};return e.patch(t,n),e.applyData(t,n)}function Ju(e,t){let n={type:`element`,tagName:`br`,properties:{},children:[]};return e.patch(t,n),[e.applyData(t,n),{type:`text`,value:`
7
+ `}]}function Yu(e,t){let n=t.value?t.value+`
8
+ `:``,r={},i=t.lang?t.lang.split(/\s+/):[];i.length>0&&(r.className=[`language-`+i[0]]);let a={type:`element`,tagName:`code`,properties:r,children:[{type:`text`,value:n}]};return t.meta&&(a.data={meta:t.meta}),e.patch(t,a),a=e.applyData(t,a),a={type:`element`,tagName:`pre`,properties:{},children:[a]},e.patch(t,a),a}function Xu(e,t){let n={type:`element`,tagName:`del`,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Zu(e,t){let n={type:`element`,tagName:`em`,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Qu(e,t){let n=typeof e.options.clobberPrefix==`string`?e.options.clobberPrefix:`user-content-`,r=String(t.identifier).toUpperCase(),i=bc(r.toLowerCase()),a=e.footnoteOrder.indexOf(r),o,s=e.footnoteCounts.get(r);s===void 0?(s=0,e.footnoteOrder.push(r),o=e.footnoteOrder.length):o=a+1,s+=1,e.footnoteCounts.set(r,s);let c={type:`element`,tagName:`a`,properties:{href:`#`+n+`fn-`+i,id:n+`fnref-`+i+(s>1?`-`+s:``),dataFootnoteRef:!0,ariaDescribedBy:[`footnote-label`]},children:[{type:`text`,value:String(o)}]};e.patch(t,c);let l={type:`element`,tagName:`sup`,properties:{},children:[c]};return e.patch(t,l),e.applyData(t,l)}function $u(e,t){let n={type:`element`,tagName:`h`+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function ed(e,t){if(e.options.allowDangerousHtml){let n={type:`raw`,value:t.value};return e.patch(t,n),e.applyData(t,n)}}function td(e,t){let n=t.referenceType,r=`]`;if(n===`collapsed`?r+=`[]`:n===`full`&&(r+=`[`+(t.label||t.identifier)+`]`),t.type===`imageReference`)return[{type:`text`,value:`![`+t.alt+r}];let i=e.all(t),a=i[0];a&&a.type===`text`?a.value=`[`+a.value:i.unshift({type:`text`,value:`[`});let o=i[i.length-1];return o&&o.type===`text`?o.value+=r:i.push({type:`text`,value:r}),i}function nd(e,t){let n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return td(e,t);let i={src:bc(r.url||``),alt:t.alt};r.title!==null&&r.title!==void 0&&(i.title=r.title);let a={type:`element`,tagName:`img`,properties:i,children:[]};return e.patch(t,a),e.applyData(t,a)}function rd(e,t){let n={src:bc(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);let r={type:`element`,tagName:`img`,properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function id(e,t){let n={type:`text`,value:t.value.replace(/\r?\n|\r/g,` `)};e.patch(t,n);let r={type:`element`,tagName:`code`,properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function ad(e,t){let n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return td(e,t);let i={href:bc(r.url||``)};r.title!==null&&r.title!==void 0&&(i.title=r.title);let a={type:`element`,tagName:`a`,properties:i,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function od(e,t){let n={href:bc(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);let r={type:`element`,tagName:`a`,properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function sd(e,t,n){let r=e.all(t),i=n?cd(n):ld(t),a={},o=[];if(typeof t.checked==`boolean`){let e=r[0],n;e&&e.type===`element`&&e.tagName===`p`?n=e:(n={type:`element`,tagName:`p`,properties:{},children:[]},r.unshift(n)),n.children.length>0&&n.children.unshift({type:`text`,value:` `}),n.children.unshift({type:`element`,tagName:`input`,properties:{type:`checkbox`,checked:t.checked,disabled:!0},children:[]}),a.className=[`task-list-item`]}let s=-1;for(;++s<r.length;){let e=r[s];(i||s!==0||e.type!==`element`||e.tagName!==`p`)&&o.push({type:`text`,value:`
9
+ `}),e.type===`element`&&e.tagName===`p`&&!i?o.push(...e.children):o.push(e)}let c=r[r.length-1];c&&(i||c.type!==`element`||c.tagName!==`p`)&&o.push({type:`text`,value:`
10
+ `});let l={type:`element`,tagName:`li`,properties:a,children:o};return e.patch(t,l),e.applyData(t,l)}function cd(e){let t=!1;if(e.type===`list`){t=e.spread||!1;let n=e.children,r=-1;for(;!t&&++r<n.length;)t=ld(n[r])}return t}function ld(e){return e.spread??e.children.length>1}function ud(e,t){let n={},r=e.all(t),i=-1;for(typeof t.start==`number`&&t.start!==1&&(n.start=t.start);++i<r.length;){let e=r[i];if(e.type===`element`&&e.tagName===`li`&&e.properties&&Array.isArray(e.properties.className)&&e.properties.className.includes(`task-list-item`)){n.className=[`contains-task-list`];break}}let a={type:`element`,tagName:t.ordered?`ol`:`ul`,properties:n,children:e.wrap(r,!0)};return e.patch(t,a),e.applyData(t,a)}function dd(e,t){let n={type:`element`,tagName:`p`,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function fd(e,t){let n={type:`root`,children:e.wrap(e.all(t))};return e.patch(t,n),e.applyData(t,n)}function pd(e,t){let n={type:`element`,tagName:`strong`,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function md(e,t){let n=e.all(t),r=n.shift(),i=[];if(r){let n={type:`element`,tagName:`thead`,properties:{},children:e.wrap([r],!0)};e.patch(t.children[0],n),i.push(n)}if(n.length>0){let r={type:`element`,tagName:`tbody`,properties:{},children:e.wrap(n,!0)},a=ms(t.children[1]),o=ps(t.children[t.children.length-1]);a&&o&&(r.position={start:a,end:o}),i.push(r)}let a={type:`element`,tagName:`table`,properties:{},children:e.wrap(i,!0)};return e.patch(t,a),e.applyData(t,a)}function hd(e,t,n){let r=n?n.children:void 0,i=(r?r.indexOf(t):1)===0?`th`:`td`,a=n&&n.type===`table`?n.align:void 0,o=a?a.length:t.children.length,s=-1,c=[];for(;++s<o;){let n=t.children[s],r={},o=a?a[s]:void 0;o&&(r.align=o);let l={type:`element`,tagName:i,properties:r,children:[]};n&&(l.children=e.all(n),e.patch(n,l),l=e.applyData(n,l)),c.push(l)}let l={type:`element`,tagName:`tr`,properties:{},children:e.wrap(c,!0)};return e.patch(t,l),e.applyData(t,l)}function gd(e,t){let n={type:`element`,tagName:`td`,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}var _d=9,vd=32;function yd(e){let t=String(e),n=/\r?\n|\r/g,r=n.exec(t),i=0,a=[];for(;r;)a.push(bd(t.slice(i,r.index),i>0,!0),r[0]),i=r.index+r[0].length,r=n.exec(t);return a.push(bd(t.slice(i),i>0,!1)),a.join(``)}function bd(e,t,n){let r=0,i=e.length;if(t){let t=e.codePointAt(r);for(;t===_d||t===vd;)r++,t=e.codePointAt(r)}if(n){let t=e.codePointAt(i-1);for(;t===_d||t===vd;)i--,t=e.codePointAt(i-1)}return i>r?e.slice(r,i):``}function xd(e,t){let n={type:`text`,value:yd(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function Sd(e,t){let n={type:`element`,tagName:`hr`,properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}var Cd={blockquote:qu,break:Ju,code:Yu,delete:Xu,emphasis:Zu,footnoteReference:Qu,heading:$u,html:ed,imageReference:nd,image:rd,inlineCode:id,linkReference:ad,link:od,listItem:sd,list:ud,paragraph:dd,root:fd,strong:pd,table:md,tableCell:gd,tableRow:hd,text:xd,thematicBreak:Sd,toml:wd,yaml:wd,definition:wd,footnoteDefinition:wd};function wd(){}var{defineProperty:Td}=Object,Ed=typeof self==`object`?self:globalThis,Dd=(e,t)=>{switch(e){case`Function`:case`SharedWorker`:case`Worker`:case`eval`:case`setInterval`:case`setTimeout`:throw TypeError(`unable to deserialize `+e)}return new Ed[e](t)},Od=(e,t)=>{let n=(t,n)=>(e.set(n,t),t),r=i=>{if(e.has(i))return e.get(i);let[a,o]=t[i];switch(a){case 0:case-1:return n(o,i);case 1:{let e=n([],i);for(let t of o)e.push(r(t));return e}case 2:{let e=n({},i);for(let[t,n]of o){let i=r(t),a=r(n);i===`__proto__`?Td(e,i,{value:a,configurable:!0,enumerable:!0,writable:!0}):e[i]=a}return e}case 3:return n(new Date(o),i);case 4:{let{source:e,flags:t}=o;return n(new RegExp(e,t),i)}case 5:{let e=n(new Map,i);for(let[t,n]of o)e.set(r(t),r(n));return e}case 6:{let e=n(new Set,i);for(let t of o)e.add(r(t));return e}case 7:{let{name:e,message:t}=o;return n(typeof Ed[e]==`function`?Dd(e,t):Error(t),i)}case 8:return n(BigInt(o),i);case`BigInt`:return n(Object(BigInt(o)),i);case`ArrayBuffer`:return n(new Uint8Array(o).buffer,o);case`DataView`:{let{buffer:e}=new Uint8Array(o);return n(new DataView(e),o)}case`-0`:return-0}return n(Dd(a,o),i)};return r},kd=e=>Od(new Map,e)(0),Ad=``,{toString:jd}={},{keys:Md,is:Nd}=Object,Pd=e=>{let t=typeof e;if(t!==`object`||!e)return[0,t];let n=jd.call(e).slice(8,-1);switch(n){case`Array`:return[1,Ad];case`Object`:return[2,Ad];case`Date`:return[3,Ad];case`RegExp`:return[4,Ad];case`Map`:return[5,Ad];case`Set`:return[6,Ad];case`DataView`:return[1,n]}return n.includes(`Array`)?[1,n]:e instanceof Error?[7,e.name||`Error`]:[2,n]},Fd=([e,t])=>e===0&&(t===`function`||t===`symbol`),Id=(e,t,n,r)=>{let i=(e,t)=>{let i=r.push(e)-1;return n.set(t,i),i},a=o=>{if(n.has(o))return n.get(o);let[s,c]=Pd(o);switch(s){case 0:{let t=o;switch(c){case`bigint`:s=8,t=o.toString();break;case`number`:if(!o&&Nd(o,-0))return r.push([`-0`])-1;break;case`function`:case`symbol`:if(e)throw TypeError(`unable to serialize `+c);t=null;break;case`undefined`:return i([-1],o)}return i([s,t],o)}case 1:{if(c){let e=o;return c===`DataView`?e=new Uint8Array(o.buffer):c===`ArrayBuffer`&&(e=new Uint8Array(o)),i([c,[...e]],o)}let e=[],t=i([s,e],o);for(let t of o)e.push(a(t));return t}case 2:{if(c)switch(c){case`BigInt`:return i([c,o.toString()],o);case`Boolean`:case`Number`:case`String`:return i([c,o.valueOf()],o)}if(t&&`toJSON`in o)return a(o.toJSON());let n=[],r=i([s,n],o);for(let t of Md(o))(e||!Fd(Pd(o[t])))&&n.push([a(t),a(o[t])]);return r}case 3:return i([s,isNaN(o.getTime())?Ad:o.toISOString()],o);case 4:{let{source:e,flags:t}=o;return i([s,{source:e,flags:t}],o)}case 5:{let t=[],n=i([s,t],o);for(let[n,r]of o)(e||!(Fd(Pd(n))||Fd(Pd(r))))&&t.push([a(n),a(r)]);return n}case 6:{let t=[],n=i([s,t],o);for(let n of o)(e||!Fd(Pd(n)))&&t.push(a(n));return n}}let{message:l}=o;return i([s,{name:c,message:l}],o)};return a},Ld=(e,{json:t,lossy:n}={})=>{let r=[];return Id(!(t||n),!!t,new Map,r)(e),r},Rd=typeof structuredClone==`function`?(e,t)=>t&&(`json`in t||`lossy`in t)?kd(Ld(e,t)):structuredClone(e):(e,t)=>kd(Ld(e,t));function zd(e,t){let n=[{type:`text`,value:`↩`}];return t>1&&n.push({type:`element`,tagName:`sup`,properties:{},children:[{type:`text`,value:String(t)}]}),n}function Bd(e,t){return`Back to reference `+(e+1)+(t>1?`-`+t:``)}function Vd(e){let t=typeof e.options.clobberPrefix==`string`?e.options.clobberPrefix:`user-content-`,n=e.options.footnoteBackContent||zd,r=e.options.footnoteBackLabel||Bd,i=e.options.footnoteLabel||`Footnotes`,a=e.options.footnoteLabelTagName||`h2`,o=e.options.footnoteLabelProperties||{className:[`sr-only`]},s=[],c=-1;for(;++c<e.footnoteOrder.length;){let i=e.footnoteById.get(e.footnoteOrder[c]);if(!i)continue;let a=e.all(i),o=String(i.identifier).toUpperCase(),l=bc(o.toLowerCase()),u=0,d=[],f=e.footnoteCounts.get(o);for(;f!==void 0&&++u<=f;){d.length>0&&d.push({type:`text`,value:` `});let e=typeof n==`string`?n:n(c,u);typeof e==`string`&&(e={type:`text`,value:e}),d.push({type:`element`,tagName:`a`,properties:{href:`#`+t+`fnref-`+l+(u>1?`-`+u:``),dataFootnoteBackref:``,ariaLabel:typeof r==`string`?r:r(c,u),className:[`data-footnote-backref`]},children:Array.isArray(e)?e:[e]})}let p=a[a.length-1];if(p&&p.type===`element`&&p.tagName===`p`){let e=p.children[p.children.length-1];e&&e.type===`text`?e.value+=` `:p.children.push({type:`text`,value:` `}),p.children.push(...d)}else a.push(...d);let m={type:`element`,tagName:`li`,properties:{id:t+`fn-`+l},children:e.wrap(a,!0)};e.patch(i,m),s.push(m)}if(s.length!==0)return{type:`element`,tagName:`section`,properties:{dataFootnotes:!0,className:[`footnotes`]},children:[{type:`element`,tagName:a,properties:{...Rd(o),id:`footnote-label`},children:[{type:`text`,value:i}]},{type:`text`,value:`
11
+ `},{type:`element`,tagName:`ol`,properties:{},children:e.wrap(s,!0)},{type:`text`,value:`
12
+ `}]}}var Hd=(function(e){if(e==null)return qd;if(typeof e==`function`)return Kd(e);if(typeof e==`object`)return Array.isArray(e)?Ud(e):Wd(e);if(typeof e==`string`)return Gd(e);throw Error(`Expected function, string, or object as test`)});function Ud(e){let t=[],n=-1;for(;++n<e.length;)t[n]=Hd(e[n]);return Kd(r);function r(...e){let n=-1;for(;++n<t.length;)if(t[n].apply(this,e))return!0;return!1}}function Wd(e){let t=e;return Kd(n);function n(n){let r=n,i;for(i in e)if(r[i]!==t[i])return!1;return!0}}function Gd(e){return Kd(t);function t(t){return t&&t.type===e}}function Kd(e){return t;function t(t,n,r){return!!(Jd(t)&&e.call(this,t,typeof n==`number`?n:void 0,r||void 0))}}function qd(){return!0}function Jd(e){return typeof e==`object`&&!!e&&`type`in e}function Yd(e){return e}var Xd=[];function Zd(e,t,n,r){let i;typeof t==`function`&&typeof n!=`function`?(r=n,n=t):i=t;let a=Hd(i),o=r?-1:1;s(e,void 0,[])();function s(e,i,c){let l=e&&typeof e==`object`?e:{};if(typeof l.type==`string`){let t=typeof l.tagName==`string`?l.tagName:typeof l.name==`string`?l.name:void 0;Object.defineProperty(u,"name",{value:`node (`+Yd(e.type+(t?`<`+t+`>`:``))+`)`})}return u;function u(){let l=Xd,u,d,f;if((!t||a(e,i,c[c.length-1]||void 0))&&(l=Qd(n(e,c)),l[0]===!1))return l;if(`children`in e&&e.children){let t=e;if(t.children&&l[0]!==`skip`)for(d=(r?t.children.length:-1)+o,f=c.concat(t);d>-1&&d<t.children.length;){let e=t.children[d];if(u=s(e,d,f)(),u[0]===!1)return u;d=typeof u[1]==`number`?u[1]:d+o}}return l}}}function Qd(e){return Array.isArray(e)?e:typeof e==`number`?[!0,e]:e==null?Xd:[e]}function $d(e,t,n,r){let i,a,o;typeof t==`function`&&typeof n!=`function`?(a=void 0,o=t,i=n):(a=t,o=n,i=r),Zd(e,a,s,i);function s(e,t){let n=t[t.length-1],r=n?n.children.indexOf(e):void 0;return o(e,r,n)}}var ef={}.hasOwnProperty,tf={};function nf(e,t){let n=t||tf,r=new Map,i=new Map,a={all:s,applyData:af,definitionById:r,footnoteById:i,footnoteCounts:new Map,footnoteOrder:[],handlers:{...Cd,...n.handlers},one:o,options:n,patch:rf,wrap:sf};return $d(e,function(e){if(e.type===`definition`||e.type===`footnoteDefinition`){let t=e.type===`definition`?r:i,n=String(e.identifier).toUpperCase();t.has(n)||t.set(n,e)}}),a;function o(e,t){let n=e.type,r=a.handlers[n];if(ef.call(a.handlers,n)&&r)return r(a,e,t);if(a.options.passThrough&&a.options.passThrough.includes(n)){if(`children`in e){let{children:t,...n}=e,r=Rd(n);return r.children=a.all(e),r}return Rd(e)}return(a.options.unknownHandler||of)(a,e,t)}function s(e){let t=[];if(`children`in e){let n=e.children,r=-1;for(;++r<n.length;){let i=a.one(n[r],e);if(i){if(r&&n[r-1].type===`break`&&(!Array.isArray(i)&&i.type===`text`&&(i.value=cf(i.value)),!Array.isArray(i)&&i.type===`element`)){let e=i.children[0];e&&e.type===`text`&&(e.value=cf(e.value))}Array.isArray(i)?t.push(...i):t.push(i)}}}return t}}function rf(e,t){e.position&&(t.position=gs(e))}function af(e,t){let n=t;if(e&&e.data){let t=e.data.hName,r=e.data.hChildren,i=e.data.hProperties;typeof t==`string`&&(n.type===`element`?n.tagName=t:n={type:`element`,tagName:t,properties:{},children:`children`in n?n.children:[n]}),n.type===`element`&&i&&Object.assign(n.properties,Rd(i)),`children`in n&&n.children&&r!=null&&(n.children=r)}return n}function of(e,t){let n=t.data||{},r=`value`in t&&!(ef.call(n,`hProperties`)||ef.call(n,`hChildren`))?{type:`text`,value:t.value}:{type:`element`,tagName:`div`,properties:{},children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function sf(e,t){let n=[],r=-1;for(t&&n.push({type:`text`,value:`
13
+ `});++r<e.length;)r&&n.push({type:`text`,value:`
14
+ `}),n.push(e[r]);return t&&e.length>0&&n.push({type:`text`,value:`
15
+ `}),n}function cf(e){let t=0,n=e.charCodeAt(t);for(;n===9||n===32;)t++,n=e.charCodeAt(t);return e.slice(t)}function lf(e,t){let n=nf(e,t),r=n.one(e,void 0),i=Vd(n),a=Array.isArray(r)?{type:`root`,children:r}:r||{type:`root`,children:[]};return i&&(`children`in a,a.children.push({type:`text`,value:`
16
+ `},i)),a}function uf(e,t){return e&&`run`in e?async function(n,r){let i=lf(n,{file:r,...t});await e.run(i,r)}:function(n,r){return lf(n,{file:r,...e||t})}}function df(e){if(e)throw e}var ff=t(n(((e,t)=>{var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=function(e){return typeof Array.isArray==`function`?Array.isArray(e):r.call(e)===`[object Array]`},s=function(e){if(!e||r.call(e)!==`[object Object]`)return!1;var t=n.call(e,`constructor`),i=e.constructor&&e.constructor.prototype&&n.call(e.constructor.prototype,`isPrototypeOf`);if(e.constructor&&!t&&!i)return!1;for(var a in e);return a===void 0||n.call(e,a)},c=function(e,t){i&&t.name===`__proto__`?i(e,t.name,{enumerable:!0,configurable:!0,value:t.newValue,writable:!0}):e[t.name]=t.newValue},l=function(e,t){if(t===`__proto__`){if(!n.call(e,t))return;if(a)return a(e,t).value}return e[t]};t.exports=function e(){var t,n,r,i,a,u,d=arguments[0],f=1,p=arguments.length,m=!1;for(typeof d==`boolean`&&(m=d,d=arguments[1]||{},f=2),(d==null||typeof d!=`object`&&typeof d!=`function`)&&(d={});f<p;++f)if(t=arguments[f],t!=null)for(n in t)r=l(d,n),i=l(t,n),d!==i&&(m&&i&&(s(i)||(a=o(i)))?(a?(a=!1,u=r&&o(r)?r:[]):u=r&&s(r)?r:{},c(d,{name:n,newValue:e(m,u,i)})):i!==void 0&&c(d,{name:n,newValue:i}));return d}}))(),1);function pf(e){if(typeof e!=`object`||!e)return!1;let t=Object.getPrototypeOf(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}function mf(){let e=[],t={run:n,use:r};return t;function n(...t){let n=-1,r=t.pop();if(typeof r!=`function`)throw TypeError(`Expected function as last argument, not `+r);i(null,...t);function i(a,...o){let s=e[++n],c=-1;if(a)r(a);else{for(;++c<t.length;)(o[c]===null||o[c]===void 0)&&(o[c]=t[c]);t=o,s?hf(s,i)(...o):r(null,...o)}}}function r(n){if(typeof n!=`function`)throw TypeError("Expected `middelware` to be a function, not "+n);return e.push(n),t}}function hf(e,t){let n;return r;function r(...t){let r=e.length>t.length,o;r&&t.push(i);try{o=e.apply(this,t)}catch(e){let t=e;if(r&&n)throw t;return i(t)}r||(o&&o.then&&typeof o.then==`function`?o.then(a,i):o instanceof Error?i(o):a(o))}function i(e,...r){n||(n=!0,t(e,...r))}function a(e){i(null,e)}}var gf={basename:_f,dirname:vf,extname:yf,join:bf,sep:`/`};function _f(e,t){if(t!==void 0&&typeof t!=`string`)throw TypeError(`"ext" argument must be a string`);Cf(e);let n=0,r=-1,i=e.length,a;if(t===void 0||t.length===0||t.length>e.length){for(;i--;)if(e.codePointAt(i)===47){if(a){n=i+1;break}}else r<0&&(a=!0,r=i+1);return r<0?``:e.slice(n,r)}if(t===e)return``;let o=-1,s=t.length-1;for(;i--;)if(e.codePointAt(i)===47){if(a){n=i+1;break}}else o<0&&(a=!0,o=i+1),s>-1&&(e.codePointAt(i)===t.codePointAt(s--)?s<0&&(r=i):(s=-1,r=o));return n===r?r=o:r<0&&(r=e.length),e.slice(n,r)}function vf(e){if(Cf(e),e.length===0)return`.`;let t=-1,n=e.length,r;for(;--n;)if(e.codePointAt(n)===47){if(r){t=n;break}}else r||=!0;return t<0?e.codePointAt(0)===47?`/`:`.`:t===1&&e.codePointAt(0)===47?`//`:e.slice(0,t)}function yf(e){Cf(e);let t=e.length,n=-1,r=0,i=-1,a=0,o;for(;t--;){let s=e.codePointAt(t);if(s===47){if(o){r=t+1;break}}else n<0&&(o=!0,n=t+1),s===46?i<0?i=t:a!==1&&(a=1):i>-1&&(a=-1)}return i<0||n<0||a===0||a===1&&i===n-1&&i===r+1?``:e.slice(i,n)}function bf(...e){let t=-1,n;for(;++t<e.length;)Cf(e[t]),e[t]&&(n=n===void 0?e[t]:n+`/`+e[t]);return n===void 0?`.`:xf(n)}function xf(e){Cf(e);let t=e.codePointAt(0)===47,n=Sf(e,!t);return n.length===0&&!t&&(n=`.`),n.length>0&&e.codePointAt(e.length-1)===47&&(n+=`/`),t?`/`+n:n}function Sf(e,t){let n=``,r=0,i=-1,a=0,o=-1,s,c;for(;++o<=e.length;){if(o<e.length)s=e.codePointAt(o);else if(s===47)break;else s=47;if(s===47){if(i!==o-1&&a!==1){if(i!==o-1&&a===2){if(n.length<2||r!==2||n.codePointAt(n.length-1)!==46||n.codePointAt(n.length-2)!==46){if(n.length>2){if(c=n.lastIndexOf(`/`),c!==n.length-1){c<0?(n=``,r=0):(n=n.slice(0,c),r=n.length-1-n.lastIndexOf(`/`)),i=o,a=0;continue}}else if(n.length>0){n=``,r=0,i=o,a=0;continue}}t&&(n=n.length>0?n+`/..`:`..`,r=2)}else n.length>0?n+=`/`+e.slice(i+1,o):n=e.slice(i+1,o),r=o-i-1}i=o,a=0}else s===46&&a>-1?a++:a=-1}return n}function Cf(e){if(typeof e!=`string`)throw TypeError(`Path must be a string. Received `+JSON.stringify(e))}var wf={cwd:Tf};function Tf(){return`/`}function Ef(e){return!!(typeof e==`object`&&e&&`href`in e&&e.href&&`protocol`in e&&e.protocol&&e.auth===void 0)}function Df(e){if(typeof e==`string`)e=new URL(e);else if(!Ef(e)){let t=TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw t.code=`ERR_INVALID_ARG_TYPE`,t}if(e.protocol!==`file:`){let e=TypeError(`The URL must be of scheme file`);throw e.code=`ERR_INVALID_URL_SCHEME`,e}return Of(e)}function Of(e){if(e.hostname!==``){let e=TypeError(`File URL host must be "localhost" or empty on darwin`);throw e.code=`ERR_INVALID_FILE_URL_HOST`,e}let t=e.pathname,n=-1;for(;++n<t.length;)if(t.codePointAt(n)===37&&t.codePointAt(n+1)===50){let e=t.codePointAt(n+2);if(e===70||e===102){let e=TypeError(`File URL path must not include encoded / characters`);throw e.code=`ERR_INVALID_FILE_URL_PATH`,e}}return decodeURIComponent(t)}var kf=[`history`,`path`,`basename`,`stem`,`extname`,`dirname`],Af=class{constructor(e){let t;t=e?Ef(e)?{path:e}:typeof e==`string`||Pf(e)?{value:e}:e:{},this.cwd=`cwd`in t?``:wf.cwd(),this.data={},this.history=[],this.messages=[],this.value,this.map,this.result,this.stored;let n=-1;for(;++n<kf.length;){let e=kf[n];e in t&&t[e]!==void 0&&t[e]!==null&&(this[e]=e===`history`?[...t[e]]:t[e])}let r;for(r in t)kf.includes(r)||(this[r]=t[r])}get basename(){return typeof this.path==`string`?gf.basename(this.path):void 0}set basename(e){Mf(e,`basename`),jf(e,`basename`),this.path=gf.join(this.dirname||``,e)}get dirname(){return typeof this.path==`string`?gf.dirname(this.path):void 0}set dirname(e){Nf(this.basename,`dirname`),this.path=gf.join(e||``,this.basename)}get extname(){return typeof this.path==`string`?gf.extname(this.path):void 0}set extname(e){if(jf(e,`extname`),Nf(this.dirname,`extname`),e){if(e.codePointAt(0)!==46)throw Error("`extname` must start with `.`");if(e.includes(`.`,1))throw Error("`extname` cannot contain multiple dots")}this.path=gf.join(this.dirname,this.stem+(e||``))}get path(){return this.history[this.history.length-1]}set path(e){Ef(e)&&(e=Df(e)),Mf(e,`path`),this.path!==e&&this.history.push(e)}get stem(){return typeof this.path==`string`?gf.basename(this.path,this.extname):void 0}set stem(e){Mf(e,`stem`),jf(e,`stem`),this.path=gf.join(this.dirname||``,e+(this.extname||``))}fail(e,t,n){let r=this.message(e,t,n);throw r.fatal=!0,r}info(e,t,n){let r=this.message(e,t,n);return r.fatal=void 0,r}message(e,t,n){let r=new K(e,t,n);return this.path&&(r.name=this.path+`:`+r.name,r.file=this.path),r.fatal=!1,this.messages.push(r),r}toString(e){return this.value===void 0?``:typeof this.value==`string`?this.value:new TextDecoder(e||void 0).decode(this.value)}};function jf(e,t){if(e&&e.includes(gf.sep))throw Error("`"+t+"` cannot be a path: did not expect `"+gf.sep+"`")}function Mf(e,t){if(!e)throw Error("`"+t+"` cannot be empty")}function Nf(e,t){if(!e)throw Error("Setting `"+t+"` requires `path` to be set too")}function Pf(e){return!!(e&&typeof e==`object`&&`byteLength`in e&&`byteOffset`in e)}var Ff=(function(e){let t=this.constructor.prototype,n=t[e],r=function(){return n.apply(r,arguments)};return Object.setPrototypeOf(r,t),r}),If={}.hasOwnProperty,Lf=new class e extends Ff{constructor(){super(`copy`),this.Compiler=void 0,this.Parser=void 0,this.attachers=[],this.compiler=void 0,this.freezeIndex=-1,this.frozen=void 0,this.namespace={},this.parser=void 0,this.transformers=mf()}copy(){let t=new e,n=-1;for(;++n<this.attachers.length;){let e=this.attachers[n];t.use(...e)}return t.data((0,ff.default)(!0,{},this.namespace)),t}data(e,t){return typeof e==`string`?arguments.length===2?(Bf(`data`,this.frozen),this.namespace[e]=t,this):If.call(this.namespace,e)&&this.namespace[e]||void 0:e?(Bf(`data`,this.frozen),this.namespace=e,this):this.namespace}freeze(){if(this.frozen)return this;let e=this;for(;++this.freezeIndex<this.attachers.length;){let[t,...n]=this.attachers[this.freezeIndex];if(n[0]===!1)continue;n[0]===!0&&(n[0]=void 0);let r=t.call(e,...n);typeof r==`function`&&this.transformers.use(r)}return this.frozen=!0,this.freezeIndex=1/0,this}parse(e){this.freeze();let t=Uf(e),n=this.parser||this.Parser;return Rf(`parse`,n),n(String(t),t)}process(e,t){let n=this;return this.freeze(),Rf(`process`,this.parser||this.Parser),zf(`process`,this.compiler||this.Compiler),t?r(void 0,t):new Promise(r);function r(r,i){let a=Uf(e),o=n.parse(a);n.run(o,a,function(e,t,r){if(e||!t||!r)return s(e);let i=t,a=n.stringify(i,r);Gf(a)?r.value=a:r.result=a,s(e,r)});function s(e,n){e||!n?i(e):r?r(n):t(void 0,n)}}}processSync(e){let t=!1,n;return this.freeze(),Rf(`processSync`,this.parser||this.Parser),zf(`processSync`,this.compiler||this.Compiler),this.process(e,r),Hf(`processSync`,`process`,t),n;function r(e,r){t=!0,df(e),n=r}}run(e,t,n){Vf(e),this.freeze();let r=this.transformers;return!n&&typeof t==`function`&&(n=t,t=void 0),n?i(void 0,n):new Promise(i);function i(i,a){let o=Uf(t);r.run(e,o,s);function s(t,r,o){let s=r||e;t?a(t):i?i(s):n(void 0,s,o)}}}runSync(e,t){let n=!1,r;return this.run(e,t,i),Hf(`runSync`,`run`,n),r;function i(e,t){df(e),r=t,n=!0}}stringify(e,t){this.freeze();let n=Uf(t),r=this.compiler||this.Compiler;return zf(`stringify`,r),Vf(e),r(e,n)}use(e,...t){let n=this.attachers,r=this.namespace;if(Bf(`use`,this.frozen),e!=null){if(typeof e==`function`)s(e,t);else if(typeof e==`object`)Array.isArray(e)?o(e):a(e);else throw TypeError("Expected usable value, not `"+e+"`")}return this;function i(e){if(typeof e==`function`)s(e,[]);else if(typeof e==`object`){if(Array.isArray(e)){let[t,...n]=e;s(t,n)}else a(e)}else throw TypeError("Expected usable value, not `"+e+"`")}function a(e){if(!(`plugins`in e)&&!(`settings`in e))throw Error("Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither");o(e.plugins),e.settings&&(r.settings=(0,ff.default)(!0,r.settings,e.settings))}function o(e){let t=-1;if(e!=null){if(Array.isArray(e))for(;++t<e.length;){let n=e[t];i(n)}else throw TypeError("Expected a list of plugins, not `"+e+"`")}}function s(e,t){let r=-1,i=-1;for(;++r<n.length;)if(n[r][0]===e){i=r;break}if(i===-1)n.push([e,...t]);else if(t.length>0){let[r,...a]=t,o=n[i][1];pf(o)&&pf(r)&&(r=(0,ff.default)(!0,o,r)),n[i]=[e,r,...a]}}}}().freeze();function Rf(e,t){if(typeof t!=`function`)throw TypeError("Cannot `"+e+"` without `parser`")}function zf(e,t){if(typeof t!=`function`)throw TypeError("Cannot `"+e+"` without `compiler`")}function Bf(e,t){if(t)throw Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function Vf(e){if(!pf(e)||typeof e.type!=`string`)throw TypeError("Expected node, got `"+e+"`")}function Hf(e,t,n){if(!n)throw Error("`"+e+"` finished async. Use `"+t+"` instead")}function Uf(e){return Wf(e)?e:new Af(e)}function Wf(e){return!!(e&&typeof e==`object`&&`message`in e&&`messages`in e)}function Gf(e){return typeof e==`string`||Kf(e)}function Kf(e){return!!(e&&typeof e==`object`&&`byteLength`in e&&`byteOffset`in e)}var qf=[],Jf={allowDangerousHtml:!0},Yf=/^(https?|ircs?|mailto|xmpp)$/i,Xf=[{from:`astPlugins`,id:`remove-buggy-html-in-markdown-parser`},{from:`allowDangerousHtml`,id:`remove-buggy-html-in-markdown-parser`},{from:`allowNode`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`allowElement`},{from:`allowedTypes`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`allowedElements`},{from:`className`,id:`remove-classname`},{from:`disallowedTypes`,id:`replace-allownode-allowedtypes-and-disallowedtypes`,to:`disallowedElements`},{from:`escapeHtml`,id:`remove-buggy-html-in-markdown-parser`},{from:`includeElementIndex`,id:`#remove-includeelementindex`},{from:`includeNodeIndex`,id:`change-includenodeindex-to-includeelementindex`},{from:`linkTarget`,id:`remove-linktarget`},{from:`plugins`,id:`change-plugins-to-remarkplugins`,to:`remarkPlugins`},{from:`rawSourcePos`,id:`#remove-rawsourcepos`},{from:`renderers`,id:`change-renderers-to-components`,to:`components`},{from:`source`,id:`change-source-to-children`,to:`children`},{from:`sourcePos`,id:`#remove-sourcepos`},{from:`transformImageUri`,id:`#add-urltransform`,to:`urlTransform`},{from:`transformLinkUri`,id:`#add-urltransform`,to:`urlTransform`}];function Zf(e){let t=Qf(e),n=$f(e);return ep(t.runSync(t.parse(n),n),e)}function Qf(e){let t=e.rehypePlugins||qf,n=e.remarkPlugins||qf,r=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...Jf}:Jf;return Lf().use(Ku).use(n).use(uf,r).use(t)}function $f(e){let t=e.children||``,n=new Af;return typeof t==`string`?n.value=t:``+t,n}function ep(e,t){let n=t.allowedElements,r=t.allowElement,i=t.components,a=t.disallowedElements,o=t.skipHtml,s=t.unwrapDisallowed,c=t.urlTransform||tp;for(let e of Xf)Object.hasOwn(t,e.from)&&``+e.from+(e.to?"use `"+e.to+"` instead":`remove it`)+e.id;return $d(e,l),Os(e,{Fragment:B.Fragment,components:i,ignoreInvalidStyle:!0,jsx:B.jsx,jsxs:B.jsxs,passKeys:!0,passNode:!0});function l(e,t,i){if(e.type===`raw`&&i&&typeof t==`number`)return o?i.children.splice(t,1):i.children[t]={type:`text`,value:e.value},t;if(e.type===`element`){let t;for(t in Xs)if(Object.hasOwn(Xs,t)&&Object.hasOwn(e.properties,t)){let n=e.properties[t],r=Xs[t];(r===null||r.includes(e.tagName))&&(e.properties[t]=c(String(n||``),t,e))}}if(e.type===`element`){let o=n?!n.includes(e.tagName):a?a.includes(e.tagName):!1;if(!o&&r&&typeof t==`number`&&(o=!r(e,t,i)),o&&i&&typeof t==`number`)return s&&e.children?i.children.splice(t,1,...e.children):i.children.splice(t,1),t}}}function tp(e){let t=e.indexOf(`:`),n=e.indexOf(`?`),r=e.indexOf(`#`),i=e.indexOf(`/`);return t===-1||i!==-1&&t>i||n!==-1&&t>n||r!==-1&&t>r||Yf.test(e.slice(0,t))?e:``}function np(e,t){let n=String(e);if(typeof t!=`string`)throw TypeError(`Expected character`);let r=0,i=n.indexOf(t);for(;i!==-1;)r++,i=n.indexOf(t,i+t.length);return r}function rp(e){if(typeof e!=`string`)throw TypeError(`Expected a string`);return e.replace(/[|\\{}()[\]^$+*?.]/g,`\\$&`).replace(/-/g,`\\x2d`)}function ip(e,t,n){let r=Hd((n||{}).ignore||[]),i=ap(t),a=-1;for(;++a<i.length;)Zd(e,`text`,o);function o(e,t){let n=-1,i;for(;++n<t.length;){let e=t[n],a=i?i.children:void 0;if(r(e,a?a.indexOf(e):void 0,i))return;i=e}if(i)return s(e,t)}function s(e,t){let n=t[t.length-1],r=i[a][0],o=i[a][1],s=0,c=n.children.indexOf(e),l=!1,u=[];r.lastIndex=0;let d=r.exec(e.value);for(;d;){let n=d.index,i={index:d.index,input:d.input,stack:[...t,e]},a=o(...d,i);if(typeof a==`string`&&(a=a.length>0?{type:`text`,value:a}:void 0),a===!1)r.lastIndex=n+1;else{if(s!==n&&f({type:`text`,value:e.value.slice(s,n)}),Array.isArray(a))for(let e of a)f(e);else a&&f(a);s=n+d[0].length,l=!0}if(!r.global)break;d=r.exec(e.value)}return l?(s<e.value.length&&f({type:`text`,value:e.value.slice(s)}),n.children.splice(c,1,...u)):u=[e],c+u.length;function f(e){let t=u[u.length-1];t&&t.type===`text`&&e.type===`text`?t.value+=e.value:u.push(e)}}}function ap(e){if(!Array.isArray(e))throw TypeError(`Expected find and replace tuple or list of tuples`);let t=[],n=!e[0]||Array.isArray(e[0])?e:[e],r=-1;for(;++r<n.length;){let e=n[r];t.push([op(e[0]),sp(e[1])])}return t}function op(e){return typeof e==`string`?new RegExp(rp(e),`g`):e}function sp(e){return typeof e==`function`?e:function(){return e}}var cp=`phrasing`,lp=[`autolink`,`link`,`image`,`label`];function up(){return{transforms:[vp],enter:{literalAutolink:fp,literalAutolinkEmail:pp,literalAutolinkHttp:pp,literalAutolinkWww:pp},exit:{literalAutolink:_p,literalAutolinkEmail:gp,literalAutolinkHttp:mp,literalAutolinkWww:hp}}}function dp(){return{unsafe:[{character:`@`,before:`[+\\-.\\w]`,after:`[\\-.\\w]`,inConstruct:cp,notInConstruct:lp},{character:`.`,before:`[Ww]`,after:`[\\-.\\w]`,inConstruct:cp,notInConstruct:lp},{character:`:`,before:`[ps]`,after:`\\/`,inConstruct:cp,notInConstruct:lp}]}}function fp(e){this.enter({type:`link`,title:null,url:``,children:[]},e)}function pp(e){this.config.enter.autolinkProtocol.call(this,e)}function mp(e){this.config.exit.autolinkProtocol.call(this,e)}function hp(e){this.config.exit.data.call(this,e);let t=this.stack[this.stack.length-1];t.type,t.url=`http://`+this.sliceSerialize(e)}function gp(e){this.config.exit.autolinkEmail.call(this,e)}function _p(e){this.exit(e)}function vp(e){ip(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,yp],[/(?<=^|\s|\p{P}|\p{S})([-.\w+]+)@([-\w]+(?:\.[-\w]+)+)/gu,bp]],{ignore:[`link`,`linkReference`]})}function yp(e,t,n,r,i){let a=``;if(!Cp(i)||(/^w/i.test(t)&&(n=t+n,t=``,a=`http://`),!xp(n)))return!1;let o=Sp(n+r);if(!o[0])return!1;let s={type:`link`,title:null,url:a+t+o[0],children:[{type:`text`,value:t+o[0]}]};return o[1]?[s,{type:`text`,value:o[1]}]:s}function bp(e,t,n,r){return!Cp(r,!0)||/[-\d_]$/.test(n)?!1:{type:`link`,title:null,url:`mailto:`+t+`@`+n,children:[{type:`text`,value:t+`@`+n}]}}function xp(e){let t=e.split(`.`);return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Sp(e){let t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(`)`),i=np(e,`(`),a=np(e,`)`);for(;r!==-1&&i>a;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(`)`),a++;return[e,n]}function Cp(e,t){let n=e.input.charCodeAt(e.index-1);return(e.index===0||vc(n)||_c(n))&&(!t||n!==47)}Np.peek=Mp;function wp(){this.buffer()}function Tp(e){this.enter({type:`footnoteReference`,identifier:``,label:``},e)}function Ep(){this.buffer()}function Dp(e){this.enter({type:`footnoteDefinition`,identifier:``,label:``,children:[]},e)}function Op(e){let t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.identifier=dc(this.sliceSerialize(e)).toLowerCase(),n.label=t}function kp(e){this.exit(e)}function Ap(e){let t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.identifier=dc(this.sliceSerialize(e)).toLowerCase(),n.label=t}function jp(e){this.exit(e)}function Mp(){return`[`}function Np(e,t,n,r){let i=n.createTracker(r),a=i.move(`[^`),o=n.enter(`footnoteReference`),s=n.enter(`reference`);return a+=i.move(n.safe(n.associationId(e),{after:`]`,before:a})),s(),o(),a+=i.move(`]`),a}function Pp(){return{enter:{gfmFootnoteCallString:wp,gfmFootnoteCall:Tp,gfmFootnoteDefinitionLabelString:Ep,gfmFootnoteDefinition:Dp},exit:{gfmFootnoteCallString:Op,gfmFootnoteCall:kp,gfmFootnoteDefinitionLabelString:Ap,gfmFootnoteDefinition:jp}}}function Fp(e){let t=!1;return e&&e.firstLineBlank&&(t=!0),{handlers:{footnoteDefinition:n,footnoteReference:Np},unsafe:[{character:`[`,inConstruct:[`label`,`phrasing`,`reference`]}]};function n(e,n,r,i){let a=r.createTracker(i),o=a.move(`[^`),s=r.enter(`footnoteDefinition`),c=r.enter(`label`);return o+=a.move(r.safe(r.associationId(e),{before:o,after:`]`})),c(),o+=a.move(`]:`),e.children&&e.children.length>0&&(a.shift(4),o+=a.move((t?`
17
+ `:` `)+r.indentLines(r.containerFlow(e,a.current()),t?Lp:Ip))),s(),o}}function Ip(e,t,n){return t===0?e:Lp(e,t,n)}function Lp(e,t,n){return(n?``:` `)+e}var Rp=[`autolink`,`destinationLiteral`,`destinationRaw`,`reference`,`titleQuote`,`titleApostrophe`];Up.attention=Wp,Up.peek=Gp;function zp(){return{canContainEols:[`delete`],enter:{strikethrough:Vp},exit:{strikethrough:Hp}}}function Bp(){return{handlers:{delete:Up},unsafe:[{character:`~`,inConstruct:`phrasing`,notInConstruct:Rp}]}}function Vp(e){this.enter({type:`delete`,children:[],position:void 0},e)}function Hp(e){this.exit(e)}function Up(e,t,n,r){let i=n.createTracker(r),a=n.stack.includes(`strikethrough`)?`~`:`~~`,o=n.enter(`strikethrough`),s=i.move(a);return s+=n.containerPhrasing(e,{...i.current(),before:s,after:`~`}),s+=i.move(a),o(),s}function Wp(){return{construct:`strikethrough`,markers:[`~`],sizes:[2,1]}}function Gp(){return`~`}function Kp(e){return e.length}function qp(e,t){let n=t||{},r=(n.align||[]).concat(),i=n.stringLength||Kp,a=[],o=[],s=[],c=[],l=0,u=-1;for(;++u<e.length;){let t=[],r=[],a=-1;for(e[u].length>l&&(l=e[u].length);++a<e[u].length;){let o=Jp(e[u][a]);if(n.alignDelimiters!==!1){let e=i(o);r[a]=e,(c[a]===void 0||e>c[a])&&(c[a]=e)}t.push(o)}o[u]=t,s[u]=r}let d=-1;if(typeof r==`object`&&`length`in r)for(;++d<l;)a[d]=Yp(r[d]);else{let e=Yp(r);for(;++d<l;)a[d]=e}d=-1;let f=[],p=[];for(;++d<l;){let e=a[d],t=``,r=``;e===99?(t=`:`,r=`:`):e===108?t=`:`:e===114&&(r=`:`);let i=n.alignDelimiters===!1?1:Math.max(1,c[d]-t.length-r.length),o=t+`-`.repeat(i)+r;n.alignDelimiters!==!1&&(i=t.length+i+r.length,i>c[d]&&(c[d]=i),p[d]=i),f[d]=o}o.splice(1,0,f),s.splice(1,0,p),u=-1;let m=[];for(;++u<o.length;){let e=o[u],t=s[u];d=-1;let r=[];for(;++d<l;){let i=e[d]||``,o=``,s=``;if(n.alignDelimiters!==!1){let e=c[d]-(t[d]||0),n=a[d];n===114?o=` `.repeat(e):n===99?e%2?(o=` `.repeat(e/2+.5),s=` `.repeat(e/2-.5)):(o=` `.repeat(e/2),s=o):s=` `.repeat(e)}n.delimiterStart!==!1&&!d&&r.push(`|`),n.padding===!1||n.alignDelimiters===!1&&i===``||n.delimiterStart===!1&&!d||r.push(` `),n.alignDelimiters!==!1&&r.push(o),r.push(i),n.alignDelimiters!==!1&&r.push(s),n.padding!==!1&&r.push(` `),(n.delimiterEnd!==!1||d!==l-1)&&r.push(`|`)}m.push(n.delimiterEnd===!1?r.join(``).replace(/ +$/,``):r.join(``))}return m.join(`
18
+ `)}function Jp(e){return e==null?``:String(e)}function Yp(e){let t=typeof e==`string`?e.codePointAt(0):0;return t===67||t===99?99:t===76||t===108?108:t===82||t===114?114:0}var Xp=Hd([`break`,`delete`,`emphasis`,`footnote`,`footnoteReference`,`image`,`imageReference`,`inlineCode`,`inlineMath`,`link`,`linkReference`,`mdxJsxTextElement`,`mdxTextExpression`,`strong`,`text`,`textDirective`]);function Zp(e,t,n,r){let i=n.enter(`blockquote`),a=n.createTracker(r);a.move(`> `),a.shift(2);let o=n.indentLines(n.containerFlow(e,a.current()),Qp);return i(),o}function Qp(e,t,n){return`>`+(n?``:` `)+e}function $p(e,t){return em(e,t.inConstruct,!0)&&!em(e,t.notInConstruct,!1)}function em(e,t,n){if(typeof t==`string`&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++r<t.length;)if(e.includes(t[r]))return!0;return!1}function tm(e,t,n,r){let i=-1;for(;++i<n.unsafe.length;){let e=n.unsafe[i];if(e.character===`
19
+ `&&!e.before&&!e.after&&$p(n.stack,e))return/[\t ]/.test(r.before)?``:` `}return`\\
20
+ `}function nm(e,t){let n=String(e),r=n.indexOf(t),i=r,a=0,o=0;if(typeof t!=`string`)throw TypeError(`Expected substring`);for(;r!==-1;)r===i?++a>o&&(o=a):a=1,i=r+t.length,r=n.indexOf(t,i);return o}function rm(e,t){return!(t.options.fences!==!1||!e.value||e.lang||!/[^\n\r ]/.test(e.value)||/^[\t ]*(?:[\n\r]|$)|(?:^|[\n\r])[\t ]*$/.test(e.value))}function im(e){let t=e.options.fence||"`";if(t!=="`"&&t!==`~`)throw Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function am(e,t,n,r){let i=im(n),a=e.value||``;if(rm(e,n)){let e=n.enter(`codeIndented`),t=n.indentLines(a,om);return e(),t}let o=n.createTracker(r),s=i.repeat(Math.max(nm(a,i)+1,3)),c=n.enter(`codeFenced`),l=i==="`"?`GraveAccent`:`Tilde`,u=o.move(s);if(e.lang){let t=n.enter(`codeFencedLang${l}`);u+=o.move(n.safe(e.lang,{before:u,after:` `,encode:["`"],...o.current()})),t()}if(e.lang&&e.meta){let t=n.enter(`codeFencedMeta${l}`);u+=o.move(` `),u+=o.move(n.safe(e.meta,{before:u,after:`
21
+ `,encode:["`"],...o.current()})),t()}return u+=o.move(`
22
+ `),a&&(u+=o.move(a+`
23
+ `)),u+=o.move(s),c(),u}function om(e,t,n){return(n?``:` `)+e}function sm(e){let t=e.options.quote||`"`;if(t!==`"`&&t!==`'`)throw Error("Cannot serialize title with `"+t+"` for `options.quote`, expected `\"`, or `'`");return t}function cm(e,t,n,r){let i=sm(n),a=i===`"`?`Quote`:`Apostrophe`,o=n.enter(`definition`),s=n.enter(`label`),c=n.createTracker(r),l=c.move(`[`);return l+=c.move(n.safe(n.associationId(e),{before:l,after:`]`,...c.current()})),l+=c.move(`]: `),s(),!e.url||/[\0- \u007F]/.test(e.url)?(s=n.enter(`destinationLiteral`),l+=c.move(`<`),l+=c.move(n.safe(e.url,{before:l,after:`>`,...c.current()})),l+=c.move(`>`)):(s=n.enter(`destinationRaw`),l+=c.move(n.safe(e.url,{before:l,after:e.title?` `:`
24
+ `,...c.current()}))),s(),e.title&&(s=n.enter(`title${a}`),l+=c.move(` `+i),l+=c.move(n.safe(e.title,{before:l,after:i,...c.current()})),l+=c.move(i),s()),o(),l}function lm(e){let t=e.options.emphasis||`*`;if(t!==`*`&&t!==`_`)throw Error("Cannot serialize emphasis with `"+t+"` for `options.emphasis`, expected `*`, or `_`");return t}um.attention=dm,um.peek=fm;function um(e,t,n,r){let i=n.enter(`phrasing`),a=n.containerPhrasing({type:`root`,children:[e]},r);return i(),a}function dm(e,t){return{construct:`emphasis`,markers:lm(t)===`*`?[`*`,`_`]:[`_`,`*`],sizes:[1]}}function fm(e,t,n){return n.options.emphasis||`*`}function pm(e){return`&#x`+e.toString(16).toUpperCase()+`;`}function mm(e,t){let n=!1;return $d(e,function(e){if(`value`in e&&/\r?\n|\r/.test(e.value)||e.type===`break`)return n=!0,!1}),!!((!e.depth||e.depth<3)&&Qs(e)&&(t.options.setext||n))}function hm(e,t,n,r){let i=Math.max(Math.min(6,e.depth||1),1),a=n.createTracker(r);if(mm(e,n)){let t=n.enter(`headingSetext`),r=n.enter(`phrasing`),o=n.containerPhrasing(e,{...a.current(),before:`
25
+ `,after:`
26
+ `});return r(),t(),o+`
27
+ `+(i===1?`=`:`-`).repeat(o.length-(Math.max(o.lastIndexOf(`\r`),o.lastIndexOf(`
28
+ `))+1))}let o=`#`.repeat(i),s=n.enter(`headingAtx`),c=n.enter(`phrasing`);a.move(o+` `);let l=n.containerPhrasing(e,{before:`# `,after:`
29
+ `,...a.current()}),u=l.charCodeAt(0);return(u===9||u===32)&&(l=pm(u)+l.slice(1)),l=l?o+` `+l:o,n.options.closeAtx&&(l+=` `+o),c(),s(),l}gm.peek=_m;function gm(e){return e.value||``}function _m(){return`<`}vm.peek=ym;function vm(e,t,n,r){let i=sm(n),a=i===`"`?`Quote`:`Apostrophe`,o=n.enter(`image`),s=n.enter(`label`),c=n.createTracker(r),l=c.move(`![`);return l+=c.move(n.safe(e.alt,{before:l,after:`]`,...c.current()})),l+=c.move(`](`),s(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(s=n.enter(`destinationLiteral`),l+=c.move(`<`),l+=c.move(n.safe(e.url,{before:l,after:`>`,...c.current()})),l+=c.move(`>`)):(s=n.enter(`destinationRaw`),l+=c.move(n.safe(e.url,{before:l,after:e.title?` `:`)`,...c.current()}))),s(),e.title&&(s=n.enter(`title${a}`),l+=c.move(` `+i),l+=c.move(n.safe(e.title,{before:l,after:i,...c.current()})),l+=c.move(i),s()),l+=c.move(`)`),o(),l}function ym(){return`!`}bm.peek=xm;function bm(e,t,n,r){let i=e.referenceType,a=n.enter(`imageReference`),o=n.enter(`label`),s=n.createTracker(r),c=s.move(`![`),l=n.safe(e.alt,{before:c,after:`]`,...s.current()});c+=s.move(l+`][`),o();let u=n.stack;n.stack=u.filter(function(e){return e!==`phrasing`}),o=n.enter(`reference`);let d=n.safe(n.associationId(e),{before:c,after:`]`,...s.current()});return o(),n.stack=u,a(),i===`full`||!l||l!==d?c+=s.move(d+`]`):i===`shortcut`?c=c.slice(0,-1):c+=s.move(`]`),c}function xm(){return`!`}Sm.peek=Cm;function Sm(e,t,n){let r=e.value||``,i="`",a=-1;for(;RegExp("(^|[^`])"+i+"([^`]|$)").test(r);)i+="`";for(/[^\n\r ]/.test(r)&&(/^[\n\r ]/.test(r)&&/[\n\r ]$/.test(r)||/^`|`$/.test(r))&&(r=` `+r+` `);++a<n.unsafe.length;){let e=n.unsafe[a],t=n.compilePattern(e);if(!e.atBreak)continue;let i;for(;i=t.exec(r);){let e=i.index;r.charCodeAt(e)===10&&r.charCodeAt(e-1)===13&&e--,r=r.slice(0,e)+` `+r.slice(i.index+1)}}return i+r+i}function Cm(){return"`"}function wm(e,t){let n=Qs(e);return!(t.options.resourceLink||!e.url||e.title||!e.children||e.children.length!==1||e.children[0].type!==`text`||n!==e.url&&`mailto:`+n!==e.url||!/^[a-z][+\-.a-z]+:/i.test(e.url)||/[\0- <>\u007F]/.test(e.url))}Tm.peek=Em;function Tm(e,t,n,r){let i=sm(n),a=i===`"`?`Quote`:`Apostrophe`,o=n.createTracker(r);if(wm(e,n)){let t=n.stack;n.stack=t.filter(function(e){return e!==`phrasing`});let r=n.enter(`autolink`),i=o.move(`<`);return i+=o.move(n.containerPhrasing(e,{before:i,after:`>`,...o.current()})),i+=o.move(`>`),r(),n.stack=t,i}let s=n.enter(`link`),c=n.enter(`label`),l=o.move(`[`);return l+=o.move(n.containerPhrasing(e,{before:l,after:`](`,...o.current()})),l+=o.move(`](`),c(),!e.url&&e.title||/[\0- \u007F]/.test(e.url)?(c=n.enter(`destinationLiteral`),l+=o.move(`<`),l+=o.move(n.safe(e.url,{before:l,after:`>`,...o.current()})),l+=o.move(`>`)):(c=n.enter(`destinationRaw`),l+=o.move(n.safe(e.url,{before:l,after:e.title?` `:`)`,...o.current()}))),c(),e.title&&(c=n.enter(`title${a}`),l+=o.move(` `+i),l+=o.move(n.safe(e.title,{before:l,after:i,...o.current()})),l+=o.move(i),c()),l+=o.move(`)`),s(),l}function Em(e,t,n){return wm(e,n)?`<`:`[`}Dm.peek=Om;function Dm(e,t,n,r){let i=e.referenceType,a=n.enter(`linkReference`),o=n.enter(`label`),s=n.createTracker(r),c=s.move(`[`),l=n.containerPhrasing(e,{before:c,after:`]`,...s.current()});c+=s.move(l+`][`),o();let u=n.stack;n.stack=u.filter(function(e){return e!==`phrasing`}),o=n.enter(`reference`);let d=n.safe(n.associationId(e),{before:c,after:`]`,...s.current()});return o(),n.stack=u,a(),i===`full`||!l||l!==d?c+=s.move(d+`]`):i===`shortcut`?c=c.slice(0,-1):c+=s.move(`]`),c}function Om(){return`[`}function km(e){let t=e.options.bullet||`*`;if(t!==`*`&&t!==`+`&&t!==`-`)throw Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}function Am(e){let t=km(e),n=e.options.bulletOther;if(!n)return t===`*`?`-`:`*`;if(n!==`*`&&n!==`+`&&n!==`-`)throw Error("Cannot serialize items with `"+n+"` for `options.bulletOther`, expected `*`, `+`, or `-`");if(n===t)throw Error("Expected `bullet` (`"+t+"`) and `bulletOther` (`"+n+"`) to be different");return n}function jm(e){let t=e.options.bulletOrdered||`.`;if(t!==`.`&&t!==`)`)throw Error("Cannot serialize items with `"+t+"` for `options.bulletOrdered`, expected `.` or `)`");return t}function Mm(e){let t=e.options.rule||`*`;if(t!==`*`&&t!==`-`&&t!==`_`)throw Error("Cannot serialize rules with `"+t+"` for `options.rule`, expected `*`, `-`, or `_`");return t}function Nm(e,t,n,r){let i=n.enter(`list`),a=n.bulletCurrent,o=e.ordered?jm(n):km(n),s=e.ordered?o===`.`?`)`:`.`:Am(n),c=t&&n.bulletLastUsed?o===n.bulletLastUsed:!1;if(!e.ordered){let t=e.children?e.children[0]:void 0;if(o!==`*`&&o!==`-`||!t||t.children&&t.children[0]||n.stack[n.stack.length-1]!==`list`||n.stack[n.stack.length-2]!==`listItem`||n.stack[n.stack.length-3]!==`list`||n.stack[n.stack.length-4]!==`listItem`||n.indexStack[n.indexStack.length-1]!==0||n.indexStack[n.indexStack.length-2]!==0||n.indexStack[n.indexStack.length-3]!==0||(c=!0),Mm(n)===o&&t){let t=-1;for(;++t<e.children.length;){let n=e.children[t];if(n&&n.type===`listItem`&&n.children&&n.children[0]&&n.children[0].type===`thematicBreak`){c=!0;break}}}}c&&(o=s),n.bulletCurrent=o;let l=n.containerFlow(e,r);return n.bulletLastUsed=o,n.bulletCurrent=a,i(),l}function Pm(e){let t=e.options.listItemIndent||`one`;if(t!==`tab`&&t!==`one`&&t!==`mixed`)throw Error("Cannot serialize items with `"+t+"` for `options.listItemIndent`, expected `tab`, `one`, or `mixed`");return t}function Fm(e,t,n,r){let i=Pm(n),a=n.bulletCurrent||km(n);t&&t.type===`list`&&t.ordered&&(a=(typeof t.start==`number`&&t.start>-1?t.start:1)+(n.options.incrementListMarker===!1?0:t.children.indexOf(e))+a);let o=a.length+1;(i===`tab`||i===`mixed`&&(t&&t.type===`list`&&t.spread||e.spread))&&(o=Math.ceil(o/4)*4);let s=n.createTracker(r);s.move(a+` `.repeat(o-a.length)),s.shift(o);let c=n.enter(`listItem`),l=n.indentLines(n.containerFlow(e,s.current()),u);return c(),l;function u(e,t,n){return t?(n?``:` `.repeat(o))+e:(n?a:a+` `.repeat(o-a.length))+e}}function Im(e,t,n,r){let i=n.enter(`paragraph`),a=n.enter(`phrasing`),o=n.containerPhrasing(e,r);return a(),i(),o}function Lm(e,t,n,r){if(!e.children.some(function(e){return Xp(e)}))return n.containerFlow(e,r);let i=n.enter(`phrasing`),a=n.containerPhrasing(e,r);return i(),a}function Rm(e){let t=e.options.strong||`*`;if(t!==`*`&&t!==`_`)throw Error("Cannot serialize strong with `"+t+"` for `options.strong`, expected `*`, or `_`");return t}zm.attention=Bm,zm.peek=Vm;function zm(e,t,n,r){let i=n.enter(`phrasing`),a=n.containerPhrasing({type:`root`,children:[e]},r);return i(),a}function Bm(e,t){return{construct:`strong`,markers:Rm(t)===`*`?[`*`,`_`]:[`_`,`*`],sizes:[2]}}function Vm(e,t,n){return n.options.strong||`*`}function Hm(e,t,n,r){let i=t?t.children:[],a=i.indexOf(e);return n.safe(e.value,{...r,afterNode:i[a+1],beforeNode:i[a-1]})}function Um(e){let t=e.options.ruleRepetition||3;if(t<3)throw Error("Cannot serialize rules with repetition `"+t+"` for `options.ruleRepetition`, expected `3` or more");return t}function Wm(e,t,n){let r=(Mm(n)+(n.options.ruleSpaces?` `:``)).repeat(Um(n));return n.options.ruleSpaces?r.slice(0,-1):r}var Gm={blockquote:Zp,break:tm,code:am,definition:cm,emphasis:um,hardBreak:tm,heading:hm,html:gm,image:vm,imageReference:bm,inlineCode:Sm,link:Tm,linkReference:Dm,list:Nm,listItem:Fm,paragraph:Im,root:Lm,strong:zm,text:Hm,thematicBreak:Wm};function Km(){return{enter:{table:qm,tableData:Zm,tableHeader:Zm,tableRow:Ym},exit:{codeText:Qm,table:Jm,tableData:Xm,tableHeader:Xm,tableRow:Xm}}}function qm(e){let t=e._align;this.enter({type:`table`,align:t.map(function(e){return e===`none`?null:e}),children:[]},e),this.data.inTable=!0}function Jm(e){this.exit(e),this.data.inTable=void 0}function Ym(e){this.enter({type:`tableRow`,children:[]},e)}function Xm(e){this.exit(e)}function Zm(e){this.enter({type:`tableCell`,children:[]},e)}function Qm(e){let t=this.resume();this.data.inTable&&(t=t.replace(/\\([\\|])/g,$m));let n=this.stack[this.stack.length-1];n.type,n.value=t,this.exit(e)}function $m(e,t){return t===`|`?t:e}function eh(e){let t=e||{},n=t.tableCellPadding,r=t.tablePipeAlign,i=t.stringLength,a=n?` `:`|`;return{unsafe:[{character:`\r`,inConstruct:`tableCell`},{character:`
30
+ `,inConstruct:`tableCell`},{atBreak:!0,character:`|`,after:`[ :-]`},{character:`|`,inConstruct:`tableCell`},{atBreak:!0,character:`:`,after:`-`},{atBreak:!0,character:`-`,after:`[:|-]`}],handlers:{inlineCode:f,table:o,tableCell:c,tableRow:s}};function o(e,t,n,r){return l(u(e,n,r),e.align)}function s(e,t,n,r){let i=l([d(e,n,r)]);return i.slice(0,i.indexOf(`
31
+ `))}function c(e,t,n,r){let i=n.enter(`tableCell`),o=n.enter(`phrasing`),s=n.containerPhrasing(e,{...r,before:a,after:a});return o(),i(),s}function l(e,t){return qp(e,{align:t,alignDelimiters:r,padding:n,stringLength:i})}function u(e,t,n){let r=e.children,i=-1,a=[],o=t.enter(`table`);for(;++i<r.length;)a[i]=d(r[i],t,n);return o(),a}function d(e,t,n){let r=e.children,i=-1,a=[],o=t.enter(`tableRow`);for(;++i<r.length;)a[i]=c(r[i],e,t,n);return o(),a}function f(e,t,n){let r=Gm.inlineCode(e,t,n);return n.stack.includes(`tableCell`)&&(r=r.replace(/\|/g,`\\$&`)),r}}function th(){return{exit:{taskListCheckValueChecked:rh,taskListCheckValueUnchecked:rh,paragraph:ih}}}function nh(){return{unsafe:[{atBreak:!0,character:`-`,after:`[:|-]`}],handlers:{listItem:ah}}}function rh(e){let t=this.stack[this.stack.length-2];t.type,t.checked=e.type===`taskListCheckValueChecked`}function ih(e){let t=this.stack[this.stack.length-2];if(t&&t.type===`listItem`&&typeof t.checked==`boolean`){let e=this.stack[this.stack.length-1];e.type;let n=e.children[0];if(n&&n.type===`text`){let r=t.children,i=-1,a;for(;++i<r.length;){let e=r[i];if(e.type===`paragraph`){a=e;break}}a===e&&(n.value=n.value.slice(1),n.value.length===0?e.children.shift():e.position&&n.position&&typeof n.position.start.offset==`number`&&(n.position.start.column++,n.position.start.offset++,e.position.start=Object.assign({},n.position.start)))}}this.exit(e)}function ah(e,t,n,r){let i=e.children[0],a=typeof e.checked==`boolean`&&i&&i.type===`paragraph`,o=`[`+(e.checked?`x`:` `)+`] `,s=n.createTracker(r);a&&s.move(o);let c=Gm.listItem(e,t,n,{...r,...s.current()});return a&&(c=c.replace(/^(?:[*+-]|\d+\.)([\r\n]| {1,3})/,l)),c;function l(e){return e+o}}function oh(){return[up(),Pp(),zp(),Km(),th()]}function sh(e){return{extensions:[dp(),Fp(e),Bp(),eh(e),nh()]}}var ch={tokenize:Sh,partial:!0},lh={tokenize:Ch,partial:!0},uh={tokenize:wh,partial:!0},dh={tokenize:Th,partial:!0},fh={tokenize:Eh,partial:!0},ph={name:`wwwAutolink`,tokenize:bh,previous:Dh},mh={name:`protocolAutolink`,tokenize:xh,previous:Oh},hh={name:`emailAutolink`,tokenize:yh,previous:kh},gh={};function _h(){return{text:gh}}for(var vh=48;vh<123;)gh[vh]=hh,vh++,vh===58?vh=65:vh===91&&(vh=97);gh[43]=hh,gh[45]=hh,gh[46]=hh,gh[95]=hh,gh[72]=[hh,mh],gh[104]=[hh,mh],gh[87]=[hh,ph],gh[119]=[hh,ph];function yh(e,t,n){let r=this,i,a;return o;function o(t){return!Ah(t)||!kh.call(r,r.previous)||jh(r.events)?n(t):(e.enter(`literalAutolink`),e.enter(`literalAutolinkEmail`),s(t))}function s(t){return Ah(t)?(e.consume(t),s):t===64?(e.consume(t),c):n(t)}function c(t){return t===46?e.check(fh,u,l)(t):t===45||t===95||J(t)?(a=!0,e.consume(t),c):u(t)}function l(t){return e.consume(t),i=!0,c}function u(o){return a&&i&&q(r.previous)?(e.exit(`literalAutolinkEmail`),e.exit(`literalAutolink`),t(o)):n(o)}}function bh(e,t,n){let r=this;return i;function i(t){return t!==87&&t!==119||!Dh.call(r,r.previous)||jh(r.events)?n(t):(e.enter(`literalAutolink`),e.enter(`literalAutolinkWww`),e.check(ch,e.attempt(lh,e.attempt(uh,a),n),n)(t))}function a(n){return e.exit(`literalAutolinkWww`),e.exit(`literalAutolink`),t(n)}}function xh(e,t,n){let r=this,i=``,a=!1;return o;function o(t){return(t===72||t===104)&&Oh.call(r,r.previous)&&!jh(r.events)?(e.enter(`literalAutolink`),e.enter(`literalAutolinkHttp`),i+=String.fromCodePoint(t),e.consume(t),s):n(t)}function s(t){if(q(t)&&i.length<5)return i+=String.fromCodePoint(t),e.consume(t),s;if(t===58){let n=i.toLowerCase();if(n===`http`||n===`https`)return e.consume(t),c}return n(t)}function c(t){return t===47?(e.consume(t),a?l:(a=!0,c)):n(t)}function l(t){return t===null||pc(t)||X(t)||vc(t)||_c(t)?n(t):e.attempt(lh,e.attempt(uh,u),n)(t)}function u(n){return e.exit(`literalAutolinkHttp`),e.exit(`literalAutolink`),t(n)}}function Sh(e,t,n){let r=0;return i;function i(t){return(t===87||t===119)&&r<3?(r++,e.consume(t),i):t===46&&r===3?(e.consume(t),a):n(t)}function a(e){return e===null?n(e):t(e)}}function Ch(e,t,n){let r,i,a;return o;function o(t){return t===46||t===95?e.check(dh,c,s)(t):t===null||X(t)||vc(t)||t!==45&&_c(t)?c(t):(a=!0,e.consume(t),o)}function s(t){return t===95?r=!0:(i=r,r=void 0),e.consume(t),o}function c(e){return i||r||!a?n(e):t(e)}}function wh(e,t){let n=0,r=0;return i;function i(o){return o===40?(n++,e.consume(o),i):o===41&&r<n?a(o):o===33||o===34||o===38||o===39||o===41||o===42||o===44||o===46||o===58||o===59||o===60||o===63||o===93||o===95||o===126?e.check(dh,t,a)(o):o===null||X(o)||vc(o)?t(o):(e.consume(o),i)}function a(t){return t===41&&r++,e.consume(t),i}}function Th(e,t,n){return r;function r(o){return o===33||o===34||o===39||o===41||o===42||o===44||o===46||o===58||o===59||o===63||o===95||o===126?(e.consume(o),r):o===38?(e.consume(o),a):o===93?(e.consume(o),i):o===60||o===null||X(o)||vc(o)?t(o):n(o)}function i(e){return e===null||e===40||e===91||X(e)||vc(e)?t(e):r(e)}function a(e){return q(e)?o(e):n(e)}function o(t){return t===59?(e.consume(t),r):q(t)?(e.consume(t),o):n(t)}}function Eh(e,t,n){return r;function r(t){return e.consume(t),i}function i(e){return J(e)?n(e):t(e)}}function Dh(e){return e===null||e===40||e===42||e===95||e===91||e===93||e===126||X(e)}function Oh(e){return!q(e)}function kh(e){return!(e===47||Ah(e))}function Ah(e){return e===43||e===45||e===46||e===95||J(e)}function jh(e){let t=e.length,n=!1;for(;t--;){let r=e[t][1];if((r.type===`labelLink`||r.type===`labelImage`)&&!r._balanced){n=!0;break}if(r._gfmAutolinkLiteralWalkedInto){n=!1;break}}return e.length>0&&!n&&(e[e.length-1][1]._gfmAutolinkLiteralWalkedInto=!0),n}var Mh={tokenize:Bh,partial:!0};function Nh(){return{document:{91:{name:`gfmFootnoteDefinition`,tokenize:Lh,continuation:{tokenize:Rh},exit:zh}},text:{91:{name:`gfmFootnoteCall`,tokenize:Ih},93:{name:`gfmPotentialFootnoteCall`,add:`after`,tokenize:Ph,resolveTo:Fh}}}}function Ph(e,t,n){let r=this,i=r.events.length,a=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]),o;for(;i--;){let e=r.events[i][1];if(e.type===`labelImage`){o=e;break}if(e.type===`gfmFootnoteCall`||e.type===`labelLink`||e.type===`label`||e.type===`image`||e.type===`link`)break}return s;function s(i){if(!o||!o._balanced)return n(i);let s=dc(r.sliceSerialize({start:o.end,end:r.now()}));return s.codePointAt(0)!==94||!a.includes(s.slice(1))?n(i):(e.enter(`gfmFootnoteCallLabelMarker`),e.consume(i),e.exit(`gfmFootnoteCallLabelMarker`),t(i))}}function Fh(e,t){let n=e.length;for(;n--;)if(e[n][1].type===`labelImage`&&e[n][0]===`enter`){e[n][1];break}e[n+1][1].type=`data`,e[n+3][1].type=`gfmFootnoteCallLabelMarker`;let r={type:`gfmFootnoteCall`,start:Object.assign({},e[n+3][1].start),end:Object.assign({},e[e.length-1][1].end)},i={type:`gfmFootnoteCallMarker`,start:Object.assign({},e[n+3][1].end),end:Object.assign({},e[n+3][1].end)};i.end.column++,i.end.offset++,i.end._bufferIndex++;let a={type:`gfmFootnoteCallString`,start:Object.assign({},i.end),end:Object.assign({},e[e.length-1][1].start)},o={type:`chunkString`,contentType:`string`,start:Object.assign({},a.start),end:Object.assign({},a.end)},s=[e[n+1],e[n+2],[`enter`,r,t],e[n+3],e[n+4],[`enter`,i,t],[`exit`,i,t],[`enter`,a,t],[`enter`,o,t],[`exit`,o,t],[`exit`,a,t],e[e.length-2],e[e.length-1],[`exit`,r,t]];return e.splice(n,e.length-n+1,...s),e}function Ih(e,t,n){let r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]),a=0,o;return s;function s(t){return e.enter(`gfmFootnoteCall`),e.enter(`gfmFootnoteCallLabelMarker`),e.consume(t),e.exit(`gfmFootnoteCallLabelMarker`),c}function c(t){return t===94?(e.enter(`gfmFootnoteCallMarker`),e.consume(t),e.exit(`gfmFootnoteCallMarker`),e.enter(`gfmFootnoteCallString`),e.enter(`chunkString`).contentType=`string`,l):n(t)}function l(s){if(a>999||s===93&&!o||s===null||s===91||X(s))return n(s);if(s===93){e.exit(`chunkString`);let a=e.exit(`gfmFootnoteCallString`);return i.includes(dc(r.sliceSerialize(a)))?(e.enter(`gfmFootnoteCallLabelMarker`),e.consume(s),e.exit(`gfmFootnoteCallLabelMarker`),e.exit(`gfmFootnoteCall`),t):n(s)}return X(s)||(o=!0),a++,e.consume(s),s===92?u:l}function u(t){return t===91||t===92||t===93?(e.consume(t),a++,l):l(t)}}function Lh(e,t,n){let r=this,i=r.parser.gfmFootnotes||(r.parser.gfmFootnotes=[]),a,o=0,s;return c;function c(t){return e.enter(`gfmFootnoteDefinition`)._container=!0,e.enter(`gfmFootnoteDefinitionLabel`),e.enter(`gfmFootnoteDefinitionLabelMarker`),e.consume(t),e.exit(`gfmFootnoteDefinitionLabelMarker`),l}function l(t){return t===94?(e.enter(`gfmFootnoteDefinitionMarker`),e.consume(t),e.exit(`gfmFootnoteDefinitionMarker`),e.enter(`gfmFootnoteDefinitionLabelString`),e.enter(`chunkString`).contentType=`string`,u):n(t)}function u(t){if(o>999||t===93&&!s||t===null||t===91||X(t))return n(t);if(t===93){e.exit(`chunkString`);let n=e.exit(`gfmFootnoteDefinitionLabelString`);return a=dc(r.sliceSerialize(n)),e.enter(`gfmFootnoteDefinitionLabelMarker`),e.consume(t),e.exit(`gfmFootnoteDefinitionLabelMarker`),e.exit(`gfmFootnoteDefinitionLabel`),f}return X(t)||(s=!0),o++,e.consume(t),t===92?d:u}function d(t){return t===91||t===92||t===93?(e.consume(t),o++,u):u(t)}function f(t){return t===58?(e.enter(`definitionMarker`),e.consume(t),e.exit(`definitionMarker`),i.includes(a)||i.push(a),Q(e,p,`gfmFootnoteDefinitionWhitespace`)):n(t)}function p(e){return t(e)}}function Rh(e,t,n){return e.check(Rc,t,e.attempt(Mh,t,n))}function zh(e){e.exit(`gfmFootnoteDefinition`)}function Bh(e,t,n){let r=this;return Q(e,i,`gfmFootnoteDefinitionIndent`,5);function i(e){let i=r.events[r.events.length-1];return i&&i[1].type===`gfmFootnoteDefinitionIndent`&&i[2].sliceSerialize(i[1],!0).length===4?t(e):n(e)}}function Vh(e){let t=(e||{}).singleTilde,n={name:`strikethrough`,tokenize:i,resolveAll:r};return t??=!0,{text:{126:n},insideSpan:{null:[n]},attentionMarkers:{null:[126]}};function r(e,t){let n=-1;for(;++n<e.length;)if(e[n][0]===`enter`&&e[n][1].type===`strikethroughSequenceTemporary`&&e[n][1]._close){let r=n;for(;r--;)if(e[r][0]===`exit`&&e[r][1].type===`strikethroughSequenceTemporary`&&e[r][1]._open&&e[n][1].end.offset-e[n][1].start.offset===e[r][1].end.offset-e[r][1].start.offset){e[n][1].type=`strikethroughSequence`,e[r][1].type=`strikethroughSequence`;let i={type:`strikethrough`,start:Object.assign({},e[r][1].start),end:Object.assign({},e[n][1].end)},a={type:`strikethroughText`,start:Object.assign({},e[r][1].end),end:Object.assign({},e[n][1].start)},o=[[`enter`,i,t],[`enter`,e[r][1],t],[`exit`,e[r][1],t],[`enter`,a,t]],s=t.parser.constructs.insideSpan.null;s&&ic(o,o.length,0,jc(s,e.slice(r+1,n),t)),ic(o,o.length,0,[[`exit`,a,t],[`enter`,e[n][1],t],[`exit`,e[n][1],t],[`exit`,i,t]]),ic(e,r-1,n-r+3,o),n=r+o.length-2;break}}for(n=-1;++n<e.length;)e[n][1].type===`strikethroughSequenceTemporary`&&(e[n][1].type=`data`);return e}function i(e,n,r){let i=this.previous,a=this.events,o=0;return s;function s(t){return i===126&&a[a.length-1][1].type!==`characterEscape`?r(t):(e.enter(`strikethroughSequenceTemporary`),c(t))}function c(a){let s=Ac(i);if(a===126)return o>1?r(a):(e.consume(a),o++,c);if(o<2&&!t)return r(a);let l=e.exit(`strikethroughSequenceTemporary`),u=Ac(a);return l._open=!u||u===2&&!!s,l._close=!s||s===2&&!!u,n(a)}}}var Hh=class{constructor(){this.map=[],this.index=new Map}add(e,t,n){Uh(this,e,t,n)}consume(e){if(this.map.sort(function(e,t){return e[0]-t[0]}),this.map.length===0)return;let t=this.map.length,n=[];for(;t>0;)--t,n.push(e.slice(this.map[t][0]+this.map[t][1]),this.map[t][2]),e.length=this.map[t][0];n.push(e.slice()),e.length=0;let r=n.pop();for(;r;){for(let t of r)e.push(t);r=n.pop()}this.map.length=0,this.index.clear()}};function Uh(e,t,n,r){if(n===0&&r.length===0)return;let i=e.index.get(t);if(i){i[1]+=n,i[2].push(...r);return}let a=[t,n,r];e.map.push(a),e.index.set(t,a)}function Wh(e,t){let n=!1,r=[];for(;t<e.length;){let i=e[t];if(n){if(i[0]===`enter`)i[1].type===`tableContent`&&r.push(e[t+1][1].type===`tableDelimiterMarker`?`left`:`none`);else if(i[1].type===`tableContent`){if(e[t-1][1].type===`tableDelimiterMarker`){let e=r.length-1;r[e]=r[e]===`left`?`center`:`right`}}else if(i[1].type===`tableDelimiterRow`)break}else i[0]===`enter`&&i[1].type===`tableDelimiterRow`&&(n=!0);t+=1}return r}function Gh(){return{flow:{null:{name:`table`,tokenize:Kh,resolveAll:qh}}}}function Kh(e,t,n){let r=this,i=0,a=0,o;return s;function s(e){let t=r.events.length-1;for(;t>-1;){let{type:e}=r.events[t][1];if(e===`lineEnding`||e===`linePrefix`)t--;else break}let i=t>-1?r.events[t][1].type:null,a=i===`tableHead`||i===`tableRow`?S:c;return a===S&&r.parser.lazy[r.now().line]?n(e):a(e)}function c(t){return e.enter(`tableHead`),e.enter(`tableRow`),l(t)}function l(e){return e===124||(o=!0,a+=1),u(e)}function u(t){return t===null?n(t):Y(t)?a>1?(a=0,r.interrupt=!0,e.exit(`tableRow`),e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),p):n(t):Z(t)?Q(e,u,`whitespace`)(t):(a+=1,o&&(o=!1,i+=1),t===124?(e.enter(`tableCellDivider`),e.consume(t),e.exit(`tableCellDivider`),o=!0,u):(e.enter(`data`),d(t)))}function d(t){return t===null||t===124||X(t)?(e.exit(`data`),u(t)):(e.consume(t),t===92?f:d)}function f(t){return t===92||t===124?(e.consume(t),d):d(t)}function p(t){return r.interrupt=!1,r.parser.lazy[r.now().line]?n(t):(e.enter(`tableDelimiterRow`),o=!1,Z(t)?Q(e,m,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):m(t))}function m(t){return t===45||t===58?g(t):t===124?(o=!0,e.enter(`tableCellDivider`),e.consume(t),e.exit(`tableCellDivider`),h):x(t)}function h(t){return Z(t)?Q(e,g,`whitespace`)(t):g(t)}function g(t){return t===58?(a+=1,o=!0,e.enter(`tableDelimiterMarker`),e.consume(t),e.exit(`tableDelimiterMarker`),_):t===45?(a+=1,_(t)):t===null||Y(t)?b(t):x(t)}function _(t){return t===45?(e.enter(`tableDelimiterFiller`),v(t)):x(t)}function v(t){return t===45?(e.consume(t),v):t===58?(o=!0,e.exit(`tableDelimiterFiller`),e.enter(`tableDelimiterMarker`),e.consume(t),e.exit(`tableDelimiterMarker`),y):(e.exit(`tableDelimiterFiller`),y(t))}function y(t){return Z(t)?Q(e,b,`whitespace`)(t):b(t)}function b(n){return n===124?m(n):n===null||Y(n)?!o||i!==a?x(n):(e.exit(`tableDelimiterRow`),e.exit(`tableHead`),t(n)):x(n)}function x(e){return n(e)}function S(t){return e.enter(`tableRow`),C(t)}function C(n){return n===124?(e.enter(`tableCellDivider`),e.consume(n),e.exit(`tableCellDivider`),C):n===null||Y(n)?(e.exit(`tableRow`),t(n)):Z(n)?Q(e,C,`whitespace`)(n):(e.enter(`data`),w(n))}function w(t){return t===null||t===124||X(t)?(e.exit(`data`),C(t)):(e.consume(t),t===92?T:w)}function T(t){return t===92||t===124?(e.consume(t),w):w(t)}}function qh(e,t){let n=-1,r=!0,i=0,a=[0,0,0,0],o=[0,0,0,0],s=!1,c=0,l,u,d,f=new Hh;for(;++n<e.length;){let p=e[n],m=p[1];p[0]===`enter`?m.type===`tableHead`?(s=!1,c!==0&&(Yh(f,t,c,l,u),u=void 0,c=0),l={type:`table`,start:Object.assign({},m.start),end:Object.assign({},m.end)},f.add(n,0,[[`enter`,l,t]])):m.type===`tableRow`||m.type===`tableDelimiterRow`?(r=!0,d=void 0,a=[0,0,0,0],o=[0,n+1,0,0],s&&(s=!1,u={type:`tableBody`,start:Object.assign({},m.start),end:Object.assign({},m.end)},f.add(n,0,[[`enter`,u,t]])),i=m.type===`tableDelimiterRow`?2:u?3:1):i&&(m.type===`data`||m.type===`tableDelimiterMarker`||m.type===`tableDelimiterFiller`)?(r=!1,o[2]===0&&(a[1]!==0&&(o[0]=o[1],d=Jh(f,t,a,i,void 0,d),a=[0,0,0,0]),o[2]=n)):m.type===`tableCellDivider`&&(r?r=!1:(a[1]!==0&&(o[0]=o[1],d=Jh(f,t,a,i,void 0,d)),a=o,o=[a[1],n,0,0])):m.type===`tableHead`?(s=!0,c=n):m.type===`tableRow`||m.type===`tableDelimiterRow`?(c=n,a[1]===0?o[1]!==0&&(d=Jh(f,t,o,i,n,d)):(o[0]=o[1],d=Jh(f,t,a,i,n,d)),i=0):i&&(m.type===`data`||m.type===`tableDelimiterMarker`||m.type===`tableDelimiterFiller`)&&(o[3]=n)}for(c!==0&&Yh(f,t,c,l,u),f.consume(t.events),n=-1;++n<t.events.length;){let e=t.events[n];e[0]===`enter`&&e[1].type===`table`&&(e[1]._align=Wh(t.events,n))}return e}function Jh(e,t,n,r,i,a){let o=r===1?`tableHeader`:r===2?`tableDelimiter`:`tableData`;n[0]!==0&&(a.end=Object.assign({},Xh(t.events,n[0])),e.add(n[0],0,[[`exit`,a,t]]));let s=Xh(t.events,n[1]);if(a={type:o,start:Object.assign({},s),end:Object.assign({},s)},e.add(n[1],0,[[`enter`,a,t]]),n[2]!==0){let i=Xh(t.events,n[2]),a=Xh(t.events,n[3]),o={type:`tableContent`,start:Object.assign({},i),end:Object.assign({},a)};if(e.add(n[2],0,[[`enter`,o,t]]),r!==2){let r=t.events[n[2]],i=t.events[n[3]];if(r[1].end=Object.assign({},i[1].end),r[1].type=`chunkText`,r[1].contentType=`text`,n[3]>n[2]+1){let t=n[2]+1,r=n[3]-n[2]-1;e.add(t,r,[])}}e.add(n[3]+1,0,[[`exit`,o,t]])}return i!==void 0&&(a.end=Object.assign({},Xh(t.events,i)),e.add(i,0,[[`exit`,a,t]]),a=void 0),a}function Yh(e,t,n,r,i){let a=[],o=Xh(t.events,n);i&&(i.end=Object.assign({},o),a.push([`exit`,i,t])),r.end=Object.assign({},o),a.push([`exit`,r,t]),e.add(n+1,0,a)}function Xh(e,t){let n=e[t],r=n[0]===`enter`?`start`:`end`;return n[1][r]}var Zh={name:`tasklistCheck`,tokenize:$h};function Qh(){return{text:{91:Zh}}}function $h(e,t,n){let r=this;return i;function i(t){return r.previous!==null||!r._gfmTasklistFirstContentOfListItem?n(t):(e.enter(`taskListCheck`),e.enter(`taskListCheckMarker`),e.consume(t),e.exit(`taskListCheckMarker`),a)}function a(t){return X(t)?(e.enter(`taskListCheckValueUnchecked`),e.consume(t),e.exit(`taskListCheckValueUnchecked`),o):t===88||t===120?(e.enter(`taskListCheckValueChecked`),e.consume(t),e.exit(`taskListCheckValueChecked`),o):n(t)}function o(t){return t===93?(e.enter(`taskListCheckMarker`),e.consume(t),e.exit(`taskListCheckMarker`),e.exit(`taskListCheck`),s):n(t)}function s(r){return Y(r)?t(r):Z(r)?e.check({tokenize:eg},t,n)(r):n(r)}}function eg(e,t,n){return Q(e,r,`whitespace`);function r(e){return e===null?n(e):t(e)}}function tg(e){return sc([_h(),Nh(),Vh(e),Gh(),Qh()])}var ng={};function rg(e){let t=this,n=e||ng,r=t.data(),i=r.micromarkExtensions||=[],a=r.fromMarkdownExtensions||=[],o=r.toMarkdownExtensions||=[];i.push(tg(n)),a.push(oh()),o.push(sh(n))}var ig={in:120,stay:80,out:100};function ag(e,t){switch(e){case`done`:return t?{next:`in`,after:0}:null;case`in`:return{next:`stay`,after:ig.in};case`stay`:return{next:`wait`,after:ig.stay};case`wait`:return t?null:{next:`out`,after:0};case`out`:return{next:`done`,after:ig.out}}}function og(e){let[t,n]=(0,a.useState)(e?`in`:`done`),r=ag(t,e),i=r?.next??null,o=r?.after??0;return(0,a.useEffect)(()=>{if(i===null)return;if(o===0){n(i);return}let e=setTimeout(()=>n(i),o);return()=>clearTimeout(e)},[t,i,o]),t}var sg=`M24.6 4v11.2H33Z`,cg=`M23 7v8.2H16.6Z`,lg=`M12.5 16.6H36l-3.8 5H15.6Z`,ug=`M22.2 21.6h4.6L25.1 28h-1.6Z`,dg=e=>`M-16 ${e}q4-2.4 8 0${`t8 0`.repeat(9)}`;function fg({phase:e,label:t,fit:n=`block`}){let r={"--loader-in":`${ig.in}ms`,"--loader-out":`${ig.out}ms`};return(0,B.jsxs)(`div`,{className:`ui-loader ui-loader--${n}${e===`in`?` ui-loader--in`:e===`out`?` ui-loader--out`:``}`,role:`status`,style:r,children:[(0,B.jsxs)(`div`,{className:`ui-loader__scene`,"aria-hidden":`true`,children:[(0,B.jsx)(`svg`,{className:`ui-loader__boat`,viewBox:`0 0 48 34`,children:(0,B.jsxs)(`g`,{className:`ui-loader__hull`,children:[(0,B.jsx)(`path`,{className:`ui-loader__sail`,d:sg}),(0,B.jsx)(`path`,{className:`ui-loader__jib`,d:cg}),(0,B.jsx)(`path`,{className:`ui-loader__sail`,d:lg}),(0,B.jsx)(`path`,{className:`ui-loader__keel`,d:ug})]})}),(0,B.jsxs)(`svg`,{className:`ui-loader__sea`,viewBox:`0 0 48 34`,children:[(0,B.jsx)(`path`,{className:`ui-loader__wave`,d:dg(21.6)}),(0,B.jsx)(`path`,{className:`ui-loader__wave ui-loader__wave--deep`,d:dg(27)})]})]}),(0,B.jsx)(`p`,{className:`ui-loader__label`,children:t})]})}function pg({busy:e,label:t,fit:n,children:r}){let i=og(e);return i===`done`?(0,B.jsx)(B.Fragment,{children:r}):(0,B.jsx)(fg,{phase:i,label:t,fit:n})}export{Wa as $,Mn as $n,Fr as $t,ao as A,sn as An,dt as Ar,Zi as At,sa as B,On as Bn,z as Br,Ti as Bt,fo as C,Dn as Cn,_t as Cr,fa as Ct,mo as D,jn as Dn,pt as Dr,na as Dt,ro as E,hn as En,mt as Er,la as Et,to as F,on as Fn,lt as Fr,Ai as Ft,ma as G,Gn,v as Gr,yi as Gt,Ja as H,Vn as Hn,g as Hr,vi as Ht,qi as I,an as In,st as Ir,_i as It,xa as J,bn as Jn,i as Jr,Kr as Jt,Ea as K,rn as Kn,C as Kr,Oi as Kt,Li as L,wn as Ln,rt as Lr,bi as Lt,go as M,nn as Mn,ut as Mr,Pi as Mt,bo as N,yn as Nn,ot as Nr,Ni as Nt,so as O,An as On,ft as Or,Za as Ot,yo as P,ln as Pn,it as Pr,Fi as Pt,wa as Q,dn as Qn,zr as Qt,va as R,Tn as Rn,$e as Rr,xi as Rt,oo as S,In as Sn,xt as Sr,Ga as St,_o as T,kn as Tn,vt as Tr,ya as Tt,Ya as U,Nn as Un,y as Ur,hi as Ut,Qi as V,un as Vn,T as Vr,gi as Vt,Xa as W,Sn as Wn,m as Wr,Ei as Wt,ba as X,Pn as Xn,Ur as Xt,aa as Y,xn as Yn,Gr as Yt,$i as Z,fn as Zn,Wr as Zt,So as _,gn as _n,Tt as _r,Na as _t,Zf as a,_r as an,Qt as ar,Gi as at,lo as b,_n as bn,St as br,ja as bt,ps as c,mr as cn,Wt as cr,Ca as ct,ss as d,ar as dn,Vt as dr,ha as dt,jr as en,Bn as er,ea as et,cs as f,nr as fn,Gt as fr,ka as ft,No as g,Yn as gn,Mt as gr,Da as gt,ns as h,er as hn,Nt as hr,Ma as ht,rg as i,vr as in,tn as ir,ga as it,io as j,Fn as jn,Qe as jr,Mi as jt,po as k,cn as kn,Ze as kr,Sa as kt,ms as l,sr as ln,Bt as lr,Ta as lt,os as m,tr as mn,Pt as mr,Oa as mt,pg as n,xr as nn,vn as nr,ua as nt,$d as o,Cr as on,Xt as or,Qa as ot,as as p,Xn as pn,Ft as pr,Aa as pt,Ra as q,pn as qn,o as qr,Qr as qt,og as r,br as rn,en as rr,pa as rt,Rd as s,gr as sn,Ht as sr,Fa as st,fg as t,Lr as tn,Cn as tr,za as tt,gs as u,ir as un,Ut as ur,Vi as ut,Co as v,qn as vn,Dt as vr,Pa as vt,uo as w,Ln as wn,yt as wr,Ka as wt,ho as x,En as xn,Ct as xr,_a as xt,xo as y,mn as yn,Et as yr,Yi as yt,oa as z,Rn as zn,tt as zr,Di as zt};