zigrix 0.1.0-alpha.13 → 0.1.0-alpha.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/.next/BUILD_ID +1 -1
- package/dist/dashboard/.next/app-build-manifest.json +14 -14
- package/dist/dashboard/.next/app-path-routes-manifest.json +3 -3
- package/dist/dashboard/.next/build-manifest.json +2 -2
- package/dist/dashboard/.next/prerender-manifest.json +10 -10
- package/dist/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/_not-found.html +1 -1
- package/dist/dashboard/.next/server/app/_not-found.rsc +1 -1
- package/dist/dashboard/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/auth/setup/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/overview/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/stream/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/tasks/[taskId]/conversation/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/login.html +1 -1
- package/dist/dashboard/.next/server/app/login.rsc +1 -1
- package/dist/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/setup/page_client-reference-manifest.js +1 -1
- package/dist/dashboard/.next/server/app/setup.html +1 -1
- package/dist/dashboard/.next/server/app/setup.rsc +1 -1
- package/dist/dashboard/.next/server/app-paths-manifest.json +3 -3
- package/dist/dashboard/.next/server/chunks/972.js +1 -1
- package/dist/dashboard/.next/server/functions-config-manifest.json +5 -5
- package/dist/dashboard/.next/server/pages/404.html +1 -1
- package/dist/dashboard/.next/server/pages/500.html +1 -1
- package/dist/orchestration/worker.js +13 -3
- package/package.json +1 -1
- package/rules/defaults/pro-zig.md +23 -2
- package/rules/defaults/worker-common.md +1 -0
- /package/dist/dashboard/.next/static/{9ckiWP7qiX6CJ0iNYkChZ → gl9FuUQE7dOSS5c3ZdHG0}/_buildManifest.js +0 -0
- /package/dist/dashboard/.next/static/{9ckiWP7qiX6CJ0iNYkChZ → gl9FuUQE7dOSS5c3ZdHG0}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=972,exports.ids=[972],exports.modules={48383:(a,b,c)=>{c.d(b,{HB:()=>A});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(48161),i=c.n(h);g().join(i().homedir(),".openclaw","agents");let j=g().join(i().homedir(),".openclaw","subagents","runs.json");g().join(i().homedir(),".openclaw","openclaw.json");let k="http://127.0.0.1:18789";function l(a){try{return e().readFileSync(a,"utf-8")}catch{return""}}function m(a,b={}){try{let c=e().readFileSync(a,"utf-8"),d=JSON.parse(c);return p(d)?d:b}catch{return b}}function n(a){let b=l(a);if(!b.trim())return[];let c=[];for(let a of b.split(/\r?\n/))if(a.trim())try{let b=JSON.parse(a);p(b)&&c.push(function(a){let b=q(a.ts)??function(a){if("number"==typeof a&&Number.isFinite(a))return new Date(a).toISOString();if("string"==typeof a){let b=a.trim();if(!b)return null;let c=Number(b);if(Number.isFinite(c))return new Date(c).toISOString();let d=Date.parse(b);if(Number.isFinite(d))return new Date(d).toISOString()}return null}(a.timestamp)??void 0,c=q(a.event)??q(a.action)??void 0,d=q(a.sessionKey)??q(a.session_key)??q(a.childSessionKey)??void 0,e=q(a.runId)??q(a.run_id)??void 0;return{...a,ts:b,event:c,sessionKey:d,runId:e}}(b))}catch{}return c}function o(a){return a.map((a,b)=>({row:a,idx:b})).sort((a,b)=>{let c=Date.parse(a.row.ts||""),d=Date.parse(b.row.ts||""),e=(isNaN(d)?0:d)-(isNaN(c)?0:c);return 0!==e?e:b.idx-a.idx}).map(a=>a.row)}function p(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function q(a){if("string"!=typeof a)return null;let b=a.trim();return b.length>0?b:null}function r(a){let b=String(a.event||a.action||"");return"task_created"===b?"OPEN":"task_started"===b?"IN_PROGRESS":"reported"===b?"REPORTED":"blocked"===b?"BLOCKED":"evidence_merged"===b&&"DONE_PENDING_REPORT"===String(a.status||"").toUpperCase()?"DONE_PENDING_REPORT":null}function s(a){for(let b of o(a)){let a=r(b);if(a)return a;if(["worker_dispatched","worker_started","worker_done","worker_skipped","evidence_collected"].includes(String(b.event||b.action||"")))continue;let c=q(b.status);if(c)return c}return null}function t(a,b,c){let d=q(m(g().join(c,`${a}.meta.json`),{}).status);return d||s(b.filter(b=>b.taskId===a))}function u(a,b,c){let d=b.filter(b=>b.taskId===a),e=null,f=null,g=null;for(let a=0;a<d.length;a++){let b=d[a],c=String(b.ts||""),h=String(e?.ts||"");(!e||c>h||c===h&&a>=e.__idx)&&(e={...b,__idx:a}),"string"==typeof b.scale&&b.scale&&(f=b.scale),"string"==typeof b.title&&b.title&&(g=b.title),!f&&p(b.payload)&&"string"==typeof b.payload.scale&&(f=b.payload.scale),!g&&p(b.payload)&&"string"==typeof b.payload.title&&(g=b.payload.title)}let h=d.map((a,b)=>b);h.sort((a,b)=>{let c=String(d[b].ts||"").localeCompare(String(d[a].ts||""));return 0!==c?c:b-a});let i=h.map(a=>d[a]);return{taskId:a,status:t(a,b,c),scale:f||e?.scale||null,title:g||e?.title||null,updatedAt:e?.ts||null,latestEvent:e?.event||null,events:i.slice(0,50)}}function v(a){let b=a.match(/^agent:([^:]+):/);return b?.[1]||null}function w(a){let b=a.match(/^agent:([^:]+):subagent:([^:\s]+)$/);return b?{agentId:b[1],sessionId:b[2]}:null}function x(a,b,c,d,f,h){let i=b.filter(b=>b.taskId===a),j=function(a,b){let c=m(g().join(b,`${a}.meta.json`),{}),d=new Set,e=new Map,f=new Map,h=(a,b,c)=>{let g=q(a);if(!g)return;d.add(g);let h=v(g),i=b||h;i&&e.set(g,i),c&&f.set(g,c)};if(h(c.orchestratorSessionKey,"pro-zig",q(c.orchestratorSessionId)),p(c.workerSessions))for(let[a,b]of Object.entries(c.workerSessions))p(b)&&h(b.sessionKey,a,q(b.sessionId));return{sessionKeys:d,sessionToAgent:e,metaSessionIdMap:f}}(a,c),k=function(a,b){let c=g().join(b,a),d=new Set,f=new Map;if(!e().existsSync(c))return{sessionKeys:d,sessionToAgent:f};for(let a of e().readdirSync(c).filter(a=>a.endsWith(".json"))){if("_merged.json"===a)continue;let b=m(g().join(c,a),{}),e=q(b.sessionKey),h=q(b.agentId)||a.replace(/\.json$/,"");e&&(d.add(e),h&&f.set(e,h))}return{sessionKeys:d,sessionToAgent:f}}(a,d),l=new Set([...Array.from(j.sessionKeys),...Array.from(k.sessionKeys)]),n=new Map([...Array.from(j.sessionToAgent.entries()),...Array.from(k.sessionToAgent.entries())]),o=(a,b)=>{l.add(a);let c=v(a),d=b||c;d&&n.set(a,d)};for(let a of function(a,b){let c=new Set;for(let d of a)for(let a of b){let b=q(d[a]);b&&c.add(b)}return Array.from(c)}(i,["sessionKey","session_key","parentSessionKey","parent_session_key"]))o(a);for(let a of i.filter(a=>["worker_dispatched","worker_done"].includes(String(a.event||a.action||"")))){let b=q(a.targetAgent)||q(a.agentId)||q(a.actor),c=q(a.sessionKey)||q(a.session_key)||q(a.childSessionKey);c&&o(c,b)}let r=function(a,b,c){if(0===c.length)return new Map;let d=new Set(c),f=new Map;for(let c of b)try{let b=g().join(a,c,"sessions","sessions.json"),h=e().readFileSync(b,"utf-8"),i=JSON.parse(h);if(!p(i))continue;for(let[a,b]of Object.entries(i)){if(!d.has(a)||!p(b))continue;let c=q(b.sessionId);c&&f.set(a,c)}}catch{}return f}(f,h,Array.from(l));return j.metaSessionIdMap.forEach((a,b)=>{r.has(b)||r.set(b,a)}),{sessionKeys:Array.from(l),sessionToAgent:n,sessionIdMap:r}}function y(a,b,c){let d=g().join(a,b,"sessions");if(!e().existsSync(d))return null;let f=g().join(d,`${c}.jsonl`);if(e().existsSync(f))return{filePath:f,source:"active"};let h=`${c}.jsonl.deleted.`,i=e().readdirSync(d).filter(a=>a.startsWith(h)).sort((a,b)=>b.localeCompare(a));return 0===i.length?null:{filePath:g().join(d,i[0]),source:"deleted"}}function z(a){let b=a.timestamp;if("number"==typeof b&&Number.isFinite(b))return b;if("string"==typeof b){let a=Number(b);if(Number.isFinite(a))return a;let c=Date.parse(b);if(Number.isFinite(c))return c}let c=a.ts;if("string"==typeof c){let a=Date.parse(c);if(Number.isFinite(a))return a}return null}function A(a){let b=a?.zigrixHome||process.env.ZIGRIX_HOME||g().join(i().homedir(),".zigrix"),c=function(a){let b=g().join(a,"zigrix.config.json");try{if(!e().existsSync(b))return null;let a=e().readFileSync(b,"utf-8"),c=JSON.parse(a);if(!p(c))return null;let d=c.openclaw;if(!p(d))return null;return{home:"string"==typeof d.home&&d.home?d.home:"",binPath:"string"==typeof d.binPath&&d.binPath?d.binPath:null,gatewayUrl:"string"==typeof d.gatewayUrl&&d.gatewayUrl?d.gatewayUrl:k}}catch{return null}}(b),d=c?.home||process.env.OPENCLAW_HOME||g().join(i().homedir(),".openclaw"),f=a?.agentsStateDir||process.env.OPENCLAW_AGENTS_DIR||g().join(d,"agents"),h={zigrixHome:b,indexPath:g().join(b,"index.json"),eventsPath:g().join(b,"tasks.jsonl"),specsDir:g().join(b,"tasks"),evidenceDir:g().join(b,"evidence"),agentsStateDir:f,subagentRunsPath:a?.subagentRunsPath||process.env.OPENCLAW_SUBAGENT_RUNS_PATH||j,openclawConfigPath:a?.openclawConfigPath||process.env.OPENCLAW_CONFIG_PATH||g().join(d,"openclaw.json"),openclawBinPath:c?.binPath||null},A=a?.gatewayUrl||process.env.OPENCLAW_GATEWAY_URL||c?.gatewayUrl||k,B=a?.invokeTool||function(a){let b=a?.gatewayUrl||process.env.OPENCLAW_GATEWAY_URL||k,c=a?.gatewayToken||process.env.OPENCLAW_GATEWAY_TOKEN||null,d=a?.fetchImpl||fetch,e=`${b.replace(/\/+$/,"")}/tools/invoke`;return async(a,b)=>{let f={"Content-Type":"application/json"};c&&(f.Authorization=`Bearer ${c}`);let g=await d(e,{method:"POST",headers:f,body:JSON.stringify({tool:a,args:b})}),h=await g.text(),i=null;if(h.trim())try{i=JSON.parse(h)}catch{i=null}if(!g.ok){let a=p(i)&&p(i.error)&&"string"==typeof i.error.message?i.error.message:h.slice(0,500)||`HTTP ${g.status}`;throw Error(`gateway_invoke_failed(${g.status}): ${a}`)}if(!p(i)||!0!==i.ok)throw Error("gateway_invoke_failed: invalid_response");return i.result}}({gatewayUrl:A,gatewayToken:a?.gatewayToken,fetchImpl:a?.fetchImpl}),C=function(a,b){let c=Number.parseInt(String(a??""),10);return!Number.isFinite(c)||c<=0?200:c}(a?.sessionsHistoryLimit??process.env.SESSIONS_HISTORY_LIMIT,0);function D(){let a=m(g().join(b,"zigrix.config.json"),{}).agents;return Array.isArray(a)?a.map(a=>"string"==typeof a?a:p(a)?q(a.id)||q(a.agentId):null).filter(a=>!!a):p(a)?Object.keys(a):[]}async function E(a){var b;let c=n(h.eventsPath),d=D(),e=x(a,c,h.specsDir,h.evidenceDir,h.agentsStateDir,d),f=e.sessionKeys,g=o(c).filter(b=>b.taskId===a).slice(0,50).map(a=>({ts:a.ts||null,event:a.event||a.action||null,status:a.status||null,actor:a.actor||a.agentId||null,targetAgent:q(a.targetAgent)||q(a.agentId),runId:q(a.runId),sessionKey:q(a.sessionKey)})),i=!0,j=await Promise.all(f.map(async a=>{let b=null;try{let b=await B("sessions_history",{sessionKey:a,limit:C,includeTools:!0}),c=p(b)?b:{},d=p(c.details)?c.details:{},e=(Array.isArray(d.messages)?d.messages:Array.isArray(c.messages)?c.messages:[]).filter(a=>p(a));if(e.length>0||!w(a))return{sessionKey:a,ok:!0,messageCount:e.length,error:null,messages:e}}catch(a){b=String(a?.message||a),i=!1}try{let c=w(a);if(!c)return{sessionKey:a,ok:!b,messageCount:0,error:b,messages:[]};let d=e.sessionIdMap.get(a)??c.sessionId,f=y(h.agentsStateDir,c.agentId,d);if(f||d===c.sessionId||(f=y(h.agentsStateDir,c.agentId,c.sessionId)),!f)return{sessionKey:a,ok:!b,messageCount:0,error:b,messages:[]};let g=function(a){let b=l(a);if(!b.trim())return[];let c=[];for(let a of b.split(/\r?\n/))if(a.trim())try{let b=JSON.parse(a);if(!p(b)||"message"!==b.type)continue;let d=p(b.message)?b.message:b;c.push({id:q(b.id),parentId:q(b.parentId),role:q(d.role),content:d.content,timestamp:z(b)??q(b.ts)})}catch{}return c}(f.filePath);return i=!0,{sessionKey:a,ok:!0,messageCount:g.length,error:null,messages:g}}catch(c){return{sessionKey:a,ok:!1,messageCount:0,error:b||String(c?.message||c),messages:[]}}})),k=(b=e.sessionToAgent,j.flatMap(({sessionKey:a,messages:c},d)=>c.filter(b=>!function(a,b){var c;if("pro-zig"!==v(a))return!1;let d=q(b.role),e=("string"==typeof(c=b.content)?c:!Array.isArray(c)?"":c.map(a=>a&&"object"==typeof a?"string"==typeof a.text?a.text:"string"==typeof a.thinking?a.thinking:"":"").filter(Boolean).join("\n")).trim();if(!e)return!1;if("assistant"===d&&"NO_REPLY"===e)return!0;if("user"!==d)return!1;let f=e.toLowerCase();return f.includes("internal task completion event")&&f.includes("source: subagent")}(a,b)).map((c,e)=>{let f=z(c),g=f?new Date(f).toISOString():q(c.ts),h=b.get(a)||v(a)||"unknown";return{__sortTs:f??Number.MAX_SAFE_INTEGER,__sessionIdx:d,__sortIdx:e,row:{sessionKey:a,agentId:h,agentName:h,role:q(c.role),timestamp:f,ts:g,toolName:q(c.toolName),toolCallId:q(c.toolCallId),isError:!!c.isError,content:c.content,raw:c}}})).sort((a,b)=>{let c=a.__sortTs-b.__sortTs;if(0!==c)return c;let d=a.__sessionIdx-b.__sessionIdx;return 0!==d?d:a.__sortIdx-b.__sortIdx}).map(a=>a.row)),m=j.map(a=>({sessionKey:a.sessionKey,ok:a.ok,messageCount:a.messageCount,error:a.error}));return{generatedAt:new Date().toISOString(),taskId:a,sessionKeys:f,stream:k,recentEvents:g,sessions:m,openclawAvailable:i}}async function F(a){let b=n(h.eventsPath),c=s(b.filter(b=>String(b.taskId||"")===a));if("IN_PROGRESS"!==c&&"OPEN"!==c)throw function(a,b){let c=Error(b);return c.code=a,c}("task_not_cancellable",`task_not_cancellable(taskId=${a}, status=${String(c||"unknown")})`);let d=D(),{sessionKeys:f}=x(a,b,h.specsDir,h.evidenceDir,h.agentsStateDir,d),g=[];for(let a of f){try{await B("subagents",{action:"kill",target:a})}catch{}g.push(a)}let i={ts:new Date().toISOString(),event:"blocked",taskId:a,phase:"execution",status:"BLOCKED",actor:"manual",payload:{reason:"user_cancelled",killedSessions:g}};return e().appendFileSync(h.eventsPath,JSON.stringify(i)+"\n","utf-8"),{ok:!0,killedSessions:g}}return{paths:h,loadOverview:function(){let a=function(a={}){let b=p(a.statusBuckets)?a.statusBuckets:{},c={OPEN:[],IN_PROGRESS:[],BLOCKED:[],DONE_PENDING_REPORT:[],REPORTED:[]};for(let[a,d]of Object.entries(b))c[a]=Array.isArray(d)?d:[];return{updatedAt:"string"==typeof a.updatedAt?a.updatedAt:null,statusBuckets:c,activeTasks:p(a.activeTasks)?a.activeTasks:{},recentEvents:Array.isArray(a.recentEvents)?a.recentEvents:[]}}(m(h.indexPath,{})),b=n(h.eventsPath);D();let c=Object.fromEntries(Object.entries(a.statusBuckets).map(([a,b])=>[a,Array.isArray(b)?b.length:0])),d=Object.entries(a.activeTasks).map(([a,c])=>{let d=p(c)?c:{},e=u(a,b,h.specsDir);return{taskId:a,status:"string"==typeof d.status?d.status:e.status,updatedAt:"string"==typeof d.updatedAt?d.updatedAt:e.updatedAt,scale:e.scale,title:e.title}}),e=o(b).slice(0,30).map(a=>({ts:a.ts,event:a.event||a.action,taskId:a.taskId,status:a.status,actor:a.actor||a.agentId,agentId:a.agentId,targetAgent:a.targetAgent||a.agentId,title:a.title})),f=function(a,b){let c=new Map,d=o(a);for(let e of d){let f=e.taskId;!f||c.has(f)||(d.find(a=>a.taskId===f&&!!r(a)),c.set(f,{taskId:f,ts:e.ts||null,event:e.event||e.action||null,status:t(f,a,b),scale:e.scale||null,actor:e.actor||e.agentId||null}))}return Array.from(c.values())}(b,h.specsDir);return{generatedAt:new Date().toISOString(),...{},updatedAt:a.updatedAt,bucketCounts:c,statusBuckets:a.statusBuckets,activeTasks:d.sort((a,b)=>String(b.updatedAt||"").localeCompare(String(a.updatedAt||""))),recentEvents:e,taskHistory:f,openclawAvailable:!0}},loadTaskDetail:function(a){let b=u(a,n(h.eventsPath),h.specsDir),c=function(a,b){let c=g().join(b,`${a}.md`),d=l(c),e=m(g().join(b,`${a}.meta.json`),{}),f=d?d.split(/\r?\n/):[],h={};for(let[a,b]of[["taskId",e.taskId],["title",e.title],["scale",e.scale],["requestedBy",e.requestedBy],["createdAt",e.createdAt],["projectKey",e.projectKey],["projectDir",e.projectDir],["projectPath",e.projectPath]]){let c=q(b);c&&(h[a]=c)}let i=0;for(let a of f){let b=a.match(/^(`{3,})/);if(b){0===i?i=b[1].length:b[1].length>=i&&(i=0);continue}if(i>0)continue;let c=a.match(/^-\s+([^:]+):\s*(.+)$/);if(!c)continue;let d=c[1].trim();d in h||(h[d]=c[2].trim())}let j=f.find(a=>a.trim().startsWith("- Next Action:")),k=f.find(a=>a.trim().startsWith("- Resume Hint")),n=q(e.nextAction),o=q(e.resumeHint);return{exists:!!d||Object.keys(h).length>0||!!n||!!o,path:c,metadata:h,nextAction:n||(j?j.split(":").slice(1).join(":").trim():null),resumeHint:o||(k?k.split(":").slice(1).join(":").trim():null),preview:d?f.slice(0,80).join("\n"):void 0}}(a,h.specsDir),d=function(a,b){let c=g().join(b,`${a}.meta.json`),d=m(c,{});return{exists:e().existsSync(c),path:c,data:d}}(a,h.specsDir),f=function(a,b){let c=g().join(b,a);if(!e().existsSync(c))return{exists:!1,path:c,agents:[],merged:null};let d=e().readdirSync(c).filter(a=>a.endsWith(".json")),f=[],h=null;for(let a of d){let b=g().join(c,a),d=m(b,{});if("_merged.json"===a){h={...d,path:b};continue}f.push({file:a,path:b,agentId:"string"==typeof d.agentId?d.agentId:a.replace(/\.json$/,""),runId:"string"==typeof d.runId?d.runId:null,sessionKey:"string"==typeof d.sessionKey?d.sessionKey:null,sessionId:"string"==typeof d.sessionId?d.sessionId:null,ts:"string"==typeof d.ts?d.ts:null})}return{exists:!0,path:c,agents:f.sort((a,b)=>String(b.ts||"").localeCompare(String(a.ts||""))),merged:h}}(a,h.evidenceDir);return{generatedAt:new Date().toISOString(),task:b,spec:c,meta:d,evidence:f}},loadTaskConversation:E,cancelTask:F,getTaskSessionFilePaths:function(a){let b=n(h.eventsPath),c=D(),{sessionKeys:d,sessionIdMap:e}=x(a,b,h.specsDir,h.evidenceDir,h.agentsStateDir,c);return d.map(a=>{let b=w(a);if(!b)return null;let c=e.get(a)??b.sessionId;return g().join(h.agentsStateDir,b.agentId,"sessions",`${c}.jsonl`)}).filter(a=>null!==a)}}}},67360:(a,b,c)=>{c.d(b,{BE:()=>w,IX:()=>n,TI:()=>t,dV:()=>u,gV:()=>A,gw:()=>o,jw:()=>z,xC:()=>v});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(48161),i=c.n(h),j=c(77598),k=c.n(j),l=c(74729),m=c.n(l);let n="zigrix_session",o=43200,p=new TextEncoder,q=new TextDecoder;function r(){return process.env.ZIGRIX_HOME||g().join(i().homedir(),".zigrix")}function s(){return g().join(r(),"dashboard.json")}function t(){let a=s();try{let b=e().readFileSync(a,"utf-8"),c=JSON.parse(b);if(!c||"object"!=typeof c||Array.isArray(c))return{admins:[],sessionSecret:"",corsOrigins:[],createdAt:""};return{admins:Array.isArray(c.admins)?c.admins:[],sessionSecret:"string"==typeof c.sessionSecret?c.sessionSecret:"",corsOrigins:Array.isArray(c.corsOrigins)?c.corsOrigins:[],createdAt:"string"==typeof c.createdAt?c.createdAt:""}}catch{return{admins:[],sessionSecret:"",corsOrigins:[],createdAt:""}}}function u(){return 0===t().admins.length}async function v(a,b){let c={admins:[{username:a,passwordHash:await m().hash(b,12)}],sessionSecret:k().randomBytes(64).toString("hex"),corsOrigins:["http://localhost:3000"],createdAt:new Date().toISOString()},d=s(),f=r();e().existsSync(f)||e().mkdirSync(f,{recursive:!0}),e().writeFileSync(d,JSON.stringify(c,null,2),{encoding:"utf-8",mode:384});try{e().chmodSync(d,384)}catch{}}async function w(a,b){let c=t().admins.find(b=>b.username===a);if(!c)return await m().hash(b,12),!1;if(!await m().compare(b,c.passwordHash))return!1;let d=p.encode(a),e=p.encode(c.username);return d.length===e.length&&k().timingSafeEqual(d,e)}function x(a){return Buffer.from(a).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function y(a,b){let c=await k().subtle.importKey("raw",p.encode(b),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return x(new Uint8Array(await k().subtle.sign("HMAC",c,p.encode(a))))}async function z(a){let b=t().sessionSecret;if(!b)throw Error("Session secret not configured. Run setup first.");let c=Math.floor(Date.now()/1e3),d=x(p.encode(JSON.stringify({sub:a,iat:c,exp:c+o}))),e=await y(d,b);return`${d}.${e}`}async function A(a){let b;if(!a)return null;let c=a.split(".");if(2!==c.length)return null;let[d,e]=c;if(!d||!e)return null;let f=t().sessionSecret;if(!f||!function(a,b){if(a.length!==b.length)return!1;let c=p.encode(a),d=p.encode(b);return k().timingSafeEqual(c,d)}(await y(d,f),e))return null;try{let a=q.decode(function(a){let b=a.replace(/-/g,"+").replace(/_/g,"/"),c=b.padEnd(4*Math.ceil(b.length/4),"=");return new Uint8Array(Buffer.from(c,"base64"))}(d));b=JSON.parse(a)}catch{return null}if("number"!=typeof b.exp||"number"!=typeof b.iat)return null;let g=Math.floor(Date.now()/1e3);return b.exp<=g||b.iat>g+60?null:{username:"string"==typeof b.sub?b.sub:"",issuedAt:b.iat,expiresAt:b.exp}}}};
|
|
1
|
+
"use strict";exports.id=972,exports.ids=[972],exports.modules={48383:(a,b,c)=>{c.d(b,{HB:()=>A});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(48161),i=c.n(h);g().join(i().homedir(),".openclaw","agents");let j=g().join(i().homedir(),".openclaw","subagents","runs.json");g().join(i().homedir(),".openclaw","openclaw.json");let k="http://127.0.0.1:18789";function l(a){try{return e().readFileSync(a,"utf-8")}catch{return""}}function m(a,b={}){try{let c=e().readFileSync(a,"utf-8"),d=JSON.parse(c);return p(d)?d:b}catch{return b}}function n(a){let b=l(a);if(!b.trim())return[];let c=[];for(let a of b.split(/\r?\n/))if(a.trim())try{let b=JSON.parse(a);p(b)&&c.push(function(a){let b=q(a.ts)??function(a){if("number"==typeof a&&Number.isFinite(a))return new Date(a).toISOString();if("string"==typeof a){let b=a.trim();if(!b)return null;let c=Number(b);if(Number.isFinite(c))return new Date(c).toISOString();let d=Date.parse(b);if(Number.isFinite(d))return new Date(d).toISOString()}return null}(a.timestamp)??void 0,c=q(a.event)??q(a.action)??void 0,d=q(a.sessionKey)??q(a.session_key)??q(a.childSessionKey)??void 0,e=q(a.runId)??q(a.run_id)??void 0;return{...a,ts:b,event:c,sessionKey:d,runId:e}}(b))}catch{}return c}function o(a){return a.map((a,b)=>({row:a,idx:b})).sort((a,b)=>{let c=Date.parse(a.row.ts||""),d=Date.parse(b.row.ts||""),e=(isNaN(d)?0:d)-(isNaN(c)?0:c);return 0!==e?e:b.idx-a.idx}).map(a=>a.row)}function p(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function q(a){if("string"!=typeof a)return null;let b=a.trim();return b.length>0?b:null}function r(a){let b=String(a.event||a.action||"");return"task_created"===b?"OPEN":"task_started"===b?"IN_PROGRESS":"reported"===b?"REPORTED":"blocked"===b?"BLOCKED":"evidence_merged"===b&&"DONE_PENDING_REPORT"===String(a.status||"").toUpperCase()?"DONE_PENDING_REPORT":null}function s(a){for(let b of o(a)){let a=r(b);if(a)return a;if(["worker_dispatched","worker_started","worker_done","worker_skipped","evidence_collected"].includes(String(b.event||b.action||"")))continue;let c=q(b.status);if(c)return c}return null}function t(a,b,c){let d=q(m(g().join(c,`${a}.meta.json`),{}).status);return d||s(b.filter(b=>b.taskId===a))}function u(a,b,c){let d=b.filter(b=>b.taskId===a),e=null,f=null,g=null;for(let a=0;a<d.length;a++){let b=d[a],c=String(b.ts||""),h=String(e?.ts||"");(!e||c>h||c===h&&a>=e.__idx)&&(e={...b,__idx:a}),"string"==typeof b.scale&&b.scale&&(f=b.scale),"string"==typeof b.title&&b.title&&(g=b.title),!f&&p(b.payload)&&"string"==typeof b.payload.scale&&(f=b.payload.scale),!g&&p(b.payload)&&"string"==typeof b.payload.title&&(g=b.payload.title)}let h=d.map((a,b)=>b);h.sort((a,b)=>{let c=String(d[b].ts||"").localeCompare(String(d[a].ts||""));return 0!==c?c:b-a});let i=h.map(a=>d[a]);return{taskId:a,status:t(a,b,c),scale:f||e?.scale||null,title:g||e?.title||null,updatedAt:e?.ts||null,latestEvent:e?.event||null,events:i.slice(0,50)}}function v(a){let b=a.match(/^agent:([^:]+):/);return b?.[1]||null}function w(a){let b=a.match(/^agent:([^:]+):subagent:([^:\s]+)$/);return b?{agentId:b[1],sessionId:b[2]}:null}function x(a,b,c,d,f,h){let i=b.filter(b=>b.taskId===a),j=function(a,b){let c=m(g().join(b,`${a}.meta.json`),{}),d=new Set,e=new Map,f=new Map,h=(a,b,c)=>{let g=q(a);if(!g)return;d.add(g);let h=v(g),i=b||h;i&&e.set(g,i),c&&f.set(g,c)};if(h(c.orchestratorSessionKey,"pro-zig",q(c.orchestratorSessionId)),p(c.workerSessions))for(let[a,b]of Object.entries(c.workerSessions))p(b)&&h(b.sessionKey,a,q(b.sessionId));return{sessionKeys:d,sessionToAgent:e,metaSessionIdMap:f}}(a,c),k=function(a,b){let c=g().join(b,a),d=new Set,f=new Map;if(!e().existsSync(c))return{sessionKeys:d,sessionToAgent:f};for(let a of e().readdirSync(c).filter(a=>a.endsWith(".json"))){if("_merged.json"===a)continue;let b=m(g().join(c,a),{}),e=q(b.sessionKey),h=q(b.agentId)||a.replace(/\.json$/,"");e&&(d.add(e),h&&f.set(e,h))}return{sessionKeys:d,sessionToAgent:f}}(a,d),l=new Set([...Array.from(j.sessionKeys),...Array.from(k.sessionKeys)]),n=new Map([...Array.from(j.sessionToAgent.entries()),...Array.from(k.sessionToAgent.entries())]),o=(a,b)=>{l.add(a);let c=v(a),d=b||c;d&&n.set(a,d)};for(let a of function(a,b){let c=new Set;for(let d of a)for(let a of b){let b=q(d[a]);b&&c.add(b)}return Array.from(c)}(i,["sessionKey","session_key","parentSessionKey","parent_session_key"]))o(a);for(let a of i.filter(a=>["worker_dispatched","worker_done"].includes(String(a.event||a.action||"")))){let b=q(a.targetAgent)||q(a.agentId)||q(a.actor),c=q(a.sessionKey)||q(a.session_key)||q(a.childSessionKey);c&&o(c,b)}let r=function(a,b,c){if(0===c.length)return new Map;let d=new Set(c),f=new Map;for(let c of b)try{let b=g().join(a,c,"sessions","sessions.json"),h=e().readFileSync(b,"utf-8"),i=JSON.parse(h);if(!p(i))continue;for(let[a,b]of Object.entries(i)){if(!d.has(a)||!p(b))continue;let c=q(b.sessionId);c&&f.set(a,c)}}catch{}let h=c.filter(a=>!f.has(a));if(h.length>0)for(let b of h){let c=w(b);if(!c)continue;let d=c.sessionId,h=g().join(a,c.agentId,"sessions");try{if(!e().existsSync(h))continue;let a=`${d}.jsonl`;(e().existsSync(g().join(h,a))||e().readdirSync(h).some(b=>b.startsWith(`${a}.deleted.`)))&&f.set(b,d)}catch{}}return f}(f,h,Array.from(l));return j.metaSessionIdMap.forEach((a,b)=>{r.has(b)||r.set(b,a)}),{sessionKeys:Array.from(l),sessionToAgent:n,sessionIdMap:r}}function y(a,b,c){let d=g().join(a,b,"sessions");if(!e().existsSync(d))return null;let f=g().join(d,`${c}.jsonl`);if(e().existsSync(f))return{filePath:f,source:"active"};let h=`${c}.jsonl.deleted.`,i=e().readdirSync(d).filter(a=>a.startsWith(h)).sort((a,b)=>b.localeCompare(a));return 0===i.length?null:{filePath:g().join(d,i[0]),source:"deleted"}}function z(a){let b=a.timestamp;if("number"==typeof b&&Number.isFinite(b))return b;if("string"==typeof b){let a=Number(b);if(Number.isFinite(a))return a;let c=Date.parse(b);if(Number.isFinite(c))return c}let c=a.ts;if("string"==typeof c){let a=Date.parse(c);if(Number.isFinite(a))return a}return null}function A(a){let b=a?.zigrixHome||process.env.ZIGRIX_HOME||g().join(i().homedir(),".zigrix"),c=function(a){let b=g().join(a,"zigrix.config.json");try{if(!e().existsSync(b))return null;let a=e().readFileSync(b,"utf-8"),c=JSON.parse(a);if(!p(c))return null;let d=c.openclaw;if(!p(d))return null;return{home:"string"==typeof d.home&&d.home?d.home:"",binPath:"string"==typeof d.binPath&&d.binPath?d.binPath:null,gatewayUrl:"string"==typeof d.gatewayUrl&&d.gatewayUrl?d.gatewayUrl:k}}catch{return null}}(b),d=c?.home||process.env.OPENCLAW_HOME||g().join(i().homedir(),".openclaw"),f=a?.agentsStateDir||process.env.OPENCLAW_AGENTS_DIR||g().join(d,"agents"),h={zigrixHome:b,indexPath:g().join(b,"index.json"),eventsPath:g().join(b,"tasks.jsonl"),specsDir:g().join(b,"tasks"),evidenceDir:g().join(b,"evidence"),agentsStateDir:f,subagentRunsPath:a?.subagentRunsPath||process.env.OPENCLAW_SUBAGENT_RUNS_PATH||j,openclawConfigPath:a?.openclawConfigPath||process.env.OPENCLAW_CONFIG_PATH||g().join(d,"openclaw.json"),openclawBinPath:c?.binPath||null},A=a?.gatewayUrl||process.env.OPENCLAW_GATEWAY_URL||c?.gatewayUrl||k,B=a?.invokeTool||function(a){let b=a?.gatewayUrl||process.env.OPENCLAW_GATEWAY_URL||k,c=a?.gatewayToken||process.env.OPENCLAW_GATEWAY_TOKEN||null,d=a?.fetchImpl||fetch,e=`${b.replace(/\/+$/,"")}/tools/invoke`;return async(a,b)=>{let f={"Content-Type":"application/json"};c&&(f.Authorization=`Bearer ${c}`);let g=await d(e,{method:"POST",headers:f,body:JSON.stringify({tool:a,args:b})}),h=await g.text(),i=null;if(h.trim())try{i=JSON.parse(h)}catch{i=null}if(!g.ok){let a=p(i)&&p(i.error)&&"string"==typeof i.error.message?i.error.message:h.slice(0,500)||`HTTP ${g.status}`;throw Error(`gateway_invoke_failed(${g.status}): ${a}`)}if(!p(i)||!0!==i.ok)throw Error("gateway_invoke_failed: invalid_response");return i.result}}({gatewayUrl:A,gatewayToken:a?.gatewayToken,fetchImpl:a?.fetchImpl}),C=function(a,b){let c=Number.parseInt(String(a??""),10);return!Number.isFinite(c)||c<=0?200:c}(a?.sessionsHistoryLimit??process.env.SESSIONS_HISTORY_LIMIT,0);function D(){let a=m(g().join(b,"zigrix.config.json"),{}).agents;return Array.isArray(a)?a.map(a=>"string"==typeof a?a:p(a)?q(a.id)||q(a.agentId):null).filter(a=>!!a):p(a)?p(a.registry)?Object.keys(a.registry):Object.keys(a):[]}async function E(a){var b;let c=n(h.eventsPath),d=D(),e=x(a,c,h.specsDir,h.evidenceDir,h.agentsStateDir,d),f=e.sessionKeys,g=o(c).filter(b=>b.taskId===a).slice(0,50).map(a=>({ts:a.ts||null,event:a.event||a.action||null,status:a.status||null,actor:a.actor||a.agentId||null,targetAgent:q(a.targetAgent)||q(a.agentId),runId:q(a.runId),sessionKey:q(a.sessionKey)})),i=!0,j=await Promise.all(f.map(async a=>{let b=null;try{let b=await B("sessions_history",{sessionKey:a,limit:C,includeTools:!0}),c=p(b)?b:{},d=p(c.details)?c.details:{},e=(Array.isArray(d.messages)?d.messages:Array.isArray(c.messages)?c.messages:[]).filter(a=>p(a));if(e.length>0||!w(a))return{sessionKey:a,ok:!0,messageCount:e.length,error:null,messages:e}}catch(a){b=String(a?.message||a),i=!1}try{let c=w(a);if(!c)return{sessionKey:a,ok:!b,messageCount:0,error:b,messages:[]};let d=e.sessionIdMap.get(a)??c.sessionId,f=y(h.agentsStateDir,c.agentId,d);if(f||d===c.sessionId||(f=y(h.agentsStateDir,c.agentId,c.sessionId)),!f)return{sessionKey:a,ok:!b,messageCount:0,error:b,messages:[]};let g=function(a){let b=l(a);if(!b.trim())return[];let c=[];for(let a of b.split(/\r?\n/))if(a.trim())try{let b=JSON.parse(a);if(!p(b)||"message"!==b.type)continue;let d=p(b.message)?b.message:b;c.push({id:q(b.id),parentId:q(b.parentId),role:q(d.role),content:d.content,timestamp:z(b)??q(b.ts)})}catch{}return c}(f.filePath);return i=!0,{sessionKey:a,ok:!0,messageCount:g.length,error:null,messages:g}}catch(c){return{sessionKey:a,ok:!1,messageCount:0,error:b||String(c?.message||c),messages:[]}}})),k=(b=e.sessionToAgent,j.flatMap(({sessionKey:a,messages:c},d)=>c.filter(b=>!function(a,b){var c;if("pro-zig"!==v(a))return!1;let d=q(b.role),e=("string"==typeof(c=b.content)?c:!Array.isArray(c)?"":c.map(a=>a&&"object"==typeof a?"string"==typeof a.text?a.text:"string"==typeof a.thinking?a.thinking:"":"").filter(Boolean).join("\n")).trim();if(!e)return!1;if("assistant"===d&&"NO_REPLY"===e)return!0;if("user"!==d)return!1;let f=e.toLowerCase();return f.includes("internal task completion event")&&f.includes("source: subagent")}(a,b)).map((c,e)=>{let f=z(c),g=f?new Date(f).toISOString():q(c.ts),h=b.get(a)||v(a)||"unknown";return{__sortTs:f??Number.MAX_SAFE_INTEGER,__sessionIdx:d,__sortIdx:e,row:{sessionKey:a,agentId:h,agentName:h,role:q(c.role),timestamp:f,ts:g,toolName:q(c.toolName),toolCallId:q(c.toolCallId),isError:!!c.isError,content:c.content,raw:c}}})).sort((a,b)=>{let c=a.__sortTs-b.__sortTs;if(0!==c)return c;let d=a.__sessionIdx-b.__sessionIdx;return 0!==d?d:a.__sortIdx-b.__sortIdx}).map(a=>a.row)),m=j.map(a=>({sessionKey:a.sessionKey,ok:a.ok,messageCount:a.messageCount,error:a.error}));return{generatedAt:new Date().toISOString(),taskId:a,sessionKeys:f,stream:k,recentEvents:g,sessions:m,openclawAvailable:i}}async function F(a){let b=n(h.eventsPath),c=s(b.filter(b=>String(b.taskId||"")===a));if("IN_PROGRESS"!==c&&"OPEN"!==c)throw function(a,b){let c=Error(b);return c.code=a,c}("task_not_cancellable",`task_not_cancellable(taskId=${a}, status=${String(c||"unknown")})`);let d=D(),{sessionKeys:f}=x(a,b,h.specsDir,h.evidenceDir,h.agentsStateDir,d),g=[];for(let a of f){try{await B("subagents",{action:"kill",target:a})}catch{}g.push(a)}let i={ts:new Date().toISOString(),event:"blocked",taskId:a,phase:"execution",status:"BLOCKED",actor:"manual",payload:{reason:"user_cancelled",killedSessions:g}};return e().appendFileSync(h.eventsPath,JSON.stringify(i)+"\n","utf-8"),{ok:!0,killedSessions:g}}return{paths:h,loadOverview:function(){let a=function(a={}){let b=p(a.statusBuckets)?a.statusBuckets:{},c={OPEN:[],IN_PROGRESS:[],BLOCKED:[],DONE_PENDING_REPORT:[],REPORTED:[]};for(let[a,d]of Object.entries(b))c[a]=Array.isArray(d)?d:[];return{updatedAt:"string"==typeof a.updatedAt?a.updatedAt:null,statusBuckets:c,activeTasks:p(a.activeTasks)?a.activeTasks:{},recentEvents:Array.isArray(a.recentEvents)?a.recentEvents:[]}}(m(h.indexPath,{})),b=n(h.eventsPath);D();let c=Object.fromEntries(Object.entries(a.statusBuckets).map(([a,b])=>[a,Array.isArray(b)?b.length:0])),d=Object.entries(a.activeTasks).map(([a,c])=>{let d=p(c)?c:{},e=u(a,b,h.specsDir);return{taskId:a,status:"string"==typeof d.status?d.status:e.status,updatedAt:"string"==typeof d.updatedAt?d.updatedAt:e.updatedAt,scale:e.scale,title:e.title}}),e=o(b).slice(0,30).map(a=>({ts:a.ts,event:a.event||a.action,taskId:a.taskId,status:a.status,actor:a.actor||a.agentId,agentId:a.agentId,targetAgent:a.targetAgent||a.agentId,title:a.title})),f=function(a,b){let c=new Map,d=o(a);for(let e of d){let f=e.taskId;!f||c.has(f)||(d.find(a=>a.taskId===f&&!!r(a)),c.set(f,{taskId:f,ts:e.ts||null,event:e.event||e.action||null,status:t(f,a,b),scale:e.scale||null,actor:e.actor||e.agentId||null}))}return Array.from(c.values())}(b,h.specsDir);return{generatedAt:new Date().toISOString(),...{},updatedAt:a.updatedAt,bucketCounts:c,statusBuckets:a.statusBuckets,activeTasks:d.sort((a,b)=>String(b.updatedAt||"").localeCompare(String(a.updatedAt||""))),recentEvents:e,taskHistory:f,openclawAvailable:!0}},loadTaskDetail:function(a){let b=u(a,n(h.eventsPath),h.specsDir),c=function(a,b){let c=g().join(b,`${a}.md`),d=l(c),e=m(g().join(b,`${a}.meta.json`),{}),f=d?d.split(/\r?\n/):[],h={};for(let[a,b]of[["taskId",e.taskId],["title",e.title],["scale",e.scale],["requestedBy",e.requestedBy],["createdAt",e.createdAt],["projectKey",e.projectKey],["projectDir",e.projectDir],["projectPath",e.projectPath]]){let c=q(b);c&&(h[a]=c)}let i=0;for(let a of f){let b=a.match(/^(`{3,})/);if(b){0===i?i=b[1].length:b[1].length>=i&&(i=0);continue}if(i>0)continue;let c=a.match(/^-\s+([^:]+):\s*(.+)$/);if(!c)continue;let d=c[1].trim();d in h||(h[d]=c[2].trim())}let j=f.find(a=>a.trim().startsWith("- Next Action:")),k=f.find(a=>a.trim().startsWith("- Resume Hint")),n=q(e.nextAction),o=q(e.resumeHint);return{exists:!!d||Object.keys(h).length>0||!!n||!!o,path:c,metadata:h,nextAction:n||(j?j.split(":").slice(1).join(":").trim():null),resumeHint:o||(k?k.split(":").slice(1).join(":").trim():null),preview:d?f.slice(0,80).join("\n"):void 0}}(a,h.specsDir),d=function(a,b){let c=g().join(b,`${a}.meta.json`),d=m(c,{});return{exists:e().existsSync(c),path:c,data:d}}(a,h.specsDir),f=function(a,b){let c=g().join(b,a);if(!e().existsSync(c))return{exists:!1,path:c,agents:[],merged:null};let d=e().readdirSync(c).filter(a=>a.endsWith(".json")),f=[],h=null;for(let a of d){let b=g().join(c,a),d=m(b,{});if("_merged.json"===a){h={...d,path:b};continue}f.push({file:a,path:b,agentId:"string"==typeof d.agentId?d.agentId:a.replace(/\.json$/,""),runId:"string"==typeof d.runId?d.runId:null,sessionKey:"string"==typeof d.sessionKey?d.sessionKey:null,sessionId:"string"==typeof d.sessionId?d.sessionId:null,ts:"string"==typeof d.ts?d.ts:null})}return{exists:!0,path:c,agents:f.sort((a,b)=>String(b.ts||"").localeCompare(String(a.ts||""))),merged:h}}(a,h.evidenceDir);return{generatedAt:new Date().toISOString(),task:b,spec:c,meta:d,evidence:f}},loadTaskConversation:E,cancelTask:F,getTaskSessionFilePaths:function(a){let b=n(h.eventsPath),c=D(),{sessionKeys:d,sessionIdMap:e}=x(a,b,h.specsDir,h.evidenceDir,h.agentsStateDir,c);return d.map(a=>{let b=w(a);if(!b)return null;let c=e.get(a)??b.sessionId;return g().join(h.agentsStateDir,b.agentId,"sessions",`${c}.jsonl`)}).filter(a=>null!==a)}}}},67360:(a,b,c)=>{c.d(b,{BE:()=>w,IX:()=>n,TI:()=>t,dV:()=>u,gV:()=>A,gw:()=>o,jw:()=>z,xC:()=>v});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(48161),i=c.n(h),j=c(77598),k=c.n(j),l=c(74729),m=c.n(l);let n="zigrix_session",o=43200,p=new TextEncoder,q=new TextDecoder;function r(){return process.env.ZIGRIX_HOME||g().join(i().homedir(),".zigrix")}function s(){return g().join(r(),"dashboard.json")}function t(){let a=s();try{let b=e().readFileSync(a,"utf-8"),c=JSON.parse(b);if(!c||"object"!=typeof c||Array.isArray(c))return{admins:[],sessionSecret:"",corsOrigins:[],createdAt:""};return{admins:Array.isArray(c.admins)?c.admins:[],sessionSecret:"string"==typeof c.sessionSecret?c.sessionSecret:"",corsOrigins:Array.isArray(c.corsOrigins)?c.corsOrigins:[],createdAt:"string"==typeof c.createdAt?c.createdAt:""}}catch{return{admins:[],sessionSecret:"",corsOrigins:[],createdAt:""}}}function u(){return 0===t().admins.length}async function v(a,b){let c={admins:[{username:a,passwordHash:await m().hash(b,12)}],sessionSecret:k().randomBytes(64).toString("hex"),corsOrigins:["http://localhost:3000"],createdAt:new Date().toISOString()},d=s(),f=r();e().existsSync(f)||e().mkdirSync(f,{recursive:!0}),e().writeFileSync(d,JSON.stringify(c,null,2),{encoding:"utf-8",mode:384});try{e().chmodSync(d,384)}catch{}}async function w(a,b){let c=t().admins.find(b=>b.username===a);if(!c)return await m().hash(b,12),!1;if(!await m().compare(b,c.passwordHash))return!1;let d=p.encode(a),e=p.encode(c.username);return d.length===e.length&&k().timingSafeEqual(d,e)}function x(a){return Buffer.from(a).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function y(a,b){let c=await k().subtle.importKey("raw",p.encode(b),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return x(new Uint8Array(await k().subtle.sign("HMAC",c,p.encode(a))))}async function z(a){let b=t().sessionSecret;if(!b)throw Error("Session secret not configured. Run setup first.");let c=Math.floor(Date.now()/1e3),d=x(p.encode(JSON.stringify({sub:a,iat:c,exp:c+o}))),e=await y(d,b);return`${d}.${e}`}async function A(a){let b;if(!a)return null;let c=a.split(".");if(2!==c.length)return null;let[d,e]=c;if(!d||!e)return null;let f=t().sessionSecret;if(!f||!function(a,b){if(a.length!==b.length)return!1;let c=p.encode(a),d=p.encode(b);return k().timingSafeEqual(c,d)}(await y(d,f),e))return null;try{let a=q.decode(function(a){let b=a.replace(/-/g,"+").replace(/_/g,"/"),c=b.padEnd(4*Math.ceil(b.length/4),"=");return new Uint8Array(Buffer.from(c,"base64"))}(d));b=JSON.parse(a)}catch{return null}if("number"!=typeof b.exp||"number"!=typeof b.iat)return null;let g=Math.floor(Date.now()/1e3);return b.exp<=g||b.iat>g+60?null:{username:"string"==typeof b.sub?b.sub:"",issuedAt:b.iat,expiresAt:b.exp}}}};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
3
|
"functions": {
|
|
4
|
-
"/api/auth/setup": {},
|
|
5
|
-
"/api/auth/login": {},
|
|
6
|
-
"/api/tasks/[taskId]/conversation": {},
|
|
7
|
-
"/api/tasks/[taskId]": {},
|
|
8
4
|
"/api/overview": {},
|
|
9
5
|
"/api/auth/logout": {},
|
|
10
|
-
"/api/tasks/[taskId]/cancel": {},
|
|
11
6
|
"/api/auth/session": {},
|
|
7
|
+
"/api/auth/setup": {},
|
|
8
|
+
"/api/tasks/[taskId]/conversation": {},
|
|
9
|
+
"/api/tasks/[taskId]/cancel": {},
|
|
10
|
+
"/api/auth/login": {},
|
|
11
|
+
"/api/tasks/[taskId]": {},
|
|
12
12
|
"/api/stream": {},
|
|
13
13
|
"/_middleware": {
|
|
14
14
|
"runtime": "nodejs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--gl9FuUQE7dOSS5c3ZdHG0--><html lang="ko"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/9f7ffdac282b0450.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-1c485544eee88ef7.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-ebd51be49873d76c.js" async=""></script><script src="/_next/static/chunks/main-app-458501fc143f8dcb.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Zigrix Dashboard</title><meta name="description" content="Zigrix task orchestration dashboard"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-1c485544eee88ef7.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/css/9f7ffdac282b0450.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"gl9FuUQE7dOSS5c3ZdHG0\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/9f7ffdac282b0450.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"ko\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],null],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Zigrix Dashboard\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Zigrix task orchestration dashboard\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-1c485544eee88ef7.js" defer=""></script><script src="/_next/static/chunks/framework-de98b93a850cfc71.js" defer=""></script><script src="/_next/static/chunks/main-cac4989ed66738c4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7d307437aca18ad4.js" defer=""></script><script src="/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js" defer=""></script><script src="/_next/static/
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">500: Internal Server Error</title><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-1c485544eee88ef7.js" defer=""></script><script src="/_next/static/chunks/framework-de98b93a850cfc71.js" defer=""></script><script src="/_next/static/chunks/main-cac4989ed66738c4.js" defer=""></script><script src="/_next/static/chunks/pages/_app-7d307437aca18ad4.js" defer=""></script><script src="/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js" defer=""></script><script src="/_next/static/gl9FuUQE7dOSS5c3ZdHG0/_buildManifest.js" defer=""></script><script src="/_next/static/gl9FuUQE7dOSS5c3ZdHG0/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"gl9FuUQE7dOSS5c3ZdHG0","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
|
@@ -90,16 +90,26 @@ export function prepareWorker(paths, params) {
|
|
|
90
90
|
});
|
|
91
91
|
return { ok: true, taskId: params.taskId, agentId: params.agentId, promptPath, prompt, unitId: params.unitId, workPackage: params.workPackage };
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Extract sessionId from a sessionKey of the form `agent:<agentId>:subagent:<sessionId>`.
|
|
95
|
+
* Returns null if the sessionKey does not match the expected pattern.
|
|
96
|
+
*/
|
|
97
|
+
function parseSessionIdFromKey(sessionKey) {
|
|
98
|
+
const matched = sessionKey.match(/^agent:[^:]+:subagent:([^:\s]+)$/);
|
|
99
|
+
return matched?.[1] ?? null;
|
|
100
|
+
}
|
|
93
101
|
export function registerWorker(paths, params) {
|
|
94
102
|
const task = loadTask(paths, params.taskId);
|
|
95
103
|
if (!task)
|
|
96
104
|
return null;
|
|
105
|
+
// Resolve sessionId: use provided value, or fall back to parsing it from sessionKey
|
|
106
|
+
const resolvedSessionId = params.sessionId || parseSessionIdFromKey(params.sessionKey) || null;
|
|
97
107
|
task.workerSessions[params.agentId] = {
|
|
98
108
|
...(task.workerSessions[params.agentId] ?? {}),
|
|
99
109
|
status: 'dispatched',
|
|
100
110
|
sessionKey: params.sessionKey,
|
|
101
111
|
runId: params.runId ?? '',
|
|
102
|
-
sessionId:
|
|
112
|
+
sessionId: resolvedSessionId,
|
|
103
113
|
unitId: params.unitId,
|
|
104
114
|
workPackage: params.workPackage,
|
|
105
115
|
reason: params.reason ?? '',
|
|
@@ -111,10 +121,10 @@ export function registerWorker(paths, params) {
|
|
|
111
121
|
saveTask(paths, task);
|
|
112
122
|
appendEvent(paths.eventsFile, {
|
|
113
123
|
event: 'worker_dispatched', taskId: params.taskId, phase: 'execution', actor: 'zigrix', targetAgent: params.agentId, status: 'IN_PROGRESS',
|
|
114
|
-
sessionKey: params.sessionKey, sessionId:
|
|
124
|
+
sessionKey: params.sessionKey, sessionId: resolvedSessionId, unitId: params.unitId, workPackage: params.workPackage,
|
|
115
125
|
payload: { agentId: params.agentId, runId: params.runId ?? '', reason: params.reason ?? '' },
|
|
116
126
|
});
|
|
117
|
-
return { ok: true, taskId: params.taskId, agentId: params.agentId, sessionKey: params.sessionKey, runId: params.runId ?? '', sessionId:
|
|
127
|
+
return { ok: true, taskId: params.taskId, agentId: params.agentId, sessionKey: params.sessionKey, runId: params.runId ?? '', sessionId: resolvedSessionId, unitId: params.unitId, workPackage: params.workPackage, status: 'dispatched' };
|
|
118
128
|
}
|
|
119
129
|
export function completeWorker(paths, params) {
|
|
120
130
|
const task = loadTask(paths, params.taskId);
|
package/package.json
CHANGED
|
@@ -215,7 +215,28 @@
|
|
|
215
215
|
- **GitHub 원격 저장소가 없는 프로젝트**는 브랜치 생성 → 작업 → commit → 로컬 merge를 기본으로 한다.
|
|
216
216
|
- **커밋 메시지 형식:** `feat/fix/docs/chore: 변경 의도 요약\n\n<taskId>`
|
|
217
217
|
|
|
218
|
-
## 10)
|
|
218
|
+
## 10) Git 전담 규칙 (2026-03-23)
|
|
219
|
+
|
|
220
|
+
> **commit / push / PR은 orchestrator 역할만 수행한다.**
|
|
221
|
+
|
|
222
|
+
### 원칙
|
|
223
|
+
- non-orchestrator 역할 워커(frontend/backend/system/security/qa)는 파일 수정까지만 담당하고, git 조작을 수행하지 않는다.
|
|
224
|
+
- orchestrator가 워커로부터 변경 파일 목록을 수신한 뒤, **QA 통과를 확인한 후에만** commit → push → PR을 수행한다.
|
|
225
|
+
- QA 미통과 상태에서 commit/push/PR을 생성하지 않는다.
|
|
226
|
+
|
|
227
|
+
### 절차
|
|
228
|
+
1. 워커가 파일 변경 완료 → 변경 목록을 orchestrator에 반환
|
|
229
|
+
2. orchestrator가 qa 역할 워커를 호출하여 변경사항 검증
|
|
230
|
+
3. qa 역할 워커 DONE(통과) 확인
|
|
231
|
+
4. orchestrator가 `git add` → `git commit` → `git push` → PR 생성/업데이트
|
|
232
|
+
5. PR URL을 최종 보고에 포함
|
|
233
|
+
|
|
234
|
+
### 금지사항
|
|
235
|
+
- 워커에게 commit/push/PR 수행을 지시하지 않는다
|
|
236
|
+
- QA 미완료 상태에서 commit하지 않는다
|
|
237
|
+
- 워커가 실수로 commit한 경우 revert 후 재진행
|
|
238
|
+
|
|
239
|
+
## 11) Output Template (to User)
|
|
219
240
|
- 작업유형: `simple|normal|risky|large`
|
|
220
241
|
- 진행 요약 (1~3줄)
|
|
221
242
|
- 에이전트별 수행 내역
|
|
@@ -224,7 +245,7 @@
|
|
|
224
245
|
- 피드백 요청
|
|
225
246
|
- 가능하면 `python3 /Users/janos/.openclaw/workspace/orchestration/scripts/dev_report_to_user.py --task-id <taskId> --record-events` 출력문을 그대로 사용
|
|
226
247
|
|
|
227
|
-
##
|
|
248
|
+
## 12) Final Feedback Step (필수)
|
|
228
249
|
- finalize 직후, 메인 내부 보고가 아니라 **사용자에게 직접 최종 보고**한다.
|
|
229
250
|
- 권장 순서:
|
|
230
251
|
1) `dev_finalize.py --task-id ... --evidence ... --auto-report`
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
8. **스크립트 체인 정합 (2026-03-11):** 구 worker lifecycle 스크립트(`dev_worker_dispatch.py`, `dev_worker_start.py`, `dev_worker_done.py`)는 제거됐다. 워커 lifecycle 기록(`worker_dispatched`/`worker_done`/`worker_skipped`)은 pro-zig가 `orch_prepare_worker.py → orch_register_worker.py → orch_complete_worker.py` 체인으로 처리한다.
|
|
16
16
|
9. **Git Workflow Policy 준수 (2026-03-17):** 프로젝트 작업 시 `/Users/janos/.openclaw/public-knowledge/policies/git-workflow.md`를 반드시 따른다. 기본 브랜치(main, master) 직접 작업/commit/push 금지, GitHub 원격이 있으면 브랜치 작업 후 PR 제출이 기본이다.
|
|
17
17
|
10. **완료 상태 불변성 (2026-03-17):** `/Users/janos/.openclaw/public-knowledge/policies/task-status-policy.md`를 따른다. `REPORTED` task에 대한 후행 completion/event는 상태 전이를 만들지 않는다. 워커는 중복 완료 알림이 와도 추가 상태 변경 시도를 하지 않고 NO-OP로 처리한다.
|
|
18
|
+
11. **Git 조작 금지 (2026-03-23):** non-orchestrator 역할 워커(frontend/backend/system/security/qa)는 `git commit`, `git push`, `git branch`, `git checkout -b`, PR 생성 등 **Git 상태를 변경하는 모든 조작을 수행하지 않는다.** 워커의 역할은 파일 수정/생성/삭제까지이며, 작업 완료 시 **변경된 파일 목록**을 orchestrator 역할에 반환한다. commit/push/PR은 orchestrator가 QA 통과 확인 후 전담한다.
|
|
18
19
|
|
|
19
20
|
## 3) Project Path Policy (고정)
|
|
20
21
|
- 개발 프로젝트 경로는 항상 `/Users/janos/.openclaw/workspace-pro-zig/projects` 기준으로 참조
|
|
File without changes
|
/package/dist/dashboard/.next/static/{9ckiWP7qiX6CJ0iNYkChZ → gl9FuUQE7dOSS5c3ZdHG0}/_ssgManifest.js
RENAMED
|
File without changes
|