cli-jaw 1.7.26 → 1.7.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/server.js +4 -15
  2. package/dist/server.js.map +1 -1
  3. package/dist/src/agent/events.js +17 -4
  4. package/dist/src/agent/events.js.map +1 -1
  5. package/dist/src/agent/spawn.js +17 -7
  6. package/dist/src/agent/spawn.js.map +1 -1
  7. package/dist/src/cli/registry.js +1 -1
  8. package/dist/src/cli/registry.js.map +1 -1
  9. package/dist/src/core/config.js +1 -1
  10. package/dist/src/core/config.js.map +1 -1
  11. package/dist/src/core/db.js +1 -0
  12. package/dist/src/core/db.js.map +1 -1
  13. package/dist/src/orchestrator/pipeline.js +4 -30
  14. package/dist/src/orchestrator/pipeline.js.map +1 -1
  15. package/dist/src/orchestrator/scope.js +4 -58
  16. package/dist/src/orchestrator/scope.js.map +1 -1
  17. package/dist/src/orchestrator/state-machine.js +5 -1
  18. package/dist/src/orchestrator/state-machine.js.map +1 -1
  19. package/dist/src/prompt/builder.js +7 -3
  20. package/dist/src/prompt/builder.js.map +1 -1
  21. package/package.json +1 -1
  22. package/public/dist/assets/constants-CAm2valm.js +1 -0
  23. package/public/dist/assets/employees-FKzO8u5B.js +33 -0
  24. package/public/dist/assets/{index-Cq1XIs9F.js → index-BwdUAYdc.js} +4 -4
  25. package/public/dist/assets/{memory-D4gfTYaH.js → memory-BUu7n3ZA.js} +1 -1
  26. package/public/dist/assets/memory-DaOmxd0M.js +1 -0
  27. package/public/dist/assets/{render-B4UW-ETN.js → render-DrAT7uxc.js} +1 -1
  28. package/public/dist/assets/settings-D54BMOE1.js +1 -0
  29. package/public/dist/assets/{settings-B6F624Rg.js → settings-D9zwGpUo.js} +2 -2
  30. package/public/dist/assets/{skills-BPoCOTKl.js → skills-B2izM4VK.js} +1 -1
  31. package/public/dist/assets/skills-CxRJMDeM.js +1 -0
  32. package/public/dist/assets/slash-commands-BkX-qNav.js +1 -0
  33. package/public/dist/assets/{slash-commands-AE7_8-VM.js → slash-commands-DBNMSGYB.js} +1 -1
  34. package/public/dist/assets/{ui-uLQlj-KP.js → ui-BgrxFNSm.js} +3 -3
  35. package/public/dist/assets/ui-CK8lwkRr.js +1 -0
  36. package/public/dist/assets/{ws-B0o_pjAv.js → ws-CssuaHj_.js} +2 -2
  37. package/public/dist/index.html +1 -1
  38. package/public/js/constants.ts +1 -1
  39. package/public/js/diagram/iframe-renderer.ts +1 -1
  40. package/public/js/features/employees.ts +25 -5
  41. package/public/js/features/settings-core.ts +4 -4
  42. package/public/js/main.ts +28 -3
  43. package/public/dist/assets/constants-6aKcynAM.js +0 -1
  44. package/public/dist/assets/employees-oo8qAIuT.js +0 -33
  45. package/public/dist/assets/memory-hTGuYDCY.js +0 -1
  46. package/public/dist/assets/settings-By6PUVHH.js +0 -1
  47. package/public/dist/assets/skills-CAkvgFIi.js +0 -1
  48. package/public/dist/assets/slash-commands-BR8OqgkF.js +0 -1
  49. package/public/dist/assets/ui-cY6tqz0q.js +0 -1
package/public/js/main.ts CHANGED
@@ -1,15 +1,39 @@
1
1
  // ── App Entry Point ──
2
- // All event bindings happen here (no inline onclick in HTML)
3
-
4
- // CSS imports — bundled by Vite
2
+ // All event bindings happen here (no inline onclick in HTML). CSS imports are bundled by Vite.
5
3
  import 'katex/dist/katex.min.css';
6
4
 
