@zenon-red/probe 1.1.8 → 1.2.2

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/index.js CHANGED
@@ -1,10 +1,62 @@
1
1
  #!/usr/bin/env node
2
- import{createRequire as e}from"node:module";import{defineCommand as t,runMain as n}from"citty";import{Buffer as r}from"node:buffer";import{arch as i,homedir as a,platform as o}from"node:os";import{dirname as s,join as c,resolve as l}from"node:path";import{loadConfig as u}from"c12";import{access as d,mkdir as f,readFile as p,readdir as m,unlink as ee,writeFile as te}from"node:fs/promises";import{confirm as ne,log as re,password as ie,spinner as ae,text as oe}from"@clack/prompts";import{AsyncLocalStorage as se}from"node:async_hooks";import{blue as ce,bold as le,cyan as ue,dim as de,gray as fe,green as pe,white as me}from"kolorist";import{KeyFile as he,KeyStore as ge}from"znn-typescript-sdk";import{DbConnectionBuilder as _e,DbConnectionImpl as ve,SubscriptionBuilderImpl as ye,convertToAccessorMap as be,makeQueryBuilder as xe,procedureSchema as Se,procedures as Ce,reducerSchema as h,reducers as we,schema as Te,t as g,table as _}from"spacetimedb";import{encode as Ee}from"@toon-format/toon";import{createWriteStream as De,existsSync as Oe,readFileSync as ke,renameSync as Ae,unlinkSync as je}from"node:fs";import{createConsola as Me}from"consola";import{execSync as Ne}from"node:child_process";import{createHash as Pe}from"node:crypto";import{Readable as Fe}from"node:stream";import{finished as Ie}from"node:stream/promises";const Le={issuer:`https://api.zenon.red`,walletDir:`~/.probe/wallets`,passwordMinLength:8,tokenCacheDir:`~/.probe/tokens`,requestTimeout:3e4,spacetime:{host:`wss://db.zenon.red`,module:`nexus`}},Re=c(a(),`.probe`,`config.json`),ze=c(a(),`.probe`);async function v(){try{await d(Re);let e=await p(Re,`utf-8`);return JSON.parse(e)}catch{return{}}}async function Be(e){await f(ze,{recursive:!0}),await te(Re,JSON.stringify(e,null,2),{mode:384})}let y=null;async function b(){if(y)return y;let[e,t]=await Promise.all([u({name:`probe`,defaults:Le,envName:`PROBE`}),v()]);return y={...Le,...e.config,...t},y.walletDir=He(y.walletDir),y.tokenCacheDir=He(y.tokenCacheDir),y}function Ve(){y=null}function He(e){return e.startsWith(`~/`)?c(a(),e.slice(2)):e}async function Ue(){return(await b()).walletDir}async function We(){return(await b()).tokenCacheDir}const Ge=new se;let Ke=!1;const qe=(e,t)=>typeof t==`bigint`?t.toString():t,Je=(e,t=!1)=>{let n=JSON.stringify(e,qe,2);if(t){console.error(n);return}console.log(n)};function x(e){Ke=e,Ge.enterWith({jsonMode:e})}function S(){return Ge.getStore()?.jsonMode===!0||Ke}function C(e){S()&&Je({success:!0,data:e})}function w(e,t,n,r=1){S()?(Je({success:!1,error:{code:e,message:t,...n&&{suggestion:n}}},!0),process.exit(r)):(re.error(t),n&&console.error(`${de(`hint:`)} ${n}`),process.exit(r))}function T(e){S()||re.info(e)}function E(e){S()||re.success(e)}function Ye(e){S()||re.warn(e)}function Xe(e){if(S())return{start:()=>{},stop:()=>{},succeed:()=>{},fail:()=>{}};let t=ae();return{start:()=>{t.start(e)},stop:()=>{t.stop()},succeed:n=>{t.stop(n||e)},fail:n=>{t.stop(n||e)}}}const Ze=async(e,t)=>{try{return(await p(e,`utf-8`)).trim()}catch{w(`FILE_READ_ERROR`,`Failed to read ${t} file: ${e}`)}},Qe=async e=>{if(e.passwordFile)return Ze(e.passwordFile,`password`);let t=e.envVar||`PROBE_WALLET_PASSWORD`,n=process.env[t];if(n)return n;(S()||!process.stdin.isTTY||!process.stdout.isTTY)&&w(`PASSWORD_REQUIRED`,e.jsonModeError);let r=await ie({message:e.promptMessage,validate:t=>{if(t&&e.minLength&&t.length<e.minLength)return`Password must be at least ${e.minLength} characters`}});return typeof r!=`string`&&process.exit(130),e.confirmPromptMessage&&typeof await ie({message:e.confirmPromptMessage,validate:e=>e===r?void 0:`Passwords do not match`})!=`string`&&process.exit(130),r},$e=async e=>{if(e.mnemonic)return e.mnemonic;if(e.mnemonicFile)return Ze(e.mnemonicFile,`mnemonic`);let t=e.envVar||`PROBE_WALLET_MNEMONIC`,n=process.env[t];if(n)return n;(S()||!process.stdin.isTTY||!process.stdout.isTTY)&&w(`MNEMONIC_REQUIRED`,e.jsonModeError);let r=await oe({message:`Enter mnemonic phrase:`,validate:e=>e&&e.trim().split(/\s+/).length===24?void 0:`Mnemonic must be 24 words`});return typeof r!=`string`&&process.exit(130),r},et=new Set([`agent`,`task`,`message`,`idea`,`discover`,`project`,`config`]),tt=new Set([`wallet`,`auth`,`sign`,`token`,`nexus`,`query`,`doctor`,`upgrade`]),nt=new Set([`create`,`import`,`list`,`show`,`delete`,`default`]);let rt=!1;const it=e=>`\u001b[48;2;120;239;93m\u001b[38;2;12;28;16m ${e} \u001b[0m`,D=e=>it(e.toUpperCase()),at=(e,t)=>{let n=Math.max(...e.map(e=>e.name.length),0);return e.map(e=>` ${t(e.name.padEnd(n))} ${e.detail}`).join(`
3
- `)},O=e=>{let t=[...e.notes||[]],n=(e.options||[]).some(e=>e.name.includes(`--host`)&&e.name.includes(`--module`)),r=t.some(e=>e.includes(`--host`)&&e.includes(`--module`));n&&!r&&t.push(`--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).`);let i=[];i.push(`${le(me(e.command))} ${de(`•`)} ${fe(e.description)}`),i.push(``),i.push(D(`Usage`));for(let t of e.usage)i.push(` ${me(t)}`);if(e.actions&&e.actions.length>0&&(i.push(``),i.push(D(`Actions`)),i.push(at(e.actions,pe))),e.options&&e.options.length>0&&(i.push(``),i.push(D(`Options`)),i.push(at(e.options,ce))),e.examples&&e.examples.length>0){i.push(``),i.push(D(`Examples`));for(let t of e.examples)i.push(` ${ue(t)}`)}if(t.length>0){i.push(``),i.push(D(`Notes`));for(let e of t)i.push(` ${de(`-`)} ${e}`)}console.log(i.join(`
4
- `))},ot=e=>{rt=e},k=()=>rt,st=e=>{if(!(e.includes(`--help`)||e.includes(`-h`)))return{argv:e,forceHelp:!1};if(e.every(e=>e.startsWith(`-`)))return{argv:[],forceHelp:!0};let t=e.find(e=>!e.startsWith(`-`));if(!t)return{argv:e,forceHelp:!0};if(et.has(t))return{argv:[t],forceHelp:!0};if(!tt.has(t))return{argv:e,forceHelp:!0};if(t===`wallet`){let n=e.filter(e=>!e.startsWith(`-`));if(n.length>1&&nt.has(n[1]))return{argv:[t,n[1]],forceHelp:!0}}return{argv:[t],forceHelp:!0}};async function ct(e,t){let n=await b(),r=`${t||n.issuer}/auth/challenge`,i=await fetch(r,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({address:e})});if(!i.ok){let e=await i.text();throw Error(`Challenge request failed: ${e}`)}let a=await i.json();return{nonce:a.nonce,challenge:a.challenge,expiresAt:a.expires_at}}async function lt(e,t,n,r,i){let a=await b(),o=`${i||a.issuer}/auth/token`,s=await fetch(o,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({address:e,public_key:t,signature:n,nonce:r})});if(!s.ok){let e=await s.text();throw Error(`Token exchange failed: ${e}`)}let c=await s.json();return{accessToken:c.access_token,idToken:c.id_token,expiresIn:c.expires_in}}async function ut(e,t,n){let r=await We();try{await f(r,{recursive:!0})}catch{}await te(c(r,`${e}.jwt`),JSON.stringify({token:t,expiresAt:n}),{mode:384})}async function A(e){let t=c(await We(),`${e}.jwt`);try{await d(t);let e=await p(t,`utf-8`);return JSON.parse(e)}catch{return null}}async function dt(e){let t=c(await We(),`${e}.jwt`);try{await d(t);let{unlink:e}=await import(`node:fs/promises`);await e(t)}catch{}}async function ft(){let e=await Ue();try{await f(e,{recursive:!0})}catch{}return e}async function j(e){return c(await ft(),`${e}.json`)}async function pt(e,t){if(await vt(e))throw Error(`Wallet '${e}' already exists`);let n=ge.newRandom(),r=await he.setPassword(t).encrypt(n);await te(await j(e),JSON.stringify(r,null,2),`utf-8`);let i=n.getKeyPair(0),a=i.getAddress(),o=i.getPublicKey();return{name:e,address:a.toString(),publicKey:o.toString(`hex`),mnemonic:n.mnemonic||``}}async function mt(e,t,n){if(await vt(e))throw Error(`Wallet '${e}' already exists`);let r=ge.fromMnemonic(t),i=await he.setPassword(n).encrypt(r);return await te(await j(e),JSON.stringify(i,null,2),`utf-8`),{name:e,address:r.getKeyPair(0).getAddress().toString()}}async function ht(){let e=await Ue();try{let t=await m(e),n=[];for(let e of t)if(e.endsWith(`.json`)){let t=await M(e.slice(0,-5));t&&n.push(t)}return n}catch{return[]}}async function M(e){let t=await j(e);try{let n=await p(t,`utf-8`),r=JSON.parse(n),i=await yt(t);return{name:e,address:r.address||r.baseAddress,createdAt:r.timestamp?new Date(r.timestamp*1e3).toISOString():new Date(i.mtime).toISOString()}}catch{return null}}async function gt(e,t){let n=await j(e);try{let e=await p(n,`utf-8`),r=JSON.parse(e);return await he.setPassword(t).decrypt(r)}catch(e){throw Error(`Failed to load wallet: ${e instanceof Error?e.message:`Unknown error`}`)}}async function _t(e){let t=await j(e);try{await ee(t)}catch(e){throw Error(`Failed to delete wallet: ${e instanceof Error?e.message:`Unknown error`}`)}}async function vt(e){let t=await j(e);try{return await d(t),!0}catch{return!1}}async function yt(e){let{stat:t}=await import(`node:fs/promises`);return t(e)}var bt=t({meta:{name:`auth`,description:`Complete OIDC authentication flow`},args:{name:{type:`positional`,description:`Wallet name, or status action`,required:!1},wallet:{type:`string`,description:`Wallet name override (used with auth status)`},"expect-address":{type:`string`,description:`Expected Zenon address safety check (z1...)`},issuer:{type:`string`,description:`OIDC issuer URL override`},"password-file":{type:`string`,description:`Read password from file`},save:{type:`boolean`,description:`Save token to cache (default: true)`,default:!0},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name,n=e[`expect-address`];if(!t){O({command:`probe auth`,description:`Complete OIDC authentication flow`,usage:[`probe auth <wallet-name> [options]`,`probe auth status [--wallet my-wallet]`,`probe auth my-wallet --save`,`probe auth my-wallet --expect-address z1q... --save`],options:[{name:`--expect-address`,detail:`Optional safety check against resolved wallet address`},{name:`--wallet`,detail:"Wallet override for `auth status`"},{name:`--issuer`,detail:`OIDC issuer URL (default from config: issuer)`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--save`,detail:`Save token in local cache (default: true)`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.`,`Most users should omit --expect-address; it is for safety checks in external workflows.`,`Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).`]});return}if(t===`status`){let t=await b(),n=e.wallet||t.defaultWallet;n||w(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`);let r=await A(n);if(!r){C({wallet:n,authenticated:!1,valid:!1,reason:`no_cached_token`}),S()||(console.log(`Wallet: ${n}`),console.log(`Status: Not authenticated (no cached token)`),console.log(`Next: probe auth ${n} --save`));return}let i=new Date(r.expiresAt),a=Math.floor((i.getTime()-Date.now())/1e3),o=Number.isFinite(a)&&a>0;C({wallet:n,authenticated:!0,valid:o,expiresAt:r.expiresAt,expiresIn:Math.max(0,a)}),S()||(console.log(`Wallet: ${n}`),console.log(`Status: ${o?`Authenticated`:`Token expired`}`),console.log(`Expires: ${i.toUTCString()}`));return}let i=await Qe({passwordFile:e[`password-file`],promptMessage:`Enter wallet password:`,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session`}),a,o,s;try{a=(await gt(t,i)).getKeyPair(0),o=a.getAddress().toString(),n&&o!==n&&w(`ADDRESS_MISMATCH`,`Wallet address ${o} does not match provided address ${n}`),s=n||o}catch(e){w(`WALLET_LOAD_ERROR`,e instanceof Error?e.message:`Failed to load wallet`)}try{let n=Xe(`Requesting challenge from OIDC provider...`);n.start();let i=await ct(s,e.issuer);n.succeed();let o=Xe(`Signing challenge...`);o.start();let c=a.sign(r.from(i.challenge)),l=a.getPublicKey();o.succeed();let u=Xe(`Exchanging for token...`);u.start();let d=await lt(s,l.toString(`hex`),c.toString(`hex`),i.nonce,e.issuer);u.succeed();let f=new Date(Date.now()+d.expiresIn*1e3).toISOString();e.save&&await ut(t,d.accessToken,f),C({wallet:t,address:s,token:d.accessToken,expiresAt:f,expiresIn:d.expiresIn}),S()||(E(`Authentication successful`),e.save&&console.log(`Token saved to wallet cache.`),console.log(`Expires: ${new Date(f).toUTCString()} (${Math.floor(d.expiresIn/86400)} days)`))}catch(e){w(`AUTH_ERROR`,e instanceof Error?e.message:`Authentication failed`,void 0,2)}}});function xt(e,t){let n=t.split(`.`),r=e;for(let e of n)if(r&&typeof r==`object`&&e in r)r=r[e];else return;return r}function St(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];(!(t in i)||typeof i[t]!=`object`)&&(i[t]={}),i=i[t]}i[r[r.length-1]]=n}var Ct=t({meta:{name:`config`,description:`Manage configuration settings`},args:{action:{type:`positional`,description:`Action: get, set, list`,required:!1},key:{type:`positional`,description:`Configuration key`,required:!1},value:{type:`positional`,description:`Configuration value`,required:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe config`,description:`Read and write CLI configuration values`,usage:[`probe config <action> [key] [value]`,`probe config get spacetime.host`,`probe config set defaultWallet agent-wallet`],actions:[{name:`get <key>`,detail:`Get one config value`},{name:`set <key> <value>`,detail:`Set one config value`},{name:`list`,detail:`List merged config and user overrides`}],notes:[`Valid keys: issuer, walletDir, defaultWallet, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.`]});return}let t=e.action,n=[`issuer`,`walletDir`,`defaultWallet`,`tokenCacheDir`,`requestTimeout`,`spacetime.host`,`spacetime.module`];try{switch(t){case`get`:{e.key||w(`KEY_REQUIRED`,`Configuration key required`),n.includes(e.key)||w(`INVALID_KEY`,`Invalid configuration key: ${e.key}`,`Valid keys: ${n.join(`, `)}`);let t=xt(await b(),e.key);C({[e.key]:t}),S()||console.log(`${e.key}: ${t}`);break}case`set`:{(!e.key||e.value===void 0)&&w(`ARGS_REQUIRED`,`Configuration key and value required`),n.includes(e.key)||w(`INVALID_KEY`,`Invalid configuration key: ${e.key}`,`Valid keys: ${n.join(`, `)}`);let t=e.value;e.key===`requestTimeout`&&(t=parseInt(e.value,10));let r=await v();St(r,e.key,t),await Be(r),Ve(),C({[e.key]:t}),S()||E(`Set ${e.key} = ${t}`);break}case`list`:{let e=await b(),t=await v();if(C({...e,userConfig:t}),!S()&&(console.log(`Configuration:`),console.log(` issuer: ${e.issuer}`),console.log(` walletDir: ${e.walletDir}`),console.log(` defaultWallet: ${e.defaultWallet||`(not set)`}`),console.log(` passwordMinLength: ${e.passwordMinLength}`),console.log(` tokenCacheDir: ${e.tokenCacheDir}`),console.log(` requestTimeout: ${e.requestTimeout}`),console.log(` spacetime.host: ${e.spacetime.host}`),console.log(` spacetime.module: ${e.spacetime.module}`),Object.keys(t).length>0)){console.log(`
5
- User overrides:`);for(let[e,n]of Object.entries(t))console.log(` ${e}: ${JSON.stringify(n)}`)}break}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: get, set, list`)}}catch(e){w(`CONFIG_ERROR`,e instanceof Error?e.message:`Configuration error`)}}});g.object(`Agent`,{id:g.string(),name:g.string(),bio:g.string(),get role(){return N},capabilities:g.array(g.string()),get status(){return wt},zenonAddress:g.string(),identity:g.identity(),lastHeartbeat:g.timestamp(),currentTaskId:g.option(g.u64()),createdAt:g.timestamp(),lastActiveAt:g.timestamp()});const N=g.enum(`AgentRole`,{Zoe:g.unit(),Admin:g.unit(),Zeno:g.unit()}),wt=g.enum(`AgentStatus`,{Online:g.unit(),Offline:g.unit(),Working:g.unit()});g.object(`AgentVoiceCounter`,{agentId:g.identity(),nextSeq:g.u64()});const Tt=g.enum(`AnnouncementStatus`,{Pending:g.unit(),Ready:g.unit(),Failed:g.unit()});g.object(`Channel`,{id:g.u64(),name:g.string(),createdBy:g.string(),createdAt:g.timestamp()}),g.object(`Config`,{key:g.string(),value:g.string()});const Et=g.enum(`DependencyType`,{Blocks:g.unit(),ParentChild:g.unit()}),Dt=g.object(`DimensionScore`,{dimension:g.string(),score:g.u8()});g.object(`DiscoveredTask`,{id:g.u64(),discoveredBy:g.string(),currentTaskId:g.u64(),projectId:g.u64(),title:g.string(),description:g.string(),priority:g.u8(),taskType:g.string(),severity:g.string(),get status(){return Ot},createdTaskId:g.option(g.u64()),rejectionReason:g.option(g.string()),createdAt:g.timestamp(),reviewedAt:g.option(g.timestamp()),reviewedBy:g.option(g.string())});const Ot=g.enum(`DiscoveredTaskStatus`,{PendingReview:g.unit(),Approved:g.unit(),Rejected:g.unit(),EscalatedToIdea:g.unit()}),kt=g.enum(`DiscoveryDecision`,{ApproveAsTask:g.unit(),Reject:g.unit(),EscalateToIdea:g.unit()});g.object(`EvaluationDimension`,{id:g.u64(),name:g.string(),label:g.string(),weight:g.f64(),minScore:g.u8(),maxScore:g.u8(),description:g.string(),active:g.bool(),sortOrder:g.u16()});const At=g.object(`GenerateVoiceResult`,{id:g.u64(),seq:g.u64(),agentName:g.string(),keyPrefix:g.string()});g.object(`Idea`,{id:g.u64(),title:g.string(),description:g.string(),category:g.string(),get status(){return jt},activeAgentCount:g.u32(),quorum:g.u16(),approvalThreshold:g.u16(),vetoThreshold:g.u16(),upVotes:g.u16(),downVotes:g.u16(),vetoCount:g.u16(),totalVotes:g.u16(),createdBy:g.string(),createdAt:g.timestamp(),updatedAt:g.timestamp(),computedScore:g.f64()});const jt=g.enum(`IdeaStatus`,{Voting:g.unit(),ApprovedForProject:g.unit(),Rejected:g.unit(),Implemented:g.unit()});g.object(`IdentityRole`,{identity:g.identity(),get role(){return N}}),g.object(`Message`,{id:g.u64(),channelId:g.u64(),senderId:g.string(),content:g.string(),get messageType(){return P},contextId:g.option(g.string()),createdAt:g.timestamp()});const P=g.enum(`MessageType`,{User:g.unit(),System:g.unit(),Directive:g.unit()});g.object(`Project`,{id:g.u64(),sourceIdeaId:g.u64(),name:g.string(),githubRepo:g.string(),description:g.string(),get status(){return Mt},createdAt:g.timestamp(),createdBy:g.string()}),g.object(`ProjectChannel`,{projectId:g.u64(),createdAt:g.timestamp()}),g.object(`ProjectMessage`,{id:g.u64(),projectId:g.u64(),senderId:g.string(),content:g.string(),get messageType(){return P},contextId:g.option(g.string()),createdAt:g.timestamp()});const Mt=g.enum(`ProjectStatus`,{Active:g.unit(),Paused:g.unit()});g.object(`Task`,{id:g.u64(),projectId:g.u64(),title:g.string(),description:g.string(),get status(){return F},assignedTo:g.option(g.string()),claimedAt:g.option(g.timestamp()),githubIssueUrl:g.option(g.string()),githubPrUrl:g.option(g.string()),priority:g.u8(),sourceIdeaId:g.option(g.u64()),reviewCount:g.u8(),get blockedFromStatus(){return g.option(F)},archivedReason:g.option(g.string()),statusChangedBy:g.option(g.identity()),statusChangedAt:g.option(g.timestamp()),createdAt:g.timestamp(),updatedAt:g.timestamp(),createdBy:g.string()}),g.object(`TaskDependency`,{id:g.u64(),taskId:g.u64(),dependsOnId:g.u64(),get dependencyType(){return Et},createdAt:g.timestamp()});const F=g.enum(`TaskStatus`,{Open:g.unit(),Claimed:g.unit(),InProgress:g.unit(),Review:g.unit(),Completed:g.unit(),Blocked:g.unit(),Archived:g.unit()});g.object(`VoiceAllowedHost`,{host:g.string()}),g.object(`VoiceAnnouncement`,{id:g.u64(),agentId:g.identity(),seq:g.u64(),agentName:g.string(),transcript:g.string(),audioUrl:g.string(),get status(){return Tt},contextType:g.option(g.string()),contextId:g.option(g.u64()),finalizedAt:g.option(g.timestamp()),failedAt:g.option(g.timestamp()),errorMessage:g.option(g.string()),createdAt:g.timestamp()}),g.object(`Vote`,{id:g.u64(),ideaId:g.u64(),agentId:g.string(),get voteType(){return Nt},get scores(){return g.array(Dt)},createdAt:g.timestamp()});const Nt=g.enum(`VoteType`,{Up:g.unit(),Down:g.unit(),Veto:g.unit()});var Pt={taskId:g.u64(),dependsOnId:g.u64(),get dependencyType(){return Et}},Ft={taskId:g.u64()},It={sourceIdeaId:g.u64(),name:g.string(),githubRepo:g.string(),description:g.string()},Lt={projectId:g.u64(),title:g.string(),description:g.string(),priority:g.u8(),sourceIdeaId:g.option(g.u64()),githubIssueUrl:g.option(g.string())},Rt={currentTaskId:g.u64(),projectId:g.u64(),title:g.string(),description:g.string(),priority:g.u8(),taskType:g.string(),severity:g.string()},zt={announcementId:g.u64(),errorMessage:g.string()},Bt={announcementId:g.u64(),audioUrl:g.string()},Vt={agentId:g.string()},Ht={ideaId:g.u64()},Ut={title:g.string(),description:g.string(),category:g.string()},Wt={agentId:g.string(),name:g.string(),zenonAddress:g.string(),get role(){return g.option(N)}},Gt={discoveryId:g.u64(),get decision(){return kt},reason:g.option(g.string())},Kt={},qt={},Jt={channelId:g.u64(),content:g.string(),get messageType(){return P},contextId:g.option(g.string())},Yt={projectId:g.u64(),content:g.string(),get messageType(){return P},contextId:g.option(g.string())},Xt={get status(){return wt},taskId:g.option(g.u64())},Zt={bio:g.string()},Qt={capabilities:g.array(g.string())},$t={projectId:g.u64(),get status(){return Mt}},en={taskId:g.u64(),get status(){return F},githubPrUrl:g.option(g.string()),archiveReason:g.option(g.string())},tn={ideaId:g.u64(),get scores(){return g.array(Dt)}};const nn={transcript:g.string(),audioUrl:g.option(g.string()),contextType:g.option(g.string())},rn=g.result(At,g.string());var an=g.row({id:g.string().primaryKey(),name:g.string(),bio:g.string(),get role(){return N},capabilities:g.array(g.string()),get status(){return wt},zenonAddress:g.string().name(`zenon_address`),identity:g.identity(),lastHeartbeat:g.timestamp().name(`last_heartbeat`),currentTaskId:g.option(g.u64()).name(`current_task_id`),createdAt:g.timestamp().name(`created_at`),lastActiveAt:g.timestamp().name(`last_active_at`)}),on=g.row({id:g.u64().primaryKey(),name:g.string(),createdBy:g.string().name(`created_by`),createdAt:g.timestamp().name(`created_at`)}),sn=g.row({key:g.string().primaryKey(),value:g.string()}),cn=g.row({id:g.u64().primaryKey(),discoveredBy:g.string().name(`discovered_by`),currentTaskId:g.u64().name(`current_task_id`),projectId:g.u64().name(`project_id`),title:g.string(),description:g.string(),priority:g.u8(),taskType:g.string().name(`task_type`),severity:g.string(),get status(){return Ot},createdTaskId:g.option(g.u64()).name(`created_task_id`),rejectionReason:g.option(g.string()).name(`rejection_reason`),createdAt:g.timestamp().name(`created_at`),reviewedAt:g.option(g.timestamp()).name(`reviewed_at`),reviewedBy:g.option(g.string()).name(`reviewed_by`)}),ln=g.row({id:g.u64().primaryKey(),name:g.string(),label:g.string(),weight:g.f64(),minScore:g.u8().name(`min_score`),maxScore:g.u8().name(`max_score`),description:g.string(),active:g.bool(),sortOrder:g.u16().name(`sort_order`)}),un=g.row({id:g.u64().primaryKey(),title:g.string(),description:g.string(),category:g.string(),get status(){return jt},activeAgentCount:g.u32().name(`active_agent_count`),quorum:g.u16(),approvalThreshold:g.u16().name(`approval_threshold`),vetoThreshold:g.u16().name(`veto_threshold`),upVotes:g.u16().name(`up_votes`),downVotes:g.u16().name(`down_votes`),vetoCount:g.u16().name(`veto_count`),totalVotes:g.u16().name(`total_votes`),createdBy:g.string().name(`created_by`),createdAt:g.timestamp().name(`created_at`),updatedAt:g.timestamp().name(`updated_at`),computedScore:g.f64().name(`computed_score`)}),dn=g.row({identity:g.identity().primaryKey(),get role(){return N}}),fn=g.row({id:g.u64().primaryKey(),channelId:g.u64().name(`channel_id`),senderId:g.string().name(`sender_id`),content:g.string(),get messageType(){return P.name(`message_type`)},contextId:g.option(g.string()).name(`context_id`),createdAt:g.timestamp().name(`created_at`)}),pn=g.row({projectId:g.u64().primaryKey().name(`project_id`),createdAt:g.timestamp().name(`created_at`)}),mn=g.row({id:g.u64().primaryKey(),projectId:g.u64().name(`project_id`),senderId:g.string().name(`sender_id`),content:g.string(),get messageType(){return P.name(`message_type`)},contextId:g.option(g.string()).name(`context_id`),createdAt:g.timestamp().name(`created_at`)}),hn=g.row({id:g.u64().primaryKey(),sourceIdeaId:g.u64().name(`source_idea_id`),name:g.string(),githubRepo:g.string().name(`github_repo`),description:g.string(),get status(){return Mt},createdAt:g.timestamp().name(`created_at`),createdBy:g.string().name(`created_by`)}),gn=g.row({id:g.u64().primaryKey(),taskId:g.u64().name(`task_id`),dependsOnId:g.u64().name(`depends_on_id`),get dependencyType(){return Et.name(`dependency_type`)},createdAt:g.timestamp().name(`created_at`)}),_n=g.row({id:g.u64().primaryKey(),projectId:g.u64().name(`project_id`),title:g.string(),description:g.string(),get status(){return F},assignedTo:g.option(g.string()).name(`assigned_to`),claimedAt:g.option(g.timestamp()).name(`claimed_at`),githubIssueUrl:g.option(g.string()).name(`github_issue_url`),githubPrUrl:g.option(g.string()).name(`github_pr_url`),priority:g.u8(),sourceIdeaId:g.option(g.u64()).name(`source_idea_id`),reviewCount:g.u8().name(`review_count`),get blockedFromStatus(){return g.option(F).name(`blocked_from_status`)},archivedReason:g.option(g.string()).name(`archived_reason`),statusChangedBy:g.option(g.identity()).name(`status_changed_by`),statusChangedAt:g.option(g.timestamp()).name(`status_changed_at`),createdAt:g.timestamp().name(`created_at`),updatedAt:g.timestamp().name(`updated_at`),createdBy:g.string().name(`created_by`)}),vn=g.row({id:g.u64().primaryKey(),agentId:g.identity().name(`agent_id`),seq:g.u64(),agentName:g.string().name(`agent_name`),transcript:g.string(),audioUrl:g.string().name(`audio_url`),get status(){return Tt},contextType:g.option(g.string()).name(`context_type`),contextId:g.option(g.u64()).name(`context_id`),finalizedAt:g.option(g.timestamp()).name(`finalized_at`),failedAt:g.option(g.timestamp()).name(`failed_at`),errorMessage:g.option(g.string()).name(`error_message`),createdAt:g.timestamp().name(`created_at`)}),yn=g.row({id:g.u64().primaryKey(),ideaId:g.u64().name(`idea_id`),agentId:g.string().name(`agent_id`),get voteType(){return Nt.name(`vote_type`)},get scores(){return g.array(Dt)},createdAt:g.timestamp().name(`created_at`)});const bn=Te({agents:_({name:`agents`,indexes:[{accessor:`id`,name:`agents_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`identity`,name:`agents_identity_idx_btree`,algorithm:`btree`,columns:[`identity`]}],constraints:[{name:`agents_id_key`,constraint:`unique`,columns:[`id`]},{name:`agents_identity_key`,constraint:`unique`,columns:[`identity`]}]},an),channels:_({name:`channels`,indexes:[{accessor:`id`,name:`channels_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_name`,name:`channels_name_idx_btree`,algorithm:`btree`,columns:[`name`]}],constraints:[{name:`channels_id_key`,constraint:`unique`,columns:[`id`]}]},on),config:_({name:`config`,indexes:[{accessor:`key`,name:`config_key_idx_btree`,algorithm:`btree`,columns:[`key`]}],constraints:[{name:`config_key_key`,constraint:`unique`,columns:[`key`]}]},sn),discovered_tasks:_({name:`discovered_tasks`,indexes:[{accessor:`by_created_at`,name:`discovered_tasks_created_at_idx_btree`,algorithm:`btree`,columns:[`createdAt`]},{accessor:`id`,name:`discovered_tasks_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_priority`,name:`discovered_tasks_priority_idx_btree`,algorithm:`btree`,columns:[`priority`]},{accessor:`by_status`,name:`discovered_tasks_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`discovered_tasks_id_key`,constraint:`unique`,columns:[`id`]}]},cn),evaluation_dimensions:_({name:`evaluation_dimensions`,indexes:[{accessor:`by_active`,name:`evaluation_dimensions_active_sort_order_idx_btree`,algorithm:`btree`,columns:[`active`,`sortOrder`]},{accessor:`id`,name:`evaluation_dimensions_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`evaluation_dimensions_id_key`,constraint:`unique`,columns:[`id`]}]},ln),ideas:_({name:`ideas`,indexes:[{accessor:`id`,name:`ideas_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_status`,name:`ideas_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`ideas_id_key`,constraint:`unique`,columns:[`id`]}]},un),identity_roles:_({name:`identity_roles`,indexes:[{accessor:`identity`,name:`identity_roles_identity_idx_btree`,algorithm:`btree`,columns:[`identity`]}],constraints:[{name:`identity_roles_identity_key`,constraint:`unique`,columns:[`identity`]}]},dn),messages:_({name:`messages`,indexes:[{accessor:`by_channel`,name:`messages_channel_id_created_at_idx_btree`,algorithm:`btree`,columns:[`channelId`,`createdAt`]},{accessor:`id`,name:`messages_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`messages_id_key`,constraint:`unique`,columns:[`id`]}]},fn),project_channels:_({name:`project_channels`,indexes:[{accessor:`project_id`,name:`project_channels_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]}],constraints:[{name:`project_channels_project_id_key`,constraint:`unique`,columns:[`projectId`]}]},pn),project_messages:_({name:`project_messages`,indexes:[{accessor:`id`,name:`project_messages_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_project`,name:`project_messages_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]}],constraints:[{name:`project_messages_id_key`,constraint:`unique`,columns:[`id`]}]},mn),projects:_({name:`projects`,indexes:[{accessor:`id`,name:`projects_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_source_idea_id`,name:`projects_source_idea_id_idx_btree`,algorithm:`btree`,columns:[`sourceIdeaId`]}],constraints:[{name:`projects_id_key`,constraint:`unique`,columns:[`id`]}]},hn),task_dependencies:_({name:`task_dependencies`,indexes:[{accessor:`by_depends_on_id`,name:`task_dependencies_depends_on_id_idx_btree`,algorithm:`btree`,columns:[`dependsOnId`]},{accessor:`id`,name:`task_dependencies_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_task_id`,name:`task_dependencies_task_id_idx_btree`,algorithm:`btree`,columns:[`taskId`]}],constraints:[{name:`task_dependencies_id_key`,constraint:`unique`,columns:[`id`]}]},gn),tasks:_({name:`tasks`,indexes:[{accessor:`by_assigned_to`,name:`tasks_assigned_to_idx_btree`,algorithm:`btree`,columns:[`assignedTo`]},{accessor:`id`,name:`tasks_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_priority`,name:`tasks_priority_idx_btree`,algorithm:`btree`,columns:[`priority`]},{accessor:`by_project_id`,name:`tasks_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]},{accessor:`by_status`,name:`tasks_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`tasks_id_key`,constraint:`unique`,columns:[`id`]}]},_n),voice_announcements:_({name:`voice_announcements`,indexes:[{accessor:`by_agent`,name:`voice_announcements_agent_id_created_at_idx_btree`,algorithm:`btree`,columns:[`agentId`,`createdAt`]},{accessor:`id`,name:`voice_announcements_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_status`,name:`voice_announcements_status_created_at_idx_btree`,algorithm:`btree`,columns:[`status`,`createdAt`]}],constraints:[{name:`voice_announcements_id_key`,constraint:`unique`,columns:[`id`]}]},vn),votes:_({name:`votes`,indexes:[{accessor:`id`,name:`votes_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_idea_agent`,name:`votes_idea_id_agent_id_idx_btree`,algorithm:`btree`,columns:[`ideaId`,`agentId`]},{accessor:`by_idea`,name:`votes_idea_id_idx_btree`,algorithm:`btree`,columns:[`ideaId`]}],constraints:[{name:`votes_id_key`,constraint:`unique`,columns:[`id`]}]},yn)}),xn=we(h(`add_task_dependency`,Pt),h(`claim_task`,Ft),h(`create_project`,It),h(`create_task`,Lt),h(`discover_task`,Rt),h(`fail_voice_announcement`,zt),h(`finalize_voice_announcement`,Bt),h(`heartbeat`,Vt),h(`mark_idea_implemented`,Ht),h(`propose_idea`,Ut),h(`register_agent`,Wt),h(`review_discovered_task`,Gt),h(`seed_ui_data`,Kt),h(`seed_voice_announcements`,qt),h(`send_message`,Jt),h(`send_project_message`,Yt),h(`set_agent_status`,Xt),h(`update_agent_bio`,Zt),h(`update_agent_capabilities`,Qt),h(`update_project_status`,$t),h(`update_task_status`,en),h(`vote_idea`,tn)),Sn=Ce(Se(`generate_voice`,nn,rn)),Cn={versionInfo:{cliVersion:`2.1.0`},tables:bn.schemaType.tables,reducers:xn.reducersType.reducers,...Sn};xe(bn.schemaType),be(xn.reducersType.reducers);var wn=class extends ye{},Tn=class extends _e{},En=class e extends ve{static builder=()=>new Tn(Cn,t=>new e(t));subscriptionBuilder=()=>new wn(this)};function I(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}var L=class e{conn;identity;token;auth;config;disposed=!1;constructor(e,t,n,r,i){this.conn=e,this.config=t,this.identity=n,this.token=r,this.auth=i}get db(){return this.conn.db}iter(e){let t=this.db[e];return t?.iter?Array.from(t.iter()):[]}async[Symbol.asyncDispose](){this.disposed||(this.disposed=!0,this.conn.disconnect())}static async create(t={}){let n=await b(),r=t.host||n.spacetime.host,i=t.module||n.spacetime.module,a=t.wallet||n.defaultWallet,o=t.token,s;if(!o&&a){let e=await A(a);e&&(o=e.token,s={wallet:a,token:e.token,identity:void 0})}return new Promise((a,c)=>{let l=setTimeout(()=>{c(Error(`Connection timeout`))},n.requestTimeout),u=console.log,d=console.error;console.log=(...e)=>{e.some(e=>typeof e==`string`&&e.includes(`Connecting to SpacetimeDB WS...`))||u(...e)},console.error=(...e)=>{process.env.PROBE_DEBUG&&d(`[probe:debug]`,...e)};try{En.builder().withUri(r).withDatabaseName(i).withToken(o||void 0).onConnect((r,i,o)=>{clearTimeout(l),s&&(s.identity=i),t.subscribe===!1?a(new e(r,n,i,o,s)):r.subscriptionBuilder().onApplied(()=>{a(new e(r,n,i,o,s))}).onError(e=>{c(Error(`Subscription error: ${e.event?.message||`Unknown error`}`))}).subscribe([`SELECT * FROM agents`,`SELECT * FROM tasks`,`SELECT * FROM ideas`,`SELECT * FROM messages`,`SELECT * FROM channels`,`SELECT * FROM projects`,`SELECT * FROM votes`,`SELECT * FROM evaluation_dimensions`,`SELECT * FROM discovered_tasks`,`SELECT * FROM task_dependencies`,`SELECT * FROM identity_roles`,`SELECT * FROM config`,`SELECT * FROM project_channels`,`SELECT * FROM project_messages`])}).onDisconnect((...e)=>{t.onDisconnect?.(...e)}).onConnectError((e,t)=>{clearTimeout(l);let n=t.message.toLowerCase();n.includes(`unauthorized`)||n.includes(`401`)?c(Error("Authentication required. Run `probe auth <wallet> --save` first.")):c(Error(`Connection failed: ${t.message}`))}).build()}finally{console.log=u,console.error=d}})}};async function Dn(e){let t=await b(),n=e.wallet||t.defaultWallet;n||w(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`),await M(n)||w(`WALLET_NOT_FOUND`,`Wallet not found: ${n}`);let r=await A(n);return r||w(`AUTH_REQUIRED`,"No cached token. Run `probe auth <wallet> --save` first."),L.create({...e,wallet:n,token:r.token})}async function R(e,t){try{var n=I();return await t(n.a(await Dn(e)))}catch(e){n.e=e}finally{await n.d()}}async function z(e,t,n){let r=e.conn.reducers[t];if(typeof r!=`function`)throw Error(`Reducer not found: ${t}`);let i=Math.max(1e3,e.config.requestTimeout),a;await Promise.race([r(n).finally(()=>clearTimeout(a)),new Promise((e,n)=>{a=setTimeout(()=>n(Error(`Reducer timed out after ${i}ms: ${t}`)),i)})])}async function On(e,t,n){let r=e.conn.procedures[t.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())];if(typeof r!=`function`)throw Error(`Procedure not found: ${t}`);return await r(n)}function kn(e){return Ee(e)}function B(e,t,n){if(t.length===0)return Ee({[e]:[]});let r=n||Object.keys(t[0]),i=t.map(e=>{let t={};for(let n of r)t[n]=e[n];return t});return Ee({[e]:i})}var An=t({meta:{name:`doctor`,description:`Run environment and connectivity diagnostics`},args:{wallet:{type:`string`,description:`Wallet name override for auth checks`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&x(!0),k()){O({command:`probe doctor`,description:`Validate Probe config, auth, and Nexus connectivity`,usage:[`probe doctor`,`probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus`],options:[{name:`--wallet`,detail:`Wallet override for auth checks`},{name:`--host, --module`,detail:`SpacetimeDB overrides`},{name:`--json`,detail:`JSON output mode`}]});return}let t=[],n=(e,n,r)=>{t.push({check:e,status:n,detail:r})},r=null;try{r=await b(),n(`config`,`pass`,`Loaded Probe configuration`)}catch(e){n(`config`,`fail`,e instanceof Error?e.message:`Failed to load configuration`)}let i=e.wallet||r?.defaultWallet;i?n(`wallet.selected`,`pass`,`Using wallet '${i}'`):n(`wallet.selected`,`fail`,`No wallet selected (set --wallet or defaultWallet)`);let a=!1;if(i){let e=await M(i);e?(a=!0,n(`wallet.exists`,`pass`,`Address ${e.address}`)):n(`wallet.exists`,`fail`,`Wallet '${i}' not found`)}let o=null;if(i&&a){let e=await A(i);if(!e)n(`auth.token`,`fail`,`No cached token (run probe auth)`);else{o=e.token;let t=new Date(e.expiresAt);Number.isNaN(t.getTime())?n(`auth.token`,`warn`,`Token exists but expiry is invalid`):t.getTime()<=Date.now()?n(`auth.token`,`fail`,`Token expired at ${t.toISOString()}`):n(`auth.token`,`pass`,`Token valid until ${t.toISOString()}`)}}if(r){let t=e.host||r.spacetime.host,a=e.module||r.spacetime.module;if(n(`nexus.target`,`pass`,`${t} / ${a}`),o)try{try{var s=I();n(`nexus.connect`,`pass`,`Connected as ${s.a(await L.create({host:t,module:a,wallet:i,token:o,subscribe:!1})).identity?.toHexString()||`unknown`}`)}catch(e){s.e=e}finally{await s.d()}}catch(e){n(`nexus.connect`,`fail`,e instanceof Error?e.message:`Connection failed`)}else n(`nexus.connect`,`warn`,`Skipped connection check (no valid token)`)}let c=t.reduce((e,t)=>(t.status===`pass`?e.pass+=1:t.status===`warn`?e.warn+=1:e.fail+=1,e),{pass:0,warn:0,fail:0}),l=c.fail===0;C({ok:l,counts:c,checks:t}),S()||(console.log(B(`doctor_checks`,t)),console.log(B(`doctor_summary`,[{ok:l,...c}])))}});const V={values:[`Open`,`Claimed`,`InProgress`,`Review`,`Completed`,`Blocked`,`Archived`],is:{open:e=>e.tag===`Open`,claimed:e=>e.tag===`Claimed`,inProgress:e=>e.tag===`InProgress`,review:e=>e.tag===`Review`,completed:e=>e.tag===`Completed`,blocked:e=>e.tag===`Blocked`,archived:e=>e.tag===`Archived`,active:e=>[`Open`,`Claimed`,`InProgress`,`Review`].includes(e.tag),terminal:e=>[`Completed`,`Blocked`,`Archived`].includes(e.tag)},fromString(e){return{open:{tag:`Open`},claimed:{tag:`Claimed`},in_progress:{tag:`InProgress`},inprogress:{tag:`InProgress`},review:{tag:`Review`},completed:{tag:`Completed`},merged:{tag:`Completed`},blocked:{tag:`Blocked`},archived:{tag:`Archived`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Open`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return n===`merged`?e.tag===`Completed`:e.tag.toLowerCase()===n},display(e){return{InProgress:`IN PROGRESS`}[e.tag]??e.tag.toUpperCase()}},jn={values:[`Voting`,`ApprovedForProject`,`Rejected`,`Implemented`],is:{voting:e=>e.tag===`Voting`,approved:e=>e.tag===`ApprovedForProject`,rejected:e=>e.tag===`Rejected`,implemented:e=>e.tag===`Implemented`,active:e=>e.tag===`Voting`,terminal:e=>[`ApprovedForProject`,`Rejected`,`Implemented`].includes(e.tag)},fromString(e){return{voting:{tag:`Voting`},approved:{tag:`ApprovedForProject`},approved_for_project:{tag:`ApprovedForProject`},rejected:{tag:`Rejected`},implemented:{tag:`Implemented`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Voting`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return n===`approved`?e.tag===`ApprovedForProject`:e.tag.toLowerCase()===n},display(e){return e.tag===`ApprovedForProject`?`Approved`:e.tag}},Mn={values:[`Zoe`,`Admin`,`Zeno`],is:{zoe:e=>e.tag===`Zoe`,admin:e=>e.tag===`Admin`,zeno:e=>e.tag===`Zeno`,privileged:e=>[`Zoe`,`Admin`].includes(e.tag)},fromString(e){return{zoe:{tag:`Zoe`},admin:{tag:`Admin`},zeno:{tag:`Zeno`}}[e.toLowerCase()]??{tag:`Zeno`}},display(e){return e.tag.toLowerCase()}},H={values:[`Online`,`Offline`,`Working`],is:{online:e=>e.tag===`Online`,offline:e=>e.tag===`Offline`,working:e=>e.tag===`Working`,available:e=>e.tag===`Online`||e.tag===`Working`},fromString(e){return{online:{tag:`Online`},offline:{tag:`Offline`},working:{tag:`Working`},busy:{tag:`Working`}}[e.toLowerCase()]??{tag:`Offline`}},display(e){return e.tag}},U={values:[`User`,`System`,`Directive`],is:{user:e=>e.tag===`User`,system:e=>e.tag===`System`,directive:e=>e.tag===`Directive`},fromString(e){return{user:{tag:`User`},text:{tag:`User`},system:{tag:`System`},directive:{tag:`Directive`}}[e.toLowerCase()]??{tag:`User`}},display(e){return e.tag.toLowerCase()}},W={values:[`Active`,`Paused`],is:{active:e=>e.tag===`Active`,paused:e=>e.tag===`Paused`},fromString(e){return{active:{tag:`Active`},paused:{tag:`Paused`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Active`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return e.tag.toLowerCase()===n},display(e){return e.tag.toLowerCase()}},Nn=[`connection`,`subscription error`,`authentication required`,`unauthorized`,`401`,`econnrefused`,`etimedout`,`enotfound`,`timeout`],Pn=e=>{let t=e.toLowerCase();return Nn.some(e=>t.includes(e))},G=e=>{Pn(e)&&w(`CONNECTION_ERROR`,e),w(`UNEXPECTED_ERROR`,e)},K=e=>{if(!e||typeof e!=`object`||!(`microsSinceUnixEpoch`in e))return 0n;let t=e.microsSinceUnixEpoch;return typeof t==`bigint`?t:BigInt(t)},q=(e,t=``)=>{let n=K(e);return n<=0n?t||String(e??``):new Date(Number(n/1000n)).toISOString().replace(`T`,` `)},Fn=e=>e?[...new Set(e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean))]:[],J=e=>e.iter(`agents`).find(t=>t.identity.toHexString()===e.identity?.toHexString()),In=(e,t)=>({id:e.id,name:e.name,role:Mn.display(e.role),status:H.display(e.status),lastHeartbeat:q(e.lastHeartbeat),currentTaskId:e.currentTaskId?e.currentTaskId.toString():``,capabilities:e.capabilities.join(`,`),identity:t||``}),Ln=e=>({agentId:e.id,name:e.name,bio:e.bio}),Rn=async e=>{let t=e.action;t||w(`ACTION_REQUIRED`,`Agent action required`);try{switch(t){case`register`:{let t=e.agentId,n=e.name,r=e.role||`zeno`;(!t||!n)&&w(`ARGS_REQUIRED`,`Agent ID and name required`);let i=await b(),a=e.wallet||i.defaultWallet;!e.address&&!a&&w(`WALLET_REQUIRED`,`--address or --wallet required (or set default wallet)`);let o=e.address,s=Fn(e.capabilities);if(!o&&a){let e=await M(a);e||w(`WALLET_NOT_FOUND`,`Wallet not found: ${a}`),o=e.address}try{await R({host:e.host,module:e.module,wallet:a},async e=>{await z(e,`registerAgent`,{agentId:t,name:n,role:Mn.fromString(r),zenonAddress:o}),s.length>0&&await z(e,`updateAgentCapabilities`,{capabilities:s}),await new Promise(e=>setTimeout(e,500)),e.iter(`agents`).find(e=>e.id===t)||((r===`zoe`||r===`admin`)&&w(`UNAUTHORIZED`,`Only whitelisted identities can register as zoe or admin`),w(`REGISTRATION_FAILED`,`Registration failed`))}),C({registered:!0,agentId:t,name:n,role:r,address:o,capabilities:s}),S()||console.log(B(`agent_registered`,[{agentId:t,name:n,role:r,address:o,capabilities:s.join(`,`)}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`status`:(e.agentId||e.task||e.capabilities)&&w(`INVALID_USAGE`,"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status."),await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=J(e);t||w(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),C(t),S()||console.log(B(`agent`,[In(t,e.identity?.toHexString())]))});break;case`set-status`:{let t=e.agentId;t||w(`STATUS_REQUIRED`,`Status required. Use: online, offline, working, busy`),e.capabilities&&w(`INVALID_USAGE`,"Use `probe agent capabilities --set <list>` to update capabilities.");let n=t.toLowerCase();new Set([`online`,`offline`,`working`,`busy`]).has(n)||w(`INVALID_STATUS`,`Invalid status: ${t}. Use: online, offline, working, busy`);let r=H.fromString(n),i=H.is.working(r);i&&!e.task&&w(`TASK_REQUIRED`,`--task is required when setting status to working`),!i&&e.task&&w(`TASK_NOT_ALLOWED`,`--task is only allowed when setting status to working`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{await z(t,`setAgentStatus`,{status:r,taskId:i?BigInt(e.task):void 0})}),C({updated:!0,status:n,taskId:e.task||null}),S()||console.log(B(`agent_status_updated`,[{status:n,taskId:e.task||``}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`capabilities`:{e.set||w(`CAPABILITIES_REQUIRED`,`--set is required`);let t=Fn(e.set);try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{await z(e,`updateAgentCapabilities`,{capabilities:t});let n=J(e);C({updated:!0,agentId:n?.id,capabilities:t}),S()||console.log(B(`agent_capabilities_updated`,[{agentId:n?.id||``,capabilities:t.join(`,`)}]))})}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`me`:await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=J(e);t||w(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),C(t),S()||console.log(B(`agent`,[In(t,e.identity?.toHexString())]))});break;case`bio`:{let t=e.agentId?.trim(),r=typeof e.set==`string`,i=!!e.clear,a=!!t,o=e.agent?.trim();if(r&&i&&w(`INVALID_USAGE`,`Use either --set or --clear, not both.`),r&&a&&w(`INVALID_USAGE`,`Provide bio text either as positional argument or --set, not both.`),o&&(r||i||a)&&w(`INVALID_USAGE`,`--agent is read-only. Do not combine with --set, --clear, or positional bio text.`),r||i||a){let n=i?``:(r?e.set:t)||``;try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{await z(e,`updateAgentBio`,{bio:n});let t=J(e);C({updated:!0,agentId:t?.id,bio:n}),S()||console.log(B(`agent_bio_updated`,[{agentId:t?.id||``,bio:n}]))})}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}if(o)try{var n=I();let t=n.a(await L.create({host:e.host,module:e.module})).iter(`agents`).find(e=>e.id===o);t||w(`AGENT_NOT_FOUND`,`Agent not found: ${o}`),C(Ln(t)),S()||console.log(B(`agent_bio`,[Ln(t)]));break}catch(e){n.e=e}finally{await n.d()}await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=J(e);t||w(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),C(Ln(t)),S()||console.log(B(`agent_bio`,[Ln(t)]))});break}case`heartbeat`:try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=J(e);t||w(`NOT_REGISTERED`,`Agent not registered`),await z(e,`heartbeat`,{agentId:t.id}),C({heartbeat:!0}),S()||console.log(B(`agent_heartbeat`,[{agentId:t.id,status:H.display(t.status)}]))})}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`list`:try{var r=I();let t=r.a(await L.create({host:e.host,module:e.module})),n=e.limit?parseInt(e.limit,10):void 0;n!==void 0&&(!Number.isFinite(n)||n<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=t.iter(`agents`).filter(e=>!H.is.offline(e.status));i=i.sort((e,t)=>{let n=K(e.lastHeartbeat||e.createdAt||e.lastActiveAt),r=K(t.lastHeartbeat||t.createdAt||t.lastActiveAt);return n===r?t.id.localeCompare(e.id):r>n?1:-1}),n!==void 0&&(i=i.slice(0,n)),C({agents:i,count:i.length}),S()||console.log(B(`agents`,i.map(e=>({id:e.id,name:e.name,role:Mn.display(e.role),status:H.display(e.status),last_heartbeat:q(e.lastHeartbeat),capabilities:e.capabilities.join(`,`)}))));break}catch(e){r.e=e}finally{await r.d()}case`identity`:await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{let n=t.identity?.toHexString();C({identity:n,wallet:e.wallet}),S()||console.log(B(`identity`,[{identity:n||``,wallet:e.wallet||``}]))});break;case`voice`:{let t=e.agentId?.trim();t||w(`TRANSCRIPT_REQUIRED`,`Transcript required. Provide as first positional argument.`),t.length>500&&w(`TRANSCRIPT_TOO_LONG`,`Transcript exceeds 500 characters.`),e.audioUrl||w(`AUDIO_URL_REQUIRED`,`--audioUrl is required for voice announcements.`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{let r=e.contextType||`status_update`,i=await On(n,`generate_voice`,{transcript:t,audioUrl:e.audioUrl,contextType:r});C({ok:!0,announcementId:i.id,seq:i.seq,agentName:i.agentName,keyPrefix:i.keyPrefix,audioUrl:e.audioUrl,contextType:r}),S()||console.log(B(`voice_announcement`,[{id:i.id,seq:i.seq,agentName:i.agentName,keyPrefix:i.keyPrefix,audioUrl:e.audioUrl||``}]))})}catch(e){w(`PROCEDURE_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice`)}}catch(e){G(e instanceof Error?e.message:String(e))}};var zn=t({meta:{name:`agent`,description:`Agent management`},args:{action:{type:`positional`,description:`Action: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice`,required:!1},agentId:{type:`positional`,description:`Action-dependent value (agent ID, status, bio text, or transcript)`,required:!1},name:{type:`positional`,description:`Display name`,required:!1},role:{type:`positional`,description:`Role: zoe, admin, zeno`,required:!1},address:{type:`string`,description:`Zenon address`},wallet:{type:`string`,description:`Wallet name`},task:{type:`string`,description:`Current task ID`},limit:{type:`string`,description:`Limit agents returned for list`},capabilities:{type:`string`,description:`Comma-separated capability list`},set:{type:`string`,description:`Set capabilities for capabilities action or bio text for bio action`},agent:{type:`string`,description:`Agent ID for bio action lookup`},clear:{type:`boolean`,description:`Clear bio for bio action`},json:{type:`boolean`,description:`Output JSON`,default:!1},audioUrl:{type:`string`,description:`Audio URL for voice announcements`},contextType:{type:`string`,description:`Context type for voice (default: status_update)`},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe agent`,description:`Agent lifecycle and identity commands`,usage:[`probe agent <action> [options]`,`probe agent register agent-1 "Builder" zeno --wallet my-wallet`,`probe agent set-status working --task 42`,`probe agent capabilities --set "gh,coding,review"`,`probe agent bio "Build systems and task orchestration"`,`probe agent heartbeat`,`probe agent voice "Hello from Zoe" --audioUrl https://audio.zenon.red/voice/zoe/123.mp3`],actions:[{name:`register <agentId> <name> [role]`,detail:`Register a new agent identity`},{name:`status`,detail:`Show current agent status`},{name:`set-status <online|offline|working|busy>`,detail:`Update current agent status`},{name:`capabilities --set <list>`,detail:`Set capabilities for authenticated agent`},{name:`bio [--set <text>|--clear|--agent <id>]`,detail:`View or update agent bio`},{name:`me`,detail:`Show current authenticated agent profile`},{name:`heartbeat`,detail:`Send heartbeat only`},{name:`list`,detail:`List online agents`},{name:`identity`,detail:`Show current authenticated identity`},{name:`voice <transcript> --audioUrl <url>`,detail:`Submit a voice announcement (BYO audio URL)`}],options:[{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--address`,detail:`Zenon address for register`},{name:`--task`,detail:`Task ID required with status working`},{name:`--limit`,detail:`Max agents returned for list`},{name:`--capabilities`,detail:`Comma-separated capabilities for register/status`},{name:`--set`,detail:`Set value for capabilities or bio action`},{name:`--agent`,detail:`Agent ID for bio action lookup`},{name:`--clear`,detail:`Clear bio for authenticated agent`},{name:`--audioUrl`,detail:`Audio URL for voice announcements (required)`},{name:`--contextType`,detail:`Context type for voice (default: status_update)`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.`,"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.","`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status."]});return}await Rn(e)}});const Bn=e=>{let t=e.toLowerCase();return t===`approve`?{tag:`ApproveAsTask`}:t===`reject`?{tag:`Reject`}:t===`escalate_to_idea`?{tag:`EscalateToIdea`}:null},Vn=e=>e&&typeof e==`object`&&`tag`in e?String(e.tag):String(e),Hn=e=>{let t=Vn(e);return{PendingReview:`pending_review`,Approved:`approved`,Rejected:`rejected`,EscalatedToIdea:`escalated_to_idea`}[t]??t};var Un=t({meta:{name:`discover`,description:`Discovered task management`},args:{action:{type:`positional`,description:`Action: report, review, list, get`,required:!1},id:{type:`positional`,description:`Discovered task ID`,required:!1},decision:{type:`positional`,description:`Decision: approve, reject, escalate_to_idea`,required:!1},task:{type:`string`,description:`Current task ID`},project:{type:`string`,description:`Project ID`},title:{type:`string`,description:`Task title`},type:{type:`string`,description:`Task type: bug, improvement, feature`},severity:{type:`string`,description:`Severity: low, medium, high, critical`},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit discovered tasks returned`},description:{type:`string`,description:`Description`},reason:{type:`string`,description:`Rejection reason`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe discover`,description:`Discovered task reporting and review`,usage:[`probe discover <action> [options]`,`probe discover report --task 12 --project 1 --title "Fix parse"`,`probe discover review 9 approve`],actions:[{name:`report`,detail:`Report a discovered task from current work`},{name:`review <id> <approve|reject|escalate_to_idea>`,detail:`Approve, reject, or escalate discovery`},{name:`list`,detail:`List discovered tasks`},{name:`get <id>`,detail:`Show one discovered task`}],options:[{name:`--task, --project, --title`,detail:`Required for report`},{name:`--type`,detail:`Task type: bug, improvement, feature`},{name:`--severity`,detail:`Severity: low, medium, high, critical`},{name:`--reason`,detail:`Reason for rejection/escalation`},{name:`--limit`,detail:`Max discovered tasks returned for list`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:["Find current task IDs with `probe task list` and project IDs with `probe project list`."]});return}let t=e.action;try{switch(t){case`report`:(!e.task||!e.project||!e.title)&&w(`ARGS_REQUIRED`,`--task, --project, and --title required`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{await z(t,`discoverTask`,{currentTaskId:BigInt(e.task),projectId:BigInt(e.project),title:e.title,description:e.description||``,priority:5,taskType:e.type||`improvement`,severity:e.severity||`medium`})}),C({reported:!0,title:e.title}),S()||console.log(B(`discovery_reported`,[{title:e.title,taskId:e.task,projectId:e.project}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`review`:{let t=e.id,n=e.decision;(!t||!n)&&w(`ARGS_REQUIRED`,`ID and decision required`);let r=n.toLowerCase(),i=[`approve`,`reject`,`escalate_to_idea`];i.includes(r)||w(`INVALID_DECISION`,`Invalid decision: ${n}. Use: ${i.join(`, `)}`);let a=Bn(r);a||w(`INVALID_DECISION`,`Invalid decision: ${n}. Use: ${i.join(`, `)}`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{await z(n,`reviewDiscoveredTask`,{discoveryId:BigInt(t),decision:a,reason:e.reason||void 0})}),C({reviewed:!0,id:t,decision:r}),S()||console.log(B(`discovery_reviewed`,[{id:t,decision:r,reason:e.reason||``}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`list`:try{var n=I();let t=n.a(await L.create({host:e.host,module:e.module})).iter(`discovered_tasks`),r=e.limit?parseInt(e.limit,10):void 0;if(r!==void 0&&(!Number.isFinite(r)||r<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status){let n=e.status.toLowerCase().replace(/[_\s]/g,``);t=t.filter(e=>Hn(e.status).replace(/[_\s]/g,``)===n)}t=t.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),r!==void 0&&(t=t.slice(0,r)),C({discoveredTasks:t,count:t.length}),S()||console.log(B(`discovered_tasks`,t.map(e=>({id:e.id.toString(),title:e.title,taskType:e.taskType,severity:e.severity,status:Hn(e.status),projectId:e.projectId}))));break}catch(e){n.e=e}finally{await n.d()}case`get`:try{var r=I();let t=e.id;t||w(`DISCOVERY_ID_REQUIRED`,`Discovery ID required`);let n=r.a(await L.create({host:e.host,module:e.module})).iter(`discovered_tasks`).find(e=>e.id.toString()===t);n||w(`DISCOVERY_NOT_FOUND`,`Discovery not found: ${t}`),C(n),S()||console.log(B(`discovered_task`,[{id:n.id.toString(),title:n.title,status:Hn(n.status),taskType:n.taskType,severity:n.severity,priority:n.priority,projectId:n.projectId.toString(),currentTaskId:n.currentTaskId.toString(),description:n.description,reviewedBy:n.reviewedBy||``,reviewedAt:n.reviewedAt?q(n.reviewedAt):``,rejectionReason:n.rejectionReason||``,createdTaskId:n.createdTaskId?n.createdTaskId.toString():``}]));break}catch(e){r.e=e}finally{await r.d()}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: report, review, list, get`)}}catch(e){G(e instanceof Error?e.message:String(e))}}});const Wn=[[`ecosystem-impact`,`ecosystem_impact`],[`implementation-readiness`,`implementation_readiness`],[`dependency-independence`,`dependency_independence`],[`documentation-leverage`,`documentation_leverage`],[`maintenance-sustainability`,`maintenance_sustainability`],[`agent-capability-fit`,`agent_capability_fit`],[`execution-clarity`,`execution_clarity`]],Gn=e=>e.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),Kn=e=>e.map(e=>({id:e.id.toString(),title:e.title,category:e.category,status:jn.display(e.status),votes:`${e.totalVotes}/${e.quorum}`,up:e.upVotes,veto:e.vetoCount}));function qn(e,t){let n=Number(e);return Number.isInteger(n)||w(`INVALID_SCORES`,`Score for '${t}' must be an integer`),n}function Jn(e,t){let n=t.filter(e=>e.active).sort((e,t)=>e.sortOrder-t.sortOrder),r=new Map(e.map(e=>[e.dimension,e.score]));for(let e of n){r.has(e.name)||w(`MISSING_DIMENSION`,`Missing score for dimension: ${e.label||e.name}`);let t=r.get(e.name);(t<e.minScore||t>e.maxScore)&&w(`INVALID_SCORE`,`Score for '${e.name}' must be between ${e.minScore} and ${e.maxScore}`)}let i=new Set(n.map(e=>e.name));for(let t of e)i.has(t.dimension)||w(`UNKNOWN_DIMENSION`,`Unknown dimension: ${t.dimension}`)}function Yn(e,t,n){let r=t.trim().replaceAll(`-`,`_`);r||w(`INVALID_SCORES`,`Dimension names cannot be empty`),e.has(r)&&w(`INVALID_SCORES`,`Dimension '${r}' was provided more than once`),e.set(r,{dimension:r,score:qn(n,r)})}function Xn(e){return e===void 0?[]:(Array.isArray(e)?e:[e]).flatMap(e=>String(e).split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf(`=`);return(t<=0||t===e.length-1)&&w(`INVALID_SCORES`,`--score entries must use dimension=value syntax`),[e.slice(0,t),e.slice(t+1)]}))}function Zn(e){let t=new Map;for(let[n,r]of Wn)e[n]!==void 0&&Yn(t,r,e[n]);for(let[n,r]of Xn(e.score))Yn(t,n,r);return t.size===0&&w(`ARGS_REQUIRED`,`Provide dimension scores with score flags or --score dimension=value`),[...t.values()]}var Qn=t({meta:{name:`idea`,description:`Idea management`},args:{action:{type:`positional`,description:`Action: list, pending, propose, vote, get, dimensions`,required:!1},id:{type:`positional`,description:`Idea ID`,required:!1},title:{type:`string`,description:`Idea title`},category:{type:`string`,description:`Category`},description:{type:`string`,description:`Description`},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit ideas returned`},"ecosystem-impact":{type:`string`,description:`Ecosystem Impact score`},"implementation-readiness":{type:`string`,description:`Implementation Readiness score`},"dependency-independence":{type:`string`,description:`Dependency Independence score`},"documentation-leverage":{type:`string`,description:`Documentation Leverage score`},"maintenance-sustainability":{type:`string`,description:`Maintenance Sustainability score`},"agent-capability-fit":{type:`string`,description:`Agent Capability Fit score`},"execution-clarity":{type:`string`,description:`Execution Clarity score`},score:{type:`string`,description:`Additional dimension score as name=value; repeatable`,multiple:!0},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe idea`,description:`Idea discovery, review, and voting`,usage:[`probe idea <action> [options]`,`probe idea list --status voting`,`probe idea dimensions`,`probe idea vote 42 --ecosystem-impact 8 --execution-clarity 9 --implementation-readiness 7`],actions:[{name:`list`,detail:`List ideas with optional filters`},{name:`pending`,detail:`List voting ideas you have not voted on`},{name:`get <id>`,detail:`Show one idea`},{name:`dimensions`,detail:`List active evaluation dimensions`},{name:`propose`,detail:`Propose a new idea`},{name:`vote <id>`,detail:`Vote on an idea with dimension scores`}],options:[{name:`--title`,detail:`Idea title for propose`},{name:`--description`,detail:`Idea description for propose`},{name:`--category`,detail:`Idea category for propose/list`},{name:`--ecosystem-impact`,detail:`Ecosystem impact score`},{name:`--implementation-readiness`,detail:`Implementation readiness score`},{name:`--dependency-independence`,detail:`Dependency independence score`},{name:`--documentation-leverage`,detail:`Documentation leverage score`},{name:`--maintenance-sustainability`,detail:`Maintenance sustainability score`},{name:`--agent-capability-fit`,detail:`Agent capability fit score`},{name:`--execution-clarity`,detail:`Execution clarity score`},{name:`--score`,detail:`Additional dimension score as name=value; repeatable`},{name:`--status`,detail:`Status filter for list`},{name:`--limit`,detail:`Max ideas returned for list/pending`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:["Find idea IDs with `probe idea list` before using get/vote.","Use `probe idea dimensions` to list active score dimensions.",`All active dimensions are required. Use explicit flags for default dimensions and repeatable --score name=value for custom dimensions.`,`If a missing-dimension error names a dimension without a dedicated flag, use --score and consider updating Probe.`]});return}let t=e.action;try{switch(t){case`list`:try{var n=I();let t=n.a(await L.create({host:e.host,module:e.module})).iter(`ideas`),r=e.limit?parseInt(e.limit,10):void 0;r!==void 0&&(!Number.isFinite(r)||r<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status&&(t=t.filter(t=>jn.matches(t.status,e.status))),e.category&&(t=t.filter(t=>t.category===e.category)),t=Gn(t),r!==void 0&&(t=t.slice(0,r)),C({ideas:t,count:t.length}),S()||console.log(B(`ideas`,Kn(t)));break}catch(e){n.e=e}finally{await n.d()}case`pending`:{let t=e.limit?parseInt(e.limit,10):void 0;t!==void 0&&(!Number.isFinite(t)||t<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`),await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let n=J(e);n||w(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first.");let r=new Set(e.iter(`votes`).filter(e=>e.agentId===n.id).map(e=>e.ideaId)),i=e.iter(`ideas`).filter(e=>jn.is.voting(e.status)).filter(e=>!r.has(e.id));i=Gn(i),t!==void 0&&(i=i.slice(0,t)),C({ideas:i,count:i.length}),S()||console.log(B(`ideas`,Kn(i)))});break}case`get`:try{var r=I();let t=e.id;t||w(`IDEA_ID_REQUIRED`,`Idea ID required`);let n=r.a(await L.create({host:e.host,module:e.module})).iter(`ideas`).find(e=>e.id.toString()===t);n||w(`IDEA_NOT_FOUND`,`Idea not found: ${t}`),C(n),S()||console.log(B(`idea`,[{id:n.id.toString(),title:n.title,category:n.category,status:jn.display(n.status),totalVotes:n.totalVotes,quorum:n.quorum,upVotes:n.upVotes,downVotes:n.downVotes,vetoCount:n.vetoCount,approvalThreshold:n.approvalThreshold,vetoThreshold:n.vetoThreshold,computedScore:n.computedScore,description:n.description}]));break}catch(e){r.e=e}finally{await r.d()}case`dimensions`:try{var i=I();let t=i.a(await L.create({host:e.host,module:e.module})).iter(`evaluation_dimensions`).filter(e=>e.active).sort((e,t)=>e.sortOrder-t.sortOrder);C({dimensions:t,count:t.length}),S()||console.log(B(`evaluation_dimensions`,t.map(e=>({name:e.name,label:e.label,weight:e.weight,range:`${e.minScore}-${e.maxScore}`,description:e.description}))));break}catch(e){i.e=e}finally{await i.d()}case`propose`:e.title||w(`ARGS_REQUIRED`,`Title required`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{await z(t,`proposeIdea`,{title:e.title,description:e.description||``,category:e.category||`general`})}),C({proposed:!0,title:e.title}),S()||console.log(B(`idea_proposed`,[{title:e.title,category:e.category||`general`}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`vote`:{let t=e.id;t||w(`ARGS_REQUIRED`,`Idea ID required`);let n=Zn(e);try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{Jn(n,e.iter(`evaluation_dimensions`)),await z(e,`voteIdea`,{ideaId:BigInt(t),scores:n})}),C({voted:!0,ideaId:t,scores:n}),S()||console.log(B(`idea_voted`,[{ideaId:t,scores:JSON.stringify(n)}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, pending, propose, vote, get, dimensions`)}}catch(e){G(e instanceof Error?e.message:String(e))}}});const $n=e=>/^\d+$/.test(e),er=(e,t)=>{if(!t)return!0;let n=t.trim();return n?e.id.toString()===n||(e.contextId||``)===n:!0},tr=e=>U.is.user(e),nr=e=>U.is.directive(e),rr=async e=>{let t=e.action;t||w(`ACTION_REQUIRED`,`Message action required`);try{switch(t){case`list`:try{var n=I();let t=e.target,r=parseInt(e.limit||`20`,10);(!Number.isFinite(r)||r<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=n.a(await L.create({host:e.host,module:e.module})),a=i.iter(`channels`),o=i.iter(`projects`),s=[],c=`all`;if(t)if($n(t)){let e=BigInt(t),n=i.iter(`project_messages`),r=o.find(t=>t.id===e);s=n.filter(t=>t.projectId===e&&tr(t.messageType)).map(e=>({...e,_type:`project`})),c=r?`project:${r.name}`:`project:${e}`}else{let e=a.find(e=>e.name===t||e.id.toString()===t);e&&(s=i.iter(`messages`).filter(t=>t.channelId===e.id&&tr(t.messageType)).map(e=>({...e,_type:`channel`})),c=`#${e.name}`)}else{let e=i.iter(`messages`),t=i.iter(`project_messages`);s=[...e.filter(e=>tr(e.messageType)).map(e=>({...e,_type:`channel`})),...t.filter(e=>tr(e.messageType)).map(e=>({...e,_type:`project`}))]}s=s.filter(t=>er(t,e.context)),s.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n<r?1:n>r?-1:0}),s=s.slice(0,r);let l=new Map(a.map(e=>[e.id.toString(),e.name])),u=new Map(o.map(e=>[e.id.toString(),e.name]));C({messages:s,count:s.length,target:c}),S()||console.log(B(`messages`,s.map(e=>{let t=`_type`in e&&e._type===`project`?`project:${u.get(e.projectId.toString())||e.projectId}`:`#${l.get(e.channelId.toString())||e.channelId}`;return{id:e.id.toString(),location:t,senderId:e.senderId,content:e.content,messageType:U.display(e.messageType),contextId:e.contextId||null,createdAt:q(e.createdAt)}})));break}catch(e){n.e=e}finally{await n.d()}case`directives`:try{var r=I();let t=e.target,n=parseInt(e.limit||`20`,10);(!Number.isFinite(n)||n<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=r.a(await L.create({host:e.host,module:e.module})),a=i.iter(`channels`),o=i.iter(`projects`),s=[],c=`all`;if(t)if($n(t)){let e=BigInt(t),n=i.iter(`project_messages`),r=o.find(t=>t.id===e);s=n.filter(t=>t.projectId===e&&nr(t.messageType)).map(e=>({...e,_type:`project`})),c=r?`project:${r.name}`:`project:${e}`}else{let e=a.find(e=>e.name===t||e.id.toString()===t);e&&(s=i.iter(`messages`).filter(t=>t.channelId===e.id&&nr(t.messageType)).map(e=>({...e,_type:`channel`})),c=`#${e.name}`)}else{let e=i.iter(`messages`),t=i.iter(`project_messages`);s=[...e.filter(e=>nr(e.messageType)).map(e=>({...e,_type:`channel`})),...t.filter(e=>nr(e.messageType)).map(e=>({...e,_type:`project`}))]}s=s.filter(t=>er(t,e.context)),s.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n<r?1:n>r?-1:0}),s=s.slice(0,n);let l=new Map(a.map(e=>[e.id.toString(),e.name])),u=new Map(o.map(e=>[e.id.toString(),e.name]));C({messages:s,count:s.length,target:c}),S()||console.log(B(`directives`,s.map(e=>{let t=`_type`in e&&e._type===`project`?`project:${u.get(e.projectId.toString())||e.projectId}`:`#${l.get(e.channelId.toString())||e.channelId}`;return{id:e.id.toString(),location:t,senderId:e.senderId,content:e.content,messageType:U.display(e.messageType),contextId:e.contextId||null,createdAt:q(e.createdAt)}})));break}catch(e){r.e=e}finally{await r.d()}case`directive`:{let t=e.target,n=e.content;(!t||!n)&&w(`ARGS_REQUIRED`,`Target and directive content required. Usage: probe message directive <target> <content>`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async r=>{if($n(t)){let i=BigInt(t),a=r.iter(`projects`),o=r.iter(`project_channels`),s=a.find(e=>e.id===i);s||w(`PROJECT_NOT_FOUND`,`Project '${t}' not found`),o.find(e=>e.projectId===i)||w(`PROJECT_CHANNEL_NOT_FOUND`,`Project channel for '${t}' not found`),await z(r,`sendProjectMessage`,{projectId:i,content:n,messageType:U.fromString(`directive`),contextId:e.context}),C({sent:!0,projectId:i.toString(),projectName:s.name,messageType:`directive`}),S()||console.log(B(`directive_sent`,[{target:`project:${s.name}`,contextId:e.context||null}]))}else{let i=r.iter(`channels`),a=i.find(e=>e.name===t||e.id.toString()===t);a||w(`CHANNEL_NOT_FOUND`,`Channel '${t}' not found. Available: ${i.map(e=>e.name).join(`, `)}`),await z(r,`sendMessage`,{channelId:a.id,content:n,messageType:U.fromString(`directive`),contextId:e.context}),C({sent:!0,channelId:a.id.toString(),channelName:a.name,messageType:`directive`}),S()||console.log(B(`directive_sent`,[{target:`#${a.name}`,contextId:e.context||null}]))}})}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`send`:{let t=e.target,n=e.content;(!t||!n)&&w(`ARGS_REQUIRED`,`Target and message content required. Usage: probe message send <target> <content>`),(e.type||`user`).toLowerCase()===`directive`&&w(`INVALID_TYPE`,`'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async r=>{if($n(t)){let i=BigInt(t),a=r.iter(`projects`),o=r.iter(`project_channels`),s=a.find(e=>e.id===i);s||w(`PROJECT_NOT_FOUND`,`Project '${t}' not found`),o.find(e=>e.projectId===i)||w(`PROJECT_CHANNEL_NOT_FOUND`,`Project channel for '${t}' not found`),await z(r,`sendProjectMessage`,{projectId:i,content:n,messageType:U.fromString(e.type||`user`),contextId:e.context}),C({sent:!0,projectId:i.toString(),projectName:s.name}),S()||console.log(B(`message_sent`,[{target:`project:${s.name}`,messageType:e.type||`user`,contextId:e.context||null}]))}else{let i=r.iter(`channels`),a=i.find(e=>e.name===t||e.id.toString()===t);a||w(`CHANNEL_NOT_FOUND`,`Channel '${t}' not found. Available: ${i.map(e=>e.name).join(`, `)}`),await z(r,`sendMessage`,{channelId:a.id,content:n,messageType:U.fromString(e.type||`user`),contextId:e.context}),C({sent:!0,channelId:a.id.toString(),channelName:a.name}),S()||console.log(B(`message_sent`,[{target:`#${a.name}`,messageType:e.type||`user`,contextId:e.context||null}]))}})}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`channels`:try{var i=I();let t=i.a(await L.create({host:e.host,module:e.module})),n=t.iter(`channels`),r=t.iter(`projects`),a=t.iter(`project_channels`),o=new Set(a.map(e=>e.projectId.toString())),s=r.filter(e=>o.has(e.id.toString()));C({channels:n,projects:s,channelCount:n.length,projectCount:s.length}),S()||(console.log(B(`channels`,n.map(e=>({id:e.id.toString(),name:e.name,createdBy:e.createdBy})))),console.log(B(`projects`,s.map(e=>({id:e.id.toString(),name:e.name,repo:e.githubRepo})))));break}catch(e){i.e=e}finally{await i.d()}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, send, directive, directives, channels`)}}catch(e){G(e instanceof Error?e.message:String(e))}};var ir=t({meta:{name:`message`,description:`Message management`},args:{action:{type:`positional`,description:`Action: list, send, directive, directives, channels`,required:!1},target:{type:`positional`,description:`Channel name, project ID, or message content`,required:!1},content:{type:`positional`,description:`Message content (if target is channel/project)`,required:!1},type:{type:`string`,description:`Message type: user, system`,default:`user`},context:{type:`string`,description:`Thread context ID (message ID or entity ref like task:42)`},limit:{type:`string`,description:`Limit messages`,default:`20`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe message`,description:`Channel and project messaging commands`,usage:[`probe message <action> [target] [content] [options]`,`probe message list --limit 50`,`probe message send general "hello team"`,`probe message directive zoe "Focus on project stability" --context project:1`],actions:[{name:`list [target]`,detail:`List user messages (all, channel, or project)`},{name:`directives [target]`,detail:`List directive messages (all, channel, or project)`},{name:`send <target> <content>`,detail:`Send to target channel/project`},{name:`directive <target> <content>`,detail:`Send directive to target channel/project`},{name:`channels`,detail:`List channels and project channels`}],options:[{name:`--type`,detail:`Message type: user, system (default: user)`},{name:`--context`,detail:`Optional thread context ID (message ID or entity ref)`},{name:`--limit`,detail:`Max messages returned for list (default: 20)`},{name:`--wallet`,detail:`Wallet to use for send`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],examples:[`probe message send general hello`,`probe message directive zoe "Pause new work" --context project:1`,`probe message directives zoe --limit 1`,`probe message send zoe "hello there"`,`probe message send zoe "reviewed" --context 123`,`probe message send 1 "project update"`,`probe message list zoe --limit 10`],notes:[`Quotes are only required when target/content contains spaces.`,"Use `probe message channels` to discover available channel names and project IDs."]});return}await rr(e)}}),ar=t({meta:{name:`project`,description:`Project commands`},args:{action:{type:`positional`,description:`Action: list, get, create, status, set-status`,required:!1},id:{type:`positional`,description:`Project ID`,required:!1},value:{type:`positional`,description:`Status value for set-status: active|paused`,required:!1},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit projects returned`},name:{type:`string`,description:`Project name`},description:{type:`string`,description:`Project description`},"github-repo":{type:`string`,description:`GitHub repository URL`},"source-idea":{type:`string`,description:`Source idea ID`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe project`,description:`Project listing and lookup commands`,usage:[`probe project <action> [options]`,`probe project list --status active`,`probe project get 1`,`probe project status 1`,`probe project set-status 1 paused --wallet admin-wallet`],actions:[{name:`list`,detail:`List projects with optional status filter`},{name:`get <id>`,detail:`Show one project by ID`},{name:`create`,detail:`Create a new project`},{name:`status <id>`,detail:`Show only project status`},{name:`set-status <id> <active|paused>`,detail:`Update project status (admin/zoe)`}],options:[{name:`--status`,detail:`Status filter for list: active|paused`},{name:`--limit`,detail:`Max projects returned for list`},{name:`--name`,detail:`Project name (create)`},{name:`--description`,detail:`Project description (create)`},{name:`--github-repo`,detail:`GitHub repository URL (create)`},{name:`--source-idea`,detail:`Source idea ID (create)`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Only admin/zoe identities can call set-status.`,"Find idea IDs with `probe idea list` before using --source-idea.","Find project IDs with `probe project list` before using get/create follow-up commands."]});return}let t=e.action;try{switch(t){case`list`:try{var n=I();let t=n.a(await L.create({host:e.host,module:e.module})).iter(`projects`),r=e.limit?parseInt(e.limit,10):void 0;r!==void 0&&(!Number.isFinite(r)||r<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status&&(t=t.filter(t=>W.matches(t.status,e.status))),t=t.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),r!==void 0&&(t=t.slice(0,r)),C({projects:t,count:t.length}),S()||console.log(B(`projects`,t.map(e=>({id:e.id,name:e.name,status:W.display(e.status),githubRepo:e.githubRepo}))));break}catch(e){n.e=e}finally{await n.d()}case`get`:try{var r=I();let t=e.id;t||w(`PROJECT_ID_REQUIRED`,`Project ID required`);let n=r.a(await L.create({host:e.host,module:e.module})).iter(`projects`).find(e=>e.id.toString()===t);n||w(`PROJECT_NOT_FOUND`,`Project not found: ${t}`),C(n),S()||console.log(B(`project`,[{id:n.id.toString(),name:n.name,status:W.display(n.status),githubRepo:n.githubRepo,description:n.description}]));break}catch(e){r.e=e}finally{await r.d()}case`status`:try{var i=I();let t=e.id;t||w(`PROJECT_ID_REQUIRED`,`Project ID required`);let n=i.a(await L.create({host:e.host,module:e.module})).iter(`projects`).find(e=>e.id.toString()===t);n||w(`PROJECT_NOT_FOUND`,`Project not found: ${t}`);let r=W.display(n.status);C({projectId:t,status:r}),S()||console.log(B(`project_status`,[{id:n.id.toString(),name:n.name,status:r}]));break}catch(e){i.e=e}finally{await i.d()}case`create`:(!e.name||!e[`github-repo`]||!e[`source-idea`])&&w(`ARGS_REQUIRED`,`--name, --github-repo, and --source-idea required`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{await z(t,`createProject`,{sourceIdeaId:BigInt(e[`source-idea`]),name:e.name,githubRepo:e[`github-repo`],description:e.description||``})}),C({created:!0,name:e.name,githubRepo:e[`github-repo`],sourceIdeaId:e[`source-idea`]}),S()||console.log(B(`project_created`,[{name:e.name,githubRepo:e[`github-repo`],sourceIdeaId:e[`source-idea`]}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`set-status`:{let t=e.id,n=e.value;(!t||!n)&&w(`ARGS_REQUIRED`,`Project ID and status required. Use: probe project set-status <id> <active|paused>`);let r=n.toLowerCase().replace(/[_\s]/g,``);[`active`,`paused`].includes(r)||w(`INVALID_STATUS`,`Invalid status: ${n}. Use: active, paused`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{await z(e,`updateProjectStatus`,{projectId:BigInt(t),status:W.fromString(n)})}),C({updated:!0,projectId:t,status:r}),S()||console.log(B(`project_status_updated`,[{projectId:t,status:r}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, get, create, status, set-status`)}}catch(e){G(e instanceof Error?e.message:String(e))}}});const or=e=>{let t=e.trim().replace(/\.git$/i,``);if(!t)return;if(/^[\w.-]+\/[\w.-]+$/.test(t))return`https://github.com/${t}`;let n=t.match(/^git@github\.com:([\w.-]+\/[\w.-]+)$/i);if(n)return`https://github.com/${n[1]}`;if(t.startsWith(`http://`)||t.startsWith(`https://`))try{let e=new URL(t);if(e.hostname!==`github.com`)return;let n=e.pathname.split(`/`).filter(Boolean);return n.length<2?void 0:`https://github.com/${n[0]}/${n[1]}`}catch{return}},sr=async e=>{let t=e.action;t||w(`ACTION_REQUIRED`,`Task action required`);try{switch(t){case`list`:try{var n=I();let t=n.a(await L.create({host:e.host,module:e.module})).iter(`tasks`),r=e.status,i=e.limit?parseInt(e.limit,10):void 0;i!==void 0&&(!Number.isFinite(i)||i<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`),r&&(t=t.filter(e=>V.matches(e.status,r))),e.project&&(t=t.filter(t=>t.projectId.toString()===e.project)),e.assigned&&(t=t.filter(e=>e.assignedTo)),t=t.sort((e,t)=>{let n=K(e.createdAt),r=K(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),i!==void 0&&(t=t.slice(0,i)),C({tasks:t,count:t.length}),S()||console.log(B(`tasks`,t.map(e=>({id:e.id.toString(),title:e.title,status:V.display(e.status),priority:e.priority,assignedTo:e.assignedTo||``,projectId:e.projectId}))));break}catch(e){n.e=e}finally{await n.d()}case`ready`:try{var r=I();let t=r.a(await L.create({host:e.host,module:e.module})),n=t.iter(`tasks`),i=t.iter(`task_dependencies`),a=new Map(n.map(e=>[e.id.toString(),e])),o=e.limit?parseInt(e.limit,10):void 0;o!==void 0&&(!Number.isFinite(o)||o<=0)&&w(`INVALID_LIMIT`,`--limit must be a positive integer`);let s=n.filter(e=>V.is.open(e.status)).filter(e=>!i.filter(t=>t.taskId===e.id).some(e=>{let t=typeof e.dependencyType==`string`?e.dependencyType:e.dependencyType.tag;if(t!==`Blocks`&&t!==`ParentChild`&&t!==`blocks`&&t!==`parent-child`)return!1;let n=a.get(e.dependsOnId.toString());return n?!V.is.completed(n.status):!1})).filter(t=>!e.project||t.projectId.toString()===e.project).filter(t=>!e.assigned||!!t.assignedTo).sort((e,t)=>{if(e.priority!==t.priority)return e.priority-t.priority;let n=K(e.createdAt),r=K(t.createdAt);return n<r?-1:+(n>r)}),c=(o===void 0?s:s.slice(0,o)).map(e=>({id:e.id.toString(),title:e.title,status:e.status.tag.toLowerCase(),priority:e.priority,assignedTo:e.assignedTo||``,projectId:e.projectId.toString(),blockedBy:[]}));C({tasks:c,count:c.length}),S()||console.log(B(`tasks`,c.map(e=>({id:e.id,title:e.title,status:e.status,priority:e.priority,assignedTo:e.assignedTo,projectId:e.projectId}))));break}catch(e){r.e=e}finally{await r.d()}case`get`:try{var i=I();let t=e.id;t||w(`TASK_ID_REQUIRED`,`Task ID required`);let n=i.a(await L.create({host:e.host,module:e.module})).iter(`tasks`).find(e=>e.id.toString()===t);n||w(`TASK_NOT_FOUND`,`Task not found: ${t}`),C(n),S()||console.log(B(`task`,[{id:n.id.toString(),title:n.title,status:V.display(n.status),priority:n.priority,assignedTo:n.assignedTo||``,projectId:n.projectId.toString(),githubIssueUrl:n.githubIssueUrl||``,githubPrUrl:n.githubPrUrl||``,description:n.description}]));break}catch(e){i.e=e}finally{await i.d()}case`create`:{(!e.project||!e.title)&&w(`ARGS_REQUIRED`,`--project and --title required`);let t=parseInt(e.priority||`5`,10);(t<1||t>10)&&w(`INVALID_PRIORITY`,`Priority must be 1-10`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{await z(n,`createTask`,{projectId:BigInt(e.project),title:e.title,description:e.description||``,priority:t,sourceIdeaId:void 0,githubIssueUrl:e[`github-issue-url`]})}),C({created:!0,projectId:e.project,title:e.title,issue:e[`github-issue-url`]}),S()||console.log(B(`task_created`,[{projectId:e.project,title:e.title,githubIssueUrl:e[`github-issue-url`]||``}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`claim`:{let t=e.id;t||w(`TASK_ID_REQUIRED`,`Task ID required`);try{let n,r;await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{await z(e,`claimTask`,{taskId:BigInt(t)});let i=e.iter(`tasks`).find(e=>e.id.toString()===t),a=i?e.iter(`projects`).find(e=>e.id===i.projectId):void 0;a?.githubRepo&&(n=or(a.githubRepo),n&&(r=`${n}/blob/main/CONTRIBUTING.md`))}),C({claimed:!0,taskId:t,repositoryUrl:n,contributingUrl:r,nextSteps:[n?`Fork the target repository: ${n}`:`Fork the target repository to your GitHub account using gh cli`,r?`Read CONTRIBUTING.md before starting: ${r}`:`Read CONTRIBUTING.md in the target repository before starting`,`Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.`]}),S()||(console.log(B(`task_claimed`,[{taskId:t,repositoryUrl:n||``,contributingUrl:r||``}])),console.log(``),console.log(`Next steps:`),console.log(n?`1. Fork the target repository: ${n}`:`1. Fork the target repository to your GitHub account`),console.log(r?`2. Read CONTRIBUTING.md before starting: ${r}`:`2. Read CONTRIBUTING.md in the target repository before starting`),console.log(`3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.`))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`update`:{let t=e.id;t||w(`TASK_ID_REQUIRED`,`Task ID required`),!e.status&&!e[`github-pr-url`]&&w(`UPDATE_REQUIRED`,`--status or --github-pr-url required`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{await z(n,`updateTaskStatus`,{taskId:BigInt(t),status:e.status?V.fromString(e.status):void 0,githubPrUrl:e[`github-pr-url`],archiveReason:void 0})}),C({updated:!0,taskId:t,status:e.status,pr:e[`github-pr-url`]}),S()||console.log(B(`task_updated`,[{taskId:t,status:e.status||``,githubPrUrl:e[`github-pr-url`]||``}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`review`:{let t=e.id;t||w(`TASK_ID_REQUIRED`,`Task ID required`);try{await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{await z(n,`updateTaskStatus`,{taskId:BigInt(t),status:{tag:`Review`},githubPrUrl:e[`github-pr-url`],archiveReason:void 0})}),C({reviewed:!0,taskId:t,status:`review`,pr:e[`github-pr-url`]}),S()||console.log(B(`task_review`,[{taskId:t,status:`review`,githubPrUrl:e[`github-pr-url`]||``}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`deps`:{let t=e.id;t||w(`TASK_ID_REQUIRED`,`Task ID required`);let n=BigInt(t);if(e[`add-dep`])try{await R({host:e.host,module:e.module,wallet:e.wallet},async t=>{await z(t,`addTaskDependency`,{taskId:n,dependsOnId:BigInt(e[`add-dep`]),dependencyType:{tag:`Blocks`}})}),C({added:!0,taskId:t,dependsOn:e[`add-dep`]}),S()||console.log(B(`dependency_added`,[{taskId:t,dependsOnId:e[`add-dep`],dependencyType:`blocks`}]))}catch(e){w(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}else if(e.list)try{var a=I();let t=a.a(await L.create({host:e.host,module:e.module})).iter(`task_dependencies`).filter(e=>e.taskId===n||e.dependsOnId===n);C({dependencies:t}),S()||console.log(B(`task_dependencies`,t.map(e=>({id:e.id.toString(),taskId:e.taskId.toString(),dependsOnId:e.dependsOnId.toString(),dependencyType:e.dependencyType}))))}catch(e){a.e=e}finally{await a.d()}else w(`DEPS_ACTION_REQUIRED`,`Use --add-dep <taskId> to add a dependency or --list to view dependencies`,`Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17`);break}case`watch`:{let t=Math.min(parseInt(e.timeout||`60`,10),300);await R({host:e.host,module:e.module,wallet:e.wallet},async n=>{S()||console.log(B(`task_watch`,[{timeoutSeconds:t,statusFilter:e.status||``}]));let r=new Promise(e=>{let n=setTimeout(()=>{process.off(`SIGINT`,r),process.off(`SIGTERM`,r),e()},t*1e3),r=()=>{clearTimeout(n),process.off(`SIGINT`,r),process.off(`SIGTERM`,r),e()};process.on(`SIGINT`,r),process.on(`SIGTERM`,r)});n.db.tasks.onInsert((t,n)=>{(!e.status||V.matches(n.status,e.status))&&console.log(B(`tasks`,[{id:n.id.toString(),title:n.title,change_type:`created`}]))}),n.db.tasks.onUpdate((t,n,r)=>{(!e.status||V.matches(r.status,e.status))&&console.log(B(`tasks`,[{id:r.id.toString(),title:r.title,change_type:`updated`}]))}),await r});break}default:w(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, ready, get, create, claim, update, review, deps, watch`)}}catch(e){G(e instanceof Error?e.message:String(e))}};var cr=t({meta:{name:`task`,description:`Task management`},args:{action:{type:`positional`,description:`Action: list, ready, get, create, claim, update, review, deps, watch`,required:!1},id:{type:`positional`,description:`Task ID`,required:!1},status:{type:`string`,description:`Status filter or new status`},project:{type:`string`,description:`Project ID`},title:{type:`string`,description:`Task title`},description:{type:`string`,description:`Task description`},priority:{type:`string`,description:`Priority 1-10`},assigned:{type:`boolean`,description:`Show only assigned tasks`,default:!1},wallet:{type:`string`,description:`Wallet name`},"github-pr-url":{type:`string`,description:`GitHub PR URL`},"github-issue-url":{type:`string`,description:`GitHub issue URL`},"add-dep":{type:`string`,description:`Add dependency task ID`},list:{type:`boolean`,description:`List dependencies`,default:!1},timeout:{type:`string`,description:`Watch timeout (seconds)`},limit:{type:`string`,description:`Limit rows for list/ready`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&x(!0),!e.action){O({command:`probe task`,description:`Task management commands`,usage:[`probe task <action> [options]`,`probe task list --project 1 --status open`,`probe task create --project 1 --title "Fix bug" --priority 5`],actions:[{name:`list`,detail:`List tasks with optional filters`},{name:`ready`,detail:`List immediately claimable open tasks`},{name:`get <id>`,detail:`Show one task`},{name:`create`,detail:`Create a new task`},{name:`claim <id>`,detail:`Claim a task for your identity`},{name:`update <id>`,detail:`Update status and optional PR URL`},{name:`review <id>`,detail:`Mark a task as ready for review`},{name:`deps <id>`,detail:`List or add task dependencies`},{name:`watch`,detail:`Watch task changes in real time`}],options:[{name:`--project`,detail:`Project ID`},{name:`--title`,detail:`Task title (create)`},{name:`--description`,detail:`Task description`},{name:`--priority`,detail:`Priority from 1 to 10 (default: 5)`},{name:`--status`,detail:`Filter or new status`},{name:`--limit`,detail:`Limit rows for list/ready`},{name:`--github-pr-url`,detail:`GitHub PR URL for update/review`},{name:`--github-issue-url`,detail:`GitHub issue URL for create`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Use full long-form flags only; short aliases are intentionally disabled.`,"Find project IDs with `probe project list`; find task IDs with `probe task list`."]});return}await sr(e)}});const lr=5e3,ur=[{key:`agents`,name:`agents`},{key:`tasks`,name:`tasks`},{key:`ideas`,name:`ideas`},{key:`messages`,name:`messages`},{key:`channels`,name:`channels`},{key:`projects`,name:`projects`},{key:`votes`,name:`votes`},{key:`discovered_tasks`,name:`discovered_tasks`},{key:`task_dependencies`,name:`task_dependencies`},{key:`identity_roles`,name:`identity_roles`},{key:`config`,name:`config`},{key:`project_channels`,name:`project_channels`},{key:`project_messages`,name:`project_messages`}],dr=new Set([`connected`,`ready`,`disconnected`,`reconnecting`,`reconnected`,`subscription_applied`,`subscription_error`,`auth_failed`,`heartbeat_failed`,`heartbeat_recovered`,`shutdown`]),fr=(e,t)=>typeof t==`bigint`?t.toString():t,pr=()=>new Date().toISOString(),mr=e=>new Promise(t=>setTimeout(t,e)),hr=e=>{let t=Math.floor(Math.random()*(lr*2+1)-lr);return Math.max(1e3,e+t)},gr=e=>hr(Math.min(3e4,1e3*2**Math.max(0,e-1))),_r=e=>e instanceof Error?e.message:String(e),Y=e=>{if(e instanceof Error)return{name:e.name,message:e.message};if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null)return e;if(typeof e==`bigint`)return e.toString();try{return JSON.parse(JSON.stringify(e,fr))}catch{return String(e)}},vr=e=>e===`critical`||e===`info`||e===`debug`?e:`critical`,yr=(e,t)=>!!(t===`debug`||dr.has(e)||t===`info`&&e.startsWith(`heartbeat_`)),br=async e=>{if(!e)return null;let t=l(e);return await f(s(t),{recursive:!0}),De(t,{flags:`a`})},xr=e=>{let t=e.toLowerCase();return t.includes(`authentication required`)||t.includes(`unauthorized`)||t.includes(`401`)},Sr={wallet:{type:`string`,description:`Wallet name for authenticated connection`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},sender:{type:`string`,description:`Optional sender filter (debug table events only)`},"log-file":{type:`string`,description:`Optional path to append JSONL daemon events`},"log-level":{type:`string`,description:`critical, info, or debug`,default:`critical`},pretty:{type:`boolean`,description:`Human-readable lifecycle logs to stderr`,default:!1},json:{type:`boolean`,description:`Reserved for CLI consistency`,default:!1}};async function Cr(e){let t=vr(e[`log-level`]),n=e.pretty?Me({stdout:process.stderr,stderr:process.stderr}):null,r=null;try{r=await br(e[`log-file`])}catch(e){let t=_r(e),n=JSON.stringify({source:`nexus`,at:pr(),type:`log_file_error`,message:t});console.log(n);return}let i=e=>{let t=JSON.stringify(e,fr);console.log(t),r&&r.write(`${t}\n`)},a=e=>{if(!yr(e.type,t)||(i({source:`nexus`,at:pr(),...e}),!n))return;let r=String(e.type);r===`connected`?n.info(`Connected to Nexus`):r===`reconnected`?n.success(`Reconnected to Nexus`):r===`disconnected`?n.warn(`Disconnected from Nexus`):r===`reconnecting`?n.info(`Reconnecting to Nexus`):r===`auth_failed`?n.error(`Authentication failed`):r===`heartbeat_failed`?n.warn(`Heartbeat failed repeatedly`):r===`shutdown`&&n.info(`Nexus daemon shutting down`)},o=!1,s=null,c=new Promise(e=>{process.on(`SIGINT`,()=>{o||(o=!0,s=`SIGINT`,e())}),process.on(`SIGTERM`,()=>{o||(o=!0,s=`SIGTERM`,e())})}),l=0,u=null,d=!1;for(;!o;){let n=null;try{await R({host:e.host,module:e.module,wallet:e.wallet,onDisconnect:(...e)=>{n||={reason:`disconnected`,details:e.map(Y)}}},async r=>{let i=r.auth?.wallet||e.wallet||null,s=r.iter(`agents`).find(e=>e.identity.toHexString()===r.identity?.toHexString());if(a(d?{type:`reconnected`,attempts:l,downtime_ms:u?Date.now()-u:null,identity:r.identity?.toHexString()}:{type:`connected`,identity:r.identity?.toHexString(),wallet:i,host:e.host||r.config.spacetime.host,module:e.module||r.config.spacetime.module}),d=!0,l=0,u=null,a({type:`subscription_applied`}),a({type:`ready`,identity:r.identity?.toHexString(),wallet:i,log_file:e[`log-file`]||null,log_level:t,auto_heartbeat:!!s}),t===`debug`)for(let t of ur){let n=r.db[t.key];n.onInsert?.((n,r)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&r.senderId!==e.sender||a({type:`table_insert`,table:t.name,row:Y(r)})}),n.onUpdate?.((n,r,i)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&i.senderId!==e.sender||a({type:`table_update`,table:t.name,old_row:Y(r),new_row:Y(i)})}),n.onDelete?.((n,r)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&r.senderId!==e.sender||a({type:`table_delete`,table:t.name,row:Y(r)})})}let f=null,p=!1,m=0,ee=()=>{o||!s||(f=setTimeout(async()=>{if(!s||p||o){ee();return}p=!0;try{await z(r,`heartbeat`,{agentId:s.id}),m>0&&a({type:`heartbeat_recovered`,failed_count_before_recovery:m}),m=0}catch(e){m+=1,m>=3&&!n&&(n={reason:`heartbeat_failed`,details:{consecutive_failures:m,message:_r(e)}},a({type:`heartbeat_failed`,consecutive_failures:m,message:_r(e)}))}finally{p=!1,ee()}},hr(6e4)))};for(s&&ee();!o&&!n;)await Promise.race([c,mr(200)]);f&&clearTimeout(f)})}catch(e){let t=_r(e);if(xr(t)){a({type:`auth_failed`,message:t});break}a({type:`subscription_error`,message:t}),n={reason:`disconnected`,details:{message:t}}}if(o)break;a({type:`disconnected`,reason:n?.reason||`disconnected`,details:Y(n?.details||null)}),u===null&&(u=Date.now()),l+=1;let r=gr(l);a({type:`reconnecting`,attempt:l,backoff_ms:r}),await Promise.race([c,mr(r)])}a({type:`shutdown`,signal:s||`unknown`}),r&&r.end()}var wr=t({meta:{name:`nexus`,description:`Persistent Nexus daemon (keepalive + critical telemetry)`},args:Sr,async run({args:e}){if(k()){O({command:`probe nexus`,description:`Run persistent Nexus keepalive + critical event logger`,usage:[`probe nexus [options]`,`probe nexus --wallet agent-wallet`,`probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl`,`probe nexus --log-level debug --sender zoe-1`,`probe nexus --pretty`],options:[{name:`--wallet`,detail:`Wallet for authenticated persistent connection`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`},{name:`--log-level`,detail:`critical (default), info, or debug`},{name:`--sender`,detail:`Sender filter for debug message events only`},{name:`--log-file`,detail:`Optional JSONL file path for daemon events`},{name:`--pretty`,detail:`Human-readable lifecycle logs to stderr`}],notes:[`stdout is always structured JSONL for machine parsing.`,`Default mode logs critical connection lifecycle and heartbeat health events only.`,`Use --log-level debug to emit full table insert/update/delete payloads.`]});return}await Cr(e)}});const X={AgentRole:e=>Array.isArray(e)?[`Zoe`,`Admin`,`Zeno`][e[0]]??`variant_${e[0]}`:e,AgentStatus:e=>Array.isArray(e)?[`Online`,`Offline`,`Working`][e[0]]??`variant_${e[0]}`:e,AnnouncementStatus:e=>Array.isArray(e)?[`Pending`,`Ready`,`Failed`][e[0]]??`variant_${e[0]}`:e,DependencyType:e=>Array.isArray(e)?[`Blocks`,`ParentChild`][e[0]]??`variant_${e[0]}`:e,DiscoveredTaskStatus:e=>Array.isArray(e)?[`PendingReview`,`Approved`,`Rejected`,`EscalatedToIdea`][e[0]]??`variant_${e[0]}`:e,DiscoveryDecision:e=>Array.isArray(e)?[`ApproveAsTask`,`Reject`,`EscalateToIdea`][e[0]]??`variant_${e[0]}`:e,IdeaStatus:e=>Array.isArray(e)?[`Voting`,`ApprovedForProject`,`Rejected`,`Implemented`][e[0]]??`variant_${e[0]}`:e,MessageType:e=>Array.isArray(e)?[`User`,`System`,`Directive`][e[0]]??`variant_${e[0]}`:e,ProjectStatus:e=>Array.isArray(e)?[`Active`,`Paused`][e[0]]??`variant_${e[0]}`:e,TaskStatus:e=>Array.isArray(e)?[`Open`,`Claimed`,`InProgress`,`Review`,`Completed`,`Blocked`,`Archived`][e[0]]??`variant_${e[0]}`:e,VoteType:e=>Array.isArray(e)?[`Up`,`Down`,`Veto`][e[0]]??`variant_${e[0]}`:e},Z=e=>{if(!Array.isArray(e))return e;let t=e[0];return typeof t!=`number`&&typeof t!=`bigint`?e:new Date(Number(t)/1e3).toISOString()},Q=e=>t=>{if(!Array.isArray(t))return t;let[n,r]=t;return n===1?null:e?e(r):Array.isArray(r)&&r.length===1?r[0]:r},Tr={agents:{last_heartbeat:Z,current_task_id:Q(),created_at:Z,last_active_at:Z,role:X.AgentRole,status:X.AgentStatus},channels:{created_at:Z},discovered_tasks:{created_task_id:Q(),rejection_reason:Q(),created_at:Z,reviewed_at:Q(Z),reviewed_by:Q(),status:X.DiscoveredTaskStatus},ideas:{created_at:Z,updated_at:Z,status:X.IdeaStatus},identity_roles:{role:X.AgentRole},messages:{context_id:Q(),created_at:Z},project_channels:{created_at:Z},project_messages:{context_id:Q(),created_at:Z},projects:{created_at:Z,status:X.ProjectStatus},task_dependencies:{created_at:Z},tasks:{assigned_to:Q(),claimed_at:Q(Z),github_issue_url:Q(),github_pr_url:Q(),source_idea_id:Q(),archived_reason:Q(),status_changed_by:Q(),status_changed_at:Q(Z),created_at:Z,updated_at:Z,status:X.TaskStatus,blocked_from_status:Q(X.TaskStatus)},voice_announcements:{context_type:Q(),context_id:Q(),finalized_at:Q(Z),failed_at:Q(Z),error_message:Q(),created_at:Z,status:X.AnnouncementStatus},votes:{created_at:Z}};function Er(e){return e.match(/FROM\s+(\w+)/i)?.[1]?.toLowerCase()}const Dr=e=>{if(typeof e.name==`string`)return e.name;if(e.name&&typeof e.name==`object`&&`some`in e.name)return e.name.some};var Or=class extends Error{status;responseBody;constructor(e,t,n){super(n||`SQL request failed with status ${e}`),this.name=`SqlRequestError`,this.status=e,this.responseBody=t}};const kr=e=>{let t=new URL(e);if(t.protocol===`ws:`)t.protocol=`http:`;else if(t.protocol===`wss:`)t.protocol=`https:`;else if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`Unsupported host protocol: ${t.protocol}`);return t.toString()},Ar=(e,t)=>{let n=kr(e),r=new URL(n);return r.pathname=`${r.pathname.replace(/\/$/,``)}/v1/database/${encodeURIComponent(t)}/sql`,r.toString()},jr=e=>{if(!Array.isArray(e))throw Error(`Invalid SQL response: expected array of statement results`);return e.map(e=>{let t=e,n=Array.isArray(t.rows)?t.rows:[];return{schema:t.schema,rows:n}})},Mr=async e=>{let t=Ar(e.host,e.moduleName),n=new AbortController,r=setTimeout(()=>n.abort(),e.timeoutMs),i=Date.now();try{let r=await fetch(t,{method:`POST`,headers:{Authorization:`Bearer ${e.token}`,"Content-Type":`text/plain`,Accept:`application/json`},body:e.sql,signal:n.signal}),a=await r.text();if(!r.ok)throw new Or(r.status,a);let o;try{o=a?JSON.parse(a):[]}catch{throw Error(`Invalid SQL response: expected JSON payload`)}return{results:jr(o),durationMs:Date.now()-i}}finally{clearTimeout(r)}},Nr=e=>{let t=e.schema;return t&&`elements`in t&&Array.isArray(t.elements)?t.elements.map(Dr).filter(e=>e!==void 0):t&&`columns`in t&&Array.isArray(t.columns)?t.columns.map(e=>e.name):[]},Pr=e=>{let t;try{t=JSON.parse(e).error||e}catch{t=e}return t.includes(`ORDER BY`)?{message:t,suggestion:`SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.`}:t.includes(`IS NULL`)||t.includes(`IS NOT NULL`)?{message:t,suggestion:`Use "column = NULL" or "column != NULL" instead of IS NULL / IS NOT NULL.`}:t.includes(`JOIN`)?{message:t,suggestion:`SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.`}:t.includes(`no such table`)?{message:t,suggestion:`Check the table name. Common tables: tasks, projects, agents, ideas, messages.`}:t.includes(`no such column`)?{message:t,suggestion:`Check the column name. Use SELECT * to see all available columns.`}:{message:t}},Fr=Object.keys(Tr),Ir=(e,t)=>{if(e instanceof Or){e.status===401&&w(`AUTH_REQUIRED`,"Authentication required. Run `probe auth <wallet> --save` first.");let{message:t,suggestion:n}=Pr(e.responseBody);e.status===400&&w(`SQL_INVALID`,t,n),w(`SQL_FAILED`,t,n)}e instanceof Error&&e.name===`AbortError`&&w(`SQL_UNAVAILABLE`,`SQL request timed out after ${t}ms`),w(`SQL_UNAVAILABLE`,e instanceof Error?e.message:`SQL request failed`)},Lr=3e4,Rr=(e,t)=>({duration_ms:t,query_count:e.length,row_count_total:e.reduce((e,t)=>e+t.rows.length,0)}),zr=(e,t,n)=>{let r={};for(let i=0;i<e.length;i+=1){let a=e[i],o=Nr(a),s=t&&n?Tr[n]:void 0,c=a.rows.map(e=>{let t={};for(let n=0;n<o.length;n++){let r=o[n],i=e[n],a=s?.[r];t[r]=a?a(i):i}return t});r[`query_${i+1}`]={columns:o,rows:c}}return e.length===0&&(r.query_1={columns:[],rows:[]}),r},Br=(e,t,n,r,i)=>{let a={},o=r&&i?Tr[i]:void 0;for(let t=0;t<e.length;t+=1){let n=e[t],r=Nr(n),i=n.rows.map(e=>{let t={};for(let n=0;n<r.length;n++){let i=r[n],a=e[n],s=o?.[i];t[i]=s?s(a):a}return t});a[`query_${t+1}`]=i}return e.length===0&&(a.query_1=[]),t&&(a.meta=[Rr(e,n)]),kn(a)};var Vr=t({meta:{name:`query`,description:`Run SQL read queries against Nexus`},args:{sql:{type:`positional`,description:`SQL query string`,required:!1},file:{type:`string`,description:`Read SQL from file path`},wallet:{type:`string`,description:`Wallet name override`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},timeout:{type:`string`,description:`Request timeout in milliseconds`},meta:{type:`boolean`,description:`Include metadata in output`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1},tables:{type:`boolean`,description:`List all available tables`,default:!1},decode:{type:`boolean`,description:`Decode algebraic types to human-readable values`,default:!0},raw:{type:`boolean`,description:`Output raw algebraic type arrays (no decoding)`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.sql||e.file;if(e.tables){S()?C({tables:Fr}):console.log(kn({tables:Fr}));return}if(!t){O({command:`probe query`,description:`Execute SQL against the configured Nexus SpacetimeDB module`,usage:[`probe query "SELECT * FROM tasks LIMIT 5"`,`probe query --file ./query.sql --meta`,`probe query --tables`],options:[{name:`--file`,detail:`Read SQL from file`},{name:`--wallet`,detail:`Wallet override (defaults to config defaultWallet)`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`},{name:`--timeout`,detail:`Request timeout in ms (default: ${Lr})`},{name:`--meta`,detail:`Include metadata in output`},{name:`--json`,detail:`JSON output mode with keyed objects`},{name:`--tables`,detail:`List all available tables`},{name:`--decode`,detail:`Decode algebraic types (default: true)`},{name:`--raw`,detail:`Output raw algebraic arrays (no decoding)`}],notes:[`This command is read-only and intended for SQL queries against Nexus tables.`,`JSON mode returns keyed objects: {"query_1": {"columns": [...], "rows": [{"id": 1, ...}]}}`,`Use --raw to see raw SpacetimeDB algebraic type arrays.`]});return}let n=e.timeout?Number.parseInt(e.timeout,10):Lr;(!Number.isFinite(n)||n<=0)&&w(`INVALID_TIMEOUT`,`Invalid timeout: ${e.timeout}`);let r=await b(),i=e.wallet||r.defaultWallet;i||w(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`),await M(i)||w(`WALLET_NOT_FOUND`,`Wallet not found: ${i}`);let a=await A(i);a||w(`AUTH_REQUIRED`,"No cached token. Run `probe auth <wallet> --save` first.");let o=e.host||r.spacetime.host,s=e.module||r.spacetime.module,c=e.file?await p(e.file,`utf-8`):e.sql??``;c.trim()||w(`SQL_REQUIRED`,`SQL query is empty`);let l=e.raw?!1:e.decode??!0,u=Er(c);try{let{results:t,durationMs:r}=await Mr({host:o,moduleName:s,token:a.token,sql:c,timeoutMs:n});if(S()){let n=zr(t,l,u);e.meta?C({...n,meta:Rr(t,r)}):C(n);return}console.log(Br(t,!!e.meta,r,l,u))}catch(e){Ir(e,n)}}}),Hr=t({meta:{name:`sign`,description:`Sign a message using wallet private key`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},message:{type:`positional`,description:`Message to sign`,required:!1},"message-file":{type:`string`,description:`Read message from file`},"password-file":{type:`string`,description:`Read password from file`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(!t){O({command:`probe sign`,description:`Sign arbitrary text using wallet private key`,usage:[`probe sign <wallet-name> <message> [options]`,`probe sign <wallet-name> --message-file ./payload.txt [options]`],options:[{name:`--message-file`,detail:`Read message content from file`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--json`,detail:`JSON output for agents`}]});return}let n;if(e[`message-file`])try{n=await p(e[`message-file`],`utf-8`)}catch{w(`FILE_READ_ERROR`,`Failed to read message file: ${e[`message-file`]}`)}else e.message?n=e.message:w(`MESSAGE_REQUIRED`,`Message or message-file required`);let i=await Qe({passwordFile:e[`password-file`],promptMessage:`Enter wallet password:`,jsonModeError:`Password file required in JSON mode or provide PROBE_WALLET_PASSWORD`});try{let e=(await gt(t,i)).getKeyPair(0),a=e.sign(r.from(n)),o=e.getPublicKey(),s=e.getAddress();C({wallet:t,message:n,signature:a.toString(`hex`),publicKey:o.toString(`hex`),address:s.toString()}),S()||(E(`Message signed successfully`),console.log(`Signature: ${a.toString(`hex`)}`))}catch(e){w(`SIGN_ERROR`,e instanceof Error?e.message:`Failed to sign message`)}}}),Ur=t({meta:{name:`token`,description:`Show cached JWT token for wallet`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},clear:{type:`boolean`,description:`Clear cached token now (next auth call gets a new token)`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(!t){O({command:`probe token`,description:`Inspect or clear cached authentication token`,usage:[`probe token <wallet-name> [options]`,`probe token <wallet-name> --clear`],options:[{name:`--clear`,detail:`Clear cached token now (recommended)`},{name:`--json`,detail:`JSON output for agents`}]});return}if(e.clear){await dt(t),C({cleared:t}),S()||T(`Token cache cleared for "${t}". Run 'probe auth' to get a new token.`);return}try{let e=await A(t);e||w(`TOKEN_NOT_FOUND`,`No cached token for wallet '${t}'`,`Run 'probe auth ${t} --save' to authenticate`);let n=new Date(e.expiresAt),r=new Date,i=Math.floor((n.getTime()-r.getTime())/1e3),a=i>0;C({wallet:t,token:e.token,expiresAt:e.expiresAt,expiresIn:Math.max(0,i),valid:a}),S()||(console.log(`Wallet: ${t}`),console.log(`Token: ${e.token.slice(0,50)}...`),console.log(`Expires: ${n.toUTCString()}`),console.log(`Status: ${a?`Valid`:`Expired`}`),a||T(`Token has expired. Run with --clear to remove it and re-authenticate.`))}catch(e){w(`TOKEN_ERROR`,e instanceof Error?e.message:`Failed to read token`)}}});const Wr=`@zenon-red/probe`,Gr=3e4,Kr=e(import.meta.url);function $(e){let t=e.trim();return t.startsWith(`${Wr}@`)?t.slice(`${Wr}@`.length):t.startsWith(`refs/tags/`)?$(t.slice(10)):t.replace(/^v/,``)}function qr(){let e=[`../../package.json`,`../package.json`,`../../../package.json`];try{for(let t of e)try{let e=Kr(t).version;if(e)return e}catch{}if(process.env.npm_package_version)return process.env.npm_package_version}catch{}return`0.0.0`}function Jr(e){if(e&&e!==`auto`)return e;let t=process.execPath,n=process.argv[1]||``,r=``;try{r=Ne(`command -v probe`,{timeout:5e3,encoding:`utf8`}).trim()}catch{}if(t.includes(`.probe`)||t.includes(`probe-linux`)||t.includes(`probe-darwin`)||t.includes(`probe-windows`)||n.includes(`.probe`)||r.includes(`.probe`)||r.includes(`probe-linux`)||r.includes(`probe-darwin`)||r.includes(`probe-windows`))return`binary`;if(n.includes(`node_modules`)||r.includes(`node_modules`))return`npm`;try{if(Ne(`npm list -g @zenon-red/probe --depth=0 2>/dev/null`,{timeout:1e4,encoding:`utf8`}).includes(`@zenon-red/probe`))return`npm`}catch{}return`unknown`}async function Yr(){let e=`https://registry.npmjs.org/${Wr}/latest`,t=await fetch(e,{signal:AbortSignal.timeout(Gr)});if(!t.ok)throw Error(`npm registry returned ${t.status}`);let n=await t.json();if(!n.version)throw Error(`No version field in npm response`);return $(n.version)}async function Xr(e){let t=`https://api.github.com/repos/zenon-red/probe/releases/${e}`,n=await fetch(t,{headers:{Accept:`application/vnd.github+json`},signal:AbortSignal.timeout(Gr)});if(!n.ok)throw Error(`GitHub API returned ${n.status}`);return await n.json()}async function Zr(){let e=await Xr(`latest`);return{version:$(e.tag_name),release:e}}async function Qr(e){let t=$(e);try{return await Xr(`tags/v${t}`)}catch(e){if(!(e instanceof Error?e.message:``).includes(`404`))throw e;return await Xr(`tags/${encodeURIComponent(`${Wr}@${t}`)}`)}}function $r(){let e=o(),t=i(),n={linux:`linux`,darwin:`darwin`,windows:`windows`},r={x64:`x64`,arm64:`arm64`},a=n[e],s=r[t];if(!a||!s)throw Error(`Unsupported platform: ${e}/${s}`);return`probe-${a}-${s}${o()===`windows`?`.exe`:``}`}function ei(){return s(process.execPath)}async function ti(e,t){let n=await fetch(e,{signal:AbortSignal.timeout(Gr*2),redirect:`follow`});if(!n.ok)throw Error(`Download failed: ${n.status} ${n.statusText}`);if(!n.body)throw Error(`Empty response body`);let r=Fe.fromWeb(n.body),i=De(t,{mode:493});await Ie(r.pipe(i))}function ni(e,t){let n=e.split(`/`).pop()||e.split(`\\`).pop()||``,r=t.split(`
6
- `),i=``;for(let e of r){let[t,r]=e.trim().split(/\s+/);if(r===n){i=t;break}}if(!i)return!1;let a=ke(e);return Pe(`sha256`).update(a).digest(`hex`)===i}async function ri(e){Ne(`npm install -g ${Wr}@${$(e)}`,{stdio:`inherit`,timeout:12e4})}async function ii(e,t){let n=$r(),r=e.assets.find(e=>e.name===n);if(!r)throw Error(`Asset not found for ${n}`);let i=e.assets.find(e=>e.name===`SHA256SUMS.txt`);if(!i)throw Error(`SHA256SUMS.txt not found in release`);let a=l(ei(),o()===`windows`?`probe.exe`:`probe`),s=`${a}.tmp`,c=`${a}.bak`;await ti(r.browser_download_url,s);let u=await fetch(i.browser_download_url,{signal:AbortSignal.timeout(Gr)});if(!u.ok)throw Error(`Failed to download SHA256SUMS.txt`);if(!ni(s,await u.text()))throw je(s),Error(`CHECKSUM_MISMATCH`);try{if(Oe(a)&&Ae(a,c),Ae(s,a),Ne(`"${a}" --version`,{timeout:1e4,encoding:`utf8`}),Oe(c))try{je(c)}catch{}}catch(e){if(Oe(c))try{Ae(c,a)}catch{throw Error(`ROLLBACK_FAILED: Upgrade failed and rollback also failed. Backup at: ${c}`)}if(Oe(s))try{je(s)}catch{}throw e}}const ai=new Set([`auto`,`npm`,`binary`]),oi=e=>{C(e),!S()&&console.log(B(`upgrade_result`,[{method:e.method,currentVersion:e.currentVersion,targetVersion:e.targetVersion,latestVersion:e.latestVersion,updated:e.updated,checkOnly:e.checkOnly}]))};var si=t({meta:{name:`upgrade`,description:`Upgrade Probe to the latest or a specific version`},args:{target:{type:`positional`,description:`Version to upgrade to (e.g. 1.2.0 or v1.2.0)`,required:!1},check:{type:`boolean`,description:`Check for updates without upgrading`,default:!1},method:{type:`string`,description:`Installation method: auto, npm, binary`},yes:{type:`boolean`,description:`Skip confirmation prompts`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&x(!0),e.target===`--help`||e.target===`-h`){O({command:`probe upgrade`,description:`Upgrade Probe to the latest or a specific version`,usage:[`probe upgrade`,`probe upgrade --check`,`probe upgrade 1.2.0`,`probe upgrade --method npm`,`probe upgrade --method binary --yes`,`probe upgrade --json --check`],options:[{name:`--check`,detail:`Check for updates without upgrading`},{name:`--method`,detail:`Force install method: auto, npm, binary`},{name:`--yes`,detail:`Skip confirmation prompts`},{name:`--json`,detail:`JSON output`}]});return}let t=e.method;t&&!ai.has(t)&&w(`INVALID_METHOD`,`Invalid --method value: ${e.method}`,`Use: --method auto | npm | binary`);let n=qr(),r=Jr(t),i,a,o;try{if(e.target)i=$(e.target),r===`binary`&&(o=await Qr(i));else if(r===`npm`)a=await Yr(),i=a;else{let e=await Zr();a=e.version,i=e.version,o=e.release}}catch(t){let n=t instanceof Error?t.message:`Failed to check latest version`;!e.target&&r===`binary`&&n.includes(`GitHub API returned 404`)&&w(`NO_RELEASES_PUBLISHED`,`No GitHub releases are published yet for binary upgrades.`,`Use: npm install -g @zenon-red/probe (or your package manager) until the first release is published.`),w(`VERSION_LOOKUP_FAILED`,n)}i||w(`VERSION_LOOKUP_FAILED`,`Could not determine target version.`);let s=i!==n;if(e.check){oi({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:s,updated:!1,checkOnly:!0});return}if(r===`unknown`&&w(`METHOD_UNKNOWN`,`Could not detect installation method for in-place upgrade.`,"Use --method npm|binary explicitly, or run your package manager upgrade command (e.g. `bun add -g @zenon-red/probe`)."),!s){oi({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:!1,updated:!1,checkOnly:!1});return}!S()&&!e.yes&&(await ne({message:`Upgrade Probe from ${n} to ${i}?`})||(T(`Upgrade cancelled`),process.exit(0)));try{r===`npm`?await ri(i):await ii(o||await Qr(i),i)}catch(e){let t=e instanceof Error?e.message:`Upgrade failed`;w(t.includes(`CHECKSUM_MISMATCH`)?`CHECKSUM_MISMATCH`:t.includes(`ROLLBACK_FAILED`)?`ROLLBACK_FAILED`:t.includes(`PERMISSION`)||t.includes(`EACCES`)?`PERMISSION_DENIED`:`UPGRADE_FAILED`,t)}oi({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:!0,updated:!0,checkOnly:!1})}}),ci=t({meta:{name:`create`,description:`Create a new wallet with randomly generated mnemonic`},args:{name:{type:`positional`,description:`Wallet identifier`,required:!1},"password-file":{type:`string`,description:`Read password from file`},"set-default":{type:`boolean`,description:`Set this wallet as the default`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(k()||!t){O({command:`probe wallet create`,description:`Create a new encrypted wallet`,usage:[`probe wallet create <name> [options]`,`probe wallet create agent-wallet --set-default`],options:[{name:`--password-file`,detail:`Read wallet password from file`},{name:`--set-default`,detail:`Set created wallet as default`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.`]});return}/^[a-zA-Z0-9_-]+$/.test(t)||w(`INVALID_NAME`,`Wallet name must be alphanumeric with hyphens or underscores only`);let n=await b(),r=await Qe({passwordFile:e[`password-file`],promptMessage:`Enter password to encrypt wallet:`,confirmPromptMessage:`Confirm password:`,minLength:n.passwordMinLength,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt`});try{let n=await pt(t,r),i=e[`set-default`];if(i||(await ht()).length===1&&(i=!0),i){let e=await v();e.defaultWallet=n.name,await Be(e)}C({name:n.name,address:n.address,publicKey:n.publicKey,mnemonic:n.mnemonic,default:i}),S()||(E(`Wallet "${n.name}" created successfully`),console.log(`Address: ${n.address}`),console.log(`\nMnemonic: ${n.mnemonic}`),Ye(`Save this mnemonic securely - it cannot be recovered!`),i&&console.log(`
7
- Set as default wallet`))}catch(e){w(`WALLET_CREATE_ERROR`,e instanceof Error?e.message:`Failed to create wallet`)}}}),li=t({meta:{name:`default`,description:`Set the default wallet`},args:{name:{type:`positional`,description:`Wallet name to set as default`,required:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(k()||!t){O({command:`probe wallet default`,description:`Set the default wallet used by commands`,usage:[`probe wallet default <name> [options]`,`probe wallet default agent-wallet`],options:[{name:`--json`,detail:`JSON output for agents`}]});return}await vt(t)||w(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`);let n=await v();n.defaultWallet=t,await Be(n),C({defaultWallet:t}),S()||E(`Default wallet set to '${t}'`)}}),ui=t({meta:{name:`delete`,description:`Delete a wallet`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},yes:{type:`boolean`,description:`Skip confirmation prompt`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(k()||!t){O({command:`probe wallet delete`,description:`Delete a wallet from local storage`,usage:[`probe wallet delete <name> [options]`,`probe wallet delete old-wallet --yes`],options:[{name:`--yes`,detail:`Skip interactive confirmation prompt`},{name:`--json`,detail:`JSON output for agents`}]});return}await vt(t)||w(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`,`Run 'probe wallet list' to see available wallets`),!S()&&!e.yes&&(await ne({message:`Are you sure you want to delete wallet "${t}"? This cannot be undone.`})||(T(`Deletion cancelled`),process.exit(0)));try{await _t(t),C({deleted:t}),S()||E(`Wallet "${t}" deleted successfully`)}catch(e){w(`WALLET_DELETE_ERROR`,e instanceof Error?e.message:`Failed to delete wallet`)}}}),di=t({meta:{name:`import`,description:`Import wallet from mnemonic phrase`},args:{name:{type:`positional`,description:`Wallet identifier`,required:!1},mnemonic:{type:`string`,description:`Mnemonic phrase (space-separated)`},"mnemonic-file":{type:`string`,description:`Read mnemonic from file`},"password-file":{type:`string`,description:`Read password from file`},"set-default":{type:`boolean`,description:`Set this wallet as the default`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(k()||!t){O({command:`probe wallet import`,description:`Import an encrypted wallet from mnemonic`,usage:[`probe wallet import <name> [options]`,`probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt`],options:[{name:`--mnemonic`,detail:`24-word mnemonic phrase`},{name:`--mnemonic-file`,detail:`Read mnemonic from file`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--set-default`,detail:`Set imported wallet as default`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.`]});return}/^[a-zA-Z0-9_-]+$/.test(t)||w(`INVALID_NAME`,`Wallet name must be alphanumeric with hyphens or underscores only`);let n=await $e({mnemonic:e.mnemonic,mnemonicFile:e[`mnemonic-file`],jsonModeError:`Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env`}),r=await Qe({passwordFile:e[`password-file`],promptMessage:`Enter password to encrypt wallet:`,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt`});try{let i=await mt(t,n,r),a=e[`set-default`];if(a||(await ht()).length===1&&(a=!0),a){let e=await v();e.defaultWallet=i.name,await Be(e)}C({name:i.name,address:i.address,default:a}),S()||(E(`Wallet "${i.name}" imported successfully`),console.log(`Address: ${i.address}`),a&&console.log(`
8
- Set as default wallet`))}catch(e){w(`WALLET_IMPORT_ERROR`,e instanceof Error?e.message:`Failed to import wallet`)}}}),fi=t({meta:{name:`list`,description:`List all stored wallets`},args:{json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(k()){O({command:`probe wallet list`,description:`List all locally stored wallets`,usage:[`probe wallet list [options]`,`probe wallet list --json`],options:[{name:`--json`,detail:`JSON output for agents`}]});return}e.json&&x(!0);try{let e=await ht(),t=await b(),n=e.map(e=>({...e,default:e.name===t.defaultWallet}));if(C(n),!S())if(e.length===0)T(`No wallets found`);else{console.log(`Wallets:`);for(let e of n){let t=e.createdAt?new Date(e.createdAt).toLocaleDateString():`unknown`,n=e.default?`*`:` `;console.log(`${n} ${e.name.padEnd(12)} ${e.address.slice(0,10)}... created ${t}`)}t.defaultWallet&&console.log(`
9
- * = default wallet`)}}catch(e){w(`WALLET_LIST_ERROR`,e instanceof Error?e.message:`Failed to list wallets`)}}}),pi=t({meta:{name:`show`,description:`Show wallet address and public key`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},"public-key":{type:`boolean`,description:`Include public key in output`,default:!1},"password-file":{type:`string`,description:`Read password from file`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&x(!0);let t=e.name;if(k()||!t){O({command:`probe wallet show`,description:`Show wallet address and optional public key`,usage:[`probe wallet show <name> [options]`,`probe wallet show my-wallet --public-key --password-file ./pass.txt`],options:[{name:`--public-key`,detail:`Include public key in output`},{name:`--password-file`,detail:`Read password for public key extraction`},{name:`--json`,detail:`JSON output for agents`}]});return}let n=await M(t);n||w(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`,`Run 'probe wallet list' to see available wallets`);let r;if(e[`password-file`])try{r=await p(e[`password-file`],`utf-8`),r=r.trim()}catch{w(`FILE_READ_ERROR`,`Failed to read password file: ${e[`password-file`]}`)}try{let i;r&&(i=(await gt(t,r)).getKeyPair(0).getPublicKey().toString(`hex`));let a={name:n.name,address:n.address,createdAt:n.createdAt};(e[`public-key`]||i)&&(a.publicKey=i),C(a),S()||(console.log(`Name: ${n.name}`),console.log(`Address: ${n.address}`),n.createdAt&&console.log(`Created: ${new Date(n.createdAt).toLocaleString()}`),i&&console.log(`Public Key: ${i}`))}catch(e){w(`WALLET_LOAD_ERROR`,e instanceof Error?e.message:`Failed to load wallet`)}}});const mi=new Set([`create`,`import`,`list`,`show`,`delete`,`default`]);var hi=t({meta:{name:`wallet`,description:`Manage Zenon Network wallets`},run(){let e=process.argv.slice(2).filter(e=>!e.startsWith(`-`));e.length>1&&mi.has(e[1])||O({command:`probe wallet`,description:`Create, import, inspect, and manage wallets`,usage:[`probe wallet <subcommand> [positionals] [options]`,`probe wallet create my-wallet --set-default`,`probe wallet import my-wallet --mnemonic-file ./mnemonic.txt`],actions:[{name:`create <name>`,detail:`Create a new encrypted wallet`},{name:`import <name>`,detail:`Import wallet from mnemonic phrase`},{name:`list`,detail:`List stored wallets`},{name:`show <name>`,detail:`Show wallet address and optional public key`},{name:`delete <name>`,detail:`Delete a wallet`},{name:`default <name>`,detail:`Set default wallet`}],notes:[`Use long-form flags only for predictable agent automation.`]})},subCommands:{create:ci,import:di,list:fi,show:pi,delete:ui,default:li}}),gi=t({meta:{name:`whoami`,description:`Show current authenticated agent profile`},args:{wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){e.json&&x(!0);try{await R({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=e.iter(`agents`).find(t=>t.identity.toHexString()===e.identity?.toHexString());t||w(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),C(t),S()||console.log(B(`agent`,[{id:t.id,name:t.name,role:Mn.display(t.role),status:H.display(t.status),lastHeartbeat:q(t.lastHeartbeat),currentTaskId:t.currentTaskId?t.currentTaskId.toString():``,capabilities:t.capabilities.join(`,`),identity:e.identity?.toHexString()||``}]))})}catch(e){G(e instanceof Error?e.message:String(e))}}});const _i=new Set([`wallet`,`auth`,`sign`,`token`,`config`,`nexus`,`agent`,`task`,`message`,`idea`,`discover`,`project`,`query`,`doctor`,`whoami`,`upgrade`]),vi=()=>{let e=st(process.argv.slice(2));ot(e.forceHelp),process.argv=[...process.argv.slice(0,2),...e.argv]},{version:yi,description:bi}=e(import.meta.url)(`../package.json`),xi=t({meta:{name:`probe`,version:yi,description:bi},args:{json:{type:`boolean`,description:`Output JSON only`,default:!1}},run(){let e=process.argv.slice(2).find(e=>!e.startsWith(`-`));e&&_i.has(e)||O({command:`probe`,description:bi,usage:[`probe <command> [positionals] [options]`,`probe idea propose --title "Better task scoring" --category planning`,`probe task claim 42 --wallet agent-wallet`],actions:[{name:`wallet`,detail:`Wallet lifecycle commands`},{name:`auth`,detail:`Authenticate wallet and cache token`},{name:`token`,detail:`Inspect or clear cached token`},{name:`sign`,detail:`Sign text payloads`},{name:`nexus`,detail:`Run persistent Nexus daemon (keepalive + event logs)`},{name:`agent, task, idea, discover, message, project`,detail:`Nexus workspace commands`},{name:`query`,detail:`Execute SQL queries against Nexus`},{name:`doctor`,detail:`Run setup and connectivity diagnostics`},{name:`upgrade`,detail:`Upgrade Probe to the latest version`},{name:`config`,detail:`Read/write CLI configuration`}],options:[{name:`--json`,detail:`JSON output mode for agents`}],notes:[`Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).`]})},subCommands:{wallet:hi,auth:bt,sign:Hr,token:Ur,config:Ct,nexus:wr,agent:zn,task:cr,message:ir,idea:Qn,discover:Un,project:ar,query:Vr,doctor:An,upgrade:si,whoami:gi}}),Si=e=>{if(!(e instanceof Error))return!1;let t=e.message.toLowerCase();return t.includes(`connection failed`)||t.includes(`connection timeout`)||t.includes(`authentication required`)||t.includes(`unauthorized`)||t.includes(`wallet required`)||t.includes(`wallet not found`)||t.includes(`agent not registered`)||t.includes(`subscription error`)};process.on(`unhandledRejection`,e=>{Si(e)&&process.exit(1),S()?console.error(JSON.stringify({success:!1,error:{code:`UNEXPECTED_ERROR`,message:e instanceof Error?e.message:String(e)}})):console.error(e instanceof Error?e.message:String(e)),process.exit(1)}),vi(),n(xi);export{};
2
+ import{createRequire as e}from"node:module";import{defineCommand as t,runMain as n}from"citty";import{Buffer as r}from"node:buffer";import{arch as i,homedir as a,platform as o}from"node:os";import{dirname as s,join as c,resolve as l}from"node:path";import{loadConfig as u}from"c12";import{access as d,mkdir as f,readFile as p,readdir as m,unlink as ee,writeFile as h}from"node:fs/promises";import{confirm as te,log as g,note as ne,password as re,spinner as ie,text as ae}from"@clack/prompts";import{AsyncLocalStorage as oe}from"node:async_hooks";import{blue as se,bold as ce,cyan as le,dim as ue,gray as de,green as fe,white as pe}from"kolorist";import{KeyFile as me,KeyStore as he}from"znn-typescript-sdk";import{DbConnectionBuilder as ge,DbConnectionImpl as _e,SubscriptionBuilderImpl as ve,convertToAccessorMap as ye,makeQueryBuilder as be,procedureSchema as xe,procedures as Se,reducerSchema as _,reducers as Ce,schema as we,t as v,table as y}from"spacetimedb";import{encode as Te}from"@toon-format/toon";import{execSync as b}from"node:child_process";import{createHash as Ee}from"node:crypto";import{createWriteStream as De,existsSync as x,readFileSync as Oe,renameSync as ke,unlinkSync as Ae}from"node:fs";import{Readable as je}from"node:stream";import{finished as Me}from"node:stream/promises";import{createConsola as Ne}from"consola";const Pe={issuer:`https://api.zenon.red`,walletDir:`~/.probe/wallets`,autoUpdate:`notify`,passwordMinLength:8,tokenCacheDir:`~/.probe/tokens`,requestTimeout:3e4,spacetime:{host:`wss://db.zenon.red`,module:`nexus`}},Fe=c(a(),`.probe`,`config.json`),Ie=c(a(),`.probe`);async function S(){try{await d(Fe);let e=await p(Fe,`utf-8`);return JSON.parse(e)}catch{return{}}}async function Le(e){await f(Ie,{recursive:!0}),await h(Fe,JSON.stringify(e,null,2),{mode:384})}let C=null;async function w(){if(C)return C;let[e,t]=await Promise.all([u({name:`probe`,defaults:Pe,envName:`PROBE`}),S()]);return C={...Pe,...e.config,...t},C.walletDir=ze(C.walletDir),C.tokenCacheDir=ze(C.tokenCacheDir),C}function Re(){C=null}function ze(e){return e.startsWith(`~/`)?c(a(),e.slice(2)):e}async function Be(){return(await w()).walletDir}async function Ve(){return(await w()).tokenCacheDir}const He=new oe;let Ue=!1;const We=(e,t)=>typeof t==`bigint`?t.toString():t,Ge=(e,t=!1)=>{let n=JSON.stringify(e,We,2);if(t){console.error(n);return}console.log(n)};function T(e){Ue=e,He.enterWith({jsonMode:e})}function E(){return He.getStore()?.jsonMode===!0||Ue}function D(e){E()&&Ge({success:!0,data:e})}function O(e,t,n,r=1){E()?(Ge({success:!1,error:{code:e,message:t,...n&&{suggestion:n}}},!0),process.exit(r)):(g.error(t),n&&console.error(`${ue(`hint:`)} ${n}`),process.exit(r))}function Ke(e){E()||g.info(e)}function k(e){E()||g.success(e)}function qe(e){E()||g.warn(e)}function Je(e,t){E()||ne(e,t)}function Ye(e){if(E())return{start:()=>{},stop:()=>{},succeed:()=>{},fail:()=>{}};let t=ie();return{start:()=>{t.start(e)},stop:()=>{t.stop()},succeed:n=>{t.stop(n||e)},fail:n=>{t.stop(n||e)}}}const Xe=async(e,t)=>{try{return(await p(e,`utf-8`)).trim()}catch{O(`FILE_READ_ERROR`,`Failed to read ${t} file: ${e}`)}},Ze=async e=>{if(e.passwordFile)return Xe(e.passwordFile,`password`);let t=e.envVar||`PROBE_WALLET_PASSWORD`,n=process.env[t];if(n)return n;(E()||!process.stdin.isTTY||!process.stdout.isTTY)&&O(`PASSWORD_REQUIRED`,e.jsonModeError);let r=await re({message:e.promptMessage,validate:t=>{if(t&&e.minLength&&t.length<e.minLength)return`Password must be at least ${e.minLength} characters`}});return typeof r!=`string`&&process.exit(130),e.confirmPromptMessage&&typeof await re({message:e.confirmPromptMessage,validate:e=>e===r?void 0:`Passwords do not match`})!=`string`&&process.exit(130),r},Qe=async e=>{if(e.mnemonic)return e.mnemonic;if(e.mnemonicFile)return Xe(e.mnemonicFile,`mnemonic`);let t=e.envVar||`PROBE_WALLET_MNEMONIC`,n=process.env[t];if(n)return n;(E()||!process.stdin.isTTY||!process.stdout.isTTY)&&O(`MNEMONIC_REQUIRED`,e.jsonModeError);let r=await ae({message:`Enter mnemonic phrase:`,validate:e=>e&&e.trim().split(/\s+/).length===24?void 0:`Mnemonic must be 24 words`});return typeof r!=`string`&&process.exit(130),r},$e=new Set([`agent`,`task`,`message`,`idea`,`discover`,`project`,`config`]),et=new Set([`wallet`,`auth`,`sign`,`token`,`nexus`,`query`,`doctor`,`upgrade`]),tt=new Set([`create`,`import`,`list`,`show`,`delete`,`default`]);let nt=!1;const rt=e=>`\u001b[48;2;120;239;93m\u001b[38;2;12;28;16m ${e} \u001b[0m`,it=e=>rt(e.toUpperCase()),at=(e,t)=>{let n=Math.max(...e.map(e=>e.name.length),0);return e.map(e=>` ${t(e.name.padEnd(n))} ${e.detail}`).join(`
3
+ `)},A=e=>{let t=[...e.notes||[]],n=(e.options||[]).some(e=>e.name.includes(`--host`)&&e.name.includes(`--module`)),r=t.some(e=>e.includes(`--host`)&&e.includes(`--module`));n&&!r&&t.push(`--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).`);let i=[];i.push(`${ce(pe(e.command))} ${ue(`•`)} ${de(e.description)}`),i.push(``),i.push(it(`Usage`));for(let t of e.usage)i.push(` ${pe(t)}`);if(e.actions&&e.actions.length>0&&(i.push(``),i.push(it(`Actions`)),i.push(at(e.actions,fe))),e.options&&e.options.length>0&&(i.push(``),i.push(it(`Options`)),i.push(at(e.options,se))),e.examples&&e.examples.length>0){i.push(``),i.push(it(`Examples`));for(let t of e.examples)i.push(` ${le(t)}`)}if(t.length>0){i.push(``),i.push(it(`Notes`));for(let e of t)i.push(` ${ue(`-`)} ${e}`)}console.log(i.join(`
4
+ `))},ot=e=>{nt=e},j=()=>nt,st=e=>{if(!(e.includes(`--help`)||e.includes(`-h`)))return{argv:e,forceHelp:!1};if(e.every(e=>e.startsWith(`-`)))return{argv:[],forceHelp:!0};let t=e.find(e=>!e.startsWith(`-`));if(!t)return{argv:e,forceHelp:!0};if($e.has(t))return{argv:[t],forceHelp:!0};if(!et.has(t))return{argv:e,forceHelp:!0};if(t===`wallet`){let n=e.filter(e=>!e.startsWith(`-`));if(n.length>1&&tt.has(n[1]))return{argv:[t,n[1]],forceHelp:!0}}return{argv:[t],forceHelp:!0}};async function ct(e,t){let n=await w(),r=`${t||n.issuer}/auth/challenge`,i=await fetch(r,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({address:e})});if(!i.ok){let e=await i.text();throw Error(`Challenge request failed: ${e}`)}let a=await i.json();return{nonce:a.nonce,challenge:a.challenge,expiresAt:a.expires_at}}async function lt(e,t,n,r,i){let a=await w(),o=`${i||a.issuer}/auth/token`,s=await fetch(o,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({address:e,public_key:t,signature:n,nonce:r})});if(!s.ok){let e=await s.text();throw Error(`Token exchange failed: ${e}`)}let c=await s.json();return{accessToken:c.access_token,idToken:c.id_token,expiresIn:c.expires_in}}async function ut(e,t,n){let r=await Ve();try{await f(r,{recursive:!0})}catch{}await h(c(r,`${e}.jwt`),JSON.stringify({token:t,expiresAt:n}),{mode:384})}async function dt(e){let t=c(await Ve(),`${e}.jwt`);try{await d(t);let e=await p(t,`utf-8`);return JSON.parse(e)}catch{return null}}async function ft(e){let t=c(await Ve(),`${e}.jwt`);try{await d(t);let{unlink:e}=await import(`node:fs/promises`);await e(t)}catch{}}async function pt(){let e=await Be();try{await f(e,{recursive:!0})}catch{}return e}async function mt(e){return c(await pt(),`${e}.json`)}async function ht(e,t){if(await bt(e))throw Error(`Wallet '${e}' already exists`);let n=he.newRandom(),r=await me.setPassword(t).encrypt(n);await h(await mt(e),JSON.stringify(r,null,2),`utf-8`);let i=n.getKeyPair(0),a=i.getAddress(),o=i.getPublicKey();return{name:e,address:a.toString(),publicKey:o.toString(`hex`),mnemonic:n.mnemonic||``}}async function gt(e,t,n){if(await bt(e))throw Error(`Wallet '${e}' already exists`);let r=he.fromMnemonic(t),i=await me.setPassword(n).encrypt(r);return await h(await mt(e),JSON.stringify(i,null,2),`utf-8`),{name:e,address:r.getKeyPair(0).getAddress().toString()}}async function _t(){let e=await Be();try{let t=await m(e),n=[];for(let e of t)if(e.endsWith(`.json`)){let t=await M(e.slice(0,-5));t&&n.push(t)}return n}catch{return[]}}async function M(e){let t=await mt(e);try{let n=await p(t,`utf-8`),r=JSON.parse(n),i=await xt(t);return{name:e,address:r.address||r.baseAddress,createdAt:r.timestamp?new Date(r.timestamp*1e3).toISOString():new Date(i.mtime).toISOString()}}catch{return null}}async function vt(e,t){let n=await mt(e);try{let e=await p(n,`utf-8`),r=JSON.parse(e);return await me.setPassword(t).decrypt(r)}catch(e){throw Error(`Failed to load wallet: ${e instanceof Error?e.message:`Unknown error`}`)}}async function yt(e){let t=await mt(e);try{await ee(t)}catch(e){throw Error(`Failed to delete wallet: ${e instanceof Error?e.message:`Unknown error`}`)}}async function bt(e){let t=await mt(e);try{return await d(t),!0}catch{return!1}}async function xt(e){let{stat:t}=await import(`node:fs/promises`);return t(e)}var St=t({meta:{name:`auth`,description:`Complete OIDC authentication flow`},args:{name:{type:`positional`,description:`Wallet name, or status action`,required:!1},wallet:{type:`string`,description:`Wallet name override (used with auth status)`},"expect-address":{type:`string`,description:`Expected Zenon address safety check (z1...)`},issuer:{type:`string`,description:`OIDC issuer URL override`},"password-file":{type:`string`,description:`Read password from file`},save:{type:`boolean`,description:`Save token to cache (default: true)`,default:!0},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name,n=e[`expect-address`];if(!t){A({command:`probe auth`,description:`Complete OIDC authentication flow`,usage:[`probe auth <wallet-name> [options]`,`probe auth status [--wallet my-wallet]`,`probe auth my-wallet --save`,`probe auth my-wallet --expect-address z1q... --save`],options:[{name:`--expect-address`,detail:`Optional safety check against resolved wallet address`},{name:`--wallet`,detail:"Wallet override for `auth status`"},{name:`--issuer`,detail:`OIDC issuer URL (default from config: issuer)`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--save`,detail:`Save token in local cache (default: true)`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.`,`Most users should omit --expect-address; it is for safety checks in external workflows.`,`Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).`]});return}if(t===`status`){let t=await w(),n=e.wallet||t.defaultWallet;n||O(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`);let r=await dt(n);if(!r){D({wallet:n,authenticated:!1,valid:!1,reason:`no_cached_token`}),E()||(console.log(`Wallet: ${n}`),console.log(`Status: Not authenticated (no cached token)`),console.log(`Next: probe auth ${n} --save`));return}let i=new Date(r.expiresAt),a=Math.floor((i.getTime()-Date.now())/1e3),o=Number.isFinite(a)&&a>0;D({wallet:n,authenticated:!0,valid:o,expiresAt:r.expiresAt,expiresIn:Math.max(0,a)}),E()||(console.log(`Wallet: ${n}`),console.log(`Status: ${o?`Authenticated`:`Token expired`}`),console.log(`Expires: ${i.toUTCString()}`));return}let i=await Ze({passwordFile:e[`password-file`],promptMessage:`Enter wallet password:`,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session`}),a,o,s;try{a=(await vt(t,i)).getKeyPair(0),o=a.getAddress().toString(),n&&o!==n&&O(`ADDRESS_MISMATCH`,`Wallet address ${o} does not match provided address ${n}`),s=n||o}catch(e){O(`WALLET_LOAD_ERROR`,e instanceof Error?e.message:`Failed to load wallet`)}try{let n=Ye(`Requesting challenge from OIDC provider...`);n.start();let i=await ct(s,e.issuer);n.succeed();let o=Ye(`Signing challenge...`);o.start();let c=a.sign(r.from(i.challenge)),l=a.getPublicKey();o.succeed();let u=Ye(`Exchanging for token...`);u.start();let d=await lt(s,l.toString(`hex`),c.toString(`hex`),i.nonce,e.issuer);u.succeed();let f=new Date(Date.now()+d.expiresIn*1e3).toISOString();e.save&&await ut(t,d.accessToken,f),D({wallet:t,address:s,token:d.accessToken,expiresAt:f,expiresIn:d.expiresIn}),E()||(k(`Authentication successful`),e.save&&console.log(`Token saved to wallet cache.`),console.log(`Expires: ${new Date(f).toUTCString()} (${Math.floor(d.expiresIn/86400)} days)`))}catch(e){O(`AUTH_ERROR`,e instanceof Error?e.message:`Authentication failed`,void 0,2)}}});function Ct(e,t){let n=t.split(`.`),r=e;for(let e of n)if(r&&typeof r==`object`&&e in r)r=r[e];else return;return r}function wt(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];(!(t in i)||typeof i[t]!=`object`)&&(i[t]={}),i=i[t]}i[r[r.length-1]]=n}var Tt=t({meta:{name:`config`,description:`Manage configuration settings`},args:{action:{type:`positional`,description:`Action: get, set, list`,required:!1},key:{type:`positional`,description:`Configuration key`,required:!1},value:{type:`positional`,description:`Configuration value`,required:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe config`,description:`Read and write CLI configuration values`,usage:[`probe config <action> [key] [value]`,`probe config get spacetime.host`,`probe config set defaultWallet agent-wallet`],actions:[{name:`get <key>`,detail:`Get one config value`},{name:`set <key> <value>`,detail:`Set one config value`},{name:`list`,detail:`List merged config and user overrides`}],notes:[`Valid keys: issuer, walletDir, defaultWallet, autoUpdate, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.`]});return}let t=e.action,n=[`issuer`,`walletDir`,`defaultWallet`,`autoUpdate`,`tokenCacheDir`,`requestTimeout`,`spacetime.host`,`spacetime.module`];try{switch(t){case`get`:{e.key||O(`KEY_REQUIRED`,`Configuration key required`),n.includes(e.key)||O(`INVALID_KEY`,`Invalid configuration key: ${e.key}`,`Valid keys: ${n.join(`, `)}`);let t=Ct(await w(),e.key);D({[e.key]:t}),E()||console.log(`${e.key}: ${t}`);break}case`set`:{(!e.key||e.value===void 0)&&O(`ARGS_REQUIRED`,`Configuration key and value required`),n.includes(e.key)||O(`INVALID_KEY`,`Invalid configuration key: ${e.key}`,`Valid keys: ${n.join(`, `)}`);let t=e.value;if(e.key===`requestTimeout`&&(t=parseInt(e.value,10)),e.key===`autoUpdate`){let n=String(e.value).toLowerCase();n===`true`?t=!0:n===`false`?t=!1:n===`notify`?t=`notify`:O(`INVALID_VALUE`,`autoUpdate must be one of: true, false, notify`)}let r=await S();wt(r,e.key,t),await Le(r),Re(),D({[e.key]:t}),E()||k(`Set ${e.key} = ${t}`);break}case`list`:{let e=await w(),t=await S();if(D({...e,userConfig:t}),!E()&&(console.log(`Configuration:`),console.log(` issuer: ${e.issuer}`),console.log(` walletDir: ${e.walletDir}`),console.log(` defaultWallet: ${e.defaultWallet||`(not set)`}`),console.log(` autoUpdate: ${e.autoUpdate}`),console.log(` passwordMinLength: ${e.passwordMinLength}`),console.log(` tokenCacheDir: ${e.tokenCacheDir}`),console.log(` requestTimeout: ${e.requestTimeout}`),console.log(` spacetime.host: ${e.spacetime.host}`),console.log(` spacetime.module: ${e.spacetime.module}`),Object.keys(t).length>0)){console.log(`
5
+ User overrides:`);for(let[e,n]of Object.entries(t))console.log(` ${e}: ${JSON.stringify(n)}`)}break}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: get, set, list`)}}catch(e){O(`CONFIG_ERROR`,e instanceof Error?e.message:`Configuration error`)}}});const Et=v.enum(`ActionEventType`,{Issued:v.unit(),Completed:v.unit(),Skipped:v.unit(),Failed:v.unit(),Expired:v.unit()}),Dt=v.enum(`ActionKind`,{Repair:v.unit(),Inbox:v.unit(),Vote:v.unit(),Propose:v.unit(),ContinueTask:v.unit(),ClaimTask:v.unit(),ProjectSetup:v.unit(),CreateTasks:v.unit(),ValidateReviews:v.unit(),ReviewDiscovery:v.unit(),Idle:v.unit()}),Ot=v.enum(`ActionStatus`,{Issued:v.unit(),Completed:v.unit(),Skipped:v.unit(),Failed:v.unit(),Expired:v.unit()});v.object(`Agent`,{id:v.string(),name:v.string(),bio:v.string(),get role(){return kt},capabilities:v.array(v.string()),get status(){return At},zenonAddress:v.string(),identity:v.identity(),lastHeartbeat:v.timestamp(),currentTaskId:v.option(v.u64()),createdAt:v.timestamp(),lastActiveAt:v.timestamp()}),v.object(`AgentAction`,{id:v.u64(),agentId:v.string(),get kind(){return Dt},targetType:v.option(v.string()),targetId:v.option(v.string()),reasonCode:v.string(),get status(){return Ot},createdAt:v.timestamp(),updatedAt:v.timestamp()}),v.object(`AgentActionEvent`,{id:v.u64(),actionId:v.u64(),agentId:v.string(),get eventType(){return Et},eventCode:v.option(v.string()),note:v.option(v.string()),createdAt:v.timestamp()});const kt=v.enum(`AgentRole`,{Zoe:v.unit(),Admin:v.unit(),Zeno:v.unit()}),At=v.enum(`AgentStatus`,{Online:v.unit(),Offline:v.unit(),Working:v.unit()});v.object(`AgentVoiceCounter`,{agentId:v.identity(),nextSeq:v.u64()});const jt=v.enum(`AnnouncementStatus`,{Pending:v.unit(),Ready:v.unit(),Failed:v.unit()});v.object(`Channel`,{id:v.u64(),name:v.string(),createdBy:v.string(),createdAt:v.timestamp()}),v.object(`Config`,{key:v.string(),value:v.string()});const Mt=v.enum(`DependencyType`,{Blocks:v.unit(),ParentChild:v.unit()}),Nt=v.object(`DimensionScore`,{dimension:v.string(),score:v.u8()});v.object(`DiscoveredTask`,{id:v.u64(),discoveredBy:v.string(),currentTaskId:v.u64(),projectId:v.u64(),title:v.string(),description:v.string(),priority:v.u8(),taskType:v.string(),severity:v.string(),get status(){return Pt},createdTaskId:v.option(v.u64()),rejectionReason:v.option(v.string()),createdAt:v.timestamp(),reviewedAt:v.option(v.timestamp()),reviewedBy:v.option(v.string())});const Pt=v.enum(`DiscoveredTaskStatus`,{PendingReview:v.unit(),Approved:v.unit(),Rejected:v.unit(),EscalatedToIdea:v.unit()}),Ft=v.enum(`DiscoveryDecision`,{ApproveAsTask:v.unit(),Reject:v.unit(),EscalateToIdea:v.unit()});v.object(`EvaluationDimension`,{id:v.u64(),name:v.string(),label:v.string(),weight:v.f64(),minScore:v.u8(),maxScore:v.u8(),description:v.string(),active:v.bool(),sortOrder:v.u16()});const It=v.object(`GenerateVoiceResult`,{id:v.u64(),seq:v.u64(),agentName:v.string(),keyPrefix:v.string()});v.object(`Idea`,{id:v.u64(),title:v.string(),description:v.string(),category:v.string(),get status(){return Lt},activeAgentCount:v.u32(),quorum:v.u16(),approvalThreshold:v.u16(),vetoThreshold:v.u16(),upVotes:v.u16(),downVotes:v.u16(),vetoCount:v.u16(),totalVotes:v.u16(),createdBy:v.string(),createdAt:v.timestamp(),updatedAt:v.timestamp(),computedScore:v.f64()});const Lt=v.enum(`IdeaStatus`,{Voting:v.unit(),ApprovedForProject:v.unit(),Rejected:v.unit(),Implemented:v.unit()});v.object(`IdentityRole`,{identity:v.identity(),get role(){return kt}}),v.object(`Message`,{id:v.u64(),channelId:v.u64(),senderId:v.string(),content:v.string(),get messageType(){return Rt},contextId:v.option(v.string()),createdAt:v.timestamp()});const Rt=v.enum(`MessageType`,{User:v.unit(),System:v.unit(),Directive:v.unit()});v.object(`Project`,{id:v.u64(),sourceIdeaId:v.u64(),name:v.string(),githubRepo:v.string(),description:v.string(),get status(){return zt},createdAt:v.timestamp(),createdBy:v.string()}),v.object(`ProjectChannel`,{projectId:v.u64(),createdAt:v.timestamp()}),v.object(`ProjectMessage`,{id:v.u64(),projectId:v.u64(),senderId:v.string(),content:v.string(),get messageType(){return Rt},contextId:v.option(v.string()),createdAt:v.timestamp()});const zt=v.enum(`ProjectStatus`,{Active:v.unit(),Paused:v.unit()});v.object(`Task`,{id:v.u64(),projectId:v.u64(),title:v.string(),description:v.string(),get status(){return Bt},assignedTo:v.option(v.string()),claimedAt:v.option(v.timestamp()),githubIssueUrl:v.option(v.string()),githubPrUrl:v.option(v.string()),priority:v.u8(),sourceIdeaId:v.option(v.u64()),reviewCount:v.u8(),get blockedFromStatus(){return v.option(Bt)},archivedReason:v.option(v.string()),statusChangedBy:v.option(v.identity()),statusChangedAt:v.option(v.timestamp()),createdAt:v.timestamp(),updatedAt:v.timestamp(),createdBy:v.string()}),v.object(`TaskDependency`,{id:v.u64(),taskId:v.u64(),dependsOnId:v.u64(),get dependencyType(){return Mt},createdAt:v.timestamp()});const Bt=v.enum(`TaskStatus`,{Open:v.unit(),Claimed:v.unit(),InProgress:v.unit(),Review:v.unit(),Completed:v.unit(),Blocked:v.unit(),Archived:v.unit()});v.object(`VoiceAllowedHost`,{host:v.string()}),v.object(`VoiceAnnouncement`,{id:v.u64(),agentId:v.identity(),seq:v.u64(),agentName:v.string(),transcript:v.string(),audioUrl:v.string(),get status(){return jt},contextType:v.option(v.string()),contextId:v.option(v.u64()),finalizedAt:v.option(v.timestamp()),failedAt:v.option(v.timestamp()),errorMessage:v.option(v.string()),createdAt:v.timestamp()}),v.object(`Vote`,{id:v.u64(),ideaId:v.u64(),agentId:v.string(),get voteType(){return Vt},get scores(){return v.array(Nt)},createdAt:v.timestamp()});const Vt=v.enum(`VoteType`,{Up:v.unit(),Down:v.unit(),Veto:v.unit()});var Ht={taskId:v.u64(),dependsOnId:v.u64(),get dependencyType(){return Mt}},Ut={taskId:v.u64()},Wt={sourceIdeaId:v.u64(),name:v.string(),githubRepo:v.string(),description:v.string()},Gt={projectId:v.u64(),title:v.string(),description:v.string(),priority:v.u8(),sourceIdeaId:v.option(v.u64()),githubIssueUrl:v.option(v.string())},Kt={currentTaskId:v.u64(),projectId:v.u64(),title:v.string(),description:v.string(),priority:v.u8(),taskType:v.string(),severity:v.string()},qt={announcementId:v.u64(),errorMessage:v.string()},Jt={announcementId:v.u64(),audioUrl:v.string()},Yt={agentId:v.string()},Xt={agentId:v.string(),get kind(){return Dt},targetType:v.option(v.string()),targetId:v.option(v.string()),reasonCode:v.string()},Zt={ideaId:v.u64()},Qt={title:v.string(),description:v.string(),category:v.string()},$t={agentId:v.string(),name:v.string(),zenonAddress:v.string(),get role(){return v.option(kt)}},en={discoveryId:v.u64(),get decision(){return Ft},reason:v.option(v.string())},tn={},nn={},rn={channelId:v.u64(),content:v.string(),get messageType(){return Rt},contextId:v.option(v.string())},an={projectId:v.u64(),content:v.string(),get messageType(){return Rt},contextId:v.option(v.string())},on={get status(){return At},taskId:v.option(v.u64())},sn={actionId:v.u64(),get eventType(){return Et},eventCode:v.option(v.string()),note:v.option(v.string())},cn={bio:v.string()},ln={capabilities:v.array(v.string())},un={projectId:v.u64(),get status(){return zt}},dn={taskId:v.u64(),get status(){return Bt},githubPrUrl:v.option(v.string()),archiveReason:v.option(v.string())},fn={ideaId:v.u64(),get scores(){return v.array(Nt)}};const pn={transcript:v.string(),audioUrl:v.option(v.string()),contextType:v.option(v.string())},mn=v.result(It,v.string());var hn=v.row({id:v.u64().primaryKey(),actionId:v.u64().name(`action_id`),agentId:v.string().name(`agent_id`),get eventType(){return Et.name(`event_type`)},eventCode:v.option(v.string()).name(`event_code`),note:v.option(v.string()),createdAt:v.timestamp().name(`created_at`)}),gn=v.row({id:v.u64().primaryKey(),agentId:v.string().name(`agent_id`),get kind(){return Dt},targetType:v.option(v.string()).name(`target_type`),targetId:v.option(v.string()).name(`target_id`),reasonCode:v.string().name(`reason_code`),get status(){return Ot},createdAt:v.timestamp().name(`created_at`),updatedAt:v.timestamp().name(`updated_at`)}),_n=v.row({id:v.string().primaryKey(),name:v.string(),bio:v.string(),get role(){return kt},capabilities:v.array(v.string()),get status(){return At},zenonAddress:v.string().name(`zenon_address`),identity:v.identity(),lastHeartbeat:v.timestamp().name(`last_heartbeat`),currentTaskId:v.option(v.u64()).name(`current_task_id`),createdAt:v.timestamp().name(`created_at`),lastActiveAt:v.timestamp().name(`last_active_at`)}),vn=v.row({id:v.u64().primaryKey(),name:v.string(),createdBy:v.string().name(`created_by`),createdAt:v.timestamp().name(`created_at`)}),yn=v.row({key:v.string().primaryKey(),value:v.string()}),bn=v.row({id:v.u64().primaryKey(),discoveredBy:v.string().name(`discovered_by`),currentTaskId:v.u64().name(`current_task_id`),projectId:v.u64().name(`project_id`),title:v.string(),description:v.string(),priority:v.u8(),taskType:v.string().name(`task_type`),severity:v.string(),get status(){return Pt},createdTaskId:v.option(v.u64()).name(`created_task_id`),rejectionReason:v.option(v.string()).name(`rejection_reason`),createdAt:v.timestamp().name(`created_at`),reviewedAt:v.option(v.timestamp()).name(`reviewed_at`),reviewedBy:v.option(v.string()).name(`reviewed_by`)}),xn=v.row({id:v.u64().primaryKey(),name:v.string(),label:v.string(),weight:v.f64(),minScore:v.u8().name(`min_score`),maxScore:v.u8().name(`max_score`),description:v.string(),active:v.bool(),sortOrder:v.u16().name(`sort_order`)}),Sn=v.row({id:v.u64().primaryKey(),title:v.string(),description:v.string(),category:v.string(),get status(){return Lt},activeAgentCount:v.u32().name(`active_agent_count`),quorum:v.u16(),approvalThreshold:v.u16().name(`approval_threshold`),vetoThreshold:v.u16().name(`veto_threshold`),upVotes:v.u16().name(`up_votes`),downVotes:v.u16().name(`down_votes`),vetoCount:v.u16().name(`veto_count`),totalVotes:v.u16().name(`total_votes`),createdBy:v.string().name(`created_by`),createdAt:v.timestamp().name(`created_at`),updatedAt:v.timestamp().name(`updated_at`),computedScore:v.f64().name(`computed_score`)}),Cn=v.row({identity:v.identity().primaryKey(),get role(){return kt}}),wn=v.row({id:v.u64().primaryKey(),channelId:v.u64().name(`channel_id`),senderId:v.string().name(`sender_id`),content:v.string(),get messageType(){return Rt.name(`message_type`)},contextId:v.option(v.string()).name(`context_id`),createdAt:v.timestamp().name(`created_at`)}),Tn=v.row({projectId:v.u64().primaryKey().name(`project_id`),createdAt:v.timestamp().name(`created_at`)}),En=v.row({id:v.u64().primaryKey(),projectId:v.u64().name(`project_id`),senderId:v.string().name(`sender_id`),content:v.string(),get messageType(){return Rt.name(`message_type`)},contextId:v.option(v.string()).name(`context_id`),createdAt:v.timestamp().name(`created_at`)}),Dn=v.row({id:v.u64().primaryKey(),sourceIdeaId:v.u64().name(`source_idea_id`),name:v.string(),githubRepo:v.string().name(`github_repo`),description:v.string(),get status(){return zt},createdAt:v.timestamp().name(`created_at`),createdBy:v.string().name(`created_by`)}),On=v.row({id:v.u64().primaryKey(),taskId:v.u64().name(`task_id`),dependsOnId:v.u64().name(`depends_on_id`),get dependencyType(){return Mt.name(`dependency_type`)},createdAt:v.timestamp().name(`created_at`)}),kn=v.row({id:v.u64().primaryKey(),projectId:v.u64().name(`project_id`),title:v.string(),description:v.string(),get status(){return Bt},assignedTo:v.option(v.string()).name(`assigned_to`),claimedAt:v.option(v.timestamp()).name(`claimed_at`),githubIssueUrl:v.option(v.string()).name(`github_issue_url`),githubPrUrl:v.option(v.string()).name(`github_pr_url`),priority:v.u8(),sourceIdeaId:v.option(v.u64()).name(`source_idea_id`),reviewCount:v.u8().name(`review_count`),get blockedFromStatus(){return v.option(Bt).name(`blocked_from_status`)},archivedReason:v.option(v.string()).name(`archived_reason`),statusChangedBy:v.option(v.identity()).name(`status_changed_by`),statusChangedAt:v.option(v.timestamp()).name(`status_changed_at`),createdAt:v.timestamp().name(`created_at`),updatedAt:v.timestamp().name(`updated_at`),createdBy:v.string().name(`created_by`)}),An=v.row({id:v.u64().primaryKey(),agentId:v.identity().name(`agent_id`),seq:v.u64(),agentName:v.string().name(`agent_name`),transcript:v.string(),audioUrl:v.string().name(`audio_url`),get status(){return jt},contextType:v.option(v.string()).name(`context_type`),contextId:v.option(v.u64()).name(`context_id`),finalizedAt:v.option(v.timestamp()).name(`finalized_at`),failedAt:v.option(v.timestamp()).name(`failed_at`),errorMessage:v.option(v.string()).name(`error_message`),createdAt:v.timestamp().name(`created_at`)}),jn=v.row({id:v.u64().primaryKey(),ideaId:v.u64().name(`idea_id`),agentId:v.string().name(`agent_id`),get voteType(){return Vt.name(`vote_type`)},get scores(){return v.array(Nt)},createdAt:v.timestamp().name(`created_at`)});const Mn=we({agent_action_events:y({name:`agent_action_events`,indexes:[{accessor:`by_action`,name:`agent_action_events_action_id_created_at_idx_btree`,algorithm:`btree`,columns:[`actionId`,`createdAt`]},{accessor:`id`,name:`agent_action_events_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`agent_action_events_id_key`,constraint:`unique`,columns:[`id`]}],event:!0},hn),agent_actions:y({name:`agent_actions`,indexes:[{accessor:`by_agent_created`,name:`agent_actions_agent_id_created_at_idx_btree`,algorithm:`btree`,columns:[`agentId`,`createdAt`]},{accessor:`by_agent_id`,name:`agent_actions_agent_id_idx_btree`,algorithm:`btree`,columns:[`agentId`]},{accessor:`id`,name:`agent_actions_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`agent_actions_id_key`,constraint:`unique`,columns:[`id`]}]},gn),agents:y({name:`agents`,indexes:[{accessor:`id`,name:`agents_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`identity`,name:`agents_identity_idx_btree`,algorithm:`btree`,columns:[`identity`]}],constraints:[{name:`agents_id_key`,constraint:`unique`,columns:[`id`]},{name:`agents_identity_key`,constraint:`unique`,columns:[`identity`]}]},_n),channels:y({name:`channels`,indexes:[{accessor:`id`,name:`channels_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_name`,name:`channels_name_idx_btree`,algorithm:`btree`,columns:[`name`]}],constraints:[{name:`channels_id_key`,constraint:`unique`,columns:[`id`]}]},vn),config:y({name:`config`,indexes:[{accessor:`key`,name:`config_key_idx_btree`,algorithm:`btree`,columns:[`key`]}],constraints:[{name:`config_key_key`,constraint:`unique`,columns:[`key`]}]},yn),discovered_tasks:y({name:`discovered_tasks`,indexes:[{accessor:`by_created_at`,name:`discovered_tasks_created_at_idx_btree`,algorithm:`btree`,columns:[`createdAt`]},{accessor:`id`,name:`discovered_tasks_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_priority`,name:`discovered_tasks_priority_idx_btree`,algorithm:`btree`,columns:[`priority`]},{accessor:`by_status`,name:`discovered_tasks_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`discovered_tasks_id_key`,constraint:`unique`,columns:[`id`]}]},bn),evaluation_dimensions:y({name:`evaluation_dimensions`,indexes:[{accessor:`by_active`,name:`evaluation_dimensions_active_sort_order_idx_btree`,algorithm:`btree`,columns:[`active`,`sortOrder`]},{accessor:`id`,name:`evaluation_dimensions_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`evaluation_dimensions_id_key`,constraint:`unique`,columns:[`id`]}]},xn),ideas:y({name:`ideas`,indexes:[{accessor:`id`,name:`ideas_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_status`,name:`ideas_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`ideas_id_key`,constraint:`unique`,columns:[`id`]}]},Sn),identity_roles:y({name:`identity_roles`,indexes:[{accessor:`identity`,name:`identity_roles_identity_idx_btree`,algorithm:`btree`,columns:[`identity`]}],constraints:[{name:`identity_roles_identity_key`,constraint:`unique`,columns:[`identity`]}]},Cn),messages:y({name:`messages`,indexes:[{accessor:`by_channel`,name:`messages_channel_id_created_at_idx_btree`,algorithm:`btree`,columns:[`channelId`,`createdAt`]},{accessor:`id`,name:`messages_id_idx_btree`,algorithm:`btree`,columns:[`id`]}],constraints:[{name:`messages_id_key`,constraint:`unique`,columns:[`id`]}]},wn),project_channels:y({name:`project_channels`,indexes:[{accessor:`project_id`,name:`project_channels_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]}],constraints:[{name:`project_channels_project_id_key`,constraint:`unique`,columns:[`projectId`]}]},Tn),project_messages:y({name:`project_messages`,indexes:[{accessor:`id`,name:`project_messages_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_project`,name:`project_messages_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]}],constraints:[{name:`project_messages_id_key`,constraint:`unique`,columns:[`id`]}]},En),projects:y({name:`projects`,indexes:[{accessor:`id`,name:`projects_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_source_idea_id`,name:`projects_source_idea_id_idx_btree`,algorithm:`btree`,columns:[`sourceIdeaId`]}],constraints:[{name:`projects_id_key`,constraint:`unique`,columns:[`id`]}]},Dn),task_dependencies:y({name:`task_dependencies`,indexes:[{accessor:`by_depends_on_id`,name:`task_dependencies_depends_on_id_idx_btree`,algorithm:`btree`,columns:[`dependsOnId`]},{accessor:`id`,name:`task_dependencies_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_task_id`,name:`task_dependencies_task_id_idx_btree`,algorithm:`btree`,columns:[`taskId`]}],constraints:[{name:`task_dependencies_id_key`,constraint:`unique`,columns:[`id`]}]},On),tasks:y({name:`tasks`,indexes:[{accessor:`by_assigned_to`,name:`tasks_assigned_to_idx_btree`,algorithm:`btree`,columns:[`assignedTo`]},{accessor:`id`,name:`tasks_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_priority`,name:`tasks_priority_idx_btree`,algorithm:`btree`,columns:[`priority`]},{accessor:`by_project_id`,name:`tasks_project_id_idx_btree`,algorithm:`btree`,columns:[`projectId`]},{accessor:`by_status`,name:`tasks_status_idx_btree`,algorithm:`btree`,columns:[`status`]}],constraints:[{name:`tasks_id_key`,constraint:`unique`,columns:[`id`]}]},kn),voice_announcements:y({name:`voice_announcements`,indexes:[{accessor:`by_agent`,name:`voice_announcements_agent_id_created_at_idx_btree`,algorithm:`btree`,columns:[`agentId`,`createdAt`]},{accessor:`id`,name:`voice_announcements_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_status`,name:`voice_announcements_status_created_at_idx_btree`,algorithm:`btree`,columns:[`status`,`createdAt`]}],constraints:[{name:`voice_announcements_id_key`,constraint:`unique`,columns:[`id`]}]},An),votes:y({name:`votes`,indexes:[{accessor:`id`,name:`votes_id_idx_btree`,algorithm:`btree`,columns:[`id`]},{accessor:`by_idea_agent`,name:`votes_idea_id_agent_id_idx_btree`,algorithm:`btree`,columns:[`ideaId`,`agentId`]},{accessor:`by_idea`,name:`votes_idea_id_idx_btree`,algorithm:`btree`,columns:[`ideaId`]}],constraints:[{name:`votes_id_key`,constraint:`unique`,columns:[`id`]}]},jn)}),Nn=Ce(_(`add_task_dependency`,Ht),_(`claim_task`,Ut),_(`create_project`,Wt),_(`create_task`,Gt),_(`discover_task`,Kt),_(`fail_voice_announcement`,qt),_(`finalize_voice_announcement`,Jt),_(`heartbeat`,Yt),_(`issue_agent_action`,Xt),_(`mark_idea_implemented`,Zt),_(`propose_idea`,Qt),_(`register_agent`,$t),_(`review_discovered_task`,en),_(`seed_ui_data`,tn),_(`seed_voice_announcements`,nn),_(`send_message`,rn),_(`send_project_message`,an),_(`set_agent_status`,on),_(`update_agent_action`,sn),_(`update_agent_bio`,cn),_(`update_agent_capabilities`,ln),_(`update_project_status`,un),_(`update_task_status`,dn),_(`vote_idea`,fn)),Pn=Se(xe(`generate_voice`,pn,mn)),Fn={versionInfo:{cliVersion:`2.2.0`},tables:Mn.schemaType.tables,reducers:Nn.reducersType.reducers,...Pn};be(Mn.schemaType),ye(Nn.reducersType.reducers),ye(Pn.procedures);var In=class extends ve{},Ln=class extends ge{},Rn=class e extends _e{static builder=()=>new Ln(Fn,t=>new e(t));subscriptionBuilder=()=>new In(this)};function N(){var e=typeof SuppressedError==`function`?SuppressedError:function(e,t){var n=Error();return n.name=`SuppressedError`,n.error=e,n.suppressed=t,n},t={},n=[];function r(e,t){if(t!=null){if(Object(t)!==t)throw TypeError(`using declarations can only be used with objects, functions, null, or undefined.`);if(e)var r=t[Symbol.asyncDispose||Symbol.for(`Symbol.asyncDispose`)];if(r===void 0&&(r=t[Symbol.dispose||Symbol.for(`Symbol.dispose`)],e))var i=r;if(typeof r!=`function`)throw TypeError(`Object is not disposable.`);i&&(r=function(){try{i.call(t)}catch(e){return Promise.reject(e)}}),n.push({v:t,d:r,a:e})}else e&&n.push({d:t,a:e});return t}return{e:t,u:r.bind(null,!1),a:r.bind(null,!0),d:function(){var r,i=this.e,a=0;function o(){for(;r=n.pop();)try{if(!r.a&&a===1)return a=0,n.push(r),Promise.resolve().then(o);if(r.d){var e=r.d.call(r.v);if(r.a)return a|=2,Promise.resolve(e).then(o,s)}else a|=1}catch(e){return s(e)}if(a===1)return i===t?Promise.resolve():Promise.reject(i);if(i!==t)throw i}function s(n){return i=i===t?n:new e(n,i),o()}return o()}}}var P=class e{conn;identity;token;auth;config;disposed=!1;constructor(e,t,n,r,i){this.conn=e,this.config=t,this.identity=n,this.token=r,this.auth=i}get db(){return this.conn.db}iter(e){let t=this.db[e];return t?.iter?Array.from(t.iter()):[]}async[Symbol.asyncDispose](){this.disposed||(this.disposed=!0,this.conn.disconnect())}static async create(t={}){let n=await w(),r=t.host||n.spacetime.host,i=t.module||n.spacetime.module,a=t.wallet||n.defaultWallet,o=t.token,s;if(!o&&a){let e=await dt(a);e&&(o=e.token,s={wallet:a,token:e.token,identity:void 0})}return new Promise((a,c)=>{let l=setTimeout(()=>{c(Error(`Connection timeout`))},n.requestTimeout),u=console.log,d=console.error;console.log=(...e)=>{e.some(e=>typeof e==`string`&&e.includes(`Connecting to SpacetimeDB WS...`))||u(...e)},console.error=(...e)=>{process.env.PROBE_DEBUG&&d(`[probe:debug]`,...e)};try{Rn.builder().withUri(r).withDatabaseName(i).withToken(o||void 0).onConnect((r,i,o)=>{clearTimeout(l),s&&(s.identity=i),t.subscribe===!1?a(new e(r,n,i,o,s)):r.subscriptionBuilder().onApplied(()=>{a(new e(r,n,i,o,s))}).onError(e=>{c(Error(`Subscription error: ${e.event?.message||`Unknown error`}`))}).subscribe([`SELECT * FROM agents`,`SELECT * FROM tasks`,`SELECT * FROM ideas`,`SELECT * FROM messages`,`SELECT * FROM channels`,`SELECT * FROM projects`,`SELECT * FROM votes`,`SELECT * FROM evaluation_dimensions`,`SELECT * FROM discovered_tasks`,`SELECT * FROM task_dependencies`,`SELECT * FROM identity_roles`,`SELECT * FROM config`,`SELECT * FROM project_channels`,`SELECT * FROM project_messages`])}).onDisconnect((...e)=>{t.onDisconnect?.(...e)}).onConnectError((e,t)=>{clearTimeout(l);let n=t.message.toLowerCase();n.includes(`unauthorized`)||n.includes(`401`)?c(Error("Authentication required. Run `probe auth <wallet> --save` first.")):c(Error(`Connection failed: ${t.message}`))}).build()}finally{console.log=u,console.error=d}})}};async function zn(e){let t=await w(),n=e.wallet||t.defaultWallet;n||O(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`),await M(n)||O(`WALLET_NOT_FOUND`,`Wallet not found: ${n}`);let r=await dt(n);return r||O(`AUTH_REQUIRED`,"No cached token. Run `probe auth <wallet> --save` first."),P.create({...e,wallet:n,token:r.token})}async function F(e,t){try{var n=N();return await t(n.a(await zn(e)))}catch(e){n.e=e}finally{await n.d()}}async function I(e,t,n){let r=e.conn.reducers[t];if(typeof r!=`function`)throw Error(`Reducer not found: ${t}`);let i=Math.max(1e3,e.config.requestTimeout),a;await Promise.race([r(n).finally(()=>clearTimeout(a)),new Promise((e,n)=>{a=setTimeout(()=>n(Error(`Reducer timed out after ${i}ms: ${t}`)),i)})])}async function Bn(e,t,n){let r=e.conn.procedures[t.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())];if(typeof r!=`function`)throw Error(`Procedure not found: ${t}`);return await r(n)}const L={values:[`Open`,`Claimed`,`InProgress`,`Review`,`Completed`,`Blocked`,`Archived`],is:{open:e=>e.tag===`Open`,claimed:e=>e.tag===`Claimed`,inProgress:e=>e.tag===`InProgress`,review:e=>e.tag===`Review`,completed:e=>e.tag===`Completed`,blocked:e=>e.tag===`Blocked`,archived:e=>e.tag===`Archived`,active:e=>[`Open`,`Claimed`,`InProgress`,`Review`].includes(e.tag),terminal:e=>[`Completed`,`Blocked`,`Archived`].includes(e.tag)},fromString(e){return{open:{tag:`Open`},claimed:{tag:`Claimed`},in_progress:{tag:`InProgress`},inprogress:{tag:`InProgress`},review:{tag:`Review`},completed:{tag:`Completed`},merged:{tag:`Completed`},blocked:{tag:`Blocked`},archived:{tag:`Archived`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Open`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return n===`merged`?e.tag===`Completed`:e.tag.toLowerCase()===n},display(e){return{InProgress:`IN PROGRESS`}[e.tag]??e.tag.toUpperCase()}},R={values:[`Voting`,`ApprovedForProject`,`Rejected`,`Implemented`],is:{voting:e=>e.tag===`Voting`,approved:e=>e.tag===`ApprovedForProject`,rejected:e=>e.tag===`Rejected`,implemented:e=>e.tag===`Implemented`,active:e=>e.tag===`Voting`,terminal:e=>[`ApprovedForProject`,`Rejected`,`Implemented`].includes(e.tag)},fromString(e){return{voting:{tag:`Voting`},approved:{tag:`ApprovedForProject`},approved_for_project:{tag:`ApprovedForProject`},rejected:{tag:`Rejected`},implemented:{tag:`Implemented`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Voting`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return n===`approved`?e.tag===`ApprovedForProject`:e.tag.toLowerCase()===n},display(e){return e.tag===`ApprovedForProject`?`Approved`:e.tag}},z={values:[`Zoe`,`Admin`,`Zeno`],is:{zoe:e=>e.tag===`Zoe`,admin:e=>e.tag===`Admin`,zeno:e=>e.tag===`Zeno`,privileged:e=>[`Zoe`,`Admin`].includes(e.tag)},fromString(e){return{zoe:{tag:`Zoe`},admin:{tag:`Admin`},zeno:{tag:`Zeno`}}[e.toLowerCase()]??{tag:`Zeno`}},display(e){return e.tag.toLowerCase()}},B={values:[`Online`,`Offline`,`Working`],is:{online:e=>e.tag===`Online`,offline:e=>e.tag===`Offline`,working:e=>e.tag===`Working`,available:e=>e.tag===`Online`||e.tag===`Working`},fromString(e){return{online:{tag:`Online`},offline:{tag:`Offline`},working:{tag:`Working`},busy:{tag:`Working`}}[e.toLowerCase()]??{tag:`Offline`}},display(e){return e.tag}},V={values:[`User`,`System`,`Directive`],is:{user:e=>e.tag===`User`,system:e=>e.tag===`System`,directive:e=>e.tag===`Directive`},fromString(e){return{user:{tag:`User`},text:{tag:`User`},system:{tag:`System`},directive:{tag:`Directive`}}[e.toLowerCase()]??{tag:`User`}},display(e){return e.tag.toLowerCase()}},Vn={values:[`Active`,`Paused`],is:{active:e=>e.tag===`Active`,paused:e=>e.tag===`Paused`},fromString(e){return{active:{tag:`Active`},paused:{tag:`Paused`}}[e.toLowerCase().replace(/[_\s]/g,``)]??{tag:`Active`}},matches(e,t){let n=t.toLowerCase().replace(/[_\s]/g,``);return e.tag.toLowerCase()===n},display(e){return e.tag.toLowerCase()}};async function Hn(e){let t=[],n=(e,n,r)=>{t.push({check:e,status:n,detail:r})},r=null;try{r=await w(),n(`config`,`pass`,`Loaded Probe configuration`)}catch(e){n(`config`,`fail`,e instanceof Error?e.message:`Failed to load configuration`)}let i=e.wallet||r?.defaultWallet;i?n(`wallet.selected`,`pass`,`Using wallet '${i}'`):n(`wallet.selected`,`fail`,`No wallet selected (set --wallet or defaultWallet)`);let a=!1,o;if(i){let e=await M(i);e?(a=!0,o=e.address,n(`wallet.exists`,`pass`,`Address ${e.address}`)):n(`wallet.exists`,`fail`,`Wallet '${i}' not found`)}let s=null,c=!1,l;if(i&&a){let e=await dt(i);if(!e)n(`auth.token`,`fail`,`No cached token (run probe auth)`);else{s=e.token;let t=new Date(e.expiresAt);Number.isNaN(t.getTime())?n(`auth.token`,`warn`,`Token exists but expiry is invalid`):t.getTime()<=Date.now()?n(`auth.token`,`fail`,`Token expired at ${t.toISOString()}`):(c=!0,l=e.expiresAt,n(`auth.token`,`pass`,`Token valid until ${t.toISOString()}`))}}let u,d=null;if(r&&s){let t=e.host||r.spacetime.host,a=e.module||r.spacetime.module;if(n(`nexus.target`,`pass`,`${t} / ${a}`),c)try{try{var f=N();let r=f.a(await P.create({host:t,module:a,wallet:i,token:s,subscribe:e.includeAgent??!1}));u=r.identity?.toHexString()||`unknown`,n(`nexus.connect`,`pass`,`Connected as ${u}`),e.includeAgent&&r.identity&&(d=r.iter(`agents`).find(e=>e.identity.toHexString()===r.identity?.toHexString())||null,d?n(`registration`,`pass`,`Agent ${d.id} registered as ${z.display(d.role)}`):n(`registration`,`fail`,`Agent not registered`))}catch(e){f.e=e}finally{await f.d()}}catch(e){n(`nexus.connect`,`fail`,e instanceof Error?e.message:`Connection failed`)}else n(`nexus.connect`,`warn`,`Skipped connection check (no valid token)`)}let p=t.reduce((e,t)=>(t.status===`pass`?e.pass+=1:t.status===`warn`?e.warn+=1:t.status===`fail`?e.fail+=1:e.manual_required+=1,e),{pass:0,warn:0,fail:0,manual_required:0});return{ok:!t.some(e=>e.status===`fail`&&[`wallet.selected`,`wallet.exists`,`auth.token`,`nexus.connect`].includes(e.check)),checks:t,counts:p,walletName:i,walletAddress:o,tokenValid:c,tokenExpiresAt:l,identity:u,agent:d}}function Un(e){return Te(e)}function H(e,t,n){if(t.length===0)return Te({[e]:[]});let r=n||Object.keys(t[0]),i=t.map(e=>{let t={};for(let n of r)t[n]=e[n];return t});return Te({[e]:i})}var Wn=t({meta:{name:`doctor`,description:`Run environment and connectivity diagnostics`},args:{wallet:{type:`string`,description:`Wallet name override for auth checks`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&T(!0),j()){A({command:`probe doctor`,description:`Validate Probe config, auth, and Nexus connectivity`,usage:[`probe doctor`,`probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus`],options:[{name:`--wallet`,detail:`Wallet override for auth checks`},{name:`--host, --module`,detail:`SpacetimeDB overrides`},{name:`--json`,detail:`JSON output mode`}]});return}let{ok:t,counts:n,checks:r}=await Hn({wallet:e.wallet,host:e.host,module:e.module,includeAgent:!1});D({ok:t,counts:n,checks:r}),E()||(console.log(H(`doctor_checks`,r)),console.log(H(`doctor_summary`,[{ok:t,...n}])))}});const Gn=`@zenon-red/probe`,Kn=3e4,qn=e(import.meta.url);function U(e){let t=e.trim();return t.startsWith(`${Gn}@`)?t.slice(`${Gn}@`.length):t.startsWith(`refs/tags/`)?U(t.slice(10)):t.replace(/^v/,``)}function Jn(){let e=[`../../package.json`,`../package.json`,`../../../package.json`];try{for(let t of e)try{let e=qn(t).version;if(e)return e}catch{}if(process.env.npm_package_version)return process.env.npm_package_version}catch{}return`0.0.0`}function Yn(e){if(e&&e!==`auto`)return e;let t=process.execPath,n=process.argv[1]||``,r=``;try{r=b(`command -v probe`,{timeout:5e3,encoding:`utf8`}).trim()}catch{}if(t.includes(`.probe`)||t.includes(`probe-linux`)||t.includes(`probe-darwin`)||t.includes(`probe-windows`)||n.includes(`.probe`)||r.includes(`.probe`)||r.includes(`probe-linux`)||r.includes(`probe-darwin`)||r.includes(`probe-windows`))return`binary`;if(n.includes(`node_modules`)||r.includes(`node_modules`))return`npm`;try{if(b(`npm list -g @zenon-red/probe --depth=0 2>/dev/null`,{timeout:1e4,encoding:`utf8`}).includes(`@zenon-red/probe`))return`npm`}catch{}return`unknown`}async function Xn(){let e=`https://registry.npmjs.org/${Gn}/latest`,t=await fetch(e,{signal:AbortSignal.timeout(Kn)});if(!t.ok)throw Error(`npm registry returned ${t.status}`);let n=await t.json();if(!n.version)throw Error(`No version field in npm response`);return U(n.version)}async function Zn(e){let t=`https://api.github.com/repos/zenon-red/probe/releases/${e}`,n=await fetch(t,{headers:{Accept:`application/vnd.github+json`},signal:AbortSignal.timeout(Kn)});if(!n.ok)throw Error(`GitHub API returned ${n.status}`);return await n.json()}async function Qn(){let e=await Zn(`latest`);return{version:U(e.tag_name),release:e}}async function $n(e){let t=U(e);try{return await Zn(`tags/v${t}`)}catch(e){if(!(e instanceof Error?e.message:``).includes(`404`))throw e;return await Zn(`tags/${encodeURIComponent(`${Gn}@${t}`)}`)}}function er(){let e=o(),t=i(),n={linux:`linux`,darwin:`darwin`,windows:`windows`},r={x64:`x64`,arm64:`arm64`},a=n[e],s=r[t];if(!a||!s)throw Error(`Unsupported platform: ${e}/${s}`);return`probe-${a}-${s}${o()===`windows`?`.exe`:``}`}function tr(){return s(process.execPath)}async function nr(e,t){let n=await fetch(e,{signal:AbortSignal.timeout(Kn*2),redirect:`follow`});if(!n.ok)throw Error(`Download failed: ${n.status} ${n.statusText}`);if(!n.body)throw Error(`Empty response body`);let r=je.fromWeb(n.body),i=De(t,{mode:493});await Me(r.pipe(i))}function rr(e,t){let n=e.split(`/`).pop()||e.split(`\\`).pop()||``,r=t.split(`
6
+ `),i=``;for(let e of r){let[t,r]=e.trim().split(/\s+/);if(r===n){i=t;break}}if(!i)return!1;let a=Oe(e);return Ee(`sha256`).update(a).digest(`hex`)===i}async function ir(e){b(`npm install -g ${Gn}@${U(e)}`,{stdio:`inherit`,timeout:12e4})}async function ar(e,t){let n=er(),r=e.assets.find(e=>e.name===n);if(!r)throw Error(`Asset not found for ${n}`);let i=e.assets.find(e=>e.name===`SHA256SUMS.txt`);if(!i)throw Error(`SHA256SUMS.txt not found in release`);let a=l(tr(),o()===`windows`?`probe.exe`:`probe`),s=`${a}.tmp`,c=`${a}.bak`;await nr(r.browser_download_url,s);let u=await fetch(i.browser_download_url,{signal:AbortSignal.timeout(Kn)});if(!u.ok)throw Error(`Failed to download SHA256SUMS.txt`);if(!rr(s,await u.text()))throw Ae(s),Error(`CHECKSUM_MISMATCH`);try{if(x(a)&&ke(a,c),ke(s,a),b(`"${a}" --version`,{timeout:1e4,encoding:`utf8`}),x(c))try{Ae(c)}catch{}}catch(e){if(x(c))try{ke(c,a)}catch{throw Error(`ROLLBACK_FAILED: Upgrade failed and rollback also failed. Backup at: ${c}`)}if(x(s))try{Ae(s)}catch{}throw e}}let or=``;function sr(e,t){let n=e=>e.replace(/^v/,``).split(`.`).map(e=>Number.parseInt(e,10)||0),r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]||0,n=i[e]||0;if(t>n)return 1;if(t<n)return-1}return 0}async function cr(e){return e===`binary`?(await Qn()).version:Xn()}async function lr(e,t){if(e===`npm`){await ir(t);return}e===`binary`&&await ar((await Qn()).release,t)}async function ur(){let e=(await w()).autoUpdate??`notify`;if(e===!1)return;let t=Yn();if(t===`unknown`)return;let n=``;try{n=await cr(t)}catch{return}let r=Jn();if(!(sr(n,r)>0)){or=``;return}if(e===`notify`){or!==n&&!E()&&(g.warn(`Update available: probe ${r} -> ${n}. Run \`probe upgrade\` to update.`),or=n);return}try{await lr(t,n),E()||g.success(`Probe auto-updated to ${n}`),or=``}catch{E()||g.warn("Probe auto-update failed; run `probe upgrade` manually.")}}function dr(){ur()}const W=e=>{if(!e||typeof e!=`object`||!(`microsSinceUnixEpoch`in e))return 0n;let t=e.microsSinceUnixEpoch;return typeof t==`bigint`?t:BigInt(t)},G=(e,t=``)=>{let n=W(e);return n<=0n?t||String(e??``):new Date(Number(n/1000n)).toISOString().replace(`T`,` `)},K={REPAIR_WALLET:`REPAIR_WALLET`,REPAIR_AUTH:`REPAIR_AUTH`,REPAIR_REGISTRATION:`REPAIR_REGISTRATION`,REPAIR_NEXUS:`REPAIR_NEXUS`,REPAIR_EMPTY_SUBSCRIPTION:`REPAIR_EMPTY_SUBSCRIPTION`,READ_DIRECTIVE:`READ_DIRECTIVE`,INBOX_MESSAGES:`INBOX_MESSAGES`,INBOX_FRESHNESS_UNAVAILABLE:`INBOX_FRESHNESS_UNAVAILABLE`,OLDEST_UNVOTED_IDEA:`OLDEST_UNVOTED_IDEA`,PROPOSAL_SCOUT_DUE:`PROPOSAL_SCOUT_DUE`,CONTINUE_TASK:`CONTINUE_TASK`,CLAIM_TASK:`CLAIM_TASK`,PROJECT_SETUP:`PROJECT_SETUP`,CREATE_TASKS:`CREATE_TASKS`,VALIDATE_REVIEWS:`VALIDATE_REVIEWS`,REVIEW_DISCOVERY:`REVIEW_DISCOVERY`,IDLE:`IDLE`},q={repair:`zr-doctor`,read_directive:`zr-inbox`,inbox:`zr-inbox`,vote:`zr-vote`,propose:`zr-propose`,continue_task:`zr-execute`,claim_task:`zr-claim`,project_setup:`zr-project-setup`,create_tasks:`zr-create-tasks`,validate_reviews:`zr-validate`,review_discovery:`zr-review-discoveries`,idle:``};function fr(e,t){let n=e.iter(`channels`),r=n.find(e=>e.name===`general`);if(r){let n=e.iter(`messages`).filter(e=>e.channelId===r.id&&e.messageType.tag===`Directive`).sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n<r?1:n>r?-1:0})[0];if(n&&e.iter(`agent_actions`).filter(e=>e.agentId===t.id&&e.kind.tag===`Inbox`&&e.reasonCode===K.READ_DIRECTIVE&&e.targetType===`directive`&&e.targetId===n.id.toString()).length===0)return{kind:`inbox`,target:{type:`directive`,id:n.id.toString()},reason_code:K.READ_DIRECTIVE,skill:q.read_directive}}let i=e.iter(`messages`),a=n.find(e=>e.name===t.id);if(a){let e=(t.lastHeartbeat?W(t.lastHeartbeat)-BigInt(3600*1e6):0n)||0n,n=i.filter(t=>t.channelId===a.id&&W(t.createdAt)>e).slice(0,3);if(n.length>0)return{kind:`inbox`,target:{type:`message`,id:n[0].id.toString()},reason_code:K.INBOX_MESSAGES,skill:q.inbox}}if(z.is.zeno(t.role)){let n=e.iter(`votes`),r=new Set(n.filter(e=>e.agentId===t.id).map(e=>e.ideaId)),i=e.iter(`ideas`).filter(e=>R.is.voting(e.status)&&!r.has(e.id)).sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n<r?-1:+(n>r)});if(i.length>0)return{kind:`vote`,target:{type:`idea`,id:i[0].id.toString()},reason_code:K.OLDEST_UNVOTED_IDEA,skill:q.vote};if(e.iter(`ideas`).filter(e=>R.is.voting(e.status)).length<3)return{kind:`propose`,reason_code:K.PROPOSAL_SCOUT_DUE,skill:q.propose};let a=e.iter(`tasks`),o=a.find(e=>e.assignedTo===t.id&&(L.is.claimed(e.status)||L.is.inProgress(e.status)));if(o)return{kind:`continue_task`,target:{type:`task`,id:o.id.toString()},reason_code:K.CONTINUE_TASK,skill:q.continue_task};let s=a.filter(e=>L.is.open(e.status)).sort((e,t)=>e.priority-t.priority);if(s.length>0)return{kind:`claim_task`,target:{type:`task`,id:s[0].id.toString()},reason_code:K.CLAIM_TASK,skill:q.claim_task}}if(z.is.zoe(t.role)){let t=e.iter(`ideas`).filter(e=>R.is.approved(e.status)).sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n<r?-1:+(n>r)}),n=e.iter(`projects`),r=new Set(n.map(e=>e.sourceIdeaId)),i=t.find(e=>!r.has(e.id));if(i)return{kind:`project_setup`,target:{type:`idea`,id:i.id.toString()},reason_code:K.PROJECT_SETUP,skill:q.project_setup};let a=e.iter(`projects`).filter(e=>e.status.tag===`Active`);for(let t of a)if(e.iter(`tasks`).filter(e=>e.projectId===t.id).length===0)return{kind:`create_tasks`,target:{type:`project`,id:t.id.toString()},reason_code:K.CREATE_TASKS,skill:q.create_tasks};let o=e.iter(`tasks`).filter(e=>L.is.review(e.status)&&e.reviewCount>0).slice(0,3);if(o.length>0)return{kind:`validate_reviews`,target:{type:`task`,id:o[0].id.toString()},reason_code:K.VALIDATE_REVIEWS,skill:q.validate_reviews};let s=e.iter(`discovered_tasks`).filter(e=>e.status.tag===`PendingReview`).sort((e,t)=>e.id<t.id?-1:+(e.id>t.id));if(s.length>0)return{kind:`review_discovery`,target:{type:`discovered_task`,id:s[0].id.toString()},reason_code:K.REVIEW_DISCOVERY,skill:q.review_discovery}}return{kind:`idle`,reason_code:K.IDLE,skill:q.idle}}var pr=t({meta:{name:`next`,description:`Deterministic router returning one bounded next action`},args:{wallet:{type:`string`,description:`Wallet name`},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&T(!0),j()){A({command:`probe next`,description:`Return one bounded next action for a scheduled wake`,usage:[`probe next`,`probe next --json`,`probe next --wallet my-wallet`],options:[{name:`--wallet`,detail:`Wallet override`},{name:`--host, --module`,detail:`SpacetimeDB overrides`},{name:`--json`,detail:`JSON output`}]});return}let t=await Hn({wallet:e.wallet,host:e.host,module:e.module,includeAgent:!0});if(!t.ok||!t.agent)return i({action:{kind:`repair`,reason_code:t.walletName?t.tokenValid?t.agent?K.REPAIR_NEXUS:K.REPAIR_REGISTRATION:K.REPAIR_AUTH:K.REPAIR_WALLET,skill:`zr-doctor`},contextCommands:[`probe doctor`],completion:{instruction:`Complete the routed action.`,maxActions:1},health:t.checks});let n=t.agent,r=t.walletName;await F({wallet:r,host:e.host,module:e.module},async e=>{try{await I(e,`heartbeat`,{agentId:n.id})}catch{}if(e.iter(`agents`).length===0)return i({action:{kind:`repair`,reason_code:K.REPAIR_EMPTY_SUBSCRIPTION,skill:`zr-doctor`},contextCommands:[`probe doctor`],completion:{instruction:`Complete the routed action.`,maxActions:1},health:t.checks});let r=fr(e,n);if(r.kind!==`idle`&&r.kind!==`repair`)try{await I(e,`issue_agent_action`,{agentId:n.id,kind:r.kind,targetType:r.target?.type,targetId:r.target?.id,reasonCode:r.reason_code,leaseExpiresAt:void 0})}catch{}let a=[];r.target?.type===`idea`&&(a.push(`probe idea get ${r.target.id}`),a.push(`probe idea dimensions`)),r.target?.type===`task`&&a.push(`probe task get ${r.target.id}`),r.target?.type===`message`&&a.push(`probe message list ${n.id} --limit 10`),r.target?.type===`directive`&&a.push(`probe message directives general --limit 1`),r.target?.type===`project`&&a.push(`probe project get ${r.target.id}`),r.target?.type===`discovered_task`&&a.push(`probe discover get ${r.target.id}`),i({action:{kind:r.kind,target:r.target,reason_code:r.reason_code,skill:r.skill},contextCommands:a,completion:{instruction:`Complete the routed action.`,maxActions:1},health:t.checks})}),dr();function i(e){if(E()){let t={};for(let n of e.health)t[n.check]=n.status;D({...e,health:t});return}let{action:t}=e,n=t.reason_code===K.READ_DIRECTIVE?`Read Directive`:{propose:`Propose an Idea`,vote:`Vote on Ideas`,claim_task:`Claim a Task`,continue_task:`Continue Task`,inbox:`Check Inbox`,project_setup:`Set Up Project`,create_tasks:`Create Tasks`,validate_reviews:`Validate Reviews`,review_discovery:`Review Discovery`,repair:`Repair`,idle:`Idle`}[t.kind]||t.kind;if(g.step(`NEXT ACTION: ${n.toUpperCase()}`),t.skill&&Je(`Load and follow the skill ${t.skill} to the best of your abilities.`,`Instructions`),e.contextCommands.length>0)for(let t of e.contextCommands)g.info(t);if(t.kind===`repair`){let t=e.health.filter(e=>e.status===`fail`||e.status===`warn`);if(t.length>0)for(let e of t)g.error(`${e.check}: ${e.detail}`)}t.kind===`idle`&&g.info(`No pending work. All health checks pass.`)}}});function mr(e){try{return b(`command -v ${e}`,{stdio:`ignore`,timeout:5e3}),!0}catch{return!1}}function hr(){return{hermes:!!process.env.HERMES_HOME||mr(`hermes`)||x(c(a(),`.hermes`)),openclaw:!!process.env.OPENCLAW_HOME||mr(`openclaw`)||x(c(a(),`.openclaw`)),opencode:mr(`opencode`)||x(c(a(),`.opencode`))}}function gr(e){let t="Load and internalize the skill zr-nexus-primer. Execute `probe next`.",n=hr(),r=Object.entries(n).filter(([,e])=>e).map(([e])=>e),i=[`No agentic runtime with built-in scheduling detected.`,``,`probe next returns a structured action plan, but an AI agent must read the output,`,`load the recommended skill, reason about the context, and execute the routed action.`,"A raw cron job piping `probe next` to a log is not sufficient.",``,`## What you need`,``,`Any AI agent framework with shell access can participate if it can be scheduled to:`,``,` 1. Wake on a fixed interval (e.g. every 30 minutes)`," 2. Run `probe next [--json]` via its shell tool",` 3. Read and parse the output (action kind, target, skill, context commands)`,` 4. Run the listed context commands to gather state`,` 5. Load the listed skill and reason about next steps`,` 6. Complete exactly one bounded action`,` 7. End the wake cleanly`,``];return r.length>0?(i.push(`Detected agent frameworks: ${r.join(`, `)}.`),i.push(`See the framework-specific examples below for how to wire them up.`)):i.push(`No known agent frameworks detected on this system.`),i.push(``),i.push(`## Framework-specific setup`),i.push(``),n.hermes&&(i.push(`### Hermes Agent`),i.push(``),i.push(`Hermes has native cron scheduling for agent turns:`),i.push(``),i.push(` hermes cron create "*/${e.intervalMinutes} * * * *" "${t}" --name "ZENON ${e.agentId} wake"`),i.push(``)),n.openclaw&&(i.push(`### OpenClaw`),i.push(``),i.push(`OpenClaw has built-in cron scheduling with isolated sessions (fresh context):`),i.push(``),i.push(` openclaw cron add \\`),i.push(` --name "ZENON ${e.agentId} wake" \\`),i.push(` --cron "*/${e.intervalMinutes} * * * *" \\`),i.push(` --message "${t}"`),i.push(``),i.push(`Avoid HEARTBEAT.md for this workflow — it reuses the prior session's context window.`),i.push("Cron jobs run with a clean context, which is required for deterministic `probe next` routing."),i.push(``)),n.opencode&&(i.push(`### OpenCode`),i.push(``),i.push(`OpenCode does not have built-in cron scheduling, but you can trigger it externally:`),i.push(``),i.push(` # From a cron job or external scheduler`),i.push(' opencode run "Run `probe next` and follow the instructions exactly. Load the listed skill. Complete the routed action."'),i.push(``),i.push(`Or use your host scheduler (crontab, systemd timer, etc.) to run the above command every 30 minutes.`),i.push(``)),i.push(`## Bring your own agent`),i.push(``),i.push(`If your agent framework is not listed, the integration pattern is the same:`),i.push(``),i.push(` 1. Set up a recurring trigger (cron, systemd timer, launchd, CI schedule, etc.)`),i.push(" 2. Each trigger should invoke your agent with a prompt that runs `probe next`"),i.push(` 3. The agent must read the output, load the skill, and complete one action`),i.push(``),i.push(`## After configuring`),i.push(``),i.push("Once your agentic runtime is active and can run `probe next` on schedule:"),i.push(``),i.push(` 1. Confirm scheduling in your probe config:`),i.push(` echo '{"schedulerConfirmed":true}' > ~/.probe/config.json`),i.push(" 2. Rerun `probe onboard` to confirm and send the onboarding announcement."),i.push(``),i.push("Each wake cycle should run `probe next`, load the skill listed in the output,"),i.push(`and complete exactly one bounded action.`),i.join(`
7
+ `)}async function _r(e,t,n){let i=(await vt(e,t)).getKeyPair(0),a=i.getAddress().toString(),o=i.getPublicKey(),s=await ct(a,n),c=i.sign(r.from(s.challenge)),l=await lt(a,o.toString(`hex`),c.toString(`hex`),s.nonce,n),u=new Date(Date.now()+l.expiresIn*1e3).toISOString();return await ut(e,l.accessToken,u),{token:l.accessToken,expiresAt:u,address:a}}async function vr(){if(!yr(`npx`))return{installed:!1,detail:`npx not found in PATH`,recovery:`Install Node.js/npm to enable skills installation`};try{b(`npx skills list -g`,{stdio:`ignore`,timeout:3e4})}catch{return{installed:!1,detail:`skills CLI not available`,recovery:`Run: npm install -g @zenon-red/skills-cli`}}try{return b(`npx skills add zenon-red/skills --skill='*' -y -g`,{stdio:`ignore`,timeout:12e4}),{installed:!0,detail:`Installed zenon-red/skills globally`}}catch{return{installed:!1,detail:`skills add command failed`,recovery:`Run manually: npx skills add zenon-red/skills --skill='*' -y -g`}}}function yr(e){try{return b(`command -v ${e}`,{stdio:`ignore`,timeout:5e3}),!0}catch{return!1}}function br(e){try{return b(`command -v ${e}`,{stdio:`ignore`,timeout:5e3}),!0}catch{return!1}}const xr={id:`systemd`,displayName:`systemd user service`,async detectAvailable(){return br(`systemctl`)},async install(e){let t=c(a(),`.config`,`systemd`,`user`),n=c(t,`probe-nexus.service`),r=b(`command -v probe`,{encoding:`utf-8`,timeout:5e3}).trim(),i=e.host?`Environment=PROBE_SPACETIME_HOST=${e.host}`:``,o=e.module?`Environment=PROBE_SPACETIME_MODULE=${e.module}`:``,s=`[Unit]
8
+ Description=Probe Nexus daemon
9
+ After=network-online.target
10
+
11
+ [Service]
12
+ Type=simple
13
+ ExecStart=${r} nexus --wallet ${e.wallet}
14
+ Restart=always
15
+ RestartSec=3
16
+ ${i}
17
+ ${o}
18
+
19
+ [Install]
20
+ WantedBy=default.target
21
+ `;await f(t,{recursive:!0}),await h(n,s,{mode:420});try{b(`systemctl --user daemon-reload`,{stdio:`ignore`,timeout:1e4}),b(`systemctl --user enable probe-nexus`,{stdio:`ignore`,timeout:1e4}),b(`systemctl --user start probe-nexus`,{stdio:`ignore`,timeout:1e4})}catch{return{success:!1,detail:`Service file written but systemctl failed`}}return{success:!0,detail:`systemd user service installed and started`}},async verify(){try{return b(`systemctl --user is-active probe-nexus`,{stdio:`ignore`,timeout:5e3}),{active:!0,detail:`systemd user service active`}}catch{return{active:!1,detail:`systemd user service not active`}}}},Sr={id:`launchd`,displayName:`launchd (macOS)`,async detectAvailable(){return process.platform===`darwin`&&br(`launchctl`)},async install(e){let t=a(),n=c(t,`Library`,`LaunchAgents`),r=c(n,`com.zenon.probe-nexus.plist`),i=b(`command -v probe`,{encoding:`utf-8`,timeout:5e3}).trim(),o=[];e.host&&o.push(`<key>PROBE_SPACETIME_HOST</key>`,`<string>${e.host}</string>`),e.module&&o.push(`<key>PROBE_SPACETIME_MODULE</key>`,`<string>${e.module}</string>`);let s=o.length?`<key>EnvironmentVariables</key>\n\t<dict>\n\t\t${o.join(`
22
+ `)}\n\t</dict>`:``,l=`<?xml version="1.0" encoding="UTF-8"?>
23
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
24
+ <plist version="1.0">
25
+ <dict>
26
+ <key>Label</key>
27
+ <string>com.zenon.probe-nexus</string>
28
+ <key>ProgramArguments</key>
29
+ <array>
30
+ <string>${i}</string>
31
+ <string>nexus</string>
32
+ <string>--wallet</string>
33
+ <string>${e.wallet}</string>
34
+ </array>
35
+ <key>RunAtLoad</key>
36
+ <true/>
37
+ <key>KeepAlive</key>
38
+ <true/>
39
+ <key>StandardOutPath</key>
40
+ <string>${t}/Library/Logs/probe-nexus.log</string>
41
+ <key>StandardErrorPath</key>
42
+ <string>${t}/Library/Logs/probe-nexus.log</string>
43
+ ${s}
44
+ </dict>
45
+ </plist>`;await f(n,{recursive:!0}),await h(r,l,{mode:420});try{b(`launchctl bootstrap gui/$(id -u) `+r,{stdio:`ignore`,timeout:1e4}),b(`launchctl enable gui/$(id -u)/com.zenon.probe-nexus`,{stdio:`ignore`,timeout:1e4}),b(`launchctl kickstart -k gui/$(id -u)/com.zenon.probe-nexus`,{stdio:`ignore`,timeout:1e4})}catch{return{success:!1,detail:`Plist written but launchctl failed`}}return{success:!0,detail:`launchd agent installed and started`}},async verify(){try{return b(`launchctl print gui/$(id -u)/com.zenon.probe-nexus`,{stdio:`ignore`,timeout:5e3}),{active:!0,detail:`launchd agent active`}}catch{return{active:!1,detail:`launchd agent not active`}}}},Cr={id:`tmux`,displayName:`tmux session`,async detectAvailable(){return br(`tmux`)},async install(e){try{return b(`tmux has-session -t nexus 2>/dev/null || tmux new-session -d -s nexus "probe nexus --wallet ${e.wallet}"`,{stdio:`ignore`,timeout:1e4}),{success:!0,detail:`tmux session 'nexus' created`}}catch{return{success:!1,detail:`tmux session creation failed`}}},async verify(){try{return b(`tmux has-session -t nexus`,{stdio:`ignore`,timeout:5e3}),{active:!0,detail:`tmux session 'nexus' exists`}}catch{return{active:!1,detail:`tmux session 'nexus' not found`}}}},wr={id:`docker`,displayName:`Docker container`,async detectAvailable(){return br(`docker`)},async install(e){return{success:!1,detail:`Docker daemon not implemented in MVP; use manual setup`}},async verify(){try{return b(`docker ps --filter "name=probe-nexus" --format "{{.Names}}"`,{encoding:`utf-8`,timeout:1e4}).trim().split(`
46
+ `).includes(`probe-nexus`)?{active:!0,detail:`Docker container probe-nexus running`}:{active:!1,detail:`Docker container probe-nexus not found`}}catch{return{active:!1,detail:`Docker container probe-nexus not found`}}}},Tr={id:`stateless`,displayName:`Stateless`,async detectAvailable(){return!0},async install(){return{success:!0,detail:`Stateless mode selected (no persistent daemon)`}},async verify(){return{active:!1,detail:`Stateless mode (no persistent daemon)`}}},Er=[xr,Sr,Cr,wr,Tr];async function Dr(){for(let e of Er)if(e.id!==`stateless`&&await e.detectAvailable())return e;return Tr}async function Or(e){try{return await d(e),!0}catch{return!1}}function kr(e){try{return b(`command -v ${e}`,{stdio:`ignore`,timeout:5e3}),!0}catch{return!1}}const Ar=[{id:`hermes`,displayName:`Hermes Agent`,async detectCurrent(){return!!process.env.HERMES_HOME||process.argv.some(e=>e.includes(`hermes`))},async detectInstalled(){return await Or(c(a(),`.hermes`))||kr(`hermes`)},scheduler:{supported:!0,mode:`managed`,async configure(e){if(!kr(`hermes`))return{success:!1,mode:`manual`,detail:`hermes CLI not found in PATH`};try{return b(`hermes cron create "${`*/${e.intervalMinutes} * * * *`}" "Load and internalize the skill zr-nexus-primer. Execute \`probe next\` and follow its instructions exactly." --name "ZENON ${e.agentId} wake"`,{stdio:`ignore`,timeout:15e3}),{success:!0,mode:`managed`,detail:`Created hermes cron job for ${e.agentId}`}}catch{return{success:!1,mode:`manual`,detail:`hermes cron create failed`}}},async verify(){if(!kr(`hermes`))return{configured:!1,detail:`hermes CLI not found`};try{return b(`hermes cron list`,{stdio:`ignore`,timeout:1e4}),{configured:!0,detail:`hermes cron list succeeded`}}catch{return{configured:!1,detail:`hermes cron list failed`}}}}},{id:`openclaw`,displayName:`OpenClaw`,async detectCurrent(){return!!process.env.OPENCLAW_HOME||process.argv.some(e=>e.includes(`openclaw`))},async detectInstalled(){return await Or(c(a(),`.openclaw`))||kr(`openclaw`)},scheduler:{supported:!0,mode:`managed`,async configure(e){if(!kr(`openclaw`))return{success:!1,mode:`manual`,detail:`openclaw CLI not found in PATH`};try{let t=`*/${e.intervalMinutes} * * * *`;return b(`openclaw cron add --name "ZENON ${e.agentId} wake" --cron "${t}" --message "Load and internalize the skill zr-nexus-primer. Execute \`probe next\` and follow its instructions exactly."`,{stdio:`ignore`,timeout:15e3}),{success:!0,mode:`managed`,detail:`Created openclaw cron job for ${e.agentId}`}}catch{return{success:!1,mode:`manual`,detail:`openclaw cron add failed`}}},async verify(){if(!kr(`openclaw`))return{configured:!1,detail:`openclaw CLI not found`};try{return b(`openclaw cron list`,{stdio:`ignore`,timeout:1e4}),{configured:!0,detail:`openclaw cron list succeeded`}}catch{return{configured:!1,detail:`openclaw cron list failed`}}}}},{id:`universal`,displayName:`Universal`,async detectCurrent(){return!0},async detectInstalled(){return!0},scheduler:{supported:!1,mode:`manual`,async configure(e){return(await S()).schedulerConfirmed?{success:!0,mode:`manual`,detail:`Scheduler manually confirmed (config.json)`}:{success:!1,mode:`manual`,detail:`Universal runtime — agentic scheduler setup required`}},async verify(){return(await S()).schedulerConfirmed?{configured:!0,detail:`Scheduler manually confirmed (config.json)`}:{configured:!1,detail:`Universal runtime — agentic scheduler setup required`}}}}];async function jr(){for(let e of Ar)if(await e.detectCurrent())return e;for(let e of Ar)if(await e.detectInstalled())return e;return Ar[Ar.length-1]}function J(e,t,n,r){let i=e.steps.findIndex(e=>e.step===t);i===-1?e.steps.push({step:t,status:n,detail:r}):e.steps[i]={step:t,status:n,detail:r}}async function Mr(e){let t=c(a(),`.probe`);try{await f(t,{recursive:!0});let n=c(t,`.write_test`);return await h(n,``,{mode:384}),await d(n),await ee(n),J(e,`home`,`pass`,`${t} is writable`),!0}catch{return J(e,`home`,`fail`,`${t} is not writable`),!1}}function Nr(){let e=``;for(let t=0;t<32;t++)e+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*`.charAt(Math.floor(Math.random()*70));return e}async function Pr(e){let t=e.args[`agent-id`],n=e.args.role||`auto`,r=!1;try{b(`gh auth status`,{stdio:`ignore`,timeout:1e4}),r=!0,J(e,`github`,`pass`,`gh CLI authenticated`)}catch{J(e,`github`,`warn`,`gh CLI not available or not authenticated`)}if(!t&&r)try{t=b(`gh api user --jq .login`,{encoding:`utf-8`,timeout:1e4}).trim(),J(e,`agent_id`,`pass`,`Resolved GitHub username: ${t}`)}catch{J(e,`agent_id`,`fail`,`Could not resolve GitHub username`)}if(!t)return J(e,`agent_id`,`fail`,`GitHub CLI not available or not authenticated. Run gh auth login, or pass --agent-id <username> --role zeno explicitly.`),!1;if(n===`auto`){let t=!1;if(r)try{t=b(`gh org list`,{encoding:`utf-8`,timeout:1e4}).includes(`zenon-red`)}catch{}n=t?`zoe`:`zeno`,J(e,`role`,`pass`,`Auto-detected role: ${n} (${t?`zenon-red org member`:`not a member`})`)}else J(e,`role`,`pass`,`Explicit role: ${n}`);return e.agentId=t,e.role=n,e.walletName=e.args.wallet||t,e.passwordFile=e.args[`password-file`]||c(a(),`.probe`,`wallets`,`${e.walletName}.pass`),!0}async function Fr(e){if(await bt(e.walletName))e.walletAddress=(await M(e.walletName))?.address||``,J(e,`wallet`,`pass`,`Wallet ${e.walletName} exists`);else if(e.args[`dry-run`])J(e,`wallet`,`skip`,`Would create wallet (dry-run)`);else{let t=Nr();await f(c(a(),`.probe`,`wallets`),{recursive:!0}),await h(e.passwordFile,t,{mode:384});let n=await ht(e.walletName,t);e.walletAddress=n.address,e.mnemonic=n.mnemonic,e.walletCreated=!0,J(e,`wallet`,`pass`,`Created wallet ${e.walletName} at ${n.address}`)}}async function Ir(e){try{await d(e.passwordFile),J(e,`password_file`,`pass`,e.passwordFile)}catch{J(e,`password_file`,`skip`,`Not provided`)}}async function Lr(e){let t=await S();t.defaultWallet===e.walletName?J(e,`default_wallet`,`pass`,`${e.walletName} already default`):e.args[`dry-run`]?J(e,`default_wallet`,`skip`,`Would set ${e.walletName} as default`):(t.defaultWallet=e.walletName,await Le(t),J(e,`default_wallet`,`pass`,`Set ${e.walletName} as default`))}async function Rr(e){if(e.args[`dry-run`])return J(e,`auth`,`skip`,`Would authenticate (dry-run)`),!0;try{let t=(await p(e.passwordFile,`utf-8`)).trim();return e.token=(await _r(e.walletName,t)).token,J(e,`auth`,`pass`,`Token cached`),!0}catch(t){return J(e,`auth`,`fail`,t instanceof Error?t.message:`Authentication failed`),!1}}function zr(e,t){return t===`zeno`&&!e.startsWith(`Zeno of `)?`Zeno of ${e}`:e}async function Br(e){if(e.args[`dry-run`])return J(e,`registration`,`skip`,`Would register agent (dry-run)`),!0;try{return await F({wallet:e.walletName,token:e.token,host:e.args.host,module:e.args.module},async t=>{let n=t.iter(`agents`).find(e=>e.identity.toHexString()===t.identity?.toHexString());if(n){J(e,`registration`,`pass`,`Agent ${n.id} already registered`);return}await I(t,`registerAgent`,{agentId:e.agentId,name:zr(e.args.name,e.role),role:z.fromString(e.role),zenonAddress:e.walletAddress}),await new Promise(e=>setTimeout(e,500)),t.iter(`agents`).find(t=>t.id===e.agentId)?J(e,`registration`,`pass`,`Agent ${e.agentId} registered as ${e.role}`):e.role===`zoe`||e.role===`admin`?J(e,`registration`,`fail`,`Only whitelisted identities can register as zoe or admin`):J(e,`registration`,`fail`,`Registration failed`)}),!e.steps.some(e=>e.step===`registration`&&e.status===`fail`)}catch(t){return J(e,`registration`,`fail`,t instanceof Error?t.message:`Registration failed`),!1}}async function Vr(e){if(!e.args.bio){J(e,`bio`,`skip`,`Not provided`);return}if(e.args[`dry-run`]){J(e,`bio`,`skip`,`Would set bio (dry-run)`);return}try{await F({wallet:e.walletName,token:e.token,host:e.args.host,module:e.args.module},async t=>{await I(t,`updateAgentBio`,{bio:e.args.bio})}),J(e,`bio`,`pass`,`Bio set`)}catch{J(e,`bio`,`warn`,`Failed to set bio`)}}async function Hr(e){if(!e.args.capabilities){J(e,`capabilities`,`skip`,`Not provided`);return}if(e.args[`dry-run`]){J(e,`capabilities`,`skip`,`Would set capabilities (dry-run)`);return}try{let t=[...new Set(e.args.capabilities.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean))];await F({wallet:e.walletName,token:e.token,host:e.args.host,module:e.args.module},async e=>{await I(e,`updateAgentCapabilities`,{capabilities:t})}),J(e,`capabilities`,`pass`,`Capabilities: ${t.join(`, `)}`)}catch{J(e,`capabilities`,`warn`,`Failed to set capabilities`)}}async function Ur(e){let t=c(a(),`zr-workspace`),n=c(t,`ZR.md`);try{await d(n),J(e,`workspace`,`pass`,`${n} exists`)}catch{e.args[`dry-run`]?J(e,`workspace`,`skip`,`Would create ${n}`):(await f(t,{recursive:!0}),await h(n,`# ZR
47
+
48
+ ## Identity
49
+ - Agent: ${e.agentId}
50
+ - Role: ${e.role}
51
+ - Wallet: ${e.walletName}
52
+ - Password: stored at ${e.passwordFile}
53
+
54
+ ## On Wake
55
+
56
+ ## Recent Activity
57
+ `),J(e,`workspace`,`pass`,`Created ${n}`))}}async function Wr(e){if(e.args[`dry-run`]){J(e,`skills`,`skip`,`Would install skills (dry-run)`);return}let t=await vr();J(e,`skills`,t.installed?`pass`:`warn`,t.detail)}async function Gr(e){let t;if(t=e.args.daemon&&e.args.daemon!==`auto`?Er.find(t=>t.id===e.args.daemon)||Er[Er.length-1]:await Dr(),e.args[`dry-run`]){J(e,`daemon`,`skip`,`Would configure ${t.displayName} daemon (dry-run)`);return}if(t.id===`stateless`)J(e,`daemon`,`pass`,`Stateless mode configured`);else{let n=await t.install({wallet:e.walletName,host:e.args.host,module:e.args.module});J(e,`daemon`,n.success?`pass`:`warn`,n.detail)}}async function Kr(e){let t=await jr(),n=e.args.scheduler;if(n===`manual`)t=Ar.find(e=>e.id===`universal`)??t;else if(n===`managed`&&t.id===`universal`){J(e,`scheduler`,`manual_required`,`No managed runtime detected (hermes/openclaw)`);return}if(e.args[`dry-run`]){J(e,`scheduler`,`skip`,`Would configure ${t.displayName} scheduler (dry-run)`);return}let r=await t.scheduler.configure({agentId:e.agentId,role:e.role,intervalMinutes:30,prompt:`Run probe next and follow its instructions exactly.`});J(e,`scheduler`,r.success?`pass`:r.mode===`manual`?`manual_required`:`warn`,r.detail)}async function qr(e){let t=e.steps.find(e=>e.step===`scheduler`)?.status===`pass`,n=e.args.scheduler===`manual`;if(e.args[`dry-run`]){J(e,`announcement`,`skip`,`Would send general announcement (dry-run)`);return}if(!t&&!n){J(e,`announcement`,`skip`,`Skipped until scheduler is confirmed`);return}try{await F({wallet:e.walletName,token:e.token,host:e.args.host,module:e.args.module},async t=>{let n=t.iter(`channels`).find(e=>e.name===`general`);n&&await I(t,`sendMessage`,{channelId:n.id,content:`Hi! I'm ${e.args.name}, ready to contribute.`,messageType:{tag:`User`},contextId:`onboard:${e.agentId}`})}),J(e,`announcement`,`pass`,`One-time general announcement sent`)}catch{J(e,`announcement`,`warn`,`Failed to send announcement`)}}async function Jr(e){let t=await Hn({wallet:e.walletName,host:e.args.host,module:e.args.module,includeAgent:!0});J(e,`doctor`,t.ok?`pass`:`warn`,`wallet/auth/nexus ${t.ok?`ok`:`issues detected`}`)}var Yr=t({meta:{name:`onboard`,description:`Idempotent agent setup for wallet, auth, registration, and scheduled wakes`},args:{name:{type:`string`,description:`Agent display name (required)`,required:!1},"agent-id":{type:`string`,description:`GitHub username / agent ID override`},role:{type:`string`,description:`Role: auto, zeno, zoe, admin`,default:`auto`},wallet:{type:`string`,description:`Wallet name override`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},"password-file":{type:`string`,description:`Path to wallet password file`},capabilities:{type:`string`,description:`Comma-separated capabilities`},bio:{type:`string`,description:`Agent bio`},daemon:{type:`string`,description:`Daemon: auto, systemd, tmux, docker, stateless`,default:`auto`},scheduler:{type:`string`,description:`Scheduler: auto, managed, manual`,default:`auto`},"dry-run":{type:`boolean`,description:`Print plan without side effects`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&T(!0),new Set([`auto`,`managed`,`manual`]).has(String(e.scheduler))||O(`INVALID_SCHEDULER`,`Invalid --scheduler value: ${e.scheduler}`,`Use one of: auto, managed, manual`),j()||!e.name){A({command:`probe onboard`,description:`Complete required local and Nexus setup for autonomous participation`,usage:[`probe onboard --name "Alpha Centauri"`,`probe onboard --name "Alpha Centauri" --role zeno --dry-run`],options:[{name:`--name`,detail:`Required display name`},{name:`--agent-id`,detail:`GitHub username override`},{name:`--role`,detail:`auto | zeno | zoe | admin (default: auto)`},{name:`--wallet`,detail:`Wallet name`},{name:`--host, --module`,detail:`SpacetimeDB overrides`},{name:`--password-file`,detail:`Path to password file`},{name:`--capabilities`,detail:`Comma-separated list`},{name:`--bio`,detail:`Agent bio text`},{name:`--daemon`,detail:`auto | systemd | tmux | docker | stateless`},{name:`--scheduler`,detail:`auto | managed | manual`},{name:`--dry-run`,detail:`Plan only, no side effects`},{name:`--json`,detail:`JSON output`}]}),e.name||O(`NAME_REQUIRED`,`--name is required. Example: probe onboard --name 'Alpha Centauri'`);return}let t={args:e,agentId:``,role:``,walletName:``,walletAddress:``,passwordFile:``,token:``,walletCreated:!1,mnemonic:``,steps:[]};if(!await Mr(t)){n(t);return}if(!await Pr(t)){n(t);return}if(await Fr(t),await Ir(t),await Lr(t),!await Rr(t)){n(t);return}if(!await Br(t)){n(t);return}await Vr(t),await Hr(t),await Ur(t),await Wr(t),await Gr(t),await Kr(t),await qr(t),await Jr(t),n(t);function n(t){let n=t.steps.some(e=>e.status===`fail`),r=t.steps.some(e=>e.status===`manual_required`),i=!n&&!r,a=t.steps.filter(e=>e.status===`pass`).length,o=t.steps.filter(e=>e.status===`warn`).length,s=t.steps.filter(e=>e.status===`fail`).length;if(D({ok:i,agentId:t.agentId,name:e.name,role:t.role,wallet:t.walletName,next:i?`Run probe next on scheduled wakes`:r?`Complete manual-required steps and rerun probe onboard`:`Fix failed steps and rerun probe onboard`}),!E()){Je([`Agent: ${t.agentId}`,`Name: ${e.name}`,`Role: ${t.role}`,`Wallet: ${t.walletName}`,`Steps: ${a} passed, ${s} failed, ${o} warnings`].join(`
58
+ `),i?`Onboard Complete`:`Onboard Incomplete`);let n=t.steps.filter(e=>e.status===`fail`);if(n.length>0)for(let e of n)g.error(`${e.step}: ${e.detail}`);t.mnemonic&&(qe(`Save this mnemonic securely — it will not be shown again`),Ke(t.mnemonic)),t.steps.find(e=>e.step===`scheduler`&&e.status===`manual_required`)&&(qe(`Scheduler setup required — autonomous participation blocked`),Je(gr({agentId:t.agentId,role:t.role,intervalMinutes:30,prompt:`Run probe next and follow its instructions exactly.`}),`Agentic Runtime Setup`))}}}});const Xr=[`connection`,`subscription error`,`authentication required`,`unauthorized`,`401`,`econnrefused`,`etimedout`,`enotfound`,`timeout`],Zr=e=>{let t=e.toLowerCase();return Xr.some(e=>t.includes(e))},Y=e=>{Zr(e)&&O(`CONNECTION_ERROR`,e),O(`UNEXPECTED_ERROR`,e)},Qr=e=>e?[...new Set(e.split(`,`).map(e=>e.trim().toLowerCase()).filter(Boolean))]:[],X=e=>e.iter(`agents`).find(t=>t.identity.toHexString()===e.identity?.toHexString()),$r=(e,t)=>({id:e.id,name:e.name,role:z.display(e.role),status:B.display(e.status),lastHeartbeat:G(e.lastHeartbeat),currentTaskId:e.currentTaskId?e.currentTaskId.toString():``,capabilities:e.capabilities.join(`,`),identity:t||``}),ei=e=>({agentId:e.id,name:e.name,bio:e.bio}),ti=async e=>{let t=e.action;t||O(`ACTION_REQUIRED`,`Agent action required`);try{switch(t){case`register`:{let t=e.agentId,n=e.name,r=e.role||`zeno`;(!t||!n)&&O(`ARGS_REQUIRED`,`Agent ID and name required`);let i=await w(),a=e.wallet||i.defaultWallet;!e.address&&!a&&O(`WALLET_REQUIRED`,`--address or --wallet required (or set default wallet)`);let o=e.address,s=Qr(e.capabilities);if(!o&&a){let e=await M(a);e||O(`WALLET_NOT_FOUND`,`Wallet not found: ${a}`),o=e.address}try{await F({host:e.host,module:e.module,wallet:a},async e=>{await I(e,`registerAgent`,{agentId:t,name:n,role:z.fromString(r),zenonAddress:o}),s.length>0&&await I(e,`updateAgentCapabilities`,{capabilities:s}),await new Promise(e=>setTimeout(e,500)),e.iter(`agents`).find(e=>e.id===t)||((r===`zoe`||r===`admin`)&&O(`UNAUTHORIZED`,`Only whitelisted identities can register as zoe or admin`),O(`REGISTRATION_FAILED`,`Registration failed`))}),D({registered:!0,agentId:t,name:n,role:r,address:o,capabilities:s}),E()||console.log(H(`agent_registered`,[{agentId:t,name:n,role:r,address:o,capabilities:s.join(`,`)}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`status`:(e.agentId||e.task||e.capabilities)&&O(`INVALID_USAGE`,"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status."),await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=X(e);t||O(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),D(t),E()||console.log(H(`agent`,[$r(t,e.identity?.toHexString())]))});break;case`set-status`:{let t=e.agentId;t||O(`STATUS_REQUIRED`,`Status required. Use: online, offline, working, busy`),e.capabilities&&O(`INVALID_USAGE`,"Use `probe agent capabilities --set <list>` to update capabilities.");let n=t.toLowerCase();new Set([`online`,`offline`,`working`,`busy`]).has(n)||O(`INVALID_STATUS`,`Invalid status: ${t}. Use: online, offline, working, busy`);let r=B.fromString(n),i=B.is.working(r);i&&!e.task&&O(`TASK_REQUIRED`,`--task is required when setting status to working`),!i&&e.task&&O(`TASK_NOT_ALLOWED`,`--task is only allowed when setting status to working`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async t=>{await I(t,`setAgentStatus`,{status:r,taskId:i?BigInt(e.task):void 0})}),D({updated:!0,status:n,taskId:e.task||null}),E()||console.log(H(`agent_status_updated`,[{status:n,taskId:e.task||``}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`capabilities`:{e.set||O(`CAPABILITIES_REQUIRED`,`--set is required`);let t=Qr(e.set);try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{await I(e,`updateAgentCapabilities`,{capabilities:t});let n=X(e);D({updated:!0,agentId:n?.id,capabilities:t}),E()||console.log(H(`agent_capabilities_updated`,[{agentId:n?.id||``,capabilities:t.join(`,`)}]))})}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`me`:await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=X(e);t||O(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),D(t),E()||console.log(H(`agent`,[$r(t,e.identity?.toHexString())]))});break;case`bio`:{let t=e.agentId?.trim(),r=typeof e.set==`string`,i=!!e.clear,a=!!t,o=e.agent?.trim();if(r&&i&&O(`INVALID_USAGE`,`Use either --set or --clear, not both.`),r&&a&&O(`INVALID_USAGE`,`Provide bio text either as positional argument or --set, not both.`),o&&(r||i||a)&&O(`INVALID_USAGE`,`--agent is read-only. Do not combine with --set, --clear, or positional bio text.`),r||i||a){let n=i?``:(r?e.set:t)||``;try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{await I(e,`updateAgentBio`,{bio:n});let t=X(e);D({updated:!0,agentId:t?.id,bio:n}),E()||console.log(H(`agent_bio_updated`,[{agentId:t?.id||``,bio:n}]))})}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}if(o)try{var n=N();let t=n.a(await P.create({host:e.host,module:e.module})).iter(`agents`).find(e=>e.id===o);t||O(`AGENT_NOT_FOUND`,`Agent not found: ${o}`),D(ei(t)),E()||console.log(H(`agent_bio`,[ei(t)]));break}catch(e){n.e=e}finally{await n.d()}await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=X(e);t||O(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),D(ei(t)),E()||console.log(H(`agent_bio`,[ei(t)]))});break}case`heartbeat`:try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=X(e);t||O(`NOT_REGISTERED`,`Agent not registered`),await I(e,`heartbeat`,{agentId:t.id}),D({heartbeat:!0}),E()||console.log(H(`agent_heartbeat`,[{agentId:t.id,status:B.display(t.status)}]))})}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`list`:try{var r=N();let t=r.a(await P.create({host:e.host,module:e.module})),n=e.limit?parseInt(e.limit,10):void 0;n!==void 0&&(!Number.isFinite(n)||n<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=t.iter(`agents`).filter(e=>!B.is.offline(e.status));i=i.sort((e,t)=>{let n=W(e.lastHeartbeat||e.createdAt||e.lastActiveAt),r=W(t.lastHeartbeat||t.createdAt||t.lastActiveAt);return n===r?t.id.localeCompare(e.id):r>n?1:-1}),n!==void 0&&(i=i.slice(0,n)),D({agents:i,count:i.length}),E()||console.log(H(`agents`,i.map(e=>({id:e.id,name:e.name,role:z.display(e.role),status:B.display(e.status),last_heartbeat:G(e.lastHeartbeat),capabilities:e.capabilities.join(`,`)}))));break}catch(e){r.e=e}finally{await r.d()}case`identity`:await F({host:e.host,module:e.module,wallet:e.wallet},async t=>{let n=t.identity?.toHexString();D({identity:n,wallet:e.wallet}),E()||console.log(H(`identity`,[{identity:n||``,wallet:e.wallet||``}]))});break;case`voice`:{let t=e.agentId?.trim();t||O(`TRANSCRIPT_REQUIRED`,`Transcript required. Provide as first positional argument.`),t.length>500&&O(`TRANSCRIPT_TOO_LONG`,`Transcript exceeds 500 characters.`),e.audioUrl||O(`AUDIO_URL_REQUIRED`,`--audioUrl is required for voice announcements.`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{let r=e.contextType||`status_update`,i=await Bn(n,`generate_voice`,{transcript:t,audioUrl:e.audioUrl,contextType:r});D({ok:!0,announcementId:i.id,seq:i.seq,agentName:i.agentName,keyPrefix:i.keyPrefix,audioUrl:e.audioUrl,contextType:r}),E()||console.log(H(`voice_announcement`,[{id:i.id,seq:i.seq,agentName:i.agentName,keyPrefix:i.keyPrefix,audioUrl:e.audioUrl||``}]))})}catch(e){O(`PROCEDURE_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice`)}}catch(e){Y(e instanceof Error?e.message:String(e))}};var ni=t({meta:{name:`agent`,description:`Agent management`},args:{action:{type:`positional`,description:`Action: register, status, set-status, capabilities, bio, me, heartbeat, list, identity, voice`,required:!1},agentId:{type:`positional`,description:`Action-dependent value (agent ID, status, bio text, or transcript)`,required:!1},name:{type:`positional`,description:`Display name`,required:!1},role:{type:`positional`,description:`Role: zoe, admin, zeno`,required:!1},address:{type:`string`,description:`Zenon address`},wallet:{type:`string`,description:`Wallet name`},task:{type:`string`,description:`Current task ID`},limit:{type:`string`,description:`Limit agents returned for list`},capabilities:{type:`string`,description:`Comma-separated capability list`},set:{type:`string`,description:`Set capabilities for capabilities action or bio text for bio action`},agent:{type:`string`,description:`Agent ID for bio action lookup`},clear:{type:`boolean`,description:`Clear bio for bio action`},json:{type:`boolean`,description:`Output JSON`,default:!1},audioUrl:{type:`string`,description:`Audio URL for voice announcements`},contextType:{type:`string`,description:`Context type for voice (default: status_update)`},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe agent`,description:`Agent lifecycle and identity commands`,usage:[`probe agent <action> [options]`,`probe agent register agent-1 "Builder" zeno --wallet my-wallet`,`probe agent set-status working --task 42`,`probe agent capabilities --set "gh,coding,review"`,`probe agent bio "Build systems and task orchestration"`,`probe agent heartbeat`,`probe agent voice "Hello from Zoe" --audioUrl https://audio.zenon.red/voice/zoe/123.mp3`],actions:[{name:`register <agentId> <name> [role]`,detail:`Register a new agent identity`},{name:`status`,detail:`Show current agent status`},{name:`set-status <online|offline|working|busy>`,detail:`Update current agent status`},{name:`capabilities --set <list>`,detail:`Set capabilities for authenticated agent`},{name:`bio [--set <text>|--clear|--agent <id>]`,detail:`View or update agent bio`},{name:`me`,detail:`Show current authenticated agent profile`},{name:`heartbeat`,detail:`Send heartbeat only`},{name:`list`,detail:`List online agents`},{name:`identity`,detail:`Show current authenticated identity`},{name:`voice <transcript> --audioUrl <url>`,detail:`Submit a voice announcement (BYO audio URL)`}],options:[{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--address`,detail:`Zenon address for register`},{name:`--task`,detail:`Task ID required with status working`},{name:`--limit`,detail:`Max agents returned for list`},{name:`--capabilities`,detail:`Comma-separated capabilities for register/status`},{name:`--set`,detail:`Set value for capabilities or bio action`},{name:`--agent`,detail:`Agent ID for bio action lookup`},{name:`--clear`,detail:`Clear bio for authenticated agent`},{name:`--audioUrl`,detail:`Audio URL for voice announcements (required)`},{name:`--contextType`,detail:`Context type for voice (default: status_update)`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.`,"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.","`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status."]});return}await ti(e)}});const ri=e=>{let t=e.toLowerCase();return t===`approve`?{tag:`ApproveAsTask`}:t===`reject`?{tag:`Reject`}:t===`escalate_to_idea`?{tag:`EscalateToIdea`}:null},ii=e=>e&&typeof e==`object`&&`tag`in e?String(e.tag):String(e),ai=e=>{let t=ii(e);return{PendingReview:`pending_review`,Approved:`approved`,Rejected:`rejected`,EscalatedToIdea:`escalated_to_idea`}[t]??t};var oi=t({meta:{name:`discover`,description:`Discovered task management`},args:{action:{type:`positional`,description:`Action: report, review, list, get`,required:!1},id:{type:`positional`,description:`Discovered task ID`,required:!1},decision:{type:`positional`,description:`Decision: approve, reject, escalate_to_idea`,required:!1},task:{type:`string`,description:`Current task ID`},project:{type:`string`,description:`Project ID`},title:{type:`string`,description:`Task title`},type:{type:`string`,description:`Task type: bug, improvement, feature`},severity:{type:`string`,description:`Severity: low, medium, high, critical`},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit discovered tasks returned`},description:{type:`string`,description:`Description`},reason:{type:`string`,description:`Rejection reason`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe discover`,description:`Discovered task reporting and review`,usage:[`probe discover <action> [options]`,`probe discover report --task 12 --project 1 --title "Fix parse"`,`probe discover review 9 approve`],actions:[{name:`report`,detail:`Report a discovered task from current work`},{name:`review <id> <approve|reject|escalate_to_idea>`,detail:`Approve, reject, or escalate discovery`},{name:`list`,detail:`List discovered tasks`},{name:`get <id>`,detail:`Show one discovered task`}],options:[{name:`--task, --project, --title`,detail:`Required for report`},{name:`--type`,detail:`Task type: bug, improvement, feature`},{name:`--severity`,detail:`Severity: low, medium, high, critical`},{name:`--reason`,detail:`Reason for rejection/escalation`},{name:`--limit`,detail:`Max discovered tasks returned for list`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:["Find current task IDs with `probe task list` and project IDs with `probe project list`."]});return}let t=e.action;try{switch(t){case`report`:(!e.task||!e.project||!e.title)&&O(`ARGS_REQUIRED`,`--task, --project, and --title required`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async t=>{await I(t,`discoverTask`,{currentTaskId:BigInt(e.task),projectId:BigInt(e.project),title:e.title,description:e.description||``,priority:5,taskType:e.type||`improvement`,severity:e.severity||`medium`})}),D({reported:!0,title:e.title}),E()||console.log(H(`discovery_reported`,[{title:e.title,taskId:e.task,projectId:e.project}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`review`:{let t=e.id,n=e.decision;(!t||!n)&&O(`ARGS_REQUIRED`,`ID and decision required`);let r=n.toLowerCase(),i=[`approve`,`reject`,`escalate_to_idea`];i.includes(r)||O(`INVALID_DECISION`,`Invalid decision: ${n}. Use: ${i.join(`, `)}`);let a=ri(r);a||O(`INVALID_DECISION`,`Invalid decision: ${n}. Use: ${i.join(`, `)}`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{await I(n,`reviewDiscoveredTask`,{discoveryId:BigInt(t),decision:a,reason:e.reason||void 0})}),D({reviewed:!0,id:t,decision:r}),E()||console.log(H(`discovery_reviewed`,[{id:t,decision:r,reason:e.reason||``}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`list`:try{var n=N();let t=n.a(await P.create({host:e.host,module:e.module})).iter(`discovered_tasks`),r=e.limit?parseInt(e.limit,10):void 0;if(r!==void 0&&(!Number.isFinite(r)||r<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status){let n=e.status.toLowerCase().replace(/[_\s]/g,``);t=t.filter(e=>ai(e.status).replace(/[_\s]/g,``)===n)}t=t.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),r!==void 0&&(t=t.slice(0,r)),D({discoveredTasks:t,count:t.length}),E()||console.log(H(`discovered_tasks`,t.map(e=>({id:e.id.toString(),title:e.title,taskType:e.taskType,severity:e.severity,status:ai(e.status),projectId:e.projectId}))));break}catch(e){n.e=e}finally{await n.d()}case`get`:try{var r=N();let t=e.id;t||O(`DISCOVERY_ID_REQUIRED`,`Discovery ID required`);let n=r.a(await P.create({host:e.host,module:e.module})).iter(`discovered_tasks`).find(e=>e.id.toString()===t);n||O(`DISCOVERY_NOT_FOUND`,`Discovery not found: ${t}`),D(n),E()||console.log(H(`discovered_task`,[{id:n.id.toString(),title:n.title,status:ai(n.status),taskType:n.taskType,severity:n.severity,priority:n.priority,projectId:n.projectId.toString(),currentTaskId:n.currentTaskId.toString(),description:n.description,reviewedBy:n.reviewedBy||``,reviewedAt:n.reviewedAt?G(n.reviewedAt):``,rejectionReason:n.rejectionReason||``,createdTaskId:n.createdTaskId?n.createdTaskId.toString():``}]));break}catch(e){r.e=e}finally{await r.d()}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: report, review, list, get`)}}catch(e){Y(e instanceof Error?e.message:String(e))}}});const si=[[`ecosystem-impact`,`ecosystem_impact`],[`implementation-readiness`,`implementation_readiness`],[`dependency-independence`,`dependency_independence`],[`documentation-leverage`,`documentation_leverage`],[`maintenance-sustainability`,`maintenance_sustainability`],[`agent-capability-fit`,`agent_capability_fit`],[`execution-clarity`,`execution_clarity`]],ci=e=>e.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),li=e=>e.map(e=>({id:e.id.toString(),title:e.title,category:e.category,status:R.display(e.status),votes:`${e.totalVotes}/${e.quorum}`,up:e.upVotes,veto:e.vetoCount}));function ui(e,t){let n=Number(e);return Number.isInteger(n)||O(`INVALID_SCORES`,`Score for '${t}' must be an integer`),n}function di(e,t){let n=t.filter(e=>e.active).sort((e,t)=>e.sortOrder-t.sortOrder),r=new Map(e.map(e=>[e.dimension,e.score]));for(let e of n){r.has(e.name)||O(`MISSING_DIMENSION`,`Missing score for dimension: ${e.label||e.name}`);let t=r.get(e.name);(t<e.minScore||t>e.maxScore)&&O(`INVALID_SCORE`,`Score for '${e.name}' must be between ${e.minScore} and ${e.maxScore}`)}let i=new Set(n.map(e=>e.name));for(let t of e)i.has(t.dimension)||O(`UNKNOWN_DIMENSION`,`Unknown dimension: ${t.dimension}`)}function fi(e,t,n){let r=t.trim().replaceAll(`-`,`_`);r||O(`INVALID_SCORES`,`Dimension names cannot be empty`),e.has(r)&&O(`INVALID_SCORES`,`Dimension '${r}' was provided more than once`),e.set(r,{dimension:r,score:ui(n,r)})}function pi(e){return e===void 0?[]:(Array.isArray(e)?e:[e]).flatMap(e=>String(e).split(`,`).map(e=>e.trim()).filter(Boolean).map(e=>{let t=e.indexOf(`=`);return(t<=0||t===e.length-1)&&O(`INVALID_SCORES`,`--score entries must use dimension=value syntax`),[e.slice(0,t),e.slice(t+1)]}))}function mi(e){let t=new Map;for(let[n,r]of si)e[n]!==void 0&&fi(t,r,e[n]);for(let[n,r]of pi(e.score))fi(t,n,r);return t.size===0&&O(`ARGS_REQUIRED`,`Provide dimension scores with score flags or --score dimension=value`),[...t.values()]}var hi=t({meta:{name:`idea`,description:`Idea management`},args:{action:{type:`positional`,description:`Action: list, pending, propose, vote, get, dimensions`,required:!1},id:{type:`positional`,description:`Idea ID`,required:!1},title:{type:`string`,description:`Idea title`},category:{type:`string`,description:`Category`},description:{type:`string`,description:`Description`},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit ideas returned`},"ecosystem-impact":{type:`string`,description:`Ecosystem Impact score`},"implementation-readiness":{type:`string`,description:`Implementation Readiness score`},"dependency-independence":{type:`string`,description:`Dependency Independence score`},"documentation-leverage":{type:`string`,description:`Documentation Leverage score`},"maintenance-sustainability":{type:`string`,description:`Maintenance Sustainability score`},"agent-capability-fit":{type:`string`,description:`Agent Capability Fit score`},"execution-clarity":{type:`string`,description:`Execution Clarity score`},score:{type:`string`,description:`Additional dimension score as name=value; repeatable`,multiple:!0},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe idea`,description:`Idea discovery, review, and voting`,usage:[`probe idea <action> [options]`,`probe idea list --status voting`,`probe idea dimensions`,`probe idea vote 42 --ecosystem-impact 8 --execution-clarity 9 --implementation-readiness 7`],actions:[{name:`list`,detail:`List ideas with optional filters`},{name:`pending`,detail:`List voting ideas you have not voted on`},{name:`get <id>`,detail:`Show one idea`},{name:`dimensions`,detail:`List active evaluation dimensions`},{name:`propose`,detail:`Propose a new idea`},{name:`vote <id>`,detail:`Vote on an idea with dimension scores`}],options:[{name:`--title`,detail:`Idea title for propose`},{name:`--description`,detail:`Idea description for propose`},{name:`--category`,detail:`Idea category for propose/list`},{name:`--ecosystem-impact`,detail:`Ecosystem impact score`},{name:`--implementation-readiness`,detail:`Implementation readiness score`},{name:`--dependency-independence`,detail:`Dependency independence score`},{name:`--documentation-leverage`,detail:`Documentation leverage score`},{name:`--maintenance-sustainability`,detail:`Maintenance sustainability score`},{name:`--agent-capability-fit`,detail:`Agent capability fit score`},{name:`--execution-clarity`,detail:`Execution clarity score`},{name:`--score`,detail:`Additional dimension score as name=value; repeatable`},{name:`--status`,detail:`Status filter for list`},{name:`--limit`,detail:`Max ideas returned for list/pending`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:["Find idea IDs with `probe idea list` before using get/vote.","Use `probe idea dimensions` to list active score dimensions.",`All active dimensions are required. Use explicit flags for default dimensions and repeatable --score name=value for custom dimensions.`,`If a missing-dimension error names a dimension without a dedicated flag, use --score and consider updating Probe.`]});return}let t=e.action;try{switch(t){case`list`:try{var n=N();let t=n.a(await P.create({host:e.host,module:e.module})).iter(`ideas`),r=e.limit?parseInt(e.limit,10):void 0;r!==void 0&&(!Number.isFinite(r)||r<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status&&(t=t.filter(t=>R.matches(t.status,e.status))),e.category&&(t=t.filter(t=>t.category===e.category)),t=ci(t),r!==void 0&&(t=t.slice(0,r)),D({ideas:t,count:t.length}),E()||console.log(H(`ideas`,li(t)));break}catch(e){n.e=e}finally{await n.d()}case`pending`:{let t=e.limit?parseInt(e.limit,10):void 0;t!==void 0&&(!Number.isFinite(t)||t<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`),await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let n=X(e);n||O(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first.");let r=new Set(e.iter(`votes`).filter(e=>e.agentId===n.id).map(e=>e.ideaId)),i=e.iter(`ideas`).filter(e=>R.is.voting(e.status)).filter(e=>!r.has(e.id));i=ci(i),t!==void 0&&(i=i.slice(0,t)),D({ideas:i,count:i.length}),E()||console.log(H(`ideas`,li(i)))});break}case`get`:try{var r=N();let t=e.id;t||O(`IDEA_ID_REQUIRED`,`Idea ID required`);let n=r.a(await P.create({host:e.host,module:e.module})).iter(`ideas`).find(e=>e.id.toString()===t);n||O(`IDEA_NOT_FOUND`,`Idea not found: ${t}`),D(n),E()||console.log(H(`idea`,[{id:n.id.toString(),title:n.title,category:n.category,status:R.display(n.status),totalVotes:n.totalVotes,quorum:n.quorum,upVotes:n.upVotes,downVotes:n.downVotes,vetoCount:n.vetoCount,approvalThreshold:n.approvalThreshold,vetoThreshold:n.vetoThreshold,computedScore:n.computedScore,description:n.description}]));break}catch(e){r.e=e}finally{await r.d()}case`dimensions`:try{var i=N();let t=i.a(await P.create({host:e.host,module:e.module})).iter(`evaluation_dimensions`).filter(e=>e.active).sort((e,t)=>e.sortOrder-t.sortOrder);D({dimensions:t,count:t.length}),E()||console.log(H(`evaluation_dimensions`,t.map(e=>({name:e.name,label:e.label,weight:e.weight,range:`${e.minScore}-${e.maxScore}`,description:e.description}))));break}catch(e){i.e=e}finally{await i.d()}case`propose`:{let t=String(e.title||``).trim();t||O(`ARGS_REQUIRED`,`Title required`);let n=String(e.description||``).trim();n||O(`DESCRIPTION_REQUIRED`,`Description required and cannot be empty`);let r=String(e.category||`general`),i;try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let a=X(e);await I(e,`proposeIdea`,{title:t,description:n,category:r}),i=ci(e.iter(`ideas`)).find(e=>e.title===t&&e.category===r&&e.description===n&&(!a||e.createdBy===a.id))}),D({proposed:!0,idea:i?{id:i.id.toString(),title:i.title,category:i.category,descriptionLength:i.description.length}:{title:t,category:r,descriptionLength:n.length}}),E()||console.log(H(`idea_proposed`,[{id:i?.id.toString()||``,title:t,category:r,descriptionLength:i?i.description.length:n.length}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`vote`:{let t=e.id;t||O(`ARGS_REQUIRED`,`Idea ID required`);let n=mi(e);try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{di(n,e.iter(`evaluation_dimensions`)),await I(e,`voteIdea`,{ideaId:BigInt(t),scores:n})}),D({voted:!0,ideaId:t,scores:n}),E()||console.log(H(`idea_voted`,[{ideaId:t,scores:JSON.stringify(n)}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, pending, propose, vote, get, dimensions`)}}catch(e){Y(e instanceof Error?e.message:String(e))}}});const gi=e=>/^\d+$/.test(e),_i=(e,t)=>{if(!t)return!0;let n=t.trim();return n?e.id.toString()===n||(e.contextId||``)===n:!0},vi=e=>V.is.user(e),yi=e=>V.is.directive(e),bi=async e=>{let t=e.action;t||O(`ACTION_REQUIRED`,`Message action required`);try{switch(t){case`list`:try{var n=N();let t=e.target,r=parseInt(e.limit||`20`,10);(!Number.isFinite(r)||r<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=n.a(await P.create({host:e.host,module:e.module})),a=i.iter(`channels`),o=i.iter(`projects`),s=[],c=`all`;if(t)if(gi(t)){let e=BigInt(t),n=i.iter(`project_messages`),r=o.find(t=>t.id===e);s=n.filter(t=>t.projectId===e&&vi(t.messageType)).map(e=>({...e,_type:`project`})),c=r?`project:${r.name}`:`project:${e}`}else{let e=a.find(e=>e.name===t||e.id.toString()===t);e&&(s=i.iter(`messages`).filter(t=>t.channelId===e.id&&vi(t.messageType)).map(e=>({...e,_type:`channel`})),c=`#${e.name}`)}else{let e=i.iter(`messages`),t=i.iter(`project_messages`);s=[...e.filter(e=>vi(e.messageType)).map(e=>({...e,_type:`channel`})),...t.filter(e=>vi(e.messageType)).map(e=>({...e,_type:`project`}))]}s=s.filter(t=>_i(t,e.context)),s.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n<r?1:n>r?-1:0}),s=s.slice(0,r);let l=new Map(a.map(e=>[e.id.toString(),e.name])),u=new Map(o.map(e=>[e.id.toString(),e.name]));D({messages:s,count:s.length,target:c}),E()||console.log(H(`messages`,s.map(e=>{let t=`_type`in e&&e._type===`project`?`project:${u.get(e.projectId.toString())||e.projectId}`:`#${l.get(e.channelId.toString())||e.channelId}`;return{id:e.id.toString(),location:t,senderId:e.senderId,content:e.content,messageType:V.display(e.messageType),contextId:e.contextId||null,createdAt:G(e.createdAt)}})));break}catch(e){n.e=e}finally{await n.d()}case`directives`:try{var r=N();let t=e.target,n=parseInt(e.limit||`20`,10);(!Number.isFinite(n)||n<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`);let i=r.a(await P.create({host:e.host,module:e.module})),a=i.iter(`channels`),o=i.iter(`projects`),s=[],c=`all`;if(t)if(gi(t)){let e=BigInt(t),n=i.iter(`project_messages`),r=o.find(t=>t.id===e);s=n.filter(t=>t.projectId===e&&yi(t.messageType)).map(e=>({...e,_type:`project`})),c=r?`project:${r.name}`:`project:${e}`}else{let e=a.find(e=>e.name===t||e.id.toString()===t);e&&(s=i.iter(`messages`).filter(t=>t.channelId===e.id&&yi(t.messageType)).map(e=>({...e,_type:`channel`})),c=`#${e.name}`)}else{let e=i.iter(`messages`),t=i.iter(`project_messages`);s=[...e.filter(e=>yi(e.messageType)).map(e=>({...e,_type:`channel`})),...t.filter(e=>yi(e.messageType)).map(e=>({...e,_type:`project`}))]}s=s.filter(t=>_i(t,e.context)),s.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n<r?1:n>r?-1:0}),s=s.slice(0,n);let l=new Map(a.map(e=>[e.id.toString(),e.name])),u=new Map(o.map(e=>[e.id.toString(),e.name]));D({messages:s,count:s.length,target:c}),E()||console.log(H(`directives`,s.map(e=>{let t=`_type`in e&&e._type===`project`?`project:${u.get(e.projectId.toString())||e.projectId}`:`#${l.get(e.channelId.toString())||e.channelId}`;return{id:e.id.toString(),location:t,senderId:e.senderId,content:e.content,messageType:V.display(e.messageType),contextId:e.contextId||null,createdAt:G(e.createdAt)}})));break}catch(e){r.e=e}finally{await r.d()}case`directive`:{let t=e.target,n=e.content;(!t||!n)&&O(`ARGS_REQUIRED`,`Target and directive content required. Usage: probe message directive <target> <content>`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async r=>{if(gi(t)){let i=BigInt(t),a=r.iter(`projects`),o=r.iter(`project_channels`),s=a.find(e=>e.id===i);s||O(`PROJECT_NOT_FOUND`,`Project '${t}' not found`),o.find(e=>e.projectId===i)||O(`PROJECT_CHANNEL_NOT_FOUND`,`Project channel for '${t}' not found`),await I(r,`sendProjectMessage`,{projectId:i,content:n,messageType:V.fromString(`directive`),contextId:e.context}),D({sent:!0,projectId:i.toString(),projectName:s.name,messageType:`directive`}),E()||console.log(H(`directive_sent`,[{target:`project:${s.name}`,contextId:e.context||null}]))}else{let i=r.iter(`channels`),a=i.find(e=>e.name===t||e.id.toString()===t);a||O(`CHANNEL_NOT_FOUND`,`Channel '${t}' not found. Available: ${i.map(e=>e.name).join(`, `)}`),await I(r,`sendMessage`,{channelId:a.id,content:n,messageType:V.fromString(`directive`),contextId:e.context}),D({sent:!0,channelId:a.id.toString(),channelName:a.name,messageType:`directive`}),E()||console.log(H(`directive_sent`,[{target:`#${a.name}`,contextId:e.context||null}]))}})}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`send`:{let t=e.target,n=e.content;(!t||!n)&&O(`ARGS_REQUIRED`,`Target and message content required. Usage: probe message send <target> <content>`),(e.type||`user`).toLowerCase()===`directive`&&O(`INVALID_TYPE`,`'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async r=>{if(gi(t)){let i=BigInt(t),a=r.iter(`projects`),o=r.iter(`project_channels`),s=a.find(e=>e.id===i);s||O(`PROJECT_NOT_FOUND`,`Project '${t}' not found`),o.find(e=>e.projectId===i)||O(`PROJECT_CHANNEL_NOT_FOUND`,`Project channel for '${t}' not found`),await I(r,`sendProjectMessage`,{projectId:i,content:n,messageType:V.fromString(e.type||`user`),contextId:e.context}),D({sent:!0,projectId:i.toString(),projectName:s.name}),E()||console.log(H(`message_sent`,[{target:`project:${s.name}`,messageType:e.type||`user`,contextId:e.context||null}]))}else{let i=r.iter(`channels`),a=i.find(e=>e.name===t||e.id.toString()===t);a||O(`CHANNEL_NOT_FOUND`,`Channel '${t}' not found. Available: ${i.map(e=>e.name).join(`, `)}`),await I(r,`sendMessage`,{channelId:a.id,content:n,messageType:V.fromString(e.type||`user`),contextId:e.context}),D({sent:!0,channelId:a.id.toString(),channelName:a.name}),E()||console.log(H(`message_sent`,[{target:`#${a.name}`,messageType:e.type||`user`,contextId:e.context||null}]))}})}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`channels`:try{var i=N();let t=i.a(await P.create({host:e.host,module:e.module})),n=t.iter(`channels`),r=t.iter(`projects`),a=t.iter(`project_channels`),o=new Set(a.map(e=>e.projectId.toString())),s=r.filter(e=>o.has(e.id.toString()));D({channels:n,projects:s,channelCount:n.length,projectCount:s.length}),E()||(console.log(H(`channels`,n.map(e=>({id:e.id.toString(),name:e.name,createdBy:e.createdBy})))),console.log(H(`projects`,s.map(e=>({id:e.id.toString(),name:e.name,repo:e.githubRepo})))));break}catch(e){i.e=e}finally{await i.d()}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, send, directive, directives, channels`)}}catch(e){Y(e instanceof Error?e.message:String(e))}};var xi=t({meta:{name:`message`,description:`Message management`},args:{action:{type:`positional`,description:`Action: list, send, directive, directives, channels`,required:!1},target:{type:`positional`,description:`Channel name, project ID, or message content`,required:!1},content:{type:`positional`,description:`Message content (if target is channel/project)`,required:!1},type:{type:`string`,description:`Message type: user, system`,default:`user`},context:{type:`string`,description:`Thread context ID (message ID or entity ref like task:42)`},limit:{type:`string`,description:`Limit messages`,default:`20`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe message`,description:`Channel and project messaging commands`,usage:[`probe message <action> [target] [content] [options]`,`probe message list --limit 50`,`probe message send general "hello team"`,`probe message directive zoe "Focus on project stability" --context project:1`],actions:[{name:`list [target]`,detail:`List user messages (all, channel, or project)`},{name:`directives [target]`,detail:`List directive messages (all, channel, or project)`},{name:`send <target> <content>`,detail:`Send to target channel/project`},{name:`directive <target> <content>`,detail:`Send directive to target channel/project`},{name:`channels`,detail:`List channels and project channels`}],options:[{name:`--type`,detail:`Message type: user, system (default: user)`},{name:`--context`,detail:`Optional thread context ID (message ID or entity ref)`},{name:`--limit`,detail:`Max messages returned for list (default: 20)`},{name:`--wallet`,detail:`Wallet to use for send`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],examples:[`probe message send general hello`,`probe message directive zoe "Pause new work" --context project:1`,`probe message directives zoe --limit 1`,`probe message send zoe "hello there"`,`probe message send zoe "reviewed" --context 123`,`probe message send 1 "project update"`,`probe message list zoe --limit 10`],notes:[`Quotes are only required when target/content contains spaces.`,"Use `probe message channels` to discover available channel names and project IDs."]});return}await bi(e)}}),Si=t({meta:{name:`project`,description:`Project commands`},args:{action:{type:`positional`,description:`Action: list, get, create, status, set-status`,required:!1},id:{type:`positional`,description:`Project ID`,required:!1},value:{type:`positional`,description:`Status value for set-status: active|paused`,required:!1},status:{type:`string`,description:`Filter by status`},limit:{type:`string`,description:`Limit projects returned`},name:{type:`string`,description:`Project name`},description:{type:`string`,description:`Project description`},"github-repo":{type:`string`,description:`GitHub repository URL`},"source-idea":{type:`string`,description:`Source idea ID`},wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe project`,description:`Project listing and lookup commands`,usage:[`probe project <action> [options]`,`probe project list --status active`,`probe project get 1`,`probe project status 1`,`probe project set-status 1 paused --wallet admin-wallet`],actions:[{name:`list`,detail:`List projects with optional status filter`},{name:`get <id>`,detail:`Show one project by ID`},{name:`create`,detail:`Create a new project`},{name:`status <id>`,detail:`Show only project status`},{name:`set-status <id> <active|paused>`,detail:`Update project status (admin/zoe)`}],options:[{name:`--status`,detail:`Status filter for list: active|paused`},{name:`--limit`,detail:`Max projects returned for list`},{name:`--name`,detail:`Project name (create)`},{name:`--description`,detail:`Project description (create)`},{name:`--github-repo`,detail:`GitHub repository URL (create)`},{name:`--source-idea`,detail:`Source idea ID (create)`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Only admin/zoe identities can call set-status.`,"Find idea IDs with `probe idea list` before using --source-idea.","Find project IDs with `probe project list` before using get/create follow-up commands."]});return}let t=e.action;try{switch(t){case`list`:try{var n=N();let t=n.a(await P.create({host:e.host,module:e.module})).iter(`projects`),r=e.limit?parseInt(e.limit,10):void 0;r!==void 0&&(!Number.isFinite(r)||r<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`),e.status&&(t=t.filter(t=>Vn.matches(t.status,e.status))),t=t.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),r!==void 0&&(t=t.slice(0,r)),D({projects:t,count:t.length}),E()||console.log(H(`projects`,t.map(e=>({id:e.id,name:e.name,status:Vn.display(e.status),githubRepo:e.githubRepo}))));break}catch(e){n.e=e}finally{await n.d()}case`get`:try{var r=N();let t=e.id;t||O(`PROJECT_ID_REQUIRED`,`Project ID required`);let n=r.a(await P.create({host:e.host,module:e.module})).iter(`projects`).find(e=>e.id.toString()===t);n||O(`PROJECT_NOT_FOUND`,`Project not found: ${t}`),D(n),E()||console.log(H(`project`,[{id:n.id.toString(),name:n.name,status:Vn.display(n.status),githubRepo:n.githubRepo,description:n.description}]));break}catch(e){r.e=e}finally{await r.d()}case`status`:try{var i=N();let t=e.id;t||O(`PROJECT_ID_REQUIRED`,`Project ID required`);let n=i.a(await P.create({host:e.host,module:e.module})).iter(`projects`).find(e=>e.id.toString()===t);n||O(`PROJECT_NOT_FOUND`,`Project not found: ${t}`);let r=Vn.display(n.status);D({projectId:t,status:r}),E()||console.log(H(`project_status`,[{id:n.id.toString(),name:n.name,status:r}]));break}catch(e){i.e=e}finally{await i.d()}case`create`:(!e.name||!e[`github-repo`]||!e[`source-idea`])&&O(`ARGS_REQUIRED`,`--name, --github-repo, and --source-idea required`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async t=>{await I(t,`createProject`,{sourceIdeaId:BigInt(e[`source-idea`]),name:e.name,githubRepo:e[`github-repo`],description:e.description||``})}),D({created:!0,name:e.name,githubRepo:e[`github-repo`],sourceIdeaId:e[`source-idea`]}),E()||console.log(H(`project_created`,[{name:e.name,githubRepo:e[`github-repo`],sourceIdeaId:e[`source-idea`]}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break;case`set-status`:{let t=e.id,n=e.value;(!t||!n)&&O(`ARGS_REQUIRED`,`Project ID and status required. Use: probe project set-status <id> <active|paused>`);let r=n.toLowerCase().replace(/[_\s]/g,``);[`active`,`paused`].includes(r)||O(`INVALID_STATUS`,`Invalid status: ${n}. Use: active, paused`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{await I(e,`updateProjectStatus`,{projectId:BigInt(t),status:Vn.fromString(n)})}),D({updated:!0,projectId:t,status:r}),E()||console.log(H(`project_status_updated`,[{projectId:t,status:r}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, get, create, status, set-status`)}}catch(e){Y(e instanceof Error?e.message:String(e))}}});const Ci=e=>{let t=e.trim().replace(/\.git$/i,``);if(!t)return;if(/^[\w.-]+\/[\w.-]+$/.test(t))return`https://github.com/${t}`;let n=t.match(/^git@github\.com:([\w.-]+\/[\w.-]+)$/i);if(n)return`https://github.com/${n[1]}`;if(t.startsWith(`http://`)||t.startsWith(`https://`))try{let e=new URL(t);if(e.hostname!==`github.com`)return;let n=e.pathname.split(`/`).filter(Boolean);return n.length<2?void 0:`https://github.com/${n[0]}/${n[1]}`}catch{return}},wi=async e=>{let t=e.action;t||O(`ACTION_REQUIRED`,`Task action required`);try{switch(t){case`list`:try{var n=N();let t=n.a(await P.create({host:e.host,module:e.module})).iter(`tasks`),r=e.status,i=e.limit?parseInt(e.limit,10):void 0;i!==void 0&&(!Number.isFinite(i)||i<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`),r&&(t=t.filter(e=>L.matches(e.status,r))),e.project&&(t=t.filter(t=>t.projectId.toString()===e.project)),e.assigned&&(t=t.filter(e=>e.assignedTo)),t=t.sort((e,t)=>{let n=W(e.createdAt),r=W(t.createdAt);return n===r?e.id===t.id?0:t.id>e.id?1:-1:r>n?1:-1}),i!==void 0&&(t=t.slice(0,i)),D({tasks:t,count:t.length}),E()||console.log(H(`tasks`,t.map(e=>({id:e.id.toString(),title:e.title,status:L.display(e.status),priority:e.priority,assignedTo:e.assignedTo||``,projectId:e.projectId}))));break}catch(e){n.e=e}finally{await n.d()}case`ready`:try{var r=N();let t=r.a(await P.create({host:e.host,module:e.module})),n=t.iter(`tasks`),i=t.iter(`task_dependencies`),a=new Map(n.map(e=>[e.id.toString(),e])),o=e.limit?parseInt(e.limit,10):void 0;o!==void 0&&(!Number.isFinite(o)||o<=0)&&O(`INVALID_LIMIT`,`--limit must be a positive integer`);let s=n.filter(e=>L.is.open(e.status)).filter(e=>!i.filter(t=>t.taskId===e.id).some(e=>{let t=typeof e.dependencyType==`string`?e.dependencyType:e.dependencyType.tag;if(t!==`Blocks`&&t!==`ParentChild`&&t!==`blocks`&&t!==`parent-child`)return!1;let n=a.get(e.dependsOnId.toString());return n?!L.is.completed(n.status):!1})).filter(t=>!e.project||t.projectId.toString()===e.project).filter(t=>!e.assigned||!!t.assignedTo).sort((e,t)=>{if(e.priority!==t.priority)return e.priority-t.priority;let n=W(e.createdAt),r=W(t.createdAt);return n<r?-1:+(n>r)}),c=(o===void 0?s:s.slice(0,o)).map(e=>({id:e.id.toString(),title:e.title,status:e.status.tag.toLowerCase(),priority:e.priority,assignedTo:e.assignedTo||``,projectId:e.projectId.toString(),blockedBy:[]}));D({tasks:c,count:c.length}),E()||console.log(H(`tasks`,c.map(e=>({id:e.id,title:e.title,status:e.status,priority:e.priority,assignedTo:e.assignedTo,projectId:e.projectId}))));break}catch(e){r.e=e}finally{await r.d()}case`get`:try{var i=N();let t=e.id;t||O(`TASK_ID_REQUIRED`,`Task ID required`);let n=i.a(await P.create({host:e.host,module:e.module})).iter(`tasks`).find(e=>e.id.toString()===t);n||O(`TASK_NOT_FOUND`,`Task not found: ${t}`),D(n),E()||console.log(H(`task`,[{id:n.id.toString(),title:n.title,status:L.display(n.status),priority:n.priority,assignedTo:n.assignedTo||``,projectId:n.projectId.toString(),githubIssueUrl:n.githubIssueUrl||``,githubPrUrl:n.githubPrUrl||``,description:n.description}]));break}catch(e){i.e=e}finally{await i.d()}case`create`:{(!e.project||!e.title)&&O(`ARGS_REQUIRED`,`--project and --title required`);let t=parseInt(e.priority||`5`,10);(t<1||t>10)&&O(`INVALID_PRIORITY`,`Priority must be 1-10`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{await I(n,`createTask`,{projectId:BigInt(e.project),title:e.title,description:e.description||``,priority:t,sourceIdeaId:void 0,githubIssueUrl:e[`github-issue-url`]})}),D({created:!0,projectId:e.project,title:e.title,issue:e[`github-issue-url`]}),E()||console.log(H(`task_created`,[{projectId:e.project,title:e.title,githubIssueUrl:e[`github-issue-url`]||``}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`claim`:{let t=e.id;t||O(`TASK_ID_REQUIRED`,`Task ID required`);try{let n,r;await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{await I(e,`claimTask`,{taskId:BigInt(t)});let i=e.iter(`tasks`).find(e=>e.id.toString()===t),a=i?e.iter(`projects`).find(e=>e.id===i.projectId):void 0;a?.githubRepo&&(n=Ci(a.githubRepo),n&&(r=`${n}/blob/main/CONTRIBUTING.md`))}),D({claimed:!0,taskId:t,repositoryUrl:n,contributingUrl:r,nextSteps:[n?`Fork the target repository: ${n}`:`Fork the target repository to your GitHub account using gh cli`,r?`Read CONTRIBUTING.md before starting: ${r}`:`Read CONTRIBUTING.md in the target repository before starting`,`Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.`]}),E()||(console.log(H(`task_claimed`,[{taskId:t,repositoryUrl:n||``,contributingUrl:r||``}])),console.log(``),console.log(`Next steps:`),console.log(n?`1. Fork the target repository: ${n}`:`1. Fork the target repository to your GitHub account`),console.log(r?`2. Read CONTRIBUTING.md before starting: ${r}`:`2. Read CONTRIBUTING.md in the target repository before starting`),console.log(`3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.`))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`update`:{let t=e.id;t||O(`TASK_ID_REQUIRED`,`Task ID required`),!e.status&&!e[`github-pr-url`]&&O(`UPDATE_REQUIRED`,`--status or --github-pr-url required`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{await I(n,`updateTaskStatus`,{taskId:BigInt(t),status:e.status?L.fromString(e.status):void 0,githubPrUrl:e[`github-pr-url`],archiveReason:void 0})}),D({updated:!0,taskId:t,status:e.status,pr:e[`github-pr-url`]}),E()||console.log(H(`task_updated`,[{taskId:t,status:e.status||``,githubPrUrl:e[`github-pr-url`]||``}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`review`:{let t=e.id;t||O(`TASK_ID_REQUIRED`,`Task ID required`);try{await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{await I(n,`updateTaskStatus`,{taskId:BigInt(t),status:{tag:`Review`},githubPrUrl:e[`github-pr-url`],archiveReason:void 0})}),D({reviewed:!0,taskId:t,status:`review`,pr:e[`github-pr-url`]}),E()||console.log(H(`task_review`,[{taskId:t,status:`review`,githubPrUrl:e[`github-pr-url`]||``}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}break}case`deps`:{let t=e.id;t||O(`TASK_ID_REQUIRED`,`Task ID required`);let n=BigInt(t);if(e[`add-dep`])try{await F({host:e.host,module:e.module,wallet:e.wallet},async t=>{await I(t,`addTaskDependency`,{taskId:n,dependsOnId:BigInt(e[`add-dep`]),dependencyType:{tag:`Blocks`}})}),D({added:!0,taskId:t,dependsOn:e[`add-dep`]}),E()||console.log(H(`dependency_added`,[{taskId:t,dependsOnId:e[`add-dep`],dependencyType:`blocks`}]))}catch(e){O(`REDUCER_FAILED`,e instanceof Error?e.message:`Unknown error`)}else if(e.list)try{var a=N();let t=a.a(await P.create({host:e.host,module:e.module})).iter(`task_dependencies`).filter(e=>e.taskId===n||e.dependsOnId===n);D({dependencies:t}),E()||console.log(H(`task_dependencies`,t.map(e=>({id:e.id.toString(),taskId:e.taskId.toString(),dependsOnId:e.dependsOnId.toString(),dependencyType:e.dependencyType}))))}catch(e){a.e=e}finally{await a.d()}else O(`DEPS_ACTION_REQUIRED`,`Use --add-dep <taskId> to add a dependency or --list to view dependencies`,`Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17`);break}case`watch`:{let t=Math.min(parseInt(e.timeout||`60`,10),300);await F({host:e.host,module:e.module,wallet:e.wallet},async n=>{E()||console.log(H(`task_watch`,[{timeoutSeconds:t,statusFilter:e.status||``}]));let r=new Promise(e=>{let n=setTimeout(()=>{process.off(`SIGINT`,r),process.off(`SIGTERM`,r),e()},t*1e3),r=()=>{clearTimeout(n),process.off(`SIGINT`,r),process.off(`SIGTERM`,r),e()};process.on(`SIGINT`,r),process.on(`SIGTERM`,r)});n.db.tasks.onInsert((t,n)=>{(!e.status||L.matches(n.status,e.status))&&console.log(H(`tasks`,[{id:n.id.toString(),title:n.title,change_type:`created`}]))}),n.db.tasks.onUpdate((t,n,r)=>{(!e.status||L.matches(r.status,e.status))&&console.log(H(`tasks`,[{id:r.id.toString(),title:r.title,change_type:`updated`}]))}),await r});break}default:O(`INVALID_ACTION`,`Invalid action: ${t}`,`Use: list, ready, get, create, claim, update, review, deps, watch`)}}catch(e){Y(e instanceof Error?e.message:String(e))}};var Ti=t({meta:{name:`task`,description:`Task management`},args:{action:{type:`positional`,description:`Action: list, ready, get, create, claim, update, review, deps, watch`,required:!1},id:{type:`positional`,description:`Task ID`,required:!1},status:{type:`string`,description:`Status filter or new status`},project:{type:`string`,description:`Project ID`},title:{type:`string`,description:`Task title`},description:{type:`string`,description:`Task description`},priority:{type:`string`,description:`Priority 1-10`},assigned:{type:`boolean`,description:`Show only assigned tasks`,default:!1},wallet:{type:`string`,description:`Wallet name`},"github-pr-url":{type:`string`,description:`GitHub PR URL`},"github-issue-url":{type:`string`,description:`GitHub issue URL`},"add-dep":{type:`string`,description:`Add dependency task ID`},list:{type:`boolean`,description:`List dependencies`,default:!1},timeout:{type:`string`,description:`Watch timeout (seconds)`},limit:{type:`string`,description:`Limit rows for list/ready`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){if(e.json&&T(!0),!e.action){A({command:`probe task`,description:`Task management commands`,usage:[`probe task <action> [options]`,`probe task list --project 1 --status open`,`probe task create --project 1 --title "Fix bug" --priority 5`],actions:[{name:`list`,detail:`List tasks with optional filters`},{name:`ready`,detail:`List immediately claimable open tasks`},{name:`get <id>`,detail:`Show one task`},{name:`create`,detail:`Create a new task`},{name:`claim <id>`,detail:`Claim a task for your identity`},{name:`update <id>`,detail:`Update status and optional PR URL`},{name:`review <id>`,detail:`Mark a task as ready for review`},{name:`deps <id>`,detail:`List or add task dependencies`},{name:`watch`,detail:`Watch task changes in real time`}],options:[{name:`--project`,detail:`Project ID`},{name:`--title`,detail:`Task title (create)`},{name:`--description`,detail:`Task description`},{name:`--priority`,detail:`Priority from 1 to 10 (default: 5)`},{name:`--status`,detail:`Filter or new status`},{name:`--limit`,detail:`Limit rows for list/ready`},{name:`--github-pr-url`,detail:`GitHub PR URL for update/review`},{name:`--github-issue-url`,detail:`GitHub issue URL for create`},{name:`--wallet`,detail:`Wallet to use for authenticated calls`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`}],notes:[`Use full long-form flags only; short aliases are intentionally disabled.`,"Find project IDs with `probe project list`; find task IDs with `probe task list`."]});return}await wi(e)}});const Ei=5e3,Di=[{key:`agents`,name:`agents`},{key:`tasks`,name:`tasks`},{key:`ideas`,name:`ideas`},{key:`messages`,name:`messages`},{key:`channels`,name:`channels`},{key:`projects`,name:`projects`},{key:`votes`,name:`votes`},{key:`discovered_tasks`,name:`discovered_tasks`},{key:`task_dependencies`,name:`task_dependencies`},{key:`identity_roles`,name:`identity_roles`},{key:`config`,name:`config`},{key:`project_channels`,name:`project_channels`},{key:`project_messages`,name:`project_messages`}],Oi=new Set([`connected`,`ready`,`disconnected`,`reconnecting`,`reconnected`,`subscription_applied`,`subscription_error`,`auth_failed`,`heartbeat_failed`,`heartbeat_recovered`,`shutdown`]),ki=(e,t)=>typeof t==`bigint`?t.toString():t,Ai=()=>new Date().toISOString(),ji=e=>new Promise(t=>setTimeout(t,e)),Mi=e=>{let t=Math.floor(Math.random()*(Ei*2+1)-Ei);return Math.max(1e3,e+t)},Ni=e=>Mi(Math.min(3e4,1e3*2**Math.max(0,e-1))),Pi=e=>e instanceof Error?e.message:String(e),Fi=e=>{if(e instanceof Error)return{name:e.name,message:e.message};if(typeof e==`string`||typeof e==`number`||typeof e==`boolean`||e===null)return e;if(typeof e==`bigint`)return e.toString();try{return JSON.parse(JSON.stringify(e,ki))}catch{return String(e)}},Ii=e=>e===`critical`||e===`info`||e===`debug`?e:`critical`,Li=(e,t)=>!!(t===`debug`||Oi.has(e)||t===`info`&&e.startsWith(`heartbeat_`)),Ri=async e=>{if(!e)return null;let t=l(e);return await f(s(t),{recursive:!0}),De(t,{flags:`a`})},zi=e=>{let t=e.toLowerCase();return t.includes(`authentication required`)||t.includes(`unauthorized`)||t.includes(`401`)},Bi={wallet:{type:`string`,description:`Wallet name for authenticated connection`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},sender:{type:`string`,description:`Optional sender filter (debug table events only)`},"log-file":{type:`string`,description:`Optional path to append JSONL daemon events`},"log-level":{type:`string`,description:`critical, info, or debug`,default:`critical`},pretty:{type:`boolean`,description:`Human-readable lifecycle logs to stderr`,default:!1},json:{type:`boolean`,description:`Reserved for CLI consistency`,default:!1}};async function Vi(e){let t=Ii(e[`log-level`]),n=e.pretty?Ne({stdout:process.stderr,stderr:process.stderr}):null,r=null;try{r=await Ri(e[`log-file`])}catch(e){let t=Pi(e),n=JSON.stringify({source:`nexus`,at:Ai(),type:`log_file_error`,message:t});console.log(n);return}let i=e=>{let t=JSON.stringify(e,ki);console.log(t),r&&r.write(`${t}\n`)},a=e=>{if(!Li(e.type,t)||(i({source:`nexus`,at:Ai(),...e}),!n))return;let r=String(e.type);r===`connected`?n.info(`Connected to Nexus`):r===`reconnected`?n.success(`Reconnected to Nexus`):r===`disconnected`?n.warn(`Disconnected from Nexus`):r===`reconnecting`?n.info(`Reconnecting to Nexus`):r===`auth_failed`?n.error(`Authentication failed`):r===`heartbeat_failed`?n.warn(`Heartbeat failed repeatedly`):r===`shutdown`&&n.info(`Nexus daemon shutting down`)},o=!1,s=null,c=new Promise(e=>{process.on(`SIGINT`,()=>{o||(o=!0,s=`SIGINT`,e())}),process.on(`SIGTERM`,()=>{o||(o=!0,s=`SIGTERM`,e())})}),l=0,u=null,d=!1;for(;!o;){let n=null;try{await F({host:e.host,module:e.module,wallet:e.wallet,onDisconnect:(...e)=>{n||={reason:`disconnected`,details:e.map(Fi)}}},async r=>{let i=r.auth?.wallet||e.wallet||null,s=r.iter(`agents`).find(e=>e.identity.toHexString()===r.identity?.toHexString());if(a(d?{type:`reconnected`,attempts:l,downtime_ms:u?Date.now()-u:null,identity:r.identity?.toHexString()}:{type:`connected`,identity:r.identity?.toHexString(),wallet:i,host:e.host||r.config.spacetime.host,module:e.module||r.config.spacetime.module}),d=!0,l=0,u=null,a({type:`subscription_applied`}),a({type:`ready`,identity:r.identity?.toHexString(),wallet:i,log_file:e[`log-file`]||null,log_level:t,auto_heartbeat:!!s}),t===`debug`)for(let t of Di){let n=r.db[t.key];n.onInsert?.((n,r)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&r.senderId!==e.sender||a({type:`table_insert`,table:t.name,row:Fi(r)})}),n.onUpdate?.((n,r,i)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&i.senderId!==e.sender||a({type:`table_update`,table:t.name,old_row:Fi(r),new_row:Fi(i)})}),n.onDelete?.((n,r)=>{e.sender&&(t.name===`messages`||t.name===`project_messages`)&&r.senderId!==e.sender||a({type:`table_delete`,table:t.name,row:Fi(r)})})}let f=null,p=!1,m=0,ee=()=>{o||!s||(f=setTimeout(async()=>{if(!s||p||o){ee();return}p=!0;try{await I(r,`heartbeat`,{agentId:s.id}),m>0&&a({type:`heartbeat_recovered`,failed_count_before_recovery:m}),m=0}catch(e){m+=1,m>=3&&!n&&(n={reason:`heartbeat_failed`,details:{consecutive_failures:m,message:Pi(e)}},a({type:`heartbeat_failed`,consecutive_failures:m,message:Pi(e)}))}finally{p=!1,ee()}},Mi(6e4)))};for(s&&ee();!o&&!n;)await Promise.race([c,ji(200)]);f&&clearTimeout(f)})}catch(e){let t=Pi(e);if(zi(t)){a({type:`auth_failed`,message:t});break}a({type:`subscription_error`,message:t}),n={reason:`disconnected`,details:{message:t}}}if(o)break;a({type:`disconnected`,reason:n?.reason||`disconnected`,details:Fi(n?.details||null)}),u===null&&(u=Date.now()),l+=1;let r=Ni(l);a({type:`reconnecting`,attempt:l,backoff_ms:r}),await Promise.race([c,ji(r)])}a({type:`shutdown`,signal:s||`unknown`}),r&&r.end()}var Hi=t({meta:{name:`nexus`,description:`Persistent Nexus daemon (keepalive + critical telemetry)`},args:Bi,async run({args:e}){if(j()){A({command:`probe nexus`,description:`Run persistent Nexus keepalive + critical event logger`,usage:[`probe nexus [options]`,`probe nexus --wallet agent-wallet`,`probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl`,`probe nexus --log-level debug --sender zoe-1`,`probe nexus --pretty`],options:[{name:`--wallet`,detail:`Wallet for authenticated persistent connection`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`},{name:`--log-level`,detail:`critical (default), info, or debug`},{name:`--sender`,detail:`Sender filter for debug message events only`},{name:`--log-file`,detail:`Optional JSONL file path for daemon events`},{name:`--pretty`,detail:`Human-readable lifecycle logs to stderr`}],notes:[`stdout is always structured JSONL for machine parsing.`,`Default mode logs critical connection lifecycle and heartbeat health events only.`,`Use --log-level debug to emit full table insert/update/delete payloads.`]});return}await Vi(e)}});const Z={ActionEventType:e=>Array.isArray(e)?[`Issued`,`Completed`,`Skipped`,`Failed`,`Expired`][e[0]]??`variant_${e[0]}`:e,ActionKind:e=>Array.isArray(e)?[`Repair`,`Inbox`,`Vote`,`Propose`,`ContinueTask`,`ClaimTask`,`ProjectSetup`,`CreateTasks`,`ValidateReviews`,`ReviewDiscovery`,`Idle`][e[0]]??`variant_${e[0]}`:e,ActionStatus:e=>Array.isArray(e)?[`Issued`,`Completed`,`Skipped`,`Failed`,`Expired`][e[0]]??`variant_${e[0]}`:e,AgentRole:e=>Array.isArray(e)?[`Zoe`,`Admin`,`Zeno`][e[0]]??`variant_${e[0]}`:e,AgentStatus:e=>Array.isArray(e)?[`Online`,`Offline`,`Working`][e[0]]??`variant_${e[0]}`:e,AnnouncementStatus:e=>Array.isArray(e)?[`Pending`,`Ready`,`Failed`][e[0]]??`variant_${e[0]}`:e,DependencyType:e=>Array.isArray(e)?[`Blocks`,`ParentChild`][e[0]]??`variant_${e[0]}`:e,DiscoveredTaskStatus:e=>Array.isArray(e)?[`PendingReview`,`Approved`,`Rejected`,`EscalatedToIdea`][e[0]]??`variant_${e[0]}`:e,DiscoveryDecision:e=>Array.isArray(e)?[`ApproveAsTask`,`Reject`,`EscalateToIdea`][e[0]]??`variant_${e[0]}`:e,IdeaStatus:e=>Array.isArray(e)?[`Voting`,`ApprovedForProject`,`Rejected`,`Implemented`][e[0]]??`variant_${e[0]}`:e,MessageType:e=>Array.isArray(e)?[`User`,`System`,`Directive`][e[0]]??`variant_${e[0]}`:e,ProjectStatus:e=>Array.isArray(e)?[`Active`,`Paused`][e[0]]??`variant_${e[0]}`:e,TaskStatus:e=>Array.isArray(e)?[`Open`,`Claimed`,`InProgress`,`Review`,`Completed`,`Blocked`,`Archived`][e[0]]??`variant_${e[0]}`:e,VoteType:e=>Array.isArray(e)?[`Up`,`Down`,`Veto`][e[0]]??`variant_${e[0]}`:e},Q=e=>{if(!Array.isArray(e))return e;let t=e[0];return typeof t!=`number`&&typeof t!=`bigint`?e:new Date(Number(t)/1e3).toISOString()},$=e=>t=>{if(!Array.isArray(t))return t;let[n,r]=t;return n===1?null:e?e(r):Array.isArray(r)&&r.length===1?r[0]:r},Ui={agent_action_events:{event_code:$(),note:$(),created_at:Q},agent_actions:{target_type:$(),target_id:$(),created_at:Q,updated_at:Q,kind:Z.ActionKind,status:Z.ActionStatus},agents:{last_heartbeat:Q,current_task_id:$(),created_at:Q,last_active_at:Q,role:Z.AgentRole,status:Z.AgentStatus},channels:{created_at:Q},discovered_tasks:{created_task_id:$(),rejection_reason:$(),created_at:Q,reviewed_at:$(Q),reviewed_by:$(),status:Z.DiscoveredTaskStatus},ideas:{created_at:Q,updated_at:Q,status:Z.IdeaStatus},identity_roles:{role:Z.AgentRole},messages:{context_id:$(),created_at:Q},project_channels:{created_at:Q},project_messages:{context_id:$(),created_at:Q},projects:{created_at:Q,status:Z.ProjectStatus},task_dependencies:{created_at:Q},tasks:{assigned_to:$(),claimed_at:$(Q),github_issue_url:$(),github_pr_url:$(),source_idea_id:$(),archived_reason:$(),status_changed_by:$(),status_changed_at:$(Q),created_at:Q,updated_at:Q,status:Z.TaskStatus,blocked_from_status:$(Z.TaskStatus)},voice_announcements:{context_type:$(),context_id:$(),finalized_at:$(Q),failed_at:$(Q),error_message:$(),created_at:Q,status:Z.AnnouncementStatus},votes:{created_at:Q}};function Wi(e){return e.match(/FROM\s+(\w+)/i)?.[1]?.toLowerCase()}const Gi=e=>{if(typeof e.name==`string`)return e.name;if(e.name&&typeof e.name==`object`&&`some`in e.name)return e.name.some};var Ki=class extends Error{status;responseBody;constructor(e,t,n){super(n||`SQL request failed with status ${e}`),this.name=`SqlRequestError`,this.status=e,this.responseBody=t}};const qi=e=>{let t=new URL(e);if(t.protocol===`ws:`)t.protocol=`http:`;else if(t.protocol===`wss:`)t.protocol=`https:`;else if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`Unsupported host protocol: ${t.protocol}`);return t.toString()},Ji=(e,t)=>{let n=qi(e),r=new URL(n);return r.pathname=`${r.pathname.replace(/\/$/,``)}/v1/database/${encodeURIComponent(t)}/sql`,r.toString()},Yi=e=>{if(!Array.isArray(e))throw Error(`Invalid SQL response: expected array of statement results`);return e.map(e=>{let t=e,n=Array.isArray(t.rows)?t.rows:[];return{schema:t.schema,rows:n}})},Xi=async e=>{let t=Ji(e.host,e.moduleName),n=new AbortController,r=setTimeout(()=>n.abort(),e.timeoutMs),i=Date.now();try{let r=await fetch(t,{method:`POST`,headers:{Authorization:`Bearer ${e.token}`,"Content-Type":`text/plain`,Accept:`application/json`},body:e.sql,signal:n.signal}),a=await r.text();if(!r.ok)throw new Ki(r.status,a);let o;try{o=a?JSON.parse(a):[]}catch{throw Error(`Invalid SQL response: expected JSON payload`)}return{results:Yi(o),durationMs:Date.now()-i}}finally{clearTimeout(r)}},Zi=e=>{let t=e.schema;return t&&`elements`in t&&Array.isArray(t.elements)?t.elements.map(Gi).filter(e=>e!==void 0):t&&`columns`in t&&Array.isArray(t.columns)?t.columns.map(e=>e.name):[]},Qi=e=>{let t;try{t=JSON.parse(e).error||e}catch{t=e}return t.includes(`ORDER BY`)?{message:t,suggestion:`SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.`}:t.includes(`IS NULL`)||t.includes(`IS NOT NULL`)?{message:t,suggestion:`Use "column = NULL" or "column != NULL" instead of IS NULL / IS NOT NULL.`}:t.includes(`JOIN`)?{message:t,suggestion:`SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.`}:t.includes(`no such table`)?{message:t,suggestion:`Check the table name. Common tables: tasks, projects, agents, ideas, messages.`}:t.includes(`no such column`)?{message:t,suggestion:`Check the column name. Use SELECT * to see all available columns.`}:{message:t}},$i=Object.keys(Ui),ea=(e,t)=>{if(e instanceof Ki){e.status===401&&O(`AUTH_REQUIRED`,"Authentication required. Run `probe auth <wallet> --save` first.");let{message:t,suggestion:n}=Qi(e.responseBody);e.status===400&&O(`SQL_INVALID`,t,n),O(`SQL_FAILED`,t,n)}e instanceof Error&&e.name===`AbortError`&&O(`SQL_UNAVAILABLE`,`SQL request timed out after ${t}ms`),O(`SQL_UNAVAILABLE`,e instanceof Error?e.message:`SQL request failed`)},ta=3e4,na=(e,t)=>({duration_ms:t,query_count:e.length,row_count_total:e.reduce((e,t)=>e+t.rows.length,0)}),ra=(e,t,n)=>{let r={};for(let i=0;i<e.length;i+=1){let a=e[i],o=Zi(a),s=t&&n?Ui[n]:void 0,c=a.rows.map(e=>{let t={};for(let n=0;n<o.length;n++){let r=o[n],i=e[n],a=s?.[r];t[r]=a?a(i):i}return t});r[`query_${i+1}`]={columns:o,rows:c}}return e.length===0&&(r.query_1={columns:[],rows:[]}),r},ia=(e,t,n,r,i)=>{let a={},o=r&&i?Ui[i]:void 0;for(let t=0;t<e.length;t+=1){let n=e[t],r=Zi(n),i=n.rows.map(e=>{let t={};for(let n=0;n<r.length;n++){let i=r[n],a=e[n],s=o?.[i];t[i]=s?s(a):a}return t});a[`query_${t+1}`]=i}return e.length===0&&(a.query_1=[]),t&&(a.meta=[na(e,n)]),Un(a)};var aa=t({meta:{name:`query`,description:`Run SQL read queries against Nexus`},args:{sql:{type:`positional`,description:`SQL query string`,required:!1},file:{type:`string`,description:`Read SQL from file path`},wallet:{type:`string`,description:`Wallet name override`},host:{type:`string`,description:`SpacetimeDB host override`},module:{type:`string`,description:`SpacetimeDB module override`},timeout:{type:`string`,description:`Request timeout in milliseconds`},meta:{type:`boolean`,description:`Include metadata in output`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1},tables:{type:`boolean`,description:`List all available tables`,default:!1},decode:{type:`boolean`,description:`Decode algebraic types to human-readable values`,default:!0},raw:{type:`boolean`,description:`Output raw algebraic type arrays (no decoding)`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.sql||e.file;if(e.tables){E()?D({tables:$i}):console.log(Un({tables:$i}));return}if(!t){A({command:`probe query`,description:`Execute SQL against the configured Nexus SpacetimeDB module`,usage:[`probe query "SELECT * FROM tasks LIMIT 5"`,`probe query --file ./query.sql --meta`,`probe query --tables`],options:[{name:`--file`,detail:`Read SQL from file`},{name:`--wallet`,detail:`Wallet override (defaults to config defaultWallet)`},{name:`--host, --module`,detail:`Nexus SpacetimeDB target overrides`},{name:`--timeout`,detail:`Request timeout in ms (default: ${ta})`},{name:`--meta`,detail:`Include metadata in output`},{name:`--json`,detail:`JSON output mode with keyed objects`},{name:`--tables`,detail:`List all available tables`},{name:`--decode`,detail:`Decode algebraic types (default: true)`},{name:`--raw`,detail:`Output raw algebraic arrays (no decoding)`}],notes:[`This command is read-only and intended for SQL queries against Nexus tables.`,`JSON mode returns keyed objects: {"query_1": {"columns": [...], "rows": [{"id": 1, ...}]}}`,`Use --raw to see raw SpacetimeDB algebraic type arrays.`]});return}let n=e.timeout?Number.parseInt(e.timeout,10):ta;(!Number.isFinite(n)||n<=0)&&O(`INVALID_TIMEOUT`,`Invalid timeout: ${e.timeout}`);let r=await w(),i=e.wallet||r.defaultWallet;i||O(`WALLET_REQUIRED`,`Wallet required. Use --wallet or set default wallet.`),await M(i)||O(`WALLET_NOT_FOUND`,`Wallet not found: ${i}`);let a=await dt(i);a||O(`AUTH_REQUIRED`,"No cached token. Run `probe auth <wallet> --save` first.");let o=e.host||r.spacetime.host,s=e.module||r.spacetime.module,c=e.file?await p(e.file,`utf-8`):e.sql??``;c.trim()||O(`SQL_REQUIRED`,`SQL query is empty`);let l=e.raw?!1:e.decode??!0,u=Wi(c);try{let{results:t,durationMs:r}=await Xi({host:o,moduleName:s,token:a.token,sql:c,timeoutMs:n});if(E()){let n=ra(t,l,u);e.meta?D({...n,meta:na(t,r)}):D(n);return}console.log(ia(t,!!e.meta,r,l,u))}catch(e){ea(e,n)}}}),oa=t({meta:{name:`sign`,description:`Sign a message using wallet private key`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},message:{type:`positional`,description:`Message to sign`,required:!1},"message-file":{type:`string`,description:`Read message from file`},"password-file":{type:`string`,description:`Read password from file`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(!t){A({command:`probe sign`,description:`Sign arbitrary text using wallet private key`,usage:[`probe sign <wallet-name> <message> [options]`,`probe sign <wallet-name> --message-file ./payload.txt [options]`],options:[{name:`--message-file`,detail:`Read message content from file`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--json`,detail:`JSON output for agents`}]});return}let n;if(e[`message-file`])try{n=await p(e[`message-file`],`utf-8`)}catch{O(`FILE_READ_ERROR`,`Failed to read message file: ${e[`message-file`]}`)}else e.message?n=e.message:O(`MESSAGE_REQUIRED`,`Message or message-file required`);let i=await Ze({passwordFile:e[`password-file`],promptMessage:`Enter wallet password:`,jsonModeError:`Password file required in JSON mode or provide PROBE_WALLET_PASSWORD`});try{let e=(await vt(t,i)).getKeyPair(0),a=e.sign(r.from(n)),o=e.getPublicKey(),s=e.getAddress();D({wallet:t,message:n,signature:a.toString(`hex`),publicKey:o.toString(`hex`),address:s.toString()}),E()||(k(`Message signed successfully`),console.log(`Signature: ${a.toString(`hex`)}`))}catch(e){O(`SIGN_ERROR`,e instanceof Error?e.message:`Failed to sign message`)}}}),sa=t({meta:{name:`token`,description:`Show cached JWT token for wallet`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},clear:{type:`boolean`,description:`Clear cached token now (next auth call gets a new token)`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(!t){A({command:`probe token`,description:`Inspect or clear cached authentication token`,usage:[`probe token <wallet-name> [options]`,`probe token <wallet-name> --clear`],options:[{name:`--clear`,detail:`Clear cached token now (recommended)`},{name:`--json`,detail:`JSON output for agents`}]});return}if(e.clear){await ft(t),D({cleared:t}),E()||Ke(`Token cache cleared for "${t}". Run 'probe auth' to get a new token.`);return}try{let e=await dt(t);e||O(`TOKEN_NOT_FOUND`,`No cached token for wallet '${t}'`,`Run 'probe auth ${t} --save' to authenticate`);let n=new Date(e.expiresAt),r=new Date,i=Math.floor((n.getTime()-r.getTime())/1e3),a=i>0;D({wallet:t,token:e.token,expiresAt:e.expiresAt,expiresIn:Math.max(0,i),valid:a}),E()||(console.log(`Wallet: ${t}`),console.log(`Token: ${e.token.slice(0,50)}...`),console.log(`Expires: ${n.toUTCString()}`),console.log(`Status: ${a?`Valid`:`Expired`}`),a||Ke(`Token has expired. Run with --clear to remove it and re-authenticate.`))}catch(e){O(`TOKEN_ERROR`,e instanceof Error?e.message:`Failed to read token`)}}});const ca=new Set([`auto`,`npm`,`binary`]),la=e=>{D(e),!E()&&console.log(H(`upgrade_result`,[{method:e.method,currentVersion:e.currentVersion,targetVersion:e.targetVersion,latestVersion:e.latestVersion,updated:e.updated,checkOnly:e.checkOnly}]))};var ua=t({meta:{name:`upgrade`,description:`Upgrade Probe to the latest or a specific version`},args:{target:{type:`positional`,description:`Version to upgrade to (e.g. 1.2.0 or v1.2.0)`,required:!1},check:{type:`boolean`,description:`Check for updates without upgrading`,default:!1},method:{type:`string`,description:`Installation method: auto, npm, binary`},yes:{type:`boolean`,description:`Skip confirmation prompts`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(e.json&&T(!0),e.target===`--help`||e.target===`-h`){A({command:`probe upgrade`,description:`Upgrade Probe to the latest or a specific version`,usage:[`probe upgrade`,`probe upgrade --check`,`probe upgrade 1.2.0`,`probe upgrade --method npm`,`probe upgrade --method binary --yes`,`probe upgrade --json --check`],options:[{name:`--check`,detail:`Check for updates without upgrading`},{name:`--method`,detail:`Force install method: auto, npm, binary`},{name:`--yes`,detail:`Skip confirmation prompts`},{name:`--json`,detail:`JSON output`}]});return}let t=e.method;t&&!ca.has(t)&&O(`INVALID_METHOD`,`Invalid --method value: ${e.method}`,`Use: --method auto | npm | binary`);let n=Jn(),r=Yn(t),i,a,o;try{if(e.target)i=U(e.target),r===`binary`&&(o=await $n(i));else if(r===`npm`)a=await Xn(),i=a;else{let e=await Qn();a=e.version,i=e.version,o=e.release}}catch(t){let n=t instanceof Error?t.message:`Failed to check latest version`;!e.target&&r===`binary`&&n.includes(`GitHub API returned 404`)&&O(`NO_RELEASES_PUBLISHED`,`No GitHub releases are published yet for binary upgrades.`,`Use: npm install -g @zenon-red/probe (or your package manager) until the first release is published.`),O(`VERSION_LOOKUP_FAILED`,n)}i||O(`VERSION_LOOKUP_FAILED`,`Could not determine target version.`);let s=i!==n;if(e.check){la({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:s,updated:!1,checkOnly:!0});return}if(r===`unknown`&&O(`METHOD_UNKNOWN`,`Could not detect installation method for in-place upgrade.`,"Use --method npm|binary explicitly, or run your package manager upgrade command (e.g. `bun add -g @zenon-red/probe`)."),!s){la({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:!1,updated:!1,checkOnly:!1});return}!E()&&!e.yes&&(await te({message:`Upgrade Probe from ${n} to ${i}?`})||(Ke(`Upgrade cancelled`),process.exit(0)));try{r===`npm`?await ir(i):await ar(o||await $n(i),i)}catch(e){let t=e instanceof Error?e.message:`Upgrade failed`;O(t.includes(`CHECKSUM_MISMATCH`)?`CHECKSUM_MISMATCH`:t.includes(`ROLLBACK_FAILED`)?`ROLLBACK_FAILED`:t.includes(`PERMISSION`)||t.includes(`EACCES`)?`PERMISSION_DENIED`:`UPGRADE_FAILED`,t)}la({method:r,currentVersion:n,targetVersion:i,latestVersion:a||i,updateAvailable:!0,updated:!0,checkOnly:!1})}}),da=t({meta:{name:`create`,description:`Create a new wallet with randomly generated mnemonic`},args:{name:{type:`positional`,description:`Wallet identifier`,required:!1},"password-file":{type:`string`,description:`Read password from file`},"set-default":{type:`boolean`,description:`Set this wallet as the default`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(j()||!t){A({command:`probe wallet create`,description:`Create a new encrypted wallet`,usage:[`probe wallet create <name> [options]`,`probe wallet create agent-wallet --set-default`],options:[{name:`--password-file`,detail:`Read wallet password from file`},{name:`--set-default`,detail:`Set created wallet as default`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.`]});return}/^[a-zA-Z0-9_-]+$/.test(t)||O(`INVALID_NAME`,`Wallet name must be alphanumeric with hyphens or underscores only`);let n=await w(),r=await Ze({passwordFile:e[`password-file`],promptMessage:`Enter password to encrypt wallet:`,confirmPromptMessage:`Confirm password:`,minLength:n.passwordMinLength,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt`});try{let n=await ht(t,r),i=e[`set-default`];if(i||(await _t()).length===1&&(i=!0),i){let e=await S();e.defaultWallet=n.name,await Le(e)}D({name:n.name,address:n.address,publicKey:n.publicKey,mnemonic:n.mnemonic,default:i}),E()||(k(`Wallet "${n.name}" created successfully`),console.log(`Address: ${n.address}`),console.log(`\nMnemonic: ${n.mnemonic}`),qe(`Save this mnemonic securely - it cannot be recovered!`),i&&console.log(`
59
+ Set as default wallet`))}catch(e){O(`WALLET_CREATE_ERROR`,e instanceof Error?e.message:`Failed to create wallet`)}}}),fa=t({meta:{name:`default`,description:`Set the default wallet`},args:{name:{type:`positional`,description:`Wallet name to set as default`,required:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(j()||!t){A({command:`probe wallet default`,description:`Set the default wallet used by commands`,usage:[`probe wallet default <name> [options]`,`probe wallet default agent-wallet`],options:[{name:`--json`,detail:`JSON output for agents`}]});return}await bt(t)||O(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`);let n=await S();n.defaultWallet=t,await Le(n),D({defaultWallet:t}),E()||k(`Default wallet set to '${t}'`)}}),pa=t({meta:{name:`delete`,description:`Delete a wallet`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},yes:{type:`boolean`,description:`Skip confirmation prompt`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(j()||!t){A({command:`probe wallet delete`,description:`Delete a wallet from local storage`,usage:[`probe wallet delete <name> [options]`,`probe wallet delete old-wallet --yes`],options:[{name:`--yes`,detail:`Skip interactive confirmation prompt`},{name:`--json`,detail:`JSON output for agents`}]});return}await bt(t)||O(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`,`Run 'probe wallet list' to see available wallets`),!E()&&!e.yes&&(await te({message:`Are you sure you want to delete wallet "${t}"? This cannot be undone.`})||(Ke(`Deletion cancelled`),process.exit(0)));try{await yt(t),D({deleted:t}),E()||k(`Wallet "${t}" deleted successfully`)}catch(e){O(`WALLET_DELETE_ERROR`,e instanceof Error?e.message:`Failed to delete wallet`)}}}),ma=t({meta:{name:`import`,description:`Import wallet from mnemonic phrase`},args:{name:{type:`positional`,description:`Wallet identifier`,required:!1},mnemonic:{type:`string`,description:`Mnemonic phrase (space-separated)`},"mnemonic-file":{type:`string`,description:`Read mnemonic from file`},"password-file":{type:`string`,description:`Read password from file`},"set-default":{type:`boolean`,description:`Set this wallet as the default`,default:!1},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(j()||!t){A({command:`probe wallet import`,description:`Import an encrypted wallet from mnemonic`,usage:[`probe wallet import <name> [options]`,`probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt`],options:[{name:`--mnemonic`,detail:`24-word mnemonic phrase`},{name:`--mnemonic-file`,detail:`Read mnemonic from file`},{name:`--password-file`,detail:`Read wallet password from file`},{name:`--set-default`,detail:`Set imported wallet as default`},{name:`--json`,detail:`JSON output for agents`}],notes:[`Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.`]});return}/^[a-zA-Z0-9_-]+$/.test(t)||O(`INVALID_NAME`,`Wallet name must be alphanumeric with hyphens or underscores only`);let n=await Qe({mnemonic:e.mnemonic,mnemonicFile:e[`mnemonic-file`],jsonModeError:`Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env`}),r=await Ze({passwordFile:e[`password-file`],promptMessage:`Enter password to encrypt wallet:`,jsonModeError:`Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt`});try{let i=await gt(t,n,r),a=e[`set-default`];if(a||(await _t()).length===1&&(a=!0),a){let e=await S();e.defaultWallet=i.name,await Le(e)}D({name:i.name,address:i.address,default:a}),E()||(k(`Wallet "${i.name}" imported successfully`),console.log(`Address: ${i.address}`),a&&console.log(`
60
+ Set as default wallet`))}catch(e){O(`WALLET_IMPORT_ERROR`,e instanceof Error?e.message:`Failed to import wallet`)}}}),ha=t({meta:{name:`list`,description:`List all stored wallets`},args:{json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){if(j()){A({command:`probe wallet list`,description:`List all locally stored wallets`,usage:[`probe wallet list [options]`,`probe wallet list --json`],options:[{name:`--json`,detail:`JSON output for agents`}]});return}e.json&&T(!0);try{let e=await _t(),t=await w(),n=e.map(e=>({...e,default:e.name===t.defaultWallet}));if(D(n),!E())if(e.length===0)Ke(`No wallets found`);else{console.log(`Wallets:`);for(let e of n){let t=e.createdAt?new Date(e.createdAt).toLocaleDateString():`unknown`,n=e.default?`*`:` `;console.log(`${n} ${e.name.padEnd(12)} ${e.address.slice(0,10)}... created ${t}`)}t.defaultWallet&&console.log(`
61
+ * = default wallet`)}}catch(e){O(`WALLET_LIST_ERROR`,e instanceof Error?e.message:`Failed to list wallets`)}}}),ga=t({meta:{name:`show`,description:`Show wallet address and public key`},args:{name:{type:`positional`,description:`Wallet name`,required:!1},"public-key":{type:`boolean`,description:`Include public key in output`,default:!1},"password-file":{type:`string`,description:`Read password from file`},json:{type:`boolean`,description:`Output JSON only`,default:!1}},async run({args:e}){e.json&&T(!0);let t=e.name;if(j()||!t){A({command:`probe wallet show`,description:`Show wallet address and optional public key`,usage:[`probe wallet show <name> [options]`,`probe wallet show my-wallet --public-key --password-file ./pass.txt`],options:[{name:`--public-key`,detail:`Include public key in output`},{name:`--password-file`,detail:`Read password for public key extraction`},{name:`--json`,detail:`JSON output for agents`}]});return}let n=await M(t);n||O(`WALLET_NOT_FOUND`,`Wallet '${t}' does not exist`,`Run 'probe wallet list' to see available wallets`);let r;if(e[`password-file`])try{r=await p(e[`password-file`],`utf-8`),r=r.trim()}catch{O(`FILE_READ_ERROR`,`Failed to read password file: ${e[`password-file`]}`)}try{let i;r&&(i=(await vt(t,r)).getKeyPair(0).getPublicKey().toString(`hex`));let a={name:n.name,address:n.address,createdAt:n.createdAt};(e[`public-key`]||i)&&(a.publicKey=i),D(a),E()||(console.log(`Name: ${n.name}`),console.log(`Address: ${n.address}`),n.createdAt&&console.log(`Created: ${new Date(n.createdAt).toLocaleString()}`),i&&console.log(`Public Key: ${i}`))}catch(e){O(`WALLET_LOAD_ERROR`,e instanceof Error?e.message:`Failed to load wallet`)}}});const _a=new Set([`create`,`import`,`list`,`show`,`delete`,`default`]);var va=t({meta:{name:`wallet`,description:`Manage Zenon Network wallets`},run(){let e=process.argv.slice(2).filter(e=>!e.startsWith(`-`));e.length>1&&_a.has(e[1])||A({command:`probe wallet`,description:`Create, import, inspect, and manage wallets`,usage:[`probe wallet <subcommand> [positionals] [options]`,`probe wallet create my-wallet --set-default`,`probe wallet import my-wallet --mnemonic-file ./mnemonic.txt`],actions:[{name:`create <name>`,detail:`Create a new encrypted wallet`},{name:`import <name>`,detail:`Import wallet from mnemonic phrase`},{name:`list`,detail:`List stored wallets`},{name:`show <name>`,detail:`Show wallet address and optional public key`},{name:`delete <name>`,detail:`Delete a wallet`},{name:`default <name>`,detail:`Set default wallet`}],notes:[`Use long-form flags only for predictable agent automation.`]})},subCommands:{create:da,import:ma,list:ha,show:ga,delete:pa,default:fa}}),ya=t({meta:{name:`whoami`,description:`Show current authenticated agent profile`},args:{wallet:{type:`string`,description:`Wallet name`},json:{type:`boolean`,description:`Output JSON`,default:!1},host:{type:`string`,description:`SpacetimeDB host`},module:{type:`string`,description:`Module name`}},async run({args:e}){e.json&&T(!0);try{await F({host:e.host,module:e.module,wallet:e.wallet},async e=>{let t=e.iter(`agents`).find(t=>t.identity.toHexString()===e.identity?.toHexString());t||O(`NOT_REGISTERED`,"Agent not registered. Run `probe agent register` first."),D(t),E()||console.log(H(`agent`,[{id:t.id,name:t.name,role:z.display(t.role),status:B.display(t.status),lastHeartbeat:G(t.lastHeartbeat),currentTaskId:t.currentTaskId?t.currentTaskId.toString():``,capabilities:t.capabilities.join(`,`),identity:e.identity?.toHexString()||``}]))})}catch(e){Y(e instanceof Error?e.message:String(e))}}});const ba=new Set([`wallet`,`auth`,`sign`,`token`,`config`,`nexus`,`agent`,`task`,`message`,`idea`,`discover`,`project`,`query`,`doctor`,`whoami`,`upgrade`,`onboard`,`next`]),xa=()=>{let e=st(process.argv.slice(2));ot(e.forceHelp),process.argv=[...process.argv.slice(0,2),...e.argv]},{version:Sa,description:Ca}=e(import.meta.url)(`../package.json`),wa=t({meta:{name:`probe`,version:Sa,description:Ca},args:{json:{type:`boolean`,description:`Output JSON only`,default:!1}},run(){let e=process.argv.slice(2).find(e=>!e.startsWith(`-`));e&&ba.has(e)||A({command:`probe`,description:Ca,usage:[`probe <command> [positionals] [options]`,`probe idea propose --title "Better task scoring" --category planning`,`probe task claim 42 --wallet agent-wallet`],actions:[{name:`wallet`,detail:`Wallet lifecycle commands`},{name:`auth`,detail:`Authenticate wallet and cache token`},{name:`token`,detail:`Inspect or clear cached token`},{name:`sign`,detail:`Sign text payloads`},{name:`nexus`,detail:`Run persistent Nexus daemon (keepalive + event logs)`},{name:`agent, task, idea, discover, message, project`,detail:`Nexus workspace commands`},{name:`query`,detail:`Execute SQL queries against Nexus`},{name:`doctor`,detail:`Run setup and connectivity diagnostics`},{name:`onboard`,detail:`Idempotent agent setup for autonomous participation`},{name:`next`,detail:`Deterministic router for one bounded action per wake`},{name:`upgrade`,detail:`Upgrade Probe to the latest version`},{name:`config`,detail:`Read/write CLI configuration`}],options:[{name:`--json`,detail:`JSON output mode for agents`}],notes:[`Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).`]})},subCommands:{wallet:va,auth:St,sign:oa,token:sa,config:Tt,nexus:Hi,agent:ni,task:Ti,message:xi,idea:hi,discover:oi,project:Si,query:aa,doctor:Wn,onboard:Yr,next:pr,upgrade:ua,whoami:ya}}),Ta=e=>{if(!(e instanceof Error))return!1;let t=e.message.toLowerCase();return t.includes(`connection failed`)||t.includes(`connection timeout`)||t.includes(`authentication required`)||t.includes(`unauthorized`)||t.includes(`wallet required`)||t.includes(`wallet not found`)||t.includes(`agent not registered`)||t.includes(`subscription error`)};process.on(`unhandledRejection`,e=>{Ta(e)&&process.exit(1),E()?console.error(JSON.stringify({success:!1,error:{code:`UNEXPECTED_ERROR`,message:e instanceof Error?e.message:String(e)}})):console.error(e instanceof Error?e.message:String(e)),process.exit(1)}),xa(),n(wa);export{};
10
62
  //# sourceMappingURL=index.js.map