cli-jaw 2.2.0 → 2.2.1-preview.20260625145621
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +1 -1
- package/README.md +22 -3
- package/README.zh-CN.md +1 -1
- package/dist/bin/cli-jaw.js +13 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/bgtask.js +2 -1
- package/dist/bin/commands/bgtask.js.map +1 -1
- package/dist/bin/commands/dispatch-batch-summary.js +38 -0
- package/dist/bin/commands/dispatch-batch-summary.js.map +1 -0
- package/dist/bin/commands/dispatch.js +91 -52
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/hooks.js +58 -0
- package/dist/bin/commands/hooks.js.map +1 -0
- package/dist/bin/commands/jwc.js +237 -0
- package/dist/bin/commands/jwc.js.map +1 -0
- package/dist/bin/commands/orchestrate.js +37 -2
- package/dist/bin/commands/orchestrate.js.map +1 -1
- package/dist/bin/commands/provider.js +213 -0
- package/dist/bin/commands/provider.js.map +1 -0
- package/dist/bin/commands/skill.js +17 -4
- package/dist/bin/commands/skill.js.map +1 -1
- package/dist/bin/commands/worker.js +162 -4
- package/dist/bin/commands/worker.js.map +1 -1
- package/dist/lib/mcp/skills-distribution.js +17 -19
- package/dist/lib/mcp/skills-distribution.js.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/jwc-runtime.js +12 -3
- package/dist/src/agent/jwc-runtime.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +14 -0
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +1 -1
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/bgtask/recover.js +4 -1
- package/dist/src/bgtask/recover.js.map +1 -1
- package/dist/src/bgtask/registry.js +12 -2
- package/dist/src/bgtask/registry.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/bm25-filter.js +47 -0
- package/dist/src/browser/adaptive-fetch/bm25-filter.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +136 -3
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-flow.js +118 -0
- package/dist/src/browser/adaptive-fetch/browser-flow.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/browser-runtime.js +10 -1
- package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/camoufox-session.js +76 -0
- package/dist/src/browser/adaptive-fetch/camoufox-session.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/candidate-discovery.js +116 -0
- package/dist/src/browser/adaptive-fetch/candidate-discovery.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/challenge-detector.js +1 -1
- package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +66 -5
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/feed-parser.js +152 -0
- package/dist/src/browser/adaptive-fetch/feed-parser.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/fetcher.js +20 -1
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/human-loop.js +10 -1
- package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/index.js +17 -397
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js +99 -0
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/metadata.js +74 -5
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js +414 -0
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +36 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/scheduler.js +472 -0
- package/dist/src/browser/adaptive-fetch/scheduler.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/stage-types.js +2 -0
- package/dist/src/browser/adaptive-fetch/stage-types.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/structured-extractor.js +117 -0
- package/dist/src/browser/adaptive-fetch/structured-extractor.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/third-party-readers.js +15 -1
- package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/tls-fetch.js +81 -0
- package/dist/src/browser/adaptive-fetch/tls-fetch.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/validators.js +11 -8
- package/dist/src/browser/adaptive-fetch/validators.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/ytdlp-reader.js +82 -0
- package/dist/src/browser/adaptive-fetch/ytdlp-reader.js.map +1 -0
- package/dist/src/cli/commands.js +67 -13
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-search.js +28 -0
- package/dist/src/cli/handlers-search.js.map +1 -0
- package/dist/src/cli/handlers-skill-invoke.js +30 -0
- package/dist/src/cli/handlers-skill-invoke.js.map +1 -0
- package/dist/src/cli/handlers.js +12 -1
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/code-mode/acp-host.js +1 -8
- package/dist/src/code-mode/acp-host.js.map +1 -1
- package/dist/src/command-contract/catalog.js +22 -1
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/cli-detection.js +7 -0
- package/dist/src/core/cli-detection.js.map +1 -1
- package/dist/src/core/skill-cache.js +34 -0
- package/dist/src/core/skill-cache.js.map +1 -0
- package/dist/src/goal/heartbeat.js +13 -7
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/memory/heartbeat.js +12 -1
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/orchestrator/attestation.js +156 -0
- package/dist/src/orchestrator/attestation.js.map +1 -0
- package/dist/src/orchestrator/pipeline.js +34 -6
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/sanitize.js +4 -0
- package/dist/src/orchestrator/sanitize.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +69 -13
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-output-store.js +64 -0
- package/dist/src/orchestrator/worker-output-store.js.map +1 -0
- package/dist/src/orchestrator/worker-progress.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +91 -10
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/orchestrator/worker-replay-notice.js +28 -0
- package/dist/src/orchestrator/worker-replay-notice.js.map +1 -0
- package/dist/src/orchestrator/worker-run-store.js +142 -0
- package/dist/src/orchestrator/worker-run-store.js.map +1 -0
- package/dist/src/prompt/builder.js +35 -3
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/context-hooks.js +210 -0
- package/dist/src/prompt/context-hooks.js.map +1 -0
- package/dist/src/prompt/templates/orchestration.md +1 -1
- package/dist/src/routes/bgtask.js +13 -4
- package/dist/src/routes/bgtask.js.map +1 -1
- package/dist/src/routes/command.js +1 -1
- package/dist/src/routes/command.js.map +1 -1
- package/dist/src/routes/orchestrate.js +85 -10
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/shared/runtime-observability.js +20 -0
- package/dist/src/shared/runtime-observability.js.map +1 -0
- package/dist/src/workflows/search.js +21 -0
- package/dist/src/workflows/search.js.map +1 -0
- package/package.json +11 -12
- package/public/dist/assets/{app-BsVpXeLC.js → app-CLrfEHAk.js} +4 -4
- package/public/dist/assets/bgtask-badge-4OjtCvDq.js +1 -0
- package/public/dist/assets/{bgtask-badge-DqMU3pM3.js → bgtask-badge-xWbw-l-0.js} +1 -1
- package/public/dist/assets/{employees-BhkR2-xi.js → employees-C5GPj3d3.js} +1 -1
- package/public/dist/assets/manager-Ceg2x8D0.js +13 -0
- package/public/dist/assets/{manager-U147AWWu.css → manager-CwAlpgV7.css} +1 -1
- package/public/dist/assets/memory-B1beDKbo.js +1 -0
- package/public/dist/assets/{memory-DERWDVjI.js → memory-CcnjBuo-.js} +1 -1
- package/public/dist/assets/{message-history-CK0ah3pB.js → message-history-BSWJwi__.js} +2 -2
- package/public/dist/assets/message-history-CzaziSe8.js +1 -0
- package/public/dist/assets/{render-CqzsW5KN.js → render-C2g_qvCg.js} +2 -2
- package/public/dist/assets/settings-Dst1mUjn.js +1 -0
- package/public/dist/assets/{settings-DdwmhI5a.js → settings-DxClXVD0.js} +1 -1
- package/public/dist/assets/settings-core-BW5mtFPE.js +1 -0
- package/public/dist/assets/{settings-core-AiF7o3Ns.js → settings-core-CSUV4-QG.js} +1 -1
- package/public/dist/assets/{sidebar-Bhtk2fPc.js → sidebar-CJz_SnMW.js} +3 -3
- package/public/dist/assets/skills-B2io6S_4.js +1 -0
- package/public/dist/assets/{skills-Cs8byPIx.js → skills-PKg2h1N4.js} +1 -1
- package/public/dist/assets/slash-commands-D1IS00Eg.js +1 -0
- package/public/dist/assets/{slash-commands-C5erv0KS.js → slash-commands-FMOOfedZ.js} +1 -1
- package/public/dist/assets/{trace-drawer-CtmD6jwj.js → trace-drawer-BoU1ucw7.js} +1 -1
- package/public/dist/assets/{ui-DaFl446W.js → ui-BX-IfLze.js} +1 -1
- package/public/dist/assets/ui-C-al0etg.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +2 -2
- package/public/js/features/command-info.ts +1 -0
- package/public/js/render/file-links.ts +1 -1
- package/public/js/render/notes-vault-path.ts +1 -1
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/SidebarRailRouter.tsx +7 -3
- package/public/manager/src/background-tasks/background-task-client.ts +21 -1
- package/public/manager/src/main.tsx +2 -0
- package/public/manager/src/workers/WorkerProgressMonitorPanel.tsx +2 -0
- package/public/manager/src/workers/WorkerRunsPanel.tsx +152 -0
- package/public/manager/src/workers/useWorkerRuns.ts +138 -0
- package/public/manager/src/workers/worker-runs-client.ts +112 -0
- package/public/manager/src/workers/worker-runs.css +208 -0
- package/scripts/bundle-sidecar.sh +2 -64
- package/scripts/check-electron-sidecar-no-jwc.cjs +57 -0
- package/scripts/install-risk-gate.mjs +3 -2
- package/scripts/jwc-no-global-smoke.mjs +19 -21
- package/public/dist/assets/bgtask-badge-YR8SMYrp.js +0 -1
- package/public/dist/assets/manager-ycX0r7uL.js +0 -13
- package/public/dist/assets/memory-CfeG2ViL.js +0 -1
- package/public/dist/assets/message-history-BaI36ciH.js +0 -1
- package/public/dist/assets/settings-VeoQiKpd.js +0 -1
- package/public/dist/assets/settings-core-DlfGtuWD.js +0 -1
- package/public/dist/assets/skills-Z0rMlwnf.js +0 -1
- package/public/dist/assets/slash-commands-CZKlw4A6.js +0 -1
- package/public/dist/assets/ui-WRcA4tUT.js +0 -1
- package/scripts/check-electron-sidecar-jwc.cjs +0 -117
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./state-DxpgDKMO.js";import{i as t}from"./api-tVoG39dL.js";import{D as n,T as r,j as i,w as a,x as o}from"./render-
|
|
1
|
+
import{t as e}from"./state-DxpgDKMO.js";import{i as t}from"./api-tVoG39dL.js";import{D as n,T as r,j as i,w as a,x as o}from"./render-C2g_qvCg.js";var s=[`productivity`,`communication`,`devtools`,`ai-media`,`utility`,`smarthome`,`automation`];function c(e,t){return t?[e.id,e.name,e.description,e.category,e.requires?.env?.join(` `),e.requires?.bins?.join(` `),e.install].filter(Boolean).join(` `).toLowerCase().includes(t):!0}async function l(){try{e.allSkills=await(await n(`/api/skills`)).json(),u()}catch{let e=document.getElementById(`skillsList`);e&&(e.innerHTML=`<div style="color:var(--text-dim);font-size:11px">${i(`skill.loadFail`)}</div>`)}}function u(){let t=document.getElementById(`skillsList`),n=document.getElementById(`skillsCount`);if(!t||!n)return;let l=e.allSkills,u=l;e.currentSkillFilter===`installed`?u=l.filter(e=>e.enabled):e.currentSkillFilter===`other`?u=l.filter(e=>!s.includes(e.category||``)):e.currentSkillFilter!==`all`&&(u=l.filter(t=>t.category===e.currentSkillFilter));let d=e.currentSkillSearch.trim().toLowerCase();u=u.filter(e=>c(e,d));let f=l.filter(e=>e.enabled).length;if(n.textContent=d?i(`skill.countFiltered`,{shown:u.length,active:f,total:l.length}):i(`skill.count`,{active:f,total:l.length}),!u.length){t.innerHTML=`<div class="skill-empty">${r(i(`skill.search.empty`))}</div>`;return}t.innerHTML=u.map(e=>{let t=[];return e.requires?.env&&t.push(`${o.key} `+e.requires.env.map(e=>r(e)).join(`, `)),e.requires?.bins&&t.push(`${o.settings} `+e.requires.bins.map(e=>r(e)).join(`, `)),e.install&&t.push(r(e.install)),`
|
|
2
2
|
<div class="skill-card ${e.enabled?`enabled`:``}">
|
|
3
3
|
<div class="skill-card-header">
|
|
4
4
|
<span class="skill-emoji">${e.emoji?a(e.emoji):o.tool}</span>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./slash-commands-FMOOfedZ.js";export{e as loadCommands};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./api-tVoG39dL.js";import{T as t,j as n}from"./render-
|
|
1
|
+
import{n as e}from"./api-tVoG39dL.js";import{T as t,j as n}from"./render-C2g_qvCg.js";import{t as r}from"./locale-GY3-GGWm.js";var i={activeCli:o(`activeCli`,2,1,2,2,1,3),model:o(`model`,2,1,1,2,1,2),effort:o(`effort`,2,1,1),permissions:o(`permissions`,2,1,1),flushAgent:o(`flushAgent`,2,1,1,2,1,3),employees:o(`employees`,3,3,2,4,1,2),skills:o(`skills`,2,1,1,4,1,3),activeChannel:o(`activeChannel`,2,1,1),telegram:{...o(`telegram`,2,1,2,8),docLinks:[{url:`https://t.me/BotFather`,labelKey:`help.telegram.link.botfather`},{url:`https://core.telegram.org/bots/tutorial`,labelKey:`help.telegram.link.docs`}]},discord:{...o(`discord`,2,1,2,9),docLinks:[{url:`https://discord.com/developers/applications`,labelKey:`help.discord.link.portal`},{url:`https://discord.com/developers/docs/getting-started`,labelKey:`help.discord.link.docs`}]},fallbackOrder:o(`fallbackOrder`,2,1,1,2,1,3),mcp:o(`mcp`,2,1,1,4,1,5),memory:o(`memory`,2,1,2,4,1,2),stt:o(`stt`,2,1,1),promptTemplates:o(`promptTemplates`,2,1,1),chatInput:o(`chatInput`,3,2,2),orchestration:o(`orchestration`,3,2,2,8,1,8),attachments:o(`attachments`,3,2,2),diagrams:o(`diagrams`,3,2,2),keyboardShortcuts:o(`keyboardShortcuts`,3,2,2,3,2,3),session:o(`session`,3,1,2,8,1,9),cliTools:o(`cliTools`,3,1,2,6,1,9),agentControl:o(`agentControl`,3,1,2,6,1,6),goals:o(`goals`,3,1,2,10,1,25)};function a(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(i,e)}function o(e,t,n,r,i=2,a=1,o=0){return{titleKey:`help.${e}.title`,introKey:`help.${e}.intro`,effectKey:`help.${e}.effect`,useWhenKeys:s(`help.${e}.use`,t),howToKeys:s(`help.${e}.howTo`,i),exampleKeys:s(`help.${e}.example`,a),avoidWhenKeys:s(`help.${e}.avoid`,n),relatedKeys:s(`help.${e}.related`,r),...o>0?{subcmdKeys:s(`help.${e}.subcmd`,o)}:{}}}function s(e,t){return Array.from({length:t},(t,n)=>`${e}.${n+1}`)}var c=!1,l=null,u=null,d=null,f=null,p=null,m=!1;function h(){c||(c=!0,document.addEventListener(`click`,v),document.addEventListener(`keydown`,y,!0))}function g(e,t=null,n=[e]){if(!i[e]){console.warn(`[help-dialog] unknown topic:`,e);return}b(),p=t,x(e,T(n,e)),l?.classList.add(`open`),l?.setAttribute(`aria-hidden`,`false`),m=!0,requestAnimationFrame(()=>f?.focus())}function _(){if(!m)return;l?.classList.remove(`open`),l?.setAttribute(`aria-hidden`,`true`),m=!1;let e=p;p=null,e?.focus()}function v(e){let t=e.target?.closest(`[data-help-topic]`);if(!t)return;let n=t.getAttribute(`data-help-topic`);if(!a(n)){console.warn(`[help-dialog] invalid topic:`,n);return}e.preventDefault(),g(n,t,w(t.getAttribute(`data-help-topics`),n))}function y(e){!m||e.key!==`Escape`||(e.preventDefault(),e.stopImmediatePropagation(),_())}function b(){if(l&&u&&d&&f)return;l=document.createElement(`div`),l.id=`helpDialog`,l.className=`modal-overlay help-dialog-overlay`,l.setAttribute(`role`,`presentation`),l.setAttribute(`aria-hidden`,`true`),l.addEventListener(`click`,e=>{e.target===l&&_()});let e=document.createElement(`div`);e.className=`modal-box help-dialog-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-labelledby`,`helpDialogTitle`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header help-dialog-header`,u=document.createElement(`span`),u.id=`helpDialogTitle`,f=document.createElement(`button`),f.type=`button`,f.className=`btn-modal-close help-dialog-close`,f.setAttribute(`aria-label`,n(`help.close`)),f.textContent=`x`,f.addEventListener(`click`,()=>_()),d=document.createElement(`div`),d.className=`help-dialog-body`;let r=document.createElement(`div`);r.className=`modal-footer help-dialog-footer`;let i=document.createElement(`button`);i.type=`button`,i.className=`btn-save help-dialog-done`,i.textContent=n(`help.close`),i.addEventListener(`click`,()=>_()),t.append(u,f),r.append(i),e.append(t,d,r),l.append(e),document.body.append(l)}function x(e,t=[e]){if(!u||!d||!f)return;let r=i[e];u.textContent=n(r.titleKey),f.setAttribute(`aria-label`,n(`help.close`)),d.replaceChildren();let a=document.createElement(`div`);if(a.className=`help-dialog-content`,S(a,r),t.length<=1){d.append(a);return}let o=document.createElement(`div`);o.className=`help-dialog-layout`,o.append(C(t,e),a),d.append(o)}function S(e,t){t.docLinks?.length&&E(e,t.docLinks),D(e,n(`help.section.what`),n(t.introKey)),D(e,n(`help.section.effect`),n(t.effectKey),`help-effect-text`),O(e,n(`help.section.useWhen`),t.useWhenKeys),A(e,n(`help.section.howTo`),t.howToKeys),O(e,n(`help.section.example`),t.exampleKeys,!1,`help-example-list`),t.avoidWhenKeys?.length&&O(e,n(`help.section.avoidWhen`),t.avoidWhenKeys),t.subcmdKeys?.length&&j(e,n(`help.section.commands`),t.subcmdKeys),t.relatedKeys?.length&&O(e,n(`help.section.related`),t.relatedKeys,!0)}function C(e,t){let r=document.createElement(`nav`);r.className=`help-dialog-nav`,r.setAttribute(`aria-label`,n(`help.section.related`));for(let a of e){let o=i[a],s=document.createElement(`button`);s.type=`button`,s.className=`help-dialog-nav-item`,s.textContent=n(o.titleKey),a===t&&(s.classList.add(`active`),s.setAttribute(`aria-current`,`page`)),s.addEventListener(`click`,()=>x(a,e)),r.append(s)}return r}function w(e,t){return T(e?.split(/[\s,]+/).filter(Boolean)??[],t)}function T(e,t){let n=[];for(let t of e)a(t)&&!n.includes(t)&&n.push(t);return n.includes(t)||n.unshift(t),n}function E(e,t){let r=document.createElement(`section`);r.className=`help-dialog-section help-doc-links`;let i=document.createElement(`nav`);i.className=`help-doc-links-nav`;for(let e of t){let t=document.createElement(`a`);t.href=e.url,t.target=`_blank`,t.rel=`noopener noreferrer`,t.className=`help-doc-link`,t.textContent=n(e.labelKey);let r=document.createElement(`span`);r.className=`help-doc-link-icon`,r.textContent=`↗`,t.append(r),i.append(t)}r.append(i),e.append(r)}function D(e,t,n,r){let i=k(t),a=document.createElement(`p`);r&&(a.className=r),a.textContent=n,i.append(a),e.append(i)}function O(e,t,r,i=!1,a){let o=k(t),s=document.createElement(`ul`);s.className=a??(i?`help-related-list`:`help-dialog-list`);for(let e of r){let t=document.createElement(`li`);t.textContent=n(e),s.append(t)}o.append(s),e.append(o)}function k(e){let t=document.createElement(`section`);t.className=`help-dialog-section`;let n=document.createElement(`h3`);return n.textContent=e,t.append(n),t}function A(e,t,r){let i=k(t),a=document.createElement(`ol`);a.className=`help-dialog-list help-howto-list`;for(let e of r){let t=document.createElement(`li`);t.textContent=n(e),a.append(t)}i.append(a),e.append(i)}function j(e,t,r){let i=k(t),a=document.createElement(`dl`);a.className=`help-subcmd-list`;for(let e of r){let t=n(e),r=t.indexOf(` — `),i=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r+3):``,s=document.createElement(`dt`);s.className=`help-subcmd-cmd`;let c=document.createElement(`code`);c.textContent=i,s.append(c);let l=document.createElement(`dd`);l.className=`help-subcmd-desc`,l.textContent=o,a.append(s,l)}i.append(a),e.append(i)}var M={mcp:`mcp`,memory:`memory`,model:`model`,effort:`effort`,cli:`activeCli`,skill:`skills`,employee:`employees`,orchestrate:`orchestration`,pabcd:`orchestration`,flush:`flushAgent`,fallback:`fallbackOrder`,prompt:`promptTemplates`,browser:`mcp`,status:`activeCli`,steer:`chatInput`,clear:`session`,compact:`session`,reset:`session`,purge:`session`,new:`session`,switch:`session`,sw:`session`,sessions:`session`,ss:`session`,version:`cliTools`,project:`cliTools`,proj:`cliTools`,ide:`cliTools`,file:`cliTools`,forward:`agentControl`,thought:`agentControl`,goal:`goals`,goalplan:`goals`,gd:`goals`,plan:`goals`,interview:`goals`,deliberate:`goals`,planaudit:`goals`,review:`goals`,search:`mcp`,team:`goals`,task:`goals`,help:`keyboardShortcuts`,h:`keyboardShortcuts`,commands:`keyboardShortcuts`,cmd:`keyboardShortcuts`,fork:`session`,quit:`session`,q:`session`,exit:`session`,telegram:`telegram`,discord:`discord`,stt:`stt`,attachments:`attachments`,diagrams:`diagrams`};function N(e){let t=e.replace(/^\//,``).trim().split(/\s+/);if(t.length<2||t[t.length-1].toLowerCase()!==`info`)return!1;let n=M[t[0].toLowerCase()];return n?(g(n),!0):!1}var P=[],F=[],I=-1,L=!1,R=null;function z(e){let t=String(e||``).slice(1).trim().split(/\s+/)[0]||``;return t.includes(`/`)||t.includes(`\\`)}var B=()=>document.getElementById(`cmdDropdown`),V=()=>document.getElementById(`chatInput`);function H(e){let t=String(e||``).toLowerCase();return P.filter(e=>`/${e.name}`.startsWith(t))}function U(e){let t=e.workflow?.workflowArgs||[];return t.length?t.map(e=>e.required?`<${e.name}>`:`[${e.name}]`).join(` `):e.args||``}function W(e){let n=e.workflow;return n?`<span class="cmd-meta">
|
|
2
2
|
<span class="cmd-chip">${t(n.phase)}</span>
|
|
3
3
|
<span class="cmd-chip cmd-risk-${t(n.risk)}">${t(n.risk)}</span>
|
|
4
4
|
<span class="cmd-chip">${t(n.output)}</span>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./api-tVoG39dL.js";import{T as t}from"./render-
|
|
1
|
+
import{n as e}from"./api-tVoG39dL.js";import{T as t}from"./render-C2g_qvCg.js";import{r as n}from"./provider-icons-BXm8sy5x.js";var r=80,i=``,a=0,o=0,s=!1,c=0,l=null;function u(e){return e.eventType||e.event_type||`event`}function d(e,t=i){return e===c&&t===i}function f(e){return!e||!Number.isInteger(e)||e<1?0:Math.floor((e-1)/r)*r}function p(){let e=document.getElementById(`traceDrawerOverlay`);return e||(e=document.createElement(`div`),e.id=`traceDrawerOverlay`,e.className=`trace-drawer-overlay`,e.innerHTML=`<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
|
|
2
2
|
<header class="trace-drawer-header">
|
|
3
3
|
<div><p class="trace-drawer-kicker">Raw trace</p><h2 id="traceDrawerTitle">Trace</h2></div>
|
|
4
4
|
<button class="trace-drawer-close" type="button" aria-label="Close trace drawer">×</button>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./state-DxpgDKMO.js";import{t}from"./preload-helper-DFYRRz9w.js";import{E as n,S as r,t as i,v as a,w as o}from"./render-
|
|
2
|
+
import{t as e}from"./state-DxpgDKMO.js";import{t}from"./preload-helper-DFYRRz9w.js";import{E as n,S as r,t as i,v as a,w as o}from"./render-C2g_qvCg.js";import{B as s,C as c,D as l,E as u,G as d,H as f,I as p,J as m,K as h,O as g,R as _,S as v,U as y,V as ee,W as b,X as te,_ as x,b as S,f as C,g as w,h as ne,l as re,m as T,p as ie,q as E,u as D,v as ae,w as O,x as k,y as A,z as j}from"./message-history-BSWJwi__.js";import{o as oe}from"./idb-cache-DTKWSF12.js";var se=2e3,ce=80;function M(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function le(e,t=``){let n=M(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=i(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function N(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function P(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=N(e);n.length<se||t-e.lastRenderTime>ce?(e.element.innerHTML=i(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=i(N(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function F(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=N(e);return t||(e.element.innerHTML=i(n)),n}function I(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function L(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&I(t)&&I(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function R(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:L(e,t)}function z(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>R(e,t))??null}function B(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function V(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return z(n,t)||B(n,t)}function H(){e.currentProcessBlock&&d(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&d(e.currentAgentDiv),l(),m(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var U=0;function W(){U=Date.now()}function ue(){U=0}function de(){return Date.now()-U<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function fe(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function pe(t){A();let n=K();if(n||(n=x(`agent`,``),e.currentAgentDiv=n,e.currentProcessBlock=null),v(n),!e.currentProcessBlock){let t=n.querySelector(`.agent-body`);t&&(e.currentProcessBlock=S(n)),!e.currentProcessBlock&&t&&(c(n),e.currentProcessBlock=f(t))}if(e.currentProcessBlock){let n=t.rawIcon||t.icon,i=t.status||r(t.icon)||`running`;if(i===`done`||i===`error`){let r=V(e.currentProcessBlock.steps,t);if(r){t.icon=o(t.icon);let a=t.type===`thinking`?E(r.id,t.detail):b(r.id,t.detail);h(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,detail:a,detailPreview:a,label:t.label||r.label,status:i}),p();return}if(t.stepRef&&(i===`done`||i===`error`)){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(r){t.icon=o(t.icon);let a=t.type===`thinking`?E(r.id,t.detail):b(r.id,t.detail);h(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:i,detail:a,detailPreview:a}),p();return}}}if(t.stepRef&&i===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=o(t.icon);let i=E(r.id,t.detail);h(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:i,detailPreview:i,label:t.label||r.label}),p();return}}let a=z(e.currentProcessBlock.steps,t,{includeDone:!0});if(a){t.rawIcon=n,t.icon=o(t.icon);let r=t.detail||``,s=y(a.id)||a.detail||a.detailPreview||``,c=r.length>=s.length?r:s,l=E(a.id,c),u=(a.status===`done`||a.status===`error`)&&i===`running`?a.status:i;h(e.currentProcessBlock,a.id,{...a,...t,id:a.id,rawIcon:n,status:u,detail:l,detailPreview:l,label:t.label||a.label}),p();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){h(e.currentProcessBlock,n.id,t),p();return}}t.rawIcon=n,t.icon=o(t.icon),j(e.currentProcessBlock,t)}p()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function me(e){let t=K()??fe();Y(t);let n=t||x(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function he(e,t){let n=y(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function ge(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>R(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(j(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=E(t.id,he(t,a));h(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function _e(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function ve(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function Q(t){if(!t?.running){Z=``,Y();return}let n=ve(t);if(n===Z&&K())return;l(),A(),e.currentAgentDiv=me(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=T(t.toolLog||[]);v(e.currentAgentDiv),e.currentProcessBlock=S(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||=(c(e.currentAgentDiv),f(r)),ge(e.currentProcessBlock,w(i,t.startedAt))):e.currentProcessBlock=S(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=le(a,t.text||``)),Z=n}function ye(t){if(!t)return;A(),K()||(e.currentAgentDiv=x(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=M(n),P(q,t)),p()}var $=0;function be(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function xe(t,r){let o=Date.now();if(!e.currentAgentDiv&&o-$<500)return;Z=``,l(),A(),e.currentAgentDiv&&v(e.currentAgentDiv);let c=O(e.currentProcessBlock??e.currentAgentDiv,!0),u=T(ie(Array.isArray(r)?r:[],c)),f=ne(u),p=!!e.currentProcessBlock||!!(e.currentAgentDiv&&k(e.currentAgentDiv));e.currentProcessBlock&&=(ee(e.currentProcessBlock),null);let m=u.length>0;if(t||m){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=x(`agent`,``)),e.currentAgentDiv.removeAttribute(J);let r=e.currentAgentDiv?.querySelector(`.msg-content`),o=q?F(q,!0):``,c=t||o;if(q=null,r&&(r.innerHTML=i(c)),m&&e.currentAgentDiv&&!p&&!k(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,s(w(u),!0))}e.currentAgentDiv&&v(e.currentAgentDiv),r&&r.setAttribute(`data-raw`,n(c)),r&&g(r);let l=_(),h=!!(l.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(r&&!h&&a(r,{immediate:!0}),h){let t=e.currentAgentDiv;be(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e.dataset.widgetHtml;if(!t)return;let n=document.createElement(`div`);n.className=`diagram-widget-pending`,n.dataset.diagramHtml=t,e.replaceWith(n)}),f?(l.appendItem(C({role:`assistant`,content:c,cli:null,tool_log:f},l.count)),d(t),l.scrollToBottom()):(t.dataset.turnIndex=String(l.count),t.dataset.messageId||(t.dataset.messageId=te()),l.appendLiveItem(t)),t.remove()}c&&oe({role:`assistant`,content:c,tool_log:f,timestamp:Date.now()}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),D(`idle`),re()}function Se(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`settings`&&t(()=>import(`./settings-Dst1mUjn.js`).then(e=>e.loadSettings()),__vite__mapDeps([0])),e===`agents`&&t(()=>import(`./employees-C5GPj3d3.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-B2io6S_4.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function Ce(){let e=document.getElementById(`tabSettings`)?.classList.contains(`active`);t(()=>import(`./settings-Dst1mUjn.js`).then(t=>e?t.savePerCli():t.updateSettings()),__vite__mapDeps([0]))}function we(){u({onStatus:ae})}export{xe as a,we as c,pe as d,Se as f,ue as i,de as l,_e as n,Ce as o,H as r,Q as s,ye as t,W as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{F as e,d as t,o as n}from"./message-history-BSWJwi__.js";import{r}from"./ui-BX-IfLze.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
|
package/public/dist/index.html
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
|
|
32
32
|
rel="stylesheet">
|
|
33
33
|
<!-- Vite handles module bundling in dev (HMR) and production (build) -->
|
|
34
|
-
<script type="module" crossorigin src="/dist/assets/app-
|
|
34
|
+
<script type="module" crossorigin src="/dist/assets/app-CLrfEHAk.js"></script>
|
|
35
35
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
36
36
|
<link rel="stylesheet" crossorigin href="/dist/assets/app-BPsa7jSJ.css">
|
|
37
37
|
</head>
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
<link rel="icon" type="image/png" href="/dist/assets/icon-192-CwXPIYF5.png">
|
|
7
7
|
<title>Jaw Manager</title>
|
|
8
8
|
<script src="/manager/theme-boot.js"></script>
|
|
9
|
-
<script type="module" crossorigin src="/dist/assets/manager-
|
|
9
|
+
<script type="module" crossorigin src="/dist/assets/manager-Ceg2x8D0.js"></script>
|
|
10
10
|
<link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-Bjnw0wQ6.css">
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/dist/assets/manager-
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/dist/assets/manager-CwAlpgV7.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="manager-root"></div>
|
|
@@ -183,7 +183,7 @@ export function linkifyFilePaths(container: HTMLElement, notesRoot: string | nul
|
|
|
183
183
|
let textNode: Text | null;
|
|
184
184
|
while ((textNode = walker.nextNode() as Text | null)) {
|
|
185
185
|
const text = textNode.textContent || '';
|
|
186
|
-
const hits = mergeHits(collectAbsoluteHits(text), collectRelativeNoteHits(text));
|
|
186
|
+
const hits = mergeHits(collectAbsoluteHits(text), notesRoot ? collectRelativeNoteHits(text) : []);
|
|
187
187
|
if (hits.length) nodeMatches.set(textNode, hits);
|
|
188
188
|
}
|
|
189
189
|
|
|
@@ -48,7 +48,7 @@ export function normalizeNotesVaultPath(input: string, notesRoot: string | null)
|
|
|
48
48
|
const raw = normalizeSlashes(input);
|
|
49
49
|
if (!raw) return null;
|
|
50
50
|
|
|
51
|
-
if (!raw.startsWith('~/') && looksLikeNoteRelPath(raw)) return raw;
|
|
51
|
+
if (notesRoot && !raw.startsWith('~/') && looksLikeNoteRelPath(raw)) return raw;
|
|
52
52
|
|
|
53
53
|
if (!notesRoot) return null;
|
|
54
54
|
|
package/public/locales/en.json
CHANGED
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"cmd.artifact.action.startPabcd": "Use in PABCD P",
|
|
46
46
|
"cmd.workflow.planAudit.desc": "Create a read-only plan audit task",
|
|
47
47
|
"cmd.workflow.planAudit.tg_desc": "Create plan audit task",
|
|
48
|
+
"cmd.workflow.search.desc": "Route search through the search skill",
|
|
49
|
+
"cmd.workflow.search.tg_desc": "Search through the search skill",
|
|
48
50
|
"cmd.workflow.goal.desc": "Goal state and bounded run workflow",
|
|
49
51
|
"cmd.workflow.goal.tg_desc": "Check goal or run state",
|
|
50
52
|
"cmd.workflow.team.desc": "Parallel team orchestration",
|
package/public/locales/ja.json
CHANGED
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"cmd.artifact.action.startPabcd": "PABCD Pで使う",
|
|
46
46
|
"cmd.workflow.planAudit.desc": "読み取り専用の計画監査タスクを作成",
|
|
47
47
|
"cmd.workflow.planAudit.tg_desc": "計画監査タスクを作成",
|
|
48
|
+
"cmd.workflow.search.desc": "検索スキル経由で検索を実行",
|
|
49
|
+
"cmd.workflow.search.tg_desc": "検索スキルで検索",
|
|
48
50
|
"cmd.workflow.goal.desc": "ゴール状態と制限付き実行ワークフロー",
|
|
49
51
|
"cmd.workflow.goal.tg_desc": "ゴールまたは実行状態を確認",
|
|
50
52
|
"cmd.workflow.team.desc": "並列チームオーケストレーション",
|
package/public/locales/ko.json
CHANGED
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"cmd.artifact.action.startPabcd": "PABCD P로 사용",
|
|
46
46
|
"cmd.workflow.planAudit.desc": "읽기 전용 계획 감사 작업 생성",
|
|
47
47
|
"cmd.workflow.planAudit.tg_desc": "계획 감사 작업 생성",
|
|
48
|
+
"cmd.workflow.search.desc": "검색 스킬로 검색 요청 라우팅",
|
|
49
|
+
"cmd.workflow.search.tg_desc": "검색 스킬로 검색",
|
|
48
50
|
"cmd.workflow.goal.desc": "목표 상태와 제한 실행 워크플로우",
|
|
49
51
|
"cmd.workflow.goal.tg_desc": "목표 또는 실행 상태 확인",
|
|
50
52
|
"cmd.workflow.team.desc": "병렬 팀 오케스트레이션",
|
package/public/locales/zh.json
CHANGED
|
@@ -45,6 +45,8 @@
|
|
|
45
45
|
"cmd.artifact.action.startPabcd": "用于 PABCD P",
|
|
46
46
|
"cmd.workflow.planAudit.desc": "创建只读计划审计任务",
|
|
47
47
|
"cmd.workflow.planAudit.tg_desc": "创建计划审计任务",
|
|
48
|
+
"cmd.workflow.search.desc": "通过搜索技能路由搜索请求",
|
|
49
|
+
"cmd.workflow.search.tg_desc": "通过搜索技能搜索",
|
|
48
50
|
"cmd.workflow.goal.desc": "目标状态和受限运行工作流",
|
|
49
51
|
"cmd.workflow.goal.tg_desc": "查看目标或运行状态",
|
|
50
52
|
"cmd.workflow.team.desc": "并行团队编排",
|
|
@@ -65,6 +65,7 @@ import { ModeSwitch } from './code/ModeSwitch';
|
|
|
65
65
|
const CodeCanvas = lazy(() => import('./code/CodeCanvas').then(m => ({ default: m.CodeCanvas })));
|
|
66
66
|
import './code/code.css';
|
|
67
67
|
import { useWorkbenchResourceState } from './workbench/useWorkbenchResourceState';
|
|
68
|
+
import { WorkerProgressMonitorPanel } from './workers/WorkerProgressMonitorPanel';
|
|
68
69
|
|
|
69
70
|
type WorkspaceSurfaceProps = {
|
|
70
71
|
active: boolean;
|
|
@@ -399,9 +400,12 @@ export function SidebarRailRouter(props: Props) {
|
|
|
399
400
|
<div id="code-session-sidebar-host" className="code-session-sidebar-host" />
|
|
400
401
|
</section>
|
|
401
402
|
) : (
|
|
402
|
-
|
|
403
|
-
{props.
|
|
404
|
-
|
|
403
|
+
<>
|
|
404
|
+
<InstanceNavigator active={props.selectedInstance} hiddenCount={props.instances.filter(instance => instance.hidden).length} collapsed={props.sidebarCollapsed}>
|
|
405
|
+
{props.instanceListContent}
|
|
406
|
+
</InstanceNavigator>
|
|
407
|
+
<WorkerProgressMonitorPanel />
|
|
408
|
+
</>
|
|
405
409
|
)}
|
|
406
410
|
</div>
|
|
407
411
|
</>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type BackgroundTaskStatus = 'running' | 'complete' | 'failed' | 'cancelled' | 'orphaned';
|
|
2
|
+
export type RuntimeStatusCategory = 'running' | 'succeeded' | 'failed' | 'cancelled' | 'orphaned';
|
|
2
3
|
|
|
3
4
|
export type BackgroundTaskCompletion =
|
|
4
5
|
| { type: 'exit' }
|
|
@@ -46,11 +47,14 @@ export interface BackgroundTaskRow {
|
|
|
46
47
|
completedAt: string | null;
|
|
47
48
|
notifiedAt: string | null;
|
|
48
49
|
runnerActive?: boolean;
|
|
50
|
+
statusCategory?: RuntimeStatusCategory;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
export interface BackgroundTaskRunningSnapshot {
|
|
52
54
|
id: string;
|
|
53
55
|
kind: string;
|
|
56
|
+
status?: BackgroundTaskStatus;
|
|
57
|
+
statusCategory?: RuntimeStatusCategory;
|
|
54
58
|
startedAt?: string | null;
|
|
55
59
|
}
|
|
56
60
|
|
|
@@ -58,6 +62,7 @@ export interface BackgroundTaskChangedSnapshot {
|
|
|
58
62
|
id: string;
|
|
59
63
|
kind: string;
|
|
60
64
|
status: BackgroundTaskStatus;
|
|
65
|
+
statusCategory?: RuntimeStatusCategory;
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
export interface BackgroundTaskUpdate {
|
|
@@ -206,6 +211,14 @@ function isStatus(value: unknown): value is BackgroundTaskStatus {
|
|
|
206
211
|
|| value === 'orphaned';
|
|
207
212
|
}
|
|
208
213
|
|
|
214
|
+
function isStatusCategory(value: unknown): value is RuntimeStatusCategory {
|
|
215
|
+
return value === 'running'
|
|
216
|
+
|| value === 'succeeded'
|
|
217
|
+
|| value === 'failed'
|
|
218
|
+
|| value === 'cancelled'
|
|
219
|
+
|| value === 'orphaned';
|
|
220
|
+
}
|
|
221
|
+
|
|
209
222
|
function normalizeRunning(value: unknown): BackgroundTaskRunningSnapshot[] {
|
|
210
223
|
if (!Array.isArray(value)) return [];
|
|
211
224
|
return value.flatMap((entry) => {
|
|
@@ -213,6 +226,8 @@ function normalizeRunning(value: unknown): BackgroundTaskRunningSnapshot[] {
|
|
|
213
226
|
return [{
|
|
214
227
|
id: entry['id'],
|
|
215
228
|
kind: entry['kind'],
|
|
229
|
+
...(isStatus(entry['status']) ? { status: entry['status'] } : {}),
|
|
230
|
+
...(isStatusCategory(entry['statusCategory']) ? { statusCategory: entry['statusCategory'] } : {}),
|
|
216
231
|
...(typeof entry['startedAt'] === 'string' || entry['startedAt'] === null ? { startedAt: entry['startedAt'] } : {}),
|
|
217
232
|
}];
|
|
218
233
|
});
|
|
@@ -221,7 +236,12 @@ function normalizeRunning(value: unknown): BackgroundTaskRunningSnapshot[] {
|
|
|
221
236
|
function normalizeChanged(value: unknown): BackgroundTaskChangedSnapshot | null {
|
|
222
237
|
if (!isObject(value)) return null;
|
|
223
238
|
if (typeof value['id'] !== 'string' || typeof value['kind'] !== 'string' || !isStatus(value['status'])) return null;
|
|
224
|
-
return {
|
|
239
|
+
return {
|
|
240
|
+
id: value['id'],
|
|
241
|
+
kind: value['kind'],
|
|
242
|
+
status: value['status'],
|
|
243
|
+
...(isStatusCategory(value['statusCategory']) ? { statusCategory: value['statusCategory'] } : {}),
|
|
244
|
+
};
|
|
225
245
|
}
|
|
226
246
|
|
|
227
247
|
export function normalizeBackgroundTaskUpdate(frame: unknown): BackgroundTaskUpdate | null {
|
|
@@ -26,6 +26,8 @@ import './manager-dashboard-reminders.css';
|
|
|
26
26
|
import './manager-dashboard-reminders-priority.css';
|
|
27
27
|
import './manager-dashboard-reminders-parity.css';
|
|
28
28
|
import './manager-tray-reminders.css';
|
|
29
|
+
import './workers/worker-progress-monitor.css';
|
|
30
|
+
import './workers/worker-runs.css';
|
|
29
31
|
import './settings-shell.css';
|
|
30
32
|
import './settings-controls.css';
|
|
31
33
|
import './settings-agent.css';
|
|
@@ -2,6 +2,7 @@ import { useMemo, useState } from 'react';
|
|
|
2
2
|
import type { WorkerProgressRun, WorkerProgressSnapshot } from './worker-progress-client';
|
|
3
3
|
import { buildWorkerActivityTimeline } from './worker-activity-timeline';
|
|
4
4
|
import { countWorkerProgress, useWorkerProgress } from './useWorkerProgress';
|
|
5
|
+
import { WorkerRunsPanel } from './WorkerRunsPanel';
|
|
5
6
|
|
|
6
7
|
function runOf(snapshot: WorkerProgressSnapshot): WorkerProgressRun | null {
|
|
7
8
|
return snapshot.current ?? snapshot.previous;
|
|
@@ -155,6 +156,7 @@ export function WorkerProgressMonitorPanel() {
|
|
|
155
156
|
<span>{workers.length} tracked</span>
|
|
156
157
|
<span>{lastReason}</span>
|
|
157
158
|
</div>
|
|
159
|
+
<WorkerRunsPanel />
|
|
158
160
|
</section>
|
|
159
161
|
);
|
|
160
162
|
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
import type { WorkerRunEvent, WorkerRunRecord, WorkerRunsClient } from './worker-runs-client';
|
|
3
|
+
import { useWorkerRuns } from './useWorkerRuns';
|
|
4
|
+
|
|
5
|
+
type WorkerRunsPanelProps = {
|
|
6
|
+
client?: WorkerRunsClient;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
function formatTime(value: number | null | undefined): string {
|
|
10
|
+
if (!value) return 'unknown';
|
|
11
|
+
return new Intl.DateTimeFormat(undefined, {
|
|
12
|
+
hour: '2-digit',
|
|
13
|
+
minute: '2-digit',
|
|
14
|
+
second: '2-digit',
|
|
15
|
+
}).format(new Date(value));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function byteLabel(value: number): string {
|
|
19
|
+
if (value < 1024) return `${value} B`;
|
|
20
|
+
if (value < 1024 * 1024) return `${Math.round(value / 1024)} KB`;
|
|
21
|
+
return `${(value / 1024 / 1024).toFixed(1)} MB`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function taskPreview(value: string): string {
|
|
25
|
+
const text = value.trim();
|
|
26
|
+
if (!text) return 'No task preview';
|
|
27
|
+
return text.length > 96 ? `${text.slice(0, 96)}...` : text;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function runDetail(run: WorkerRunRecord): string {
|
|
31
|
+
return [
|
|
32
|
+
run.runId,
|
|
33
|
+
`updated ${formatTime(run.updatedAt)}`,
|
|
34
|
+
run.hasOutput ? byteLabel(run.outputBytes) : 'no output',
|
|
35
|
+
].join(' · ');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function eventDetail(event: WorkerRunEvent): string {
|
|
39
|
+
const data = event.data || {};
|
|
40
|
+
if (typeof data['safeSummary'] === 'string') return data['safeSummary'];
|
|
41
|
+
if (typeof data['toolCount'] === 'number') return `${data['toolCount']} tool updates`;
|
|
42
|
+
if (data['attention'] && typeof data['attention'] === 'object') return 'attention metadata';
|
|
43
|
+
return `seq ${event.seq}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function countRuns(runs: WorkerRunRecord[]): { running: number; done: number; failed: number; attention: number } {
|
|
47
|
+
return runs.reduce((counts, run) => {
|
|
48
|
+
if (run.status === 'running') counts.running += 1;
|
|
49
|
+
if (run.status === 'done') counts.done += 1;
|
|
50
|
+
if (run.status === 'failed' || run.status === 'cancelled') counts.failed += 1;
|
|
51
|
+
if (run.hasOutput || run.outputBytes > 0) counts.attention += 1;
|
|
52
|
+
return counts;
|
|
53
|
+
}, { running: 0, done: 0, failed: 0, attention: 0 });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function WorkerRunsPanel(props: WorkerRunsPanelProps) {
|
|
57
|
+
const { runs, loading, error, lastReason, eventsByRunId, outputByRunId, refresh, loadEvents, loadOutput } = useWorkerRuns(props.client);
|
|
58
|
+
const [expandedRunId, setExpandedRunId] = useState<string | null>(null);
|
|
59
|
+
const visibleRuns = runs.slice(0, 8);
|
|
60
|
+
const counts = useMemo(() => countRuns(runs), [runs]);
|
|
61
|
+
|
|
62
|
+
const toggleRun = (run: WorkerRunRecord) => {
|
|
63
|
+
setExpandedRunId(prev => prev === run.runId ? null : run.runId);
|
|
64
|
+
if (expandedRunId !== run.runId) void loadEvents(run.runId);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<section className="code-worker-runs" aria-label="Worker runs">
|
|
69
|
+
<div className="code-worker-runs-header">
|
|
70
|
+
<div>
|
|
71
|
+
<span className="code-worker-kicker">Runs</span>
|
|
72
|
+
<strong>Recent worker runs</strong>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="code-worker-runs-summary" aria-live="polite">
|
|
75
|
+
<span className={counts.running > 0 ? 'is-active' : ''}>{counts.running} running</span>
|
|
76
|
+
<span>{counts.done} done</span>
|
|
77
|
+
<span className={counts.failed > 0 ? 'is-attention' : ''}>{counts.failed} failed</span>
|
|
78
|
+
<span>{counts.attention} output</span>
|
|
79
|
+
</div>
|
|
80
|
+
<button type="button" className="code-worker-refresh" onClick={() => void refresh()} disabled={loading}>
|
|
81
|
+
Refresh
|
|
82
|
+
</button>
|
|
83
|
+
</div>
|
|
84
|
+
{error && <div className="code-worker-error" role="status">{error}</div>}
|
|
85
|
+
{loading ? (
|
|
86
|
+
<div className="code-worker-empty">Loading worker runs...</div>
|
|
87
|
+
) : visibleRuns.length === 0 ? (
|
|
88
|
+
<div className="code-worker-empty">No worker runs.</div>
|
|
89
|
+
) : (
|
|
90
|
+
<ul className="code-worker-run-list">
|
|
91
|
+
{visibleRuns.map(run => {
|
|
92
|
+
const expanded = expandedRunId === run.runId;
|
|
93
|
+
const eventsState = eventsByRunId[run.runId];
|
|
94
|
+
const outputState = outputByRunId[run.runId];
|
|
95
|
+
const output = outputState?.output ?? null;
|
|
96
|
+
return (
|
|
97
|
+
<li key={run.runId} className={`code-worker-run-item is-${run.status}`}>
|
|
98
|
+
<button type="button" className="code-worker-run-main" onClick={() => toggleRun(run)} aria-expanded={expanded}>
|
|
99
|
+
<span className={`code-worker-status is-${run.status}`}>{run.status}</span>
|
|
100
|
+
<span className="code-worker-title">{run.employeeName || run.agentId}</span>
|
|
101
|
+
<span className="code-worker-meta">{runDetail(run)}</span>
|
|
102
|
+
<span className="code-worker-run-task">{taskPreview(run.taskPreview)}</span>
|
|
103
|
+
</button>
|
|
104
|
+
{expanded && (
|
|
105
|
+
<div className="code-worker-run-detail">
|
|
106
|
+
{eventsState?.error && <div className="code-worker-error" role="status">{eventsState.error}</div>}
|
|
107
|
+
{eventsState?.loading ? (
|
|
108
|
+
<div className="code-worker-empty">Loading safe events...</div>
|
|
109
|
+
) : (
|
|
110
|
+
<ol className="code-worker-run-events">
|
|
111
|
+
{(eventsState?.events ?? []).slice(-12).map(event => (
|
|
112
|
+
<li key={`${event.runId}:${event.seq}`}>
|
|
113
|
+
<b>{event.event.replace('worker_run_', '')}</b>
|
|
114
|
+
<span>{formatTime(event.ts)}</span>
|
|
115
|
+
<code>{eventDetail(event)}</code>
|
|
116
|
+
</li>
|
|
117
|
+
))}
|
|
118
|
+
</ol>
|
|
119
|
+
)}
|
|
120
|
+
{run.hasOutput && !output && (
|
|
121
|
+
<button type="button" className="code-worker-output-action" onClick={() => void loadOutput(run.runId, { offset: 0 })} disabled={outputState?.loading}>
|
|
122
|
+
{outputState?.loading ? 'Loading output...' : 'Load output'}
|
|
123
|
+
</button>
|
|
124
|
+
)}
|
|
125
|
+
{outputState?.error && <div className="code-worker-error" role="status">{outputState.error}</div>}
|
|
126
|
+
{output && (
|
|
127
|
+
<div className="code-worker-output">
|
|
128
|
+
<div>
|
|
129
|
+
<span>{byteLabel(output.offset)}-{byteLabel(output.nextOffset)} of {byteLabel(output.outputBytes)}</span>
|
|
130
|
+
{!output.eof && (
|
|
131
|
+
<button type="button" className="code-worker-output-action" onClick={() => void loadOutput(run.runId, { offset: output.nextOffset })} disabled={outputState?.loading}>
|
|
132
|
+
Load next chunk
|
|
133
|
+
</button>
|
|
134
|
+
)}
|
|
135
|
+
</div>
|
|
136
|
+
<pre>{output.text || 'No output text.'}</pre>
|
|
137
|
+
</div>
|
|
138
|
+
)}
|
|
139
|
+
</div>
|
|
140
|
+
)}
|
|
141
|
+
</li>
|
|
142
|
+
);
|
|
143
|
+
})}
|
|
144
|
+
</ul>
|
|
145
|
+
)}
|
|
146
|
+
<div className="code-worker-footer">
|
|
147
|
+
<span>{runs.length} runs</span>
|
|
148
|
+
<span>{lastReason}</span>
|
|
149
|
+
</div>
|
|
150
|
+
</section>
|
|
151
|
+
);
|
|
152
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
createWorkerRunsClient,
|
|
4
|
+
type WorkerRunEvent,
|
|
5
|
+
type WorkerRunOutput,
|
|
6
|
+
type WorkerRunRecord,
|
|
7
|
+
type WorkerRunsClient,
|
|
8
|
+
} from './worker-runs-client';
|
|
9
|
+
import { subscribeToWorkerProgressEvents } from './worker-progress-client';
|
|
10
|
+
|
|
11
|
+
export type WorkerRunEventState = {
|
|
12
|
+
events: WorkerRunEvent[];
|
|
13
|
+
loading: boolean;
|
|
14
|
+
error: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type WorkerRunOutputState = {
|
|
18
|
+
output: WorkerRunOutput | null;
|
|
19
|
+
loading: boolean;
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
type WorkerRunsState = {
|
|
24
|
+
runs: WorkerRunRecord[];
|
|
25
|
+
loading: boolean;
|
|
26
|
+
error: string;
|
|
27
|
+
lastReason: string;
|
|
28
|
+
eventsByRunId: Record<string, WorkerRunEventState>;
|
|
29
|
+
outputByRunId: Record<string, WorkerRunOutputState>;
|
|
30
|
+
refresh: () => Promise<void>;
|
|
31
|
+
loadEvents: (runId: string) => Promise<void>;
|
|
32
|
+
loadOutput: (runId: string, input?: { offset?: number; limit?: number }) => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
function errorText(err: unknown): string {
|
|
36
|
+
return err instanceof Error ? err.message : String(err);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function sortWorkerRuns(runs: WorkerRunRecord[]): WorkerRunRecord[] {
|
|
40
|
+
return [...runs].sort((left, right) => right.updatedAt - left.updatedAt);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function useWorkerRuns(clientOverride?: WorkerRunsClient): WorkerRunsState {
|
|
44
|
+
const client = useMemo(() => clientOverride ?? createWorkerRunsClient(), [clientOverride]);
|
|
45
|
+
const [runs, setRuns] = useState<WorkerRunRecord[]>([]);
|
|
46
|
+
const [loading, setLoading] = useState(true);
|
|
47
|
+
const [error, setError] = useState('');
|
|
48
|
+
const [lastReason, setLastReason] = useState('hydrated');
|
|
49
|
+
const [eventsByRunId, setEventsByRunId] = useState<Record<string, WorkerRunEventState>>({});
|
|
50
|
+
const [outputByRunId, setOutputByRunId] = useState<Record<string, WorkerRunOutputState>>({});
|
|
51
|
+
|
|
52
|
+
const refresh = useCallback(async () => {
|
|
53
|
+
try {
|
|
54
|
+
const next = await client.listRuns();
|
|
55
|
+
setRuns(sortWorkerRuns(next));
|
|
56
|
+
setError('');
|
|
57
|
+
} catch (err) {
|
|
58
|
+
setError(errorText(err));
|
|
59
|
+
} finally {
|
|
60
|
+
setLoading(false);
|
|
61
|
+
}
|
|
62
|
+
}, [client]);
|
|
63
|
+
|
|
64
|
+
const loadEvents = useCallback(async (runId: string) => {
|
|
65
|
+
setEventsByRunId(prev => ({
|
|
66
|
+
...prev,
|
|
67
|
+
[runId]: { events: prev[runId]?.events ?? [], loading: true, error: '' },
|
|
68
|
+
}));
|
|
69
|
+
try {
|
|
70
|
+
const events = await client.getRunEvents(runId);
|
|
71
|
+
setEventsByRunId(prev => ({
|
|
72
|
+
...prev,
|
|
73
|
+
[runId]: { events, loading: false, error: '' },
|
|
74
|
+
}));
|
|
75
|
+
} catch (err) {
|
|
76
|
+
setEventsByRunId(prev => ({
|
|
77
|
+
...prev,
|
|
78
|
+
[runId]: { events: prev[runId]?.events ?? [], loading: false, error: errorText(err) },
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
}, [client]);
|
|
82
|
+
|
|
83
|
+
const loadOutput = useCallback(async (runId: string, input: { offset?: number; limit?: number } = {}) => {
|
|
84
|
+
setOutputByRunId(prev => ({
|
|
85
|
+
...prev,
|
|
86
|
+
[runId]: { output: prev[runId]?.output ?? null, loading: true, error: '' },
|
|
87
|
+
}));
|
|
88
|
+
try {
|
|
89
|
+
const output = await client.readRunOutput(runId, input);
|
|
90
|
+
setOutputByRunId(prev => ({
|
|
91
|
+
...prev,
|
|
92
|
+
[runId]: { output, loading: false, error: '' },
|
|
93
|
+
}));
|
|
94
|
+
} catch (err) {
|
|
95
|
+
setOutputByRunId(prev => ({
|
|
96
|
+
...prev,
|
|
97
|
+
[runId]: { output: prev[runId]?.output ?? null, loading: false, error: errorText(err) },
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
}, [client]);
|
|
101
|
+
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
let cancelled = false;
|
|
104
|
+
setLoading(true);
|
|
105
|
+
void client.listRuns().then(
|
|
106
|
+
next => {
|
|
107
|
+
if (cancelled) return;
|
|
108
|
+
setRuns(sortWorkerRuns(next));
|
|
109
|
+
setError('');
|
|
110
|
+
setLoading(false);
|
|
111
|
+
},
|
|
112
|
+
err => {
|
|
113
|
+
if (cancelled) return;
|
|
114
|
+
setError(errorText(err));
|
|
115
|
+
setLoading(false);
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
return () => { cancelled = true; };
|
|
119
|
+
}, [client]);
|
|
120
|
+
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
const sub = subscribeToWorkerProgressEvents({
|
|
123
|
+
onRefreshNeeded: reason => {
|
|
124
|
+
setLastReason(reason);
|
|
125
|
+
if (reason.startsWith('worker_run_') || reason === 'replay_gap') void refresh();
|
|
126
|
+
},
|
|
127
|
+
onReplayGap: () => {
|
|
128
|
+
setLastReason('replay_gap');
|
|
129
|
+
},
|
|
130
|
+
onError: () => {
|
|
131
|
+
setError('Worker run event stream disconnected; retrying.');
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return () => sub.close();
|
|
135
|
+
}, [refresh]);
|
|
136
|
+
|
|
137
|
+
return { runs, loading, error, lastReason, eventsByRunId, outputByRunId, refresh, loadEvents, loadOutput };
|
|
138
|
+
}
|