5
+ const STALE_BUNDLE_RELOAD_KEY = 'jaw:stale-bundle-reload-pending';
6
+ function recoverFromStaleBundle(error: unknown): boolean {
7
+ const message = typeof error === 'string' ? error
8
+ : error instanceof Error ? error.message
9
+ : typeof (error as { message?: unknown })?.message === 'string' ? (error as { message: string }).message
10
+ : '';
11
+ if (!/(failed to fetch dynamically imported module|error loading dynamically imported module|importing a module script failed|chunkloaderror)/i.test(message)) return false;
12
+ console.warn('[stale-bundle] detected dynamic import failure:', message);
13
+ try { if (sessionStorage.getItem(STALE_BUNDLE_RELOAD_KEY) === '1') return true; sessionStorage.setItem(STALE_BUNDLE_RELOAD_KEY, '1'); } catch {}
14
+ const reload = () => window.location.reload();
15
+ if ('serviceWorker' in navigator) {
16
+ void navigator.serviceWorker.getRegistration().then(r => r?.update()).catch(() => {}).finally(reload);
17
+ return true;
18
+ }
19
+ reload();
20
+ return true;
21
+ }
22
+
7
23
  // ── Global Error Boundary ──
8
24
  window.addEventListener('unhandledrejection', (e) => {
25
+ if (recoverFromStaleBundle(e.reason)) {
26
+ e.preventDefault();
27
+ return;
28
+ }
9
29
  console.error('[unhandled]', e.reason);
10
30
  e.preventDefault();
11
31
  });
12
32
  window.addEventListener('error', (e) => {
33
+ if (recoverFromStaleBundle(e.error || e.message)) {
34
+ e.preventDefault();
35
+ return;
36
+ }
13
37
  console.error('[error]', e.message, e.filename, e.lineno);
14
38
  });
15
39
 
