@zenon-red/probe 1.0.0 → 1.0.1

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["jsonReplacer","spinner","clackSpinner","walletSubcommands","spinner","__t","AgentRole","AgentStatus","IdeaStatus","MessageType","ProjectStatus","TaskStatus","VoteType","__t","__t","__t","__t","__t","__t","__t","__t","__t","AgentRole","__t","__t","MessageType","__t","MessageType","AgentStatus","__t","__t","__t","ProjectStatus","__t","TaskStatus","__t","VoteType","__t","AgentRole","AgentStatus","__t","__t","__t","__t","IdeaStatus","__t","AgentRole","__t","MessageType","__t","__t","MessageType","__t","ProjectStatus","__t","__t","TaskStatus","__t","VoteType","__schema","__table","AgentsRow","ChannelsRow","ConfigRow","DiscoveredTasksRow","IdeasRow","IdentityRolesRow","MessagesRow","ProjectChannelsRow","ProjectMessagesRow","ProjectsRow","TaskDependenciesRow","TasksRow","VotesRow","__reducers","__reducerSchema","AddTaskDependencyReducer","ClaimTaskReducer","CreateProjectReducer","CreateTaskReducer","DiscoverTaskReducer","HeartbeatReducer","MarkIdeaImplementedReducer","ProposeIdeaReducer","RegisterAgentReducer","ReviewDiscoveredTaskReducer","SeedUiDataReducer","SendMessageReducer","SendProjectMessageReducer","SetAgentStatusReducer","UpdateAgentCapabilitiesReducer","UpdateProjectStatusReducer","UpdateTaskStatusReducer","VoteIdeaReducer","__procedures","__makeQueryBuilder","reducers","__convertToAccessorMap","__SubscriptionBuilderImpl","DbConnectionBuilder","__DbConnectionBuilder","__DbConnectionImpl","createWalletUtil","importCmd","deleteCmd","defaultCmd","nexusDaemon"],"sources":["../src/types/config.ts","../src/utils/user-config.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/credentials.ts","../src/utils/help.ts","../src/utils/oidc.ts","../src/utils/token-cache.ts","../src/utils/wallet.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/module_bindings/types.ts","../src/module_bindings/add_task_dependency_reducer.ts","../src/module_bindings/claim_task_reducer.ts","../src/module_bindings/create_project_reducer.ts","../src/module_bindings/create_task_reducer.ts","../src/module_bindings/discover_task_reducer.ts","../src/module_bindings/heartbeat_reducer.ts","../src/module_bindings/mark_idea_implemented_reducer.ts","../src/module_bindings/propose_idea_reducer.ts","../src/module_bindings/register_agent_reducer.ts","../src/module_bindings/review_discovered_task_reducer.ts","../src/module_bindings/seed_ui_data_reducer.ts","../src/module_bindings/send_message_reducer.ts","../src/module_bindings/send_project_message_reducer.ts","../src/module_bindings/set_agent_status_reducer.ts","../src/module_bindings/update_agent_capabilities_reducer.ts","../src/module_bindings/update_project_status_reducer.ts","../src/module_bindings/update_task_status_reducer.ts","../src/module_bindings/vote_idea_reducer.ts","../src/module_bindings/agents_table.ts","../src/module_bindings/channels_table.ts","../src/module_bindings/config_table.ts","../src/module_bindings/discovered_tasks_table.ts","../src/module_bindings/ideas_table.ts","../src/module_bindings/identity_roles_table.ts","../src/module_bindings/messages_table.ts","../src/module_bindings/project_channels_table.ts","../src/module_bindings/project_messages_table.ts","../src/module_bindings/projects_table.ts","../src/module_bindings/task_dependencies_table.ts","../src/module_bindings/tasks_table.ts","../src/module_bindings/votes_table.ts","../src/module_bindings/index.ts","../src/utils/context.ts","../src/utils/toon.ts","../src/commands/doctor.ts","../src/utils/enums.ts","../src/utils/time.ts","../src/commands/nexus/agent-handlers.ts","../src/commands/nexus/agent.ts","../src/commands/nexus/discover.ts","../src/commands/nexus/idea.ts","../src/commands/nexus/message-handlers.ts","../src/commands/nexus/message.ts","../src/commands/nexus/project.ts","../src/commands/nexus/task-handlers.ts","../src/commands/nexus/task.ts","../src/commands/nexus-daemon.ts","../src/generated/decoders.ts","../src/utils/sql.ts","../src/commands/query.ts","../src/commands/sign.ts","../src/commands/token.ts","../src/commands/wallet/create.ts","../src/commands/wallet/default.ts","../src/commands/wallet/delete.ts","../src/commands/wallet/import.ts","../src/commands/wallet/list.ts","../src/commands/wallet/show.ts","../src/commands/wallet/index.ts","../src/commands/whoami.ts","../src/index.ts"],"sourcesContent":["export interface NexusConfig {\n\tissuer: string;\n\twalletDir: string;\n\tdefaultWallet?: string;\n\tpasswordMinLength: number;\n\ttokenCacheDir: string;\n\trequestTimeout: number;\n\tspacetime: {\n\t\thost: string;\n\t\tmodule: string;\n\t};\n}\n\nexport const DEFAULT_CONFIG: NexusConfig = {\n\tissuer: \"https://api.zenon.red\",\n\twalletDir: \"~/.probe/wallets\",\n\tpasswordMinLength: 8,\n\ttokenCacheDir: \"~/.probe/tokens\",\n\trequestTimeout: 30000,\n\tspacetime: {\n\t\thost: \"wss://db.zenon.red\",\n\t\tmodule: \"nexus\",\n\t},\n};\n\nexport interface WalletInfo {\n\tname: string;\n\taddress: string;\n\tpublicKey?: string;\n\tcreatedAt?: string;\n}\n\nexport interface WalletCreationResult {\n\tname: string;\n\taddress: string;\n\tpublicKey: string;\n\tmnemonic: string;\n}\n\nexport interface ChallengeResponse {\n\tnonce: string;\n\tchallenge: string;\n\texpiresAt: string;\n}\n\nexport interface TokenResponse {\n\taccessToken: string;\n\tidToken: string;\n\texpiresIn: number;\n}\n\nexport interface OutputResult<T> {\n\tsuccess: boolean;\n\tdata?: T;\n\terror?: { code: string; message: string; suggestion?: string };\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { NexusConfig } from \"~/types/index.js\";\n\nconst CONFIG_PATH = join(homedir(), \".probe\", \"config.json\");\nconst CONFIG_DIR = join(homedir(), \".probe\");\n\nexport async function loadUserConfig(): Promise<Partial<NexusConfig>> {\n\ttry {\n\t\tawait access(CONFIG_PATH);\n\t\tconst content = await readFile(CONFIG_PATH, \"utf-8\");\n\t\treturn JSON.parse(content) as Partial<NexusConfig>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nexport async function saveUserConfig(\n\tconfig: Partial<NexusConfig>,\n): Promise<void> {\n\tawait mkdir(CONFIG_DIR, { recursive: true });\n\tawait writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {\n\t\tmode: 0o600,\n\t});\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"c12\";\nimport { DEFAULT_CONFIG, type NexusConfig } from \"~/types/index.js\";\nimport { loadUserConfig } from \"./user-config.js\";\n\nlet cachedConfig: NexusConfig | null = null;\n\nexport async function getConfig(): Promise<NexusConfig> {\n\tif (cachedConfig) {\n\t\treturn cachedConfig;\n\t}\n\n\tconst [c12Config, userConfig] = await Promise.all([\n\t\tloadConfig<NexusConfig>({\n\t\t\tname: \"probe\",\n\t\t\tdefaults: DEFAULT_CONFIG,\n\t\t\tenvName: \"PROBE\",\n\t\t}),\n\t\tloadUserConfig(),\n\t]);\n\n\tcachedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...c12Config.config,\n\t\t...userConfig,\n\t};\n\n\tcachedConfig.walletDir = expandHomeDir(cachedConfig.walletDir);\n\tcachedConfig.tokenCacheDir = expandHomeDir(cachedConfig.tokenCacheDir);\n\n\treturn cachedConfig;\n}\n\nexport function clearConfigCache(): void {\n\tcachedConfig = null;\n}\n\nexport function expandHomeDir(path: string): string {\n\tif (path.startsWith(\"~/\")) {\n\t\treturn join(homedir(), path.slice(2));\n\t}\n\treturn path;\n}\n\nexport async function getWalletDir(): Promise<string> {\n\tconst config = await getConfig();\n\treturn config.walletDir;\n}\n\nexport async function getTokenCacheDir(): Promise<string> {\n\tconst config = await getConfig();\n\treturn config.tokenCacheDir;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spinner as clackSpinner, log } from \"@clack/prompts\";\nimport { dim } from \"kolorist\";\nimport type { OutputResult } from \"~/types/index.js\";\n\nconst outputModeStorage = new AsyncLocalStorage<{ jsonMode: boolean }>();\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n\nconst printJson = (value: unknown, stderr = false): void => {\n\tconst serialized = JSON.stringify(value, jsonReplacer, 2);\n\tif (stderr) {\n\t\tconsole.error(serialized);\n\t\treturn;\n\t}\n\tconsole.log(serialized);\n};\n\nexport function setJsonMode(enabled: boolean) {\n\toutputModeStorage.enterWith({ jsonMode: enabled });\n}\n\nexport function isJsonMode(): boolean {\n\treturn outputModeStorage.getStore()?.jsonMode === true;\n}\n\nexport function success<T>(data: T): void {\n\tif (isJsonMode()) {\n\t\tprintJson({ success: true, data });\n\t}\n}\n\nexport function error(\n\tcode: string,\n\tmessage: string,\n\tsuggestion?: string,\n\texitCode = 1,\n): never {\n\tif (isJsonMode()) {\n\t\tconst output: OutputResult<never> = {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\t...(suggestion && { suggestion }),\n\t\t\t},\n\t\t};\n\t\tprintJson(output, true);\n\t\tprocess.exit(exitCode);\n\t} else {\n\t\tlog.error(message);\n\t\tif (suggestion) {\n\t\t\tconsole.error(`${dim(\"hint:\")} ${suggestion}`);\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n}\n\nexport function info(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.info(message);\n\t}\n}\n\nexport function successMessage(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.success(message);\n\t}\n}\n\nexport function warning(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.warn(message);\n\t}\n}\n\nexport function spinner(message: string) {\n\tif (isJsonMode()) {\n\t\treturn {\n\t\t\tstart: () => {},\n\t\t\tstop: () => {},\n\t\t\tsucceed: () => {},\n\t\t\tfail: () => {},\n\t\t};\n\t}\n\n\tconst clack = clackSpinner();\n\n\tconst start = () => {\n\t\tclack.start(message);\n\t};\n\n\tconst stop = () => {\n\t\tclack.stop();\n\t};\n\n\tconst succeed = (msg?: string) => {\n\t\tclack.stop(msg || message, 0);\n\t};\n\n\tconst fail = (msg?: string) => {\n\t\tclack.stop(msg || message, 1);\n\t};\n\n\treturn {\n\t\tstart,\n\t\tstop,\n\t\tsucceed,\n\t\tfail,\n\t};\n}\n","import { readFile } from \"node:fs/promises\";\nimport { password, text } from \"@clack/prompts\";\nimport { error, isJsonMode } from \"./output.js\";\n\nconst readTrimmedFile = async (\n\tfilePath: string,\n\tlabel: string,\n): Promise<string> => {\n\ttry {\n\t\treturn (await readFile(filePath, \"utf-8\")).trim();\n\t} catch {\n\t\terror(\"FILE_READ_ERROR\", `Failed to read ${label} file: ${filePath}`);\n\t}\n};\n\nexport interface ResolvePasswordInput {\n\tpasswordFile?: string;\n\tenvVar?: string;\n\tpromptMessage: string;\n\tjsonModeError: string;\n\tminLength?: number;\n\tconfirmPromptMessage?: string;\n}\n\nexport const resolvePasswordInput = async (\n\toptions: ResolvePasswordInput,\n): Promise<string> => {\n\tif (options.passwordFile) {\n\t\treturn readTrimmedFile(options.passwordFile, \"password\");\n\t}\n\n\tconst envVar = options.envVar || \"PROBE_WALLET_PASSWORD\";\n\tconst fromEnv = process.env[envVar];\n\tif (fromEnv) {\n\t\treturn fromEnv;\n\t}\n\n\tif (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n\t\terror(\"PASSWORD_REQUIRED\", options.jsonModeError);\n\t}\n\n\tconst first = await password({\n\t\tmessage: options.promptMessage,\n\t\tvalidate: (value) => {\n\t\t\tif (options.minLength && value.length < options.minLength) {\n\t\t\t\treturn `Password must be at least ${options.minLength} characters`;\n\t\t\t}\n\t\t},\n\t});\n\n\tif (typeof first !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\n\tif (!options.confirmPromptMessage) {\n\t\treturn first;\n\t}\n\n\tconst second = await password({\n\t\tmessage: options.confirmPromptMessage,\n\t\tvalidate: (value) =>\n\t\t\tvalue === first ? undefined : \"Passwords do not match\",\n\t});\n\tif (typeof second !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\n\treturn first;\n};\n\nexport interface ResolveMnemonicInput {\n\tmnemonic?: string;\n\tmnemonicFile?: string;\n\tenvVar?: string;\n\tjsonModeError: string;\n}\n\nexport const resolveMnemonicInput = async (\n\toptions: ResolveMnemonicInput,\n): Promise<string> => {\n\tif (options.mnemonic) {\n\t\treturn options.mnemonic;\n\t}\n\n\tif (options.mnemonicFile) {\n\t\treturn readTrimmedFile(options.mnemonicFile, \"mnemonic\");\n\t}\n\n\tconst envVar = options.envVar || \"PROBE_WALLET_MNEMONIC\";\n\tconst fromEnv = process.env[envVar];\n\tif (fromEnv) {\n\t\treturn fromEnv;\n\t}\n\n\tif (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n\t\terror(\"MNEMONIC_REQUIRED\", options.jsonModeError);\n\t}\n\n\tconst input = await text({\n\t\tmessage: \"Enter mnemonic phrase:\",\n\t\tvalidate: (value) =>\n\t\t\tvalue.trim().split(/\\s+/).length === 24\n\t\t\t\t? undefined\n\t\t\t\t: \"Mnemonic must be 24 words\",\n\t});\n\tif (typeof input !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\treturn input;\n};\n","import { blue, bold, cyan, dim, gray, green, white } from \"kolorist\";\n\ninterface HelpSectionItem {\n\tname: string;\n\tdetail: string;\n}\n\ninterface HelpSpec {\n\tcommand: string;\n\tdescription: string;\n\tusage: string[];\n\tactions?: HelpSectionItem[];\n\toptions?: HelpSectionItem[];\n\texamples?: string[];\n\tnotes?: string[];\n}\n\nconst actionHelpCommands = new Set([\n\t\"agent\",\n\t\"task\",\n\t\"message\",\n\t\"idea\",\n\t\"discover\",\n\t\"project\",\n\t\"config\",\n]);\nconst directHelpCommands = new Set([\n\t\"wallet\",\n\t\"auth\",\n\t\"sign\",\n\t\"token\",\n\t\"nexus\",\n\t\"query\",\n\t\"doctor\",\n]);\nconst walletSubcommands = new Set([\n\t\"create\",\n\t\"import\",\n\t\"list\",\n\t\"show\",\n\t\"delete\",\n\t\"default\",\n]);\n\nlet forceHelpFlag = false;\n\nconst neonBadge = (text: string): string =>\n\t`\\u001b[48;2;120;239;93m\\u001b[38;2;12;28;16m ${text} \\u001b[0m`;\nconst section = (label: string): string => neonBadge(label.toUpperCase());\n\nconst renderItems = (\n\titems: HelpSectionItem[],\n\tnameColor: (value: string) => string,\n): string => {\n\tconst width = Math.max(...items.map((i) => i.name.length), 0);\n\treturn items\n\t\t.map((i) => ` ${nameColor(i.name.padEnd(width))} ${i.detail}`)\n\t\t.join(\"\\n\");\n};\n\nexport const printHelp = (spec: HelpSpec): void => {\n\tconst notes = [...(spec.notes || [])];\n\tconst hasHostModuleOption = (spec.options || []).some(\n\t\t(item) => item.name.includes(\"--host\") && item.name.includes(\"--module\"),\n\t);\n\tconst hasHostModuleNote = notes.some(\n\t\t(note) => note.includes(\"--host\") && note.includes(\"--module\"),\n\t);\n\tif (hasHostModuleOption && !hasHostModuleNote) {\n\t\tnotes.push(\n\t\t\t\"--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).\",\n\t\t);\n\t}\n\n\tconst lines: string[] = [];\n\tlines.push(\n\t\t`${bold(white(spec.command))} ${dim(\"•\")} ${gray(spec.description)}`,\n\t);\n\n\tlines.push(\"\");\n\tlines.push(section(\"Usage\"));\n\tfor (const entry of spec.usage) {\n\t\tlines.push(` ${white(entry)}`);\n\t}\n\n\tif (spec.actions && spec.actions.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Actions\"));\n\t\tlines.push(renderItems(spec.actions, green));\n\t}\n\n\tif (spec.options && spec.options.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Options\"));\n\t\tlines.push(renderItems(spec.options, blue));\n\t}\n\n\tif (spec.examples && spec.examples.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Examples\"));\n\t\tfor (const example of spec.examples) {\n\t\t\tlines.push(` ${cyan(example)}`);\n\t\t}\n\t}\n\n\tif (notes.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Notes\"));\n\t\tfor (const note of notes) {\n\t\t\tlines.push(` ${dim(\"-\")} ${note}`);\n\t\t}\n\t}\n\n\tconsole.log(lines.join(\"\\n\"));\n};\n\nexport const setForceHelpRequested = (enabled: boolean): void => {\n\tforceHelpFlag = enabled;\n};\n\nexport const forceHelpRequested = (): boolean => forceHelpFlag;\n\nexport const normalizeHelpArgv = (\n\targv: string[],\n): { argv: string[]; forceHelp: boolean } => {\n\tconst hasHelp = argv.includes(\"--help\") || argv.includes(\"-h\");\n\tif (!hasHelp) {\n\t\treturn { argv, forceHelp: false };\n\t}\n\n\tif (argv.every((arg) => arg.startsWith(\"-\"))) {\n\t\treturn { argv: [], forceHelp: true };\n\t}\n\n\tconst command = argv.find((arg) => !arg.startsWith(\"-\"));\n\tif (!command) {\n\t\treturn { argv, forceHelp: true };\n\t}\n\n\tif (actionHelpCommands.has(command)) {\n\t\treturn { argv: [command], forceHelp: true };\n\t}\n\n\tif (!directHelpCommands.has(command)) {\n\t\treturn { argv, forceHelp: true };\n\t}\n\n\tif (command === \"wallet\") {\n\t\tconst positionals = argv.filter((arg) => !arg.startsWith(\"-\"));\n\t\tif (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n\t\t\treturn { argv: [command, positionals[1]], forceHelp: true };\n\t\t}\n\t}\n\n\treturn { argv: [command], forceHelp: true };\n};\n","import type { ChallengeResponse, TokenResponse } from \"~/types/index.js\";\nimport { getConfig } from \"./config.js\";\n\nexport async function requestChallenge(\n\taddress: string,\n\tissuerOverride?: string,\n): Promise<ChallengeResponse> {\n\tconst config = await getConfig();\n\tconst issuer = issuerOverride || config.issuer;\n\tconst url = `${issuer}/auth/challenge`;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ address }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Challenge request failed: ${error}`);\n\t}\n\n\tconst data = await response.json();\n\treturn {\n\t\tnonce: data.nonce,\n\t\tchallenge: data.challenge,\n\t\texpiresAt: data.expires_at,\n\t};\n}\n\nexport async function exchangeToken(\n\taddress: string,\n\tpublicKey: string,\n\tsignature: string,\n\tnonce: string,\n\tissuerOverride?: string,\n): Promise<TokenResponse> {\n\tconst config = await getConfig();\n\tconst issuer = issuerOverride || config.issuer;\n\tconst url = `${issuer}/auth/token`;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\taddress,\n\t\t\tpublic_key: publicKey,\n\t\t\tsignature,\n\t\t\tnonce,\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t}\n\n\tconst data = await response.json();\n\treturn {\n\t\taccessToken: data.access_token,\n\t\tidToken: data.id_token,\n\t\texpiresIn: data.expires_in,\n\t};\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getTokenCacheDir } from \"./config.js\";\n\nexport async function cacheToken(\n\twallet: string,\n\ttoken: string,\n\texpiresAt: string,\n): Promise<void> {\n\tconst cacheDir = await getTokenCacheDir();\n\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t} catch {}\n\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\tconst data = {\n\t\ttoken,\n\t\texpiresAt,\n\t};\n\n\tawait writeFile(cachePath, JSON.stringify(data), { mode: 0o600 });\n}\n\nexport async function getCachedToken(\n\twallet: string,\n): Promise<{ token: string; expiresAt: string } | null> {\n\tconst cacheDir = await getTokenCacheDir();\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\n\ttry {\n\t\tawait access(cachePath);\n\t\tconst content = await readFile(cachePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function clearCachedToken(wallet: string): Promise<void> {\n\tconst cacheDir = await getTokenCacheDir();\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\n\ttry {\n\t\tawait access(cachePath);\n\t\tconst { unlink } = await import(\"node:fs/promises\");\n\t\tawait unlink(cachePath);\n\t} catch {}\n}\n","import {\n\taccess,\n\tmkdir,\n\treaddir,\n\treadFile,\n\tunlink,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { KeyFile, KeyStore } from \"znn-typescript-sdk\";\nimport type { WalletCreationResult, WalletInfo } from \"~/types/index.js\";\nimport { getWalletDir } from \"./config.js\";\n\nasync function ensureWalletDir(): Promise<string> {\n\tconst walletDir = await getWalletDir();\n\ttry {\n\t\tawait mkdir(walletDir, { recursive: true });\n\t} catch {}\n\treturn walletDir;\n}\n\nasync function getWalletFilePath(name: string): Promise<string> {\n\tconst walletDir = await ensureWalletDir();\n\treturn join(walletDir, `${name}.json`);\n}\n\nexport async function createWallet(\n\tname: string,\n\tpassword: string,\n): Promise<WalletCreationResult> {\n\tconst exists = await walletExists(name);\n\tif (exists) {\n\t\tthrow new Error(`Wallet '${name}' already exists`);\n\t}\n\n\tconst keyStore = KeyStore.newRandom();\n\tconst keyFile = KeyFile.setPassword(password);\n\tconst encryptedData = await keyFile.encrypt(keyStore);\n\n\tconst walletPath = await getWalletFilePath(name);\n\tawait writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n\tconst keyPair = keyStore.getKeyPair(0);\n\tconst address = keyPair.getAddress();\n\tconst publicKey = keyPair.getPublicKey();\n\n\treturn {\n\t\tname,\n\t\taddress: address.toString(),\n\t\tpublicKey: publicKey.toString(\"hex\"),\n\t\tmnemonic: keyStore.mnemonic || \"\",\n\t};\n}\n\nexport async function importWallet(\n\tname: string,\n\tmnemonic: string,\n\tpassword: string,\n): Promise<WalletInfo> {\n\tconst exists = await walletExists(name);\n\tif (exists) {\n\t\tthrow new Error(`Wallet '${name}' already exists`);\n\t}\n\n\tconst keyStore = KeyStore.fromMnemonic(mnemonic);\n\tconst keyFile = KeyFile.setPassword(password);\n\tconst encryptedData = await keyFile.encrypt(keyStore);\n\n\tconst walletPath = await getWalletFilePath(name);\n\tawait writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n\tconst keyPair = keyStore.getKeyPair(0);\n\tconst address = keyPair.getAddress();\n\n\treturn {\n\t\tname,\n\t\taddress: address.toString(),\n\t};\n}\n\nexport async function listWallets(): Promise<WalletInfo[]> {\n\tconst walletDir = await getWalletDir();\n\n\ttry {\n\t\tconst files = await readdir(walletDir);\n\t\tconst wallets: WalletInfo[] = [];\n\n\t\tfor (const file of files) {\n\t\t\tif (file.endsWith(\".json\")) {\n\t\t\t\tconst name = file.slice(0, -5);\n\t\t\t\tconst info = await getWalletInfo(name);\n\t\t\t\tif (info) {\n\t\t\t\t\twallets.push(info);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn wallets;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function getWalletInfo(name: string): Promise<WalletInfo | null> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tconst content = await readFile(walletPath, \"utf-8\");\n\t\tconst data = JSON.parse(content);\n\t\tconst stats = await stat(walletPath);\n\n\t\treturn {\n\t\t\tname,\n\t\t\taddress: data.address || data.baseAddress,\n\t\t\tcreatedAt: data.timestamp\n\t\t\t\t? new Date(data.timestamp * 1000).toISOString()\n\t\t\t\t: new Date(stats.mtime).toISOString(),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function loadWallet(\n\tname: string,\n\tpassword: string,\n): Promise<KeyStore> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tconst content = await readFile(walletPath, \"utf-8\");\n\t\tconst encryptedData = JSON.parse(content);\n\n\t\tconst keyFile = KeyFile.setPassword(password);\n\t\tconst keyStore = await keyFile.decrypt(encryptedData);\n\n\t\treturn keyStore;\n\t} catch (err) {\n\t\tthrow new Error(\n\t\t\t`Failed to load wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n\nexport async function deleteWallet(name: string): Promise<void> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tawait unlink(walletPath);\n\t} catch (err) {\n\t\tthrow new Error(\n\t\t\t`Failed to delete wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n\nexport async function walletExists(name: string): Promise<boolean> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tawait access(walletPath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function stat(path: string) {\n\tconst { stat } = await import(\"node:fs/promises\");\n\treturn stat(path);\n}\n","import { Buffer } from \"node:buffer\";\nimport { defineCommand } from \"citty\";\nimport type { KeyPair } from \"znn-typescript-sdk\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { exchangeToken, requestChallenge } from \"~/utils/oidc.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tspinner,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { cacheToken, getCachedToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"auth\",\n\t\tdescription: \"Complete OIDC authentication flow\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name, or status action\",\n\t\t\trequired: false,\n\t\t},\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override (used with auth status)\",\n\t\t},\n\t\t\"expect-address\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Expected Zenon address safety check (z1...)\",\n\t\t},\n\t\tissuer: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"OIDC issuer URL override\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tsave: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Save token to cache (default: true)\",\n\t\t\tdefault: true,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\t\tconst requestedAddress = args[\"expect-address\"];\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe auth\",\n\t\t\t\tdescription: \"Complete OIDC authentication flow\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe auth <wallet-name> [options]\",\n\t\t\t\t\t\"probe auth status [--wallet my-wallet]\",\n\t\t\t\t\t\"probe auth my-wallet --save\",\n\t\t\t\t\t\"probe auth my-wallet --expect-address z1q... --save\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--expect-address\",\n\t\t\t\t\t\tdetail: \"Optional safety check against resolved wallet address\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet override for `auth status`\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--issuer\",\n\t\t\t\t\t\tdetail: \"OIDC issuer URL (default from config: issuer)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--save\",\n\t\t\t\t\t\tdetail: \"Save token in local cache (default: true)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n\t\t\t\t\t\"Most users should omit --expect-address; it is for safety checks in external workflows.\",\n\t\t\t\t\t\"Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === \"status\") {\n\t\t\tconst config = await getConfig();\n\t\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\t\tif (!walletName) {\n\t\t\t\terror(\n\t\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (!cached) {\n\t\t\t\tsuccess({\n\t\t\t\t\twallet: walletName,\n\t\t\t\t\tauthenticated: false,\n\t\t\t\t\tvalid: false,\n\t\t\t\t\treason: \"no_cached_token\",\n\t\t\t\t});\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(`Wallet: ${walletName}`);\n\t\t\t\t\tconsole.log(\"Status: Not authenticated (no cached token)\");\n\t\t\t\t\tconsole.log(`Next: probe auth ${walletName} --save`);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst expiresAt = new Date(cached.expiresAt);\n\t\t\tconst expiresIn = Math.floor((expiresAt.getTime() - Date.now()) / 1000);\n\t\t\tconst valid = Number.isFinite(expiresIn) && expiresIn > 0;\n\t\t\tsuccess({\n\t\t\t\twallet: walletName,\n\t\t\t\tauthenticated: true,\n\t\t\t\tvalid,\n\t\t\t\texpiresAt: cached.expiresAt,\n\t\t\t\texpiresIn: Math.max(0, expiresIn),\n\t\t\t});\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Wallet: ${walletName}`);\n\t\t\t\tconsole.log(`Status: ${valid ? \"Authenticated\" : \"Token expired\"}`);\n\t\t\t\tconsole.log(`Expires: ${expiresAt.toUTCString()}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter wallet password:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session\",\n\t\t});\n\n\t\tlet keyPair: KeyPair | undefined;\n\t\tlet walletAddress: string;\n\t\tlet address: string;\n\t\ttry {\n\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\tkeyPair = keyStore.getKeyPair(0);\n\t\t\tconst addr = keyPair.getAddress();\n\t\t\twalletAddress = addr.toString();\n\n\t\t\tif (requestedAddress && walletAddress !== requestedAddress) {\n\t\t\t\terror(\n\t\t\t\t\t\"ADDRESS_MISMATCH\",\n\t\t\t\t\t`Wallet address ${walletAddress} does not match provided address ${requestedAddress}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\taddress = requestedAddress || walletAddress;\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LOAD_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load wallet\",\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst challengeSpinner = spinner(\n\t\t\t\t\"Requesting challenge from OIDC provider...\",\n\t\t\t);\n\t\t\tchallengeSpinner.start();\n\n\t\t\tconst challenge = await requestChallenge(address, args.issuer);\n\t\t\tchallengeSpinner.succeed();\n\n\t\t\tconst signSpinner = spinner(\"Signing challenge...\");\n\t\t\tsignSpinner.start();\n\n\t\t\tconst signature = keyPair.sign(Buffer.from(challenge.challenge));\n\t\t\tconst publicKey = keyPair.getPublicKey();\n\t\t\tsignSpinner.succeed();\n\n\t\t\tconst exchangeSpinner = spinner(\"Exchanging for token...\");\n\t\t\texchangeSpinner.start();\n\n\t\t\tconst tokenResponse = await exchangeToken(\n\t\t\t\taddress,\n\t\t\t\tpublicKey.toString(\"hex\"),\n\t\t\t\tsignature.toString(\"hex\"),\n\t\t\t\tchallenge.nonce,\n\t\t\t\targs.issuer,\n\t\t\t);\n\t\t\texchangeSpinner.succeed();\n\n\t\t\tconst expiresAt = new Date(\n\t\t\t\tDate.now() + tokenResponse.expiresIn * 1000,\n\t\t\t).toISOString();\n\n\t\t\tif (args.save) {\n\t\t\t\tawait cacheToken(name, tokenResponse.accessToken, expiresAt);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\taddress,\n\t\t\t\ttoken: tokenResponse.accessToken,\n\t\t\t\texpiresAt,\n\t\t\t\texpiresIn: tokenResponse.expiresIn,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(\"Authentication successful\");\n\t\t\t\tif (args.save) {\n\t\t\t\t\tconsole.log(\"Token saved to wallet cache.\");\n\t\t\t\t}\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Expires: ${new Date(expiresAt).toUTCString()} (${Math.floor(tokenResponse.expiresIn / 86400)} days)`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"AUTH_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Authentication failed\",\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { clearConfigCache, getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n\tconst parts = path.split(\".\");\n\tlet current: unknown = obj;\n\tfor (const part of parts) {\n\t\tif (current && typeof current === \"object\" && part in current) {\n\t\t\tcurrent = (current as Record<string, unknown>)[part];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn current;\n}\n\nfunction setNestedValue(\n\tobj: Record<string, unknown>,\n\tpath: string,\n\tvalue: unknown,\n): void {\n\tconst parts = path.split(\".\");\n\tlet current = obj;\n\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\tconst part = parts[i];\n\t\tif (!(part in current) || typeof current[part] !== \"object\") {\n\t\t\tcurrent[part] = {};\n\t\t}\n\t\tcurrent = current[part] as Record<string, unknown>;\n\t}\n\tcurrent[parts[parts.length - 1]] = value;\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"config\",\n\t\tdescription: \"Manage configuration settings\",\n\t},\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: get, set, list\",\n\t\t\trequired: false,\n\t\t},\n\t\tkey: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Configuration key\",\n\t\t\trequired: false,\n\t\t},\n\t\tvalue: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Configuration value\",\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe config\",\n\t\t\t\tdescription: \"Read and write CLI configuration values\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe config <action> [key] [value]\",\n\t\t\t\t\t\"probe config get spacetime.host\",\n\t\t\t\t\t\"probe config set defaultWallet agent-wallet\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"get <key>\", detail: \"Get one config value\" },\n\t\t\t\t\t{ name: \"set <key> <value>\", detail: \"Set one config value\" },\n\t\t\t\t\t{ name: \"list\", detail: \"List merged config and user overrides\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Valid keys: issuer, walletDir, defaultWallet, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\t\tconst validKeys = [\n\t\t\t\"issuer\",\n\t\t\t\"walletDir\",\n\t\t\t\"defaultWallet\",\n\t\t\t\"tokenCacheDir\",\n\t\t\t\"requestTimeout\",\n\t\t\t\"spacetime.host\",\n\t\t\t\"spacetime.module\",\n\t\t];\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tif (!args.key) {\n\t\t\t\t\t\terror(\"KEY_REQUIRED\", \"Configuration key required\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!validKeys.includes(args.key)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_KEY\",\n\t\t\t\t\t\t\t`Invalid configuration key: ${args.key}`,\n\t\t\t\t\t\t\t`Valid keys: ${validKeys.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst config = await getConfig();\n\t\t\t\t\tconst value = getNestedValue(\n\t\t\t\t\t\tconfig as unknown as Record<string, unknown>,\n\t\t\t\t\t\targs.key,\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({ [args.key]: value });\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(`${args.key}: ${value}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"set\": {\n\t\t\t\t\tif (!args.key || args.value === undefined) {\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Configuration key and value required\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!validKeys.includes(args.key)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_KEY\",\n\t\t\t\t\t\t\t`Invalid configuration key: ${args.key}`,\n\t\t\t\t\t\t\t`Valid keys: ${validKeys.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet parsedValue: string | boolean | number = args.value;\n\n\t\t\t\t\tif (args.key === \"requestTimeout\") {\n\t\t\t\t\t\tparsedValue = parseInt(args.value, 10);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\t\tsetNestedValue(\n\t\t\t\t\t\tuserConfig as unknown as Record<string, unknown>,\n\t\t\t\t\t\targs.key,\n\t\t\t\t\t\tparsedValue,\n\t\t\t\t\t);\n\t\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t\t\tclearConfigCache();\n\n\t\t\t\t\tsuccess({ [args.key]: parsedValue });\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tsuccessMessage(`Set ${args.key} = ${parsedValue}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst config = await getConfig();\n\t\t\t\t\tconst userConfig = await loadUserConfig();\n\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\tuserConfig,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\"Configuration:\");\n\t\t\t\t\t\tconsole.log(` issuer: ${config.issuer}`);\n\t\t\t\t\t\tconsole.log(` walletDir: ${config.walletDir}`);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t` defaultWallet: ${config.defaultWallet || \"(not set)\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(` passwordMinLength: ${config.passwordMinLength}`);\n\t\t\t\t\t\tconsole.log(` tokenCacheDir: ${config.tokenCacheDir}`);\n\t\t\t\t\t\tconsole.log(` requestTimeout: ${config.requestTimeout}`);\n\t\t\t\t\t\tconsole.log(` spacetime.host: ${config.spacetime.host}`);\n\t\t\t\t\t\tconsole.log(` spacetime.module: ${config.spacetime.module}`);\n\n\t\t\t\t\t\tif (Object.keys(userConfig).length > 0) {\n\t\t\t\t\t\t\tconsole.log(\"\\nUser overrides:\");\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(userConfig)) {\n\t\t\t\t\t\t\t\tconsole.log(` ${key}: ${JSON.stringify(value)}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: get, set, list\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"CONFIG_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Configuration error\",\n\t\t\t);\n\t\t}\n\t},\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport const Agent = __t.object(\"Agent\", {\n\tid: __t.string(),\n\tname: __t.string(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n\tcapabilities: __t.array(__t.string()),\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\tzenonAddress: __t.string(),\n\tidentity: __t.identity(),\n\tlastHeartbeat: __t.timestamp(),\n\tcurrentTaskId: __t.option(__t.u64()),\n\tcreatedAt: __t.timestamp(),\n\tlastActiveAt: __t.timestamp(),\n});\nexport type Agent = __Infer<typeof Agent>;\n\n// The tagged union or sum type for the algebraic type `AgentRole`.\nexport const AgentRole = __t.enum(\"AgentRole\", {\n\tZoe: __t.unit(),\n\tAdmin: __t.unit(),\n\tZeno: __t.unit(),\n});\nexport type AgentRole = __Infer<typeof AgentRole>;\n\n// The tagged union or sum type for the algebraic type `AgentStatus`.\nexport const AgentStatus = __t.enum(\"AgentStatus\", {\n\tOnline: __t.unit(),\n\tOffline: __t.unit(),\n\tWorking: __t.unit(),\n});\nexport type AgentStatus = __Infer<typeof AgentStatus>;\n\nexport const Channel = __t.object(\"Channel\", {\n\tid: __t.u64(),\n\tname: __t.string(),\n\tcreatedBy: __t.string(),\n\tcreatedAt: __t.timestamp(),\n});\nexport type Channel = __Infer<typeof Channel>;\n\nexport const Config = __t.object(\"Config\", {\n\tkey: __t.string(),\n\tvalue: __t.string(),\n});\nexport type Config = __Infer<typeof Config>;\n\n// The tagged union or sum type for the algebraic type `DependencyType`.\nexport const DependencyType = __t.enum(\"DependencyType\", {\n\tBlocks: __t.unit(),\n\tParentChild: __t.unit(),\n});\nexport type DependencyType = __Infer<typeof DependencyType>;\n\nexport const DiscoveredTask = __t.object(\"DiscoveredTask\", {\n\tid: __t.u64(),\n\tdiscoveredBy: __t.string(),\n\tcurrentTaskId: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string(),\n\tseverity: __t.string(),\n\tget status() {\n\t\treturn DiscoveredTaskStatus;\n\t},\n\tcreatedTaskId: __t.option(__t.u64()),\n\trejectionReason: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n\treviewedAt: __t.option(__t.timestamp()),\n\treviewedBy: __t.option(__t.string()),\n});\nexport type DiscoveredTask = __Infer<typeof DiscoveredTask>;\n\n// The tagged union or sum type for the algebraic type `DiscoveredTaskStatus`.\nexport const DiscoveredTaskStatus = __t.enum(\"DiscoveredTaskStatus\", {\n\tPendingReview: __t.unit(),\n\tApproved: __t.unit(),\n\tRejected: __t.unit(),\n\tEscalatedToIdea: __t.unit(),\n});\nexport type DiscoveredTaskStatus = __Infer<typeof DiscoveredTaskStatus>;\n\n// The tagged union or sum type for the algebraic type `DiscoveryDecision`.\nexport const DiscoveryDecision = __t.enum(\"DiscoveryDecision\", {\n\tApproveAsTask: __t.unit(),\n\tReject: __t.unit(),\n\tEscalateToIdea: __t.unit(),\n});\nexport type DiscoveryDecision = __Infer<typeof DiscoveryDecision>;\n\nexport const Idea = __t.object(\"Idea\", {\n\tid: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n\tget status() {\n\t\treturn IdeaStatus;\n\t},\n\tactiveAgentCount: __t.u32(),\n\tquorum: __t.u16(),\n\tapprovalThreshold: __t.u16(),\n\tvetoThreshold: __t.u16(),\n\tupVotes: __t.u16(),\n\tdownVotes: __t.u16(),\n\tvetoCount: __t.u16(),\n\ttotalVotes: __t.u16(),\n\tcreatedBy: __t.string(),\n\tcreatedAt: __t.timestamp(),\n\tupdatedAt: __t.timestamp(),\n});\nexport type Idea = __Infer<typeof Idea>;\n\n// The tagged union or sum type for the algebraic type `IdeaStatus`.\nexport const IdeaStatus = __t.enum(\"IdeaStatus\", {\n\tVoting: __t.unit(),\n\tApprovedForProject: __t.unit(),\n\tRejected: __t.unit(),\n\tImplemented: __t.unit(),\n});\nexport type IdeaStatus = __Infer<typeof IdeaStatus>;\n\nexport const IdentityRole = __t.object(\"IdentityRole\", {\n\tidentity: __t.identity(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n});\nexport type IdentityRole = __Infer<typeof IdentityRole>;\n\nexport const Message = __t.object(\"Message\", {\n\tid: __t.u64(),\n\tchannelId: __t.u64(),\n\tsenderId: __t.string(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n});\nexport type Message = __Infer<typeof Message>;\n\n// The tagged union or sum type for the algebraic type `MessageType`.\nexport const MessageType = __t.enum(\"MessageType\", {\n\tUser: __t.unit(),\n\tSystem: __t.unit(),\n\tDirective: __t.unit(),\n});\nexport type MessageType = __Infer<typeof MessageType>;\n\nexport const Project = __t.object(\"Project\", {\n\tid: __t.u64(),\n\tsourceIdeaId: __t.u64(),\n\tname: __t.string(),\n\tgithubRepo: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n\tcreatedAt: __t.timestamp(),\n\tcreatedBy: __t.string(),\n});\nexport type Project = __Infer<typeof Project>;\n\nexport const ProjectChannel = __t.object(\"ProjectChannel\", {\n\tprojectId: __t.u64(),\n\tcreatedAt: __t.timestamp(),\n});\nexport type ProjectChannel = __Infer<typeof ProjectChannel>;\n\nexport const ProjectMessage = __t.object(\"ProjectMessage\", {\n\tid: __t.u64(),\n\tprojectId: __t.u64(),\n\tsenderId: __t.string(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n});\nexport type ProjectMessage = __Infer<typeof ProjectMessage>;\n\n// The tagged union or sum type for the algebraic type `ProjectStatus`.\nexport const ProjectStatus = __t.enum(\"ProjectStatus\", {\n\tActive: __t.unit(),\n\tPaused: __t.unit(),\n});\nexport type ProjectStatus = __Infer<typeof ProjectStatus>;\n\nexport const Task = __t.object(\"Task\", {\n\tid: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tassignedTo: __t.option(__t.string()),\n\tclaimedAt: __t.option(__t.timestamp()),\n\tgithubIssueUrl: __t.option(__t.string()),\n\tgithubPrUrl: __t.option(__t.string()),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()),\n\treviewCount: __t.u8(),\n\tget blockedFromStatus() {\n\t\treturn __t.option(TaskStatus);\n\t},\n\tarchivedReason: __t.option(__t.string()),\n\tstatusChangedBy: __t.option(__t.identity()),\n\tstatusChangedAt: __t.option(__t.timestamp()),\n\tcreatedAt: __t.timestamp(),\n\tupdatedAt: __t.timestamp(),\n\tcreatedBy: __t.string(),\n});\nexport type Task = __Infer<typeof Task>;\n\nexport const TaskDependency = __t.object(\"TaskDependency\", {\n\tid: __t.u64(),\n\ttaskId: __t.u64(),\n\tdependsOnId: __t.u64(),\n\tget dependencyType() {\n\t\treturn DependencyType;\n\t},\n\tcreatedAt: __t.timestamp(),\n});\nexport type TaskDependency = __Infer<typeof TaskDependency>;\n\n// The tagged union or sum type for the algebraic type `TaskStatus`.\nexport const TaskStatus = __t.enum(\"TaskStatus\", {\n\tOpen: __t.unit(),\n\tClaimed: __t.unit(),\n\tInProgress: __t.unit(),\n\tReview: __t.unit(),\n\tCompleted: __t.unit(),\n\tBlocked: __t.unit(),\n\tArchived: __t.unit(),\n});\nexport type TaskStatus = __Infer<typeof TaskStatus>;\n\nexport const Vote = __t.object(\"Vote\", {\n\tid: __t.u64(),\n\tideaId: __t.u64(),\n\tagentId: __t.string(),\n\tget voteType() {\n\t\treturn VoteType;\n\t},\n\tcreatedAt: __t.timestamp(),\n});\nexport type Vote = __Infer<typeof Vote>;\n\n// The tagged union or sum type for the algebraic type `VoteType`.\nexport const VoteType = __t.enum(\"VoteType\", {\n\tUp: __t.unit(),\n\tDown: __t.unit(),\n\tVeto: __t.unit(),\n});\nexport type VoteType = __Infer<typeof VoteType>;\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { DependencyType } from \"./types\";\n\nexport default {\n\ttaskId: __t.u64(),\n\tdependsOnId: __t.u64(),\n\tget dependencyType() {\n\t\treturn DependencyType;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\ttaskId: __t.u64(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tsourceIdeaId: __t.u64(),\n\tname: __t.string(),\n\tgithubRepo: __t.string(),\n\tdescription: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()),\n\tgithubIssueUrl: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tcurrentTaskId: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string(),\n\tseverity: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tagentId: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tideaId: __t.u64(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { AgentRole } from \"./types\";\n\nexport default {\n\tagentId: __t.string(),\n\tname: __t.string(),\n\tzenonAddress: __t.string(),\n\tget role() {\n\t\treturn __t.option(AgentRole);\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { DiscoveryDecision } from \"./types\";\n\nexport default {\n\tdiscoveryId: __t.u64(),\n\tget decision() {\n\t\treturn DiscoveryDecision;\n\t},\n\treason: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n\tchannelId: __t.u64(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n\tprojectId: __t.u64(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { AgentStatus } from \"./types\";\n\nexport default {\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\ttaskId: __t.option(__t.u64()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tcapabilities: __t.array(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { ProjectStatus } from \"./types\";\n\nexport default {\n\tprojectId: __t.u64(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { TaskStatus } from \"./types\";\n\nexport default {\n\ttaskId: __t.u64(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tgithubPrUrl: __t.option(__t.string()),\n\tarchiveReason: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { VoteType } from \"./types\";\n\nexport default {\n\tideaId: __t.u64(),\n\tget voteType() {\n\t\treturn VoteType;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { AgentRole, AgentStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.string().primaryKey(),\n\tname: __t.string(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n\tcapabilities: __t.array(__t.string()),\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\tzenonAddress: __t.string().name(\"zenon_address\"),\n\tidentity: __t.identity(),\n\tlastHeartbeat: __t.timestamp().name(\"last_heartbeat\"),\n\tcurrentTaskId: __t.option(__t.u64()).name(\"current_task_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tlastActiveAt: __t.timestamp().name(\"last_active_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tname: __t.string(),\n\tcreatedBy: __t.string().name(\"created_by\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tkey: __t.string().primaryKey(),\n\tvalue: __t.string(),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { DiscoveredTaskStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tdiscoveredBy: __t.string().name(\"discovered_by\"),\n\tcurrentTaskId: __t.u64().name(\"current_task_id\"),\n\tprojectId: __t.u64().name(\"project_id\"),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string().name(\"task_type\"),\n\tseverity: __t.string(),\n\tget status() {\n\t\treturn DiscoveredTaskStatus;\n\t},\n\tcreatedTaskId: __t.option(__t.u64()).name(\"created_task_id\"),\n\trejectionReason: __t.option(__t.string()).name(\"rejection_reason\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\treviewedAt: __t.option(__t.timestamp()).name(\"reviewed_at\"),\n\treviewedBy: __t.option(__t.string()).name(\"reviewed_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { IdeaStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n\tget status() {\n\t\treturn IdeaStatus;\n\t},\n\tactiveAgentCount: __t.u32().name(\"active_agent_count\"),\n\tquorum: __t.u16(),\n\tapprovalThreshold: __t.u16().name(\"approval_threshold\"),\n\tvetoThreshold: __t.u16().name(\"veto_threshold\"),\n\tupVotes: __t.u16().name(\"up_votes\"),\n\tdownVotes: __t.u16().name(\"down_votes\"),\n\tvetoCount: __t.u16().name(\"veto_count\"),\n\ttotalVotes: __t.u16().name(\"total_votes\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tupdatedAt: __t.timestamp().name(\"updated_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { AgentRole } from \"./types\";\n\nexport default __t.row({\n\tidentity: __t.identity().primaryKey(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tchannelId: __t.u64().name(\"channel_id\"),\n\tsenderId: __t.string().name(\"sender_id\"),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType.name(\"message_type\");\n\t},\n\tcontextId: __t.option(__t.string()).name(\"context_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tprojectId: __t.u64().primaryKey().name(\"project_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tprojectId: __t.u64().name(\"project_id\"),\n\tsenderId: __t.string().name(\"sender_id\"),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType.name(\"message_type\");\n\t},\n\tcontextId: __t.option(__t.string()).name(\"context_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { ProjectStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tsourceIdeaId: __t.u64().name(\"source_idea_id\"),\n\tname: __t.string(),\n\tgithubRepo: __t.string().name(\"github_repo\"),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { DependencyType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\ttaskId: __t.u64().name(\"task_id\"),\n\tdependsOnId: __t.u64().name(\"depends_on_id\"),\n\tget dependencyType() {\n\t\treturn DependencyType.name(\"dependency_type\");\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { TaskStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tprojectId: __t.u64().name(\"project_id\"),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tassignedTo: __t.option(__t.string()).name(\"assigned_to\"),\n\tclaimedAt: __t.option(__t.timestamp()).name(\"claimed_at\"),\n\tgithubIssueUrl: __t.option(__t.string()).name(\"github_issue_url\"),\n\tgithubPrUrl: __t.option(__t.string()).name(\"github_pr_url\"),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()).name(\"source_idea_id\"),\n\treviewCount: __t.u8().name(\"review_count\"),\n\tget blockedFromStatus() {\n\t\treturn __t.option(TaskStatus).name(\"blocked_from_status\");\n\t},\n\tarchivedReason: __t.option(__t.string()).name(\"archived_reason\"),\n\tstatusChangedBy: __t.option(__t.identity()).name(\"status_changed_by\"),\n\tstatusChangedAt: __t.option(__t.timestamp()).name(\"status_changed_at\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tupdatedAt: __t.timestamp().name(\"updated_at\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { VoteType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tideaId: __t.u64().name(\"idea_id\"),\n\tagentId: __t.string().name(\"agent_id\"),\n\tget voteType() {\n\t\treturn VoteType.name(\"vote_type\");\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n// This was generated using spacetimedb cli version 2.0.1 (commit a4d29daec8ed35ce4913a335b7210b9ae3933d00).\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\tconvertToAccessorMap as __convertToAccessorMap,\n\tDbConnectionBuilder as __DbConnectionBuilder,\n\ttype DbConnectionConfig as __DbConnectionConfig,\n\tDbConnectionImpl as __DbConnectionImpl,\n\ttype ErrorContextInterface as __ErrorContextInterface,\n\ttype Event as __Event,\n\ttype EventContextInterface as __EventContextInterface,\n\ttype Infer as __Infer,\n\tmakeQueryBuilder as __makeQueryBuilder,\n\tprocedureSchema as __procedureSchema,\n\tprocedures as __procedures,\n\ttype QueryBuilder as __QueryBuilder,\n\ttype ReducerEventContextInterface as __ReducerEventContextInterface,\n\ttype RemoteModule as __RemoteModule,\n\treducerSchema as __reducerSchema,\n\treducers as __reducers,\n\tSubscriptionBuilderImpl as __SubscriptionBuilderImpl,\n\ttype SubscriptionEventContextInterface as __SubscriptionEventContextInterface,\n\ttype SubscriptionHandleImpl as __SubscriptionHandleImpl,\n\tschema as __schema,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n\ttable as __table,\n\tUuid as __Uuid,\n} from \"spacetimedb\";\n\n// Import all reducer arg schemas\nimport AddTaskDependencyReducer from \"./add_task_dependency_reducer\";\nimport ClaimTaskReducer from \"./claim_task_reducer\";\nimport CreateProjectReducer from \"./create_project_reducer\";\nimport CreateTaskReducer from \"./create_task_reducer\";\nimport DiscoverTaskReducer from \"./discover_task_reducer\";\nimport HeartbeatReducer from \"./heartbeat_reducer\";\nimport MarkIdeaImplementedReducer from \"./mark_idea_implemented_reducer\";\nimport ProposeIdeaReducer from \"./propose_idea_reducer\";\nimport RegisterAgentReducer from \"./register_agent_reducer\";\nimport ReviewDiscoveredTaskReducer from \"./review_discovered_task_reducer\";\nimport SeedUiDataReducer from \"./seed_ui_data_reducer\";\nimport SendMessageReducer from \"./send_message_reducer\";\nimport SendProjectMessageReducer from \"./send_project_message_reducer\";\nimport SetAgentStatusReducer from \"./set_agent_status_reducer\";\nimport UpdateAgentCapabilitiesReducer from \"./update_agent_capabilities_reducer\";\nimport UpdateProjectStatusReducer from \"./update_project_status_reducer\";\nimport UpdateTaskStatusReducer from \"./update_task_status_reducer\";\nimport VoteIdeaReducer from \"./vote_idea_reducer\";\n\n// Import all procedure arg schemas\n\n// Import all table schema definitions\nimport AgentsRow from \"./agents_table\";\nimport ChannelsRow from \"./channels_table\";\nimport ConfigRow from \"./config_table\";\nimport DiscoveredTasksRow from \"./discovered_tasks_table\";\nimport IdeasRow from \"./ideas_table\";\nimport IdentityRolesRow from \"./identity_roles_table\";\nimport MessagesRow from \"./messages_table\";\nimport ProjectChannelsRow from \"./project_channels_table\";\nimport ProjectMessagesRow from \"./project_messages_table\";\nimport ProjectsRow from \"./projects_table\";\nimport TaskDependenciesRow from \"./task_dependencies_table\";\nimport TasksRow from \"./tasks_table\";\nimport VotesRow from \"./votes_table\";\n\n/** Type-only namespace exports for generated type groups. */\n\n/** The schema information for all tables in this module. This is defined the same was as the tables would have been defined in the server. */\nconst tablesSchema = __schema({\n\tagents: __table(\n\t\t{\n\t\t\tname: \"agents\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"identity\", algorithm: \"btree\", columns: [\"identity\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"agents_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"agents_identity_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"identity\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tAgentsRow,\n\t),\n\tchannels: __table(\n\t\t{\n\t\t\tname: \"channels\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_name\", algorithm: \"btree\", columns: [\"name\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"channels_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tChannelsRow,\n\t),\n\tconfig: __table(\n\t\t{\n\t\t\tname: \"config\",\n\t\t\tindexes: [{ name: \"key\", algorithm: \"btree\", columns: [\"key\"] }],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"config_key_key\", constraint: \"unique\", columns: [\"key\"] },\n\t\t\t],\n\t\t},\n\t\tConfigRow,\n\t),\n\tdiscovered_tasks: __table(\n\t\t{\n\t\t\tname: \"discovered_tasks\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"by_created_at\", algorithm: \"btree\", columns: [\"createdAt\"] },\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_priority\", algorithm: \"btree\", columns: [\"priority\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"discovered_tasks_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tDiscoveredTasksRow,\n\t),\n\tideas: __table(\n\t\t{\n\t\t\tname: \"ideas\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"ideas_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tIdeasRow,\n\t),\n\tidentity_roles: __table(\n\t\t{\n\t\t\tname: \"identity_roles\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"identity\", algorithm: \"btree\", columns: [\"identity\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"identity_roles_identity_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"identity\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tIdentityRolesRow,\n\t),\n\tmessages: __table(\n\t\t{\n\t\t\tname: \"messages\",\n\t\t\tindexes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"by_channel\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"channelId\", \"createdAt\"],\n\t\t\t\t},\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"messages_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tMessagesRow,\n\t),\n\tproject_channels: __table(\n\t\t{\n\t\t\tname: \"project_channels\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"project_id\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"project_channels_project_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"projectId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tProjectChannelsRow,\n\t),\n\tproject_messages: __table(\n\t\t{\n\t\t\tname: \"project_messages\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_project\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"project_messages_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tProjectMessagesRow,\n\t),\n\tprojects: __table(\n\t\t{\n\t\t\tname: \"projects\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"by_source_idea_id\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"sourceIdeaId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"projects_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tProjectsRow,\n\t),\n\ttask_dependencies: __table(\n\t\t{\n\t\t\tname: \"task_dependencies\",\n\t\t\tindexes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"by_depends_on_id\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"dependsOnId\"],\n\t\t\t\t},\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_task_id\", algorithm: \"btree\", columns: [\"taskId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"task_dependencies_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tTaskDependenciesRow,\n\t),\n\ttasks: __table(\n\t\t{\n\t\t\tname: \"tasks\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"by_assigned_to\", algorithm: \"btree\", columns: [\"assignedTo\"] },\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_priority\", algorithm: \"btree\", columns: [\"priority\"] },\n\t\t\t\t{ name: \"by_project_id\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"tasks_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tTasksRow,\n\t),\n\tvotes: __table(\n\t\t{\n\t\t\tname: \"votes\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"by_idea_agent\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"ideaId\", \"agentId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"votes_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tVotesRow,\n\t),\n});\n\n/** The schema information for all reducers in this module. This is defined the same way as the reducers would have been defined in the server, except the body of the reducer is omitted in code generation. */\nconst reducersSchema = __reducers(\n\t__reducerSchema(\"add_task_dependency\", AddTaskDependencyReducer),\n\t__reducerSchema(\"claim_task\", ClaimTaskReducer),\n\t__reducerSchema(\"create_project\", CreateProjectReducer),\n\t__reducerSchema(\"create_task\", CreateTaskReducer),\n\t__reducerSchema(\"discover_task\", DiscoverTaskReducer),\n\t__reducerSchema(\"heartbeat\", HeartbeatReducer),\n\t__reducerSchema(\"mark_idea_implemented\", MarkIdeaImplementedReducer),\n\t__reducerSchema(\"propose_idea\", ProposeIdeaReducer),\n\t__reducerSchema(\"register_agent\", RegisterAgentReducer),\n\t__reducerSchema(\"review_discovered_task\", ReviewDiscoveredTaskReducer),\n\t__reducerSchema(\"seed_ui_data\", SeedUiDataReducer),\n\t__reducerSchema(\"send_message\", SendMessageReducer),\n\t__reducerSchema(\"send_project_message\", SendProjectMessageReducer),\n\t__reducerSchema(\"set_agent_status\", SetAgentStatusReducer),\n\t__reducerSchema(\"update_agent_capabilities\", UpdateAgentCapabilitiesReducer),\n\t__reducerSchema(\"update_project_status\", UpdateProjectStatusReducer),\n\t__reducerSchema(\"update_task_status\", UpdateTaskStatusReducer),\n\t__reducerSchema(\"vote_idea\", VoteIdeaReducer),\n);\n\n/** The schema information for all procedures in this module. This is defined the same way as the procedures would have been defined in the server. */\nconst proceduresSchema = __procedures();\n\n/** The remote SpacetimeDB module schema, both runtime and type information. */\nconst REMOTE_MODULE = {\n\tversionInfo: {\n\t\tcliVersion: \"2.0.1\" as const,\n\t},\n\ttables: tablesSchema.schemaType.tables,\n\treducers: reducersSchema.reducersType.reducers,\n\t...proceduresSchema,\n} satisfies __RemoteModule<\n\ttypeof tablesSchema.schemaType,\n\ttypeof reducersSchema.reducersType,\n\ttypeof proceduresSchema\n>;\n\n/** The tables available in this remote SpacetimeDB module. Each table reference doubles as a query builder. */\nexport const tables: __QueryBuilder<typeof tablesSchema.schemaType> =\n\t__makeQueryBuilder(tablesSchema.schemaType);\n\n/** The reducers available in this remote SpacetimeDB module. */\nexport const reducers = __convertToAccessorMap(\n\treducersSchema.reducersType.reducers,\n);\n\n/** The context type returned in callbacks for all possible events. */\nexport type EventContext = __EventContextInterface<typeof REMOTE_MODULE>;\n/** The context type returned in callbacks for reducer events. */\nexport type ReducerEventContext = __ReducerEventContextInterface<\n\ttypeof REMOTE_MODULE\n>;\n/** The context type returned in callbacks for subscription events. */\nexport type SubscriptionEventContext = __SubscriptionEventContextInterface<\n\ttypeof REMOTE_MODULE\n>;\n/** The context type returned in callbacks for error events. */\nexport type ErrorContext = __ErrorContextInterface<typeof REMOTE_MODULE>;\n/** The subscription handle type to manage active subscriptions created from a {@link SubscriptionBuilder}. */\nexport type SubscriptionHandle = __SubscriptionHandleImpl<typeof REMOTE_MODULE>;\n\n/** Builder class to configure a new subscription to the remote SpacetimeDB instance. */\nexport class SubscriptionBuilder extends __SubscriptionBuilderImpl<\n\ttypeof REMOTE_MODULE\n> {}\n\n/** Builder class to configure a new database connection to the remote SpacetimeDB instance. */\nexport class DbConnectionBuilder extends __DbConnectionBuilder<DbConnection> {}\n\n/** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */\nexport class DbConnection extends __DbConnectionImpl<typeof REMOTE_MODULE> {\n\t/** Creates a new {@link DbConnectionBuilder} to configure and connect to the remote SpacetimeDB instance. */\n\tstatic builder = (): DbConnectionBuilder => {\n\t\treturn new DbConnectionBuilder(\n\t\t\tREMOTE_MODULE,\n\t\t\t(config: __DbConnectionConfig<typeof REMOTE_MODULE>) =>\n\t\t\t\tnew DbConnection(config),\n\t\t);\n\t};\n\n\t/** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */\n\toverride subscriptionBuilder = (): SubscriptionBuilder => {\n\t\treturn new SubscriptionBuilder(this);\n\t};\n}\n","import type { Identity } from \"spacetimedb\";\nimport {\n\tDbConnection,\n\ttype ErrorContext,\n\ttype tables,\n} from \"~/module_bindings/index.js\";\n\nexport type {\n\tAgent,\n\tChannel,\n\tConfig,\n\tDiscoveredTask,\n\tIdea,\n\tIdentityRole,\n\tMessage,\n\tProject,\n\tProjectChannel,\n\tProjectMessage,\n\tTask,\n\tTaskDependency,\n\tVote,\n} from \"~/module_bindings/types.js\";\n\nimport { getConfig } from \"./config.js\";\nimport { error } from \"./output.js\";\nimport { getCachedToken } from \"./token-cache.js\";\nimport { getWalletInfo } from \"./wallet.js\";\n\ntype TableName = Extract<keyof typeof tables, string>;\n\nexport interface CommandContextOptions {\n\thost?: string;\n\tmodule?: string;\n\twallet?: string;\n\ttoken?: string;\n\tsubscribe?: boolean;\n\tonDisconnect?: (...args: unknown[]) => void;\n}\n\nexport interface AuthInfo {\n\twallet: string;\n\ttoken: string;\n\tidentity: Identity;\n}\n\nexport class CommandContext implements AsyncDisposable {\n\treadonly conn: DbConnection;\n\treadonly identity?: Identity;\n\treadonly token?: string;\n\treadonly auth?: AuthInfo;\n\treadonly config: Awaited<ReturnType<typeof getConfig>>;\n\n\tprivate disposed = false;\n\n\tprivate constructor(\n\t\tconn: DbConnection,\n\t\tconfig: Awaited<ReturnType<typeof getConfig>>,\n\t\tidentity?: Identity,\n\t\ttoken?: string,\n\t\tauth?: AuthInfo,\n\t) {\n\t\tthis.conn = conn;\n\t\tthis.config = config;\n\t\tthis.identity = identity;\n\t\tthis.token = token;\n\t\tthis.auth = auth;\n\t}\n\n\tget db() {\n\t\treturn this.conn.db;\n\t}\n\n\titer<T>(tableName: TableName): T[] {\n\t\tconst db = this.db as Record<string, { iter?: () => IterableIterator<T> }>;\n\t\tconst table = db[tableName];\n\t\tif (table?.iter) {\n\t\t\treturn Array.from(table.iter());\n\t\t}\n\t\treturn [];\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.conn.disconnect();\n\t\t}\n\t}\n\n\tstatic async create(\n\t\toptions: CommandContextOptions = {},\n\t): Promise<CommandContext> {\n\t\tconst config = await getConfig();\n\t\tconst host = options.host || config.spacetime.host;\n\t\tconst moduleName = options.module || config.spacetime.module;\n\t\tconst walletName = options.wallet || config.defaultWallet;\n\n\t\tlet token = options.token;\n\t\tlet auth: AuthInfo | undefined;\n\n\t\tif (!token && walletName) {\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (cached) {\n\t\t\t\ttoken = cached.token;\n\t\t\t\tauth = {\n\t\t\t\t\twallet: walletName,\n\t\t\t\t\ttoken: cached.token,\n\t\t\t\t\tidentity: undefined as unknown as Identity,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\treject(new Error(\"Connection timeout\"));\n\t\t\t}, config.requestTimeout);\n\n\t\t\tconst originalConsoleLog = console.log;\n\t\t\tconst originalConsoleError = console.error;\n\t\t\tconst suppressSdkConnectLog = (...logArgs: unknown[]): void => {\n\t\t\t\tconst shouldSuppress = logArgs.some(\n\t\t\t\t\t(arg) =>\n\t\t\t\t\t\ttypeof arg === \"string\" &&\n\t\t\t\t\t\targ.includes(\"Connecting to SpacetimeDB WS...\"),\n\t\t\t\t);\n\t\t\t\tif (!shouldSuppress) {\n\t\t\t\t\toriginalConsoleLog(...(logArgs as Parameters<typeof console.log>));\n\t\t\t\t}\n\t\t\t};\n\t\t\t// Suppress SDK error spam during connection - errors are properly thrown and handled by callers\n\t\t\tconst suppressSdkError = (..._logArgs: unknown[]): void => {\n\t\t\t\t// Errors are handled by onConnectError and rejected properly\n\t\t\t\tif (process.env.PROBE_DEBUG) {\n\t\t\t\t\toriginalConsoleError(\"[probe:debug]\", ..._logArgs);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconsole.log = suppressSdkConnectLog as typeof console.log;\n\t\t\tconsole.error = suppressSdkError as typeof console.error;\n\n\t\t\ttry {\n\t\t\t\tDbConnection.builder()\n\t\t\t\t\t.withUri(host)\n\t\t\t\t\t.withDatabaseName(moduleName)\n\t\t\t\t\t.withToken(token || undefined)\n\t\t\t\t\t.onConnect(\n\t\t\t\t\t\t(conn: DbConnection, identity: Identity, authToken: string) => {\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\n\t\t\t\t\t\t\tif (auth) {\n\t\t\t\t\t\t\t\tauth.identity = identity;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst shouldSubscribe = options.subscribe !== false;\n\n\t\t\t\t\t\t\tif (shouldSubscribe) {\n\t\t\t\t\t\t\t\tconn\n\t\t\t\t\t\t\t\t\t.subscriptionBuilder()\n\t\t\t\t\t\t\t\t\t.onApplied(() => {\n\t\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\t\tnew CommandContext(\n\t\t\t\t\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\t\t\t\t\t\tidentity,\n\t\t\t\t\t\t\t\t\t\t\t\tauthToken,\n\t\t\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.onError((ctx: ErrorContext) => {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`Subscription error: ${ctx.event?.message || \"Unknown error\"}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.subscribe([\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM agents\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM tasks\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM ideas\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM messages\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM channels\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM projects\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM votes\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM discovered_tasks\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM task_dependencies\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM identity_roles\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM config\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM project_channels\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM project_messages\",\n\t\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\tnew CommandContext(conn, config, identity, authToken, auth),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\t.onDisconnect((...disconnectArgs: unknown[]) => {\n\t\t\t\t\t\toptions.onDisconnect?.(...disconnectArgs);\n\t\t\t\t\t})\n\t\t\t\t\t.onConnectError((_ctx: ErrorContext, err: Error) => {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tconst message = err.message.toLowerCase();\n\t\t\t\t\t\tif (message.includes(\"unauthorized\") || message.includes(\"401\")) {\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\"Authentication required. Run `probe auth <wallet> --save` first.\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treject(new Error(`Connection failed: ${err.message}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\t.build();\n\t\t\t} finally {\n\t\t\t\tconsole.log = originalConsoleLog;\n\t\t\t\tconsole.error = originalConsoleError;\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport async function requireAuth(\n\toptions: CommandContextOptions,\n): Promise<CommandContext> {\n\tconst config = await getConfig();\n\tconst walletName = options.wallet || config.defaultWallet;\n\n\tif (!walletName) {\n\t\terror(\n\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t);\n\t}\n\n\tconst wallet = await getWalletInfo(walletName);\n\tif (!wallet) {\n\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t}\n\n\tconst cached = await getCachedToken(walletName);\n\tif (!cached) {\n\t\terror(\n\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\"No cached token. Run `probe auth <wallet> --save` first.\",\n\t\t);\n\t}\n\n\treturn CommandContext.create({\n\t\t...options,\n\t\twallet: walletName,\n\t\ttoken: cached.token,\n\t});\n}\n\nexport async function withContext<T>(\n\toptions: CommandContextOptions,\n\thandler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n\tawait using ctx = await CommandContext.create(options);\n\treturn await handler(ctx);\n}\n\nexport async function withAuth<T>(\n\toptions: CommandContextOptions,\n\thandler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n\tawait using ctx = await requireAuth(options);\n\treturn await handler(ctx);\n}\n\nexport async function callReducer(\n\tctx: CommandContext,\n\treducerName: string,\n\targs: Record<string, unknown>,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst timeoutMs = Math.max(1000, ctx.config.requestTimeout);\n\n\t\tconst reducers = ctx.conn.reducers as unknown as Record<string, unknown>;\n\t\tconst reducer = reducers[reducerName];\n\t\tif (typeof reducer !== \"function\") {\n\t\t\treject(new Error(`Reducer not found: ${reducerName}`));\n\t\t\treturn;\n\t\t}\n\n\t\tconst callback = (\n\t\t\teventCtx: { event: { status: { tag: string; value?: string } } },\n\t\t\t_reducerArgs: unknown,\n\t\t) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\n\t\t\tcleanup();\n\t\t\tconst status = eventCtx.event.status;\n\t\t\tif (status.tag === \"Failed\") {\n\t\t\t\treject(new Error(status.value || \"Reducer failed\"));\n\t\t\t} else if (status.tag === \"OutOfEnergy\") {\n\t\t\t\treject(new Error(\"Transaction out of energy\"));\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\n\t\tconst onMethod =\n\t\t\t`on${reducerName.charAt(0).toUpperCase() + reducerName.slice(1)}` as keyof typeof ctx.conn.reducers;\n\t\tconst offMethod =\n\t\t\t`removeOn${reducerName.charAt(0).toUpperCase() + reducerName.slice(1)}` as keyof typeof ctx.conn.reducers;\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst remove = ctx.conn.reducers[offMethod] as unknown;\n\t\t\tif (typeof remove === \"function\") {\n\t\t\t\t(remove as (cb: typeof callback) => void)(callback);\n\t\t\t}\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(\n\t\t\t\tnew Error(`Reducer timed out after ${timeoutMs}ms: ${reducerName}`),\n\t\t\t);\n\t\t}, timeoutMs);\n\n\t\tconst on = ctx.conn.reducers[onMethod] as unknown;\n\t\tif (typeof on === \"function\") {\n\t\t\t(on as (cb: typeof callback) => void)(callback);\n\t\t}\n\n\t\t(reducer as (a: Record<string, unknown>) => void)(args);\n\t});\n}\n","import { encode } from \"@toon-format/toon\";\n\nexport function formatToon(data: Record<string, unknown>): string {\n\treturn encode(data);\n}\n\nexport function formatToonRecord<T extends object>(\n\tkey: string,\n\titems: T[],\n\tfields?: (keyof T)[],\n): string {\n\tconst displayFields = fields || (Object.keys(items[0] || {}) as (keyof T)[]);\n\tconst rows = items.map((item) => {\n\t\tconst row: Record<string, unknown> = {};\n\t\tfor (const field of displayFields) {\n\t\t\trow[String(field)] = item[field];\n\t\t}\n\t\treturn row;\n\t});\n\treturn encode({ [key]: rows });\n}\n\nexport function toonList<T extends object>(\n\tkey: string,\n\titems: T[],\n\tcolumns?: string[],\n): string {\n\tif (items.length === 0) {\n\t\treturn encode({ [key]: [] });\n\t}\n\n\tconst cols = columns || Object.keys(items[0] as Record<string, unknown>);\n\tconst rows = items.map((item) => {\n\t\tconst row: Record<string, unknown> = {};\n\t\tfor (const col of cols) {\n\t\t\trow[col] = (item as Record<string, unknown>)[col];\n\t\t}\n\t\treturn row;\n\t});\n\treturn encode({ [key]: rows });\n}\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { CommandContext } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\ntype CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface DoctorCheck {\n\tcheck: string;\n\tstatus: CheckStatus;\n\tdetail: string;\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"doctor\",\n\t\tdescription: \"Run environment and connectivity diagnostics\",\n\t},\n\targs: {\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override for auth checks\",\n\t\t},\n\t\thost: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB host override\",\n\t\t},\n\t\tmodule: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB module override\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe doctor\",\n\t\t\t\tdescription: \"Validate Probe config, auth, and Nexus connectivity\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe doctor\",\n\t\t\t\t\t\"probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet override for auth checks\" },\n\t\t\t\t\t{ name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output mode\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst checks: DoctorCheck[] = [];\n\t\tconst addCheck = (check: string, status: CheckStatus, detail: string) => {\n\t\t\tchecks.push({ check, status, detail });\n\t\t};\n\n\t\tlet config: Awaited<ReturnType<typeof getConfig>> | null = null;\n\t\ttry {\n\t\t\tconfig = await getConfig();\n\t\t\taddCheck(\"config\", \"pass\", \"Loaded Probe configuration\");\n\t\t} catch (err) {\n\t\t\taddCheck(\n\t\t\t\t\"config\",\n\t\t\t\t\"fail\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load configuration\",\n\t\t\t);\n\t\t}\n\n\t\tconst walletName = args.wallet || config?.defaultWallet;\n\t\tif (!walletName) {\n\t\t\taddCheck(\n\t\t\t\t\"wallet.selected\",\n\t\t\t\t\"fail\",\n\t\t\t\t\"No wallet selected (set --wallet or defaultWallet)\",\n\t\t\t);\n\t\t} else {\n\t\t\taddCheck(\"wallet.selected\", \"pass\", `Using wallet '${walletName}'`);\n\t\t}\n\n\t\tlet hasWallet = false;\n\t\tif (walletName) {\n\t\t\tconst wallet = await getWalletInfo(walletName);\n\t\t\tif (wallet) {\n\t\t\t\thasWallet = true;\n\t\t\t\taddCheck(\"wallet.exists\", \"pass\", `Address ${wallet.address}`);\n\t\t\t} else {\n\t\t\t\taddCheck(\"wallet.exists\", \"fail\", `Wallet '${walletName}' not found`);\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | null = null;\n\t\tif (walletName && hasWallet) {\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (!cached) {\n\t\t\t\taddCheck(\"auth.token\", \"fail\", \"No cached token (run probe auth)\");\n\t\t\t} else {\n\t\t\t\ttoken = cached.token;\n\t\t\t\tconst expires = new Date(cached.expiresAt);\n\t\t\t\tif (Number.isNaN(expires.getTime())) {\n\t\t\t\t\taddCheck(\"auth.token\", \"warn\", \"Token exists but expiry is invalid\");\n\t\t\t\t} else if (expires.getTime() <= Date.now()) {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"auth.token\",\n\t\t\t\t\t\t\"fail\",\n\t\t\t\t\t\t`Token expired at ${expires.toISOString()}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"auth.token\",\n\t\t\t\t\t\t\"pass\",\n\t\t\t\t\t\t`Token valid until ${expires.toISOString()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (config) {\n\t\t\tconst host = args.host || config.spacetime.host;\n\t\t\tconst moduleName = args.module || config.spacetime.module;\n\t\t\taddCheck(\"nexus.target\", \"pass\", `${host} / ${moduleName}`);\n\n\t\t\tif (token) {\n\t\t\t\ttry {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tmodule: moduleName,\n\t\t\t\t\t\twallet: walletName,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tsubscribe: false,\n\t\t\t\t\t});\n\t\t\t\t\tconst identity = ctx.identity?.toHexString() || \"unknown\";\n\t\t\t\t\taddCheck(\"nexus.connect\", \"pass\", `Connected as ${identity}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"nexus.connect\",\n\t\t\t\t\t\t\"fail\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Connection failed\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddCheck(\n\t\t\t\t\t\"nexus.connect\",\n\t\t\t\t\t\"warn\",\n\t\t\t\t\t\"Skipped connection check (no valid token)\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst counts = checks.reduce(\n\t\t\t(acc, item) => {\n\t\t\t\tif (item.status === \"pass\") acc.pass += 1;\n\t\t\t\telse if (item.status === \"warn\") acc.warn += 1;\n\t\t\t\telse acc.fail += 1;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{ pass: 0, warn: 0, fail: 0 },\n\t\t);\n\n\t\tconst ok = counts.fail === 0;\n\t\tsuccess({ ok, counts, checks });\n\n\t\tif (!isJsonMode()) {\n\t\t\tconsole.log(toonList(\"doctor_checks\", checks));\n\t\t\tconsole.log(toonList(\"doctor_summary\", [{ ok, ...counts }]));\n\t\t}\n\t},\n});\n","import type {\n\tAgentRole as AgentRoleType,\n\tAgentStatus as AgentStatusType,\n\tIdeaStatus as IdeaStatusType,\n\tMessageType as MessageTypeType,\n\tProjectStatus as ProjectStatusType,\n\tTaskStatus as TaskStatusType,\n\tVoteType as VoteTypeType,\n} from \"~/module_bindings/types.js\";\n\nexport const TaskStatus = {\n\tvalues: [\n\t\t\"Open\",\n\t\t\"Claimed\",\n\t\t\"InProgress\",\n\t\t\"Review\",\n\t\t\"Completed\",\n\t\t\"Blocked\",\n\t\t\"Archived\",\n\t] as const,\n\n\tis: {\n\t\topen: (s: TaskStatusType) => s.tag === \"Open\",\n\t\tclaimed: (s: TaskStatusType) => s.tag === \"Claimed\",\n\t\tinProgress: (s: TaskStatusType) => s.tag === \"InProgress\",\n\t\treview: (s: TaskStatusType) => s.tag === \"Review\",\n\t\tcompleted: (s: TaskStatusType) => s.tag === \"Completed\",\n\t\tblocked: (s: TaskStatusType) => s.tag === \"Blocked\",\n\t\tarchived: (s: TaskStatusType) => s.tag === \"Archived\",\n\t\tactive: (s: TaskStatusType) =>\n\t\t\t[\"Open\", \"Claimed\", \"InProgress\", \"Review\"].includes(s.tag),\n\t\tterminal: (s: TaskStatusType) =>\n\t\t\t[\"Completed\", \"Blocked\", \"Archived\"].includes(s.tag),\n\t},\n\n\tfromString(s: string): TaskStatusType {\n\t\tconst map: Record<string, TaskStatusType> = {\n\t\t\topen: { tag: \"Open\" },\n\t\t\tclaimed: { tag: \"Claimed\" },\n\t\t\tin_progress: { tag: \"InProgress\" },\n\t\t\tinprogress: { tag: \"InProgress\" },\n\t\t\treview: { tag: \"Review\" },\n\t\t\tcompleted: { tag: \"Completed\" },\n\t\t\tmerged: { tag: \"Completed\" },\n\t\t\tblocked: { tag: \"Blocked\" },\n\t\t\tarchived: { tag: \"Archived\" },\n\t\t};\n\t\treturn map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Open\" };\n\t},\n\n\tmatches(status: TaskStatusType, filter: string): boolean {\n\t\tconst f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tif (f === \"merged\") return status.tag === \"Completed\";\n\t\treturn status.tag.toLowerCase() === f;\n\t},\n\n\tdisplay(status: TaskStatusType): string {\n\t\tconst map: Record<string, string> = { InProgress: \"IN PROGRESS\" };\n\t\treturn map[status.tag] ?? status.tag.toUpperCase();\n\t},\n} as const;\n\nexport const IdeaStatus = {\n\tvalues: [\"Voting\", \"ApprovedForProject\", \"Rejected\", \"Implemented\"] as const,\n\n\tis: {\n\t\tvoting: (s: IdeaStatusType) => s.tag === \"Voting\",\n\t\tapproved: (s: IdeaStatusType) => s.tag === \"ApprovedForProject\",\n\t\trejected: (s: IdeaStatusType) => s.tag === \"Rejected\",\n\t\timplemented: (s: IdeaStatusType) => s.tag === \"Implemented\",\n\t\tactive: (s: IdeaStatusType) => s.tag === \"Voting\",\n\t\tterminal: (s: IdeaStatusType) =>\n\t\t\t[\"ApprovedForProject\", \"Rejected\", \"Implemented\"].includes(s.tag),\n\t},\n\n\tfromString(s: string): IdeaStatusType {\n\t\tconst map: Record<string, IdeaStatusType> = {\n\t\t\tvoting: { tag: \"Voting\" },\n\t\t\tapproved: { tag: \"ApprovedForProject\" },\n\t\t\tapproved_for_project: { tag: \"ApprovedForProject\" },\n\t\t\trejected: { tag: \"Rejected\" },\n\t\t\timplemented: { tag: \"Implemented\" },\n\t\t};\n\t\treturn map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Voting\" };\n\t},\n\n\tmatches(status: IdeaStatusType, filter: string): boolean {\n\t\tconst f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tif (f === \"approved\") return status.tag === \"ApprovedForProject\";\n\t\treturn status.tag.toLowerCase() === f;\n\t},\n\n\tdisplay(status: IdeaStatusType): string {\n\t\tif (status.tag === \"ApprovedForProject\") return \"Approved\";\n\t\treturn status.tag;\n\t},\n} as const;\n\nexport const VoteType = {\n\tvalues: [\"Up\", \"Down\", \"Veto\"] as const,\n\n\tis: {\n\t\tup: (v: VoteTypeType) => v.tag === \"Up\",\n\t\tdown: (v: VoteTypeType) => v.tag === \"Down\",\n\t\tveto: (v: VoteTypeType) => v.tag === \"Veto\",\n\t\tpositive: (v: VoteTypeType) => v.tag === \"Up\",\n\t\tnegative: (v: VoteTypeType) => [\"Down\", \"Veto\"].includes(v.tag),\n\t},\n\n\tfromString(s: string): VoteTypeType {\n\t\tconst map: Record<string, VoteTypeType> = {\n\t\t\tup: { tag: \"Up\" },\n\t\t\tdown: { tag: \"Down\" },\n\t\t\tveto: { tag: \"Veto\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Up\" };\n\t},\n\n\tdisplay(v: VoteTypeType): string {\n\t\treturn v.tag.toLowerCase();\n\t},\n} as const;\n\nexport const AgentRole = {\n\tvalues: [\"Zoe\", \"Admin\", \"Zeno\"] as const,\n\n\tis: {\n\t\tzoe: (r: AgentRoleType) => r.tag === \"Zoe\",\n\t\tadmin: (r: AgentRoleType) => r.tag === \"Admin\",\n\t\tzeno: (r: AgentRoleType) => r.tag === \"Zeno\",\n\t\tprivileged: (r: AgentRoleType) => [\"Zoe\", \"Admin\"].includes(r.tag),\n\t},\n\n\tfromString(s: string): AgentRoleType {\n\t\tconst map: Record<string, AgentRoleType> = {\n\t\t\tzoe: { tag: \"Zoe\" },\n\t\t\tadmin: { tag: \"Admin\" },\n\t\t\tzeno: { tag: \"Zeno\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Zeno\" };\n\t},\n\n\tdisplay(r: AgentRoleType): string {\n\t\treturn r.tag.toLowerCase();\n\t},\n} as const;\n\nexport const AgentStatus = {\n\tvalues: [\"Online\", \"Offline\", \"Working\"] as const,\n\n\tis: {\n\t\tonline: (s: AgentStatusType) => s.tag === \"Online\",\n\t\toffline: (s: AgentStatusType) => s.tag === \"Offline\",\n\t\tworking: (s: AgentStatusType) => s.tag === \"Working\",\n\t\tavailable: (s: AgentStatusType) =>\n\t\t\ts.tag === \"Online\" || s.tag === \"Working\",\n\t},\n\n\tfromString(s: string): AgentStatusType {\n\t\tconst map: Record<string, AgentStatusType> = {\n\t\t\tonline: { tag: \"Online\" },\n\t\t\toffline: { tag: \"Offline\" },\n\t\t\tworking: { tag: \"Working\" },\n\t\t\tbusy: { tag: \"Working\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Offline\" };\n\t},\n\n\tdisplay(s: AgentStatusType): string {\n\t\treturn s.tag;\n\t},\n} as const;\n\nexport const MessageType = {\n\tvalues: [\"User\", \"System\", \"Directive\"] as const,\n\n\tis: {\n\t\tuser: (t: MessageTypeType) => t.tag === \"User\",\n\t\tsystem: (t: MessageTypeType) => t.tag === \"System\",\n\t\tdirective: (t: MessageTypeType) => t.tag === \"Directive\",\n\t},\n\n\tfromString(s: string): MessageTypeType {\n\t\tconst map: Record<string, MessageTypeType> = {\n\t\t\tuser: { tag: \"User\" },\n\t\t\ttext: { tag: \"User\" },\n\t\t\tsystem: { tag: \"System\" },\n\t\t\tdirective: { tag: \"Directive\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"User\" };\n\t},\n\n\tdisplay(t: MessageTypeType): string {\n\t\treturn t.tag.toLowerCase();\n\t},\n} as const;\n\nexport const ProjectStatus = {\n\tvalues: [\"Active\", \"Paused\"] as const,\n\n\tis: {\n\t\tactive: (s: ProjectStatusType) => s.tag === \"Active\",\n\t\tpaused: (s: ProjectStatusType) => s.tag === \"Paused\",\n\t},\n\n\tfromString(s: string): ProjectStatusType {\n\t\tconst normalized = s.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tconst map: Record<string, ProjectStatusType> = {\n\t\t\tactive: { tag: \"Active\" },\n\t\t\tpaused: { tag: \"Paused\" },\n\t\t};\n\t\treturn map[normalized] ?? { tag: \"Active\" };\n\t},\n\n\tmatches(status: ProjectStatusType, filter: string): boolean {\n\t\tconst normalized = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\treturn status.tag.toLowerCase() === normalized;\n\t},\n\n\tdisplay(status: ProjectStatusType): string {\n\t\treturn status.tag.toLowerCase();\n\t},\n} as const;\n","type MicrosTimestamp = { microsSinceUnixEpoch: bigint | number | string };\n\nexport const toMicros = (value: unknown): bigint => {\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"microsSinceUnixEpoch\" in value)\n\t) {\n\t\treturn 0n;\n\t}\n\tconst micros = (value as MicrosTimestamp).microsSinceUnixEpoch;\n\treturn typeof micros === \"bigint\" ? micros : BigInt(micros);\n};\n\nexport const formatTimestamp = (value: unknown, fallback = \"\"): string => {\n\tconst micros = toMicros(value);\n\tif (micros <= 0n) {\n\t\treturn fallback || String(value ?? \"\");\n\t}\n\treturn new Date(Number(micros / 1000n))\n\t\t.toISOString()\n\t\t.replace(\"T\", \" \")\n\t\t.slice(0, 19);\n};\n\nexport const formatIsoTimestamp = (value: unknown, fallback = \"\"): string => {\n\tconst micros = toMicros(value);\n\tif (micros <= 0n) {\n\t\treturn fallback || new Date().toISOString();\n\t}\n\treturn new Date(Number(micros / 1000n)).toISOString();\n};\n","import { getConfig } from \"~/utils/config.js\";\nimport {\n\ttype Agent,\n\tCommandContext,\n\tcallReducer,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\nexport interface AgentCommandArgs {\n\taction?: string;\n\tagentId?: string;\n\tname?: string;\n\trole?: string;\n\taddress?: string;\n\twallet?: string;\n\ttask?: string;\n\tlimit?: string;\n\tcapabilities?: string;\n\tset?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst normalizeCapabilities = (value?: string): string[] => {\n\tif (!value) return [];\n\treturn [\n\t\t...new Set(\n\t\t\tvalue\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((item) => item.trim().toLowerCase())\n\t\t\t\t.filter(Boolean),\n\t\t),\n\t];\n};\n\nconst currentAgentForIdentity = (ctx: CommandContext): Agent | undefined => {\n\treturn ctx\n\t\t.iter<Agent>(\"agents\")\n\t\t.find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n};\n\nconst renderAgent = (agent: Agent, identity?: string) => ({\n\tid: agent.id,\n\tname: agent.name,\n\trole: AgentRole.display(agent.role),\n\tstatus: AgentStatus.display(agent.status),\n\tlastHeartbeat: formatTimestamp(agent.lastHeartbeat),\n\tcurrentTaskId: agent.currentTaskId ? agent.currentTaskId.toString() : \"\",\n\tcapabilities: agent.capabilities.join(\",\"),\n\tidentity: identity || \"\",\n});\n\nexport const runAgentAction = async (args: AgentCommandArgs): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Agent action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"register\": {\n\t\t\t\tconst agentId = args.agentId;\n\t\t\t\tconst name = args.name;\n\t\t\t\tconst role = args.role || \"zeno\";\n\n\t\t\t\tif (!agentId || !name)\n\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Agent ID and name required\");\n\n\t\t\t\tconst config = await getConfig();\n\t\t\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\t\t\tif (!args.address && !walletName)\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\t\t\"--address or --wallet required (or set default wallet)\",\n\t\t\t\t\t);\n\n\t\t\t\tlet address = args.address;\n\t\t\t\tconst capabilities = normalizeCapabilities(args.capabilities);\n\t\t\t\tif (!address && walletName) {\n\t\t\t\t\tconst wallet = await getWalletInfo(walletName);\n\t\t\t\t\tif (!wallet)\n\t\t\t\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t\t\t\t\taddress = wallet.address;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: walletName },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"registerAgent\", {\n\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trole: AgentRole.fromString(role),\n\t\t\t\t\t\t\t\tzenonAddress: address as string,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (capabilities.length > 0) {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"updateAgentCapabilities\", {\n\t\t\t\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 500));\n\t\t\t\t\t\t\tconst registered = ctx\n\t\t\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t\t\t.find((a) => a.id === agentId);\n\t\t\t\t\t\t\tif (!registered) {\n\t\t\t\t\t\t\t\tif (role === \"zoe\" || role === \"admin\") {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\t\t\t\t\"Only whitelisted identities can register as zoe or admin\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\terror(\"REGISTRATION_FAILED\", \"Registration failed\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tregistered: true,\n\t\t\t\t\t\tagentId,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trole,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent_registered\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\trole,\n\t\t\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\t\t\tcapabilities: capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"status\": {\n\t\t\t\tif (args.agentId || args.task || args.capabilities) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_USAGE\",\n\t\t\t\t\t\t\"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\tif (!myAgent)\n\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess(myAgent);\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t\trenderAgent(myAgent, ctx.identity?.toHexString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"set-status\": {\n\t\t\t\tconst nextStatus = args.agentId;\n\t\t\t\tif (!nextStatus) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"STATUS_REQUIRED\",\n\t\t\t\t\t\t\"Status required. Use: online, offline, working, busy\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (args.capabilities) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_USAGE\",\n\t\t\t\t\t\t\"Use `probe agent capabilities --set <list>` to update capabilities.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst normalized = nextStatus.toLowerCase();\n\t\t\t\tconst allowed = new Set([\"online\", \"offline\", \"working\", \"busy\"]);\n\t\t\t\tif (!allowed.has(normalized)) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_STATUS\",\n\t\t\t\t\t\t`Invalid status: ${nextStatus}. Use: online, offline, working, busy`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst mapped = AgentStatus.fromString(normalized);\n\t\t\t\tconst isWorking = AgentStatus.is.working(mapped);\n\t\t\t\tif (isWorking && !args.task) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"TASK_REQUIRED\",\n\t\t\t\t\t\t\"--task is required when setting status to working\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!isWorking && args.task) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"TASK_NOT_ALLOWED\",\n\t\t\t\t\t\t\"--task is only allowed when setting status to working\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"setAgentStatus\", {\n\t\t\t\t\t\t\t\tstatus: mapped,\n\t\t\t\t\t\t\t\ttaskId: isWorking ? BigInt(args.task as string) : undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tupdated: true,\n\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\ttaskId: args.task || null,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent_status_updated\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\t\t\t\ttaskId: args.task || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"capabilities\": {\n\t\t\t\tif (!args.set) error(\"CAPABILITIES_REQUIRED\", \"--set is required\");\n\n\t\t\t\tconst capabilities = normalizeCapabilities(args.set);\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateAgentCapabilities\", {\n\t\t\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\t\tsuccess({ updated: true, agentId: myAgent?.id, capabilities });\n\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"agent_capabilities_updated\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tagentId: myAgent?.id || \"\",\n\t\t\t\t\t\t\t\t\t\t\tcapabilities: capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"me\": {\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\tif (!myAgent)\n\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess(myAgent);\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t\trenderAgent(myAgent, ctx.identity?.toHexString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"heartbeat\": {\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\t\tif (!myAgent) error(\"NOT_REGISTERED\", \"Agent not registered\");\n\n\t\t\t\t\t\t\tawait callReducer(ctx, \"heartbeat\", {\n\t\t\t\t\t\t\t\tagentId: myAgent.id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsuccess({ heartbeat: true });\n\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"agent_heartbeat\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tagentId: myAgent.id,\n\t\t\t\t\t\t\t\t\t\t\tstatus: AgentStatus.display(myAgent.status),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"list\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tlet onlineAgents = ctx\n\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t.filter((a) => !AgentStatus.is.offline(a.status));\n\t\t\t\tonlineAgents = onlineAgents.sort((a, b) => {\n\t\t\t\t\tconst aMicros = toMicros(\n\t\t\t\t\t\ta.lastHeartbeat || a.createdAt || a.lastActiveAt,\n\t\t\t\t\t);\n\t\t\t\t\tconst bMicros = toMicros(\n\t\t\t\t\t\tb.lastHeartbeat || b.createdAt || b.lastActiveAt,\n\t\t\t\t\t);\n\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\treturn b.id.localeCompare(a.id);\n\t\t\t\t});\n\t\t\t\tif (limit !== undefined) onlineAgents = onlineAgents.slice(0, limit);\n\n\t\t\t\tsuccess({ agents: onlineAgents, count: onlineAgents.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"agents\",\n\t\t\t\t\t\t\tonlineAgents.map((a) => ({\n\t\t\t\t\t\t\t\tid: a.id,\n\t\t\t\t\t\t\t\tname: a.name,\n\t\t\t\t\t\t\t\trole: AgentRole.display(a.role),\n\t\t\t\t\t\t\t\tstatus: AgentStatus.display(a.status),\n\t\t\t\t\t\t\t\tlast_heartbeat: formatTimestamp(a.lastHeartbeat),\n\t\t\t\t\t\t\t\tcapabilities: a.capabilities.join(\",\"),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"identity\": {\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst identityHex = ctx.identity?.toHexString();\n\t\t\t\t\t\tsuccess({ identity: identityHex, wallet: args.wallet });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"identity\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tidentity: identityHex || \"\",\n\t\t\t\t\t\t\t\t\t\twallet: args.wallet || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: register, status, set-status, capabilities, me, heartbeat, list, identity\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\t// Handle connection errors gracefully - avoid citty/consola stack traces\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { type AgentCommandArgs, runAgentAction } from \"./agent-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"agent\", description: \"Agent management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription:\n\t\t\t\t\"Action: register, status, set-status, capabilities, me, heartbeat, list, identity\",\n\t\t\trequired: false,\n\t\t},\n\t\tagentId: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Agent ID or status value\",\n\t\t\trequired: false,\n\t\t},\n\t\tname: { type: \"positional\", description: \"Display name\", required: false },\n\t\trole: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Role: zoe, admin, zeno\",\n\t\t\trequired: false,\n\t\t},\n\t\taddress: { type: \"string\", description: \"Zenon address\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\ttask: { type: \"string\", description: \"Current task ID\" },\n\t\tlimit: { type: \"string\", description: \"Limit agents returned for list\" },\n\t\tcapabilities: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Comma-separated capability list\",\n\t\t},\n\t\tset: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Set capabilities for capabilities action\",\n\t\t},\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe agent\",\n\t\t\t\tdescription: \"Agent lifecycle and identity commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe agent <action> [options]\",\n\t\t\t\t\t'probe agent register agent-1 \"Builder\" zeno --wallet my-wallet',\n\t\t\t\t\t\"probe agent set-status working --task 42\",\n\t\t\t\t\t'probe agent capabilities --set \"gh,coding,review\"',\n\t\t\t\t\t\"probe agent heartbeat\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"register <agentId> <name> [role]\",\n\t\t\t\t\t\tdetail: \"Register a new agent identity\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"status\", detail: \"Show current agent status\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"set-status <online|offline|working|busy>\",\n\t\t\t\t\t\tdetail: \"Update current agent status\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"capabilities --set <list>\",\n\t\t\t\t\t\tdetail: \"Set capabilities for authenticated agent\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"me\", detail: \"Show current authenticated agent profile\" },\n\t\t\t\t\t{ name: \"heartbeat\", detail: \"Send heartbeat only\" },\n\t\t\t\t\t{ name: \"list\", detail: \"List online agents\" },\n\t\t\t\t\t{ name: \"identity\", detail: \"Show current authenticated identity\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{ name: \"--address\", detail: \"Zenon address for register\" },\n\t\t\t\t\t{ name: \"--task\", detail: \"Task ID required with status working\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max agents returned for list\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--capabilities\",\n\t\t\t\t\t\tdetail: \"Comma-separated capabilities for register/status\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--set\",\n\t\t\t\t\t\tdetail: \"Comma-separated capabilities for capabilities action\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.\",\n\t\t\t\t\t\"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.\",\n\t\t\t\t\t\"`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runAgentAction(args as AgentCommandArgs);\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype DiscoveredTask,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nconst toDiscoveryDecision = (input: string) => {\n\tconst value = input.toLowerCase();\n\tif (value === \"approve\") return { tag: \"ApproveAsTask\" };\n\tif (value === \"reject\") return { tag: \"Reject\" };\n\tif (value === \"escalate_to_idea\") return { tag: \"EscalateToIdea\" };\n\treturn null;\n};\n\nconst discoveryStatusTag = (status: unknown): string => {\n\tif (status && typeof status === \"object\" && \"tag\" in status) {\n\t\treturn String((status as { tag: string }).tag);\n\t}\n\treturn String(status);\n};\n\nconst discoveryStatusDisplay = (status: unknown): string => {\n\tconst tag = discoveryStatusTag(status);\n\tconst map: Record<string, string> = {\n\t\tPendingReview: \"pending_review\",\n\t\tApproved: \"approved\",\n\t\tRejected: \"rejected\",\n\t\tEscalatedToIdea: \"escalated_to_idea\",\n\t};\n\treturn map[tag] ?? tag;\n};\n\nexport default defineCommand({\n\tmeta: { name: \"discover\", description: \"Discovered task management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: report, review, list, get\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Discovered task ID\",\n\t\t\trequired: false,\n\t\t},\n\t\tdecision: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Decision: approve, reject, escalate_to_idea\",\n\t\t\trequired: false,\n\t\t},\n\t\ttask: { type: \"string\", description: \"Current task ID\" },\n\t\tproject: { type: \"string\", description: \"Project ID\" },\n\t\ttitle: { type: \"string\", description: \"Task title\" },\n\t\ttype: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Task type: bug, improvement, feature\",\n\t\t},\n\t\tseverity: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Severity: low, medium, high, critical\",\n\t\t},\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit discovered tasks returned\" },\n\t\tdescription: { type: \"string\", description: \"Description\" },\n\t\treason: { type: \"string\", description: \"Rejection reason\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe discover\",\n\t\t\t\tdescription: \"Discovered task reporting and review\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe discover <action> [options]\",\n\t\t\t\t\t'probe discover report --task 12 --project 1 --title \"Fix parse\"',\n\t\t\t\t\t\"probe discover review 9 approve\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"report\",\n\t\t\t\t\t\tdetail: \"Report a discovered task from current work\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"review <id> <approve|reject|escalate_to_idea>\",\n\t\t\t\t\t\tdetail: \"Approve, reject, or escalate discovery\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"list\", detail: \"List discovered tasks\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one discovered task\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--task, --project, --title\", detail: \"Required for report\" },\n\t\t\t\t\t{ name: \"--type\", detail: \"Task type: bug, improvement, feature\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--severity\",\n\t\t\t\t\t\tdetail: \"Severity: low, medium, high, critical\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--reason\", detail: \"Reason for rejection/escalation\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max discovered tasks returned for list\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Find current task IDs with `probe task list` and project IDs with `probe project list`.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"report\": {\n\t\t\t\t\tif (!args.task || !args.project || !args.title) {\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"--task, --project, and --title required\");\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"discoverTask\", {\n\t\t\t\t\t\t\t\t\tcurrentTaskId: BigInt(args.task),\n\t\t\t\t\t\t\t\t\tprojectId: BigInt(args.project),\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t\tpriority: 5,\n\t\t\t\t\t\t\t\t\ttaskType: args.type || \"improvement\",\n\t\t\t\t\t\t\t\t\tseverity: args.severity || \"medium\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ reported: true, title: args.title });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"discovery_reported\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\t\ttaskId: args.task,\n\t\t\t\t\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"review\": {\n\t\t\t\t\tconst discId = args.id;\n\t\t\t\t\tconst decisionInput = args.decision;\n\t\t\t\t\tif (!discId || !decisionInput)\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"ID and decision required\");\n\n\t\t\t\t\tconst decision = decisionInput.toLowerCase();\n\n\t\t\t\t\tconst validDecisions = [\"approve\", \"reject\", \"escalate_to_idea\"];\n\t\t\t\t\tif (!validDecisions.includes(decision)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_DECISION\",\n\t\t\t\t\t\t\t`Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst decisionValue = toDiscoveryDecision(decision);\n\t\t\t\t\tif (!decisionValue) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_DECISION\",\n\t\t\t\t\t\t\t`Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"reviewDiscoveredTask\", {\n\t\t\t\t\t\t\t\t\tdiscoveryId: BigInt(discId),\n\t\t\t\t\t\t\t\t\tdecision: decisionValue,\n\t\t\t\t\t\t\t\t\treason: args.reason || undefined,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ reviewed: true, id: discId, decision });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"discovery_reviewed\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: discId,\n\t\t\t\t\t\t\t\t\t\tdecision,\n\t\t\t\t\t\t\t\t\t\treason: args.reason || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet discovered = ctx.iter<DiscoveredTask>(\"discovered_tasks\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status) {\n\t\t\t\t\t\tconst filter = args.status.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\t\t\t\t\tdiscovered = discovered.filter(\n\t\t\t\t\t\t\t(d) =>\n\t\t\t\t\t\t\t\tdiscoveryStatusDisplay(d.status).replace(/[_\\s]/g, \"\") ===\n\t\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdiscovered = discovered.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) discovered = discovered.slice(0, limit);\n\n\t\t\t\t\tsuccess({ discoveredTasks: discovered, count: discovered.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"discovered_tasks\",\n\t\t\t\t\t\t\t\tdiscovered.map((d) => ({\n\t\t\t\t\t\t\t\t\tid: d.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: d.title,\n\t\t\t\t\t\t\t\t\ttaskType: d.taskType,\n\t\t\t\t\t\t\t\t\tseverity: d.severity,\n\t\t\t\t\t\t\t\t\tstatus: discoveryStatusDisplay(d.status),\n\t\t\t\t\t\t\t\t\tprojectId: d.projectId,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst discoveryId = args.id;\n\t\t\t\t\tif (!discoveryId)\n\t\t\t\t\t\terror(\"DISCOVERY_ID_REQUIRED\", \"Discovery ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst discovery = ctx\n\t\t\t\t\t\t.iter<DiscoveredTask>(\"discovered_tasks\")\n\t\t\t\t\t\t.find((d) => d.id.toString() === discoveryId);\n\t\t\t\t\tif (!discovery)\n\t\t\t\t\t\terror(\"DISCOVERY_NOT_FOUND\", `Discovery not found: ${discoveryId}`);\n\n\t\t\t\t\tsuccess(discovery);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"discovered_task\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: discovery.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: discovery.title,\n\t\t\t\t\t\t\t\t\tstatus: discoveryStatusDisplay(discovery.status),\n\t\t\t\t\t\t\t\t\ttaskType: discovery.taskType,\n\t\t\t\t\t\t\t\t\tseverity: discovery.severity,\n\t\t\t\t\t\t\t\t\tpriority: discovery.priority,\n\t\t\t\t\t\t\t\t\tprojectId: discovery.projectId.toString(),\n\t\t\t\t\t\t\t\t\tcurrentTaskId: discovery.currentTaskId.toString(),\n\t\t\t\t\t\t\t\t\tdescription: discovery.description,\n\t\t\t\t\t\t\t\t\treviewedBy: discovery.reviewedBy || \"\",\n\t\t\t\t\t\t\t\t\treviewedAt: discovery.reviewedAt\n\t\t\t\t\t\t\t\t\t\t? formatTimestamp(discovery.reviewedAt)\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\trejectionReason: discovery.rejectionReason || \"\",\n\t\t\t\t\t\t\t\t\tcreatedTaskId: discovery.createdTaskId\n\t\t\t\t\t\t\t\t\t\t? discovery.createdTaskId.toString()\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: report, review, list, get\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype Idea,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { IdeaStatus, VoteType } from \"~/utils/enums.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"idea\", description: \"Idea management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, propose, vote, get\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Idea ID\", required: false },\n\t\tvoteType: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Vote type: up, down, veto\",\n\t\t\trequired: false,\n\t\t},\n\t\ttitle: { type: \"string\", description: \"Idea title\" },\n\t\tcategory: { type: \"string\", description: \"Category\" },\n\t\tdescription: { type: \"string\", description: \"Description\" },\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit ideas returned\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe idea\",\n\t\t\t\tdescription: \"Idea discovery, review, and voting\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe idea <action> [options]\",\n\t\t\t\t\t\"probe idea list --status voting\",\n\t\t\t\t\t\"probe idea vote 42 up\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List ideas with optional filters\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one idea\" },\n\t\t\t\t\t{ name: \"propose\", detail: \"Propose a new idea\" },\n\t\t\t\t\t{ name: \"vote <id> <up|down|veto>\", detail: \"Vote on an idea\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--title\", detail: \"Idea title for propose\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Idea description for propose\" },\n\t\t\t\t\t{ name: \"--category\", detail: \"Idea category for propose/list\" },\n\t\t\t\t\t{ name: \"--status\", detail: \"Status filter for list\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max ideas returned for list\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\"Find idea IDs with `probe idea list` before using get/vote.\"],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet ideas = ctx.iter<Idea>(\"ideas\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status)\n\t\t\t\t\t\tideas = ideas.filter((i) =>\n\t\t\t\t\t\t\tIdeaStatus.matches(i.status, args.status),\n\t\t\t\t\t\t);\n\t\t\t\t\tif (args.category)\n\t\t\t\t\t\tideas = ideas.filter((i) => i.category === args.category);\n\t\t\t\t\tideas = ideas.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) ideas = ideas.slice(0, limit);\n\n\t\t\t\t\tsuccess({ ideas, count: ideas.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"ideas\",\n\t\t\t\t\t\t\t\tideas.map((i) => ({\n\t\t\t\t\t\t\t\t\tid: i.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: i.title,\n\t\t\t\t\t\t\t\t\tcategory: i.category,\n\t\t\t\t\t\t\t\t\tstatus: IdeaStatus.display(i.status),\n\t\t\t\t\t\t\t\t\tvotes: `${i.totalVotes}/${i.quorum}`,\n\t\t\t\t\t\t\t\t\tup: i.upVotes,\n\t\t\t\t\t\t\t\t\tveto: i.vetoCount,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst ideaId = args.id;\n\t\t\t\t\tif (!ideaId) error(\"IDEA_ID_REQUIRED\", \"Idea ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst idea = ctx\n\t\t\t\t\t\t.iter<Idea>(\"ideas\")\n\t\t\t\t\t\t.find((i) => i.id.toString() === ideaId);\n\t\t\t\t\tif (!idea) error(\"IDEA_NOT_FOUND\", `Idea not found: ${ideaId}`);\n\n\t\t\t\t\tsuccess(idea);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"idea\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: idea.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: idea.title,\n\t\t\t\t\t\t\t\t\tcategory: idea.category,\n\t\t\t\t\t\t\t\t\tstatus: IdeaStatus.display(idea.status),\n\t\t\t\t\t\t\t\t\ttotalVotes: idea.totalVotes,\n\t\t\t\t\t\t\t\t\tquorum: idea.quorum,\n\t\t\t\t\t\t\t\t\tupVotes: idea.upVotes,\n\t\t\t\t\t\t\t\t\tdownVotes: idea.downVotes,\n\t\t\t\t\t\t\t\t\tvetoCount: idea.vetoCount,\n\t\t\t\t\t\t\t\t\tapprovalThreshold: idea.approvalThreshold,\n\t\t\t\t\t\t\t\t\tvetoThreshold: idea.vetoThreshold,\n\t\t\t\t\t\t\t\t\tdescription: idea.description,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"propose\": {\n\t\t\t\t\tif (!args.title) error(\"ARGS_REQUIRED\", \"Title required\");\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"proposeIdea\", {\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t\tcategory: args.category || \"general\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ proposed: true, title: args.title });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"idea_proposed\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\t\tcategory: args.category || \"general\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"vote\": {\n\t\t\t\t\tconst ideaId = args.id;\n\t\t\t\t\tconst voteType = args.voteType;\n\t\t\t\t\tif (!ideaId || !voteType)\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Idea ID and vote type required\");\n\t\t\t\t\tif (![\"up\", \"down\", \"veto\"].includes(voteType.toLowerCase())) {\n\t\t\t\t\t\terror(\"INVALID_VOTE_TYPE\", \"Vote type must be: up, down, veto\");\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"voteIdea\", {\n\t\t\t\t\t\t\t\t\tideaId: BigInt(ideaId),\n\t\t\t\t\t\t\t\t\tvoteType: VoteType.fromString(voteType),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ voted: true, ideaId, voteType });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"idea_voted\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tideaId,\n\t\t\t\t\t\t\t\t\t\tvoteType,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: list, propose, vote, get\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import type { MessageType as MessageTypeTag } from \"~/module_bindings/types.js\";\nimport {\n\ttype Channel,\n\tCommandContext,\n\tcallReducer,\n\ttype Message,\n\ttype Project,\n\ttype ProjectMessage,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { MessageType } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport interface MessageCommandArgs {\n\taction?: string;\n\ttarget?: string;\n\tcontent?: string;\n\ttype?: string;\n\tcontext?: string;\n\tlimit?: string;\n\twallet?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst isNumeric = (str: string): boolean => /^\\d+$/.test(str);\nconst matchesContext = (\n\tmessage: Message | ProjectMessage,\n\tcontext?: string,\n): boolean => {\n\tif (!context) return true;\n\tconst normalized = context.trim();\n\tif (!normalized) return true;\n\treturn (\n\t\tmessage.id.toString() === normalized ||\n\t\t(message.contextId || \"\") === normalized\n\t);\n};\n\nconst isUserMessage = (messageType: MessageTypeTag): boolean =>\n\tMessageType.is.user(messageType);\nconst isDirectiveMessage = (messageType: MessageTypeTag): boolean =>\n\tMessageType.is.directive(messageType);\n\nexport const runMessageAction = async (\n\targs: MessageCommandArgs,\n): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Message action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"list\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst limit = parseInt(args.limit || \"20\", 10);\n\t\t\t\tif (!Number.isFinite(limit) || limit <= 0) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\n\t\t\t\tlet messages: (Message | ProjectMessage)[] = [];\n\t\t\t\tlet targetLabel = \"all\";\n\n\t\t\t\tif (targetInput) {\n\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\tconst projectMessages =\n\t\t\t\t\t\t\tctx.iter<ProjectMessage>(\"project_messages\");\n\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\n\t\t\t\t\t\tmessages = projectMessages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\tm.projectId === projectId && isUserMessage(m.messageType),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const }));\n\t\t\t\t\t\ttargetLabel = project\n\t\t\t\t\t\t\t? `project:${project.name}`\n\t\t\t\t\t\t\t: `project:${projectId}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t(c) => c.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (channel) {\n\t\t\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\t\t\tmessages = channelMessages\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\t\tm.channelId === channel.id && isUserMessage(m.messageType),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const }));\n\t\t\t\t\t\t\ttargetLabel = `#${channel.name}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\tconst projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n\t\t\t\t\tmessages = [\n\t\t\t\t\t\t...channelMessages\n\t\t\t\t\t\t\t.filter((m) => isUserMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const })),\n\t\t\t\t\t\t...projectMessages\n\t\t\t\t\t\t\t.filter((m) => isUserMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const })),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tmessages = messages.filter((m) => matchesContext(m, args.context));\n\n\t\t\t\tmessages.sort((a, b) => {\n\t\t\t\t\tconst aTime = toMicros(a.createdAt);\n\t\t\t\t\tconst bTime = toMicros(b.createdAt);\n\t\t\t\t\tif (aTime < bTime) return 1;\n\t\t\t\t\tif (aTime > bTime) return -1;\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\t\tmessages = messages.slice(0, limit);\n\n\t\t\t\tconst channelMap = new Map(\n\t\t\t\t\tchannels.map((c) => [c.id.toString(), c.name]),\n\t\t\t\t);\n\t\t\t\tconst projectMap = new Map(\n\t\t\t\t\tprojects.map((p) => [p.id.toString(), p.name]),\n\t\t\t\t);\n\n\t\t\t\tsuccess({ messages, count: messages.length, target: targetLabel });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"messages\",\n\t\t\t\t\t\t\tmessages.map((m) => {\n\t\t\t\t\t\t\t\tconst isProject = \"_type\" in m && m._type === \"project\";\n\t\t\t\t\t\t\t\tconst location = isProject\n\t\t\t\t\t\t\t\t\t? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n\t\t\t\t\t\t\t\t\t: `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: m.id.toString(),\n\t\t\t\t\t\t\t\t\tlocation,\n\t\t\t\t\t\t\t\t\tsenderId: m.senderId,\n\t\t\t\t\t\t\t\t\tcontent:\n\t\t\t\t\t\t\t\t\t\tm.content.slice(0, 50) +\n\t\t\t\t\t\t\t\t\t\t(m.content.length > 50 ? \"...\" : \"\"),\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.display(m.messageType),\n\t\t\t\t\t\t\t\t\tcontextId: m.contextId || null,\n\t\t\t\t\t\t\t\t\tcreatedAt: formatTimestamp(m.createdAt),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"directives\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst limit = parseInt(args.limit || \"20\", 10);\n\t\t\t\tif (!Number.isFinite(limit) || limit <= 0) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\n\t\t\t\tlet messages: (Message | ProjectMessage)[] = [];\n\t\t\t\tlet targetLabel = \"all\";\n\n\t\t\t\tif (targetInput) {\n\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\tconst projectMessages =\n\t\t\t\t\t\t\tctx.iter<ProjectMessage>(\"project_messages\");\n\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\n\t\t\t\t\t\tmessages = projectMessages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\tm.projectId === projectId &&\n\t\t\t\t\t\t\t\t\tisDirectiveMessage(m.messageType),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const }));\n\t\t\t\t\t\ttargetLabel = project\n\t\t\t\t\t\t\t? `project:${project.name}`\n\t\t\t\t\t\t\t: `project:${projectId}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t(c) => c.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (channel) {\n\t\t\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\t\t\tmessages = channelMessages\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\t\tm.channelId === channel.id &&\n\t\t\t\t\t\t\t\t\t\tisDirectiveMessage(m.messageType),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const }));\n\t\t\t\t\t\t\ttargetLabel = `#${channel.name}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\tconst projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n\t\t\t\t\tmessages = [\n\t\t\t\t\t\t...channelMessages\n\t\t\t\t\t\t\t.filter((m) => isDirectiveMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const })),\n\t\t\t\t\t\t...projectMessages\n\t\t\t\t\t\t\t.filter((m) => isDirectiveMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const })),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tmessages = messages.filter((m) => matchesContext(m, args.context));\n\n\t\t\t\tmessages.sort((a, b) => {\n\t\t\t\t\tconst aTime = toMicros(a.createdAt);\n\t\t\t\t\tconst bTime = toMicros(b.createdAt);\n\t\t\t\t\tif (aTime < bTime) return 1;\n\t\t\t\t\tif (aTime > bTime) return -1;\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\t\tmessages = messages.slice(0, limit);\n\n\t\t\t\tconst channelMap = new Map(\n\t\t\t\t\tchannels.map((c) => [c.id.toString(), c.name]),\n\t\t\t\t);\n\t\t\t\tconst projectMap = new Map(\n\t\t\t\t\tprojects.map((p) => [p.id.toString(), p.name]),\n\t\t\t\t);\n\n\t\t\t\tsuccess({ messages, count: messages.length, target: targetLabel });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"directives\",\n\t\t\t\t\t\t\tmessages.map((m) => {\n\t\t\t\t\t\t\t\tconst isProject = \"_type\" in m && m._type === \"project\";\n\t\t\t\t\t\t\t\tconst location = isProject\n\t\t\t\t\t\t\t\t\t? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n\t\t\t\t\t\t\t\t\t: `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: m.id.toString(),\n\t\t\t\t\t\t\t\t\tlocation,\n\t\t\t\t\t\t\t\t\tsenderId: m.senderId,\n\t\t\t\t\t\t\t\t\tcontent:\n\t\t\t\t\t\t\t\t\t\tm.content.slice(0, 50) +\n\t\t\t\t\t\t\t\t\t\t(m.content.length > 50 ? \"...\" : \"\"),\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.display(m.messageType),\n\t\t\t\t\t\t\t\t\tcontextId: m.contextId || null,\n\t\t\t\t\t\t\t\t\tcreatedAt: formatTimestamp(m.createdAt),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"directive\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst content = args.content;\n\t\t\t\tif (!targetInput || !content) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\"Target and directive content required. Usage: probe message directive <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\t\t\t\t\"project_channels\",\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\t\t\t\t\t\t\t\tif (!project) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst projectChannel = projectChannels.find(\n\t\t\t\t\t\t\t\t\t(pc) => pc.projectId === projectId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!projectChannel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project channel for '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendProjectMessage\", {\n\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(\"directive\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tprojectId: projectId.toString(),\n\t\t\t\t\t\t\t\t\tprojectName: project.name,\n\t\t\t\t\t\t\t\t\tmessageType: \"directive\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"directive_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `project:${project.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t\t\t\tc.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendMessage\", {\n\t\t\t\t\t\t\t\t\tchannelId: channel.id,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(\"directive\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tchannelId: channel.id.toString(),\n\t\t\t\t\t\t\t\t\tchannelName: channel.name,\n\t\t\t\t\t\t\t\t\tmessageType: \"directive\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"directive_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `#${channel.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"send\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst content = args.content;\n\t\t\t\tif (!targetInput || !content) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\"Target and message content required. Usage: probe message send <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif ((args.type || \"user\").toLowerCase() === \"directive\") {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_TYPE\",\n\t\t\t\t\t\t\"'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\t\t\t\t\"project_channels\",\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\t\t\t\t\t\t\t\tif (!project) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst projectChannel = projectChannels.find(\n\t\t\t\t\t\t\t\t\t(pc) => pc.projectId === projectId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!projectChannel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project channel for '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendProjectMessage\", {\n\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(args.type || \"user\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tprojectId: projectId.toString(),\n\t\t\t\t\t\t\t\t\tprojectName: project.name,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"message_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `project:${project.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tmessageType: args.type || \"user\",\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t\t\t\tc.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendMessage\", {\n\t\t\t\t\t\t\t\t\tchannelId: channel.id,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(args.type || \"user\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tchannelId: channel.id.toString(),\n\t\t\t\t\t\t\t\t\tchannelName: channel.name,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"message_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `#${channel.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tmessageType: args.type || \"user\",\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"channels\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\"project_channels\",\n\t\t\t\t);\n\n\t\t\t\tconst projectChannelSet = new Set(\n\t\t\t\t\tprojectChannels.map((pc) => pc.projectId.toString()),\n\t\t\t\t);\n\t\t\t\tconst projectsWithChannels = projects.filter((p) =>\n\t\t\t\t\tprojectChannelSet.has(p.id.toString()),\n\t\t\t\t);\n\n\t\t\t\tsuccess({\n\t\t\t\t\tchannels,\n\t\t\t\t\tprojects: projectsWithChannels,\n\t\t\t\t\tchannelCount: channels.length,\n\t\t\t\t\tprojectCount: projectsWithChannels.length,\n\t\t\t\t});\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"channels\",\n\t\t\t\t\t\t\tchannels.map((c) => ({\n\t\t\t\t\t\t\t\tid: c.id.toString(),\n\t\t\t\t\t\t\t\tname: c.name,\n\t\t\t\t\t\t\t\tcreatedBy: c.createdBy,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"projects\",\n\t\t\t\t\t\t\tprojectsWithChannels.map((p) => ({\n\t\t\t\t\t\t\t\tid: p.id.toString(),\n\t\t\t\t\t\t\t\tname: p.name,\n\t\t\t\t\t\t\t\trepo: p.githubRepo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: list, send, directive, directives, channels\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport {\n\ttype MessageCommandArgs,\n\trunMessageAction,\n} from \"./message-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"message\", description: \"Message management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, send, directive, directives, channels\",\n\t\t\trequired: false,\n\t\t},\n\t\ttarget: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Channel name, project ID, or message content\",\n\t\t\trequired: false,\n\t\t},\n\t\tcontent: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Message content (if target is channel/project)\",\n\t\t\trequired: false,\n\t\t},\n\t\ttype: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Message type: user, system\",\n\t\t\tdefault: \"user\",\n\t\t},\n\t\tcontext: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Thread context ID (message ID or entity ref like task:42)\",\n\t\t},\n\t\tlimit: { type: \"string\", description: \"Limit messages\", default: \"20\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe message\",\n\t\t\t\tdescription: \"Channel and project messaging commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe message <action> [target] [content] [options]\",\n\t\t\t\t\t\"probe message list --limit 50\",\n\t\t\t\t\t'probe message send general \"hello team\"',\n\t\t\t\t\t'probe message directive zoe \"Focus on project stability\" --context project:1',\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"list [target]\",\n\t\t\t\t\t\tdetail: \"List user messages (all, channel, or project)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"directives [target]\",\n\t\t\t\t\t\tdetail: \"List directive messages (all, channel, or project)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"send <target> <content>\",\n\t\t\t\t\t\tdetail: \"Send to target channel/project\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"directive <target> <content>\",\n\t\t\t\t\t\tdetail: \"Send directive to target channel/project\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"channels\", detail: \"List channels and project channels\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--type\",\n\t\t\t\t\t\tdetail: \"Message type: user, system (default: user)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--context\",\n\t\t\t\t\t\tdetail: \"Optional thread context ID (message ID or entity ref)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--limit\",\n\t\t\t\t\t\tdetail: \"Max messages returned for list (default: 20)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for send\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\texamples: [\n\t\t\t\t\t\"probe message send general hello\",\n\t\t\t\t\t'probe message directive zoe \"Pause new work\" --context project:1',\n\t\t\t\t\t\"probe message directives zoe --limit 1\",\n\t\t\t\t\t'probe message send zoe \"hello there\"',\n\t\t\t\t\t'probe message send zoe \"reviewed\" --context 123',\n\t\t\t\t\t'probe message send 1 \"project update\"',\n\t\t\t\t\t\"probe message list zoe --limit 10\",\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Quotes are only required when target/content contains spaces.\",\n\t\t\t\t\t\"Use `probe message channels` to discover available channel names and project IDs.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runMessageAction(args as MessageCommandArgs);\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype Project,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { ProjectStatus } from \"~/utils/enums.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"project\", description: \"Project commands\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, get, create, status, set-status\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Project ID\", required: false },\n\t\tvalue: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Status value for set-status: active|paused\",\n\t\t\trequired: false,\n\t\t},\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit projects returned\" },\n\t\tname: { type: \"string\", description: \"Project name\" },\n\t\tdescription: { type: \"string\", description: \"Project description\" },\n\t\t\"github-repo\": { type: \"string\", description: \"GitHub repository URL\" },\n\t\t\"source-idea\": { type: \"string\", description: \"Source idea ID\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe project\",\n\t\t\t\tdescription: \"Project listing and lookup commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe project <action> [options]\",\n\t\t\t\t\t\"probe project list --status active\",\n\t\t\t\t\t\"probe project get 1\",\n\t\t\t\t\t\"probe project status 1\",\n\t\t\t\t\t\"probe project set-status 1 paused --wallet admin-wallet\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List projects with optional status filter\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one project by ID\" },\n\t\t\t\t\t{ name: \"create\", detail: \"Create a new project\" },\n\t\t\t\t\t{ name: \"status <id>\", detail: \"Show only project status\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"set-status <id> <active|paused>\",\n\t\t\t\t\t\tdetail: \"Update project status (admin/zoe)\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--status\", detail: \"Status filter for list: active|paused\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max projects returned for list\" },\n\t\t\t\t\t{ name: \"--name\", detail: \"Project name (create)\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Project description (create)\" },\n\t\t\t\t\t{ name: \"--github-repo\", detail: \"GitHub repository URL (create)\" },\n\t\t\t\t\t{ name: \"--source-idea\", detail: \"Source idea ID (create)\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Only admin/zoe identities can call set-status.\",\n\t\t\t\t\t\"Find idea IDs with `probe idea list` before using --source-idea.\",\n\t\t\t\t\t\"Find project IDs with `probe project list` before using get/create follow-up commands.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status)\n\t\t\t\t\t\tprojects = projects.filter((p) =>\n\t\t\t\t\t\t\tProjectStatus.matches(p.status, args.status as string),\n\t\t\t\t\t\t);\n\t\t\t\t\tprojects = projects.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) projects = projects.slice(0, limit);\n\n\t\t\t\t\tsuccess({ projects, count: projects.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"projects\",\n\t\t\t\t\t\t\t\tprojects.map((p) => ({\n\t\t\t\t\t\t\t\t\tid: p.id,\n\t\t\t\t\t\t\t\t\tname: p.name,\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.display(p.status),\n\t\t\t\t\t\t\t\t\tgithubRepo: p.githubRepo,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tif (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst project = ctx\n\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t.find((p) => p.id.toString() === projectId);\n\t\t\t\t\tif (!project)\n\t\t\t\t\t\terror(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n\t\t\t\t\tsuccess(project);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"project\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: project.id.toString(),\n\t\t\t\t\t\t\t\t\tname: project.name,\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.display(project.status),\n\t\t\t\t\t\t\t\t\tgithubRepo: project.githubRepo,\n\t\t\t\t\t\t\t\t\tdescription: project.description,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tif (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst project = ctx\n\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t.find((p) => p.id.toString() === projectId);\n\t\t\t\t\tif (!project)\n\t\t\t\t\t\terror(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n\t\t\t\t\tconst status = ProjectStatus.display(project.status);\n\t\t\t\t\tsuccess({ projectId, status });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"project_status\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: project.id.toString(),\n\t\t\t\t\t\t\t\t\tname: project.name,\n\t\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"create\": {\n\t\t\t\t\tif (!args.name || !args[\"github-repo\"] || !args[\"source-idea\"]) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\t\"--name, --github-repo, and --source-idea required\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"createProject\", {\n\t\t\t\t\t\t\t\t\tsourceIdeaId: BigInt(args[\"source-idea\"] as string),\n\t\t\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\tcreated: true,\n\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\tsourceIdeaId: args[\"source-idea\"],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"project_created\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\t\t\t\tsourceIdeaId: args[\"source-idea\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"set-status\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tconst nextStatus = args.value;\n\t\t\t\t\tif (!projectId || !nextStatus) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\t\"Project ID and status required. Use: probe project set-status <id> <active|paused>\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst normalized = nextStatus.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\t\t\t\tif (![\"active\", \"paused\"].includes(normalized)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_STATUS\",\n\t\t\t\t\t\t\t`Invalid status: ${nextStatus}. Use: active, paused`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"updateProjectStatus\", {\n\t\t\t\t\t\t\t\t\tprojectId: BigInt(projectId),\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.fromString(nextStatus),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess({ updated: true, projectId, status: normalized });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"project_status_updated\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: list, get, create, status, set-status\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import {\n\tCommandContext,\n\tcallReducer,\n\ttype Project,\n\ttype Task,\n\ttype TaskDependency,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { TaskStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport interface TaskCommandArgs {\n\taction?: string;\n\tid?: string;\n\tstatus?: string;\n\tproject?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tpriority?: string;\n\tassigned?: boolean;\n\twallet?: string;\n\t\"github-pr-url\"?: string;\n\t\"github-issue-url\"?: string;\n\t\"add-dep\"?: string;\n\tlist?: boolean;\n\ttimeout?: string;\n\tlimit?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst normalizeGitHubRepoUrl = (githubRepo: string): string | undefined => {\n\tconst value = githubRepo.trim().replace(/\\.git$/i, \"\");\n\tif (!value) return undefined;\n\n\tif (/^[\\w.-]+\\/[\\w.-]+$/.test(value)) {\n\t\treturn `https://github.com/${value}`;\n\t}\n\n\tconst sshMatch = value.match(/^git@github\\.com:([\\w.-]+\\/[\\w.-]+)$/i);\n\tif (sshMatch) {\n\t\treturn `https://github.com/${sshMatch[1]}`;\n\t}\n\n\tif (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n\t\ttry {\n\t\t\tconst parsed = new URL(value);\n\t\t\tif (parsed.hostname !== \"github.com\") return undefined;\n\t\t\tconst parts = parsed.pathname.split(\"/\").filter(Boolean);\n\t\t\tif (parts.length < 2) return undefined;\n\t\t\treturn `https://github.com/${parts[0]}/${parts[1]}`;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const runTaskAction = async (args: TaskCommandArgs): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Task action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"list\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tlet tasks = ctx.iter<Task>(\"tasks\");\n\t\t\t\tconst statusFilter = args.status;\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tif (statusFilter)\n\t\t\t\t\ttasks = tasks.filter((t) =>\n\t\t\t\t\t\tTaskStatus.matches(t.status, statusFilter),\n\t\t\t\t\t);\n\t\t\t\tif (args.project)\n\t\t\t\t\ttasks = tasks.filter((t) => t.projectId.toString() === args.project);\n\t\t\t\tif (args.assigned) tasks = tasks.filter((t) => t.assignedTo);\n\t\t\t\ttasks = tasks.sort((a, b) => {\n\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t});\n\t\t\t\tif (limit !== undefined) tasks = tasks.slice(0, limit);\n\n\t\t\t\tsuccess({ tasks, count: tasks.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\ttasks.map((t) => ({\n\t\t\t\t\t\t\t\tid: t.id.toString(),\n\t\t\t\t\t\t\t\ttitle: t.title,\n\t\t\t\t\t\t\t\tstatus: TaskStatus.display(t.status),\n\t\t\t\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\t\t\t\tassignedTo: t.assignedTo || \"\",\n\t\t\t\t\t\t\t\tprojectId: t.projectId,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"ready\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst tasks = ctx.iter<Task>(\"tasks\");\n\t\t\t\tconst deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n\t\t\t\tconst taskById = new Map(tasks.map((t) => [t.id.toString(), t]));\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tconst ready = tasks\n\t\t\t\t\t.filter((t) => TaskStatus.is.open(t.status))\n\t\t\t\t\t.filter((t) => {\n\t\t\t\t\t\tconst incomingDeps = deps.filter((dep) => dep.taskId === t.id);\n\t\t\t\t\t\tconst hasOpenBlocker = incomingDeps.some((dep) => {\n\t\t\t\t\t\t\tconst depTag =\n\t\t\t\t\t\t\t\ttypeof dep.dependencyType === \"string\"\n\t\t\t\t\t\t\t\t\t? dep.dependencyType\n\t\t\t\t\t\t\t\t\t: dep.dependencyType.tag;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tdepTag !== \"Blocks\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"ParentChild\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"blocks\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"parent-child\"\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tconst blocker = taskById.get(dep.dependsOnId.toString());\n\t\t\t\t\t\t\tif (!blocker) return false;\n\t\t\t\t\t\t\treturn !TaskStatus.is.completed(blocker.status);\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn !hasOpenBlocker;\n\t\t\t\t\t})\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(t) => !args.project || t.projectId.toString() === args.project,\n\t\t\t\t\t)\n\t\t\t\t\t.filter((t) => !args.assigned || Boolean(t.assignedTo))\n\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\tif (a.priority !== b.priority) return a.priority - b.priority;\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros < bMicros) return -1;\n\t\t\t\t\t\tif (aMicros > bMicros) return 1;\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\n\t\t\t\tconst readyTasks = (\n\t\t\t\t\tlimit !== undefined ? ready.slice(0, limit) : ready\n\t\t\t\t).map((t) => ({\n\t\t\t\t\tid: t.id.toString(),\n\t\t\t\t\ttitle: t.title,\n\t\t\t\t\tstatus: t.status.tag.toLowerCase(),\n\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\tassignedTo: t.assignedTo || \"\",\n\t\t\t\t\tprojectId: t.projectId.toString(),\n\t\t\t\t\tblockedBy: [] as string[],\n\t\t\t\t}));\n\n\t\t\t\tsuccess({ tasks: readyTasks, count: readyTasks.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\treadyTasks.map((t) => ({\n\t\t\t\t\t\t\t\tid: t.id,\n\t\t\t\t\t\t\t\ttitle: t.title,\n\t\t\t\t\t\t\t\tstatus: t.status,\n\t\t\t\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\t\t\t\tassignedTo: t.assignedTo,\n\t\t\t\t\t\t\t\tprojectId: t.projectId,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"get\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst task = ctx\n\t\t\t\t\t.iter<Task>(\"tasks\")\n\t\t\t\t\t.find((t) => t.id.toString() === taskId);\n\t\t\t\tif (!task) error(\"TASK_NOT_FOUND\", `Task not found: ${taskId}`);\n\n\t\t\t\tsuccess(task);\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\"task\", [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: task.id.toString(),\n\t\t\t\t\t\t\t\ttitle: task.title,\n\t\t\t\t\t\t\t\tstatus: TaskStatus.display(task.status),\n\t\t\t\t\t\t\t\tpriority: task.priority,\n\t\t\t\t\t\t\t\tassignedTo: task.assignedTo || \"\",\n\t\t\t\t\t\t\t\tprojectId: task.projectId.toString(),\n\t\t\t\t\t\t\t\tgithubIssueUrl: task.githubIssueUrl || \"\",\n\t\t\t\t\t\t\t\tgithubPrUrl: task.githubPrUrl || \"\",\n\t\t\t\t\t\t\t\tdescription: task.description,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"create\": {\n\t\t\t\tif (!args.project || !args.title)\n\t\t\t\t\terror(\"ARGS_REQUIRED\", \"--project and --title required\");\n\n\t\t\t\tconst priority = parseInt(args.priority || \"5\", 10);\n\t\t\t\tif (priority < 1 || priority > 10)\n\t\t\t\t\terror(\"INVALID_PRIORITY\", \"Priority must be 1-10\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"createTask\", {\n\t\t\t\t\t\t\t\tprojectId: BigInt(args.project as string),\n\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\tpriority,\n\t\t\t\t\t\t\t\tsourceIdeaId: undefined,\n\t\t\t\t\t\t\t\tgithubIssueUrl: args[\"github-issue-url\"],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tcreated: true,\n\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\tissue: args[\"github-issue-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_created\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tgithubIssueUrl: args[\"github-issue-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"claim\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tlet repositoryUrl: string | undefined;\n\t\t\t\t\tlet contributingUrl: string | undefined;\n\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"claimTask\", { taskId: BigInt(taskId) });\n\n\t\t\t\t\t\t\tconst task = ctx\n\t\t\t\t\t\t\t\t.iter<Task>(\"tasks\")\n\t\t\t\t\t\t\t\t.find((t) => t.id.toString() === taskId);\n\t\t\t\t\t\t\tconst project = task\n\t\t\t\t\t\t\t\t? ctx\n\t\t\t\t\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t\t\t\t\t.find((p) => p.id === task.projectId)\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\tif (project?.githubRepo) {\n\t\t\t\t\t\t\t\trepositoryUrl = normalizeGitHubRepoUrl(project.githubRepo);\n\t\t\t\t\t\t\t\tif (repositoryUrl) {\n\t\t\t\t\t\t\t\t\tcontributingUrl = `${repositoryUrl}/blob/main/CONTRIBUTING.md`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tclaimed: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\trepositoryUrl,\n\t\t\t\t\t\tcontributingUrl,\n\t\t\t\t\t\tnextSteps: [\n\t\t\t\t\t\t\trepositoryUrl\n\t\t\t\t\t\t\t\t? `Fork the target repository: ${repositoryUrl}`\n\t\t\t\t\t\t\t\t: \"Fork the target repository to your GitHub account using gh cli\",\n\t\t\t\t\t\t\tcontributingUrl\n\t\t\t\t\t\t\t\t? `Read CONTRIBUTING.md before starting: ${contributingUrl}`\n\t\t\t\t\t\t\t\t: \"Read CONTRIBUTING.md in the target repository before starting\",\n\t\t\t\t\t\t\t\"Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_claimed\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\trepositoryUrl: repositoryUrl || \"\",\n\t\t\t\t\t\t\t\t\tcontributingUrl: contributingUrl || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t\t\tconsole.log(\"Next steps:\");\n\t\t\t\t\t\tif (repositoryUrl) {\n\t\t\t\t\t\t\tconsole.log(`1. Fork the target repository: ${repositoryUrl}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"1. Fork the target repository to your GitHub account\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (contributingUrl) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`2. Read CONTRIBUTING.md before starting: ${contributingUrl}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"2. Read CONTRIBUTING.md in the target repository before starting\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"update\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\t\t\t\tif (!args.status && !args[\"github-pr-url\"])\n\t\t\t\t\terror(\"UPDATE_REQUIRED\", \"--status or --github-pr-url required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateTaskStatus\", {\n\t\t\t\t\t\t\t\ttaskId: BigInt(taskId),\n\t\t\t\t\t\t\t\tstatus: args.status\n\t\t\t\t\t\t\t\t\t? TaskStatus.fromString(args.status)\n\t\t\t\t\t\t\t\t\t: (undefined as never),\n\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"],\n\t\t\t\t\t\t\t\tarchiveReason: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tupdated: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tstatus: args.status,\n\t\t\t\t\t\tpr: args[\"github-pr-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_updated\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\tstatus: args.status || \"\",\n\t\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"review\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateTaskStatus\", {\n\t\t\t\t\t\t\t\ttaskId: BigInt(taskId),\n\t\t\t\t\t\t\t\tstatus: { tag: \"Review\" },\n\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"],\n\t\t\t\t\t\t\t\tarchiveReason: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\treviewed: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tstatus: \"review\",\n\t\t\t\t\t\tpr: args[\"github-pr-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_review\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\tstatus: \"review\",\n\t\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"deps\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\t\t\t\tconst taskIdBigInt = BigInt(taskId);\n\n\t\t\t\tif (args[\"add-dep\"]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"addTaskDependency\", {\n\t\t\t\t\t\t\t\t\ttaskId: taskIdBigInt,\n\t\t\t\t\t\t\t\t\tdependsOnId: BigInt(args[\"add-dep\"] as string),\n\t\t\t\t\t\t\t\t\tdependencyType: { tag: \"Blocks\" },\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ added: true, taskId, dependsOn: args[\"add-dep\"] });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"dependency_added\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\t\tdependsOnId: args[\"add-dep\"],\n\t\t\t\t\t\t\t\t\t\tdependencyType: \"blocks\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (args.list) {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n\t\t\t\t\tconst taskDeps = deps.filter(\n\t\t\t\t\t\t(d) => d.taskId === taskIdBigInt || d.dependsOnId === taskIdBigInt,\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({ dependencies: taskDeps });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"task_dependencies\",\n\t\t\t\t\t\t\t\ttaskDeps.map((dep) => ({\n\t\t\t\t\t\t\t\t\tid: dep.id.toString(),\n\t\t\t\t\t\t\t\t\ttaskId: dep.taskId.toString(),\n\t\t\t\t\t\t\t\t\tdependsOnId: dep.dependsOnId.toString(),\n\t\t\t\t\t\t\t\t\tdependencyType: dep.dependencyType,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"DEPS_ACTION_REQUIRED\",\n\t\t\t\t\t\t\"Use --add-dep <taskId> to add a dependency or --list to view dependencies\",\n\t\t\t\t\t\t\"Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"watch\": {\n\t\t\t\tconst timeout = Math.min(parseInt(args.timeout || \"60\", 10), 300);\n\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"task_watch\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttimeoutSeconds: timeout,\n\t\t\t\t\t\t\t\t\t\tstatusFilter: args.status || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst waitForStop = new Promise<void>((resolve) => {\n\t\t\t\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\t\t\t\tprocess.off(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}, timeout * 1000);\n\n\t\t\t\t\t\t\tconst onSignal = () => {\n\t\t\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tprocess.on(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\tprocess.on(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tctx.db.tasks.onInsert((_ctx, task) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!args.status ||\n\t\t\t\t\t\t\t\tTaskStatus.matches(task.status, args.status)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"tasks\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: task.id.toString(),\n\t\t\t\t\t\t\t\t\t\t\ttitle: task.title,\n\t\t\t\t\t\t\t\t\t\t\tchange_type: \"created\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tctx.db.tasks.onUpdate((_ctx, _old, newTask) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!args.status ||\n\t\t\t\t\t\t\t\tTaskStatus.matches(newTask.status, args.status)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"tasks\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: newTask.id.toString(),\n\t\t\t\t\t\t\t\t\t\t\ttitle: newTask.title,\n\t\t\t\t\t\t\t\t\t\t\tchange_type: \"updated\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait waitForStop;\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: list, ready, get, create, claim, update, review, deps, watch\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { runTaskAction, type TaskCommandArgs } from \"./task-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"task\", description: \"Task management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription:\n\t\t\t\t\"Action: list, ready, get, create, claim, update, review, deps, watch\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Task ID\", required: false },\n\t\tstatus: { type: \"string\", description: \"Status filter or new status\" },\n\t\tproject: { type: \"string\", description: \"Project ID\" },\n\t\ttitle: { type: \"string\", description: \"Task title\" },\n\t\tdescription: { type: \"string\", description: \"Task description\" },\n\t\tpriority: { type: \"string\", description: \"Priority 1-10\" },\n\t\tassigned: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Show only assigned tasks\",\n\t\t\tdefault: false,\n\t\t},\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\t\"github-pr-url\": { type: \"string\", description: \"GitHub PR URL\" },\n\t\t\"github-issue-url\": { type: \"string\", description: \"GitHub issue URL\" },\n\t\t\"add-dep\": { type: \"string\", description: \"Add dependency task ID\" },\n\t\tlist: { type: \"boolean\", description: \"List dependencies\", default: false },\n\t\ttimeout: { type: \"string\", description: \"Watch timeout (seconds)\" },\n\t\tlimit: { type: \"string\", description: \"Limit rows for list/ready\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe task\",\n\t\t\t\tdescription: \"Task management commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe task <action> [options]\",\n\t\t\t\t\t\"probe task list --project 1 --status open\",\n\t\t\t\t\t'probe task create --project 1 --title \"Fix bug\" --priority 5',\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List tasks with optional filters\" },\n\t\t\t\t\t{ name: \"ready\", detail: \"List immediately claimable open tasks\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one task\" },\n\t\t\t\t\t{ name: \"create\", detail: \"Create a new task\" },\n\t\t\t\t\t{ name: \"claim <id>\", detail: \"Claim a task for your identity\" },\n\t\t\t\t\t{ name: \"update <id>\", detail: \"Update status and optional PR URL\" },\n\t\t\t\t\t{ name: \"review <id>\", detail: \"Mark a task as ready for review\" },\n\t\t\t\t\t{ name: \"deps <id>\", detail: \"List or add task dependencies\" },\n\t\t\t\t\t{ name: \"watch\", detail: \"Watch task changes in real time\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--project\", detail: \"Project ID\" },\n\t\t\t\t\t{ name: \"--title\", detail: \"Task title (create)\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Task description\" },\n\t\t\t\t\t{ name: \"--priority\", detail: \"Priority from 1 to 10 (default: 5)\" },\n\t\t\t\t\t{ name: \"--status\", detail: \"Filter or new status\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Limit rows for list/ready\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--github-pr-url\",\n\t\t\t\t\t\tdetail: \"GitHub PR URL for update/review\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--github-issue-url\", detail: \"GitHub issue URL for create\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Use full long-form flags only; short aliases are intentionally disabled.\",\n\t\t\t\t\t\"Find project IDs with `probe project list`; find task IDs with `probe task list`.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runTaskAction(args as TaskCommandArgs);\n\t},\n});\n","import { createWriteStream, type WriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { createConsola } from \"consola\";\nimport { type Agent, callReducer, withAuth } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\n\nconst HEARTBEAT_INTERVAL_MS = 60_000;\nconst HEARTBEAT_JITTER_MS = 5_000;\nconst HEARTBEAT_FAILURE_THRESHOLD = 3;\nconst RECONNECT_BASE_MS = 1_000;\nconst RECONNECT_MAX_MS = 30_000;\n\nconst OBSERVED_TABLES = [\n\t{ key: \"agents\", name: \"agents\" },\n\t{ key: \"tasks\", name: \"tasks\" },\n\t{ key: \"ideas\", name: \"ideas\" },\n\t{ key: \"messages\", name: \"messages\" },\n\t{ key: \"channels\", name: \"channels\" },\n\t{ key: \"projects\", name: \"projects\" },\n\t{ key: \"votes\", name: \"votes\" },\n\t{ key: \"discovered_tasks\", name: \"discovered_tasks\" },\n\t{ key: \"task_dependencies\", name: \"task_dependencies\" },\n\t{ key: \"identity_roles\", name: \"identity_roles\" },\n\t{ key: \"config\", name: \"config\" },\n\t{ key: \"project_channels\", name: \"project_channels\" },\n\t{ key: \"project_messages\", name: \"project_messages\" },\n] as const;\n\ntype DaemonEvent = {\n\ttype: string;\n\tsource: \"nexus\";\n\tat: string;\n\t[key: string]: unknown;\n};\n\ntype SessionEnd = {\n\treason: \"disconnected\" | \"heartbeat_failed\" | \"stop\";\n\tdetails?: unknown;\n};\n\ntype LogLevel = \"critical\" | \"info\" | \"debug\";\n\ntype ObservableTable = {\n\tonInsert?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n\tonUpdate?: (\n\t\tcb: (_ctx: unknown, oldRow: unknown, newRow: unknown) => void,\n\t) => void;\n\tonDelete?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n};\n\nconst CRITICAL_EVENTS = new Set([\n\t\"connected\",\n\t\"ready\",\n\t\"disconnected\",\n\t\"reconnecting\",\n\t\"reconnected\",\n\t\"subscription_applied\",\n\t\"subscription_error\",\n\t\"auth_failed\",\n\t\"heartbeat_failed\",\n\t\"heartbeat_recovered\",\n\t\"shutdown\",\n]);\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst sleep = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms));\n\nconst withJitter = (baseMs: number): number => {\n\tconst jitter = Math.floor(\n\t\tMath.random() * (HEARTBEAT_JITTER_MS * 2 + 1) - HEARTBEAT_JITTER_MS,\n\t);\n\treturn Math.max(1_000, baseMs + jitter);\n};\n\nconst backoffMs = (attempt: number): number => {\n\tconst base = Math.min(\n\t\tRECONNECT_MAX_MS,\n\t\tRECONNECT_BASE_MS * 2 ** Math.max(0, attempt - 1),\n\t);\n\treturn withJitter(base);\n};\n\nconst normalizeError = (err: unknown): string => {\n\tif (err instanceof Error) {\n\t\treturn err.message;\n\t}\n\treturn String(err);\n};\n\nconst sanitizeValue = (value: unknown): unknown => {\n\tif (value instanceof Error) {\n\t\treturn { name: value.name, message: value.message };\n\t}\n\tif (\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\tvalue === null\n\t) {\n\t\treturn value;\n\t}\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(value, jsonReplacer));\n\t} catch {\n\t\treturn String(value);\n\t}\n};\n\nconst resolveLogLevel = (value: unknown): LogLevel => {\n\tif (value === \"critical\" || value === \"info\" || value === \"debug\") {\n\t\treturn value;\n\t}\n\treturn \"critical\";\n};\n\nconst shouldEmit = (eventType: string, level: LogLevel): boolean => {\n\tif (level === \"debug\") {\n\t\treturn true;\n\t}\n\tif (CRITICAL_EVENTS.has(eventType)) {\n\t\treturn true;\n\t}\n\tif (level === \"info\" && eventType.startsWith(\"heartbeat_\")) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nconst resolveLogStream = async (\n\tpathValue?: string,\n): Promise<WriteStream | null> => {\n\tif (!pathValue) {\n\t\treturn null;\n\t}\n\tconst absolutePath = resolve(pathValue);\n\tawait mkdir(dirname(absolutePath), { recursive: true });\n\treturn createWriteStream(absolutePath, { flags: \"a\" });\n};\n\nconst connectErrorLooksAuthRelated = (message: string): boolean => {\n\tconst lowered = message.toLowerCase();\n\treturn (\n\t\tlowered.includes(\"authentication required\") ||\n\t\tlowered.includes(\"unauthorized\") ||\n\t\tlowered.includes(\"401\")\n\t);\n};\n\nexport const nexusDaemonArgs = {\n\twallet: {\n\t\ttype: \"string\",\n\t\tdescription: \"Wallet name for authenticated connection\",\n\t},\n\thost: {\n\t\ttype: \"string\",\n\t\tdescription: \"SpacetimeDB host override\",\n\t},\n\tmodule: {\n\t\ttype: \"string\",\n\t\tdescription: \"SpacetimeDB module override\",\n\t},\n\tsender: {\n\t\ttype: \"string\",\n\t\tdescription: \"Optional sender filter (debug table events only)\",\n\t},\n\t\"log-file\": {\n\t\ttype: \"string\",\n\t\tdescription: \"Optional path to append JSONL daemon events\",\n\t},\n\t\"log-level\": {\n\t\ttype: \"string\",\n\t\tdescription: \"critical, info, or debug\",\n\t\tdefault: \"critical\",\n\t},\n\tpretty: {\n\t\ttype: \"boolean\",\n\t\tdescription: \"Human-readable lifecycle logs to stderr\",\n\t\tdefault: false,\n\t},\n\tjson: {\n\t\ttype: \"boolean\",\n\t\tdescription: \"Reserved for CLI consistency\",\n\t\tdefault: false,\n\t},\n} as const;\n\nexport async function runNexusDaemon(\n\targs: Record<string, unknown>,\n): Promise<void> {\n\tconst logLevel = resolveLogLevel(args[\"log-level\"]);\n\tconst pretty = !!args.pretty;\n\tconst prettyLogger = pretty\n\t\t? createConsola({\n\t\t\t\tstdout: process.stderr,\n\t\t\t\tstderr: process.stderr,\n\t\t\t})\n\t\t: null;\n\n\tlet logStream: WriteStream | null = null;\n\ttry {\n\t\tlogStream = await resolveLogStream(args[\"log-file\"]);\n\t} catch (err) {\n\t\tconst message = normalizeError(err);\n\t\tconst fallback = JSON.stringify({\n\t\t\tsource: \"nexus\",\n\t\t\tat: nowIso(),\n\t\t\ttype: \"log_file_error\",\n\t\t\tmessage,\n\t\t});\n\t\tconsole.log(fallback);\n\t\treturn;\n\t}\n\n\tconst writeEvent = (event: DaemonEvent): void => {\n\t\tconst line = JSON.stringify(event, jsonReplacer);\n\t\tconsole.log(line);\n\t\tif (logStream) {\n\t\t\tlogStream.write(`${line}\\n`);\n\t\t}\n\t};\n\n\tconst emit = (event: { type: string; [key: string]: unknown }): void => {\n\t\tif (!shouldEmit(event.type, logLevel)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst fullEvent: DaemonEvent = {\n\t\t\tsource: \"nexus\",\n\t\t\tat: nowIso(),\n\t\t\t...event,\n\t\t};\n\n\t\twriteEvent(fullEvent);\n\n\t\tif (!prettyLogger) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst type = String(event.type);\n\t\tif (type === \"connected\") {\n\t\t\tprettyLogger.info(\"Connected to Nexus\");\n\t\t} else if (type === \"reconnected\") {\n\t\t\tprettyLogger.success(\"Reconnected to Nexus\");\n\t\t} else if (type === \"disconnected\") {\n\t\t\tprettyLogger.warn(\"Disconnected from Nexus\");\n\t\t} else if (type === \"reconnecting\") {\n\t\t\tprettyLogger.info(\"Reconnecting to Nexus\");\n\t\t} else if (type === \"auth_failed\") {\n\t\t\tprettyLogger.error(\"Authentication failed\");\n\t\t} else if (type === \"heartbeat_failed\") {\n\t\t\tprettyLogger.warn(\"Heartbeat failed repeatedly\");\n\t\t} else if (type === \"shutdown\") {\n\t\t\tprettyLogger.info(\"Nexus daemon shutting down\");\n\t\t}\n\t};\n\n\tlet stopping = false;\n\tlet stopSignal: \"SIGINT\" | \"SIGTERM\" | null = null;\n\n\tconst stopWaiter = new Promise<void>((resolve) => {\n\t\tconst onSigint = () => {\n\t\t\tif (stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstopping = true;\n\t\t\tstopSignal = \"SIGINT\";\n\t\t\tresolve();\n\t\t};\n\t\tconst onSigterm = () => {\n\t\t\tif (stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstopping = true;\n\t\t\tstopSignal = \"SIGTERM\";\n\t\t\tresolve();\n\t\t};\n\t\tprocess.on(\"SIGINT\", onSigint);\n\t\tprocess.on(\"SIGTERM\", onSigterm);\n\t});\n\n\tlet reconnectAttempt = 0;\n\tlet downtimeStartedAt: number | null = null;\n\tlet hasConnectedOnce = false;\n\n\twhile (!stopping) {\n\t\tlet sessionEnd: SessionEnd | null = null;\n\n\t\ttry {\n\t\t\tawait withAuth(\n\t\t\t\t{\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t\twallet: args.wallet,\n\t\t\t\t\tonDisconnect: (...disconnectArgs: unknown[]) => {\n\t\t\t\t\t\tif (!sessionEnd) {\n\t\t\t\t\t\t\tsessionEnd = {\n\t\t\t\t\t\t\t\treason: \"disconnected\",\n\t\t\t\t\t\t\t\tdetails: disconnectArgs.map(sanitizeValue),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst effectiveWallet = ctx.auth?.wallet || args.wallet || null;\n\t\t\t\t\tconst currentAgent = ctx\n\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t.find(\n\t\t\t\t\t\t\t(a) => a.identity.toHexString() === ctx.identity?.toHexString(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!hasConnectedOnce) {\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"connected\",\n\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\t\twallet: effectiveWallet,\n\t\t\t\t\t\t\thost: args.host || ctx.config.spacetime.host,\n\t\t\t\t\t\t\tmodule: args.module || ctx.config.spacetime.module,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"reconnected\",\n\t\t\t\t\t\t\tattempts: reconnectAttempt,\n\t\t\t\t\t\t\tdowntime_ms: downtimeStartedAt\n\t\t\t\t\t\t\t\t? Date.now() - downtimeStartedAt\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\thasConnectedOnce = true;\n\t\t\t\t\treconnectAttempt = 0;\n\t\t\t\t\tdowntimeStartedAt = null;\n\n\t\t\t\t\temit({ type: \"subscription_applied\" });\n\t\t\t\t\temit({\n\t\t\t\t\t\ttype: \"ready\",\n\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\twallet: effectiveWallet,\n\t\t\t\t\t\tlog_file: args[\"log-file\"] || null,\n\t\t\t\t\t\tlog_level: logLevel,\n\t\t\t\t\t\tauto_heartbeat: !!currentAgent,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (logLevel === \"debug\") {\n\t\t\t\t\t\tfor (const tableSpec of OBSERVED_TABLES) {\n\t\t\t\t\t\t\tconst table = ctx.db[tableSpec.key] as ObservableTable;\n\t\t\t\t\t\t\ttable.onInsert?.((_eventCtx, row) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (row as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_insert\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\trow: sanitizeValue(row),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttable.onUpdate?.((_eventCtx, oldRow, newRow) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (newRow as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_update\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\told_row: sanitizeValue(oldRow),\n\t\t\t\t\t\t\t\t\tnew_row: sanitizeValue(newRow),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttable.onDelete?.((_eventCtx, row) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (row as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_delete\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\trow: sanitizeValue(row),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\t\t\tlet heartbeatInFlight = false;\n\t\t\t\t\tlet consecutiveHeartbeatFailures = 0;\n\n\t\t\t\t\tconst scheduleHeartbeat = () => {\n\t\t\t\t\t\tif (stopping || !currentAgent) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\theartbeatTimer = setTimeout(async () => {\n\t\t\t\t\t\t\tif (!currentAgent || heartbeatInFlight || stopping) {\n\t\t\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\theartbeatInFlight = true;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"heartbeat\", {\n\t\t\t\t\t\t\t\t\tagentId: currentAgent.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (consecutiveHeartbeatFailures > 0) {\n\t\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\t\ttype: \"heartbeat_recovered\",\n\t\t\t\t\t\t\t\t\t\tfailed_count_before_recovery: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures = 0;\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures += 1;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures >= HEARTBEAT_FAILURE_THRESHOLD &&\n\t\t\t\t\t\t\t\t\t!sessionEnd\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tsessionEnd = {\n\t\t\t\t\t\t\t\t\t\treason: \"heartbeat_failed\",\n\t\t\t\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\t\t\t\tconsecutive_failures: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t\t\tmessage: normalizeError(err),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\t\ttype: \"heartbeat_failed\",\n\t\t\t\t\t\t\t\t\t\tconsecutive_failures: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t\tmessage: normalizeError(err),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\theartbeatInFlight = false;\n\t\t\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, withJitter(HEARTBEAT_INTERVAL_MS));\n\t\t\t\t\t};\n\n\t\t\t\t\tif (currentAgent) {\n\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (!stopping && !sessionEnd) {\n\t\t\t\t\t\tawait Promise.race([stopWaiter, sleep(200)]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (heartbeatTimer) {\n\t\t\t\t\t\tclearTimeout(heartbeatTimer);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconst message = normalizeError(err);\n\t\t\tif (connectErrorLooksAuthRelated(message)) {\n\t\t\t\temit({ type: \"auth_failed\", message });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\temit({ type: \"subscription_error\", message });\n\t\t\tsessionEnd = {\n\t\t\t\treason: \"disconnected\",\n\t\t\t\tdetails: { message },\n\t\t\t};\n\t\t}\n\n\t\tif (stopping) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst reason = sessionEnd?.reason || \"disconnected\";\n\t\temit({\n\t\t\ttype: \"disconnected\",\n\t\t\treason,\n\t\t\tdetails: sanitizeValue(sessionEnd?.details || null),\n\t\t});\n\n\t\tif (downtimeStartedAt === null) {\n\t\t\tdowntimeStartedAt = Date.now();\n\t\t}\n\n\t\treconnectAttempt += 1;\n\t\tconst waitMs = backoffMs(reconnectAttempt);\n\t\temit({\n\t\t\ttype: \"reconnecting\",\n\t\t\tattempt: reconnectAttempt,\n\t\t\tbackoff_ms: waitMs,\n\t\t});\n\n\t\tawait Promise.race([stopWaiter, sleep(waitMs)]);\n\t}\n\n\temit({ type: \"shutdown\", signal: stopSignal || \"unknown\" });\n\n\tif (logStream) {\n\t\tlogStream.end();\n\t}\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"nexus\",\n\t\tdescription: \"Persistent Nexus daemon (keepalive + critical telemetry)\",\n\t},\n\targs: nexusDaemonArgs,\n\tasync run({ args }) {\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe nexus\",\n\t\t\t\tdescription: \"Run persistent Nexus keepalive + critical event logger\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe nexus [options]\",\n\t\t\t\t\t\"probe nexus --wallet agent-wallet\",\n\t\t\t\t\t\"probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl\",\n\t\t\t\t\t\"probe nexus --log-level debug --sender zoe-1\",\n\t\t\t\t\t\"probe nexus --pretty\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--wallet\",\n\t\t\t\t\t\tdetail: \"Wallet for authenticated persistent connection\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--log-level\", detail: \"critical (default), info, or debug\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--sender\",\n\t\t\t\t\t\tdetail: \"Sender filter for debug message events only\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--log-file\",\n\t\t\t\t\t\tdetail: \"Optional JSONL file path for daemon events\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--pretty\",\n\t\t\t\t\t\tdetail: \"Human-readable lifecycle logs to stderr\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"stdout is always structured JSONL for machine parsing.\",\n\t\t\t\t\t\"Default mode logs critical connection lifecycle and heartbeat health events only.\",\n\t\t\t\t\t\"Use --log-level debug to emit full table insert/update/delete payloads.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runNexusDaemon(args as Record<string, unknown>);\n\t},\n});\n","// THIS FILE IS AUTO-GENERATED BY scripts/generate-decoders.ts\n// DO NOT EDIT MANUALLY - Run `npm run generate:decoders` to regenerate\n\n/**\n * Algebraic type decoders for SpacetimeDB SQL query results.\n * Converts raw algebraic type arrays to human-readable values.\n */\n\nexport type Decoder = (value: unknown) => unknown;\n\n// Enum decoders - map variant index to name\nconst enumDecoders: Record<string, Decoder> = {\n AgentRole: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Zoe', 'Admin', 'Zeno'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n AgentStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Online', 'Offline', 'Working'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DependencyType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Blocks', 'ParentChild'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DiscoveredTaskStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['PendingReview', 'Approved', 'Rejected', 'EscalatedToIdea'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DiscoveryDecision: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['ApproveAsTask', 'Reject', 'EscalateToIdea'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n IdeaStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Voting', 'ApprovedForProject', 'Rejected', 'Implemented'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n MessageType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['User', 'System', 'Directive'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ProjectStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Active', 'Paused'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n TaskStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Open', 'Claimed', 'InProgress', 'Review', 'Completed', 'Blocked', 'Archived'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n VoteType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Up', 'Down', 'Veto'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n};\n\n// Timestamp decoder - converts microseconds to ISO string\nconst timestampDecoder: Decoder = (value) => {\n if (!Array.isArray(value)) return value;\n const micros = value[0];\n if (typeof micros !== \"number\" && typeof micros !== \"bigint\") return value;\n return new Date(Number(micros) / 1000).toISOString();\n};\n\n// Option decoder - unwraps Some, returns null for None\nconst optionDecoder = (inner?: Decoder): Decoder => (value) => {\n if (!Array.isArray(value)) return value;\n const [tag, payload] = value;\n if (tag === 1) return null; // None\n // For Option<T>, payload is [T] (array with single element)\n // Pass the payload directly to inner decoder - it knows how to handle its format\n if (inner) {\n // Inner decoder expects the wrapped format (e.g., timestampDecoder expects [micros])\n return inner(payload);\n }\n // No inner decoder - unwrap primitives\n return Array.isArray(payload) && payload.length === 1 ? payload[0] : payload;\n};\n\n// Table column decoders\nexport const TABLE_DECODERS: Record<string, Record<string, Decoder>> = {\n agents: {\n 'last_heartbeat': timestampDecoder,\n 'current_task_id': optionDecoder(),\n 'created_at': timestampDecoder,\n 'last_active_at': timestampDecoder,\n 'role': enumDecoders.AgentRole,\n 'status': enumDecoders.AgentStatus,\n },\n channels: {\n 'created_at': timestampDecoder,\n },\n discovered_tasks: {\n 'created_task_id': optionDecoder(),\n 'rejection_reason': optionDecoder(),\n 'created_at': timestampDecoder,\n 'reviewed_at': optionDecoder(timestampDecoder),\n 'reviewed_by': optionDecoder(),\n 'status': enumDecoders.DiscoveredTaskStatus,\n },\n ideas: {\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'status': enumDecoders.IdeaStatus,\n },\n identity_roles: {\n 'role': enumDecoders.AgentRole,\n },\n messages: {\n 'context_id': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n project_channels: {\n 'created_at': timestampDecoder,\n },\n project_messages: {\n 'context_id': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n projects: {\n 'created_at': timestampDecoder,\n 'status': enumDecoders.ProjectStatus,\n },\n task_dependencies: {\n 'created_at': timestampDecoder,\n },\n tasks: {\n 'assigned_to': optionDecoder(),\n 'claimed_at': optionDecoder(timestampDecoder),\n 'github_issue_url': optionDecoder(),\n 'github_pr_url': optionDecoder(),\n 'source_idea_id': optionDecoder(),\n 'archived_reason': optionDecoder(),\n 'status_changed_by': optionDecoder(),\n 'status_changed_at': optionDecoder(timestampDecoder),\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'status': enumDecoders.TaskStatus,\n 'blocked_from_status': optionDecoder(enumDecoders.TaskStatus),\n },\n votes: {\n 'created_at': timestampDecoder,\n },\n};\n\n/**\n * Decode a row using table-specific decoders.\n * @param row - The raw row from SQL query\n * @param columnNames - Ordered column names from schema\n * @param tableName - The table name for decoder lookup\n * @returns Decoded row with human-readable values\n */\nexport function decodeRow(\n row: unknown[],\n columnNames: string[],\n tableName?: string\n): Record<string, unknown> {\n const decoders = tableName ? TABLE_DECODERS[tableName] : undefined;\n const result: Record<string, unknown> = {};\n \n for (let i = 0; i < columnNames.length; i++) {\n const colName = columnNames[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n result[colName] = decoder ? decoder(value) : value;\n }\n \n return result;\n}\n\n/**\n * Infer table name from a simple SQL query.\n * Only works for straightforward \"SELECT ... FROM table\" queries.\n */\nexport function inferTableName(sql: string): string | undefined {\n const match = sql.match(/FROM\\s+(\\w+)/i);\n return match?.[1]?.toLowerCase();\n}","export interface SqlColumn {\n\tname: string;\n\ttype: string;\n}\n\nexport interface SqlSchema {\n\tcolumns: SqlColumn[];\n}\n\nexport interface SqlStatementResult {\n\tschema: SqlSchema | unknown;\n\trows: unknown[];\n}\n\nexport interface SqlRowObject {\n\t[key: string]: unknown;\n}\n\nexport interface SqlSchemaElement {\n\tname: { some?: string } | string;\n\talgebraic_type?: unknown;\n\ttype?: string;\n}\n\nexport interface SqlSchemaAlt {\n\telements?: SqlSchemaElement[];\n}\n\nconst extractColumnName = (element: SqlSchemaElement): string | undefined => {\n\tif (typeof element.name === \"string\") {\n\t\treturn element.name;\n\t}\n\tif (\n\t\telement.name &&\n\t\ttypeof element.name === \"object\" &&\n\t\t\"some\" in element.name\n\t) {\n\t\treturn element.name.some;\n\t}\n\treturn undefined;\n};\n\nexport interface SqlRequestOptions {\n\thost: string;\n\tmoduleName: string;\n\ttoken: string;\n\tsql: string;\n\ttimeoutMs: number;\n}\n\nexport interface SqlRequestSuccess {\n\tresults: SqlStatementResult[];\n\tdurationMs: number;\n}\n\nexport class SqlRequestError extends Error {\n\treadonly status: number;\n\treadonly responseBody: string;\n\n\tconstructor(status: number, responseBody: string, message?: string) {\n\t\tsuper(message || `SQL request failed with status ${status}`);\n\t\tthis.name = \"SqlRequestError\";\n\t\tthis.status = status;\n\t\tthis.responseBody = responseBody;\n\t}\n}\n\nexport const normalizeSqlHttpBase = (host: string): string => {\n\tconst url = new URL(host);\n\tif (url.protocol === \"ws:\") {\n\t\turl.protocol = \"http:\";\n\t} else if (url.protocol === \"wss:\") {\n\t\turl.protocol = \"https:\";\n\t} else if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(`Unsupported host protocol: ${url.protocol}`);\n\t}\n\treturn url.toString();\n};\n\nexport const buildSqlEndpoint = (host: string, moduleName: string): string => {\n\tconst base = normalizeSqlHttpBase(host);\n\tconst url = new URL(base);\n\tconst basePath = url.pathname.replace(/\\/$/, \"\");\n\turl.pathname = `${basePath}/v1/database/${encodeURIComponent(moduleName)}/sql`;\n\treturn url.toString();\n};\n\nconst parseResults = (payload: unknown): SqlStatementResult[] => {\n\tif (!Array.isArray(payload)) {\n\t\tthrow new Error(\n\t\t\t\"Invalid SQL response: expected array of statement results\",\n\t\t);\n\t}\n\treturn payload.map((statement) => {\n\t\tconst record = statement as { schema?: unknown; rows?: unknown };\n\t\tconst rows = Array.isArray(record.rows) ? record.rows : [];\n\t\treturn {\n\t\t\tschema: record.schema,\n\t\t\trows,\n\t\t};\n\t});\n};\n\nexport const executeSqlRequest = async (\n\toptions: SqlRequestOptions,\n): Promise<SqlRequestSuccess> => {\n\tconst endpoint = buildSqlEndpoint(options.host, options.moduleName);\n\tconst controller = new AbortController();\n\tconst timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst started = Date.now();\n\n\ttry {\n\t\tconst response = await fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${options.token}`,\n\t\t\t\t\"Content-Type\": \"text/plain\",\n\t\t\t\tAccept: \"application/json\",\n\t\t\t},\n\t\t\tbody: options.sql,\n\t\t\tsignal: controller.signal,\n\t\t});\n\n\t\tconst responseText = await response.text();\n\t\tif (!response.ok) {\n\t\t\tthrow new SqlRequestError(response.status, responseText);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = responseText ? JSON.parse(responseText) : [];\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid SQL response: expected JSON payload\");\n\t\t}\n\n\t\treturn {\n\t\t\tresults: parseResults(parsed),\n\t\t\tdurationMs: Date.now() - started,\n\t\t};\n\t} finally {\n\t\tclearTimeout(timeoutHandle);\n\t}\n};\n\n// Extract column names from schema for use in responses\nexport const extractColumnNames = (result: SqlStatementResult): string[] => {\n\tconst schema = result.schema as SqlSchema | SqlSchemaAlt | undefined;\n\n\tif (schema && \"elements\" in schema && Array.isArray(schema.elements)) {\n\t\treturn schema.elements\n\t\t\t.map(extractColumnName)\n\t\t\t.filter((name): name is string => name !== undefined);\n\t} else if (schema && \"columns\" in schema && Array.isArray(schema.columns)) {\n\t\treturn schema.columns.map((col) => col.name);\n\t}\n\n\treturn [];\n};\n\n// Parse SQL error to provide helpful suggestions\nexport const parseSqlError = (\n\tresponseBody: string,\n): { message: string; suggestion?: string } => {\n\t// Try to parse as JSON first, fallback to plain text\n\tlet errorMsg: string;\n\ttry {\n\t\tconst parsed = JSON.parse(responseBody);\n\t\terrorMsg = parsed.error || responseBody;\n\t} catch {\n\t\terrorMsg = responseBody;\n\t}\n\n\t// Common SpacetimeDB SQL errors with suggestions\n\tif (errorMsg.includes(\"ORDER BY\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"IS NULL\") || errorMsg.includes(\"IS NOT NULL\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t'Use \"column = NULL\" or \"column != NULL\" instead of IS NULL / IS NOT NULL.',\n\t\t};\n\t}\n\tif (errorMsg.includes(\"JOIN\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"no such table\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"Check the table name. Common tables: tasks, projects, agents, ideas, messages.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"no such column\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"Check the column name. Use SELECT * to see all available columns.\",\n\t\t};\n\t}\n\n\treturn { message: errorMsg };\n};\n","import { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { inferTableName, TABLE_DECODERS } from \"~/generated/decoders.js\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport {\n\texecuteSqlRequest,\n\textractColumnNames,\n\tparseSqlError,\n\tSqlRequestError,\n\ttype SqlStatementResult,\n} from \"~/utils/sql.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\n// Known tables derived from generated decoders\nconst KNOWN_TABLES = Object.keys(TABLE_DECODERS);\n\nimport { formatToon } from \"~/utils/toon.js\";\n\n// Helper to handle query errors with improved messages\nconst handleQueryError = (err: unknown, timeoutMs: number): never => {\n\tif (err instanceof SqlRequestError) {\n\t\tif (err.status === 401) {\n\t\t\terror(\n\t\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\t\"Authentication required. Run `probe auth <wallet> --save` first.\",\n\t\t\t);\n\t\t}\n\t\tconst { message, suggestion } = parseSqlError(err.responseBody);\n\t\t// Error parsed with potential suggestion\n\t\tif (err.status === 400) {\n\t\t\terror(\"SQL_INVALID\", message, suggestion);\n\t\t}\n\t\terror(\"SQL_FAILED\", message, suggestion);\n\t}\n\n\tif (err instanceof Error && err.name === \"AbortError\") {\n\t\terror(\"SQL_UNAVAILABLE\", `SQL request timed out after ${timeoutMs}ms`);\n\t}\n\n\terror(\n\t\t\"SQL_UNAVAILABLE\",\n\t\terr instanceof Error ? err.message : \"SQL request failed\",\n\t);\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nconst buildMeta = (results: SqlStatementResult[], durationMs: number) => ({\n\tduration_ms: durationMs,\n\tquery_count: results.length,\n\trow_count_total: results.reduce((sum, item) => sum + item.rows.length, 0),\n});\n\n// Build flat response structure for JSON mode\ninterface QueryResult {\n\tcolumns: string[];\n\trows: Record<string, unknown>[];\n}\n\nconst buildFlatResponse = (\n\tresults: SqlStatementResult[],\n\tshouldDecode: boolean,\n\ttableName?: string,\n): Record<string, QueryResult> => {\n\tconst response: Record<string, QueryResult> = {};\n\n\tfor (let index = 0; index < results.length; index += 1) {\n\t\tconst statement = results[index];\n\t\tconst columns = extractColumnNames(statement);\n\t\tconst decoders =\n\t\t\tshouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n\t\tconst rowObjects = (statement.rows as unknown[][]).map((row) => {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst colName = columns[i];\n\t\t\t\tconst value = row[i];\n\t\t\t\tconst decoder = decoders?.[colName];\n\t\t\t\tobj[colName] = decoder ? decoder(value) : value;\n\t\t\t}\n\t\t\treturn obj;\n\t\t});\n\n\t\tresponse[`query_${index + 1}`] = { columns, rows: rowObjects };\n\t}\n\n\tif (results.length === 0) {\n\t\tresponse.query_1 = { columns: [], rows: [] };\n\t}\n\n\treturn response;\n};\n\nconst formatStatementsToToon = (\n\tresults: SqlStatementResult[],\n\tmetaEnabled: boolean,\n\tdurationMs: number,\n\tshouldDecode: boolean,\n\ttableName?: string,\n): string => {\n\tconst payload: Record<string, unknown> = {};\n\tconst decoders =\n\t\tshouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n\tfor (let index = 0; index < results.length; index += 1) {\n\t\tconst statement = results[index];\n\t\tconst columns = extractColumnNames(statement);\n\n\t\tconst rowObjects = (statement.rows as unknown[][]).map((row) => {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst colName = columns[i];\n\t\t\t\tconst value = row[i];\n\t\t\t\tconst decoder = decoders?.[colName];\n\t\t\t\tobj[colName] = decoder ? decoder(value) : value;\n\t\t\t}\n\t\t\treturn obj;\n\t\t});\n\n\t\tpayload[`query_${index + 1}`] = rowObjects;\n\t}\n\n\tif (results.length === 0) {\n\t\tpayload.query_1 = [];\n\t}\n\n\tif (metaEnabled) {\n\t\tconst meta = buildMeta(results, durationMs);\n\t\tpayload.meta = [meta];\n\t}\n\n\treturn formatToon(payload);\n};\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"query\",\n\t\tdescription: \"Run SQL read queries against Nexus\",\n\t},\n\targs: {\n\t\tsql: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"SQL query string\",\n\t\t\trequired: false,\n\t\t},\n\t\tfile: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read SQL from file path\",\n\t\t},\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override\",\n\t\t},\n\t\thost: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB host override\",\n\t\t},\n\t\tmodule: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB module override\",\n\t\t},\n\t\ttimeout: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Request timeout in milliseconds\",\n\t\t},\n\t\tmeta: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Include metadata in output\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t\ttables: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"List all available tables\",\n\t\t\tdefault: false,\n\t\t},\n\t\tdecode: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Decode algebraic types to human-readable values\",\n\t\t\tdefault: true,\n\t\t},\n\t\traw: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output raw algebraic type arrays (no decoding)\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst hasSql = args.sql || args.file;\n\n\t\t// Handle --tables flag\n\t\tif (args.tables) {\n\t\t\tif (isJsonMode()) {\n\t\t\t\tsuccess({ tables: KNOWN_TABLES });\n\t\t\t} else {\n\t\t\t\tconsole.log(formatToon({ tables: KNOWN_TABLES }));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate arguments\n\t\tif (!hasSql) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe query\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Execute SQL against the configured Nexus SpacetimeDB module\",\n\t\t\t\tusage: [\n\t\t\t\t\t'probe query \"SELECT * FROM tasks LIMIT 5\"',\n\t\t\t\t\t\"probe query --file ./query.sql --meta\",\n\t\t\t\t\t\"probe query --tables\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--file\", detail: \"Read SQL from file\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--wallet\",\n\t\t\t\t\t\tdetail: \"Wallet override (defaults to config defaultWallet)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--timeout\",\n\t\t\t\t\t\tdetail: `Request timeout in ms (default: ${DEFAULT_TIMEOUT_MS})`,\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--meta\", detail: \"Include metadata in output\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output mode with keyed objects\" },\n\t\t\t\t\t{ name: \"--tables\", detail: \"List all available tables\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--decode\",\n\t\t\t\t\t\tdetail: \"Decode algebraic types (default: true)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--raw\",\n\t\t\t\t\t\tdetail: \"Output raw algebraic arrays (no decoding)\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"This command is read-only and intended for SQL queries against Nexus tables.\",\n\t\t\t\t\t'JSON mode returns keyed objects: {\"query_1\": {\"columns\": [...], \"rows\": [{\"id\": 1, ...}]}}',\n\t\t\t\t\t\"Use --raw to see raw SpacetimeDB algebraic type arrays.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst timeoutMs = args.timeout\n\t\t\t? Number.parseInt(args.timeout, 10)\n\t\t\t: DEFAULT_TIMEOUT_MS;\n\t\tif (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n\t\t\terror(\"INVALID_TIMEOUT\", `Invalid timeout: ${args.timeout}`);\n\t\t}\n\n\t\tconst config = await getConfig();\n\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\tif (!walletName) {\n\t\t\terror(\n\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t\t);\n\t\t}\n\n\t\tconst wallet = await getWalletInfo(walletName);\n\t\tif (!wallet) {\n\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t\t}\n\n\t\tconst cached = await getCachedToken(walletName);\n\t\tif (!cached) {\n\t\t\terror(\n\t\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\t\"No cached token. Run `probe auth <wallet> --save` first.\",\n\t\t\t);\n\t\t}\n\n\t\tconst host = args.host || config.spacetime.host;\n\t\tconst moduleName = args.module || config.spacetime.module;\n\t\tconst sql = args.file\n\t\t\t? await readFile(args.file, \"utf-8\")\n\t\t\t: (args.sql ?? \"\");\n\t\tif (!sql.trim()) {\n\t\t\terror(\"SQL_REQUIRED\", \"SQL query is empty\");\n\t\t}\n\n\t\t// Determine if we should decode algebraic types\n\t\tconst shouldDecode = args.raw ? false : (args.decode ?? true);\n\t\tconst tableName = inferTableName(sql);\n\n\t\ttry {\n\t\t\tconst { results, durationMs } = await executeSqlRequest({\n\t\t\t\thost,\n\t\t\t\tmoduleName,\n\t\t\t\ttoken: cached.token,\n\t\t\t\tsql,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\n\t\t\tif (isJsonMode()) {\n\t\t\t\tconst flatResponse = buildFlatResponse(\n\t\t\t\t\tresults,\n\t\t\t\t\tshouldDecode,\n\t\t\t\t\ttableName,\n\t\t\t\t);\n\t\t\t\tif (args.meta) {\n\t\t\t\t\tsuccess({ ...flatResponse, meta: buildMeta(results, durationMs) });\n\t\t\t\t} else {\n\t\t\t\t\tsuccess(flatResponse);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\tformatStatementsToToon(\n\t\t\t\t\tresults,\n\t\t\t\t\tBoolean(args.meta),\n\t\t\t\t\tdurationMs,\n\t\t\t\t\tshouldDecode,\n\t\t\t\t\ttableName,\n\t\t\t\t),\n\t\t\t);\n\t\t} catch (err) {\n\t\t\thandleQueryError(err, timeoutMs);\n\t\t}\n\t},\n});\n","import { Buffer } from \"node:buffer\";\nimport { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"sign\",\n\t\tdescription: \"Sign a message using wallet private key\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Message to sign\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"message-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read message from file\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe sign\",\n\t\t\t\tdescription: \"Sign arbitrary text using wallet private key\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe sign <wallet-name> <message> [options]\",\n\t\t\t\t\t\"probe sign <wallet-name> --message-file ./payload.txt [options]\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--message-file\", detail: \"Read message content from file\" },\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string;\n\n\t\tif (args[\"message-file\"]) {\n\t\t\ttry {\n\t\t\t\tmessage = await readFile(args[\"message-file\"], \"utf-8\");\n\t\t\t} catch {\n\t\t\t\terror(\n\t\t\t\t\t\"FILE_READ_ERROR\",\n\t\t\t\t\t`Failed to read message file: ${args[\"message-file\"]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (args.message) {\n\t\t\tmessage = args.message;\n\t\t} else {\n\t\t\terror(\"MESSAGE_REQUIRED\", \"Message or message-file required\");\n\t\t}\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter wallet password:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password file required in JSON mode or provide PROBE_WALLET_PASSWORD\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\tconst keyPair = keyStore.getKeyPair(0);\n\n\t\t\tconst signature = keyPair.sign(Buffer.from(message));\n\t\t\tconst publicKey = keyPair.getPublicKey();\n\t\t\tconst address = keyPair.getAddress();\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\tmessage,\n\t\t\t\tsignature: signature.toString(\"hex\"),\n\t\t\t\tpublicKey: publicKey.toString(\"hex\"),\n\t\t\t\taddress: address.toString(),\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(\"Message signed successfully\");\n\t\t\t\tconsole.log(`Signature: ${signature.toString(\"hex\")}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"SIGN_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to sign message\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n} from \"~/utils/output.js\";\nimport { clearCachedToken, getCachedToken } from \"~/utils/token-cache.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"token\",\n\t\tdescription: \"Show cached JWT token for wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tclear: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Clear cached token now (next auth call gets a new token)\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe token\",\n\t\t\t\tdescription: \"Inspect or clear cached authentication token\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe token <wallet-name> [options]\",\n\t\t\t\t\t\"probe token <wallet-name> --clear\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--clear\", detail: \"Clear cached token now (recommended)\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (args.clear) {\n\t\t\tawait clearCachedToken(name);\n\n\t\t\tsuccess({ cleared: name });\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tinfo(\n\t\t\t\t\t`Token cache cleared for \"${name}\". Run 'probe auth' to get a new token.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst cached = await getCachedToken(name);\n\n\t\t\tif (!cached) {\n\t\t\t\terror(\n\t\t\t\t\t\"TOKEN_NOT_FOUND\",\n\t\t\t\t\t`No cached token for wallet '${name}'`,\n\t\t\t\t\t`Run 'probe auth ${name} --save' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst expiresAt = new Date(cached.expiresAt);\n\t\t\tconst now = new Date();\n\t\t\tconst expiresIn = Math.floor(\n\t\t\t\t(expiresAt.getTime() - now.getTime()) / 1000,\n\t\t\t);\n\t\t\tconst valid = expiresIn > 0;\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\ttoken: cached.token,\n\t\t\t\texpiresAt: cached.expiresAt,\n\t\t\t\texpiresIn: Math.max(0, expiresIn),\n\t\t\t\tvalid,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Wallet: ${name}`);\n\t\t\t\tconsole.log(`Token: ${cached.token.slice(0, 50)}...`);\n\t\t\t\tconsole.log(`Expires: ${expiresAt.toUTCString()}`);\n\t\t\t\tconsole.log(`Status: ${valid ? \"Valid\" : \"Expired\"}`);\n\n\t\t\t\tif (!valid) {\n\t\t\t\t\tinfo(\n\t\t\t\t\t\t\"Token has expired. Run with --clear to remove it and re-authenticate.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"TOKEN_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to read token\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n\twarning,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport {\n\tcreateWallet as createWalletUtil,\n\tlistWallets,\n} from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"create\",\n\t\tdescription: \"Create a new wallet with randomly generated mnemonic\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet identifier\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\t\"set-default\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Set this wallet as the default\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet create\",\n\t\t\t\tdescription: \"Create a new encrypted wallet\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet create <name> [options]\",\n\t\t\t\t\t\"probe wallet create agent-wallet --set-default\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--set-default\", detail: \"Set created wallet as default\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n\t\t\terror(\n\t\t\t\t\"INVALID_NAME\",\n\t\t\t\t\"Wallet name must be alphanumeric with hyphens or underscores only\",\n\t\t\t);\n\t\t}\n\n\t\tconst config = await getConfig();\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter password to encrypt wallet:\",\n\t\t\tconfirmPromptMessage: \"Confirm password:\",\n\t\t\tminLength: config.passwordMinLength,\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst result = await createWalletUtil(name, walletPassword);\n\n\t\t\tlet setAsDefault = args[\"set-default\"];\n\t\t\tif (!setAsDefault) {\n\t\t\t\tconst wallets = await listWallets();\n\t\t\t\tif (wallets.length === 1) {\n\t\t\t\t\tsetAsDefault = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setAsDefault) {\n\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\tuserConfig.defaultWallet = result.name;\n\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\tname: result.name,\n\t\t\t\taddress: result.address,\n\t\t\t\tpublicKey: result.publicKey,\n\t\t\t\tmnemonic: result.mnemonic,\n\t\t\t\tdefault: setAsDefault,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${result.name}\" created successfully`);\n\t\t\t\tconsole.log(`Address: ${result.address}`);\n\t\t\t\tconsole.log(`\\nMnemonic: ${result.mnemonic}`);\n\t\t\t\twarning(\"Save this mnemonic securely - it cannot be recovered!\");\n\t\t\t\tif (setAsDefault) {\n\t\t\t\t\tconsole.log(`\\nSet as default wallet`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_CREATE_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to create wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"default\",\n\t\tdescription: \"Set the default wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name to set as default\",\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet default\",\n\t\t\t\tdescription: \"Set the default wallet used by commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet default <name> [options]\",\n\t\t\t\t\t\"probe wallet default agent-wallet\",\n\t\t\t\t],\n\t\t\t\toptions: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst exists = await walletExists(name);\n\t\tif (!exists) {\n\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet '${name}' does not exist`);\n\t\t}\n\n\t\tconst userConfig = await loadUserConfig();\n\t\tuserConfig.defaultWallet = name;\n\t\tawait saveUserConfig(userConfig);\n\n\t\tsuccess({ defaultWallet: name });\n\n\t\tif (!isJsonMode()) {\n\t\t\tsuccessMessage(`Default wallet set to '${name}'`);\n\t\t}\n\t},\n});\n","import { confirm } from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { deleteWallet, walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"delete\",\n\t\tdescription: \"Delete a wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tyes: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Skip confirmation prompt\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet delete\",\n\t\t\t\tdescription: \"Delete a wallet from local storage\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet delete <name> [options]\",\n\t\t\t\t\t\"probe wallet delete old-wallet --yes\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--yes\", detail: \"Skip interactive confirmation prompt\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst exists = await walletExists(name);\n\t\tif (!exists) {\n\t\t\terror(\n\t\t\t\t\"WALLET_NOT_FOUND\",\n\t\t\t\t`Wallet '${name}' does not exist`,\n\t\t\t\t`Run 'probe wallet list' to see available wallets`,\n\t\t\t);\n\t\t}\n\n\t\tif (!isJsonMode() && !args.yes) {\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Are you sure you want to delete wallet \"${name}\"? This cannot be undone.`,\n\t\t\t});\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tinfo(\"Deletion cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait deleteWallet(name);\n\n\t\t\tsuccess({ deleted: name });\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${name}\" deleted successfully`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_DELETE_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to delete wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tresolveMnemonicInput,\n\tresolvePasswordInput,\n} from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { importWallet, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"import\",\n\t\tdescription: \"Import wallet from mnemonic phrase\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet identifier\",\n\t\t\trequired: false,\n\t\t},\n\t\tmnemonic: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Mnemonic phrase (space-separated)\",\n\t\t},\n\t\t\"mnemonic-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read mnemonic from file\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\t\"set-default\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Set this wallet as the default\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet import\",\n\t\t\t\tdescription: \"Import an encrypted wallet from mnemonic\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet import <name> [options]\",\n\t\t\t\t\t\"probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--mnemonic\", detail: \"24-word mnemonic phrase\" },\n\t\t\t\t\t{ name: \"--mnemonic-file\", detail: \"Read mnemonic from file\" },\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--set-default\", detail: \"Set imported wallet as default\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n\t\t\terror(\n\t\t\t\t\"INVALID_NAME\",\n\t\t\t\t\"Wallet name must be alphanumeric with hyphens or underscores only\",\n\t\t\t);\n\t\t}\n\n\t\tconst mnemonicPhrase = await resolveMnemonicInput({\n\t\t\tmnemonic: args.mnemonic,\n\t\t\tmnemonicFile: args[\"mnemonic-file\"],\n\t\t\tjsonModeError:\n\t\t\t\t\"Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env\",\n\t\t});\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter password to encrypt wallet:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst result = await importWallet(name, mnemonicPhrase, walletPassword);\n\n\t\t\tlet setAsDefault = args[\"set-default\"];\n\t\t\tif (!setAsDefault) {\n\t\t\t\tconst wallets = await listWallets();\n\t\t\t\tif (wallets.length === 1) {\n\t\t\t\t\tsetAsDefault = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setAsDefault) {\n\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\tuserConfig.defaultWallet = result.name;\n\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\tname: result.name,\n\t\t\t\taddress: result.address,\n\t\t\t\tdefault: setAsDefault,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${result.name}\" imported successfully`);\n\t\t\t\tconsole.log(`Address: ${result.address}`);\n\t\t\t\tif (setAsDefault) {\n\t\t\t\t\tconsole.log(`\\nSet as default wallet`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_IMPORT_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to import wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n} from \"~/utils/output.js\";\nimport { listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"list\",\n\t\tdescription: \"List all stored wallets\",\n\t},\n\targs: {\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet list\",\n\t\t\t\tdescription: \"List all locally stored wallets\",\n\t\t\t\tusage: [\"probe wallet list [options]\", \"probe wallet list --json\"],\n\t\t\t\toptions: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\ttry {\n\t\t\tconst wallets = await listWallets();\n\t\t\tconst config = await getConfig();\n\n\t\t\tconst walletsOutput = wallets.map((w) => ({\n\t\t\t\t...w,\n\t\t\t\tdefault: w.name === config.defaultWallet,\n\t\t\t}));\n\n\t\t\tsuccess(walletsOutput);\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tif (wallets.length === 0) {\n\t\t\t\t\tinfo(\"No wallets found\");\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Wallets:\");\n\t\t\t\t\tfor (const wallet of walletsOutput) {\n\t\t\t\t\t\tconst date = wallet.createdAt\n\t\t\t\t\t\t\t? new Date(wallet.createdAt).toLocaleDateString()\n\t\t\t\t\t\t\t: \"unknown\";\n\t\t\t\t\t\tconst marker = wallet.default ? \"*\" : \" \";\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`${marker} ${wallet.name.padEnd(12)} ${wallet.address.slice(0, 10)}... created ${date}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (config.defaultWallet) {\n\t\t\t\t\t\tconsole.log(`\\n* = default wallet`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LIST_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to list wallets\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { getWalletInfo, loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"show\",\n\t\tdescription: \"Show wallet address and public key\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"public-key\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Include public key in output\",\n\t\t\tdefault: false,\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet show\",\n\t\t\t\tdescription: \"Show wallet address and optional public key\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet show <name> [options]\",\n\t\t\t\t\t\"probe wallet show my-wallet --public-key --password-file ./pass.txt\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--public-key\", detail: \"Include public key in output\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--password-file\",\n\t\t\t\t\t\tdetail: \"Read password for public key extraction\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst walletInfo = await getWalletInfo(name);\n\t\tif (!walletInfo) {\n\t\t\terror(\n\t\t\t\t\"WALLET_NOT_FOUND\",\n\t\t\t\t`Wallet '${name}' does not exist`,\n\t\t\t\t`Run 'probe wallet list' to see available wallets`,\n\t\t\t);\n\t\t}\n\n\t\tlet walletPassword: string | undefined;\n\n\t\tif (args[\"password-file\"]) {\n\t\t\ttry {\n\t\t\t\twalletPassword = await readFile(args[\"password-file\"], \"utf-8\");\n\t\t\t\twalletPassword = walletPassword.trim();\n\t\t\t} catch {\n\t\t\t\terror(\n\t\t\t\t\t\"FILE_READ_ERROR\",\n\t\t\t\t\t`Failed to read password file: ${args[\"password-file\"]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tlet publicKey: string | undefined;\n\n\t\t\tif (walletPassword) {\n\t\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\t\tconst keyPair = keyStore.getKeyPair(0);\n\t\t\t\tpublicKey = keyPair.getPublicKey().toString(\"hex\");\n\t\t\t}\n\n\t\t\tconst result: Record<string, string | undefined> = {\n\t\t\t\tname: walletInfo.name,\n\t\t\t\taddress: walletInfo.address,\n\t\t\t\tcreatedAt: walletInfo.createdAt,\n\t\t\t};\n\n\t\t\tif (args[\"public-key\"] || publicKey) {\n\t\t\t\tresult.publicKey = publicKey;\n\t\t\t}\n\n\t\t\tsuccess(result);\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Name: ${walletInfo.name}`);\n\t\t\t\tconsole.log(`Address: ${walletInfo.address}`);\n\t\t\t\tif (walletInfo.createdAt) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Created: ${new Date(walletInfo.createdAt).toLocaleString()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (publicKey) {\n\t\t\t\t\tconsole.log(`Public Key: ${publicKey}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LOAD_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport create from \"./create.js\";\nimport defaultCmd from \"./default.js\";\nimport deleteCmd from \"./delete.js\";\nimport importCmd from \"./import.js\";\nimport list from \"./list.js\";\nimport show from \"./show.js\";\n\nconst walletSubcommands = new Set([\n\t\"create\",\n\t\"import\",\n\t\"list\",\n\t\"show\",\n\t\"delete\",\n\t\"default\",\n]);\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"wallet\",\n\t\tdescription: \"Manage Zenon Network wallets\",\n\t},\n\trun() {\n\t\tconst positionals = process.argv\n\t\t\t.slice(2)\n\t\t\t.filter((arg) => !arg.startsWith(\"-\"));\n\t\tif (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n\t\t\treturn;\n\t\t}\n\n\t\tprintHelp({\n\t\t\tcommand: \"probe wallet\",\n\t\t\tdescription: \"Create, import, inspect, and manage wallets\",\n\t\t\tusage: [\n\t\t\t\t\"probe wallet <subcommand> [positionals] [options]\",\n\t\t\t\t\"probe wallet create my-wallet --set-default\",\n\t\t\t\t\"probe wallet import my-wallet --mnemonic-file ./mnemonic.txt\",\n\t\t\t],\n\t\t\tactions: [\n\t\t\t\t{ name: \"create <name>\", detail: \"Create a new encrypted wallet\" },\n\t\t\t\t{ name: \"import <name>\", detail: \"Import wallet from mnemonic phrase\" },\n\t\t\t\t{ name: \"list\", detail: \"List stored wallets\" },\n\t\t\t\t{\n\t\t\t\t\tname: \"show <name>\",\n\t\t\t\t\tdetail: \"Show wallet address and optional public key\",\n\t\t\t\t},\n\t\t\t\t{ name: \"delete <name>\", detail: \"Delete a wallet\" },\n\t\t\t\t{ name: \"default <name>\", detail: \"Set default wallet\" },\n\t\t\t],\n\t\t\tnotes: [\"Use long-form flags only for predictable agent automation.\"],\n\t\t});\n\t},\n\tsubCommands: {\n\t\tcreate,\n\t\timport: importCmd,\n\t\tlist,\n\t\tshow,\n\t\tdelete: deleteCmd,\n\t\tdefault: defaultCmd,\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport type { Agent } from \"~/utils/context.js\";\nimport { withAuth } from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"whoami\",\n\t\tdescription: \"Show current authenticated agent profile\",\n\t},\n\targs: {\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\ttry {\n\t\t\tawait withAuth(\n\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst myAgent = ctx\n\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t.find(\n\t\t\t\t\t\t\t(a) => a.identity.toHexString() === ctx.identity?.toHexString(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!myAgent) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tsuccess(myAgent);\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: myAgent.id,\n\t\t\t\t\t\t\t\t\tname: myAgent.name,\n\t\t\t\t\t\t\t\t\trole: AgentRole.display(myAgent.role),\n\t\t\t\t\t\t\t\t\tstatus: AgentStatus.display(myAgent.status),\n\t\t\t\t\t\t\t\t\tlastHeartbeat: formatTimestamp(myAgent.lastHeartbeat),\n\t\t\t\t\t\t\t\t\tcurrentTaskId: myAgent.currentTaskId\n\t\t\t\t\t\t\t\t\t\t? myAgent.currentTaskId.toString()\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\tcapabilities: myAgent.capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString() || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (err) {\n\t\t\t// Handle connection errors gracefully - avoid citty/consola stack traces\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import { createRequire } from \"node:module\";\nimport { defineCommand, runMain } from \"citty\";\nimport auth from \"./commands/auth.js\";\nimport config from \"./commands/config.js\";\nimport doctor from \"./commands/doctor.js\";\nimport agent from \"./commands/nexus/agent.js\";\nimport discover from \"./commands/nexus/discover.js\";\nimport idea from \"./commands/nexus/idea.js\";\nimport message from \"./commands/nexus/message.js\";\nimport project from \"./commands/nexus/project.js\";\nimport task from \"./commands/nexus/task.js\";\nimport nexusDaemon from \"./commands/nexus-daemon.js\";\nimport query from \"./commands/query.js\";\nimport sign from \"./commands/sign.js\";\nimport token from \"./commands/token.js\";\nimport wallet from \"./commands/wallet/index.js\";\nimport whoami from \"./commands/whoami.js\";\nimport {\n\tnormalizeHelpArgv,\n\tprintHelp,\n\tsetForceHelpRequested,\n} from \"./utils/help.js\";\n\nconst topLevelCommands = new Set([\n\t\"wallet\",\n\t\"auth\",\n\t\"sign\",\n\t\"token\",\n\t\"config\",\n\t\"nexus\",\n\t\"agent\",\n\t\"task\",\n\t\"message\",\n\t\"idea\",\n\t\"discover\",\n\t\"project\",\n\t\"query\",\n\t\"doctor\",\n\t\"whoami\",\n]);\n\nconst applyHelpNormalization = (): void => {\n\tconst normalized = normalizeHelpArgv(process.argv.slice(2));\n\tsetForceHelpRequested(normalized.forceHelp);\n\tprocess.argv = [...process.argv.slice(0, 2), ...normalized.argv];\n};\n\nconst require = createRequire(import.meta.url);\nconst { version, description } = require(\"../package.json\");\n\nconst main = defineCommand({\n\tmeta: { name: \"probe\", version, description },\n\targs: {\n\t\tjson: { type: \"boolean\", description: \"Output JSON only\", default: false },\n\t},\n\trun() {\n\t\tconst firstPositional = process.argv\n\t\t\t.slice(2)\n\t\t\t.find((arg) => !arg.startsWith(\"-\"));\n\t\tif (firstPositional && topLevelCommands.has(firstPositional)) {\n\t\t\treturn;\n\t\t}\n\n\t\tprintHelp({\n\t\t\tcommand: \"probe\",\n\t\t\tdescription,\n\t\t\tusage: [\n\t\t\t\t\"probe <command> [positionals] [options]\",\n\t\t\t\t'probe idea propose --title \"Better task scoring\" --category planning',\n\t\t\t\t\"probe task claim 42 --wallet agent-wallet\",\n\t\t\t],\n\t\t\tactions: [\n\t\t\t\t{ name: \"wallet\", detail: \"Wallet lifecycle commands\" },\n\t\t\t\t{ name: \"auth\", detail: \"Authenticate wallet and cache token\" },\n\t\t\t\t{ name: \"token\", detail: \"Inspect or clear cached token\" },\n\t\t\t\t{ name: \"sign\", detail: \"Sign text payloads\" },\n\t\t\t\t{\n\t\t\t\t\tname: \"nexus\",\n\t\t\t\t\tdetail: \"Run persistent Nexus daemon (keepalive + event logs)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"agent, task, idea, discover, message, project\",\n\t\t\t\t\tdetail: \"Nexus workspace commands\",\n\t\t\t\t},\n\t\t\t\t{ name: \"query\", detail: \"Execute SQL queries against Nexus\" },\n\t\t\t\t{ name: \"doctor\", detail: \"Run setup and connectivity diagnostics\" },\n\t\t\t\t{ name: \"config\", detail: \"Read/write CLI configuration\" },\n\t\t\t],\n\t\t\toptions: [{ name: \"--json\", detail: \"JSON output mode for agents\" }],\n\t\t\tnotes: [\n\t\t\t\t\"Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).\",\n\t\t\t],\n\t\t});\n\t},\n\tsubCommands: {\n\t\twallet,\n\t\tauth,\n\t\tsign,\n\t\ttoken,\n\t\tconfig,\n\t\tnexus: nexusDaemon,\n\t\tagent,\n\t\ttask,\n\t\tmessage,\n\t\tidea,\n\t\tdiscover,\n\t\tproject,\n\t\tquery,\n\t\tdoctor,\n\t\twhoami,\n\t},\n});\n\n// Global error handler to suppress stack traces for expected errors\nconst isExpectedError = (err: unknown): boolean => {\n\tif (!(err instanceof Error)) return false;\n\tconst message = err.message.toLowerCase();\n\treturn (\n\t\tmessage.includes(\"connection failed\") ||\n\t\tmessage.includes(\"connection timeout\") ||\n\t\tmessage.includes(\"authentication required\") ||\n\t\tmessage.includes(\"unauthorized\") ||\n\t\tmessage.includes(\"wallet required\") ||\n\t\tmessage.includes(\"wallet not found\") ||\n\t\tmessage.includes(\"agent not registered\") ||\n\t\tmessage.includes(\"subscription error\")\n\t);\n};\n\nprocess.on(\"unhandledRejection\", (err: unknown) => {\n\tif (isExpectedError(err)) {\n\t\t// Error message already printed by the error() utility\n\t\tprocess.exit(1);\n\t}\n\t// For unexpected errors, let the default handler deal with it\n\tthrow err;\n});\n\napplyHelpNormalization();\nrunMain(main);\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["jsonReplacer","spinner","clackSpinner","walletSubcommands","spinner","__t","AgentRole","AgentStatus","IdeaStatus","MessageType","ProjectStatus","TaskStatus","VoteType","__t","__t","__t","__t","__t","__t","__t","__t","__t","AgentRole","__t","__t","MessageType","__t","MessageType","AgentStatus","__t","__t","__t","ProjectStatus","__t","TaskStatus","__t","VoteType","__t","AgentRole","AgentStatus","__t","__t","__t","__t","IdeaStatus","__t","AgentRole","__t","MessageType","__t","__t","MessageType","__t","ProjectStatus","__t","__t","TaskStatus","__t","VoteType","__schema","__table","AgentsRow","ChannelsRow","ConfigRow","DiscoveredTasksRow","IdeasRow","IdentityRolesRow","MessagesRow","ProjectChannelsRow","ProjectMessagesRow","ProjectsRow","TaskDependenciesRow","TasksRow","VotesRow","__reducers","__reducerSchema","AddTaskDependencyReducer","ClaimTaskReducer","CreateProjectReducer","CreateTaskReducer","DiscoverTaskReducer","HeartbeatReducer","MarkIdeaImplementedReducer","ProposeIdeaReducer","RegisterAgentReducer","ReviewDiscoveredTaskReducer","SeedUiDataReducer","SendMessageReducer","SendProjectMessageReducer","SetAgentStatusReducer","UpdateAgentCapabilitiesReducer","UpdateProjectStatusReducer","UpdateTaskStatusReducer","VoteIdeaReducer","__procedures","__makeQueryBuilder","reducers","__convertToAccessorMap","__SubscriptionBuilderImpl","DbConnectionBuilder","__DbConnectionBuilder","__DbConnectionImpl","createWalletUtil","importCmd","deleteCmd","defaultCmd","nexusDaemon"],"sources":["../src/types/config.ts","../src/utils/user-config.ts","../src/utils/config.ts","../src/utils/output.ts","../src/utils/credentials.ts","../src/utils/help.ts","../src/utils/oidc.ts","../src/utils/token-cache.ts","../src/utils/wallet.ts","../src/commands/auth.ts","../src/commands/config.ts","../src/module_bindings/types.ts","../src/module_bindings/add_task_dependency_reducer.ts","../src/module_bindings/claim_task_reducer.ts","../src/module_bindings/create_project_reducer.ts","../src/module_bindings/create_task_reducer.ts","../src/module_bindings/discover_task_reducer.ts","../src/module_bindings/heartbeat_reducer.ts","../src/module_bindings/mark_idea_implemented_reducer.ts","../src/module_bindings/propose_idea_reducer.ts","../src/module_bindings/register_agent_reducer.ts","../src/module_bindings/review_discovered_task_reducer.ts","../src/module_bindings/seed_ui_data_reducer.ts","../src/module_bindings/send_message_reducer.ts","../src/module_bindings/send_project_message_reducer.ts","../src/module_bindings/set_agent_status_reducer.ts","../src/module_bindings/update_agent_capabilities_reducer.ts","../src/module_bindings/update_project_status_reducer.ts","../src/module_bindings/update_task_status_reducer.ts","../src/module_bindings/vote_idea_reducer.ts","../src/module_bindings/agents_table.ts","../src/module_bindings/channels_table.ts","../src/module_bindings/config_table.ts","../src/module_bindings/discovered_tasks_table.ts","../src/module_bindings/ideas_table.ts","../src/module_bindings/identity_roles_table.ts","../src/module_bindings/messages_table.ts","../src/module_bindings/project_channels_table.ts","../src/module_bindings/project_messages_table.ts","../src/module_bindings/projects_table.ts","../src/module_bindings/task_dependencies_table.ts","../src/module_bindings/tasks_table.ts","../src/module_bindings/votes_table.ts","../src/module_bindings/index.ts","../src/utils/context.ts","../src/utils/toon.ts","../src/commands/doctor.ts","../src/utils/enums.ts","../src/utils/time.ts","../src/commands/nexus/agent-handlers.ts","../src/commands/nexus/agent.ts","../src/commands/nexus/discover.ts","../src/commands/nexus/idea.ts","../src/commands/nexus/message-handlers.ts","../src/commands/nexus/message.ts","../src/commands/nexus/project.ts","../src/commands/nexus/task-handlers.ts","../src/commands/nexus/task.ts","../src/commands/nexus-daemon.ts","../src/generated/decoders.ts","../src/utils/sql.ts","../src/commands/query.ts","../src/commands/sign.ts","../src/commands/token.ts","../src/commands/wallet/create.ts","../src/commands/wallet/default.ts","../src/commands/wallet/delete.ts","../src/commands/wallet/import.ts","../src/commands/wallet/list.ts","../src/commands/wallet/show.ts","../src/commands/wallet/index.ts","../src/commands/whoami.ts","../src/index.ts"],"sourcesContent":["export interface NexusConfig {\n\tissuer: string;\n\twalletDir: string;\n\tdefaultWallet?: string;\n\tpasswordMinLength: number;\n\ttokenCacheDir: string;\n\trequestTimeout: number;\n\tspacetime: {\n\t\thost: string;\n\t\tmodule: string;\n\t};\n}\n\nexport const DEFAULT_CONFIG: NexusConfig = {\n\tissuer: \"https://api.zenon.red\",\n\twalletDir: \"~/.probe/wallets\",\n\tpasswordMinLength: 8,\n\ttokenCacheDir: \"~/.probe/tokens\",\n\trequestTimeout: 30000,\n\tspacetime: {\n\t\thost: \"wss://db.zenon.red\",\n\t\tmodule: \"nexus\",\n\t},\n};\n\nexport interface WalletInfo {\n\tname: string;\n\taddress: string;\n\tpublicKey?: string;\n\tcreatedAt?: string;\n}\n\nexport interface WalletCreationResult {\n\tname: string;\n\taddress: string;\n\tpublicKey: string;\n\tmnemonic: string;\n}\n\nexport interface ChallengeResponse {\n\tnonce: string;\n\tchallenge: string;\n\texpiresAt: string;\n}\n\nexport interface TokenResponse {\n\taccessToken: string;\n\tidToken: string;\n\texpiresIn: number;\n}\n\nexport interface OutputResult<T> {\n\tsuccess: boolean;\n\tdata?: T;\n\terror?: { code: string; message: string; suggestion?: string };\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { NexusConfig } from \"~/types/index.js\";\n\nconst CONFIG_PATH = join(homedir(), \".probe\", \"config.json\");\nconst CONFIG_DIR = join(homedir(), \".probe\");\n\nexport async function loadUserConfig(): Promise<Partial<NexusConfig>> {\n\ttry {\n\t\tawait access(CONFIG_PATH);\n\t\tconst content = await readFile(CONFIG_PATH, \"utf-8\");\n\t\treturn JSON.parse(content) as Partial<NexusConfig>;\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nexport async function saveUserConfig(\n\tconfig: Partial<NexusConfig>,\n): Promise<void> {\n\tawait mkdir(CONFIG_DIR, { recursive: true });\n\tawait writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {\n\t\tmode: 0o600,\n\t});\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { loadConfig } from \"c12\";\nimport { DEFAULT_CONFIG, type NexusConfig } from \"~/types/index.js\";\nimport { loadUserConfig } from \"./user-config.js\";\n\nlet cachedConfig: NexusConfig | null = null;\n\nexport async function getConfig(): Promise<NexusConfig> {\n\tif (cachedConfig) {\n\t\treturn cachedConfig;\n\t}\n\n\tconst [c12Config, userConfig] = await Promise.all([\n\t\tloadConfig<NexusConfig>({\n\t\t\tname: \"probe\",\n\t\t\tdefaults: DEFAULT_CONFIG,\n\t\t\tenvName: \"PROBE\",\n\t\t}),\n\t\tloadUserConfig(),\n\t]);\n\n\tcachedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...c12Config.config,\n\t\t...userConfig,\n\t};\n\n\tcachedConfig.walletDir = expandHomeDir(cachedConfig.walletDir);\n\tcachedConfig.tokenCacheDir = expandHomeDir(cachedConfig.tokenCacheDir);\n\n\treturn cachedConfig;\n}\n\nexport function clearConfigCache(): void {\n\tcachedConfig = null;\n}\n\nexport function expandHomeDir(path: string): string {\n\tif (path.startsWith(\"~/\")) {\n\t\treturn join(homedir(), path.slice(2));\n\t}\n\treturn path;\n}\n\nexport async function getWalletDir(): Promise<string> {\n\tconst config = await getConfig();\n\treturn config.walletDir;\n}\n\nexport async function getTokenCacheDir(): Promise<string> {\n\tconst config = await getConfig();\n\treturn config.tokenCacheDir;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spinner as clackSpinner, log } from \"@clack/prompts\";\nimport { dim } from \"kolorist\";\nimport type { OutputResult } from \"~/types/index.js\";\n\nconst outputModeStorage = new AsyncLocalStorage<{ jsonMode: boolean }>();\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n\nconst printJson = (value: unknown, stderr = false): void => {\n\tconst serialized = JSON.stringify(value, jsonReplacer, 2);\n\tif (stderr) {\n\t\tconsole.error(serialized);\n\t\treturn;\n\t}\n\tconsole.log(serialized);\n};\n\nexport function setJsonMode(enabled: boolean) {\n\toutputModeStorage.enterWith({ jsonMode: enabled });\n}\n\nexport function isJsonMode(): boolean {\n\treturn outputModeStorage.getStore()?.jsonMode === true;\n}\n\nexport function success<T>(data: T): void {\n\tif (isJsonMode()) {\n\t\tprintJson({ success: true, data });\n\t}\n}\n\nexport function error(\n\tcode: string,\n\tmessage: string,\n\tsuggestion?: string,\n\texitCode = 1,\n): never {\n\tif (isJsonMode()) {\n\t\tconst output: OutputResult<never> = {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode,\n\t\t\t\tmessage,\n\t\t\t\t...(suggestion && { suggestion }),\n\t\t\t},\n\t\t};\n\t\tprintJson(output, true);\n\t\tprocess.exit(exitCode);\n\t} else {\n\t\tlog.error(message);\n\t\tif (suggestion) {\n\t\t\tconsole.error(`${dim(\"hint:\")} ${suggestion}`);\n\t\t}\n\t\tprocess.exit(exitCode);\n\t}\n}\n\nexport function info(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.info(message);\n\t}\n}\n\nexport function successMessage(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.success(message);\n\t}\n}\n\nexport function warning(message: string): void {\n\tif (!isJsonMode()) {\n\t\tlog.warn(message);\n\t}\n}\n\nexport function spinner(message: string) {\n\tif (isJsonMode()) {\n\t\treturn {\n\t\t\tstart: () => {},\n\t\t\tstop: () => {},\n\t\t\tsucceed: () => {},\n\t\t\tfail: () => {},\n\t\t};\n\t}\n\n\tconst clack = clackSpinner();\n\n\tconst start = () => {\n\t\tclack.start(message);\n\t};\n\n\tconst stop = () => {\n\t\tclack.stop();\n\t};\n\n\tconst succeed = (msg?: string) => {\n\t\tclack.stop(msg || message, 0);\n\t};\n\n\tconst fail = (msg?: string) => {\n\t\tclack.stop(msg || message, 1);\n\t};\n\n\treturn {\n\t\tstart,\n\t\tstop,\n\t\tsucceed,\n\t\tfail,\n\t};\n}\n","import { readFile } from \"node:fs/promises\";\nimport { password, text } from \"@clack/prompts\";\nimport { error, isJsonMode } from \"./output.js\";\n\nconst readTrimmedFile = async (\n\tfilePath: string,\n\tlabel: string,\n): Promise<string> => {\n\ttry {\n\t\treturn (await readFile(filePath, \"utf-8\")).trim();\n\t} catch {\n\t\terror(\"FILE_READ_ERROR\", `Failed to read ${label} file: ${filePath}`);\n\t}\n};\n\nexport interface ResolvePasswordInput {\n\tpasswordFile?: string;\n\tenvVar?: string;\n\tpromptMessage: string;\n\tjsonModeError: string;\n\tminLength?: number;\n\tconfirmPromptMessage?: string;\n}\n\nexport const resolvePasswordInput = async (\n\toptions: ResolvePasswordInput,\n): Promise<string> => {\n\tif (options.passwordFile) {\n\t\treturn readTrimmedFile(options.passwordFile, \"password\");\n\t}\n\n\tconst envVar = options.envVar || \"PROBE_WALLET_PASSWORD\";\n\tconst fromEnv = process.env[envVar];\n\tif (fromEnv) {\n\t\treturn fromEnv;\n\t}\n\n\tif (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n\t\terror(\"PASSWORD_REQUIRED\", options.jsonModeError);\n\t}\n\n\tconst first = await password({\n\t\tmessage: options.promptMessage,\n\t\tvalidate: (value) => {\n\t\t\tif (options.minLength && value.length < options.minLength) {\n\t\t\t\treturn `Password must be at least ${options.minLength} characters`;\n\t\t\t}\n\t\t},\n\t});\n\n\tif (typeof first !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\n\tif (!options.confirmPromptMessage) {\n\t\treturn first;\n\t}\n\n\tconst second = await password({\n\t\tmessage: options.confirmPromptMessage,\n\t\tvalidate: (value) =>\n\t\t\tvalue === first ? undefined : \"Passwords do not match\",\n\t});\n\tif (typeof second !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\n\treturn first;\n};\n\nexport interface ResolveMnemonicInput {\n\tmnemonic?: string;\n\tmnemonicFile?: string;\n\tenvVar?: string;\n\tjsonModeError: string;\n}\n\nexport const resolveMnemonicInput = async (\n\toptions: ResolveMnemonicInput,\n): Promise<string> => {\n\tif (options.mnemonic) {\n\t\treturn options.mnemonic;\n\t}\n\n\tif (options.mnemonicFile) {\n\t\treturn readTrimmedFile(options.mnemonicFile, \"mnemonic\");\n\t}\n\n\tconst envVar = options.envVar || \"PROBE_WALLET_MNEMONIC\";\n\tconst fromEnv = process.env[envVar];\n\tif (fromEnv) {\n\t\treturn fromEnv;\n\t}\n\n\tif (isJsonMode() || !process.stdin.isTTY || !process.stdout.isTTY) {\n\t\terror(\"MNEMONIC_REQUIRED\", options.jsonModeError);\n\t}\n\n\tconst input = await text({\n\t\tmessage: \"Enter mnemonic phrase:\",\n\t\tvalidate: (value) =>\n\t\t\tvalue.trim().split(/\\s+/).length === 24\n\t\t\t\t? undefined\n\t\t\t\t: \"Mnemonic must be 24 words\",\n\t});\n\tif (typeof input !== \"string\") {\n\t\tprocess.exit(130);\n\t}\n\treturn input;\n};\n","import { blue, bold, cyan, dim, gray, green, white } from \"kolorist\";\n\ninterface HelpSectionItem {\n\tname: string;\n\tdetail: string;\n}\n\ninterface HelpSpec {\n\tcommand: string;\n\tdescription: string;\n\tusage: string[];\n\tactions?: HelpSectionItem[];\n\toptions?: HelpSectionItem[];\n\texamples?: string[];\n\tnotes?: string[];\n}\n\nconst actionHelpCommands = new Set([\n\t\"agent\",\n\t\"task\",\n\t\"message\",\n\t\"idea\",\n\t\"discover\",\n\t\"project\",\n\t\"config\",\n]);\nconst directHelpCommands = new Set([\n\t\"wallet\",\n\t\"auth\",\n\t\"sign\",\n\t\"token\",\n\t\"nexus\",\n\t\"query\",\n\t\"doctor\",\n]);\nconst walletSubcommands = new Set([\n\t\"create\",\n\t\"import\",\n\t\"list\",\n\t\"show\",\n\t\"delete\",\n\t\"default\",\n]);\n\nlet forceHelpFlag = false;\n\nconst neonBadge = (text: string): string =>\n\t`\\u001b[48;2;120;239;93m\\u001b[38;2;12;28;16m ${text} \\u001b[0m`;\nconst section = (label: string): string => neonBadge(label.toUpperCase());\n\nconst renderItems = (\n\titems: HelpSectionItem[],\n\tnameColor: (value: string) => string,\n): string => {\n\tconst width = Math.max(...items.map((i) => i.name.length), 0);\n\treturn items\n\t\t.map((i) => ` ${nameColor(i.name.padEnd(width))} ${i.detail}`)\n\t\t.join(\"\\n\");\n};\n\nexport const printHelp = (spec: HelpSpec): void => {\n\tconst notes = [...(spec.notes || [])];\n\tconst hasHostModuleOption = (spec.options || []).some(\n\t\t(item) => item.name.includes(\"--host\") && item.name.includes(\"--module\"),\n\t);\n\tconst hasHostModuleNote = notes.some(\n\t\t(note) => note.includes(\"--host\") && note.includes(\"--module\"),\n\t);\n\tif (hasHostModuleOption && !hasHostModuleNote) {\n\t\tnotes.push(\n\t\t\t\"--host sets the SpacetimeDB server endpoint; --module sets the target module/database name (default: nexus).\",\n\t\t);\n\t}\n\n\tconst lines: string[] = [];\n\tlines.push(\n\t\t`${bold(white(spec.command))} ${dim(\"•\")} ${gray(spec.description)}`,\n\t);\n\n\tlines.push(\"\");\n\tlines.push(section(\"Usage\"));\n\tfor (const entry of spec.usage) {\n\t\tlines.push(` ${white(entry)}`);\n\t}\n\n\tif (spec.actions && spec.actions.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Actions\"));\n\t\tlines.push(renderItems(spec.actions, green));\n\t}\n\n\tif (spec.options && spec.options.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Options\"));\n\t\tlines.push(renderItems(spec.options, blue));\n\t}\n\n\tif (spec.examples && spec.examples.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Examples\"));\n\t\tfor (const example of spec.examples) {\n\t\t\tlines.push(` ${cyan(example)}`);\n\t\t}\n\t}\n\n\tif (notes.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(section(\"Notes\"));\n\t\tfor (const note of notes) {\n\t\t\tlines.push(` ${dim(\"-\")} ${note}`);\n\t\t}\n\t}\n\n\tconsole.log(lines.join(\"\\n\"));\n};\n\nexport const setForceHelpRequested = (enabled: boolean): void => {\n\tforceHelpFlag = enabled;\n};\n\nexport const forceHelpRequested = (): boolean => forceHelpFlag;\n\nexport const normalizeHelpArgv = (\n\targv: string[],\n): { argv: string[]; forceHelp: boolean } => {\n\tconst hasHelp = argv.includes(\"--help\") || argv.includes(\"-h\");\n\tif (!hasHelp) {\n\t\treturn { argv, forceHelp: false };\n\t}\n\n\tif (argv.every((arg) => arg.startsWith(\"-\"))) {\n\t\treturn { argv: [], forceHelp: true };\n\t}\n\n\tconst command = argv.find((arg) => !arg.startsWith(\"-\"));\n\tif (!command) {\n\t\treturn { argv, forceHelp: true };\n\t}\n\n\tif (actionHelpCommands.has(command)) {\n\t\treturn { argv: [command], forceHelp: true };\n\t}\n\n\tif (!directHelpCommands.has(command)) {\n\t\treturn { argv, forceHelp: true };\n\t}\n\n\tif (command === \"wallet\") {\n\t\tconst positionals = argv.filter((arg) => !arg.startsWith(\"-\"));\n\t\tif (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n\t\t\treturn { argv: [command, positionals[1]], forceHelp: true };\n\t\t}\n\t}\n\n\treturn { argv: [command], forceHelp: true };\n};\n","import type { ChallengeResponse, TokenResponse } from \"~/types/index.js\";\nimport { getConfig } from \"./config.js\";\n\nexport async function requestChallenge(\n\taddress: string,\n\tissuerOverride?: string,\n): Promise<ChallengeResponse> {\n\tconst config = await getConfig();\n\tconst issuer = issuerOverride || config.issuer;\n\tconst url = `${issuer}/auth/challenge`;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ address }),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Challenge request failed: ${error}`);\n\t}\n\n\tconst data = await response.json();\n\treturn {\n\t\tnonce: data.nonce,\n\t\tchallenge: data.challenge,\n\t\texpiresAt: data.expires_at,\n\t};\n}\n\nexport async function exchangeToken(\n\taddress: string,\n\tpublicKey: string,\n\tsignature: string,\n\tnonce: string,\n\tissuerOverride?: string,\n): Promise<TokenResponse> {\n\tconst config = await getConfig();\n\tconst issuer = issuerOverride || config.issuer;\n\tconst url = `${issuer}/auth/token`;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({\n\t\t\taddress,\n\t\t\tpublic_key: publicKey,\n\t\t\tsignature,\n\t\t\tnonce,\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response.text();\n\t\tthrow new Error(`Token exchange failed: ${error}`);\n\t}\n\n\tconst data = await response.json();\n\treturn {\n\t\taccessToken: data.access_token,\n\t\tidToken: data.id_token,\n\t\texpiresIn: data.expires_in,\n\t};\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getTokenCacheDir } from \"./config.js\";\n\nexport async function cacheToken(\n\twallet: string,\n\ttoken: string,\n\texpiresAt: string,\n): Promise<void> {\n\tconst cacheDir = await getTokenCacheDir();\n\n\ttry {\n\t\tawait mkdir(cacheDir, { recursive: true });\n\t} catch {}\n\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\tconst data = {\n\t\ttoken,\n\t\texpiresAt,\n\t};\n\n\tawait writeFile(cachePath, JSON.stringify(data), { mode: 0o600 });\n}\n\nexport async function getCachedToken(\n\twallet: string,\n): Promise<{ token: string; expiresAt: string } | null> {\n\tconst cacheDir = await getTokenCacheDir();\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\n\ttry {\n\t\tawait access(cachePath);\n\t\tconst content = await readFile(cachePath, \"utf-8\");\n\t\treturn JSON.parse(content);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function clearCachedToken(wallet: string): Promise<void> {\n\tconst cacheDir = await getTokenCacheDir();\n\tconst cachePath = join(cacheDir, `${wallet}.jwt`);\n\n\ttry {\n\t\tawait access(cachePath);\n\t\tconst { unlink } = await import(\"node:fs/promises\");\n\t\tawait unlink(cachePath);\n\t} catch {}\n}\n","import {\n\taccess,\n\tmkdir,\n\treaddir,\n\treadFile,\n\tunlink,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { KeyFile, KeyStore } from \"znn-typescript-sdk\";\nimport type { WalletCreationResult, WalletInfo } from \"~/types/index.js\";\nimport { getWalletDir } from \"./config.js\";\n\nasync function ensureWalletDir(): Promise<string> {\n\tconst walletDir = await getWalletDir();\n\ttry {\n\t\tawait mkdir(walletDir, { recursive: true });\n\t} catch {}\n\treturn walletDir;\n}\n\nasync function getWalletFilePath(name: string): Promise<string> {\n\tconst walletDir = await ensureWalletDir();\n\treturn join(walletDir, `${name}.json`);\n}\n\nexport async function createWallet(\n\tname: string,\n\tpassword: string,\n): Promise<WalletCreationResult> {\n\tconst exists = await walletExists(name);\n\tif (exists) {\n\t\tthrow new Error(`Wallet '${name}' already exists`);\n\t}\n\n\tconst keyStore = KeyStore.newRandom();\n\tconst keyFile = KeyFile.setPassword(password);\n\tconst encryptedData = await keyFile.encrypt(keyStore);\n\n\tconst walletPath = await getWalletFilePath(name);\n\tawait writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n\tconst keyPair = keyStore.getKeyPair(0);\n\tconst address = keyPair.getAddress();\n\tconst publicKey = keyPair.getPublicKey();\n\n\treturn {\n\t\tname,\n\t\taddress: address.toString(),\n\t\tpublicKey: publicKey.toString(\"hex\"),\n\t\tmnemonic: keyStore.mnemonic || \"\",\n\t};\n}\n\nexport async function importWallet(\n\tname: string,\n\tmnemonic: string,\n\tpassword: string,\n): Promise<WalletInfo> {\n\tconst exists = await walletExists(name);\n\tif (exists) {\n\t\tthrow new Error(`Wallet '${name}' already exists`);\n\t}\n\n\tconst keyStore = KeyStore.fromMnemonic(mnemonic);\n\tconst keyFile = KeyFile.setPassword(password);\n\tconst encryptedData = await keyFile.encrypt(keyStore);\n\n\tconst walletPath = await getWalletFilePath(name);\n\tawait writeFile(walletPath, JSON.stringify(encryptedData, null, 2), \"utf-8\");\n\n\tconst keyPair = keyStore.getKeyPair(0);\n\tconst address = keyPair.getAddress();\n\n\treturn {\n\t\tname,\n\t\taddress: address.toString(),\n\t};\n}\n\nexport async function listWallets(): Promise<WalletInfo[]> {\n\tconst walletDir = await getWalletDir();\n\n\ttry {\n\t\tconst files = await readdir(walletDir);\n\t\tconst wallets: WalletInfo[] = [];\n\n\t\tfor (const file of files) {\n\t\t\tif (file.endsWith(\".json\")) {\n\t\t\t\tconst name = file.slice(0, -5);\n\t\t\t\tconst info = await getWalletInfo(name);\n\t\t\t\tif (info) {\n\t\t\t\t\twallets.push(info);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn wallets;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nexport async function getWalletInfo(name: string): Promise<WalletInfo | null> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tconst content = await readFile(walletPath, \"utf-8\");\n\t\tconst data = JSON.parse(content);\n\t\tconst stats = await stat(walletPath);\n\n\t\treturn {\n\t\t\tname,\n\t\t\taddress: data.address || data.baseAddress,\n\t\t\tcreatedAt: data.timestamp\n\t\t\t\t? new Date(data.timestamp * 1000).toISOString()\n\t\t\t\t: new Date(stats.mtime).toISOString(),\n\t\t};\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function loadWallet(\n\tname: string,\n\tpassword: string,\n): Promise<KeyStore> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tconst content = await readFile(walletPath, \"utf-8\");\n\t\tconst encryptedData = JSON.parse(content);\n\n\t\tconst keyFile = KeyFile.setPassword(password);\n\t\tconst keyStore = await keyFile.decrypt(encryptedData);\n\n\t\treturn keyStore;\n\t} catch (err) {\n\t\tthrow new Error(\n\t\t\t`Failed to load wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n\nexport async function deleteWallet(name: string): Promise<void> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tawait unlink(walletPath);\n\t} catch (err) {\n\t\tthrow new Error(\n\t\t\t`Failed to delete wallet: ${err instanceof Error ? err.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n\nexport async function walletExists(name: string): Promise<boolean> {\n\tconst walletPath = await getWalletFilePath(name);\n\n\ttry {\n\t\tawait access(walletPath);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function stat(path: string) {\n\tconst { stat } = await import(\"node:fs/promises\");\n\treturn stat(path);\n}\n","import { Buffer } from \"node:buffer\";\nimport { defineCommand } from \"citty\";\nimport type { KeyPair } from \"znn-typescript-sdk\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { exchangeToken, requestChallenge } from \"~/utils/oidc.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tspinner,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { cacheToken, getCachedToken } from \"~/utils/token-cache.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"auth\",\n\t\tdescription: \"Complete OIDC authentication flow\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name, or status action\",\n\t\t\trequired: false,\n\t\t},\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override (used with auth status)\",\n\t\t},\n\t\t\"expect-address\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Expected Zenon address safety check (z1...)\",\n\t\t},\n\t\tissuer: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"OIDC issuer URL override\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tsave: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Save token to cache (default: true)\",\n\t\t\tdefault: true,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\t\tconst requestedAddress = args[\"expect-address\"];\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe auth\",\n\t\t\t\tdescription: \"Complete OIDC authentication flow\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe auth <wallet-name> [options]\",\n\t\t\t\t\t\"probe auth status [--wallet my-wallet]\",\n\t\t\t\t\t\"probe auth my-wallet --save\",\n\t\t\t\t\t\"probe auth my-wallet --expect-address z1q... --save\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--expect-address\",\n\t\t\t\t\t\tdetail: \"Optional safety check against resolved wallet address\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet override for `auth status`\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--issuer\",\n\t\t\t\t\t\tdetail: \"OIDC issuer URL (default from config: issuer)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--save\",\n\t\t\t\t\t\tdetail: \"Save token in local cache (default: true)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n\t\t\t\t\t\"Most users should omit --expect-address; it is for safety checks in external workflows.\",\n\t\t\t\t\t\"Use --issuer only when authenticating against a non-default OIDC server (for example local/dev environments).\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (name === \"status\") {\n\t\t\tconst config = await getConfig();\n\t\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\t\tif (!walletName) {\n\t\t\t\terror(\n\t\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (!cached) {\n\t\t\t\tsuccess({\n\t\t\t\t\twallet: walletName,\n\t\t\t\t\tauthenticated: false,\n\t\t\t\t\tvalid: false,\n\t\t\t\t\treason: \"no_cached_token\",\n\t\t\t\t});\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(`Wallet: ${walletName}`);\n\t\t\t\t\tconsole.log(\"Status: Not authenticated (no cached token)\");\n\t\t\t\t\tconsole.log(`Next: probe auth ${walletName} --save`);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst expiresAt = new Date(cached.expiresAt);\n\t\t\tconst expiresIn = Math.floor((expiresAt.getTime() - Date.now()) / 1000);\n\t\t\tconst valid = Number.isFinite(expiresIn) && expiresIn > 0;\n\t\t\tsuccess({\n\t\t\t\twallet: walletName,\n\t\t\t\tauthenticated: true,\n\t\t\t\tvalid,\n\t\t\t\texpiresAt: cached.expiresAt,\n\t\t\t\texpiresIn: Math.max(0, expiresIn),\n\t\t\t});\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Wallet: ${walletName}`);\n\t\t\t\tconsole.log(`Status: ${valid ? \"Authenticated\" : \"Token expired\"}`);\n\t\t\t\tconsole.log(`Expires: ${expiresAt.toUTCString()}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter wallet password:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt in a TTY session\",\n\t\t});\n\n\t\tlet keyPair: KeyPair | undefined;\n\t\tlet walletAddress: string;\n\t\tlet address: string;\n\t\ttry {\n\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\tkeyPair = keyStore.getKeyPair(0);\n\t\t\tconst addr = keyPair.getAddress();\n\t\t\twalletAddress = addr.toString();\n\n\t\t\tif (requestedAddress && walletAddress !== requestedAddress) {\n\t\t\t\terror(\n\t\t\t\t\t\"ADDRESS_MISMATCH\",\n\t\t\t\t\t`Wallet address ${walletAddress} does not match provided address ${requestedAddress}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\taddress = requestedAddress || walletAddress;\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LOAD_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load wallet\",\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst challengeSpinner = spinner(\n\t\t\t\t\"Requesting challenge from OIDC provider...\",\n\t\t\t);\n\t\t\tchallengeSpinner.start();\n\n\t\t\tconst challenge = await requestChallenge(address, args.issuer);\n\t\t\tchallengeSpinner.succeed();\n\n\t\t\tconst signSpinner = spinner(\"Signing challenge...\");\n\t\t\tsignSpinner.start();\n\n\t\t\tconst signature = keyPair.sign(Buffer.from(challenge.challenge));\n\t\t\tconst publicKey = keyPair.getPublicKey();\n\t\t\tsignSpinner.succeed();\n\n\t\t\tconst exchangeSpinner = spinner(\"Exchanging for token...\");\n\t\t\texchangeSpinner.start();\n\n\t\t\tconst tokenResponse = await exchangeToken(\n\t\t\t\taddress,\n\t\t\t\tpublicKey.toString(\"hex\"),\n\t\t\t\tsignature.toString(\"hex\"),\n\t\t\t\tchallenge.nonce,\n\t\t\t\targs.issuer,\n\t\t\t);\n\t\t\texchangeSpinner.succeed();\n\n\t\t\tconst expiresAt = new Date(\n\t\t\t\tDate.now() + tokenResponse.expiresIn * 1000,\n\t\t\t).toISOString();\n\n\t\t\tif (args.save) {\n\t\t\t\tawait cacheToken(name, tokenResponse.accessToken, expiresAt);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\taddress,\n\t\t\t\ttoken: tokenResponse.accessToken,\n\t\t\t\texpiresAt,\n\t\t\t\texpiresIn: tokenResponse.expiresIn,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(\"Authentication successful\");\n\t\t\t\tif (args.save) {\n\t\t\t\t\tconsole.log(\"Token saved to wallet cache.\");\n\t\t\t\t}\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Expires: ${new Date(expiresAt).toUTCString()} (${Math.floor(tokenResponse.expiresIn / 86400)} days)`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"AUTH_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Authentication failed\",\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { clearConfigCache, getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n\tconst parts = path.split(\".\");\n\tlet current: unknown = obj;\n\tfor (const part of parts) {\n\t\tif (current && typeof current === \"object\" && part in current) {\n\t\t\tcurrent = (current as Record<string, unknown>)[part];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\treturn current;\n}\n\nfunction setNestedValue(\n\tobj: Record<string, unknown>,\n\tpath: string,\n\tvalue: unknown,\n): void {\n\tconst parts = path.split(\".\");\n\tlet current = obj;\n\tfor (let i = 0; i < parts.length - 1; i++) {\n\t\tconst part = parts[i];\n\t\tif (!(part in current) || typeof current[part] !== \"object\") {\n\t\t\tcurrent[part] = {};\n\t\t}\n\t\tcurrent = current[part] as Record<string, unknown>;\n\t}\n\tcurrent[parts[parts.length - 1]] = value;\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"config\",\n\t\tdescription: \"Manage configuration settings\",\n\t},\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: get, set, list\",\n\t\t\trequired: false,\n\t\t},\n\t\tkey: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Configuration key\",\n\t\t\trequired: false,\n\t\t},\n\t\tvalue: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Configuration value\",\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe config\",\n\t\t\t\tdescription: \"Read and write CLI configuration values\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe config <action> [key] [value]\",\n\t\t\t\t\t\"probe config get spacetime.host\",\n\t\t\t\t\t\"probe config set defaultWallet agent-wallet\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"get <key>\", detail: \"Get one config value\" },\n\t\t\t\t\t{ name: \"set <key> <value>\", detail: \"Set one config value\" },\n\t\t\t\t\t{ name: \"list\", detail: \"List merged config and user overrides\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Valid keys: issuer, walletDir, defaultWallet, tokenCacheDir, requestTimeout, spacetime.host, spacetime.module.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\t\tconst validKeys = [\n\t\t\t\"issuer\",\n\t\t\t\"walletDir\",\n\t\t\t\"defaultWallet\",\n\t\t\t\"tokenCacheDir\",\n\t\t\t\"requestTimeout\",\n\t\t\t\"spacetime.host\",\n\t\t\t\"spacetime.module\",\n\t\t];\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tif (!args.key) {\n\t\t\t\t\t\terror(\"KEY_REQUIRED\", \"Configuration key required\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!validKeys.includes(args.key)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_KEY\",\n\t\t\t\t\t\t\t`Invalid configuration key: ${args.key}`,\n\t\t\t\t\t\t\t`Valid keys: ${validKeys.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst config = await getConfig();\n\t\t\t\t\tconst value = getNestedValue(\n\t\t\t\t\t\tconfig as unknown as Record<string, unknown>,\n\t\t\t\t\t\targs.key,\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({ [args.key]: value });\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(`${args.key}: ${value}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"set\": {\n\t\t\t\t\tif (!args.key || args.value === undefined) {\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Configuration key and value required\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!validKeys.includes(args.key)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_KEY\",\n\t\t\t\t\t\t\t`Invalid configuration key: ${args.key}`,\n\t\t\t\t\t\t\t`Valid keys: ${validKeys.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet parsedValue: string | boolean | number = args.value;\n\n\t\t\t\t\tif (args.key === \"requestTimeout\") {\n\t\t\t\t\t\tparsedValue = parseInt(args.value, 10);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\t\tsetNestedValue(\n\t\t\t\t\t\tuserConfig as unknown as Record<string, unknown>,\n\t\t\t\t\t\targs.key,\n\t\t\t\t\t\tparsedValue,\n\t\t\t\t\t);\n\t\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t\t\tclearConfigCache();\n\n\t\t\t\t\tsuccess({ [args.key]: parsedValue });\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tsuccessMessage(`Set ${args.key} = ${parsedValue}`);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst config = await getConfig();\n\t\t\t\t\tconst userConfig = await loadUserConfig();\n\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\tuserConfig,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\"Configuration:\");\n\t\t\t\t\t\tconsole.log(` issuer: ${config.issuer}`);\n\t\t\t\t\t\tconsole.log(` walletDir: ${config.walletDir}`);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t` defaultWallet: ${config.defaultWallet || \"(not set)\"}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(` passwordMinLength: ${config.passwordMinLength}`);\n\t\t\t\t\t\tconsole.log(` tokenCacheDir: ${config.tokenCacheDir}`);\n\t\t\t\t\t\tconsole.log(` requestTimeout: ${config.requestTimeout}`);\n\t\t\t\t\t\tconsole.log(` spacetime.host: ${config.spacetime.host}`);\n\t\t\t\t\t\tconsole.log(` spacetime.module: ${config.spacetime.module}`);\n\n\t\t\t\t\t\tif (Object.keys(userConfig).length > 0) {\n\t\t\t\t\t\t\tconsole.log(\"\\nUser overrides:\");\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(userConfig)) {\n\t\t\t\t\t\t\t\tconsole.log(` ${key}: ${JSON.stringify(value)}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: get, set, list\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"CONFIG_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Configuration error\",\n\t\t\t);\n\t\t}\n\t},\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport const Agent = __t.object(\"Agent\", {\n\tid: __t.string(),\n\tname: __t.string(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n\tcapabilities: __t.array(__t.string()),\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\tzenonAddress: __t.string(),\n\tidentity: __t.identity(),\n\tlastHeartbeat: __t.timestamp(),\n\tcurrentTaskId: __t.option(__t.u64()),\n\tcreatedAt: __t.timestamp(),\n\tlastActiveAt: __t.timestamp(),\n});\nexport type Agent = __Infer<typeof Agent>;\n\n// The tagged union or sum type for the algebraic type `AgentRole`.\nexport const AgentRole = __t.enum(\"AgentRole\", {\n\tZoe: __t.unit(),\n\tAdmin: __t.unit(),\n\tZeno: __t.unit(),\n});\nexport type AgentRole = __Infer<typeof AgentRole>;\n\n// The tagged union or sum type for the algebraic type `AgentStatus`.\nexport const AgentStatus = __t.enum(\"AgentStatus\", {\n\tOnline: __t.unit(),\n\tOffline: __t.unit(),\n\tWorking: __t.unit(),\n});\nexport type AgentStatus = __Infer<typeof AgentStatus>;\n\nexport const Channel = __t.object(\"Channel\", {\n\tid: __t.u64(),\n\tname: __t.string(),\n\tcreatedBy: __t.string(),\n\tcreatedAt: __t.timestamp(),\n});\nexport type Channel = __Infer<typeof Channel>;\n\nexport const Config = __t.object(\"Config\", {\n\tkey: __t.string(),\n\tvalue: __t.string(),\n});\nexport type Config = __Infer<typeof Config>;\n\n// The tagged union or sum type for the algebraic type `DependencyType`.\nexport const DependencyType = __t.enum(\"DependencyType\", {\n\tBlocks: __t.unit(),\n\tParentChild: __t.unit(),\n});\nexport type DependencyType = __Infer<typeof DependencyType>;\n\nexport const DiscoveredTask = __t.object(\"DiscoveredTask\", {\n\tid: __t.u64(),\n\tdiscoveredBy: __t.string(),\n\tcurrentTaskId: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string(),\n\tseverity: __t.string(),\n\tget status() {\n\t\treturn DiscoveredTaskStatus;\n\t},\n\tcreatedTaskId: __t.option(__t.u64()),\n\trejectionReason: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n\treviewedAt: __t.option(__t.timestamp()),\n\treviewedBy: __t.option(__t.string()),\n});\nexport type DiscoveredTask = __Infer<typeof DiscoveredTask>;\n\n// The tagged union or sum type for the algebraic type `DiscoveredTaskStatus`.\nexport const DiscoveredTaskStatus = __t.enum(\"DiscoveredTaskStatus\", {\n\tPendingReview: __t.unit(),\n\tApproved: __t.unit(),\n\tRejected: __t.unit(),\n\tEscalatedToIdea: __t.unit(),\n});\nexport type DiscoveredTaskStatus = __Infer<typeof DiscoveredTaskStatus>;\n\n// The tagged union or sum type for the algebraic type `DiscoveryDecision`.\nexport const DiscoveryDecision = __t.enum(\"DiscoveryDecision\", {\n\tApproveAsTask: __t.unit(),\n\tReject: __t.unit(),\n\tEscalateToIdea: __t.unit(),\n});\nexport type DiscoveryDecision = __Infer<typeof DiscoveryDecision>;\n\nexport const Idea = __t.object(\"Idea\", {\n\tid: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n\tget status() {\n\t\treturn IdeaStatus;\n\t},\n\tactiveAgentCount: __t.u32(),\n\tquorum: __t.u16(),\n\tapprovalThreshold: __t.u16(),\n\tvetoThreshold: __t.u16(),\n\tupVotes: __t.u16(),\n\tdownVotes: __t.u16(),\n\tvetoCount: __t.u16(),\n\ttotalVotes: __t.u16(),\n\tcreatedBy: __t.string(),\n\tcreatedAt: __t.timestamp(),\n\tupdatedAt: __t.timestamp(),\n});\nexport type Idea = __Infer<typeof Idea>;\n\n// The tagged union or sum type for the algebraic type `IdeaStatus`.\nexport const IdeaStatus = __t.enum(\"IdeaStatus\", {\n\tVoting: __t.unit(),\n\tApprovedForProject: __t.unit(),\n\tRejected: __t.unit(),\n\tImplemented: __t.unit(),\n});\nexport type IdeaStatus = __Infer<typeof IdeaStatus>;\n\nexport const IdentityRole = __t.object(\"IdentityRole\", {\n\tidentity: __t.identity(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n});\nexport type IdentityRole = __Infer<typeof IdentityRole>;\n\nexport const Message = __t.object(\"Message\", {\n\tid: __t.u64(),\n\tchannelId: __t.u64(),\n\tsenderId: __t.string(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n});\nexport type Message = __Infer<typeof Message>;\n\n// The tagged union or sum type for the algebraic type `MessageType`.\nexport const MessageType = __t.enum(\"MessageType\", {\n\tUser: __t.unit(),\n\tSystem: __t.unit(),\n\tDirective: __t.unit(),\n});\nexport type MessageType = __Infer<typeof MessageType>;\n\nexport const Project = __t.object(\"Project\", {\n\tid: __t.u64(),\n\tsourceIdeaId: __t.u64(),\n\tname: __t.string(),\n\tgithubRepo: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n\tcreatedAt: __t.timestamp(),\n\tcreatedBy: __t.string(),\n});\nexport type Project = __Infer<typeof Project>;\n\nexport const ProjectChannel = __t.object(\"ProjectChannel\", {\n\tprojectId: __t.u64(),\n\tcreatedAt: __t.timestamp(),\n});\nexport type ProjectChannel = __Infer<typeof ProjectChannel>;\n\nexport const ProjectMessage = __t.object(\"ProjectMessage\", {\n\tid: __t.u64(),\n\tprojectId: __t.u64(),\n\tsenderId: __t.string(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n\tcreatedAt: __t.timestamp(),\n});\nexport type ProjectMessage = __Infer<typeof ProjectMessage>;\n\n// The tagged union or sum type for the algebraic type `ProjectStatus`.\nexport const ProjectStatus = __t.enum(\"ProjectStatus\", {\n\tActive: __t.unit(),\n\tPaused: __t.unit(),\n});\nexport type ProjectStatus = __Infer<typeof ProjectStatus>;\n\nexport const Task = __t.object(\"Task\", {\n\tid: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tassignedTo: __t.option(__t.string()),\n\tclaimedAt: __t.option(__t.timestamp()),\n\tgithubIssueUrl: __t.option(__t.string()),\n\tgithubPrUrl: __t.option(__t.string()),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()),\n\treviewCount: __t.u8(),\n\tget blockedFromStatus() {\n\t\treturn __t.option(TaskStatus);\n\t},\n\tarchivedReason: __t.option(__t.string()),\n\tstatusChangedBy: __t.option(__t.identity()),\n\tstatusChangedAt: __t.option(__t.timestamp()),\n\tcreatedAt: __t.timestamp(),\n\tupdatedAt: __t.timestamp(),\n\tcreatedBy: __t.string(),\n});\nexport type Task = __Infer<typeof Task>;\n\nexport const TaskDependency = __t.object(\"TaskDependency\", {\n\tid: __t.u64(),\n\ttaskId: __t.u64(),\n\tdependsOnId: __t.u64(),\n\tget dependencyType() {\n\t\treturn DependencyType;\n\t},\n\tcreatedAt: __t.timestamp(),\n});\nexport type TaskDependency = __Infer<typeof TaskDependency>;\n\n// The tagged union or sum type for the algebraic type `TaskStatus`.\nexport const TaskStatus = __t.enum(\"TaskStatus\", {\n\tOpen: __t.unit(),\n\tClaimed: __t.unit(),\n\tInProgress: __t.unit(),\n\tReview: __t.unit(),\n\tCompleted: __t.unit(),\n\tBlocked: __t.unit(),\n\tArchived: __t.unit(),\n});\nexport type TaskStatus = __Infer<typeof TaskStatus>;\n\nexport const Vote = __t.object(\"Vote\", {\n\tid: __t.u64(),\n\tideaId: __t.u64(),\n\tagentId: __t.string(),\n\tget voteType() {\n\t\treturn VoteType;\n\t},\n\tcreatedAt: __t.timestamp(),\n});\nexport type Vote = __Infer<typeof Vote>;\n\n// The tagged union or sum type for the algebraic type `VoteType`.\nexport const VoteType = __t.enum(\"VoteType\", {\n\tUp: __t.unit(),\n\tDown: __t.unit(),\n\tVeto: __t.unit(),\n});\nexport type VoteType = __Infer<typeof VoteType>;\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { DependencyType } from \"./types\";\n\nexport default {\n\ttaskId: __t.u64(),\n\tdependsOnId: __t.u64(),\n\tget dependencyType() {\n\t\treturn DependencyType;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\ttaskId: __t.u64(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tsourceIdeaId: __t.u64(),\n\tname: __t.string(),\n\tgithubRepo: __t.string(),\n\tdescription: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()),\n\tgithubIssueUrl: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tcurrentTaskId: __t.u64(),\n\tprojectId: __t.u64(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string(),\n\tseverity: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tagentId: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tideaId: __t.u64(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { AgentRole } from \"./types\";\n\nexport default {\n\tagentId: __t.string(),\n\tname: __t.string(),\n\tzenonAddress: __t.string(),\n\tget role() {\n\t\treturn __t.option(AgentRole);\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { DiscoveryDecision } from \"./types\";\n\nexport default {\n\tdiscoveryId: __t.u64(),\n\tget decision() {\n\t\treturn DiscoveryDecision;\n\t},\n\treason: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n\tchannelId: __t.u64(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { MessageType } from \"./types\";\n\nexport default {\n\tprojectId: __t.u64(),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType;\n\t},\n\tcontextId: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { AgentStatus } from \"./types\";\n\nexport default {\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\ttaskId: __t.option(__t.u64()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default {\n\tcapabilities: __t.array(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { ProjectStatus } from \"./types\";\n\nexport default {\n\tprojectId: __t.u64(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { TaskStatus } from \"./types\";\n\nexport default {\n\ttaskId: __t.u64(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tgithubPrUrl: __t.option(__t.string()),\n\tarchiveReason: __t.option(__t.string()),\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nimport { VoteType } from \"./types\";\n\nexport default {\n\tideaId: __t.u64(),\n\tget voteType() {\n\t\treturn VoteType;\n\t},\n};\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { AgentRole, AgentStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.string().primaryKey(),\n\tname: __t.string(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n\tcapabilities: __t.array(__t.string()),\n\tget status() {\n\t\treturn AgentStatus;\n\t},\n\tzenonAddress: __t.string().name(\"zenon_address\"),\n\tidentity: __t.identity(),\n\tlastHeartbeat: __t.timestamp().name(\"last_heartbeat\"),\n\tcurrentTaskId: __t.option(__t.u64()).name(\"current_task_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tlastActiveAt: __t.timestamp().name(\"last_active_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tname: __t.string(),\n\tcreatedBy: __t.string().name(\"created_by\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tkey: __t.string().primaryKey(),\n\tvalue: __t.string(),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { DiscoveredTaskStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tdiscoveredBy: __t.string().name(\"discovered_by\"),\n\tcurrentTaskId: __t.u64().name(\"current_task_id\"),\n\tprojectId: __t.u64().name(\"project_id\"),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tpriority: __t.u8(),\n\ttaskType: __t.string().name(\"task_type\"),\n\tseverity: __t.string(),\n\tget status() {\n\t\treturn DiscoveredTaskStatus;\n\t},\n\tcreatedTaskId: __t.option(__t.u64()).name(\"created_task_id\"),\n\trejectionReason: __t.option(__t.string()).name(\"rejection_reason\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\treviewedAt: __t.option(__t.timestamp()).name(\"reviewed_at\"),\n\treviewedBy: __t.option(__t.string()).name(\"reviewed_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { IdeaStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tcategory: __t.string(),\n\tget status() {\n\t\treturn IdeaStatus;\n\t},\n\tactiveAgentCount: __t.u32().name(\"active_agent_count\"),\n\tquorum: __t.u16(),\n\tapprovalThreshold: __t.u16().name(\"approval_threshold\"),\n\tvetoThreshold: __t.u16().name(\"veto_threshold\"),\n\tupVotes: __t.u16().name(\"up_votes\"),\n\tdownVotes: __t.u16().name(\"down_votes\"),\n\tvetoCount: __t.u16().name(\"veto_count\"),\n\ttotalVotes: __t.u16().name(\"total_votes\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tupdatedAt: __t.timestamp().name(\"updated_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { AgentRole } from \"./types\";\n\nexport default __t.row({\n\tidentity: __t.identity().primaryKey(),\n\tget role() {\n\t\treturn AgentRole;\n\t},\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tchannelId: __t.u64().name(\"channel_id\"),\n\tsenderId: __t.string().name(\"sender_id\"),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType.name(\"message_type\");\n\t},\n\tcontextId: __t.option(__t.string()).name(\"context_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\n\nexport default __t.row({\n\tprojectId: __t.u64().primaryKey().name(\"project_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { MessageType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tprojectId: __t.u64().name(\"project_id\"),\n\tsenderId: __t.string().name(\"sender_id\"),\n\tcontent: __t.string(),\n\tget messageType() {\n\t\treturn MessageType.name(\"message_type\");\n\t},\n\tcontextId: __t.option(__t.string()).name(\"context_id\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { ProjectStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tsourceIdeaId: __t.u64().name(\"source_idea_id\"),\n\tname: __t.string(),\n\tgithubRepo: __t.string().name(\"github_repo\"),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn ProjectStatus;\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { DependencyType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\ttaskId: __t.u64().name(\"task_id\"),\n\tdependsOnId: __t.u64().name(\"depends_on_id\"),\n\tget dependencyType() {\n\t\treturn DependencyType.name(\"dependency_type\");\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { TaskStatus } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tprojectId: __t.u64().name(\"project_id\"),\n\ttitle: __t.string(),\n\tdescription: __t.string(),\n\tget status() {\n\t\treturn TaskStatus;\n\t},\n\tassignedTo: __t.option(__t.string()).name(\"assigned_to\"),\n\tclaimedAt: __t.option(__t.timestamp()).name(\"claimed_at\"),\n\tgithubIssueUrl: __t.option(__t.string()).name(\"github_issue_url\"),\n\tgithubPrUrl: __t.option(__t.string()).name(\"github_pr_url\"),\n\tpriority: __t.u8(),\n\tsourceIdeaId: __t.option(__t.u64()).name(\"source_idea_id\"),\n\treviewCount: __t.u8().name(\"review_count\"),\n\tget blockedFromStatus() {\n\t\treturn __t.option(TaskStatus).name(\"blocked_from_status\");\n\t},\n\tarchivedReason: __t.option(__t.string()).name(\"archived_reason\"),\n\tstatusChangedBy: __t.option(__t.identity()).name(\"status_changed_by\"),\n\tstatusChangedAt: __t.option(__t.timestamp()).name(\"status_changed_at\"),\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n\tupdatedAt: __t.timestamp().name(\"updated_at\"),\n\tcreatedBy: __t.string().name(\"created_by\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\ttype Infer as __Infer,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n} from \"spacetimedb\";\nimport { VoteType } from \"./types\";\n\nexport default __t.row({\n\tid: __t.u64().primaryKey(),\n\tideaId: __t.u64().name(\"idea_id\"),\n\tagentId: __t.string().name(\"agent_id\"),\n\tget voteType() {\n\t\treturn VoteType.name(\"vote_type\");\n\t},\n\tcreatedAt: __t.timestamp().name(\"created_at\"),\n});\n","// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE\n// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.\n\n// This was generated using spacetimedb cli version 2.0.1 (commit a4d29daec8ed35ce4913a335b7210b9ae3933d00).\n\n/* eslint-disable */\n/* tslint:disable */\nimport {\n\ttype AlgebraicTypeType as __AlgebraicTypeType,\n\tconvertToAccessorMap as __convertToAccessorMap,\n\tDbConnectionBuilder as __DbConnectionBuilder,\n\ttype DbConnectionConfig as __DbConnectionConfig,\n\tDbConnectionImpl as __DbConnectionImpl,\n\ttype ErrorContextInterface as __ErrorContextInterface,\n\ttype Event as __Event,\n\ttype EventContextInterface as __EventContextInterface,\n\ttype Infer as __Infer,\n\tmakeQueryBuilder as __makeQueryBuilder,\n\tprocedureSchema as __procedureSchema,\n\tprocedures as __procedures,\n\ttype QueryBuilder as __QueryBuilder,\n\ttype ReducerEventContextInterface as __ReducerEventContextInterface,\n\ttype RemoteModule as __RemoteModule,\n\treducerSchema as __reducerSchema,\n\treducers as __reducers,\n\tSubscriptionBuilderImpl as __SubscriptionBuilderImpl,\n\ttype SubscriptionEventContextInterface as __SubscriptionEventContextInterface,\n\ttype SubscriptionHandleImpl as __SubscriptionHandleImpl,\n\tschema as __schema,\n\tTypeBuilder as __TypeBuilder,\n\tt as __t,\n\ttable as __table,\n\tUuid as __Uuid,\n} from \"spacetimedb\";\n\n// Import all reducer arg schemas\nimport AddTaskDependencyReducer from \"./add_task_dependency_reducer\";\nimport ClaimTaskReducer from \"./claim_task_reducer\";\nimport CreateProjectReducer from \"./create_project_reducer\";\nimport CreateTaskReducer from \"./create_task_reducer\";\nimport DiscoverTaskReducer from \"./discover_task_reducer\";\nimport HeartbeatReducer from \"./heartbeat_reducer\";\nimport MarkIdeaImplementedReducer from \"./mark_idea_implemented_reducer\";\nimport ProposeIdeaReducer from \"./propose_idea_reducer\";\nimport RegisterAgentReducer from \"./register_agent_reducer\";\nimport ReviewDiscoveredTaskReducer from \"./review_discovered_task_reducer\";\nimport SeedUiDataReducer from \"./seed_ui_data_reducer\";\nimport SendMessageReducer from \"./send_message_reducer\";\nimport SendProjectMessageReducer from \"./send_project_message_reducer\";\nimport SetAgentStatusReducer from \"./set_agent_status_reducer\";\nimport UpdateAgentCapabilitiesReducer from \"./update_agent_capabilities_reducer\";\nimport UpdateProjectStatusReducer from \"./update_project_status_reducer\";\nimport UpdateTaskStatusReducer from \"./update_task_status_reducer\";\nimport VoteIdeaReducer from \"./vote_idea_reducer\";\n\n// Import all procedure arg schemas\n\n// Import all table schema definitions\nimport AgentsRow from \"./agents_table\";\nimport ChannelsRow from \"./channels_table\";\nimport ConfigRow from \"./config_table\";\nimport DiscoveredTasksRow from \"./discovered_tasks_table\";\nimport IdeasRow from \"./ideas_table\";\nimport IdentityRolesRow from \"./identity_roles_table\";\nimport MessagesRow from \"./messages_table\";\nimport ProjectChannelsRow from \"./project_channels_table\";\nimport ProjectMessagesRow from \"./project_messages_table\";\nimport ProjectsRow from \"./projects_table\";\nimport TaskDependenciesRow from \"./task_dependencies_table\";\nimport TasksRow from \"./tasks_table\";\nimport VotesRow from \"./votes_table\";\n\n/** Type-only namespace exports for generated type groups. */\n\n/** The schema information for all tables in this module. This is defined the same was as the tables would have been defined in the server. */\nconst tablesSchema = __schema({\n\tagents: __table(\n\t\t{\n\t\t\tname: \"agents\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"identity\", algorithm: \"btree\", columns: [\"identity\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"agents_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"agents_identity_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"identity\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tAgentsRow,\n\t),\n\tchannels: __table(\n\t\t{\n\t\t\tname: \"channels\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_name\", algorithm: \"btree\", columns: [\"name\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"channels_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tChannelsRow,\n\t),\n\tconfig: __table(\n\t\t{\n\t\t\tname: \"config\",\n\t\t\tindexes: [{ name: \"key\", algorithm: \"btree\", columns: [\"key\"] }],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"config_key_key\", constraint: \"unique\", columns: [\"key\"] },\n\t\t\t],\n\t\t},\n\t\tConfigRow,\n\t),\n\tdiscovered_tasks: __table(\n\t\t{\n\t\t\tname: \"discovered_tasks\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"by_created_at\", algorithm: \"btree\", columns: [\"createdAt\"] },\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_priority\", algorithm: \"btree\", columns: [\"priority\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"discovered_tasks_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tDiscoveredTasksRow,\n\t),\n\tideas: __table(\n\t\t{\n\t\t\tname: \"ideas\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"ideas_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tIdeasRow,\n\t),\n\tidentity_roles: __table(\n\t\t{\n\t\t\tname: \"identity_roles\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"identity\", algorithm: \"btree\", columns: [\"identity\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"identity_roles_identity_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"identity\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tIdentityRolesRow,\n\t),\n\tmessages: __table(\n\t\t{\n\t\t\tname: \"messages\",\n\t\t\tindexes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"by_channel\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"channelId\", \"createdAt\"],\n\t\t\t\t},\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"messages_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tMessagesRow,\n\t),\n\tproject_channels: __table(\n\t\t{\n\t\t\tname: \"project_channels\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"project_id\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"project_channels_project_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"projectId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tProjectChannelsRow,\n\t),\n\tproject_messages: __table(\n\t\t{\n\t\t\tname: \"project_messages\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_project\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"project_messages_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tProjectMessagesRow,\n\t),\n\tprojects: __table(\n\t\t{\n\t\t\tname: \"projects\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"by_source_idea_id\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"sourceIdeaId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"projects_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tProjectsRow,\n\t),\n\ttask_dependencies: __table(\n\t\t{\n\t\t\tname: \"task_dependencies\",\n\t\t\tindexes: [\n\t\t\t\t{\n\t\t\t\t\tname: \"by_depends_on_id\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"dependsOnId\"],\n\t\t\t\t},\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_task_id\", algorithm: \"btree\", columns: [\"taskId\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{\n\t\t\t\t\tname: \"task_dependencies_id_key\",\n\t\t\t\t\tconstraint: \"unique\",\n\t\t\t\t\tcolumns: [\"id\"],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tTaskDependenciesRow,\n\t),\n\ttasks: __table(\n\t\t{\n\t\t\tname: \"tasks\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"by_assigned_to\", algorithm: \"btree\", columns: [\"assignedTo\"] },\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{ name: \"by_priority\", algorithm: \"btree\", columns: [\"priority\"] },\n\t\t\t\t{ name: \"by_project_id\", algorithm: \"btree\", columns: [\"projectId\"] },\n\t\t\t\t{ name: \"by_status\", algorithm: \"btree\", columns: [\"status\"] },\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"tasks_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tTasksRow,\n\t),\n\tvotes: __table(\n\t\t{\n\t\t\tname: \"votes\",\n\t\t\tindexes: [\n\t\t\t\t{ name: \"id\", algorithm: \"btree\", columns: [\"id\"] },\n\t\t\t\t{\n\t\t\t\t\tname: \"by_idea_agent\",\n\t\t\t\t\talgorithm: \"btree\",\n\t\t\t\t\tcolumns: [\"ideaId\", \"agentId\"],\n\t\t\t\t},\n\t\t\t],\n\t\t\tconstraints: [\n\t\t\t\t{ name: \"votes_id_key\", constraint: \"unique\", columns: [\"id\"] },\n\t\t\t],\n\t\t},\n\t\tVotesRow,\n\t),\n});\n\n/** The schema information for all reducers in this module. This is defined the same way as the reducers would have been defined in the server, except the body of the reducer is omitted in code generation. */\nconst reducersSchema = __reducers(\n\t__reducerSchema(\"add_task_dependency\", AddTaskDependencyReducer),\n\t__reducerSchema(\"claim_task\", ClaimTaskReducer),\n\t__reducerSchema(\"create_project\", CreateProjectReducer),\n\t__reducerSchema(\"create_task\", CreateTaskReducer),\n\t__reducerSchema(\"discover_task\", DiscoverTaskReducer),\n\t__reducerSchema(\"heartbeat\", HeartbeatReducer),\n\t__reducerSchema(\"mark_idea_implemented\", MarkIdeaImplementedReducer),\n\t__reducerSchema(\"propose_idea\", ProposeIdeaReducer),\n\t__reducerSchema(\"register_agent\", RegisterAgentReducer),\n\t__reducerSchema(\"review_discovered_task\", ReviewDiscoveredTaskReducer),\n\t__reducerSchema(\"seed_ui_data\", SeedUiDataReducer),\n\t__reducerSchema(\"send_message\", SendMessageReducer),\n\t__reducerSchema(\"send_project_message\", SendProjectMessageReducer),\n\t__reducerSchema(\"set_agent_status\", SetAgentStatusReducer),\n\t__reducerSchema(\"update_agent_capabilities\", UpdateAgentCapabilitiesReducer),\n\t__reducerSchema(\"update_project_status\", UpdateProjectStatusReducer),\n\t__reducerSchema(\"update_task_status\", UpdateTaskStatusReducer),\n\t__reducerSchema(\"vote_idea\", VoteIdeaReducer),\n);\n\n/** The schema information for all procedures in this module. This is defined the same way as the procedures would have been defined in the server. */\nconst proceduresSchema = __procedures();\n\n/** The remote SpacetimeDB module schema, both runtime and type information. */\nconst REMOTE_MODULE = {\n\tversionInfo: {\n\t\tcliVersion: \"2.0.1\" as const,\n\t},\n\ttables: tablesSchema.schemaType.tables,\n\treducers: reducersSchema.reducersType.reducers,\n\t...proceduresSchema,\n} satisfies __RemoteModule<\n\ttypeof tablesSchema.schemaType,\n\ttypeof reducersSchema.reducersType,\n\ttypeof proceduresSchema\n>;\n\n/** The tables available in this remote SpacetimeDB module. Each table reference doubles as a query builder. */\nexport const tables: __QueryBuilder<typeof tablesSchema.schemaType> =\n\t__makeQueryBuilder(tablesSchema.schemaType);\n\n/** The reducers available in this remote SpacetimeDB module. */\nexport const reducers = __convertToAccessorMap(\n\treducersSchema.reducersType.reducers,\n);\n\n/** The context type returned in callbacks for all possible events. */\nexport type EventContext = __EventContextInterface<typeof REMOTE_MODULE>;\n/** The context type returned in callbacks for reducer events. */\nexport type ReducerEventContext = __ReducerEventContextInterface<\n\ttypeof REMOTE_MODULE\n>;\n/** The context type returned in callbacks for subscription events. */\nexport type SubscriptionEventContext = __SubscriptionEventContextInterface<\n\ttypeof REMOTE_MODULE\n>;\n/** The context type returned in callbacks for error events. */\nexport type ErrorContext = __ErrorContextInterface<typeof REMOTE_MODULE>;\n/** The subscription handle type to manage active subscriptions created from a {@link SubscriptionBuilder}. */\nexport type SubscriptionHandle = __SubscriptionHandleImpl<typeof REMOTE_MODULE>;\n\n/** Builder class to configure a new subscription to the remote SpacetimeDB instance. */\nexport class SubscriptionBuilder extends __SubscriptionBuilderImpl<\n\ttypeof REMOTE_MODULE\n> {}\n\n/** Builder class to configure a new database connection to the remote SpacetimeDB instance. */\nexport class DbConnectionBuilder extends __DbConnectionBuilder<DbConnection> {}\n\n/** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */\nexport class DbConnection extends __DbConnectionImpl<typeof REMOTE_MODULE> {\n\t/** Creates a new {@link DbConnectionBuilder} to configure and connect to the remote SpacetimeDB instance. */\n\tstatic builder = (): DbConnectionBuilder => {\n\t\treturn new DbConnectionBuilder(\n\t\t\tREMOTE_MODULE,\n\t\t\t(config: __DbConnectionConfig<typeof REMOTE_MODULE>) =>\n\t\t\t\tnew DbConnection(config),\n\t\t);\n\t};\n\n\t/** Creates a new {@link SubscriptionBuilder} to configure a subscription to the remote SpacetimeDB instance. */\n\toverride subscriptionBuilder = (): SubscriptionBuilder => {\n\t\treturn new SubscriptionBuilder(this);\n\t};\n}\n","import type { Identity } from \"spacetimedb\";\nimport {\n\tDbConnection,\n\ttype ErrorContext,\n\ttype tables,\n} from \"~/module_bindings/index.js\";\n\nexport type {\n\tAgent,\n\tChannel,\n\tConfig,\n\tDiscoveredTask,\n\tIdea,\n\tIdentityRole,\n\tMessage,\n\tProject,\n\tProjectChannel,\n\tProjectMessage,\n\tTask,\n\tTaskDependency,\n\tVote,\n} from \"~/module_bindings/types.js\";\n\nimport { getConfig } from \"./config.js\";\nimport { error } from \"./output.js\";\nimport { getCachedToken } from \"./token-cache.js\";\nimport { getWalletInfo } from \"./wallet.js\";\n\ntype TableName = Extract<keyof typeof tables, string>;\n\nexport interface CommandContextOptions {\n\thost?: string;\n\tmodule?: string;\n\twallet?: string;\n\ttoken?: string;\n\tsubscribe?: boolean;\n\tonDisconnect?: (...args: unknown[]) => void;\n}\n\nexport interface AuthInfo {\n\twallet: string;\n\ttoken: string;\n\tidentity: Identity;\n}\n\nexport class CommandContext implements AsyncDisposable {\n\treadonly conn: DbConnection;\n\treadonly identity?: Identity;\n\treadonly token?: string;\n\treadonly auth?: AuthInfo;\n\treadonly config: Awaited<ReturnType<typeof getConfig>>;\n\n\tprivate disposed = false;\n\n\tprivate constructor(\n\t\tconn: DbConnection,\n\t\tconfig: Awaited<ReturnType<typeof getConfig>>,\n\t\tidentity?: Identity,\n\t\ttoken?: string,\n\t\tauth?: AuthInfo,\n\t) {\n\t\tthis.conn = conn;\n\t\tthis.config = config;\n\t\tthis.identity = identity;\n\t\tthis.token = token;\n\t\tthis.auth = auth;\n\t}\n\n\tget db() {\n\t\treturn this.conn.db;\n\t}\n\n\titer<T>(tableName: TableName): T[] {\n\t\tconst db = this.db as Record<string, { iter?: () => IterableIterator<T> }>;\n\t\tconst table = db[tableName];\n\t\tif (table?.iter) {\n\t\t\treturn Array.from(table.iter());\n\t\t}\n\t\treturn [];\n\t}\n\n\tasync [Symbol.asyncDispose](): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.conn.disconnect();\n\t\t}\n\t}\n\n\tstatic async create(\n\t\toptions: CommandContextOptions = {},\n\t): Promise<CommandContext> {\n\t\tconst config = await getConfig();\n\t\tconst host = options.host || config.spacetime.host;\n\t\tconst moduleName = options.module || config.spacetime.module;\n\t\tconst walletName = options.wallet || config.defaultWallet;\n\n\t\tlet token = options.token;\n\t\tlet auth: AuthInfo | undefined;\n\n\t\tif (!token && walletName) {\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (cached) {\n\t\t\t\ttoken = cached.token;\n\t\t\t\tauth = {\n\t\t\t\t\twallet: walletName,\n\t\t\t\t\ttoken: cached.token,\n\t\t\t\t\tidentity: undefined as unknown as Identity,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\treject(new Error(\"Connection timeout\"));\n\t\t\t}, config.requestTimeout);\n\n\t\t\tconst originalConsoleLog = console.log;\n\t\t\tconst originalConsoleError = console.error;\n\t\t\tconst suppressSdkConnectLog = (...logArgs: unknown[]): void => {\n\t\t\t\tconst shouldSuppress = logArgs.some(\n\t\t\t\t\t(arg) =>\n\t\t\t\t\t\ttypeof arg === \"string\" &&\n\t\t\t\t\t\targ.includes(\"Connecting to SpacetimeDB WS...\"),\n\t\t\t\t);\n\t\t\t\tif (!shouldSuppress) {\n\t\t\t\t\toriginalConsoleLog(...(logArgs as Parameters<typeof console.log>));\n\t\t\t\t}\n\t\t\t};\n\t\t\t// Suppress SDK error spam during connection - errors are properly thrown and handled by callers\n\t\t\tconst suppressSdkError = (..._logArgs: unknown[]): void => {\n\t\t\t\t// Errors are handled by onConnectError and rejected properly\n\t\t\t\tif (process.env.PROBE_DEBUG) {\n\t\t\t\t\toriginalConsoleError(\"[probe:debug]\", ..._logArgs);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconsole.log = suppressSdkConnectLog as typeof console.log;\n\t\t\tconsole.error = suppressSdkError as typeof console.error;\n\n\t\t\ttry {\n\t\t\t\tDbConnection.builder()\n\t\t\t\t\t.withUri(host)\n\t\t\t\t\t.withDatabaseName(moduleName)\n\t\t\t\t\t.withToken(token || undefined)\n\t\t\t\t\t.onConnect(\n\t\t\t\t\t\t(conn: DbConnection, identity: Identity, authToken: string) => {\n\t\t\t\t\t\t\tclearTimeout(timeout);\n\n\t\t\t\t\t\t\tif (auth) {\n\t\t\t\t\t\t\t\tauth.identity = identity;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst shouldSubscribe = options.subscribe !== false;\n\n\t\t\t\t\t\t\tif (shouldSubscribe) {\n\t\t\t\t\t\t\t\tconn\n\t\t\t\t\t\t\t\t\t.subscriptionBuilder()\n\t\t\t\t\t\t\t\t\t.onApplied(() => {\n\t\t\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\t\t\tnew CommandContext(\n\t\t\t\t\t\t\t\t\t\t\t\tconn,\n\t\t\t\t\t\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\t\t\t\t\t\tidentity,\n\t\t\t\t\t\t\t\t\t\t\t\tauthToken,\n\t\t\t\t\t\t\t\t\t\t\t\tauth,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.onError((ctx: ErrorContext) => {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\t\t\t`Subscription error: ${ctx.event?.message || \"Unknown error\"}`,\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.subscribe([\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM agents\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM tasks\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM ideas\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM messages\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM channels\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM projects\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM votes\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM discovered_tasks\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM task_dependencies\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM identity_roles\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM config\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM project_channels\",\n\t\t\t\t\t\t\t\t\t\t\"SELECT * FROM project_messages\",\n\t\t\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t\tnew CommandContext(conn, config, identity, authToken, auth),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t\t.onDisconnect((...disconnectArgs: unknown[]) => {\n\t\t\t\t\t\toptions.onDisconnect?.(...disconnectArgs);\n\t\t\t\t\t})\n\t\t\t\t\t.onConnectError((_ctx: ErrorContext, err: Error) => {\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\tconst message = err.message.toLowerCase();\n\t\t\t\t\t\tif (message.includes(\"unauthorized\") || message.includes(\"401\")) {\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t\t\t\"Authentication required. Run `probe auth <wallet> --save` first.\",\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treject(new Error(`Connection failed: ${err.message}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\n\t\t\t\t\t.build();\n\t\t\t} finally {\n\t\t\t\tconsole.log = originalConsoleLog;\n\t\t\t\tconsole.error = originalConsoleError;\n\t\t\t}\n\t\t});\n\t}\n}\n\nexport async function requireAuth(\n\toptions: CommandContextOptions,\n): Promise<CommandContext> {\n\tconst config = await getConfig();\n\tconst walletName = options.wallet || config.defaultWallet;\n\n\tif (!walletName) {\n\t\terror(\n\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t);\n\t}\n\n\tconst wallet = await getWalletInfo(walletName);\n\tif (!wallet) {\n\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t}\n\n\tconst cached = await getCachedToken(walletName);\n\tif (!cached) {\n\t\terror(\n\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\"No cached token. Run `probe auth <wallet> --save` first.\",\n\t\t);\n\t}\n\n\treturn CommandContext.create({\n\t\t...options,\n\t\twallet: walletName,\n\t\ttoken: cached.token,\n\t});\n}\n\nexport async function withContext<T>(\n\toptions: CommandContextOptions,\n\thandler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n\tawait using ctx = await CommandContext.create(options);\n\treturn await handler(ctx);\n}\n\nexport async function withAuth<T>(\n\toptions: CommandContextOptions,\n\thandler: (ctx: CommandContext) => Promise<T>,\n): Promise<T> {\n\tawait using ctx = await requireAuth(options);\n\treturn await handler(ctx);\n}\n\nexport async function callReducer(\n\tctx: CommandContext,\n\treducerName: string,\n\targs: Record<string, unknown>,\n): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst timeoutMs = Math.max(1000, ctx.config.requestTimeout);\n\n\t\tconst reducers = ctx.conn.reducers as unknown as Record<string, unknown>;\n\t\tconst reducer = reducers[reducerName];\n\t\tif (typeof reducer !== \"function\") {\n\t\t\treject(new Error(`Reducer not found: ${reducerName}`));\n\t\t\treturn;\n\t\t}\n\n\t\tconst callback = (\n\t\t\teventCtx: { event: { status: { tag: string; value?: string } } },\n\t\t\t_reducerArgs: unknown,\n\t\t) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\n\t\t\tcleanup();\n\t\t\tconst status = eventCtx.event.status;\n\t\t\tif (status.tag === \"Failed\") {\n\t\t\t\treject(new Error(status.value || \"Reducer failed\"));\n\t\t\t} else if (status.tag === \"OutOfEnergy\") {\n\t\t\t\treject(new Error(\"Transaction out of energy\"));\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t};\n\n\t\tconst onMethod =\n\t\t\t`on${reducerName.charAt(0).toUpperCase() + reducerName.slice(1)}` as keyof typeof ctx.conn.reducers;\n\t\tconst offMethod =\n\t\t\t`removeOn${reducerName.charAt(0).toUpperCase() + reducerName.slice(1)}` as keyof typeof ctx.conn.reducers;\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tconst remove = ctx.conn.reducers[offMethod] as unknown;\n\t\t\tif (typeof remove === \"function\") {\n\t\t\t\t(remove as (cb: typeof callback) => void)(callback);\n\t\t\t}\n\t\t};\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(\n\t\t\t\tnew Error(`Reducer timed out after ${timeoutMs}ms: ${reducerName}`),\n\t\t\t);\n\t\t}, timeoutMs);\n\n\t\tconst on = ctx.conn.reducers[onMethod] as unknown;\n\t\tif (typeof on === \"function\") {\n\t\t\t(on as (cb: typeof callback) => void)(callback);\n\t\t}\n\n\t\t(reducer as (a: Record<string, unknown>) => void)(args);\n\t});\n}\n","import { encode } from \"@toon-format/toon\";\n\nexport function formatToon(data: Record<string, unknown>): string {\n\treturn encode(data);\n}\n\nexport function formatToonRecord<T extends object>(\n\tkey: string,\n\titems: T[],\n\tfields?: (keyof T)[],\n): string {\n\tconst displayFields = fields || (Object.keys(items[0] || {}) as (keyof T)[]);\n\tconst rows = items.map((item) => {\n\t\tconst row: Record<string, unknown> = {};\n\t\tfor (const field of displayFields) {\n\t\t\trow[String(field)] = item[field];\n\t\t}\n\t\treturn row;\n\t});\n\treturn encode({ [key]: rows });\n}\n\nexport function toonList<T extends object>(\n\tkey: string,\n\titems: T[],\n\tcolumns?: string[],\n): string {\n\tif (items.length === 0) {\n\t\treturn encode({ [key]: [] });\n\t}\n\n\tconst cols = columns || Object.keys(items[0] as Record<string, unknown>);\n\tconst rows = items.map((item) => {\n\t\tconst row: Record<string, unknown> = {};\n\t\tfor (const col of cols) {\n\t\t\trow[col] = (item as Record<string, unknown>)[col];\n\t\t}\n\t\treturn row;\n\t});\n\treturn encode({ [key]: rows });\n}\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { CommandContext } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\ntype CheckStatus = \"pass\" | \"warn\" | \"fail\";\n\ninterface DoctorCheck {\n\tcheck: string;\n\tstatus: CheckStatus;\n\tdetail: string;\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"doctor\",\n\t\tdescription: \"Run environment and connectivity diagnostics\",\n\t},\n\targs: {\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override for auth checks\",\n\t\t},\n\t\thost: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB host override\",\n\t\t},\n\t\tmodule: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB module override\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe doctor\",\n\t\t\t\tdescription: \"Validate Probe config, auth, and Nexus connectivity\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe doctor\",\n\t\t\t\t\t\"probe doctor --wallet my-wallet --host ws://127.0.0.1:3000 --module nexus\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet override for auth checks\" },\n\t\t\t\t\t{ name: \"--host, --module\", detail: \"SpacetimeDB overrides\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output mode\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst checks: DoctorCheck[] = [];\n\t\tconst addCheck = (check: string, status: CheckStatus, detail: string) => {\n\t\t\tchecks.push({ check, status, detail });\n\t\t};\n\n\t\tlet config: Awaited<ReturnType<typeof getConfig>> | null = null;\n\t\ttry {\n\t\t\tconfig = await getConfig();\n\t\t\taddCheck(\"config\", \"pass\", \"Loaded Probe configuration\");\n\t\t} catch (err) {\n\t\t\taddCheck(\n\t\t\t\t\"config\",\n\t\t\t\t\"fail\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load configuration\",\n\t\t\t);\n\t\t}\n\n\t\tconst walletName = args.wallet || config?.defaultWallet;\n\t\tif (!walletName) {\n\t\t\taddCheck(\n\t\t\t\t\"wallet.selected\",\n\t\t\t\t\"fail\",\n\t\t\t\t\"No wallet selected (set --wallet or defaultWallet)\",\n\t\t\t);\n\t\t} else {\n\t\t\taddCheck(\"wallet.selected\", \"pass\", `Using wallet '${walletName}'`);\n\t\t}\n\n\t\tlet hasWallet = false;\n\t\tif (walletName) {\n\t\t\tconst wallet = await getWalletInfo(walletName);\n\t\t\tif (wallet) {\n\t\t\t\thasWallet = true;\n\t\t\t\taddCheck(\"wallet.exists\", \"pass\", `Address ${wallet.address}`);\n\t\t\t} else {\n\t\t\t\taddCheck(\"wallet.exists\", \"fail\", `Wallet '${walletName}' not found`);\n\t\t\t}\n\t\t}\n\n\t\tlet token: string | null = null;\n\t\tif (walletName && hasWallet) {\n\t\t\tconst cached = await getCachedToken(walletName);\n\t\t\tif (!cached) {\n\t\t\t\taddCheck(\"auth.token\", \"fail\", \"No cached token (run probe auth)\");\n\t\t\t} else {\n\t\t\t\ttoken = cached.token;\n\t\t\t\tconst expires = new Date(cached.expiresAt);\n\t\t\t\tif (Number.isNaN(expires.getTime())) {\n\t\t\t\t\taddCheck(\"auth.token\", \"warn\", \"Token exists but expiry is invalid\");\n\t\t\t\t} else if (expires.getTime() <= Date.now()) {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"auth.token\",\n\t\t\t\t\t\t\"fail\",\n\t\t\t\t\t\t`Token expired at ${expires.toISOString()}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"auth.token\",\n\t\t\t\t\t\t\"pass\",\n\t\t\t\t\t\t`Token valid until ${expires.toISOString()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (config) {\n\t\t\tconst host = args.host || config.spacetime.host;\n\t\t\tconst moduleName = args.module || config.spacetime.module;\n\t\t\taddCheck(\"nexus.target\", \"pass\", `${host} / ${moduleName}`);\n\n\t\t\tif (token) {\n\t\t\t\ttry {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost,\n\t\t\t\t\t\tmodule: moduleName,\n\t\t\t\t\t\twallet: walletName,\n\t\t\t\t\t\ttoken,\n\t\t\t\t\t\tsubscribe: false,\n\t\t\t\t\t});\n\t\t\t\t\tconst identity = ctx.identity?.toHexString() || \"unknown\";\n\t\t\t\t\taddCheck(\"nexus.connect\", \"pass\", `Connected as ${identity}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\taddCheck(\n\t\t\t\t\t\t\"nexus.connect\",\n\t\t\t\t\t\t\"fail\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Connection failed\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taddCheck(\n\t\t\t\t\t\"nexus.connect\",\n\t\t\t\t\t\"warn\",\n\t\t\t\t\t\"Skipped connection check (no valid token)\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst counts = checks.reduce(\n\t\t\t(acc, item) => {\n\t\t\t\tif (item.status === \"pass\") acc.pass += 1;\n\t\t\t\telse if (item.status === \"warn\") acc.warn += 1;\n\t\t\t\telse acc.fail += 1;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{ pass: 0, warn: 0, fail: 0 },\n\t\t);\n\n\t\tconst ok = counts.fail === 0;\n\t\tsuccess({ ok, counts, checks });\n\n\t\tif (!isJsonMode()) {\n\t\t\tconsole.log(toonList(\"doctor_checks\", checks));\n\t\t\tconsole.log(toonList(\"doctor_summary\", [{ ok, ...counts }]));\n\t\t}\n\t},\n});\n","import type {\n\tAgentRole as AgentRoleType,\n\tAgentStatus as AgentStatusType,\n\tIdeaStatus as IdeaStatusType,\n\tMessageType as MessageTypeType,\n\tProjectStatus as ProjectStatusType,\n\tTaskStatus as TaskStatusType,\n\tVoteType as VoteTypeType,\n} from \"~/module_bindings/types.js\";\n\nexport const TaskStatus = {\n\tvalues: [\n\t\t\"Open\",\n\t\t\"Claimed\",\n\t\t\"InProgress\",\n\t\t\"Review\",\n\t\t\"Completed\",\n\t\t\"Blocked\",\n\t\t\"Archived\",\n\t] as const,\n\n\tis: {\n\t\topen: (s: TaskStatusType) => s.tag === \"Open\",\n\t\tclaimed: (s: TaskStatusType) => s.tag === \"Claimed\",\n\t\tinProgress: (s: TaskStatusType) => s.tag === \"InProgress\",\n\t\treview: (s: TaskStatusType) => s.tag === \"Review\",\n\t\tcompleted: (s: TaskStatusType) => s.tag === \"Completed\",\n\t\tblocked: (s: TaskStatusType) => s.tag === \"Blocked\",\n\t\tarchived: (s: TaskStatusType) => s.tag === \"Archived\",\n\t\tactive: (s: TaskStatusType) =>\n\t\t\t[\"Open\", \"Claimed\", \"InProgress\", \"Review\"].includes(s.tag),\n\t\tterminal: (s: TaskStatusType) =>\n\t\t\t[\"Completed\", \"Blocked\", \"Archived\"].includes(s.tag),\n\t},\n\n\tfromString(s: string): TaskStatusType {\n\t\tconst map: Record<string, TaskStatusType> = {\n\t\t\topen: { tag: \"Open\" },\n\t\t\tclaimed: { tag: \"Claimed\" },\n\t\t\tin_progress: { tag: \"InProgress\" },\n\t\t\tinprogress: { tag: \"InProgress\" },\n\t\t\treview: { tag: \"Review\" },\n\t\t\tcompleted: { tag: \"Completed\" },\n\t\t\tmerged: { tag: \"Completed\" },\n\t\t\tblocked: { tag: \"Blocked\" },\n\t\t\tarchived: { tag: \"Archived\" },\n\t\t};\n\t\treturn map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Open\" };\n\t},\n\n\tmatches(status: TaskStatusType, filter: string): boolean {\n\t\tconst f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tif (f === \"merged\") return status.tag === \"Completed\";\n\t\treturn status.tag.toLowerCase() === f;\n\t},\n\n\tdisplay(status: TaskStatusType): string {\n\t\tconst map: Record<string, string> = { InProgress: \"IN PROGRESS\" };\n\t\treturn map[status.tag] ?? status.tag.toUpperCase();\n\t},\n} as const;\n\nexport const IdeaStatus = {\n\tvalues: [\"Voting\", \"ApprovedForProject\", \"Rejected\", \"Implemented\"] as const,\n\n\tis: {\n\t\tvoting: (s: IdeaStatusType) => s.tag === \"Voting\",\n\t\tapproved: (s: IdeaStatusType) => s.tag === \"ApprovedForProject\",\n\t\trejected: (s: IdeaStatusType) => s.tag === \"Rejected\",\n\t\timplemented: (s: IdeaStatusType) => s.tag === \"Implemented\",\n\t\tactive: (s: IdeaStatusType) => s.tag === \"Voting\",\n\t\tterminal: (s: IdeaStatusType) =>\n\t\t\t[\"ApprovedForProject\", \"Rejected\", \"Implemented\"].includes(s.tag),\n\t},\n\n\tfromString(s: string): IdeaStatusType {\n\t\tconst map: Record<string, IdeaStatusType> = {\n\t\t\tvoting: { tag: \"Voting\" },\n\t\t\tapproved: { tag: \"ApprovedForProject\" },\n\t\t\tapproved_for_project: { tag: \"ApprovedForProject\" },\n\t\t\trejected: { tag: \"Rejected\" },\n\t\t\timplemented: { tag: \"Implemented\" },\n\t\t};\n\t\treturn map[s.toLowerCase().replace(/[_\\s]/g, \"\")] ?? { tag: \"Voting\" };\n\t},\n\n\tmatches(status: IdeaStatusType, filter: string): boolean {\n\t\tconst f = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tif (f === \"approved\") return status.tag === \"ApprovedForProject\";\n\t\treturn status.tag.toLowerCase() === f;\n\t},\n\n\tdisplay(status: IdeaStatusType): string {\n\t\tif (status.tag === \"ApprovedForProject\") return \"Approved\";\n\t\treturn status.tag;\n\t},\n} as const;\n\nexport const VoteType = {\n\tvalues: [\"Up\", \"Down\", \"Veto\"] as const,\n\n\tis: {\n\t\tup: (v: VoteTypeType) => v.tag === \"Up\",\n\t\tdown: (v: VoteTypeType) => v.tag === \"Down\",\n\t\tveto: (v: VoteTypeType) => v.tag === \"Veto\",\n\t\tpositive: (v: VoteTypeType) => v.tag === \"Up\",\n\t\tnegative: (v: VoteTypeType) => [\"Down\", \"Veto\"].includes(v.tag),\n\t},\n\n\tfromString(s: string): VoteTypeType {\n\t\tconst map: Record<string, VoteTypeType> = {\n\t\t\tup: { tag: \"Up\" },\n\t\t\tdown: { tag: \"Down\" },\n\t\t\tveto: { tag: \"Veto\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Up\" };\n\t},\n\n\tdisplay(v: VoteTypeType): string {\n\t\treturn v.tag.toLowerCase();\n\t},\n} as const;\n\nexport const AgentRole = {\n\tvalues: [\"Zoe\", \"Admin\", \"Zeno\"] as const,\n\n\tis: {\n\t\tzoe: (r: AgentRoleType) => r.tag === \"Zoe\",\n\t\tadmin: (r: AgentRoleType) => r.tag === \"Admin\",\n\t\tzeno: (r: AgentRoleType) => r.tag === \"Zeno\",\n\t\tprivileged: (r: AgentRoleType) => [\"Zoe\", \"Admin\"].includes(r.tag),\n\t},\n\n\tfromString(s: string): AgentRoleType {\n\t\tconst map: Record<string, AgentRoleType> = {\n\t\t\tzoe: { tag: \"Zoe\" },\n\t\t\tadmin: { tag: \"Admin\" },\n\t\t\tzeno: { tag: \"Zeno\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Zeno\" };\n\t},\n\n\tdisplay(r: AgentRoleType): string {\n\t\treturn r.tag.toLowerCase();\n\t},\n} as const;\n\nexport const AgentStatus = {\n\tvalues: [\"Online\", \"Offline\", \"Working\"] as const,\n\n\tis: {\n\t\tonline: (s: AgentStatusType) => s.tag === \"Online\",\n\t\toffline: (s: AgentStatusType) => s.tag === \"Offline\",\n\t\tworking: (s: AgentStatusType) => s.tag === \"Working\",\n\t\tavailable: (s: AgentStatusType) =>\n\t\t\ts.tag === \"Online\" || s.tag === \"Working\",\n\t},\n\n\tfromString(s: string): AgentStatusType {\n\t\tconst map: Record<string, AgentStatusType> = {\n\t\t\tonline: { tag: \"Online\" },\n\t\t\toffline: { tag: \"Offline\" },\n\t\t\tworking: { tag: \"Working\" },\n\t\t\tbusy: { tag: \"Working\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"Offline\" };\n\t},\n\n\tdisplay(s: AgentStatusType): string {\n\t\treturn s.tag;\n\t},\n} as const;\n\nexport const MessageType = {\n\tvalues: [\"User\", \"System\", \"Directive\"] as const,\n\n\tis: {\n\t\tuser: (t: MessageTypeType) => t.tag === \"User\",\n\t\tsystem: (t: MessageTypeType) => t.tag === \"System\",\n\t\tdirective: (t: MessageTypeType) => t.tag === \"Directive\",\n\t},\n\n\tfromString(s: string): MessageTypeType {\n\t\tconst map: Record<string, MessageTypeType> = {\n\t\t\tuser: { tag: \"User\" },\n\t\t\ttext: { tag: \"User\" },\n\t\t\tsystem: { tag: \"System\" },\n\t\t\tdirective: { tag: \"Directive\" },\n\t\t};\n\t\treturn map[s.toLowerCase()] ?? { tag: \"User\" };\n\t},\n\n\tdisplay(t: MessageTypeType): string {\n\t\treturn t.tag.toLowerCase();\n\t},\n} as const;\n\nexport const ProjectStatus = {\n\tvalues: [\"Active\", \"Paused\"] as const,\n\n\tis: {\n\t\tactive: (s: ProjectStatusType) => s.tag === \"Active\",\n\t\tpaused: (s: ProjectStatusType) => s.tag === \"Paused\",\n\t},\n\n\tfromString(s: string): ProjectStatusType {\n\t\tconst normalized = s.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\tconst map: Record<string, ProjectStatusType> = {\n\t\t\tactive: { tag: \"Active\" },\n\t\t\tpaused: { tag: \"Paused\" },\n\t\t};\n\t\treturn map[normalized] ?? { tag: \"Active\" };\n\t},\n\n\tmatches(status: ProjectStatusType, filter: string): boolean {\n\t\tconst normalized = filter.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\treturn status.tag.toLowerCase() === normalized;\n\t},\n\n\tdisplay(status: ProjectStatusType): string {\n\t\treturn status.tag.toLowerCase();\n\t},\n} as const;\n","type MicrosTimestamp = { microsSinceUnixEpoch: bigint | number | string };\n\nexport const toMicros = (value: unknown): bigint => {\n\tif (\n\t\t!value ||\n\t\ttypeof value !== \"object\" ||\n\t\t!(\"microsSinceUnixEpoch\" in value)\n\t) {\n\t\treturn 0n;\n\t}\n\tconst micros = (value as MicrosTimestamp).microsSinceUnixEpoch;\n\treturn typeof micros === \"bigint\" ? micros : BigInt(micros);\n};\n\nexport const formatTimestamp = (value: unknown, fallback = \"\"): string => {\n\tconst micros = toMicros(value);\n\tif (micros <= 0n) {\n\t\treturn fallback || String(value ?? \"\");\n\t}\n\treturn new Date(Number(micros / 1000n))\n\t\t.toISOString()\n\t\t.replace(\"T\", \" \")\n\t\t.slice(0, 19);\n};\n\nexport const formatIsoTimestamp = (value: unknown, fallback = \"\"): string => {\n\tconst micros = toMicros(value);\n\tif (micros <= 0n) {\n\t\treturn fallback || new Date().toISOString();\n\t}\n\treturn new Date(Number(micros / 1000n)).toISOString();\n};\n","import { getConfig } from \"~/utils/config.js\";\nimport {\n\ttype Agent,\n\tCommandContext,\n\tcallReducer,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\nexport interface AgentCommandArgs {\n\taction?: string;\n\tagentId?: string;\n\tname?: string;\n\trole?: string;\n\taddress?: string;\n\twallet?: string;\n\ttask?: string;\n\tlimit?: string;\n\tcapabilities?: string;\n\tset?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst normalizeCapabilities = (value?: string): string[] => {\n\tif (!value) return [];\n\treturn [\n\t\t...new Set(\n\t\t\tvalue\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((item) => item.trim().toLowerCase())\n\t\t\t\t.filter(Boolean),\n\t\t),\n\t];\n};\n\nconst currentAgentForIdentity = (ctx: CommandContext): Agent | undefined => {\n\treturn ctx\n\t\t.iter<Agent>(\"agents\")\n\t\t.find((a) => a.identity.toHexString() === ctx.identity?.toHexString());\n};\n\nconst renderAgent = (agent: Agent, identity?: string) => ({\n\tid: agent.id,\n\tname: agent.name,\n\trole: AgentRole.display(agent.role),\n\tstatus: AgentStatus.display(agent.status),\n\tlastHeartbeat: formatTimestamp(agent.lastHeartbeat),\n\tcurrentTaskId: agent.currentTaskId ? agent.currentTaskId.toString() : \"\",\n\tcapabilities: agent.capabilities.join(\",\"),\n\tidentity: identity || \"\",\n});\n\nexport const runAgentAction = async (args: AgentCommandArgs): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Agent action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"register\": {\n\t\t\t\tconst agentId = args.agentId;\n\t\t\t\tconst name = args.name;\n\t\t\t\tconst role = args.role || \"zeno\";\n\n\t\t\t\tif (!agentId || !name)\n\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Agent ID and name required\");\n\n\t\t\t\tconst config = await getConfig();\n\t\t\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\t\t\tif (!args.address && !walletName)\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\t\t\"--address or --wallet required (or set default wallet)\",\n\t\t\t\t\t);\n\n\t\t\t\tlet address = args.address;\n\t\t\t\tconst capabilities = normalizeCapabilities(args.capabilities);\n\t\t\t\tif (!address && walletName) {\n\t\t\t\t\tconst wallet = await getWalletInfo(walletName);\n\t\t\t\t\tif (!wallet)\n\t\t\t\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t\t\t\t\taddress = wallet.address;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: walletName },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"registerAgent\", {\n\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\trole: AgentRole.fromString(role),\n\t\t\t\t\t\t\t\tzenonAddress: address as string,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (capabilities.length > 0) {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"updateAgentCapabilities\", {\n\t\t\t\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tawait new Promise((r) => setTimeout(r, 500));\n\t\t\t\t\t\t\tconst registered = ctx\n\t\t\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t\t\t.find((a) => a.id === agentId);\n\t\t\t\t\t\t\tif (!registered) {\n\t\t\t\t\t\t\t\tif (role === \"zoe\" || role === \"admin\") {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\t\t\t\t\"Only whitelisted identities can register as zoe or admin\",\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\terror(\"REGISTRATION_FAILED\", \"Registration failed\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tregistered: true,\n\t\t\t\t\t\tagentId,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\trole,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent_registered\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tagentId,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\trole,\n\t\t\t\t\t\t\t\t\taddress,\n\t\t\t\t\t\t\t\t\tcapabilities: capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"status\": {\n\t\t\t\tif (args.agentId || args.task || args.capabilities) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_USAGE\",\n\t\t\t\t\t\t\"Use `probe agent set-status <online|offline|working|busy>` to update status. `probe agent status` only shows current status.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\tif (!myAgent)\n\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess(myAgent);\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t\trenderAgent(myAgent, ctx.identity?.toHexString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"set-status\": {\n\t\t\t\tconst nextStatus = args.agentId;\n\t\t\t\tif (!nextStatus) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"STATUS_REQUIRED\",\n\t\t\t\t\t\t\"Status required. Use: online, offline, working, busy\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (args.capabilities) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_USAGE\",\n\t\t\t\t\t\t\"Use `probe agent capabilities --set <list>` to update capabilities.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst normalized = nextStatus.toLowerCase();\n\t\t\t\tconst allowed = new Set([\"online\", \"offline\", \"working\", \"busy\"]);\n\t\t\t\tif (!allowed.has(normalized)) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_STATUS\",\n\t\t\t\t\t\t`Invalid status: ${nextStatus}. Use: online, offline, working, busy`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst mapped = AgentStatus.fromString(normalized);\n\t\t\t\tconst isWorking = AgentStatus.is.working(mapped);\n\t\t\t\tif (isWorking && !args.task) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"TASK_REQUIRED\",\n\t\t\t\t\t\t\"--task is required when setting status to working\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!isWorking && args.task) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"TASK_NOT_ALLOWED\",\n\t\t\t\t\t\t\"--task is only allowed when setting status to working\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"setAgentStatus\", {\n\t\t\t\t\t\t\t\tstatus: mapped,\n\t\t\t\t\t\t\t\ttaskId: isWorking ? BigInt(args.task as string) : undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tupdated: true,\n\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\ttaskId: args.task || null,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent_status_updated\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\t\t\t\ttaskId: args.task || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"capabilities\": {\n\t\t\t\tif (!args.set) error(\"CAPABILITIES_REQUIRED\", \"--set is required\");\n\n\t\t\t\tconst capabilities = normalizeCapabilities(args.set);\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateAgentCapabilities\", {\n\t\t\t\t\t\t\t\tcapabilities,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\t\tsuccess({ updated: true, agentId: myAgent?.id, capabilities });\n\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"agent_capabilities_updated\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tagentId: myAgent?.id || \"\",\n\t\t\t\t\t\t\t\t\t\t\tcapabilities: capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"me\": {\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\tif (!myAgent)\n\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess(myAgent);\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t\trenderAgent(myAgent, ctx.identity?.toHexString()),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"heartbeat\": {\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tconst myAgent = currentAgentForIdentity(ctx);\n\t\t\t\t\t\t\tif (!myAgent) error(\"NOT_REGISTERED\", \"Agent not registered\");\n\n\t\t\t\t\t\t\tawait callReducer(ctx, \"heartbeat\", {\n\t\t\t\t\t\t\t\tagentId: myAgent.id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsuccess({ heartbeat: true });\n\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"agent_heartbeat\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tagentId: myAgent.id,\n\t\t\t\t\t\t\t\t\t\t\tstatus: AgentStatus.display(myAgent.status),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"list\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tlet onlineAgents = ctx\n\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t.filter((a) => !AgentStatus.is.offline(a.status));\n\t\t\t\tonlineAgents = onlineAgents.sort((a, b) => {\n\t\t\t\t\tconst aMicros = toMicros(\n\t\t\t\t\t\ta.lastHeartbeat || a.createdAt || a.lastActiveAt,\n\t\t\t\t\t);\n\t\t\t\t\tconst bMicros = toMicros(\n\t\t\t\t\t\tb.lastHeartbeat || b.createdAt || b.lastActiveAt,\n\t\t\t\t\t);\n\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\treturn b.id.localeCompare(a.id);\n\t\t\t\t});\n\t\t\t\tif (limit !== undefined) onlineAgents = onlineAgents.slice(0, limit);\n\n\t\t\t\tsuccess({ agents: onlineAgents, count: onlineAgents.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"agents\",\n\t\t\t\t\t\t\tonlineAgents.map((a) => ({\n\t\t\t\t\t\t\t\tid: a.id,\n\t\t\t\t\t\t\t\tname: a.name,\n\t\t\t\t\t\t\t\trole: AgentRole.display(a.role),\n\t\t\t\t\t\t\t\tstatus: AgentStatus.display(a.status),\n\t\t\t\t\t\t\t\tlast_heartbeat: formatTimestamp(a.lastHeartbeat),\n\t\t\t\t\t\t\t\tcapabilities: a.capabilities.join(\",\"),\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"identity\": {\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tconst identityHex = ctx.identity?.toHexString();\n\t\t\t\t\t\tsuccess({ identity: identityHex, wallet: args.wallet });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"identity\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tidentity: identityHex || \"\",\n\t\t\t\t\t\t\t\t\t\twallet: args.wallet || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: register, status, set-status, capabilities, me, heartbeat, list, identity\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\t// Handle connection errors gracefully - avoid citty/consola stack traces\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { type AgentCommandArgs, runAgentAction } from \"./agent-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"agent\", description: \"Agent management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription:\n\t\t\t\t\"Action: register, status, set-status, capabilities, me, heartbeat, list, identity\",\n\t\t\trequired: false,\n\t\t},\n\t\tagentId: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Agent ID or status value\",\n\t\t\trequired: false,\n\t\t},\n\t\tname: { type: \"positional\", description: \"Display name\", required: false },\n\t\trole: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Role: zoe, admin, zeno\",\n\t\t\trequired: false,\n\t\t},\n\t\taddress: { type: \"string\", description: \"Zenon address\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\ttask: { type: \"string\", description: \"Current task ID\" },\n\t\tlimit: { type: \"string\", description: \"Limit agents returned for list\" },\n\t\tcapabilities: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Comma-separated capability list\",\n\t\t},\n\t\tset: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Set capabilities for capabilities action\",\n\t\t},\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe agent\",\n\t\t\t\tdescription: \"Agent lifecycle and identity commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe agent <action> [options]\",\n\t\t\t\t\t'probe agent register agent-1 \"Builder\" zeno --wallet my-wallet',\n\t\t\t\t\t\"probe agent set-status working --task 42\",\n\t\t\t\t\t'probe agent capabilities --set \"gh,coding,review\"',\n\t\t\t\t\t\"probe agent heartbeat\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"register <agentId> <name> [role]\",\n\t\t\t\t\t\tdetail: \"Register a new agent identity\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"status\", detail: \"Show current agent status\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"set-status <online|offline|working|busy>\",\n\t\t\t\t\t\tdetail: \"Update current agent status\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"capabilities --set <list>\",\n\t\t\t\t\t\tdetail: \"Set capabilities for authenticated agent\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"me\", detail: \"Show current authenticated agent profile\" },\n\t\t\t\t\t{ name: \"heartbeat\", detail: \"Send heartbeat only\" },\n\t\t\t\t\t{ name: \"list\", detail: \"List online agents\" },\n\t\t\t\t\t{ name: \"identity\", detail: \"Show current authenticated identity\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{ name: \"--address\", detail: \"Zenon address for register\" },\n\t\t\t\t\t{ name: \"--task\", detail: \"Task ID required with status working\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max agents returned for list\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--capabilities\",\n\t\t\t\t\t\tdetail: \"Comma-separated capabilities for register/status\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--set\",\n\t\t\t\t\t\tdetail: \"Comma-separated capabilities for capabilities action\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Valid register roles: zeno (default), zoe, admin. Non-whitelisted identities cannot register as zoe/admin.\",\n\t\t\t\t\t\"Use `probe task list` to discover task IDs before `probe agent set-status working --task <id>`.\",\n\t\t\t\t\t\"`probe agent status` shows current status; `probe agent set-status <online|offline|working|busy>` updates status.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runAgentAction(args as AgentCommandArgs);\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype DiscoveredTask,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nconst toDiscoveryDecision = (input: string) => {\n\tconst value = input.toLowerCase();\n\tif (value === \"approve\") return { tag: \"ApproveAsTask\" };\n\tif (value === \"reject\") return { tag: \"Reject\" };\n\tif (value === \"escalate_to_idea\") return { tag: \"EscalateToIdea\" };\n\treturn null;\n};\n\nconst discoveryStatusTag = (status: unknown): string => {\n\tif (status && typeof status === \"object\" && \"tag\" in status) {\n\t\treturn String((status as { tag: string }).tag);\n\t}\n\treturn String(status);\n};\n\nconst discoveryStatusDisplay = (status: unknown): string => {\n\tconst tag = discoveryStatusTag(status);\n\tconst map: Record<string, string> = {\n\t\tPendingReview: \"pending_review\",\n\t\tApproved: \"approved\",\n\t\tRejected: \"rejected\",\n\t\tEscalatedToIdea: \"escalated_to_idea\",\n\t};\n\treturn map[tag] ?? tag;\n};\n\nexport default defineCommand({\n\tmeta: { name: \"discover\", description: \"Discovered task management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: report, review, list, get\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Discovered task ID\",\n\t\t\trequired: false,\n\t\t},\n\t\tdecision: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Decision: approve, reject, escalate_to_idea\",\n\t\t\trequired: false,\n\t\t},\n\t\ttask: { type: \"string\", description: \"Current task ID\" },\n\t\tproject: { type: \"string\", description: \"Project ID\" },\n\t\ttitle: { type: \"string\", description: \"Task title\" },\n\t\ttype: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Task type: bug, improvement, feature\",\n\t\t},\n\t\tseverity: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Severity: low, medium, high, critical\",\n\t\t},\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit discovered tasks returned\" },\n\t\tdescription: { type: \"string\", description: \"Description\" },\n\t\treason: { type: \"string\", description: \"Rejection reason\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe discover\",\n\t\t\t\tdescription: \"Discovered task reporting and review\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe discover <action> [options]\",\n\t\t\t\t\t'probe discover report --task 12 --project 1 --title \"Fix parse\"',\n\t\t\t\t\t\"probe discover review 9 approve\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"report\",\n\t\t\t\t\t\tdetail: \"Report a discovered task from current work\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"review <id> <approve|reject|escalate_to_idea>\",\n\t\t\t\t\t\tdetail: \"Approve, reject, or escalate discovery\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"list\", detail: \"List discovered tasks\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one discovered task\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--task, --project, --title\", detail: \"Required for report\" },\n\t\t\t\t\t{ name: \"--type\", detail: \"Task type: bug, improvement, feature\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--severity\",\n\t\t\t\t\t\tdetail: \"Severity: low, medium, high, critical\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--reason\", detail: \"Reason for rejection/escalation\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max discovered tasks returned for list\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Find current task IDs with `probe task list` and project IDs with `probe project list`.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"report\": {\n\t\t\t\t\tif (!args.task || !args.project || !args.title) {\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"--task, --project, and --title required\");\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"discoverTask\", {\n\t\t\t\t\t\t\t\t\tcurrentTaskId: BigInt(args.task),\n\t\t\t\t\t\t\t\t\tprojectId: BigInt(args.project),\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t\tpriority: 5,\n\t\t\t\t\t\t\t\t\ttaskType: args.type || \"improvement\",\n\t\t\t\t\t\t\t\t\tseverity: args.severity || \"medium\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ reported: true, title: args.title });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"discovery_reported\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\t\ttaskId: args.task,\n\t\t\t\t\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"review\": {\n\t\t\t\t\tconst discId = args.id;\n\t\t\t\t\tconst decisionInput = args.decision;\n\t\t\t\t\tif (!discId || !decisionInput)\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"ID and decision required\");\n\n\t\t\t\t\tconst decision = decisionInput.toLowerCase();\n\n\t\t\t\t\tconst validDecisions = [\"approve\", \"reject\", \"escalate_to_idea\"];\n\t\t\t\t\tif (!validDecisions.includes(decision)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_DECISION\",\n\t\t\t\t\t\t\t`Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst decisionValue = toDiscoveryDecision(decision);\n\t\t\t\t\tif (!decisionValue) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_DECISION\",\n\t\t\t\t\t\t\t`Invalid decision: ${decisionInput}. Use: ${validDecisions.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"reviewDiscoveredTask\", {\n\t\t\t\t\t\t\t\t\tdiscoveryId: BigInt(discId),\n\t\t\t\t\t\t\t\t\tdecision: decisionValue,\n\t\t\t\t\t\t\t\t\treason: args.reason || undefined,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ reviewed: true, id: discId, decision });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"discovery_reviewed\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: discId,\n\t\t\t\t\t\t\t\t\t\tdecision,\n\t\t\t\t\t\t\t\t\t\treason: args.reason || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet discovered = ctx.iter<DiscoveredTask>(\"discovered_tasks\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status) {\n\t\t\t\t\t\tconst filter = args.status.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\t\t\t\t\tdiscovered = discovered.filter(\n\t\t\t\t\t\t\t(d) =>\n\t\t\t\t\t\t\t\tdiscoveryStatusDisplay(d.status).replace(/[_\\s]/g, \"\") ===\n\t\t\t\t\t\t\t\tfilter,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tdiscovered = discovered.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) discovered = discovered.slice(0, limit);\n\n\t\t\t\t\tsuccess({ discoveredTasks: discovered, count: discovered.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"discovered_tasks\",\n\t\t\t\t\t\t\t\tdiscovered.map((d) => ({\n\t\t\t\t\t\t\t\t\tid: d.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: d.title,\n\t\t\t\t\t\t\t\t\ttaskType: d.taskType,\n\t\t\t\t\t\t\t\t\tseverity: d.severity,\n\t\t\t\t\t\t\t\t\tstatus: discoveryStatusDisplay(d.status),\n\t\t\t\t\t\t\t\t\tprojectId: d.projectId,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst discoveryId = args.id;\n\t\t\t\t\tif (!discoveryId)\n\t\t\t\t\t\terror(\"DISCOVERY_ID_REQUIRED\", \"Discovery ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst discovery = ctx\n\t\t\t\t\t\t.iter<DiscoveredTask>(\"discovered_tasks\")\n\t\t\t\t\t\t.find((d) => d.id.toString() === discoveryId);\n\t\t\t\t\tif (!discovery)\n\t\t\t\t\t\terror(\"DISCOVERY_NOT_FOUND\", `Discovery not found: ${discoveryId}`);\n\n\t\t\t\t\tsuccess(discovery);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"discovered_task\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: discovery.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: discovery.title,\n\t\t\t\t\t\t\t\t\tstatus: discoveryStatusDisplay(discovery.status),\n\t\t\t\t\t\t\t\t\ttaskType: discovery.taskType,\n\t\t\t\t\t\t\t\t\tseverity: discovery.severity,\n\t\t\t\t\t\t\t\t\tpriority: discovery.priority,\n\t\t\t\t\t\t\t\t\tprojectId: discovery.projectId.toString(),\n\t\t\t\t\t\t\t\t\tcurrentTaskId: discovery.currentTaskId.toString(),\n\t\t\t\t\t\t\t\t\tdescription: discovery.description,\n\t\t\t\t\t\t\t\t\treviewedBy: discovery.reviewedBy || \"\",\n\t\t\t\t\t\t\t\t\treviewedAt: discovery.reviewedAt\n\t\t\t\t\t\t\t\t\t\t? formatTimestamp(discovery.reviewedAt)\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\trejectionReason: discovery.rejectionReason || \"\",\n\t\t\t\t\t\t\t\t\tcreatedTaskId: discovery.createdTaskId\n\t\t\t\t\t\t\t\t\t\t? discovery.createdTaskId.toString()\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: report, review, list, get\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype Idea,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { IdeaStatus, VoteType } from \"~/utils/enums.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"idea\", description: \"Idea management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, propose, vote, get\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Idea ID\", required: false },\n\t\tvoteType: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Vote type: up, down, veto\",\n\t\t\trequired: false,\n\t\t},\n\t\ttitle: { type: \"string\", description: \"Idea title\" },\n\t\tcategory: { type: \"string\", description: \"Category\" },\n\t\tdescription: { type: \"string\", description: \"Description\" },\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit ideas returned\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe idea\",\n\t\t\t\tdescription: \"Idea discovery, review, and voting\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe idea <action> [options]\",\n\t\t\t\t\t\"probe idea list --status voting\",\n\t\t\t\t\t\"probe idea vote 42 up\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List ideas with optional filters\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one idea\" },\n\t\t\t\t\t{ name: \"propose\", detail: \"Propose a new idea\" },\n\t\t\t\t\t{ name: \"vote <id> <up|down|veto>\", detail: \"Vote on an idea\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--title\", detail: \"Idea title for propose\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Idea description for propose\" },\n\t\t\t\t\t{ name: \"--category\", detail: \"Idea category for propose/list\" },\n\t\t\t\t\t{ name: \"--status\", detail: \"Status filter for list\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max ideas returned for list\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\"Find idea IDs with `probe idea list` before using get/vote.\"],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet ideas = ctx.iter<Idea>(\"ideas\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status)\n\t\t\t\t\t\tideas = ideas.filter((i) =>\n\t\t\t\t\t\t\tIdeaStatus.matches(i.status, args.status),\n\t\t\t\t\t\t);\n\t\t\t\t\tif (args.category)\n\t\t\t\t\t\tideas = ideas.filter((i) => i.category === args.category);\n\t\t\t\t\tideas = ideas.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) ideas = ideas.slice(0, limit);\n\n\t\t\t\t\tsuccess({ ideas, count: ideas.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"ideas\",\n\t\t\t\t\t\t\t\tideas.map((i) => ({\n\t\t\t\t\t\t\t\t\tid: i.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: i.title,\n\t\t\t\t\t\t\t\t\tcategory: i.category,\n\t\t\t\t\t\t\t\t\tstatus: IdeaStatus.display(i.status),\n\t\t\t\t\t\t\t\t\tvotes: `${i.totalVotes}/${i.quorum}`,\n\t\t\t\t\t\t\t\t\tup: i.upVotes,\n\t\t\t\t\t\t\t\t\tveto: i.vetoCount,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst ideaId = args.id;\n\t\t\t\t\tif (!ideaId) error(\"IDEA_ID_REQUIRED\", \"Idea ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst idea = ctx\n\t\t\t\t\t\t.iter<Idea>(\"ideas\")\n\t\t\t\t\t\t.find((i) => i.id.toString() === ideaId);\n\t\t\t\t\tif (!idea) error(\"IDEA_NOT_FOUND\", `Idea not found: ${ideaId}`);\n\n\t\t\t\t\tsuccess(idea);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"idea\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: idea.id.toString(),\n\t\t\t\t\t\t\t\t\ttitle: idea.title,\n\t\t\t\t\t\t\t\t\tcategory: idea.category,\n\t\t\t\t\t\t\t\t\tstatus: IdeaStatus.display(idea.status),\n\t\t\t\t\t\t\t\t\ttotalVotes: idea.totalVotes,\n\t\t\t\t\t\t\t\t\tquorum: idea.quorum,\n\t\t\t\t\t\t\t\t\tupVotes: idea.upVotes,\n\t\t\t\t\t\t\t\t\tdownVotes: idea.downVotes,\n\t\t\t\t\t\t\t\t\tvetoCount: idea.vetoCount,\n\t\t\t\t\t\t\t\t\tapprovalThreshold: idea.approvalThreshold,\n\t\t\t\t\t\t\t\t\tvetoThreshold: idea.vetoThreshold,\n\t\t\t\t\t\t\t\t\tdescription: idea.description,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"propose\": {\n\t\t\t\t\tif (!args.title) error(\"ARGS_REQUIRED\", \"Title required\");\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"proposeIdea\", {\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t\tcategory: args.category || \"general\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ proposed: true, title: args.title });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"idea_proposed\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\t\tcategory: args.category || \"general\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"vote\": {\n\t\t\t\t\tconst ideaId = args.id;\n\t\t\t\t\tconst voteType = args.voteType;\n\t\t\t\t\tif (!ideaId || !voteType)\n\t\t\t\t\t\terror(\"ARGS_REQUIRED\", \"Idea ID and vote type required\");\n\t\t\t\t\tif (![\"up\", \"down\", \"veto\"].includes(voteType.toLowerCase())) {\n\t\t\t\t\t\terror(\"INVALID_VOTE_TYPE\", \"Vote type must be: up, down, veto\");\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"voteIdea\", {\n\t\t\t\t\t\t\t\t\tideaId: BigInt(ideaId),\n\t\t\t\t\t\t\t\t\tvoteType: VoteType.fromString(voteType),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ voted: true, ideaId, voteType });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"idea_voted\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tideaId,\n\t\t\t\t\t\t\t\t\t\tvoteType,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: list, propose, vote, get\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import type { MessageType as MessageTypeTag } from \"~/module_bindings/types.js\";\nimport {\n\ttype Channel,\n\tCommandContext,\n\tcallReducer,\n\ttype Message,\n\ttype Project,\n\ttype ProjectMessage,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { MessageType } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp, toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport interface MessageCommandArgs {\n\taction?: string;\n\ttarget?: string;\n\tcontent?: string;\n\ttype?: string;\n\tcontext?: string;\n\tlimit?: string;\n\twallet?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst isNumeric = (str: string): boolean => /^\\d+$/.test(str);\nconst matchesContext = (\n\tmessage: Message | ProjectMessage,\n\tcontext?: string,\n): boolean => {\n\tif (!context) return true;\n\tconst normalized = context.trim();\n\tif (!normalized) return true;\n\treturn (\n\t\tmessage.id.toString() === normalized ||\n\t\t(message.contextId || \"\") === normalized\n\t);\n};\n\nconst isUserMessage = (messageType: MessageTypeTag): boolean =>\n\tMessageType.is.user(messageType);\nconst isDirectiveMessage = (messageType: MessageTypeTag): boolean =>\n\tMessageType.is.directive(messageType);\n\nexport const runMessageAction = async (\n\targs: MessageCommandArgs,\n): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Message action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"list\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst limit = parseInt(args.limit || \"20\", 10);\n\t\t\t\tif (!Number.isFinite(limit) || limit <= 0) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\n\t\t\t\tlet messages: (Message | ProjectMessage)[] = [];\n\t\t\t\tlet targetLabel = \"all\";\n\n\t\t\t\tif (targetInput) {\n\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\tconst projectMessages =\n\t\t\t\t\t\t\tctx.iter<ProjectMessage>(\"project_messages\");\n\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\n\t\t\t\t\t\tmessages = projectMessages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\tm.projectId === projectId && isUserMessage(m.messageType),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const }));\n\t\t\t\t\t\ttargetLabel = project\n\t\t\t\t\t\t\t? `project:${project.name}`\n\t\t\t\t\t\t\t: `project:${projectId}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t(c) => c.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (channel) {\n\t\t\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\t\t\tmessages = channelMessages\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\t\tm.channelId === channel.id && isUserMessage(m.messageType),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const }));\n\t\t\t\t\t\t\ttargetLabel = `#${channel.name}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\tconst projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n\t\t\t\t\tmessages = [\n\t\t\t\t\t\t...channelMessages\n\t\t\t\t\t\t\t.filter((m) => isUserMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const })),\n\t\t\t\t\t\t...projectMessages\n\t\t\t\t\t\t\t.filter((m) => isUserMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const })),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tmessages = messages.filter((m) => matchesContext(m, args.context));\n\n\t\t\t\tmessages.sort((a, b) => {\n\t\t\t\t\tconst aTime = toMicros(a.createdAt);\n\t\t\t\t\tconst bTime = toMicros(b.createdAt);\n\t\t\t\t\tif (aTime < bTime) return 1;\n\t\t\t\t\tif (aTime > bTime) return -1;\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\t\tmessages = messages.slice(0, limit);\n\n\t\t\t\tconst channelMap = new Map(\n\t\t\t\t\tchannels.map((c) => [c.id.toString(), c.name]),\n\t\t\t\t);\n\t\t\t\tconst projectMap = new Map(\n\t\t\t\t\tprojects.map((p) => [p.id.toString(), p.name]),\n\t\t\t\t);\n\n\t\t\t\tsuccess({ messages, count: messages.length, target: targetLabel });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"messages\",\n\t\t\t\t\t\t\tmessages.map((m) => {\n\t\t\t\t\t\t\t\tconst isProject = \"_type\" in m && m._type === \"project\";\n\t\t\t\t\t\t\t\tconst location = isProject\n\t\t\t\t\t\t\t\t\t? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n\t\t\t\t\t\t\t\t\t: `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: m.id.toString(),\n\t\t\t\t\t\t\t\t\tlocation,\n\t\t\t\t\t\t\t\t\tsenderId: m.senderId,\n\t\t\t\t\t\t\t\t\tcontent:\n\t\t\t\t\t\t\t\t\t\tm.content.slice(0, 50) +\n\t\t\t\t\t\t\t\t\t\t(m.content.length > 50 ? \"...\" : \"\"),\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.display(m.messageType),\n\t\t\t\t\t\t\t\t\tcontextId: m.contextId || null,\n\t\t\t\t\t\t\t\t\tcreatedAt: formatTimestamp(m.createdAt),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"directives\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst limit = parseInt(args.limit || \"20\", 10);\n\t\t\t\tif (!Number.isFinite(limit) || limit <= 0) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\n\t\t\t\tlet messages: (Message | ProjectMessage)[] = [];\n\t\t\t\tlet targetLabel = \"all\";\n\n\t\t\t\tif (targetInput) {\n\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\tconst projectMessages =\n\t\t\t\t\t\t\tctx.iter<ProjectMessage>(\"project_messages\");\n\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\n\t\t\t\t\t\tmessages = projectMessages\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\tm.projectId === projectId &&\n\t\t\t\t\t\t\t\t\tisDirectiveMessage(m.messageType),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const }));\n\t\t\t\t\t\ttargetLabel = project\n\t\t\t\t\t\t\t? `project:${project.name}`\n\t\t\t\t\t\t\t: `project:${projectId}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t(c) => c.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (channel) {\n\t\t\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\t\t\tmessages = channelMessages\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(m) =>\n\t\t\t\t\t\t\t\t\t\tm.channelId === channel.id &&\n\t\t\t\t\t\t\t\t\t\tisDirectiveMessage(m.messageType),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const }));\n\t\t\t\t\t\t\ttargetLabel = `#${channel.name}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst channelMessages = ctx.iter<Message>(\"messages\");\n\t\t\t\t\tconst projectMessages = ctx.iter<ProjectMessage>(\"project_messages\");\n\n\t\t\t\t\tmessages = [\n\t\t\t\t\t\t...channelMessages\n\t\t\t\t\t\t\t.filter((m) => isDirectiveMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"channel\" as const })),\n\t\t\t\t\t\t...projectMessages\n\t\t\t\t\t\t\t.filter((m) => isDirectiveMessage(m.messageType))\n\t\t\t\t\t\t\t.map((m) => ({ ...m, _type: \"project\" as const })),\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tmessages = messages.filter((m) => matchesContext(m, args.context));\n\n\t\t\t\tmessages.sort((a, b) => {\n\t\t\t\t\tconst aTime = toMicros(a.createdAt);\n\t\t\t\t\tconst bTime = toMicros(b.createdAt);\n\t\t\t\t\tif (aTime < bTime) return 1;\n\t\t\t\t\tif (aTime > bTime) return -1;\n\t\t\t\t\treturn 0;\n\t\t\t\t});\n\n\t\t\t\tmessages = messages.slice(0, limit);\n\n\t\t\t\tconst channelMap = new Map(\n\t\t\t\t\tchannels.map((c) => [c.id.toString(), c.name]),\n\t\t\t\t);\n\t\t\t\tconst projectMap = new Map(\n\t\t\t\t\tprojects.map((p) => [p.id.toString(), p.name]),\n\t\t\t\t);\n\n\t\t\t\tsuccess({ messages, count: messages.length, target: targetLabel });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"directives\",\n\t\t\t\t\t\t\tmessages.map((m) => {\n\t\t\t\t\t\t\t\tconst isProject = \"_type\" in m && m._type === \"project\";\n\t\t\t\t\t\t\t\tconst location = isProject\n\t\t\t\t\t\t\t\t\t? `project:${projectMap.get((m as ProjectMessage).projectId.toString()) || (m as ProjectMessage).projectId}`\n\t\t\t\t\t\t\t\t\t: `#${channelMap.get((m as Message).channelId.toString()) || (m as Message).channelId}`;\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tid: m.id.toString(),\n\t\t\t\t\t\t\t\t\tlocation,\n\t\t\t\t\t\t\t\t\tsenderId: m.senderId,\n\t\t\t\t\t\t\t\t\tcontent:\n\t\t\t\t\t\t\t\t\t\tm.content.slice(0, 50) +\n\t\t\t\t\t\t\t\t\t\t(m.content.length > 50 ? \"...\" : \"\"),\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.display(m.messageType),\n\t\t\t\t\t\t\t\t\tcontextId: m.contextId || null,\n\t\t\t\t\t\t\t\t\tcreatedAt: formatTimestamp(m.createdAt),\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"directive\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst content = args.content;\n\t\t\t\tif (!targetInput || !content) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\"Target and directive content required. Usage: probe message directive <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\t\t\t\t\"project_channels\",\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\t\t\t\t\t\t\t\tif (!project) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst projectChannel = projectChannels.find(\n\t\t\t\t\t\t\t\t\t(pc) => pc.projectId === projectId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!projectChannel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project channel for '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendProjectMessage\", {\n\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(\"directive\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tprojectId: projectId.toString(),\n\t\t\t\t\t\t\t\t\tprojectName: project.name,\n\t\t\t\t\t\t\t\t\tmessageType: \"directive\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"directive_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `project:${project.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t\t\t\tc.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendMessage\", {\n\t\t\t\t\t\t\t\t\tchannelId: channel.id,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(\"directive\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tchannelId: channel.id.toString(),\n\t\t\t\t\t\t\t\t\tchannelName: channel.name,\n\t\t\t\t\t\t\t\t\tmessageType: \"directive\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"directive_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `#${channel.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"send\": {\n\t\t\t\tconst targetInput = args.target;\n\t\t\t\tconst content = args.content;\n\t\t\t\tif (!targetInput || !content) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\"Target and message content required. Usage: probe message send <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif ((args.type || \"user\").toLowerCase() === \"directive\") {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_TYPE\",\n\t\t\t\t\t\t\"'directive' is not allowed with 'message send'. Use: probe message directive <target> <content>\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tif (isNumeric(targetInput)) {\n\t\t\t\t\t\t\t\tconst projectId = BigInt(targetInput);\n\t\t\t\t\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\t\t\t\t\"project_channels\",\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst project = projects.find((p) => p.id === projectId);\n\t\t\t\t\t\t\t\tif (!project) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst projectChannel = projectChannels.find(\n\t\t\t\t\t\t\t\t\t(pc) => pc.projectId === projectId,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!projectChannel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"PROJECT_CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Project channel for '${targetInput}' not found`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendProjectMessage\", {\n\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(args.type || \"user\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tprojectId: projectId.toString(),\n\t\t\t\t\t\t\t\t\tprojectName: project.name,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"message_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `project:${project.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tmessageType: args.type || \"user\",\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\t\t\t\t\tconst channel = channels.find(\n\t\t\t\t\t\t\t\t\t(c) =>\n\t\t\t\t\t\t\t\t\t\tc.name === targetInput || c.id.toString() === targetInput,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (!channel) {\n\t\t\t\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\t\t\t\"CHANNEL_NOT_FOUND\",\n\t\t\t\t\t\t\t\t\t\t`Channel '${targetInput}' not found. Available: ${channels.map((c) => c.name).join(\", \")}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"sendMessage\", {\n\t\t\t\t\t\t\t\t\tchannelId: channel.id,\n\t\t\t\t\t\t\t\t\tcontent,\n\t\t\t\t\t\t\t\t\tmessageType: MessageType.fromString(args.type || \"user\"),\n\t\t\t\t\t\t\t\t\tcontextId: args.context,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\t\t\tsent: true,\n\t\t\t\t\t\t\t\t\tchannelId: channel.id.toString(),\n\t\t\t\t\t\t\t\t\tchannelName: channel.name,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\t\ttoonList(\"message_sent\", [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\ttarget: `#${channel.name}`,\n\t\t\t\t\t\t\t\t\t\t\t\tmessageType: args.type || \"user\",\n\t\t\t\t\t\t\t\t\t\t\t\tcontextId: args.context || null,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"channels\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst channels = ctx.iter<Channel>(\"channels\");\n\t\t\t\tconst projects = ctx.iter<Project>(\"projects\");\n\t\t\t\tconst projectChannels = ctx.iter<{ projectId: bigint }>(\n\t\t\t\t\t\"project_channels\",\n\t\t\t\t);\n\n\t\t\t\tconst projectChannelSet = new Set(\n\t\t\t\t\tprojectChannels.map((pc) => pc.projectId.toString()),\n\t\t\t\t);\n\t\t\t\tconst projectsWithChannels = projects.filter((p) =>\n\t\t\t\t\tprojectChannelSet.has(p.id.toString()),\n\t\t\t\t);\n\n\t\t\t\tsuccess({\n\t\t\t\t\tchannels,\n\t\t\t\t\tprojects: projectsWithChannels,\n\t\t\t\t\tchannelCount: channels.length,\n\t\t\t\t\tprojectCount: projectsWithChannels.length,\n\t\t\t\t});\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"channels\",\n\t\t\t\t\t\t\tchannels.map((c) => ({\n\t\t\t\t\t\t\t\tid: c.id.toString(),\n\t\t\t\t\t\t\t\tname: c.name,\n\t\t\t\t\t\t\t\tcreatedBy: c.createdBy,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"projects\",\n\t\t\t\t\t\t\tprojectsWithChannels.map((p) => ({\n\t\t\t\t\t\t\t\tid: p.id.toString(),\n\t\t\t\t\t\t\t\tname: p.name,\n\t\t\t\t\t\t\t\trepo: p.githubRepo,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: list, send, directive, directives, channels\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport {\n\ttype MessageCommandArgs,\n\trunMessageAction,\n} from \"./message-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"message\", description: \"Message management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, send, directive, directives, channels\",\n\t\t\trequired: false,\n\t\t},\n\t\ttarget: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Channel name, project ID, or message content\",\n\t\t\trequired: false,\n\t\t},\n\t\tcontent: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Message content (if target is channel/project)\",\n\t\t\trequired: false,\n\t\t},\n\t\ttype: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Message type: user, system\",\n\t\t\tdefault: \"user\",\n\t\t},\n\t\tcontext: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Thread context ID (message ID or entity ref like task:42)\",\n\t\t},\n\t\tlimit: { type: \"string\", description: \"Limit messages\", default: \"20\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe message\",\n\t\t\t\tdescription: \"Channel and project messaging commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe message <action> [target] [content] [options]\",\n\t\t\t\t\t\"probe message list --limit 50\",\n\t\t\t\t\t'probe message send general \"hello team\"',\n\t\t\t\t\t'probe message directive zoe \"Focus on project stability\" --context project:1',\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"list [target]\",\n\t\t\t\t\t\tdetail: \"List user messages (all, channel, or project)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"directives [target]\",\n\t\t\t\t\t\tdetail: \"List directive messages (all, channel, or project)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"send <target> <content>\",\n\t\t\t\t\t\tdetail: \"Send to target channel/project\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"directive <target> <content>\",\n\t\t\t\t\t\tdetail: \"Send directive to target channel/project\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"channels\", detail: \"List channels and project channels\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--type\",\n\t\t\t\t\t\tdetail: \"Message type: user, system (default: user)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--context\",\n\t\t\t\t\t\tdetail: \"Optional thread context ID (message ID or entity ref)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--limit\",\n\t\t\t\t\t\tdetail: \"Max messages returned for list (default: 20)\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for send\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\texamples: [\n\t\t\t\t\t\"probe message send general hello\",\n\t\t\t\t\t'probe message directive zoe \"Pause new work\" --context project:1',\n\t\t\t\t\t\"probe message directives zoe --limit 1\",\n\t\t\t\t\t'probe message send zoe \"hello there\"',\n\t\t\t\t\t'probe message send zoe \"reviewed\" --context 123',\n\t\t\t\t\t'probe message send 1 \"project update\"',\n\t\t\t\t\t\"probe message list zoe --limit 10\",\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Quotes are only required when target/content contains spaces.\",\n\t\t\t\t\t\"Use `probe message channels` to discover available channel names and project IDs.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runMessageAction(args as MessageCommandArgs);\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tCommandContext,\n\tcallReducer,\n\ttype Project,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { ProjectStatus } from \"~/utils/enums.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"project\", description: \"Project commands\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Action: list, get, create, status, set-status\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Project ID\", required: false },\n\t\tvalue: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Status value for set-status: active|paused\",\n\t\t\trequired: false,\n\t\t},\n\t\tstatus: { type: \"string\", description: \"Filter by status\" },\n\t\tlimit: { type: \"string\", description: \"Limit projects returned\" },\n\t\tname: { type: \"string\", description: \"Project name\" },\n\t\tdescription: { type: \"string\", description: \"Project description\" },\n\t\t\"github-repo\": { type: \"string\", description: \"GitHub repository URL\" },\n\t\t\"source-idea\": { type: \"string\", description: \"Source idea ID\" },\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe project\",\n\t\t\t\tdescription: \"Project listing and lookup commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe project <action> [options]\",\n\t\t\t\t\t\"probe project list --status active\",\n\t\t\t\t\t\"probe project get 1\",\n\t\t\t\t\t\"probe project status 1\",\n\t\t\t\t\t\"probe project set-status 1 paused --wallet admin-wallet\",\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List projects with optional status filter\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one project by ID\" },\n\t\t\t\t\t{ name: \"create\", detail: \"Create a new project\" },\n\t\t\t\t\t{ name: \"status <id>\", detail: \"Show only project status\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"set-status <id> <active|paused>\",\n\t\t\t\t\t\tdetail: \"Update project status (admin/zoe)\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--status\", detail: \"Status filter for list: active|paused\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Max projects returned for list\" },\n\t\t\t\t\t{ name: \"--name\", detail: \"Project name (create)\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Project description (create)\" },\n\t\t\t\t\t{ name: \"--github-repo\", detail: \"GitHub repository URL (create)\" },\n\t\t\t\t\t{ name: \"--source-idea\", detail: \"Source idea ID (create)\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Only admin/zoe identities can call set-status.\",\n\t\t\t\t\t\"Find idea IDs with `probe idea list` before using --source-idea.\",\n\t\t\t\t\t\"Find project IDs with `probe project list` before using get/create follow-up commands.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst action = args.action;\n\n\t\ttry {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tlet projects = ctx.iter<Project>(\"projects\");\n\t\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (args.status)\n\t\t\t\t\t\tprojects = projects.filter((p) =>\n\t\t\t\t\t\t\tProjectStatus.matches(p.status, args.status as string),\n\t\t\t\t\t\t);\n\t\t\t\t\tprojects = projects.sort((a, b) => {\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t\t});\n\t\t\t\t\tif (limit !== undefined) projects = projects.slice(0, limit);\n\n\t\t\t\t\tsuccess({ projects, count: projects.length });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"projects\",\n\t\t\t\t\t\t\t\tprojects.map((p) => ({\n\t\t\t\t\t\t\t\t\tid: p.id,\n\t\t\t\t\t\t\t\t\tname: p.name,\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.display(p.status),\n\t\t\t\t\t\t\t\t\tgithubRepo: p.githubRepo,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"get\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tif (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst project = ctx\n\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t.find((p) => p.id.toString() === projectId);\n\t\t\t\t\tif (!project)\n\t\t\t\t\t\terror(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n\t\t\t\t\tsuccess(project);\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"project\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: project.id.toString(),\n\t\t\t\t\t\t\t\t\tname: project.name,\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.display(project.status),\n\t\t\t\t\t\t\t\t\tgithubRepo: project.githubRepo,\n\t\t\t\t\t\t\t\t\tdescription: project.description,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tif (!projectId) error(\"PROJECT_ID_REQUIRED\", \"Project ID required\");\n\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst project = ctx\n\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t.find((p) => p.id.toString() === projectId);\n\t\t\t\t\tif (!project)\n\t\t\t\t\t\terror(\"PROJECT_NOT_FOUND\", `Project not found: ${projectId}`);\n\n\t\t\t\t\tconst status = ProjectStatus.display(project.status);\n\t\t\t\t\tsuccess({ projectId, status });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"project_status\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: project.id.toString(),\n\t\t\t\t\t\t\t\t\tname: project.name,\n\t\t\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"create\": {\n\t\t\t\t\tif (!args.name || !args[\"github-repo\"] || !args[\"source-idea\"]) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\t\"--name, --github-repo, and --source-idea required\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"createProject\", {\n\t\t\t\t\t\t\t\t\tsourceIdeaId: BigInt(args[\"source-idea\"] as string),\n\t\t\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({\n\t\t\t\t\t\t\tcreated: true,\n\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\tsourceIdeaId: args[\"source-idea\"],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"project_created\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tname: args.name,\n\t\t\t\t\t\t\t\t\t\tgithubRepo: args[\"github-repo\"],\n\t\t\t\t\t\t\t\t\t\tsourceIdeaId: args[\"source-idea\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase \"set-status\": {\n\t\t\t\t\tconst projectId = args.id;\n\t\t\t\t\tconst nextStatus = args.value;\n\t\t\t\t\tif (!projectId || !nextStatus) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"ARGS_REQUIRED\",\n\t\t\t\t\t\t\t\"Project ID and status required. Use: probe project set-status <id> <active|paused>\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst normalized = nextStatus.toLowerCase().replace(/[_\\s]/g, \"\");\n\t\t\t\t\tif (![\"active\", \"paused\"].includes(normalized)) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"INVALID_STATUS\",\n\t\t\t\t\t\t\t`Invalid status: ${nextStatus}. Use: active, paused`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"updateProjectStatus\", {\n\t\t\t\t\t\t\t\t\tprojectId: BigInt(projectId),\n\t\t\t\t\t\t\t\t\tstatus: ProjectStatus.fromString(nextStatus),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tsuccess({ updated: true, projectId, status: normalized });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"project_status_updated\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tprojectId,\n\t\t\t\t\t\t\t\t\t\tstatus: normalized,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\t\"Use: list, get, create, status, set-status\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import {\n\tCommandContext,\n\tcallReducer,\n\ttype Project,\n\ttype Task,\n\ttype TaskDependency,\n\twithAuth,\n} from \"~/utils/context.js\";\nimport { TaskStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, success } from \"~/utils/output.js\";\nimport { toMicros } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport interface TaskCommandArgs {\n\taction?: string;\n\tid?: string;\n\tstatus?: string;\n\tproject?: string;\n\ttitle?: string;\n\tdescription?: string;\n\tpriority?: string;\n\tassigned?: boolean;\n\twallet?: string;\n\t\"github-pr-url\"?: string;\n\t\"github-issue-url\"?: string;\n\t\"add-dep\"?: string;\n\tlist?: boolean;\n\ttimeout?: string;\n\tlimit?: string;\n\thost?: string;\n\tmodule?: string;\n}\n\nconst normalizeGitHubRepoUrl = (githubRepo: string): string | undefined => {\n\tconst value = githubRepo.trim().replace(/\\.git$/i, \"\");\n\tif (!value) return undefined;\n\n\tif (/^[\\w.-]+\\/[\\w.-]+$/.test(value)) {\n\t\treturn `https://github.com/${value}`;\n\t}\n\n\tconst sshMatch = value.match(/^git@github\\.com:([\\w.-]+\\/[\\w.-]+)$/i);\n\tif (sshMatch) {\n\t\treturn `https://github.com/${sshMatch[1]}`;\n\t}\n\n\tif (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\n\t\ttry {\n\t\t\tconst parsed = new URL(value);\n\t\t\tif (parsed.hostname !== \"github.com\") return undefined;\n\t\t\tconst parts = parsed.pathname.split(\"/\").filter(Boolean);\n\t\t\tif (parts.length < 2) return undefined;\n\t\t\treturn `https://github.com/${parts[0]}/${parts[1]}`;\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\nexport const runTaskAction = async (args: TaskCommandArgs): Promise<void> => {\n\tconst action = args.action;\n\tif (!action) {\n\t\terror(\"ACTION_REQUIRED\", \"Task action required\");\n\t}\n\n\ttry {\n\t\tswitch (action) {\n\t\t\tcase \"list\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tlet tasks = ctx.iter<Task>(\"tasks\");\n\t\t\t\tconst statusFilter = args.status;\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tif (statusFilter)\n\t\t\t\t\ttasks = tasks.filter((t) =>\n\t\t\t\t\t\tTaskStatus.matches(t.status, statusFilter),\n\t\t\t\t\t);\n\t\t\t\tif (args.project)\n\t\t\t\t\ttasks = tasks.filter((t) => t.projectId.toString() === args.project);\n\t\t\t\tif (args.assigned) tasks = tasks.filter((t) => t.assignedTo);\n\t\t\t\ttasks = tasks.sort((a, b) => {\n\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\tif (aMicros !== bMicros) return bMicros > aMicros ? 1 : -1;\n\t\t\t\t\tif (a.id === b.id) return 0;\n\t\t\t\t\treturn b.id > a.id ? 1 : -1;\n\t\t\t\t});\n\t\t\t\tif (limit !== undefined) tasks = tasks.slice(0, limit);\n\n\t\t\t\tsuccess({ tasks, count: tasks.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\ttasks.map((t) => ({\n\t\t\t\t\t\t\t\tid: t.id.toString(),\n\t\t\t\t\t\t\t\ttitle: t.title,\n\t\t\t\t\t\t\t\tstatus: TaskStatus.display(t.status),\n\t\t\t\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\t\t\t\tassignedTo: t.assignedTo || \"\",\n\t\t\t\t\t\t\t\tprojectId: t.projectId,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"ready\": {\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst tasks = ctx.iter<Task>(\"tasks\");\n\t\t\t\tconst deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n\t\t\t\tconst taskById = new Map(tasks.map((t) => [t.id.toString(), t]));\n\t\t\t\tconst limit = args.limit ? parseInt(args.limit, 10) : undefined;\n\n\t\t\t\tif (limit !== undefined && (!Number.isFinite(limit) || limit <= 0)) {\n\t\t\t\t\terror(\"INVALID_LIMIT\", \"--limit must be a positive integer\");\n\t\t\t\t}\n\n\t\t\t\tconst ready = tasks\n\t\t\t\t\t.filter((t) => TaskStatus.is.open(t.status))\n\t\t\t\t\t.filter((t) => {\n\t\t\t\t\t\tconst incomingDeps = deps.filter((dep) => dep.taskId === t.id);\n\t\t\t\t\t\tconst hasOpenBlocker = incomingDeps.some((dep) => {\n\t\t\t\t\t\t\tconst depTag =\n\t\t\t\t\t\t\t\ttypeof dep.dependencyType === \"string\"\n\t\t\t\t\t\t\t\t\t? dep.dependencyType\n\t\t\t\t\t\t\t\t\t: dep.dependencyType.tag;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tdepTag !== \"Blocks\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"ParentChild\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"blocks\" &&\n\t\t\t\t\t\t\t\tdepTag !== \"parent-child\"\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\tconst blocker = taskById.get(dep.dependsOnId.toString());\n\t\t\t\t\t\t\tif (!blocker) return false;\n\t\t\t\t\t\t\treturn !TaskStatus.is.completed(blocker.status);\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn !hasOpenBlocker;\n\t\t\t\t\t})\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(t) => !args.project || t.projectId.toString() === args.project,\n\t\t\t\t\t)\n\t\t\t\t\t.filter((t) => !args.assigned || Boolean(t.assignedTo))\n\t\t\t\t\t.sort((a, b) => {\n\t\t\t\t\t\tif (a.priority !== b.priority) return a.priority - b.priority;\n\t\t\t\t\t\tconst aMicros = toMicros(a.createdAt);\n\t\t\t\t\t\tconst bMicros = toMicros(b.createdAt);\n\t\t\t\t\t\tif (aMicros < bMicros) return -1;\n\t\t\t\t\t\tif (aMicros > bMicros) return 1;\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t});\n\n\t\t\t\tconst readyTasks = (\n\t\t\t\t\tlimit !== undefined ? ready.slice(0, limit) : ready\n\t\t\t\t).map((t) => ({\n\t\t\t\t\tid: t.id.toString(),\n\t\t\t\t\ttitle: t.title,\n\t\t\t\t\tstatus: t.status.tag.toLowerCase(),\n\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\tassignedTo: t.assignedTo || \"\",\n\t\t\t\t\tprojectId: t.projectId.toString(),\n\t\t\t\t\tblockedBy: [] as string[],\n\t\t\t\t}));\n\n\t\t\t\tsuccess({ tasks: readyTasks, count: readyTasks.length });\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\"tasks\",\n\t\t\t\t\t\t\treadyTasks.map((t) => ({\n\t\t\t\t\t\t\t\tid: t.id,\n\t\t\t\t\t\t\t\ttitle: t.title,\n\t\t\t\t\t\t\t\tstatus: t.status,\n\t\t\t\t\t\t\t\tpriority: t.priority,\n\t\t\t\t\t\t\t\tassignedTo: t.assignedTo,\n\t\t\t\t\t\t\t\tprojectId: t.projectId,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"get\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\thost: args.host,\n\t\t\t\t\tmodule: args.module,\n\t\t\t\t});\n\t\t\t\tconst task = ctx\n\t\t\t\t\t.iter<Task>(\"tasks\")\n\t\t\t\t\t.find((t) => t.id.toString() === taskId);\n\t\t\t\tif (!task) error(\"TASK_NOT_FOUND\", `Task not found: ${taskId}`);\n\n\t\t\t\tsuccess(task);\n\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\ttoonList(\"task\", [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid: task.id.toString(),\n\t\t\t\t\t\t\t\ttitle: task.title,\n\t\t\t\t\t\t\t\tstatus: TaskStatus.display(task.status),\n\t\t\t\t\t\t\t\tpriority: task.priority,\n\t\t\t\t\t\t\t\tassignedTo: task.assignedTo || \"\",\n\t\t\t\t\t\t\t\tprojectId: task.projectId.toString(),\n\t\t\t\t\t\t\t\tgithubIssueUrl: task.githubIssueUrl || \"\",\n\t\t\t\t\t\t\t\tgithubPrUrl: task.githubPrUrl || \"\",\n\t\t\t\t\t\t\t\tdescription: task.description,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"create\": {\n\t\t\t\tif (!args.project || !args.title)\n\t\t\t\t\terror(\"ARGS_REQUIRED\", \"--project and --title required\");\n\n\t\t\t\tconst priority = parseInt(args.priority || \"5\", 10);\n\t\t\t\tif (priority < 1 || priority > 10)\n\t\t\t\t\terror(\"INVALID_PRIORITY\", \"Priority must be 1-10\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"createTask\", {\n\t\t\t\t\t\t\t\tprojectId: BigInt(args.project as string),\n\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\tdescription: args.description || \"\",\n\t\t\t\t\t\t\t\tpriority,\n\t\t\t\t\t\t\t\tsourceIdeaId: undefined,\n\t\t\t\t\t\t\t\tgithubIssueUrl: args[\"github-issue-url\"],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tcreated: true,\n\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\tissue: args[\"github-issue-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_created\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprojectId: args.project,\n\t\t\t\t\t\t\t\t\ttitle: args.title,\n\t\t\t\t\t\t\t\t\tgithubIssueUrl: args[\"github-issue-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"claim\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tlet repositoryUrl: string | undefined;\n\t\t\t\t\tlet contributingUrl: string | undefined;\n\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"claimTask\", { taskId: BigInt(taskId) });\n\n\t\t\t\t\t\t\tconst task = ctx\n\t\t\t\t\t\t\t\t.iter<Task>(\"tasks\")\n\t\t\t\t\t\t\t\t.find((t) => t.id.toString() === taskId);\n\t\t\t\t\t\t\tconst project = task\n\t\t\t\t\t\t\t\t? ctx\n\t\t\t\t\t\t\t\t\t\t.iter<Project>(\"projects\")\n\t\t\t\t\t\t\t\t\t\t.find((p) => p.id === task.projectId)\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\tif (project?.githubRepo) {\n\t\t\t\t\t\t\t\trepositoryUrl = normalizeGitHubRepoUrl(project.githubRepo);\n\t\t\t\t\t\t\t\tif (repositoryUrl) {\n\t\t\t\t\t\t\t\t\tcontributingUrl = `${repositoryUrl}/blob/main/CONTRIBUTING.md`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tclaimed: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\trepositoryUrl,\n\t\t\t\t\t\tcontributingUrl,\n\t\t\t\t\t\tnextSteps: [\n\t\t\t\t\t\t\trepositoryUrl\n\t\t\t\t\t\t\t\t? `Fork the target repository: ${repositoryUrl}`\n\t\t\t\t\t\t\t\t: \"Fork the target repository to your GitHub account using gh cli\",\n\t\t\t\t\t\t\tcontributingUrl\n\t\t\t\t\t\t\t\t? `Read CONTRIBUTING.md before starting: ${contributingUrl}`\n\t\t\t\t\t\t\t\t: \"Read CONTRIBUTING.md in the target repository before starting\",\n\t\t\t\t\t\t\t\"Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_claimed\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\trepositoryUrl: repositoryUrl || \"\",\n\t\t\t\t\t\t\t\t\tcontributingUrl: contributingUrl || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconsole.log(\"\");\n\t\t\t\t\t\tconsole.log(\"Next steps:\");\n\t\t\t\t\t\tif (repositoryUrl) {\n\t\t\t\t\t\t\tconsole.log(`1. Fork the target repository: ${repositoryUrl}`);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"1. Fork the target repository to your GitHub account\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (contributingUrl) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`2. Read CONTRIBUTING.md before starting: ${contributingUrl}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\"2. Read CONTRIBUTING.md in the target repository before starting\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\"3. Verify behavior independently by tracing relevant code flow and runtime path before implementing changes.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"update\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\t\t\t\tif (!args.status && !args[\"github-pr-url\"])\n\t\t\t\t\terror(\"UPDATE_REQUIRED\", \"--status or --github-pr-url required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateTaskStatus\", {\n\t\t\t\t\t\t\t\ttaskId: BigInt(taskId),\n\t\t\t\t\t\t\t\tstatus: args.status\n\t\t\t\t\t\t\t\t\t? TaskStatus.fromString(args.status)\n\t\t\t\t\t\t\t\t\t: (undefined as never),\n\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"],\n\t\t\t\t\t\t\t\tarchiveReason: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\tupdated: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tstatus: args.status,\n\t\t\t\t\t\tpr: args[\"github-pr-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_updated\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\tstatus: args.status || \"\",\n\t\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"review\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\n\t\t\t\ttry {\n\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\tawait callReducer(ctx, \"updateTaskStatus\", {\n\t\t\t\t\t\t\t\ttaskId: BigInt(taskId),\n\t\t\t\t\t\t\t\tstatus: { tag: \"Review\" },\n\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"],\n\t\t\t\t\t\t\t\tarchiveReason: undefined,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tsuccess({\n\t\t\t\t\t\treviewed: true,\n\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\tstatus: \"review\",\n\t\t\t\t\t\tpr: args[\"github-pr-url\"],\n\t\t\t\t\t});\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"task_review\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\tstatus: \"review\",\n\t\t\t\t\t\t\t\t\tgithubPrUrl: args[\"github-pr-url\"] || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"deps\": {\n\t\t\t\tconst taskId = args.id;\n\t\t\t\tif (!taskId) error(\"TASK_ID_REQUIRED\", \"Task ID required\");\n\t\t\t\tconst taskIdBigInt = BigInt(taskId);\n\n\t\t\t\tif (args[\"add-dep\"]) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait withAuth(\n\t\t\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"addTaskDependency\", {\n\t\t\t\t\t\t\t\t\ttaskId: taskIdBigInt,\n\t\t\t\t\t\t\t\t\tdependsOnId: BigInt(args[\"add-dep\"] as string),\n\t\t\t\t\t\t\t\t\tdependencyType: { tag: \"Blocks\" },\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsuccess({ added: true, taskId, dependsOn: args[\"add-dep\"] });\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"dependency_added\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttaskId,\n\t\t\t\t\t\t\t\t\t\tdependsOnId: args[\"add-dep\"],\n\t\t\t\t\t\t\t\t\t\tdependencyType: \"blocks\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"REDUCER_FAILED\",\n\t\t\t\t\t\t\terr instanceof Error ? err.message : \"Unknown error\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else if (args.list) {\n\t\t\t\t\tawait using ctx = await CommandContext.create({\n\t\t\t\t\t\thost: args.host,\n\t\t\t\t\t\tmodule: args.module,\n\t\t\t\t\t});\n\t\t\t\t\tconst deps = ctx.iter<TaskDependency>(\"task_dependencies\");\n\t\t\t\t\tconst taskDeps = deps.filter(\n\t\t\t\t\t\t(d) => d.taskId === taskIdBigInt || d.dependsOnId === taskIdBigInt,\n\t\t\t\t\t);\n\n\t\t\t\t\tsuccess({ dependencies: taskDeps });\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\n\t\t\t\t\t\t\t\t\"task_dependencies\",\n\t\t\t\t\t\t\t\ttaskDeps.map((dep) => ({\n\t\t\t\t\t\t\t\t\tid: dep.id.toString(),\n\t\t\t\t\t\t\t\t\ttaskId: dep.taskId.toString(),\n\t\t\t\t\t\t\t\t\tdependsOnId: dep.dependsOnId.toString(),\n\t\t\t\t\t\t\t\t\tdependencyType: dep.dependencyType,\n\t\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\terror(\n\t\t\t\t\t\t\"DEPS_ACTION_REQUIRED\",\n\t\t\t\t\t\t\"Use --add-dep <taskId> to add a dependency or --list to view dependencies\",\n\t\t\t\t\t\t\"Examples: probe task deps 42 --list | probe task deps 42 --add-dep 17\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"watch\": {\n\t\t\t\tconst timeout = Math.min(parseInt(args.timeout || \"60\", 10), 300);\n\n\t\t\t\tawait withAuth(\n\t\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\t\tasync (ctx) => {\n\t\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\ttoonList(\"task_watch\", [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttimeoutSeconds: timeout,\n\t\t\t\t\t\t\t\t\t\tstatusFilter: args.status || \"\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst waitForStop = new Promise<void>((resolve) => {\n\t\t\t\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\t\t\t\tprocess.off(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}, timeout * 1000);\n\n\t\t\t\t\t\t\tconst onSignal = () => {\n\t\t\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\t\tprocess.off(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tprocess.on(\"SIGINT\", onSignal);\n\t\t\t\t\t\t\tprocess.on(\"SIGTERM\", onSignal);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tctx.db.tasks.onInsert((_ctx, task) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!args.status ||\n\t\t\t\t\t\t\t\tTaskStatus.matches(task.status, args.status)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"tasks\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: task.id.toString(),\n\t\t\t\t\t\t\t\t\t\t\ttitle: task.title,\n\t\t\t\t\t\t\t\t\t\t\tchange_type: \"created\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tctx.db.tasks.onUpdate((_ctx, _old, newTask) => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!args.status ||\n\t\t\t\t\t\t\t\tTaskStatus.matches(newTask.status, args.status)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t\ttoonList(\"tasks\", [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tid: newTask.id.toString(),\n\t\t\t\t\t\t\t\t\t\t\ttitle: newTask.title,\n\t\t\t\t\t\t\t\t\t\t\tchange_type: \"updated\",\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait waitForStop;\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\terror(\n\t\t\t\t\t\"INVALID_ACTION\",\n\t\t\t\t\t`Invalid action: ${action}`,\n\t\t\t\t\t\"Use: list, ready, get, create, claim, update, review, deps, watch\",\n\t\t\t\t);\n\t\t}\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\terror(\"CONNECTION_ERROR\", message);\n\t}\n};\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { setJsonMode } from \"~/utils/output.js\";\nimport { runTaskAction, type TaskCommandArgs } from \"./task-handlers.js\";\n\nexport default defineCommand({\n\tmeta: { name: \"task\", description: \"Task management\" },\n\targs: {\n\t\taction: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription:\n\t\t\t\t\"Action: list, ready, get, create, claim, update, review, deps, watch\",\n\t\t\trequired: false,\n\t\t},\n\t\tid: { type: \"positional\", description: \"Task ID\", required: false },\n\t\tstatus: { type: \"string\", description: \"Status filter or new status\" },\n\t\tproject: { type: \"string\", description: \"Project ID\" },\n\t\ttitle: { type: \"string\", description: \"Task title\" },\n\t\tdescription: { type: \"string\", description: \"Task description\" },\n\t\tpriority: { type: \"string\", description: \"Priority 1-10\" },\n\t\tassigned: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Show only assigned tasks\",\n\t\t\tdefault: false,\n\t\t},\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\t\"github-pr-url\": { type: \"string\", description: \"GitHub PR URL\" },\n\t\t\"github-issue-url\": { type: \"string\", description: \"GitHub issue URL\" },\n\t\t\"add-dep\": { type: \"string\", description: \"Add dependency task ID\" },\n\t\tlist: { type: \"boolean\", description: \"List dependencies\", default: false },\n\t\ttimeout: { type: \"string\", description: \"Watch timeout (seconds)\" },\n\t\tlimit: { type: \"string\", description: \"Limit rows for list/ready\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\tif (!args.action) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe task\",\n\t\t\t\tdescription: \"Task management commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe task <action> [options]\",\n\t\t\t\t\t\"probe task list --project 1 --status open\",\n\t\t\t\t\t'probe task create --project 1 --title \"Fix bug\" --priority 5',\n\t\t\t\t],\n\t\t\t\tactions: [\n\t\t\t\t\t{ name: \"list\", detail: \"List tasks with optional filters\" },\n\t\t\t\t\t{ name: \"ready\", detail: \"List immediately claimable open tasks\" },\n\t\t\t\t\t{ name: \"get <id>\", detail: \"Show one task\" },\n\t\t\t\t\t{ name: \"create\", detail: \"Create a new task\" },\n\t\t\t\t\t{ name: \"claim <id>\", detail: \"Claim a task for your identity\" },\n\t\t\t\t\t{ name: \"update <id>\", detail: \"Update status and optional PR URL\" },\n\t\t\t\t\t{ name: \"review <id>\", detail: \"Mark a task as ready for review\" },\n\t\t\t\t\t{ name: \"deps <id>\", detail: \"List or add task dependencies\" },\n\t\t\t\t\t{ name: \"watch\", detail: \"Watch task changes in real time\" },\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--project\", detail: \"Project ID\" },\n\t\t\t\t\t{ name: \"--title\", detail: \"Task title (create)\" },\n\t\t\t\t\t{ name: \"--description\", detail: \"Task description\" },\n\t\t\t\t\t{ name: \"--priority\", detail: \"Priority from 1 to 10 (default: 5)\" },\n\t\t\t\t\t{ name: \"--status\", detail: \"Filter or new status\" },\n\t\t\t\t\t{ name: \"--limit\", detail: \"Limit rows for list/ready\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--github-pr-url\",\n\t\t\t\t\t\tdetail: \"GitHub PR URL for update/review\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--github-issue-url\", detail: \"GitHub issue URL for create\" },\n\t\t\t\t\t{ name: \"--wallet\", detail: \"Wallet to use for authenticated calls\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Use full long-form flags only; short aliases are intentionally disabled.\",\n\t\t\t\t\t\"Find project IDs with `probe project list`; find task IDs with `probe task list`.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runTaskAction(args as TaskCommandArgs);\n\t},\n});\n","import { createWriteStream, type WriteStream } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { createConsola } from \"consola\";\nimport { type Agent, callReducer, withAuth } from \"~/utils/context.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\n\nconst HEARTBEAT_INTERVAL_MS = 60_000;\nconst HEARTBEAT_JITTER_MS = 5_000;\nconst HEARTBEAT_FAILURE_THRESHOLD = 3;\nconst RECONNECT_BASE_MS = 1_000;\nconst RECONNECT_MAX_MS = 30_000;\n\nconst OBSERVED_TABLES = [\n\t{ key: \"agents\", name: \"agents\" },\n\t{ key: \"tasks\", name: \"tasks\" },\n\t{ key: \"ideas\", name: \"ideas\" },\n\t{ key: \"messages\", name: \"messages\" },\n\t{ key: \"channels\", name: \"channels\" },\n\t{ key: \"projects\", name: \"projects\" },\n\t{ key: \"votes\", name: \"votes\" },\n\t{ key: \"discovered_tasks\", name: \"discovered_tasks\" },\n\t{ key: \"task_dependencies\", name: \"task_dependencies\" },\n\t{ key: \"identity_roles\", name: \"identity_roles\" },\n\t{ key: \"config\", name: \"config\" },\n\t{ key: \"project_channels\", name: \"project_channels\" },\n\t{ key: \"project_messages\", name: \"project_messages\" },\n] as const;\n\ntype DaemonEvent = {\n\ttype: string;\n\tsource: \"nexus\";\n\tat: string;\n\t[key: string]: unknown;\n};\n\ntype SessionEnd = {\n\treason: \"disconnected\" | \"heartbeat_failed\" | \"stop\";\n\tdetails?: unknown;\n};\n\ntype LogLevel = \"critical\" | \"info\" | \"debug\";\n\ntype ObservableTable = {\n\tonInsert?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n\tonUpdate?: (\n\t\tcb: (_ctx: unknown, oldRow: unknown, newRow: unknown) => void,\n\t) => void;\n\tonDelete?: (cb: (_ctx: unknown, row: unknown) => void) => void;\n};\n\nconst CRITICAL_EVENTS = new Set([\n\t\"connected\",\n\t\"ready\",\n\t\"disconnected\",\n\t\"reconnecting\",\n\t\"reconnected\",\n\t\"subscription_applied\",\n\t\"subscription_error\",\n\t\"auth_failed\",\n\t\"heartbeat_failed\",\n\t\"heartbeat_recovered\",\n\t\"shutdown\",\n]);\n\nconst jsonReplacer = (_key: string, value: unknown): unknown => {\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\treturn value;\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nconst sleep = (ms: number): Promise<void> =>\n\tnew Promise((resolve) => setTimeout(resolve, ms));\n\nconst withJitter = (baseMs: number): number => {\n\tconst jitter = Math.floor(\n\t\tMath.random() * (HEARTBEAT_JITTER_MS * 2 + 1) - HEARTBEAT_JITTER_MS,\n\t);\n\treturn Math.max(1_000, baseMs + jitter);\n};\n\nconst backoffMs = (attempt: number): number => {\n\tconst base = Math.min(\n\t\tRECONNECT_MAX_MS,\n\t\tRECONNECT_BASE_MS * 2 ** Math.max(0, attempt - 1),\n\t);\n\treturn withJitter(base);\n};\n\nconst normalizeError = (err: unknown): string => {\n\tif (err instanceof Error) {\n\t\treturn err.message;\n\t}\n\treturn String(err);\n};\n\nconst sanitizeValue = (value: unknown): unknown => {\n\tif (value instanceof Error) {\n\t\treturn { name: value.name, message: value.message };\n\t}\n\tif (\n\t\ttypeof value === \"string\" ||\n\t\ttypeof value === \"number\" ||\n\t\ttypeof value === \"boolean\" ||\n\t\tvalue === null\n\t) {\n\t\treturn value;\n\t}\n\tif (typeof value === \"bigint\") {\n\t\treturn value.toString();\n\t}\n\ttry {\n\t\treturn JSON.parse(JSON.stringify(value, jsonReplacer));\n\t} catch {\n\t\treturn String(value);\n\t}\n};\n\nconst resolveLogLevel = (value: unknown): LogLevel => {\n\tif (value === \"critical\" || value === \"info\" || value === \"debug\") {\n\t\treturn value;\n\t}\n\treturn \"critical\";\n};\n\nconst shouldEmit = (eventType: string, level: LogLevel): boolean => {\n\tif (level === \"debug\") {\n\t\treturn true;\n\t}\n\tif (CRITICAL_EVENTS.has(eventType)) {\n\t\treturn true;\n\t}\n\tif (level === \"info\" && eventType.startsWith(\"heartbeat_\")) {\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nconst resolveLogStream = async (\n\tpathValue?: string,\n): Promise<WriteStream | null> => {\n\tif (!pathValue) {\n\t\treturn null;\n\t}\n\tconst absolutePath = resolve(pathValue);\n\tawait mkdir(dirname(absolutePath), { recursive: true });\n\treturn createWriteStream(absolutePath, { flags: \"a\" });\n};\n\nconst connectErrorLooksAuthRelated = (message: string): boolean => {\n\tconst lowered = message.toLowerCase();\n\treturn (\n\t\tlowered.includes(\"authentication required\") ||\n\t\tlowered.includes(\"unauthorized\") ||\n\t\tlowered.includes(\"401\")\n\t);\n};\n\nexport const nexusDaemonArgs = {\n\twallet: {\n\t\ttype: \"string\",\n\t\tdescription: \"Wallet name for authenticated connection\",\n\t},\n\thost: {\n\t\ttype: \"string\",\n\t\tdescription: \"SpacetimeDB host override\",\n\t},\n\tmodule: {\n\t\ttype: \"string\",\n\t\tdescription: \"SpacetimeDB module override\",\n\t},\n\tsender: {\n\t\ttype: \"string\",\n\t\tdescription: \"Optional sender filter (debug table events only)\",\n\t},\n\t\"log-file\": {\n\t\ttype: \"string\",\n\t\tdescription: \"Optional path to append JSONL daemon events\",\n\t},\n\t\"log-level\": {\n\t\ttype: \"string\",\n\t\tdescription: \"critical, info, or debug\",\n\t\tdefault: \"critical\",\n\t},\n\tpretty: {\n\t\ttype: \"boolean\",\n\t\tdescription: \"Human-readable lifecycle logs to stderr\",\n\t\tdefault: false,\n\t},\n\tjson: {\n\t\ttype: \"boolean\",\n\t\tdescription: \"Reserved for CLI consistency\",\n\t\tdefault: false,\n\t},\n} as const;\n\nexport async function runNexusDaemon(\n\targs: Record<string, unknown>,\n): Promise<void> {\n\tconst logLevel = resolveLogLevel(args[\"log-level\"]);\n\tconst pretty = !!args.pretty;\n\tconst prettyLogger = pretty\n\t\t? createConsola({\n\t\t\t\tstdout: process.stderr,\n\t\t\t\tstderr: process.stderr,\n\t\t\t})\n\t\t: null;\n\n\tlet logStream: WriteStream | null = null;\n\ttry {\n\t\tlogStream = await resolveLogStream(args[\"log-file\"] as string | undefined);\n\t} catch (err) {\n\t\tconst message = normalizeError(err);\n\t\tconst fallback = JSON.stringify({\n\t\t\tsource: \"nexus\",\n\t\t\tat: nowIso(),\n\t\t\ttype: \"log_file_error\",\n\t\t\tmessage,\n\t\t});\n\t\tconsole.log(fallback);\n\t\treturn;\n\t}\n\n\tconst writeEvent = (event: DaemonEvent): void => {\n\t\tconst line = JSON.stringify(event, jsonReplacer);\n\t\tconsole.log(line);\n\t\tif (logStream) {\n\t\t\tlogStream.write(`${line}\\n`);\n\t\t}\n\t};\n\n\tconst emit = (event: { type: string; [key: string]: unknown }): void => {\n\t\tif (!shouldEmit(event.type, logLevel)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst fullEvent: DaemonEvent = {\n\t\t\tsource: \"nexus\",\n\t\t\tat: nowIso(),\n\t\t\t...event,\n\t\t};\n\n\t\twriteEvent(fullEvent);\n\n\t\tif (!prettyLogger) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst type = String(event.type);\n\t\tif (type === \"connected\") {\n\t\t\tprettyLogger.info(\"Connected to Nexus\");\n\t\t} else if (type === \"reconnected\") {\n\t\t\tprettyLogger.success(\"Reconnected to Nexus\");\n\t\t} else if (type === \"disconnected\") {\n\t\t\tprettyLogger.warn(\"Disconnected from Nexus\");\n\t\t} else if (type === \"reconnecting\") {\n\t\t\tprettyLogger.info(\"Reconnecting to Nexus\");\n\t\t} else if (type === \"auth_failed\") {\n\t\t\tprettyLogger.error(\"Authentication failed\");\n\t\t} else if (type === \"heartbeat_failed\") {\n\t\t\tprettyLogger.warn(\"Heartbeat failed repeatedly\");\n\t\t} else if (type === \"shutdown\") {\n\t\t\tprettyLogger.info(\"Nexus daemon shutting down\");\n\t\t}\n\t};\n\n\tlet stopping = false;\n\tlet stopSignal: \"SIGINT\" | \"SIGTERM\" | null = null;\n\n\tconst stopWaiter = new Promise<void>((resolve) => {\n\t\tconst onSigint = () => {\n\t\t\tif (stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstopping = true;\n\t\t\tstopSignal = \"SIGINT\";\n\t\t\tresolve();\n\t\t};\n\t\tconst onSigterm = () => {\n\t\t\tif (stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstopping = true;\n\t\t\tstopSignal = \"SIGTERM\";\n\t\t\tresolve();\n\t\t};\n\t\tprocess.on(\"SIGINT\", onSigint);\n\t\tprocess.on(\"SIGTERM\", onSigterm);\n\t});\n\n\tlet reconnectAttempt = 0;\n\tlet downtimeStartedAt: number | null = null;\n\tlet hasConnectedOnce = false;\n\n\twhile (!stopping) {\n\t\tlet sessionEnd: SessionEnd | null = null;\n\n\t\ttry {\n\t\t\tawait withAuth(\n\t\t\t\t{\n\t\t\t\t\thost: args.host as string | undefined,\n\t\t\t\t\tmodule: args.module as string | undefined,\n\t\t\t\t\twallet: args.wallet as string | undefined,\n\t\t\t\t\tonDisconnect: (...disconnectArgs: unknown[]) => {\n\t\t\t\t\t\tif (!sessionEnd) {\n\t\t\t\t\t\t\tsessionEnd = {\n\t\t\t\t\t\t\t\treason: \"disconnected\",\n\t\t\t\t\t\t\t\tdetails: disconnectArgs.map(sanitizeValue),\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst effectiveWallet = ctx.auth?.wallet || args.wallet || null;\n\t\t\t\t\tconst currentAgent = ctx\n\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t.find(\n\t\t\t\t\t\t\t(a) => a.identity.toHexString() === ctx.identity?.toHexString(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!hasConnectedOnce) {\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"connected\",\n\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\t\twallet: effectiveWallet,\n\t\t\t\t\t\t\thost: args.host || ctx.config.spacetime.host,\n\t\t\t\t\t\t\tmodule: args.module || ctx.config.spacetime.module,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"reconnected\",\n\t\t\t\t\t\t\tattempts: reconnectAttempt,\n\t\t\t\t\t\t\tdowntime_ms: downtimeStartedAt\n\t\t\t\t\t\t\t\t? Date.now() - downtimeStartedAt\n\t\t\t\t\t\t\t\t: null,\n\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\thasConnectedOnce = true;\n\t\t\t\t\treconnectAttempt = 0;\n\t\t\t\t\tdowntimeStartedAt = null;\n\n\t\t\t\t\temit({ type: \"subscription_applied\" });\n\t\t\t\t\temit({\n\t\t\t\t\t\ttype: \"ready\",\n\t\t\t\t\t\tidentity: ctx.identity?.toHexString(),\n\t\t\t\t\t\twallet: effectiveWallet,\n\t\t\t\t\t\tlog_file: args[\"log-file\"] || null,\n\t\t\t\t\t\tlog_level: logLevel,\n\t\t\t\t\t\tauto_heartbeat: !!currentAgent,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (logLevel === \"debug\") {\n\t\t\t\t\t\tfor (const tableSpec of OBSERVED_TABLES) {\n\t\t\t\t\t\t\tconst table = ctx.db[tableSpec.key] as ObservableTable;\n\t\t\t\t\t\t\ttable.onInsert?.((_eventCtx, row) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (row as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_insert\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\trow: sanitizeValue(row),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttable.onUpdate?.((_eventCtx, oldRow, newRow) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (newRow as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_update\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\told_row: sanitizeValue(oldRow),\n\t\t\t\t\t\t\t\t\tnew_row: sanitizeValue(newRow),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttable.onDelete?.((_eventCtx, row) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\targs.sender &&\n\t\t\t\t\t\t\t\t\t(tableSpec.name === \"messages\" ||\n\t\t\t\t\t\t\t\t\t\ttableSpec.name === \"project_messages\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst senderId = (row as { senderId?: unknown }).senderId;\n\t\t\t\t\t\t\t\t\tif (senderId !== args.sender) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\ttype: \"table_delete\",\n\t\t\t\t\t\t\t\t\ttable: tableSpec.name,\n\t\t\t\t\t\t\t\t\trow: sanitizeValue(row),\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n\t\t\t\t\tlet heartbeatInFlight = false;\n\t\t\t\t\tlet consecutiveHeartbeatFailures = 0;\n\n\t\t\t\t\tconst scheduleHeartbeat = () => {\n\t\t\t\t\t\tif (stopping || !currentAgent) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\theartbeatTimer = setTimeout(async () => {\n\t\t\t\t\t\t\tif (!currentAgent || heartbeatInFlight || stopping) {\n\t\t\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\theartbeatInFlight = true;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait callReducer(ctx, \"heartbeat\", {\n\t\t\t\t\t\t\t\t\tagentId: currentAgent.id,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (consecutiveHeartbeatFailures > 0) {\n\t\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\t\ttype: \"heartbeat_recovered\",\n\t\t\t\t\t\t\t\t\t\tfailed_count_before_recovery: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures = 0;\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures += 1;\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tconsecutiveHeartbeatFailures >= HEARTBEAT_FAILURE_THRESHOLD &&\n\t\t\t\t\t\t\t\t\t!sessionEnd\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tsessionEnd = {\n\t\t\t\t\t\t\t\t\t\treason: \"heartbeat_failed\",\n\t\t\t\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\t\t\t\tconsecutive_failures: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t\t\tmessage: normalizeError(err),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\temit({\n\t\t\t\t\t\t\t\t\t\ttype: \"heartbeat_failed\",\n\t\t\t\t\t\t\t\t\t\tconsecutive_failures: consecutiveHeartbeatFailures,\n\t\t\t\t\t\t\t\t\t\tmessage: normalizeError(err),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\t\theartbeatInFlight = false;\n\t\t\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, withJitter(HEARTBEAT_INTERVAL_MS));\n\t\t\t\t\t};\n\n\t\t\t\t\tif (currentAgent) {\n\t\t\t\t\t\tscheduleHeartbeat();\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (!stopping && !sessionEnd) {\n\t\t\t\t\t\tawait Promise.race([stopWaiter, sleep(200)]);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (heartbeatTimer) {\n\t\t\t\t\t\tclearTimeout(heartbeatTimer);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconst message = normalizeError(err);\n\t\t\tif (connectErrorLooksAuthRelated(message)) {\n\t\t\t\temit({ type: \"auth_failed\", message });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\temit({ type: \"subscription_error\", message });\n\t\t\tsessionEnd = {\n\t\t\t\treason: \"disconnected\",\n\t\t\t\tdetails: { message },\n\t\t\t};\n\t\t}\n\n\t\tif (stopping) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst reason = sessionEnd?.reason || \"disconnected\";\n\t\temit({\n\t\t\ttype: \"disconnected\",\n\t\t\treason,\n\t\t\tdetails: sanitizeValue(sessionEnd?.details || null),\n\t\t});\n\n\t\tif (downtimeStartedAt === null) {\n\t\t\tdowntimeStartedAt = Date.now();\n\t\t}\n\n\t\treconnectAttempt += 1;\n\t\tconst waitMs = backoffMs(reconnectAttempt);\n\t\temit({\n\t\t\ttype: \"reconnecting\",\n\t\t\tattempt: reconnectAttempt,\n\t\t\tbackoff_ms: waitMs,\n\t\t});\n\n\t\tawait Promise.race([stopWaiter, sleep(waitMs)]);\n\t}\n\n\temit({ type: \"shutdown\", signal: stopSignal || \"unknown\" });\n\n\tif (logStream) {\n\t\tlogStream.end();\n\t}\n}\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"nexus\",\n\t\tdescription: \"Persistent Nexus daemon (keepalive + critical telemetry)\",\n\t},\n\targs: nexusDaemonArgs,\n\tasync run({ args }) {\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe nexus\",\n\t\t\t\tdescription: \"Run persistent Nexus keepalive + critical event logger\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe nexus [options]\",\n\t\t\t\t\t\"probe nexus --wallet agent-wallet\",\n\t\t\t\t\t\"probe nexus --wallet agent-wallet --log-file ./logs/nexus-events.jsonl\",\n\t\t\t\t\t\"probe nexus --log-level debug --sender zoe-1\",\n\t\t\t\t\t\"probe nexus --pretty\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--wallet\",\n\t\t\t\t\t\tdetail: \"Wallet for authenticated persistent connection\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--log-level\", detail: \"critical (default), info, or debug\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--sender\",\n\t\t\t\t\t\tdetail: \"Sender filter for debug message events only\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--log-file\",\n\t\t\t\t\t\tdetail: \"Optional JSONL file path for daemon events\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--pretty\",\n\t\t\t\t\t\tdetail: \"Human-readable lifecycle logs to stderr\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"stdout is always structured JSONL for machine parsing.\",\n\t\t\t\t\t\"Default mode logs critical connection lifecycle and heartbeat health events only.\",\n\t\t\t\t\t\"Use --log-level debug to emit full table insert/update/delete payloads.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tawait runNexusDaemon(args as Record<string, unknown>);\n\t},\n});\n","// THIS FILE IS AUTO-GENERATED BY scripts/generate-decoders.ts\n// DO NOT EDIT MANUALLY - Run `npm run generate:decoders` to regenerate\n\n/**\n * Algebraic type decoders for SpacetimeDB SQL query results.\n * Converts raw algebraic type arrays to human-readable values.\n */\n\nexport type Decoder = (value: unknown) => unknown;\n\n// Enum decoders - map variant index to name\nconst enumDecoders: Record<string, Decoder> = {\n AgentRole: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Zoe', 'Admin', 'Zeno'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n AgentStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Online', 'Offline', 'Working'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DependencyType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Blocks', 'ParentChild'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DiscoveredTaskStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['PendingReview', 'Approved', 'Rejected', 'EscalatedToIdea'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n DiscoveryDecision: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['ApproveAsTask', 'Reject', 'EscalateToIdea'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n IdeaStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Voting', 'ApprovedForProject', 'Rejected', 'Implemented'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n MessageType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['User', 'System', 'Directive'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n ProjectStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Active', 'Paused'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n TaskStatus: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Open', 'Claimed', 'InProgress', 'Review', 'Completed', 'Blocked', 'Archived'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n VoteType: (value) => {\n if (!Array.isArray(value)) return value;\n const variants = ['Up', 'Down', 'Veto'];\n return variants[value[0]] ?? `variant_${value[0]}`;\n },\n};\n\n// Timestamp decoder - converts microseconds to ISO string\nconst timestampDecoder: Decoder = (value) => {\n if (!Array.isArray(value)) return value;\n const micros = value[0];\n if (typeof micros !== \"number\" && typeof micros !== \"bigint\") return value;\n return new Date(Number(micros) / 1000).toISOString();\n};\n\n// Option decoder - unwraps Some, returns null for None\nconst optionDecoder = (inner?: Decoder): Decoder => (value) => {\n if (!Array.isArray(value)) return value;\n const [tag, payload] = value;\n if (tag === 1) return null; // None\n // For Option<T>, payload is [T] (array with single element)\n // Pass the payload directly to inner decoder - it knows how to handle its format\n if (inner) {\n // Inner decoder expects the wrapped format (e.g., timestampDecoder expects [micros])\n return inner(payload);\n }\n // No inner decoder - unwrap primitives\n return Array.isArray(payload) && payload.length === 1 ? payload[0] : payload;\n};\n\n// Table column decoders\nexport const TABLE_DECODERS: Record<string, Record<string, Decoder>> = {\n agents: {\n 'last_heartbeat': timestampDecoder,\n 'current_task_id': optionDecoder(),\n 'created_at': timestampDecoder,\n 'last_active_at': timestampDecoder,\n 'role': enumDecoders.AgentRole,\n 'status': enumDecoders.AgentStatus,\n },\n channels: {\n 'created_at': timestampDecoder,\n },\n discovered_tasks: {\n 'created_task_id': optionDecoder(),\n 'rejection_reason': optionDecoder(),\n 'created_at': timestampDecoder,\n 'reviewed_at': optionDecoder(timestampDecoder),\n 'reviewed_by': optionDecoder(),\n 'status': enumDecoders.DiscoveredTaskStatus,\n },\n ideas: {\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'status': enumDecoders.IdeaStatus,\n },\n identity_roles: {\n 'role': enumDecoders.AgentRole,\n },\n messages: {\n 'context_id': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n project_channels: {\n 'created_at': timestampDecoder,\n },\n project_messages: {\n 'context_id': optionDecoder(),\n 'created_at': timestampDecoder,\n },\n projects: {\n 'created_at': timestampDecoder,\n 'status': enumDecoders.ProjectStatus,\n },\n task_dependencies: {\n 'created_at': timestampDecoder,\n },\n tasks: {\n 'assigned_to': optionDecoder(),\n 'claimed_at': optionDecoder(timestampDecoder),\n 'github_issue_url': optionDecoder(),\n 'github_pr_url': optionDecoder(),\n 'source_idea_id': optionDecoder(),\n 'archived_reason': optionDecoder(),\n 'status_changed_by': optionDecoder(),\n 'status_changed_at': optionDecoder(timestampDecoder),\n 'created_at': timestampDecoder,\n 'updated_at': timestampDecoder,\n 'status': enumDecoders.TaskStatus,\n 'blocked_from_status': optionDecoder(enumDecoders.TaskStatus),\n },\n votes: {\n 'created_at': timestampDecoder,\n },\n};\n\n/**\n * Decode a row using table-specific decoders.\n * @param row - The raw row from SQL query\n * @param columnNames - Ordered column names from schema\n * @param tableName - The table name for decoder lookup\n * @returns Decoded row with human-readable values\n */\nexport function decodeRow(\n row: unknown[],\n columnNames: string[],\n tableName?: string\n): Record<string, unknown> {\n const decoders = tableName ? TABLE_DECODERS[tableName] : undefined;\n const result: Record<string, unknown> = {};\n \n for (let i = 0; i < columnNames.length; i++) {\n const colName = columnNames[i];\n const value = row[i];\n const decoder = decoders?.[colName];\n result[colName] = decoder ? decoder(value) : value;\n }\n \n return result;\n}\n\n/**\n * Infer table name from a simple SQL query.\n * Only works for straightforward \"SELECT ... FROM table\" queries.\n */\nexport function inferTableName(sql: string): string | undefined {\n const match = sql.match(/FROM\\s+(\\w+)/i);\n return match?.[1]?.toLowerCase();\n}","export interface SqlColumn {\n\tname: string;\n\ttype: string;\n}\n\nexport interface SqlSchema {\n\tcolumns: SqlColumn[];\n}\n\nexport interface SqlStatementResult {\n\tschema: SqlSchema | unknown;\n\trows: unknown[];\n}\n\nexport interface SqlRowObject {\n\t[key: string]: unknown;\n}\n\nexport interface SqlSchemaElement {\n\tname: { some?: string } | string;\n\talgebraic_type?: unknown;\n\ttype?: string;\n}\n\nexport interface SqlSchemaAlt {\n\telements?: SqlSchemaElement[];\n}\n\nconst extractColumnName = (element: SqlSchemaElement): string | undefined => {\n\tif (typeof element.name === \"string\") {\n\t\treturn element.name;\n\t}\n\tif (\n\t\telement.name &&\n\t\ttypeof element.name === \"object\" &&\n\t\t\"some\" in element.name\n\t) {\n\t\treturn element.name.some;\n\t}\n\treturn undefined;\n};\n\nexport interface SqlRequestOptions {\n\thost: string;\n\tmoduleName: string;\n\ttoken: string;\n\tsql: string;\n\ttimeoutMs: number;\n}\n\nexport interface SqlRequestSuccess {\n\tresults: SqlStatementResult[];\n\tdurationMs: number;\n}\n\nexport class SqlRequestError extends Error {\n\treadonly status: number;\n\treadonly responseBody: string;\n\n\tconstructor(status: number, responseBody: string, message?: string) {\n\t\tsuper(message || `SQL request failed with status ${status}`);\n\t\tthis.name = \"SqlRequestError\";\n\t\tthis.status = status;\n\t\tthis.responseBody = responseBody;\n\t}\n}\n\nexport const normalizeSqlHttpBase = (host: string): string => {\n\tconst url = new URL(host);\n\tif (url.protocol === \"ws:\") {\n\t\turl.protocol = \"http:\";\n\t} else if (url.protocol === \"wss:\") {\n\t\turl.protocol = \"https:\";\n\t} else if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n\t\tthrow new Error(`Unsupported host protocol: ${url.protocol}`);\n\t}\n\treturn url.toString();\n};\n\nexport const buildSqlEndpoint = (host: string, moduleName: string): string => {\n\tconst base = normalizeSqlHttpBase(host);\n\tconst url = new URL(base);\n\tconst basePath = url.pathname.replace(/\\/$/, \"\");\n\turl.pathname = `${basePath}/v1/database/${encodeURIComponent(moduleName)}/sql`;\n\treturn url.toString();\n};\n\nconst parseResults = (payload: unknown): SqlStatementResult[] => {\n\tif (!Array.isArray(payload)) {\n\t\tthrow new Error(\n\t\t\t\"Invalid SQL response: expected array of statement results\",\n\t\t);\n\t}\n\treturn payload.map((statement) => {\n\t\tconst record = statement as { schema?: unknown; rows?: unknown };\n\t\tconst rows = Array.isArray(record.rows) ? record.rows : [];\n\t\treturn {\n\t\t\tschema: record.schema,\n\t\t\trows,\n\t\t};\n\t});\n};\n\nexport const executeSqlRequest = async (\n\toptions: SqlRequestOptions,\n): Promise<SqlRequestSuccess> => {\n\tconst endpoint = buildSqlEndpoint(options.host, options.moduleName);\n\tconst controller = new AbortController();\n\tconst timeoutHandle = setTimeout(() => controller.abort(), options.timeoutMs);\n\tconst started = Date.now();\n\n\ttry {\n\t\tconst response = await fetch(endpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${options.token}`,\n\t\t\t\t\"Content-Type\": \"text/plain\",\n\t\t\t\tAccept: \"application/json\",\n\t\t\t},\n\t\t\tbody: options.sql,\n\t\t\tsignal: controller.signal,\n\t\t});\n\n\t\tconst responseText = await response.text();\n\t\tif (!response.ok) {\n\t\t\tthrow new SqlRequestError(response.status, responseText);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = responseText ? JSON.parse(responseText) : [];\n\t\t} catch {\n\t\t\tthrow new Error(\"Invalid SQL response: expected JSON payload\");\n\t\t}\n\n\t\treturn {\n\t\t\tresults: parseResults(parsed),\n\t\t\tdurationMs: Date.now() - started,\n\t\t};\n\t} finally {\n\t\tclearTimeout(timeoutHandle);\n\t}\n};\n\n// Extract column names from schema for use in responses\nexport const extractColumnNames = (result: SqlStatementResult): string[] => {\n\tconst schema = result.schema as SqlSchema | SqlSchemaAlt | undefined;\n\n\tif (schema && \"elements\" in schema && Array.isArray(schema.elements)) {\n\t\treturn schema.elements\n\t\t\t.map(extractColumnName)\n\t\t\t.filter((name): name is string => name !== undefined);\n\t} else if (schema && \"columns\" in schema && Array.isArray(schema.columns)) {\n\t\treturn schema.columns.map((col) => col.name);\n\t}\n\n\treturn [];\n};\n\n// Parse SQL error to provide helpful suggestions\nexport const parseSqlError = (\n\tresponseBody: string,\n): { message: string; suggestion?: string } => {\n\t// Try to parse as JSON first, fallback to plain text\n\tlet errorMsg: string;\n\ttry {\n\t\tconst parsed = JSON.parse(responseBody);\n\t\terrorMsg = parsed.error || responseBody;\n\t} catch {\n\t\terrorMsg = responseBody;\n\t}\n\n\t// Common SpacetimeDB SQL errors with suggestions\n\tif (errorMsg.includes(\"ORDER BY\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"SpacetimeDB SQL does not support ORDER BY. Remove it or filter/sort results locally.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"IS NULL\") || errorMsg.includes(\"IS NOT NULL\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t'Use \"column = NULL\" or \"column != NULL\" instead of IS NULL / IS NOT NULL.',\n\t\t};\n\t}\n\tif (errorMsg.includes(\"JOIN\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"SpacetimeDB has limited JOIN support. Try querying single tables or use multiple queries.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"no such table\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"Check the table name. Common tables: tasks, projects, agents, ideas, messages.\",\n\t\t};\n\t}\n\tif (errorMsg.includes(\"no such column\")) {\n\t\treturn {\n\t\t\tmessage: errorMsg,\n\t\t\tsuggestion:\n\t\t\t\t\"Check the column name. Use SELECT * to see all available columns.\",\n\t\t};\n\t}\n\n\treturn { message: errorMsg };\n};\n","import { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { inferTableName, TABLE_DECODERS } from \"~/generated/decoders.js\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport {\n\texecuteSqlRequest,\n\textractColumnNames,\n\tparseSqlError,\n\tSqlRequestError,\n\ttype SqlStatementResult,\n} from \"~/utils/sql.js\";\nimport { getCachedToken } from \"~/utils/token-cache.js\";\nimport { getWalletInfo } from \"~/utils/wallet.js\";\n\n// Known tables derived from generated decoders\nconst KNOWN_TABLES = Object.keys(TABLE_DECODERS);\n\nimport { formatToon } from \"~/utils/toon.js\";\n\n// Helper to handle query errors with improved messages\nconst handleQueryError = (err: unknown, timeoutMs: number): never => {\n\tif (err instanceof SqlRequestError) {\n\t\tif (err.status === 401) {\n\t\t\terror(\n\t\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\t\"Authentication required. Run `probe auth <wallet> --save` first.\",\n\t\t\t);\n\t\t}\n\t\tconst { message, suggestion } = parseSqlError(err.responseBody);\n\t\t// Error parsed with potential suggestion\n\t\tif (err.status === 400) {\n\t\t\terror(\"SQL_INVALID\", message, suggestion);\n\t\t}\n\t\terror(\"SQL_FAILED\", message, suggestion);\n\t}\n\n\tif (err instanceof Error && err.name === \"AbortError\") {\n\t\terror(\"SQL_UNAVAILABLE\", `SQL request timed out after ${timeoutMs}ms`);\n\t}\n\n\terror(\n\t\t\"SQL_UNAVAILABLE\",\n\t\terr instanceof Error ? err.message : \"SQL request failed\",\n\t);\n};\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nconst buildMeta = (results: SqlStatementResult[], durationMs: number) => ({\n\tduration_ms: durationMs,\n\tquery_count: results.length,\n\trow_count_total: results.reduce((sum, item) => sum + item.rows.length, 0),\n});\n\n// Build flat response structure for JSON mode\ninterface QueryResult {\n\tcolumns: string[];\n\trows: Record<string, unknown>[];\n}\n\nconst buildFlatResponse = (\n\tresults: SqlStatementResult[],\n\tshouldDecode: boolean,\n\ttableName?: string,\n): Record<string, QueryResult> => {\n\tconst response: Record<string, QueryResult> = {};\n\n\tfor (let index = 0; index < results.length; index += 1) {\n\t\tconst statement = results[index];\n\t\tconst columns = extractColumnNames(statement);\n\t\tconst decoders =\n\t\t\tshouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n\t\tconst rowObjects = (statement.rows as unknown[][]).map((row) => {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst colName = columns[i];\n\t\t\t\tconst value = row[i];\n\t\t\t\tconst decoder = decoders?.[colName];\n\t\t\t\tobj[colName] = decoder ? decoder(value) : value;\n\t\t\t}\n\t\t\treturn obj;\n\t\t});\n\n\t\tresponse[`query_${index + 1}`] = { columns, rows: rowObjects };\n\t}\n\n\tif (results.length === 0) {\n\t\tresponse.query_1 = { columns: [], rows: [] };\n\t}\n\n\treturn response;\n};\n\nconst formatStatementsToToon = (\n\tresults: SqlStatementResult[],\n\tmetaEnabled: boolean,\n\tdurationMs: number,\n\tshouldDecode: boolean,\n\ttableName?: string,\n): string => {\n\tconst payload: Record<string, unknown> = {};\n\tconst decoders =\n\t\tshouldDecode && tableName ? TABLE_DECODERS[tableName] : undefined;\n\n\tfor (let index = 0; index < results.length; index += 1) {\n\t\tconst statement = results[index];\n\t\tconst columns = extractColumnNames(statement);\n\n\t\tconst rowObjects = (statement.rows as unknown[][]).map((row) => {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\t\tconst colName = columns[i];\n\t\t\t\tconst value = row[i];\n\t\t\t\tconst decoder = decoders?.[colName];\n\t\t\t\tobj[colName] = decoder ? decoder(value) : value;\n\t\t\t}\n\t\t\treturn obj;\n\t\t});\n\n\t\tpayload[`query_${index + 1}`] = rowObjects;\n\t}\n\n\tif (results.length === 0) {\n\t\tpayload.query_1 = [];\n\t}\n\n\tif (metaEnabled) {\n\t\tconst meta = buildMeta(results, durationMs);\n\t\tpayload.meta = [meta];\n\t}\n\n\treturn formatToon(payload);\n};\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"query\",\n\t\tdescription: \"Run SQL read queries against Nexus\",\n\t},\n\targs: {\n\t\tsql: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"SQL query string\",\n\t\t\trequired: false,\n\t\t},\n\t\tfile: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read SQL from file path\",\n\t\t},\n\t\twallet: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Wallet name override\",\n\t\t},\n\t\thost: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB host override\",\n\t\t},\n\t\tmodule: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"SpacetimeDB module override\",\n\t\t},\n\t\ttimeout: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Request timeout in milliseconds\",\n\t\t},\n\t\tmeta: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Include metadata in output\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t\ttables: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"List all available tables\",\n\t\t\tdefault: false,\n\t\t},\n\t\tdecode: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Decode algebraic types to human-readable values\",\n\t\t\tdefault: true,\n\t\t},\n\t\traw: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output raw algebraic type arrays (no decoding)\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst hasSql = args.sql || args.file;\n\n\t\t// Handle --tables flag\n\t\tif (args.tables) {\n\t\t\tif (isJsonMode()) {\n\t\t\t\tsuccess({ tables: KNOWN_TABLES });\n\t\t\t} else {\n\t\t\t\tconsole.log(formatToon({ tables: KNOWN_TABLES }));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate arguments\n\t\tif (!hasSql) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe query\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Execute SQL against the configured Nexus SpacetimeDB module\",\n\t\t\t\tusage: [\n\t\t\t\t\t'probe query \"SELECT * FROM tasks LIMIT 5\"',\n\t\t\t\t\t\"probe query --file ./query.sql --meta\",\n\t\t\t\t\t\"probe query --tables\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--file\", detail: \"Read SQL from file\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--wallet\",\n\t\t\t\t\t\tdetail: \"Wallet override (defaults to config defaultWallet)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--host, --module\",\n\t\t\t\t\t\tdetail: \"Nexus SpacetimeDB target overrides\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--timeout\",\n\t\t\t\t\t\tdetail: `Request timeout in ms (default: ${DEFAULT_TIMEOUT_MS})`,\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--meta\", detail: \"Include metadata in output\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output mode with keyed objects\" },\n\t\t\t\t\t{ name: \"--tables\", detail: \"List all available tables\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--decode\",\n\t\t\t\t\t\tdetail: \"Decode algebraic types (default: true)\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--raw\",\n\t\t\t\t\t\tdetail: \"Output raw algebraic arrays (no decoding)\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"This command is read-only and intended for SQL queries against Nexus tables.\",\n\t\t\t\t\t'JSON mode returns keyed objects: {\"query_1\": {\"columns\": [...], \"rows\": [{\"id\": 1, ...}]}}',\n\t\t\t\t\t\"Use --raw to see raw SpacetimeDB algebraic type arrays.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst timeoutMs = args.timeout\n\t\t\t? Number.parseInt(args.timeout, 10)\n\t\t\t: DEFAULT_TIMEOUT_MS;\n\t\tif (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n\t\t\terror(\"INVALID_TIMEOUT\", `Invalid timeout: ${args.timeout}`);\n\t\t}\n\n\t\tconst config = await getConfig();\n\t\tconst walletName = args.wallet || config.defaultWallet;\n\t\tif (!walletName) {\n\t\t\terror(\n\t\t\t\t\"WALLET_REQUIRED\",\n\t\t\t\t\"Wallet required. Use --wallet or set default wallet.\",\n\t\t\t);\n\t\t}\n\n\t\tconst wallet = await getWalletInfo(walletName);\n\t\tif (!wallet) {\n\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet not found: ${walletName}`);\n\t\t}\n\n\t\tconst cached = await getCachedToken(walletName);\n\t\tif (!cached) {\n\t\t\terror(\n\t\t\t\t\"AUTH_REQUIRED\",\n\t\t\t\t\"No cached token. Run `probe auth <wallet> --save` first.\",\n\t\t\t);\n\t\t}\n\n\t\tconst host = args.host || config.spacetime.host;\n\t\tconst moduleName = args.module || config.spacetime.module;\n\t\tconst sql = args.file\n\t\t\t? await readFile(args.file, \"utf-8\")\n\t\t\t: (args.sql ?? \"\");\n\t\tif (!sql.trim()) {\n\t\t\terror(\"SQL_REQUIRED\", \"SQL query is empty\");\n\t\t}\n\n\t\t// Determine if we should decode algebraic types\n\t\tconst shouldDecode = args.raw ? false : (args.decode ?? true);\n\t\tconst tableName = inferTableName(sql);\n\n\t\ttry {\n\t\t\tconst { results, durationMs } = await executeSqlRequest({\n\t\t\t\thost,\n\t\t\t\tmoduleName,\n\t\t\t\ttoken: cached.token,\n\t\t\t\tsql,\n\t\t\t\ttimeoutMs,\n\t\t\t});\n\n\t\t\tif (isJsonMode()) {\n\t\t\t\tconst flatResponse = buildFlatResponse(\n\t\t\t\t\tresults,\n\t\t\t\t\tshouldDecode,\n\t\t\t\t\ttableName,\n\t\t\t\t);\n\t\t\t\tif (args.meta) {\n\t\t\t\t\tsuccess({ ...flatResponse, meta: buildMeta(results, durationMs) });\n\t\t\t\t} else {\n\t\t\t\t\tsuccess(flatResponse);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.log(\n\t\t\t\tformatStatementsToToon(\n\t\t\t\t\tresults,\n\t\t\t\t\tBoolean(args.meta),\n\t\t\t\t\tdurationMs,\n\t\t\t\t\tshouldDecode,\n\t\t\t\t\ttableName,\n\t\t\t\t),\n\t\t\t);\n\t\t} catch (err) {\n\t\t\thandleQueryError(err, timeoutMs);\n\t\t}\n\t},\n});\n","import { Buffer } from \"node:buffer\";\nimport { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"sign\",\n\t\tdescription: \"Sign a message using wallet private key\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tmessage: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Message to sign\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"message-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read message from file\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe sign\",\n\t\t\t\tdescription: \"Sign arbitrary text using wallet private key\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe sign <wallet-name> <message> [options]\",\n\t\t\t\t\t\"probe sign <wallet-name> --message-file ./payload.txt [options]\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--message-file\", detail: \"Read message content from file\" },\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string;\n\n\t\tif (args[\"message-file\"]) {\n\t\t\ttry {\n\t\t\t\tmessage = await readFile(args[\"message-file\"], \"utf-8\");\n\t\t\t} catch {\n\t\t\t\terror(\n\t\t\t\t\t\"FILE_READ_ERROR\",\n\t\t\t\t\t`Failed to read message file: ${args[\"message-file\"]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else if (args.message) {\n\t\t\tmessage = args.message;\n\t\t} else {\n\t\t\terror(\"MESSAGE_REQUIRED\", \"Message or message-file required\");\n\t\t}\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter wallet password:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password file required in JSON mode or provide PROBE_WALLET_PASSWORD\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\tconst keyPair = keyStore.getKeyPair(0);\n\n\t\t\tconst signature = keyPair.sign(Buffer.from(message));\n\t\t\tconst publicKey = keyPair.getPublicKey();\n\t\t\tconst address = keyPair.getAddress();\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\tmessage,\n\t\t\t\tsignature: signature.toString(\"hex\"),\n\t\t\t\tpublicKey: publicKey.toString(\"hex\"),\n\t\t\t\taddress: address.toString(),\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(\"Message signed successfully\");\n\t\t\t\tconsole.log(`Signature: ${signature.toString(\"hex\")}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"SIGN_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to sign message\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n} from \"~/utils/output.js\";\nimport { clearCachedToken, getCachedToken } from \"~/utils/token-cache.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"token\",\n\t\tdescription: \"Show cached JWT token for wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tclear: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Clear cached token now (next auth call gets a new token)\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (!name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe token\",\n\t\t\t\tdescription: \"Inspect or clear cached authentication token\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe token <wallet-name> [options]\",\n\t\t\t\t\t\"probe token <wallet-name> --clear\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--clear\", detail: \"Clear cached token now (recommended)\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (args.clear) {\n\t\t\tawait clearCachedToken(name);\n\n\t\t\tsuccess({ cleared: name });\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tinfo(\n\t\t\t\t\t`Token cache cleared for \"${name}\". Run 'probe auth' to get a new token.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst cached = await getCachedToken(name);\n\n\t\t\tif (!cached) {\n\t\t\t\terror(\n\t\t\t\t\t\"TOKEN_NOT_FOUND\",\n\t\t\t\t\t`No cached token for wallet '${name}'`,\n\t\t\t\t\t`Run 'probe auth ${name} --save' to authenticate`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst expiresAt = new Date(cached.expiresAt);\n\t\t\tconst now = new Date();\n\t\t\tconst expiresIn = Math.floor(\n\t\t\t\t(expiresAt.getTime() - now.getTime()) / 1000,\n\t\t\t);\n\t\t\tconst valid = expiresIn > 0;\n\n\t\t\tsuccess({\n\t\t\t\twallet: name,\n\t\t\t\ttoken: cached.token,\n\t\t\t\texpiresAt: cached.expiresAt,\n\t\t\t\texpiresIn: Math.max(0, expiresIn),\n\t\t\t\tvalid,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Wallet: ${name}`);\n\t\t\t\tconsole.log(`Token: ${cached.token.slice(0, 50)}...`);\n\t\t\t\tconsole.log(`Expires: ${expiresAt.toUTCString()}`);\n\t\t\t\tconsole.log(`Status: ${valid ? \"Valid\" : \"Expired\"}`);\n\n\t\t\t\tif (!valid) {\n\t\t\t\t\tinfo(\n\t\t\t\t\t\t\"Token has expired. Run with --clear to remove it and re-authenticate.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"TOKEN_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to read token\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { resolvePasswordInput } from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n\twarning,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport {\n\tcreateWallet as createWalletUtil,\n\tlistWallets,\n} from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"create\",\n\t\tdescription: \"Create a new wallet with randomly generated mnemonic\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet identifier\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\t\"set-default\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Set this wallet as the default\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet create\",\n\t\t\t\tdescription: \"Create a new encrypted wallet\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet create <name> [options]\",\n\t\t\t\t\t\"probe wallet create agent-wallet --set-default\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--set-default\", detail: \"Set created wallet as default\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Password source order: --password-file, PROBE_WALLET_PASSWORD, interactive prompt.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n\t\t\terror(\n\t\t\t\t\"INVALID_NAME\",\n\t\t\t\t\"Wallet name must be alphanumeric with hyphens or underscores only\",\n\t\t\t);\n\t\t}\n\n\t\tconst config = await getConfig();\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter password to encrypt wallet:\",\n\t\t\tconfirmPromptMessage: \"Confirm password:\",\n\t\t\tminLength: config.passwordMinLength,\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst result = await createWalletUtil(name, walletPassword);\n\n\t\t\tlet setAsDefault = args[\"set-default\"];\n\t\t\tif (!setAsDefault) {\n\t\t\t\tconst wallets = await listWallets();\n\t\t\t\tif (wallets.length === 1) {\n\t\t\t\t\tsetAsDefault = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setAsDefault) {\n\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\tuserConfig.defaultWallet = result.name;\n\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\tname: result.name,\n\t\t\t\taddress: result.address,\n\t\t\t\tpublicKey: result.publicKey,\n\t\t\t\tmnemonic: result.mnemonic,\n\t\t\t\tdefault: setAsDefault,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${result.name}\" created successfully`);\n\t\t\t\tconsole.log(`Address: ${result.address}`);\n\t\t\t\tconsole.log(`\\nMnemonic: ${result.mnemonic}`);\n\t\t\t\twarning(\"Save this mnemonic securely - it cannot be recovered!\");\n\t\t\t\tif (setAsDefault) {\n\t\t\t\t\tconsole.log(`\\nSet as default wallet`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_CREATE_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to create wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"default\",\n\t\tdescription: \"Set the default wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name to set as default\",\n\t\t\trequired: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet default\",\n\t\t\t\tdescription: \"Set the default wallet used by commands\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet default <name> [options]\",\n\t\t\t\t\t\"probe wallet default agent-wallet\",\n\t\t\t\t],\n\t\t\t\toptions: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst exists = await walletExists(name);\n\t\tif (!exists) {\n\t\t\terror(\"WALLET_NOT_FOUND\", `Wallet '${name}' does not exist`);\n\t\t}\n\n\t\tconst userConfig = await loadUserConfig();\n\t\tuserConfig.defaultWallet = name;\n\t\tawait saveUserConfig(userConfig);\n\n\t\tsuccess({ defaultWallet: name });\n\n\t\tif (!isJsonMode()) {\n\t\t\tsuccessMessage(`Default wallet set to '${name}'`);\n\t\t}\n\t},\n});\n","import { confirm } from \"@clack/prompts\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { deleteWallet, walletExists } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"delete\",\n\t\tdescription: \"Delete a wallet\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\tyes: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Skip confirmation prompt\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet delete\",\n\t\t\t\tdescription: \"Delete a wallet from local storage\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet delete <name> [options]\",\n\t\t\t\t\t\"probe wallet delete old-wallet --yes\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--yes\", detail: \"Skip interactive confirmation prompt\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst exists = await walletExists(name);\n\t\tif (!exists) {\n\t\t\terror(\n\t\t\t\t\"WALLET_NOT_FOUND\",\n\t\t\t\t`Wallet '${name}' does not exist`,\n\t\t\t\t`Run 'probe wallet list' to see available wallets`,\n\t\t\t);\n\t\t}\n\n\t\tif (!isJsonMode() && !args.yes) {\n\t\t\tconst shouldDelete = await confirm({\n\t\t\t\tmessage: `Are you sure you want to delete wallet \"${name}\"? This cannot be undone.`,\n\t\t\t});\n\n\t\t\tif (!shouldDelete) {\n\t\t\t\tinfo(\"Deletion cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait deleteWallet(name);\n\n\t\t\tsuccess({ deleted: name });\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${name}\" deleted successfully`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_DELETE_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to delete wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport {\n\tresolveMnemonicInput,\n\tresolvePasswordInput,\n} from \"~/utils/credentials.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n\tsuccessMessage,\n} from \"~/utils/output.js\";\nimport { loadUserConfig, saveUserConfig } from \"~/utils/user-config.js\";\nimport { importWallet, listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"import\",\n\t\tdescription: \"Import wallet from mnemonic phrase\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet identifier\",\n\t\t\trequired: false,\n\t\t},\n\t\tmnemonic: {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Mnemonic phrase (space-separated)\",\n\t\t},\n\t\t\"mnemonic-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read mnemonic from file\",\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\t\"set-default\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Set this wallet as the default\",\n\t\t\tdefault: false,\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet import\",\n\t\t\t\tdescription: \"Import an encrypted wallet from mnemonic\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet import <name> [options]\",\n\t\t\t\t\t\"probe wallet import agent-wallet --mnemonic-file ./mnemonic.txt\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--mnemonic\", detail: \"24-word mnemonic phrase\" },\n\t\t\t\t\t{ name: \"--mnemonic-file\", detail: \"Read mnemonic from file\" },\n\t\t\t\t\t{ name: \"--password-file\", detail: \"Read wallet password from file\" },\n\t\t\t\t\t{ name: \"--set-default\", detail: \"Set imported wallet as default\" },\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t\tnotes: [\n\t\t\t\t\t\"Mnemonic source order: --mnemonic, --mnemonic-file, PROBE_WALLET_MNEMONIC, interactive prompt.\",\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n\t\t\terror(\n\t\t\t\t\"INVALID_NAME\",\n\t\t\t\t\"Wallet name must be alphanumeric with hyphens or underscores only\",\n\t\t\t);\n\t\t}\n\n\t\tconst mnemonicPhrase = await resolveMnemonicInput({\n\t\t\tmnemonic: args.mnemonic,\n\t\t\tmnemonicFile: args[\"mnemonic-file\"],\n\t\t\tjsonModeError:\n\t\t\t\t\"Mnemonic required via --mnemonic, --mnemonic-file, or PROBE_WALLET_MNEMONIC env\",\n\t\t});\n\n\t\tconst walletPassword = await resolvePasswordInput({\n\t\t\tpasswordFile: args[\"password-file\"],\n\t\t\tpromptMessage: \"Enter password to encrypt wallet:\",\n\t\t\tjsonModeError:\n\t\t\t\t\"Password required via PROBE_WALLET_PASSWORD env, --password-file, or interactive prompt\",\n\t\t});\n\n\t\ttry {\n\t\t\tconst result = await importWallet(name, mnemonicPhrase, walletPassword);\n\n\t\t\tlet setAsDefault = args[\"set-default\"];\n\t\t\tif (!setAsDefault) {\n\t\t\t\tconst wallets = await listWallets();\n\t\t\t\tif (wallets.length === 1) {\n\t\t\t\t\tsetAsDefault = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (setAsDefault) {\n\t\t\t\tconst userConfig = await loadUserConfig();\n\t\t\t\tuserConfig.defaultWallet = result.name;\n\t\t\t\tawait saveUserConfig(userConfig);\n\t\t\t}\n\n\t\t\tsuccess({\n\t\t\t\tname: result.name,\n\t\t\t\taddress: result.address,\n\t\t\t\tdefault: setAsDefault,\n\t\t\t});\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tsuccessMessage(`Wallet \"${result.name}\" imported successfully`);\n\t\t\t\tconsole.log(`Address: ${result.address}`);\n\t\t\t\tif (setAsDefault) {\n\t\t\t\t\tconsole.log(`\\nSet as default wallet`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_IMPORT_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to import wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { getConfig } from \"~/utils/config.js\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport {\n\terror,\n\tinfo,\n\tisJsonMode,\n\tsetJsonMode,\n\tsuccess,\n} from \"~/utils/output.js\";\nimport { listWallets } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"list\",\n\t\tdescription: \"List all stored wallets\",\n\t},\n\targs: {\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (forceHelpRequested()) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet list\",\n\t\t\t\tdescription: \"List all locally stored wallets\",\n\t\t\t\tusage: [\"probe wallet list [options]\", \"probe wallet list --json\"],\n\t\t\t\toptions: [{ name: \"--json\", detail: \"JSON output for agents\" }],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\ttry {\n\t\t\tconst wallets = await listWallets();\n\t\t\tconst config = await getConfig();\n\n\t\t\tconst walletsOutput = wallets.map((w) => ({\n\t\t\t\t...w,\n\t\t\t\tdefault: w.name === config.defaultWallet,\n\t\t\t}));\n\n\t\t\tsuccess(walletsOutput);\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tif (wallets.length === 0) {\n\t\t\t\t\tinfo(\"No wallets found\");\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(\"Wallets:\");\n\t\t\t\t\tfor (const wallet of walletsOutput) {\n\t\t\t\t\t\tconst date = wallet.createdAt\n\t\t\t\t\t\t\t? new Date(wallet.createdAt).toLocaleDateString()\n\t\t\t\t\t\t\t: \"unknown\";\n\t\t\t\t\t\tconst marker = wallet.default ? \"*\" : \" \";\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`${marker} ${wallet.name.padEnd(12)} ${wallet.address.slice(0, 10)}... created ${date}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (config.defaultWallet) {\n\t\t\t\t\t\tconsole.log(`\\n* = default wallet`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LIST_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to list wallets\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { readFile } from \"node:fs/promises\";\nimport { defineCommand } from \"citty\";\nimport { forceHelpRequested, printHelp } from \"~/utils/help.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { getWalletInfo, loadWallet } from \"~/utils/wallet.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"show\",\n\t\tdescription: \"Show wallet address and public key\",\n\t},\n\targs: {\n\t\tname: {\n\t\t\ttype: \"positional\",\n\t\t\tdescription: \"Wallet name\",\n\t\t\trequired: false,\n\t\t},\n\t\t\"public-key\": {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Include public key in output\",\n\t\t\tdefault: false,\n\t\t},\n\t\t\"password-file\": {\n\t\t\ttype: \"string\",\n\t\t\tdescription: \"Read password from file\",\n\t\t},\n\t\tjson: {\n\t\t\ttype: \"boolean\",\n\t\t\tdescription: \"Output JSON only\",\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) {\n\t\t\tsetJsonMode(true);\n\t\t}\n\n\t\tconst name = args.name;\n\n\t\tif (forceHelpRequested() || !name) {\n\t\t\tprintHelp({\n\t\t\t\tcommand: \"probe wallet show\",\n\t\t\t\tdescription: \"Show wallet address and optional public key\",\n\t\t\t\tusage: [\n\t\t\t\t\t\"probe wallet show <name> [options]\",\n\t\t\t\t\t\"probe wallet show my-wallet --public-key --password-file ./pass.txt\",\n\t\t\t\t],\n\t\t\t\toptions: [\n\t\t\t\t\t{ name: \"--public-key\", detail: \"Include public key in output\" },\n\t\t\t\t\t{\n\t\t\t\t\t\tname: \"--password-file\",\n\t\t\t\t\t\tdetail: \"Read password for public key extraction\",\n\t\t\t\t\t},\n\t\t\t\t\t{ name: \"--json\", detail: \"JSON output for agents\" },\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst walletInfo = await getWalletInfo(name);\n\t\tif (!walletInfo) {\n\t\t\terror(\n\t\t\t\t\"WALLET_NOT_FOUND\",\n\t\t\t\t`Wallet '${name}' does not exist`,\n\t\t\t\t`Run 'probe wallet list' to see available wallets`,\n\t\t\t);\n\t\t}\n\n\t\tlet walletPassword: string | undefined;\n\n\t\tif (args[\"password-file\"]) {\n\t\t\ttry {\n\t\t\t\twalletPassword = await readFile(args[\"password-file\"], \"utf-8\");\n\t\t\t\twalletPassword = walletPassword.trim();\n\t\t\t} catch {\n\t\t\t\terror(\n\t\t\t\t\t\"FILE_READ_ERROR\",\n\t\t\t\t\t`Failed to read password file: ${args[\"password-file\"]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tlet publicKey: string | undefined;\n\n\t\t\tif (walletPassword) {\n\t\t\t\tconst keyStore = await loadWallet(name, walletPassword);\n\t\t\t\tconst keyPair = keyStore.getKeyPair(0);\n\t\t\t\tpublicKey = keyPair.getPublicKey().toString(\"hex\");\n\t\t\t}\n\n\t\t\tconst result: Record<string, string | undefined> = {\n\t\t\t\tname: walletInfo.name,\n\t\t\t\taddress: walletInfo.address,\n\t\t\t\tcreatedAt: walletInfo.createdAt,\n\t\t\t};\n\n\t\t\tif (args[\"public-key\"] || publicKey) {\n\t\t\t\tresult.publicKey = publicKey;\n\t\t\t}\n\n\t\t\tsuccess(result);\n\n\t\t\tif (!isJsonMode()) {\n\t\t\t\tconsole.log(`Name: ${walletInfo.name}`);\n\t\t\t\tconsole.log(`Address: ${walletInfo.address}`);\n\t\t\t\tif (walletInfo.createdAt) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Created: ${new Date(walletInfo.createdAt).toLocaleString()}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (publicKey) {\n\t\t\t\t\tconsole.log(`Public Key: ${publicKey}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err) {\n\t\t\terror(\n\t\t\t\t\"WALLET_LOAD_ERROR\",\n\t\t\t\terr instanceof Error ? err.message : \"Failed to load wallet\",\n\t\t\t);\n\t\t}\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport { printHelp } from \"~/utils/help.js\";\nimport create from \"./create.js\";\nimport defaultCmd from \"./default.js\";\nimport deleteCmd from \"./delete.js\";\nimport importCmd from \"./import.js\";\nimport list from \"./list.js\";\nimport show from \"./show.js\";\n\nconst walletSubcommands = new Set([\n\t\"create\",\n\t\"import\",\n\t\"list\",\n\t\"show\",\n\t\"delete\",\n\t\"default\",\n]);\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"wallet\",\n\t\tdescription: \"Manage Zenon Network wallets\",\n\t},\n\trun() {\n\t\tconst positionals = process.argv\n\t\t\t.slice(2)\n\t\t\t.filter((arg) => !arg.startsWith(\"-\"));\n\t\tif (positionals.length > 1 && walletSubcommands.has(positionals[1])) {\n\t\t\treturn;\n\t\t}\n\n\t\tprintHelp({\n\t\t\tcommand: \"probe wallet\",\n\t\t\tdescription: \"Create, import, inspect, and manage wallets\",\n\t\t\tusage: [\n\t\t\t\t\"probe wallet <subcommand> [positionals] [options]\",\n\t\t\t\t\"probe wallet create my-wallet --set-default\",\n\t\t\t\t\"probe wallet import my-wallet --mnemonic-file ./mnemonic.txt\",\n\t\t\t],\n\t\t\tactions: [\n\t\t\t\t{ name: \"create <name>\", detail: \"Create a new encrypted wallet\" },\n\t\t\t\t{ name: \"import <name>\", detail: \"Import wallet from mnemonic phrase\" },\n\t\t\t\t{ name: \"list\", detail: \"List stored wallets\" },\n\t\t\t\t{\n\t\t\t\t\tname: \"show <name>\",\n\t\t\t\t\tdetail: \"Show wallet address and optional public key\",\n\t\t\t\t},\n\t\t\t\t{ name: \"delete <name>\", detail: \"Delete a wallet\" },\n\t\t\t\t{ name: \"default <name>\", detail: \"Set default wallet\" },\n\t\t\t],\n\t\t\tnotes: [\"Use long-form flags only for predictable agent automation.\"],\n\t\t});\n\t},\n\tsubCommands: {\n\t\tcreate,\n\t\timport: importCmd,\n\t\tlist,\n\t\tshow,\n\t\tdelete: deleteCmd,\n\t\tdefault: defaultCmd,\n\t},\n});\n","import { defineCommand } from \"citty\";\nimport type { Agent } from \"~/utils/context.js\";\nimport { withAuth } from \"~/utils/context.js\";\nimport { AgentRole, AgentStatus } from \"~/utils/enums.js\";\nimport { error, isJsonMode, setJsonMode, success } from \"~/utils/output.js\";\nimport { formatTimestamp } from \"~/utils/time.js\";\nimport { toonList } from \"~/utils/toon.js\";\n\nexport default defineCommand({\n\tmeta: {\n\t\tname: \"whoami\",\n\t\tdescription: \"Show current authenticated agent profile\",\n\t},\n\targs: {\n\t\twallet: { type: \"string\", description: \"Wallet name\" },\n\t\tjson: { type: \"boolean\", description: \"Output JSON\", default: false },\n\t\thost: { type: \"string\", description: \"SpacetimeDB host\" },\n\t\tmodule: { type: \"string\", description: \"Module name\" },\n\t},\n\tasync run({ args }) {\n\t\tif (args.json) setJsonMode(true);\n\n\t\ttry {\n\t\t\tawait withAuth(\n\t\t\t\t{ host: args.host, module: args.module, wallet: args.wallet },\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst myAgent = ctx\n\t\t\t\t\t\t.iter<Agent>(\"agents\")\n\t\t\t\t\t\t.find(\n\t\t\t\t\t\t\t(a) => a.identity.toHexString() === ctx.identity?.toHexString(),\n\t\t\t\t\t\t);\n\n\t\t\t\t\tif (!myAgent) {\n\t\t\t\t\t\terror(\n\t\t\t\t\t\t\t\"NOT_REGISTERED\",\n\t\t\t\t\t\t\t\"Agent not registered. Run `probe agent register` first.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tsuccess(myAgent);\n\n\t\t\t\t\tif (!isJsonMode()) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\ttoonList(\"agent\", [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tid: myAgent.id,\n\t\t\t\t\t\t\t\t\tname: myAgent.name,\n\t\t\t\t\t\t\t\t\trole: AgentRole.display(myAgent.role),\n\t\t\t\t\t\t\t\t\tstatus: AgentStatus.display(myAgent.status),\n\t\t\t\t\t\t\t\t\tlastHeartbeat: formatTimestamp(myAgent.lastHeartbeat),\n\t\t\t\t\t\t\t\t\tcurrentTaskId: myAgent.currentTaskId\n\t\t\t\t\t\t\t\t\t\t? myAgent.currentTaskId.toString()\n\t\t\t\t\t\t\t\t\t\t: \"\",\n\t\t\t\t\t\t\t\t\tcapabilities: myAgent.capabilities.join(\",\"),\n\t\t\t\t\t\t\t\t\tidentity: ctx.identity?.toHexString() || \"\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (err) {\n\t\t\t// Handle connection errors gracefully - avoid citty/consola stack traces\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\terror(\"CONNECTION_ERROR\", message);\n\t\t}\n\t},\n});\n","import { createRequire } from \"node:module\";\nimport { defineCommand, runMain } from \"citty\";\nimport auth from \"./commands/auth.js\";\nimport config from \"./commands/config.js\";\nimport doctor from \"./commands/doctor.js\";\nimport agent from \"./commands/nexus/agent.js\";\nimport discover from \"./commands/nexus/discover.js\";\nimport idea from \"./commands/nexus/idea.js\";\nimport message from \"./commands/nexus/message.js\";\nimport project from \"./commands/nexus/project.js\";\nimport task from \"./commands/nexus/task.js\";\nimport nexusDaemon from \"./commands/nexus-daemon.js\";\nimport query from \"./commands/query.js\";\nimport sign from \"./commands/sign.js\";\nimport token from \"./commands/token.js\";\nimport wallet from \"./commands/wallet/index.js\";\nimport whoami from \"./commands/whoami.js\";\nimport {\n\tnormalizeHelpArgv,\n\tprintHelp,\n\tsetForceHelpRequested,\n} from \"./utils/help.js\";\n\nconst topLevelCommands = new Set([\n\t\"wallet\",\n\t\"auth\",\n\t\"sign\",\n\t\"token\",\n\t\"config\",\n\t\"nexus\",\n\t\"agent\",\n\t\"task\",\n\t\"message\",\n\t\"idea\",\n\t\"discover\",\n\t\"project\",\n\t\"query\",\n\t\"doctor\",\n\t\"whoami\",\n]);\n\nconst applyHelpNormalization = (): void => {\n\tconst normalized = normalizeHelpArgv(process.argv.slice(2));\n\tsetForceHelpRequested(normalized.forceHelp);\n\tprocess.argv = [...process.argv.slice(0, 2), ...normalized.argv];\n};\n\nconst require = createRequire(import.meta.url);\nconst { version, description } = require(\"../package.json\");\n\nconst main = defineCommand({\n\tmeta: { name: \"probe\", version, description },\n\targs: {\n\t\tjson: { type: \"boolean\", description: \"Output JSON only\", default: false },\n\t},\n\trun() {\n\t\tconst firstPositional = process.argv\n\t\t\t.slice(2)\n\t\t\t.find((arg) => !arg.startsWith(\"-\"));\n\t\tif (firstPositional && topLevelCommands.has(firstPositional)) {\n\t\t\treturn;\n\t\t}\n\n\t\tprintHelp({\n\t\t\tcommand: \"probe\",\n\t\t\tdescription,\n\t\t\tusage: [\n\t\t\t\t\"probe <command> [positionals] [options]\",\n\t\t\t\t'probe idea propose --title \"Better task scoring\" --category planning',\n\t\t\t\t\"probe task claim 42 --wallet agent-wallet\",\n\t\t\t],\n\t\t\tactions: [\n\t\t\t\t{ name: \"wallet\", detail: \"Wallet lifecycle commands\" },\n\t\t\t\t{ name: \"auth\", detail: \"Authenticate wallet and cache token\" },\n\t\t\t\t{ name: \"token\", detail: \"Inspect or clear cached token\" },\n\t\t\t\t{ name: \"sign\", detail: \"Sign text payloads\" },\n\t\t\t\t{\n\t\t\t\t\tname: \"nexus\",\n\t\t\t\t\tdetail: \"Run persistent Nexus daemon (keepalive + event logs)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"agent, task, idea, discover, message, project\",\n\t\t\t\t\tdetail: \"Nexus workspace commands\",\n\t\t\t\t},\n\t\t\t\t{ name: \"query\", detail: \"Execute SQL queries against Nexus\" },\n\t\t\t\t{ name: \"doctor\", detail: \"Run setup and connectivity diagnostics\" },\n\t\t\t\t{ name: \"config\", detail: \"Read/write CLI configuration\" },\n\t\t\t],\n\t\t\toptions: [{ name: \"--json\", detail: \"JSON output mode for agents\" }],\n\t\t\tnotes: [\n\t\t\t\t\"Nexus commands connect to SpacetimeDB (the realtime database backing Nexus).\",\n\t\t\t],\n\t\t});\n\t},\n\tsubCommands: {\n\t\twallet,\n\t\tauth,\n\t\tsign,\n\t\ttoken,\n\t\tconfig,\n\t\tnexus: nexusDaemon,\n\t\tagent,\n\t\ttask,\n\t\tmessage,\n\t\tidea,\n\t\tdiscover,\n\t\tproject,\n\t\tquery,\n\t\tdoctor,\n\t\twhoami,\n\t},\n});\n\n// Global error handler to suppress stack traces for expected errors\nconst isExpectedError = (err: unknown): boolean => {\n\tif (!(err instanceof Error)) return false;\n\tconst message = err.message.toLowerCase();\n\treturn (\n\t\tmessage.includes(\"connection failed\") ||\n\t\tmessage.includes(\"connection timeout\") ||\n\t\tmessage.includes(\"authentication required\") ||\n\t\tmessage.includes(\"unauthorized\") ||\n\t\tmessage.includes(\"wallet required\") ||\n\t\tmessage.includes(\"wallet not found\") ||\n\t\tmessage.includes(\"agent not registered\") ||\n\t\tmessage.includes(\"subscription error\")\n\t);\n};\n\nprocess.on(\"unhandledRejection\", (err: unknown) => {\n\tif (isExpectedError(err)) {\n\t\t// Error message already printed by the error() utility\n\t\tprocess.exit(1);\n\t}\n\t// For unexpected errors, let the default handler deal with it\n\tthrow err;\n});\n\napplyHelpNormalization();\nrunMain(main);\n"],"mappings":"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"}