@@ -439,6 +463,7 @@ async function bootstrap(): Promise<void> {
439
463
  initSidebar();
440
464
  initMsgCopy();
441
465
  initGestures();
466
+ try { sessionStorage.removeItem(STALE_BUNDLE_RELOAD_KEY); } catch {}
442
467
 
443
468
  // Register Service Worker (production only — Vite HMR handles dev)
444
469
  if ('serviceWorker' in navigator && !import.meta.env.DEV) {
@@ -1 +0,0 @@
1
- import{t as e}from"./api-DygAf_G_.js";var t={claude:{label:`Claude`,efforts:[`low`,`medium`,`high`,`xhigh`,`max`],models:[`claude-opus-4-6[1m]`,`claude-opus-4-6`,`claude-opus-4-7[1m]`,`claude-opus-4-7`,`claude-sonnet-4-6[1m]`,`claude-sonnet-4-6`,`claude-haiku-4-5`]},codex:{label:`Codex`,efforts:[`low`,`medium`,`high`,`xhigh`],models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.3-codex`,`gpt-5.3-codex-spark`,`gpt-5.2-codex`,`gpt-5.1-codex-max`,`gpt-5.1-codex-mini`]},gemini:{label:`Gemini`,efforts:[],models:[`gemini-3.0-pro-preview`,`gemini-3.1-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`,`gemini-2.5-flash`]},opencode:{label:`OpenCode`,efforts:[`minimal`,`low`,`high`,`max`],models:[`anthropic/claude-opus-4-6-thinking`,`anthropic/claude-sonnet-4-6-thinking`,`anthropic/claude-sonnet-4-6`,`openai/gpt-5.4-xhigh`,`openai/gpt-5.4-high`,`openai/gpt-5.3-codex-xhigh`,`openai/gpt-5.3-codex-high`,`opencode/big-pickle`,`opencode-go/glm-5`,`opencode-go/glm-5.1`,`opencode-go/kimi-k2.5`,`opencode-go/mimo-v2-pro`,`opencode-go/mimo-v2-omni`,`opencode-go/minimax-m2.5`,`opencode-go/minimax-m2.7`,`opencode/GLM-5 Free`,`opencode/MiniMax M2.5 Free`,`opencode/Kimi K2.5 Free`,`opencode/GPT 5 Nano Free`,`opencode/Grok Code Fast 1 Free`]},copilot:{label:`Copilot`,efforts:[`low`,`medium`,`high`],effortNote:`-> ~/.copilot/config.json`,models:[`gpt-5.5`,`claude-sonnet-4.6`,`claude-opus-4.6`,`claude-haiku-4.5`,`gpt-5.4`,`gpt-5.3-codex`,`gpt-5.2-codex`,`gpt-5.1-codex`,`gpt-4.1`,`gpt-5-mini`,`gemini-3-pro-preview`]}};function n(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r?.models)?[...r.models]:[];return t}function r(e){let t={};for(let[n,r]of Object.entries(e||{})){if(!r||typeof r!=`object`)continue;let e=r,i={label:e.label||n,efforts:Array.isArray(e.efforts)?[...e.efforts]:[],models:Array.isArray(e.models)?[...e.models]:[]};typeof e.effortNote==`string`&&e.effortNote.trim()&&(i.effortNote=e.effortNote),t[n]=i}return t}var i=r(t),a=Object.keys(i),o=n(i);function s(e){let t=r(e);return Object.keys(t).length?(i=t,a=Object.keys(t),o=n(t),!0):!1}async function c(){try{let t=await e(`/api/cli-registry`);if(!t||!s(t))throw Error(`invalid registry`)}catch(e){console.warn(`[cli-registry] fallback:`,e.message),s(t)}return i}function l(){return a}function u(e){return i[e]||null}var d=[{value:`frontend`,labelKey:`role.label.frontend`,label:`Frontend`,prompt:`Frontend employee — UI/UX, CSS, components`,skill:`dev-frontend`},{value:`backend`,labelKey:`role.label.backend`,label:`Backend`,prompt:`Backend employee — API, DB, server logic`,skill:`dev-backend`},{value:`data`,labelKey:`role.label.data`,label:`Data`,prompt:`Data employee — data pipeline, analysis, ML`,skill:`dev-data`},{value:`docs`,labelKey:`role.label.docs`,label:`Docs`,prompt:`Docs employee — documentation, README, API docs`,skill:`documentation`},{value:`custom`,labelKey:`role.label.custom`,label:`Custom...`,prompt:``,skill:null}];export{c as a,u as i,d as n,l as r,o as t};
@@ -1,33 +0,0 @@
1
- import{t as e}from"./state-O6NVkWcL.js";import{n as t,r as n,t as r}from"./api-DygAf_G_.js";import{h as i,n as a,s as o}from"./render-B4UW-ETN.js";import{n as s}from"./ws-B0o_pjAv.js";import{n as c,r as l,t as u}from"./constants-6aKcynAM.js";var d={"React/Vue 기반 UI 컴포넌트 개발, 스타일링":`frontend`,"API 서버, DB 스키마, 비즈니스 로직 구현":`backend`,"프론트엔드와 백엔드 모두 담당":`frontend`,"CI/CD, Docker, 인프라 자동화":`backend`,"테스트 작성, 버그 재현, 품질 관리":`custom`,"데이터 파이프라인, ETL, 분석 쿼리":`data`,"API 문서화, README, 가이드 작성":`docs`,"UI/UX 구현, CSS, 컴포넌트 개발":`frontend`,"API, DB, 서버 로직 구현":`backend`,"데이터 파이프라인, 분석, ML":`data`,"문서화, README, API docs":`docs`,"UI/UX, CSS, components":`frontend`,"API, DB, server logic":`backend`,"Data pipeline, analysis, ML":`data`,"Documentation, README, API docs":`docs`},f={1:`#60a5fa`,2:`#a78bfa`,3:`#34d399`,4:`#fbbf24`,5:`#f472b6`};async function p(){e.employees=await r(`/api/employees`)||[],m()}function m(){let t=document.getElementById(`employeesList`);if(!t)return;let n=e.employees;if(n.length===0){t.innerHTML=`<div style="color:var(--text-dim);font-size:11px;padding:4px 0">${i(`emp.addPrompt`)}</div>`;return}let r=l();t.innerHTML=n.map(e=>{let t=e.source===`static`,n=u[e.cli]||[],l=d[e.role||``],p=l?c.find(e=>e.value===l):c.find(t=>t.prompt===e.role),m=p?p.value:e.role?`custom`:`frontend`,h=m===`custom`,g=s(e.id),_=g?.phase||e.phase,v=g?.phaseLabel||e.phaseLabel,y=_?`<span style="background:${f[_]||`#888`};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${a(v||`P`+_)}</span>`:``,b=t?`<span style="background:#3b3b4f;color:#a78bfa;padding:1px 6px;border-radius:9px;font-size:9px;letter-spacing:0.3px">BUILT-IN</span>`:``,x=t?`border-left:2px solid #a78bfa;`:``,S=t?`<span style="flex:1;color:var(--text);font-size:12px;font-weight:600">${a(e.name||`Agent`)}</span>`:`<input style="flex:1;background:none;border:none;color:var(--text);font-size:12px;font-weight:600;font-family:inherit;outline:none" value="${a(e.name||`Agent`)}" data-emp-name="${a(e.id)}">`,C=t?``:`<button style="background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px" data-emp-delete="${a(e.id)}" title="${i(`emp.delete`)}">${o.close}</button>`,w=t?`<select disabled title="CLI fixed for built-in employee"><option>${a(e.cli)}</option></select>`:`<select data-emp-cli="${a(e.id)}">${r.map(t=>`<option${e.cli===t?` selected`:``}>${a(t)}</option>`).join(``)}</select>`,T=t?`<div style="font-size:11px;color:var(--text-dim);padding:4px 0">${a(e.role||``)}</div>`:`<select data-emp-role="${a(e.id)}">${c.map(e=>`<option value="${e.value}"${m===e.value?` selected`:``}>${e.label}</option>`).join(``)}</select>
2
- <textarea data-emp-custom="${a(e.id)}" style="display:${h?`block`:`none`};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical" placeholder="${i(`emp.customRole`)}">${h?a(e.role||``):``}</textarea>`;return`
3
- <div class="settings-group" style="margin-bottom:8px;padding:8px 10px;${x}">
4
- <div style="display:flex;align-items:center;gap:6px;margin-bottom:6px">
5
- <span style="width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0"></span>
6
- ${S}
7
- ${b}
8
- ${C}
9
- </div>
10
- <div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-bottom:4px">
11
- <div>
12
- <label>CLI</label>
13
- ${w}
14
- </div>
15
- <div>
16
- <label>Model</label>
17
- <select data-emp-model="${a(e.id)}">
18
- <option value="default"${!e.model||e.model===`default`?` selected`:``}>default</option>
19
- ${n.map(t=>`<option${e.model===t?` selected`:``}>${a(t)}</option>`).join(``)}
20
- ${e.model&&e.model!==`default`&&!n.includes(e.model)?`<option selected>${a(e.model)}</option>`:``}
21
- <option value="__custom__">${i(`emp.customModel`)}</option>
22
- </select>
23
- </div>
24
- </div>
25
- <div>
26
- <label>Role</label>
27
- ${T}
28
- </div>
29
- <div style="margin-top:4px;font-size:10px;display:flex;align-items:center;gap:6px">
30
- <span style="color:${e.status===`running`?`#fbbf24`:`var(--green)`}"><span style="display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor;vertical-align:middle;margin-right:4px"></span>${a(e.status||`idle`)}</span>
31
- ${y}
32
- </div>
33
- </div>`}).join(``)}async function h(){await n(`/api/employees`,`POST`,{})}async function g(e,t){await n(`/api/employees/${e}`,`PUT`,t)}async function _(e){t(`/api/employees/${e}`,`DELETE`)}function v(e,t){let n=u[t]||[],r=document.querySelector(`[data-emp-model="${e}"]`);r&&(r.innerHTML=`<option value="default" selected>default</option>`+n.map(e=>`<option>${a(e)}</option>`).join(``)+`<option value="__custom__">${i(`emp.customModel`)}</option>`),g(e,{cli:t,model:t===`claude`?`sonnet`:`default`})}function y(e,t){let n=c.find(e=>e.value===t),r=document.querySelector(`[data-emp-custom="${e}"]`);r&&(t===`custom`?(r.style.display=`block`,r.focus()):(r.style.display=`none`,r.value=``,g(e,{role:n?.prompt||``})))}export{h as addEmployee,_ as deleteEmployee,p as loadEmployees,v as onEmpCliChange,y as onEmpRoleChange,m as renderEmployees,g as updateEmployee};
@@ -1 +0,0 @@
1
- import{a as e}from"./memory-D4gfTYaH.js";export{e as refreshMemorySidebar};
@@ -1 +0,0 @@
1
- import{b as e,m as t,v as n}from"./settings-B6F624Rg.js";export{t as loadSettings,n as savePerCli,e as updateSettings};
@@ -1 +0,0 @@
1
- import{n as e}from"./skills-BPoCOTKl.js";export{e as loadSkills};
@@ -1 +0,0 @@
1
- import{a as e}from"./slash-commands-AE7_8-VM.js";export{e as loadCommands};
@@ -1 +0,0 @@
1
- import{a as e,g as t,u as n}from"./ui-uLQlj-KP.js";export{e as cleanupToolActivity,n as loadMessages,t as updateQueueBadge};